diff --git a/Source/BNetServer/BNetServer.csproj b/Source/BNetServer/BNetServer.csproj index b6e680b72..d18f4effa 100644 --- a/Source/BNetServer/BNetServer.csproj +++ b/Source/BNetServer/BNetServer.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp2.2 BNetServer.Server Red.ico diff --git a/Source/Framework/Constants/AccountConst.cs b/Source/Framework/Constants/AccountConst.cs index d07d98d33..664b2f609 100644 --- a/Source/Framework/Constants/AccountConst.cs +++ b/Source/Framework/Constants/AccountConst.cs @@ -212,13 +212,13 @@ namespace Framework.Constants CommandDebugBg = 304, CommandDebugEntervehicle = 305, CommandDebugGetitemstate = 306, - CommandDebugGetitemvalue = 307, - CommandDebugGetvalue = 308, + CommandDebugGetitemvalue = 307, // DEPRECATED: DON'T REUSE + CommandDebugGetvalue = 308, // DEPRECATED: DON'T REUSE CommandDebugHostil = 309, CommandDebugItemexpire = 310, CommandDebugLootrecipient = 311, CommandDebugLos = 312, - CommandDebugMod32value = 313, + CommandDebugMod32value = 313, // DEPRECATED: DON'T REUSE CommandDebugMoveflags = 314, CommandDebugPlay = 315, CommandDebugPlayCinematic = 316, @@ -237,13 +237,13 @@ namespace Framework.Constants CommandDebugSendSetphaseshift = 329, CommandDebugSendSpellfail = 330, CommandDebugSetaurastate = 331, - CommandDebugSetbit = 332, - CommandDebugSetitemvalue = 333, - CommandDebugSetvalue = 334, + CommandDebugSetbit = 332, // DEPRECATED: DON'T REUSE + CommandDebugSetitemvalue = 333, // DEPRECATED: DON'T REUSE + CommandDebugSetvalue = 334, // DEPRECATED: DON'T REUSE CommandDebugSetvid = 335, CommandDebugSpawnvehicle = 336, CommandDebugThreat = 337, - CommandDebugUpdate = 338, + CommandDebugUpdate = 338, // DEPRECATED: DON'T REUSE CommandDebugUws = 339, CommandWpgps = 340, CommandDeserter = 341, @@ -451,7 +451,7 @@ namespace Framework.Constants CommandDemorph = 543, CommandModify = 544, CommandModifyArenapoints = 545, - CommandModifyBit = 546, + CommandModifyBit = 546, // DEPRECATED: DON'T REUSE CommandModifyDrunk = 547, CommandModifyEnergy = 548, CommandModifyFaction = 549, @@ -558,7 +558,7 @@ namespace Framework.Constants CommandReloadSupportSystem = 650, CommandReloadGossipMenu = 651, CommandReloadGossipMenuOption = 652, - CommandReloadItemEnchantmentTemplate = 653, + CommandReloadItemRandomBonusListTemplate = 653, CommandReloadItemLootTemplate = 654, CommandReloadItemSetNames = 655, CommandReloadLfgDungeonRewards = 656, diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index a32952228..0722a7bc2 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -411,7 +411,7 @@ namespace Framework.Constants ReachAccountHonorLevel = 213, HeartOfAzerothArtifactPowerEarned = 214, HeartOfAzerothLevelReached = 215, - TotalTypes + TotalTypes = 217 } public enum CriteriaDataType diff --git a/Source/Framework/Constants/CreatureConst.cs b/Source/Framework/Constants/CreatureConst.cs index dd4778137..98650a546 100644 --- a/Source/Framework/Constants/CreatureConst.cs +++ b/Source/Framework/Constants/CreatureConst.cs @@ -110,7 +110,7 @@ namespace Framework.Constants Unk1 = 0x01, } - public enum NPCFlags : ulong + public enum NPCFlags : uint { None = 0x00, Gossip = 0x01, // 100% @@ -145,14 +145,19 @@ namespace Framework.Constants VaultKeeper = 0x20000000, // Void Storage WildBattlePet = 0x40000000, // Pet That Player Can Fight (Battle Pet) BlackMarket = 0x80000000, // Black Market - ItemUpgradeMaster = 0x100000000, - GarrisonArchitect = 0x200000000, - Steering = 0x400000000, - ShipmentCrafter = 0x1000000000, - GarrisonMissionNpc = 0x2000000000, - TradeskillNpc = 0x4000000000, - BlackMarketView = 0x8000000000, - ContributionCollector = 0x40000000000, + } + + public enum NPCFlags2 + { + None = 0x00, + ItemUpgradeMaster = 0x01, + GarrisonArchitect = 0x02, + Steering = 0x04, + ShipmentCrafter = 0x10, + GarrisonMissionNpc = 0x20, + TradeskillNpc = 0x40, + BlackMarketView = 0x80, + ContributionCollector = 0x400, } public enum CreatureTypeFlags : uint diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index faf60a4ae..0d89872ac 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -29,7 +29,6 @@ namespace Framework.Constants public const int MaxOutfitItems = 24; public const int MaxItemExtCostItems = 5; public const int MaxItemExtCostCurrencies = 5; - public const int MaxItemRandomProperties = 5; public const int MaxItemEnchantmentEffects = 3; public const int MaxProtoSpells = 5; public const int MaxEquipmentSetIndex = 20; diff --git a/Source/Framework/Constants/Network/NetworkConst.cs b/Source/Framework/Constants/Network/NetworkConst.cs index a8ce8b370..e2dd545b9 100644 --- a/Source/Framework/Constants/Network/NetworkConst.cs +++ b/Source/Framework/Constants/Network/NetworkConst.cs @@ -21,8 +21,8 @@ namespace Framework.Constants public enum SessionStatus { Authed = 0, // Player authenticated (_player == NULL, m_playerRecentlyLogout = false or will be reset before handler call, m_GUID have garbage) - Loggedin, // Player in game (_player != NULL, m_GUID == _player->GetGUID(), inWorld()) - Transfer, // Player transferring to another map (_player != NULL, m_GUID == _player->GetGUID(), !inWorld()) + Loggedin, // Player in game (_player != NULL, m_GUID == _player.GetGUID(), inWorld()) + Transfer, // Player transferring to another map (_player != NULL, m_GUID == _player.GetGUID(), !inWorld()) LoggedinOrRecentlyLogout, // _player != NULL or _player == NULL && m_playerRecentlyLogout && m_playerLogout, m_GUID store last _player guid) } diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index c9bb2585d..3faadec8b 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -28,19 +28,19 @@ namespace Framework.Constants AddBattlenetFriend = 0x365c, AddFriend = 0x36d5, AddIgnore = 0x36d9, - AddToy = 0x3297, - AdventureJournalOpenQuest = 0x3201, - AdventureJournalStartQuest = 0x333e, - AdventureMapPoiQuery = 0x3245, + AddToy = 0x329a, + AdventureJournalOpenQuest = 0x3204, + AdventureJournalStartQuest = 0x3341, + AdventureMapPoiQuery = 0x3248, AlterAppearance = 0x34f6, AreaSpiritHealerQuery = 0x34b0, AreaSpiritHealerQueue = 0x34b1, - AreaTrigger = 0x31d5, - ArtifactAddPower = 0x31a8, - ArtifactSetAppearance = 0x31aa, - AssignEquipmentSetSpec = 0x3209, - AttackStop = 0x3254, - AttackSwing = 0x3253, + AreaTrigger = 0x31d8, + ArtifactAddPower = 0x31a9, + ArtifactSetAppearance = 0x31ab, + AssignEquipmentSetSpec = 0x320c, + AttackStop = 0x3257, + AttackSwing = 0x3256, AuctionHelloRequest = 0x34cb, AuctionListBidderItems = 0x34d1, AuctionListItems = 0x34ce, @@ -59,13 +59,15 @@ namespace Framework.Constants AutoEquipItem = 0x399a, AutoEquipItemSlot = 0x399f, AutoStoreBagItem = 0x399b, - AzeriteEmpoweredItemSelectPower = 0x335c, - AzeriteEmpoweredItemViewed = 0x3348, + AzeriteEmpoweredItemSelectPower = 0x335f, + AzeriteEmpoweredItemViewed = 0x334b, + AzeriteEssenceActivateEssence = 0x3361, + AzeriteEssenceUnlockMilestone = 0x3360, BankerActivate = 0x34b3, - BattlefieldLeave = 0x3172, - BattlefieldList = 0x317d, + BattlefieldLeave = 0x3173, + BattlefieldList = 0x317e, BattlefieldPort = 0x3527, - BattlemasterHello = 0x32af, + BattlemasterHello = 0x32b2, BattlemasterJoin = 0x3522, BattlemasterJoinArena = 0x3523, BattlemasterJoinBrawl = 0x3525, @@ -74,21 +76,21 @@ namespace Framework.Constants BattlenetRequest = 0x36fc, BattlenetRequestRealmListTicket = 0x3700, BattlePayAckFailedResponse = 0x36d0, - BattlePayCancelOpenCheckout = 0x371b, + BattlePayCancelOpenCheckout = 0x3719, BattlePayConfirmPurchaseResponse = 0x36cf, BattlePayDistributionAssignToTarget = 0x36c6, BattlePayGetProductList = 0x36be, BattlePayGetPurchaseList = 0x36bf, - BattlePayOpenCheckout = 0x3714, + BattlePayOpenCheckout = 0x3712, BattlePayQueryClassTrialBoostResult = 0x36c9, BattlePayRequestCharacterBoostUnrevoke = 0x36c7, - BattlePayRequestCurrentVasTransferQueues = 0x3711, - BattlePayRequestPriceInfo = 0x3710, - BattlePayRequestVasCharacterQueueTime = 0x3712, + BattlePayRequestCurrentVasTransferQueues = 0x370f, + BattlePayRequestPriceInfo = 0x370e, + BattlePayRequestVasCharacterQueueTime = 0x3710, BattlePayStartPurchase = 0x36f8, BattlePayStartVasPurchase = 0x36f9, BattlePayTrialBoostCharacter = 0x36c8, - BattlePayValidateBnetVasTransfer = 0x3713, + BattlePayValidateBnetVasTransfer = 0x3711, BattlePayVasPurchaseComplete = 0x36f7, BattlePetClearFanfare = 0x312c, BattlePetDeletePet = 0x3625, @@ -99,14 +101,14 @@ namespace Framework.Constants BattlePetSetBattleSlot = 0x362d, BattlePetSetFlags = 0x3631, BattlePetSummon = 0x3629, - BattlePetUpdateDisplayNotify = 0x31df, - BattlePetUpdateNotify = 0x31de, + BattlePetUpdateDisplayNotify = 0x31e2, + BattlePetUpdateNotify = 0x31e1, BeginTrade = 0x3157, BinderActivate = 0x34b2, BlackMarketBidOnItem = 0x352f, BlackMarketOpen = 0x352d, BlackMarketRequestItems = 0x352e, - BonusRoll = 0x335d, + BonusRoll = 0x3362, BugReport = 0x3688, BusyTrade = 0x3158, BuyBackItem = 0x34a4, @@ -115,7 +117,7 @@ namespace Framework.Constants BuyReagentBank = 0x34b5, BuyWowTokenConfirm = 0x36f1, BuyWowTokenStart = 0x36f0, - CageBattlePet = 0x31f0, + CageBattlePet = 0x31f3, CalendarAddEvent = 0x367f, CalendarCommunityFilter = 0x3673, CalendarComplain = 0x367b, @@ -131,25 +133,25 @@ namespace Framework.Constants CalendarRemoveEvent = 0x3679, CalendarRemoveInvite = 0x3675, CalendarUpdateEvent = 0x3680, - CancelAura = 0x31ac, + CancelAura = 0x31ad, CancelAutoRepeatSpell = 0x34e8, - CancelCast = 0x329d, - CancelChannelling = 0x3269, - CancelGrowthAura = 0x326e, - CancelMasterLootRoll = 0x3211, - CancelModSpeedNoControlAuras = 0x31ab, - CancelMountAura = 0x327f, - CancelQueuedSpell = 0x317e, + CancelCast = 0x32a0, + CancelChannelling = 0x326c, + CancelGrowthAura = 0x3271, + CancelMasterLootRoll = 0x3214, + CancelModSpeedNoControlAuras = 0x31ac, + CancelMountAura = 0x3282, + CancelQueuedSpell = 0x317f, CancelTempEnchantment = 0x34f3, CancelTrade = 0x315c, CanDuel = 0x3664, - CanRedeemWowTokenForBalance = 0x370f, - CastSpell = 0x329a, + CanRedeemWowTokenForBalance = 0x370d, + CastSpell = 0x329d, ChallengeModeRequestLeaders = 0x3090, ChallengeModeRequestMapStats = 0x308f, - ChangeBagSlotFlag = 0x3320, - ChangeBankBagSlotFlag = 0x3321, - ChangeMonumentAppearance = 0x3302, + ChangeBagSlotFlag = 0x3323, + ChangeBankBagSlotFlag = 0x3324, + ChangeMonumentAppearance = 0x3305, ChangeSubGroup = 0x364e, CharacterRenameRequest = 0x36c4, CharCustomize = 0x3693, @@ -193,12 +195,20 @@ namespace Framework.Constants ChatUnregisterAllAddonPrefixes = 0x37ce, CheckRafEmailEnabled = 0x36d1, CheckWowTokenVeteranEligibility = 0x36ef, - ChoiceResponse = 0x329f, - ClearRaidMarker = 0x31a4, + ChoiceResponse = 0x32a2, + ClearRaidMarker = 0x31a5, ClearTradeItem = 0x315e, ClientPortGraveyard = 0x3529, CloseInteraction = 0x3493, - CloseQuestChoice = 0x32a0, + CloseQuestChoice = 0x32a3, + ClubFinderApplicationResponse = 0x3723, + ClubFinderGetApplicantsList = 0x3721, + ClubFinderPost = 0x371e, + ClubFinderRequestClubsData = 0x3727, + ClubFinderRequestClubsList = 0x371f, + ClubFinderRequestMembershipToClub = 0x3720, + ClubFinderRequestPendingClubsList = 0x3726, + ClubFinderRespondToApplicant = 0x3722, ClubInvite = 0x36ff, CollectionItemSetFavorite = 0x3634, CommentatorEnable = 0x35f1, @@ -211,24 +221,23 @@ namespace Framework.Constants Complaint = 0x366e, CompleteCinematic = 0x3547, CompleteMovie = 0x34de, - ConfirmArtifactRespec = 0x31a9, - ConfirmRespecWipe = 0x320b, + ConfirmArtifactRespec = 0x31aa, + ConfirmRespecWipe = 0x320e, ConnectToFailed = 0x35d4, ContributionContribute = 0x3557, ContributionGetState = 0x3558, ConversationLineStarted = 0x3548, - ConvertConsumptionTime = 0x3702, ConvertRaid = 0x3650, CreateCharacter = 0x3645, - CreateShipment = 0x32ee, + CreateShipment = 0x32f1, DbQueryBulk = 0x35e5, DeclineGuildInvites = 0x3520, DeclinePetition = 0x3536, DeleteEquipmentSet = 0x350d, DelFriend = 0x36d6, DelIgnore = 0x36da, - DepositReagentBank = 0x3329, - DestroyItem = 0x3291, + DepositReagentBank = 0x332c, + DestroyItem = 0x3294, DfBootPlayerVote = 0x3616, DfGetJoinStatus = 0x3614, DfGetSystemInfo = 0x3613, @@ -240,10 +249,10 @@ namespace Framework.Constants DfTeleport = 0x3617, DiscardedTimeSyncAcks = 0x3a3c, DismissCritter = 0x34fc, - DoMasterLootRoll = 0x3210, + DoMasterLootRoll = 0x3213, DoReadyCheck = 0x3635, DuelResponse = 0x34e3, - EjectPassenger = 0x323a, + EjectPassenger = 0x323d, Emote = 0x3543, EnableEncryptionAck = 0x3767, EnableNagle = 0x376b, @@ -252,43 +261,43 @@ namespace Framework.Constants EnumCharacters = 0x35e9, EnumCharactersDeletedByClient = 0x36e3, FarSight = 0x34e9, - GameEventDebugDisable = 0x31b0, - GameEventDebugEnable = 0x31af, + GameEventDebugDisable = 0x31b1, + GameEventDebugEnable = 0x31b0, GameObjReportUse = 0x34f0, GameObjUse = 0x34ef, - GarrisonAssignFollowerToBuilding = 0x32d9, - GarrisonCancelConstruction = 0x32ca, - GarrisonCheckUpgradeable = 0x331c, - GarrisonCompleteMission = 0x330f, - GarrisonGenerateRecruits = 0x32dc, - GarrisonGetBuildingLandmarks = 0x32ea, - GarrisonGetMissionReward = 0x3342, - GarrisonMissionBonusRoll = 0x3311, - GarrisonPurchaseBuilding = 0x32c6, - GarrisonRecruitFollower = 0x32de, - GarrisonRemoveFollower = 0x3306, - GarrisonRemoveFollowerFromBuilding = 0x32da, - GarrisonRenameFollower = 0x32db, - GarrisonRequestBlueprintAndSpecializationData = 0x32c5, - GarrisonRequestClassSpecCategoryInfo = 0x32e3, - GarrisonRequestLandingPageShipmentInfo = 0x32ed, - GarrisonRequestShipmentInfo = 0x32ec, - GarrisonResearchTalent = 0x32df, - GarrisonSetBuildingActive = 0x32c7, - GarrisonSetFollowerFavorite = 0x32d7, - GarrisonSetFollowerInactive = 0x32d3, - GarrisonSetRecruitmentPreferences = 0x32dd, - GarrisonStartMission = 0x330e, - GarrisonSwapBuildings = 0x32cb, + GarrisonAssignFollowerToBuilding = 0x32dc, + GarrisonCancelConstruction = 0x32cd, + GarrisonCheckUpgradeable = 0x331f, + GarrisonCompleteMission = 0x3312, + GarrisonGenerateRecruits = 0x32df, + GarrisonGetBuildingLandmarks = 0x32ed, + GarrisonGetMissionReward = 0x3345, + GarrisonMissionBonusRoll = 0x3314, + GarrisonPurchaseBuilding = 0x32c9, + GarrisonRecruitFollower = 0x32e1, + GarrisonRemoveFollower = 0x3309, + GarrisonRemoveFollowerFromBuilding = 0x32dd, + GarrisonRenameFollower = 0x32de, + GarrisonRequestBlueprintAndSpecializationData = 0x32c8, + GarrisonRequestClassSpecCategoryInfo = 0x32e6, + GarrisonRequestLandingPageShipmentInfo = 0x32f0, + GarrisonRequestShipmentInfo = 0x32ef, + GarrisonResearchTalent = 0x32e2, + GarrisonSetBuildingActive = 0x32ca, + GarrisonSetFollowerFavorite = 0x32da, + GarrisonSetFollowerInactive = 0x32d6, + GarrisonSetRecruitmentPreferences = 0x32e0, + GarrisonStartMission = 0x3311, + GarrisonSwapBuildings = 0x32ce, GenerateRandomCharacterName = 0x35e8, GetAccountCharacterList = 0x36ba, GetChallengeModeRewards = 0x3685, - GetGarrisonInfo = 0x32c0, + GetGarrisonInfo = 0x32c3, GetItemPurchaseData = 0x3531, - GetMirrorImageData = 0x3295, + GetMirrorImageData = 0x3298, GetPvpOptionsEnabled = 0x35ef, GetRemainingGameTime = 0x36f2, - GetTrophyList = 0x32ff, + GetTrophyList = 0x3302, GetUndeleteCharacterCooldownStatus = 0x36e5, GmTicketAcknowledgeSurvey = 0x3697, GmTicketGetCaseStatus = 0x3696, @@ -346,27 +355,27 @@ namespace Framework.Constants InitiateTrade = 0x3156, Inspect = 0x352b, InstanceLockResponse = 0x350e, - IslandQueue = 0x3388, + IslandQueue = 0x338e, ItemPurchaseRefund = 0x3532, - ItemTextQuery = 0x331d, - JoinPetBattleQueue = 0x31dc, - JoinRatedBattleground = 0x3177, + ItemTextQuery = 0x3320, + JoinPetBattleQueue = 0x31df, + JoinRatedBattleground = 0x3178, KeepAlive = 0x3681, - KeyboundOverride = 0x3222, + KeyboundOverride = 0x3225, LearnPvpTalents = 0x3556, LearnTalents = 0x3554, LeaveGroup = 0x364b, - LeavePetBattleQueue = 0x31dd, + LeavePetBattleQueue = 0x31e0, LfgListApplyToGroup = 0x360d, LfgListCancelApplication = 0x360e, LfgListDeclineApplicant = 0x360f, LfgListGetStatus = 0x360b, LfgListInviteApplicant = 0x3610, LfgListInviteResponse = 0x3611, - LfgListJoin = 0x335a, + LfgListJoin = 0x335d, LfgListLeave = 0x360a, LfgListSearch = 0x360c, - LfgListUpdateRequest = 0x335b, + LfgListUpdateRequest = 0x335e, LfGuildAddRecruit = 0x361c, LfGuildBrowse = 0x361e, LfGuildDeclineRecruit = 0x3079, @@ -380,33 +389,33 @@ namespace Framework.Constants LiveRegionCharacterCopy = 0x36bc, LiveRegionGetAccountCharacterList = 0x36bb, LoadingScreenNotify = 0x35f9, - LoadSelectedTrophy = 0x3300, + LoadSelectedTrophy = 0x3303, LogoutCancel = 0x34d9, LogoutInstant = 0x34da, LogoutRequest = 0x34d7, LogDisconnect = 0x3769, LogStreamingError = 0x376d, - LootItem = 0x320e, - LootMoney = 0x320d, - LootRelease = 0x3212, - LootRoll = 0x3213, - LootUnit = 0x320c, + LootItem = 0x3211, + LootMoney = 0x3210, + LootRelease = 0x3215, + LootRoll = 0x3216, + LootUnit = 0x320f, LowLevelRaid1 = 0x36a4, LowLevelRaid2 = 0x3515, MailCreateTextItem = 0x353d, - MailDelete = 0x3224, + MailDelete = 0x3227, MailGetList = 0x3538, MailMarkAsRead = 0x353c, MailReturnToSender = 0x3657, MailTakeItem = 0x353a, MailTakeMoney = 0x3539, - MakeContitionalAppearancePermanent = 0x3227, - MasterLootItem = 0x320f, + MakeContitionalAppearancePermanent = 0x322a, + MasterLootItem = 0x3212, MinimapPing = 0x364d, - MissileTrajectoryCollision = 0x3189, + MissileTrajectoryCollision = 0x318a, MountClearFanfare = 0x312d, MountSetFavorite = 0x3633, - MountSpecialAnim = 0x3280, + MountSpecialAnim = 0x3283, MoveApplyMovementForceAck = 0x3a12, MoveChangeTransport = 0x3a2c, MoveChangeVehicleSeats = 0x3a31, @@ -423,7 +432,6 @@ namespace Framework.Constants MoveForceRootAck = 0x3a0b, MoveForceRunBackSpeedChangeAck = 0x3a09, MoveForceRunSpeedChangeAck = 0x3a08, - MoveForceSetModMovementForceMagnitudeAck = 0x3a3d, MoveForceSwimBackSpeedChangeAck = 0x3a1f, MoveForceSwimSpeedChangeAck = 0x3a0a, MoveForceTurnRateChangeAck = 0x3a20, @@ -444,6 +452,7 @@ namespace Framework.Constants MoveSetFacing = 0x3a06, MoveSetFly = 0x3a25, MoveSetIgnoreMovementForcesAck = 0x3a23, + MoveSetModMovementForceMagnitudeAck = 0x3a3d, MoveSetPitch = 0x3a07, MoveSetRunMode = 0x39f2, MoveSetVehicleRecIdAck = 0x3a11, @@ -471,16 +480,16 @@ namespace Framework.Constants MoveToggleCollisionCheat = 0x3a05, MoveUpdateFallSpeed = 0x3a17, MoveWaterWalkAck = 0x3a1a, - NeutralPlayerSelectFaction = 0x31d2, + NeutralPlayerSelectFaction = 0x31d5, NextCinematicCamera = 0x3546, - ObjectUpdateFailed = 0x317f, - ObjectUpdateRescued = 0x3180, + ObjectUpdateFailed = 0x3180, + ObjectUpdateRescued = 0x3181, OfferPetition = 0x36b3, OpeningCinematic = 0x3545, - OpenItem = 0x331e, - OpenMissionNpc = 0x32e5, - OpenShipmentNpc = 0x32eb, - OpenTradeskillNpc = 0x32f6, + OpenItem = 0x3321, + OpenMissionNpc = 0x32e8, + OpenShipmentNpc = 0x32ee, + OpenTradeskillNpc = 0x32f9, OptOutOfLoot = 0x34f7, PartyInvite = 0x3603, PartyInviteResponse = 0x3604, @@ -491,50 +500,49 @@ namespace Framework.Constants PetitionShowSignatures = 0x34ca, PetAbandon = 0x348d, PetAction = 0x348b, - PetBattleFinalNotify = 0x31e1, + PetBattleFinalNotify = 0x31e4, PetBattleInput = 0x3642, - PetBattleQueueProposeMatchResult = 0x3223, - PetBattleQuitNotify = 0x31e0, + PetBattleQueueProposeMatchResult = 0x3226, + PetBattleQuitNotify = 0x31e3, PetBattleReplaceFrontPet = 0x3643, - PetBattleRequestPvp = 0x31da, - PetBattleRequestUpdate = 0x31db, - PetBattleRequestWild = 0x31d8, - PetBattleScriptErrorNotify = 0x31e2, - PetBattleWildLocationFail = 0x31d9, + PetBattleRequestPvp = 0x31dd, + PetBattleRequestUpdate = 0x31de, + PetBattleRequestWild = 0x31db, + PetBattleScriptErrorNotify = 0x31e5, + PetBattleWildLocationFail = 0x31dc, PetCancelAura = 0x348e, - PetCastSpell = 0x3299, + PetCastSpell = 0x329c, PetRename = 0x3687, PetSetAction = 0x348a, PetSpellAutocast = 0x348f, PetStopAttack = 0x348c, Ping = 0x3768, PlayerLogin = 0x35eb, - ProtocolMismatch = 0x376e, PushQuestToParty = 0x349f, - PvpLogData = 0x317a, - QueryBattlePetName = 0x3275, + PvpLogData = 0x317b, + QueryBattlePetName = 0x3278, QueryCommunityName = 0x368e, QueryCorpseLocationFromClient = 0x3662, QueryCorpseTransport = 0x3663, - QueryCountdownTimer = 0x31a7, - QueryCreature = 0x326f, - QueryGameObject = 0x3270, - QueryGarrisonCreatureName = 0x3276, + QueryCountdownTimer = 0x31a8, + QueryCreature = 0x3272, + QueryGameObject = 0x3273, + QueryGarrisonCreatureName = 0x3279, QueryGuildInfo = 0x3691, QueryInspectAchievements = 0x3503, QueryNextMailTime = 0x353b, - QueryNpcText = 0x3271, - QueryPageText = 0x3273, - QueryPetition = 0x3277, - QueryPetName = 0x3274, + QueryNpcText = 0x3274, + QueryPageText = 0x3276, + QueryPetition = 0x327a, + QueryPetName = 0x3277, QueryPlayerName = 0x368d, - QueryQuestCompletionNpcs = 0x3174, - QueryQuestInfo = 0x3272, + QueryQuestCompletionNpcs = 0x3175, + QueryQuestInfo = 0x3275, QueryRealmName = 0x3690, QueryScenarioPoi = 0x3658, QueryTime = 0x34d6, - QueryTreasurePicker = 0x3344, - QueryVoidStorage = 0x31a0, + QueryTreasurePicker = 0x3347, + QueryVoidStorage = 0x31a1, QuestConfirmAccept = 0x349e, QuestGiverAcceptQuest = 0x3498, QuestGiverChooseReward = 0x349a, @@ -548,72 +556,71 @@ namespace Framework.Constants QuestPoiQuery = 0x36b4, QuestPushResult = 0x34a0, QueuedMessagesEnd = 0x376c, - QuickJoinAutoAcceptRequests = 0x370e, - QuickJoinRequestInvite = 0x370d, - QuickJoinRespondToInvite = 0x370c, - QuickJoinSignalToastDisplayed = 0x370b, + QuickJoinAutoAcceptRequests = 0x370c, + QuickJoinRequestInvite = 0x370b, + QuickJoinRespondToInvite = 0x370a, + QuickJoinSignalToastDisplayed = 0x3709, RaidOrBattlegroundEngineSurvey = 0x36ea, RandomRoll = 0x3656, ReadyCheckResponse = 0x3636, - ReadItem = 0x331f, + ReadItem = 0x3322, ReclaimCorpse = 0x34dc, RecruitAFriend = 0x36d2, RedeemWowTokenConfirm = 0x36f4, RedeemWowTokenStart = 0x36f3, - RemoveNewItem = 0x3347, + RemoveNewItem = 0x334a, ReorderCharacters = 0x35ea, RepairItem = 0x34ed, - ReplaceTrophy = 0x3301, + ReplaceTrophy = 0x3304, RepopRequest = 0x3528, - ReportClientVariables = 0x3708, - ReportEnabledAddons = 0x3707, - ReportKeybindingExecutionCounts = 0x3709, + ReportClientVariables = 0x3706, + ReportEnabledAddons = 0x3705, + ReportKeybindingExecutionCounts = 0x3707, ReportPvpPlayerAfk = 0x34f5, - ReportServerLag = 0x338d, + ReportServerLag = 0x3394, RequestAccountData = 0x369a, - RequestAreaPoiUpdate = 0x3346, + RequestAreaPoiUpdate = 0x3349, RequestBattlefieldStatus = 0x35dd, - RequestCategoryCooldowns = 0x317c, - RequestCemeteryList = 0x3175, - RequestChallengeModeAffixes = 0x3205, + RequestCategoryCooldowns = 0x317d, + RequestCemeteryList = 0x3176, + RequestChallengeModeAffixes = 0x3208, RequestCharacterGuildFollowInfo = 0x3692, - RequestConquestFormulaConstants = 0x32b2, - RequestConsumptionConversionInfo = 0x3701, + RequestConquestFormulaConstants = 0x32b5, RequestCrowdControlSpell = 0x352c, - RequestForcedReactions = 0x3207, - RequestGuildPartyState = 0x31a6, - RequestGuildRewardsList = 0x31a5, - RequestLfgListBlacklist = 0x32a2, + RequestForcedReactions = 0x320a, + RequestGuildPartyState = 0x31a7, + RequestGuildRewardsList = 0x31a6, + RequestLfgListBlacklist = 0x32a5, RequestPartyJoinUpdates = 0x35f8, RequestPartyMemberStats = 0x3655, RequestPetInfo = 0x3490, - RequestPlayedTime = 0x327a, - RequestPvpBrawlInfo = 0x3194, - RequestPvpRewards = 0x3193, - RequestQuestLinesForMap = 0x3389, + RequestPlayedTime = 0x327d, + RequestPvpBrawlInfo = 0x3195, + RequestPvpRewards = 0x3194, + RequestQuestLinesForMap = 0x338f, RequestRaidInfo = 0x36cd, RequestRatedBattlefieldInfo = 0x35e4, RequestRealmGuildMasterInfo = 0x309b, RequestResearchHistory = 0x3167, RequestStabledPets = 0x3491, - RequestVehicleExit = 0x3235, - RequestVehicleNextSeat = 0x3237, - RequestVehiclePrevSeat = 0x3236, - RequestVehicleSwitchSeat = 0x3238, - RequestWorldQuestUpdate = 0x3345, + RequestVehicleExit = 0x3238, + RequestVehicleNextSeat = 0x323a, + RequestVehiclePrevSeat = 0x3239, + RequestVehicleSwitchSeat = 0x323b, + RequestWorldQuestUpdate = 0x3348, RequestWowTokenMarketPrice = 0x36ec, - ResetChallengeMode = 0x3203, - ResetChallengeModeCheat = 0x3204, + ResetChallengeMode = 0x3206, + ResetChallengeModeCheat = 0x3207, ResetInstances = 0x366a, ResurrectResponse = 0x3686, - RevertMonumentAppearance = 0x3303, - RideVehicleInteract = 0x3239, - SaveCufProfiles = 0x318a, + RevertMonumentAppearance = 0x3306, + RideVehicleInteract = 0x323c, + SaveCufProfiles = 0x318b, SaveEquipmentSet = 0x350c, - SaveGuildEmblem = 0x32a6, - ScenePlaybackCanceled = 0x321f, - ScenePlaybackComplete = 0x321e, - SceneTriggerEvent = 0x3220, + SaveGuildEmblem = 0x32a9, + ScenePlaybackCanceled = 0x3222, + ScenePlaybackComplete = 0x3221, + SceneTriggerEvent = 0x3223, SelfRes = 0x3533, SellItem = 0x34a2, SellWowTokenConfirm = 0x36ee, @@ -622,58 +629,58 @@ namespace Framework.Constants SendMail = 0x35fb, SendSorRequestViaAddress = 0x3621, SendTextEmote = 0x3488, - SetAchievementsHidden = 0x3225, + SetAchievementsHidden = 0x3228, SetActionBarToggles = 0x3534, SetActionButton = 0x3637, SetActiveMover = 0x3a37, - SetAdvancedCombatLogging = 0x32b3, + SetAdvancedCombatLogging = 0x32b6, SetAssistantLeader = 0x3651, - SetBackpackAutosortDisabled = 0x3322, - SetBankAutosortDisabled = 0x3323, + SetBackpackAutosortDisabled = 0x3325, + SetBankAutosortDisabled = 0x3326, SetContactNotes = 0x36d7, SetCurrencyFlags = 0x3169, - SetDifficultyId = 0x3221, + SetDifficultyId = 0x3224, SetDungeonDifficulty = 0x3684, SetEveryoneIsAssistant = 0x3618, SetFactionAtWar = 0x34df, SetFactionInactive = 0x34e1, SetFactionNotAtWar = 0x34e0, - SetGameEventDebugViewState = 0x31b8, - SetInsertItemsLeftToRight = 0x3325, - SetLfgBonusFactionId = 0x32a1, + SetGameEventDebugViewState = 0x31b9, + SetInsertItemsLeftToRight = 0x3328, + SetLfgBonusFactionId = 0x32a4, SetLootMethod = 0x364a, SetLootSpecialization = 0x3541, SetPartyAssignment = 0x3653, SetPartyLeader = 0x364c, SetPetSlot = 0x3168, SetPlayerDeclinedNames = 0x368c, - SetPreferredCemetery = 0x3176, - SetPvp = 0x32aa, + SetPreferredCemetery = 0x3177, + SetPvp = 0x32ad, SetRaidDifficulty = 0x36e1, SetRole = 0x35d9, SetSavedInstanceExtend = 0x368a, SetSelection = 0x352a, SetSheathed = 0x3489, - SetSortBagsRightToLeft = 0x3324, + SetSortBagsRightToLeft = 0x3327, SetTaxiBenchmarkMode = 0x34f4, - SetTitle = 0x327e, + SetTitle = 0x3281, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x32e7, - SetWarMode = 0x32ab, + SetUsingPartyGarrison = 0x32ea, + SetWarMode = 0x32ae, SetWatchedFaction = 0x34e2, ShowTradeSkill = 0x36c5, SignPetition = 0x3535, SilencePartyTalker = 0x3654, SocketGems = 0x34ec, - SortBags = 0x3326, - SortBankBags = 0x3327, - SortReagentBankBags = 0x3328, + SortBags = 0x3329, + SortBankBags = 0x332a, + SortReagentBankBags = 0x332b, SpellClick = 0x3495, SpiritHealerActivate = 0x34af, SplitItem = 0x399e, - StandStateChange = 0x3188, + StandStateChange = 0x3189, StartChallengeMode = 0x354c, StartSpectatorWarGame = 0x35e0, StartWarGame = 0x35df, @@ -681,14 +688,14 @@ namespace Framework.Constants SupportTicketSubmitBug = 0x3647, SupportTicketSubmitComplaint = 0x3646, SupportTicketSubmitSuggestion = 0x3648, - SurrenderArena = 0x3173, + SurrenderArena = 0x3174, SuspendCommsAck = 0x3764, SuspendTokenResponse = 0x376a, SwapInvItem = 0x399d, SwapItem = 0x399c, SwapSubGroups = 0x364f, - SwapVoidItem = 0x31a2, - TabardVendorActivate = 0x32a7, + SwapVoidItem = 0x31a3, + TabardVendorActivate = 0x32aa, TalkToGossip = 0x3492, TaxiNodeStatusQuery = 0x34a8, TaxiQueryAvailableNodes = 0x34aa, @@ -698,45 +705,44 @@ namespace Framework.Constants TimeSyncResponseDropped = 0x3a3a, TimeSyncResponseFailed = 0x3a39, ToggleDifficulty = 0x3659, - TogglePvp = 0x32a9, + TogglePvp = 0x32ac, TotemDestroyed = 0x34fb, ToyClearFanfare = 0x312e, - TradeSkillSetFavorite = 0x3343, + TradeSkillSetFavorite = 0x3346, TrainerBuySpell = 0x34ae, TrainerList = 0x34ad, - TransmogrifyItems = 0x3195, + TransmogrifyItems = 0x3196, TurnInPetition = 0x3537, Tutorial = 0x36e2, TwitterCheckStatus = 0x312a, TwitterConnect = 0x3127, TwitterDisconnect = 0x312b, - TwitterPost = 0x332a, + TwitterPost = 0x332d, UiTimeRequest = 0x369f, UnacceptTrade = 0x315b, UndeleteCharacter = 0x36e4, UnlearnSkill = 0x34e6, - UnlearnSpecialization = 0x31a3, - UnlockVoidStorage = 0x319f, + UnlearnSpecialization = 0x31a4, + UnlockVoidStorage = 0x31a0, UpdateAccountData = 0x369b, - UpdateAreaTriggerVisual = 0x329c, + UpdateAreaTriggerVisual = 0x329f, UpdateClientSettings = 0x3666, UpdateMissileTrajectory = 0x3a3e, UpdateRaidTarget = 0x3652, - UpdateSpellVisual = 0x329b, + UpdateSpellVisual = 0x329e, UpdateVasPurchaseStates = 0x36fa, UpdateWowTokenAuctionableList = 0x36f5, UpdateWowTokenCount = 0x36eb, - UpgradeGarrison = 0x32bb, - UpgradeItem = 0x3226, - UsedFollow = 0x3185, - UseCritterItem = 0x323f, + UpgradeGarrison = 0x32be, + UsedFollow = 0x3186, + UseCritterItem = 0x3242, UseEquipmentSet = 0x3995, - UseItem = 0x3296, - UseToy = 0x3298, - ViolenceLevel = 0x3183, - VoiceChatJoinChannel = 0x3717, - VoiceChatLogin = 0x3716, - VoidStorageTransfer = 0x31a1, + UseItem = 0x3299, + UseToy = 0x329b, + ViolenceLevel = 0x3184, + VoiceChatJoinChannel = 0x3715, + VoiceChatLogin = 0x3714, + VoidStorageTransfer = 0x31a2, WardenData = 0x35ed, Who = 0x3683, WhoIs = 0x3682, @@ -751,10 +757,10 @@ namespace Framework.Constants { AbortNewWorld = 0x25ae, AccountCriteriaUpdate = 0x2655, - AccountDataTimes = 0x2752, + AccountDataTimes = 0x2753, AccountMountUpdate = 0x25c3, AccountToysUpdate = 0x25c4, - AchievementDeleted = 0x2727, + AchievementDeleted = 0x2728, AchievementEarned = 0x2663, ActivateTaxiReply = 0x26ac, ActiveGlyphs = 0x2c53, @@ -763,7 +769,7 @@ namespace Framework.Constants AddLossOfControl = 0x269c, AddRunePower = 0x26eb, AdjustSplineDuration = 0x25e8, - AdventureMapPoiQueryResponse = 0x2845, + AdventureMapPoiQueryResponse = 0x2847, AeLootTargets = 0x262e, AeLootTargetAck = 0x262f, AiReaction = 0x26e8, @@ -771,44 +777,47 @@ namespace Framework.Constants AllAchievementData = 0x256f, AllGuildAchievements = 0x29b8, ArchaeologySurveryCast = 0x2587, - AreaPoiUpdate = 0x2852, - AreaSpiritHealerTime = 0x278a, + AreaPoiUpdate = 0x2854, + AreaSpiritHealerTime = 0x278b, AreaTriggerDenied = 0x26a3, - AreaTriggerNoCorpse = 0x275e, + AreaTriggerNoCorpse = 0x275f, AreaTriggerPlayVisualEvent = 0x2640, AreaTriggerRePath = 0x263e, AreaTriggerReShape = 0x2643, ArenaCrowdControlSpells = 0x2651, - ArenaMatchEnd = 0x28a9, - ArenaMatchStart = 0x28a8, + ArenaMatchEnd = 0x28ac, + ArenaMatchStart = 0x28ab, ArenaPrepOpponentSpecializations = 0x2668, - ArtifactForgeOpened = 0x27ee, - ArtifactRespecConfirm = 0x27f1, - ArtifactTraitsRefunded = 0x27f2, - ArtifactXpGain = 0x2835, - AttackerStateUpdate = 0x27db, + ArtifactForgeOpened = 0x27ef, + ArtifactRespecConfirm = 0x27f2, + ArtifactTraitsRefunded = 0x27f3, + ArtifactXpGain = 0x2837, + AttackerStateUpdate = 0x27dc, AttackStart = 0x2670, AttackStop = 0x2671, - AttackSwingError = 0x273c, - AttackSwingLandedLog = 0x273d, - AuctionClosedNotification = 0x2731, - AuctionCommandResult = 0x272e, - AuctionHelloResponse = 0x272c, - AuctionListBidderItemsResult = 0x2735, - AuctionListItemsResult = 0x2733, - AuctionListOwnerItemsResult = 0x2734, - AuctionListPendingSalesResult = 0x2736, - AuctionOutbidNotification = 0x2730, - AuctionOwnerBidNotification = 0x2732, - AuctionReplicateResponse = 0x272d, - AuctionWonNotification = 0x272f, + AttackSwingError = 0x273d, + AttackSwingLandedLog = 0x273e, + AuctionClosedNotification = 0x2732, + AuctionCommandResult = 0x272f, + AuctionHelloResponse = 0x272d, + AuctionListBidderItemsResult = 0x2736, + AuctionListItemsResult = 0x2734, + AuctionListOwnerItemsResult = 0x2735, + AuctionListPendingSalesResult = 0x2737, + AuctionOutbidNotification = 0x2731, + AuctionOwnerBidNotification = 0x2733, + AuctionReplicateResponse = 0x272e, + AuctionWonNotification = 0x2730, AuraPointsDepleted = 0x2c23, AuraUpdate = 0x2c22, AuthChallenge = 0x3048, AuthResponse = 0x256c, AvailableHotfixes = 0x25a2, AzeriteEmpoweredItemEquippedStatusChanged = 0x2876, - AzeriteEmpoweredItemRespecOpen = 0x283f, + AzeriteEmpoweredItemRespecOpen = 0x2841, + AzeriteEssenceForgeClose = 0x2879, + AzeriteEssenceForgeOpened = 0x2878, + AzeriteEssenceSelectionResult = 0x2877, AzeriteXpGain = 0x2875, BanReason = 0x26b8, BarberShopResult = 0x26f1, @@ -821,44 +830,45 @@ namespace Framework.Constants BattlefieldStatusQueued = 0x2592, BattlefieldStatusWaitForGroups = 0x25a6, BattlegroundInfoThrottled = 0x259c, - BattlegroundInit = 0x27a9, + BattlegroundInit = 0x27aa, BattlegroundPlayerJoined = 0x2599, BattlegroundPlayerLeft = 0x259a, BattlegroundPlayerPositions = 0x2596, - BattlegroundPoints = 0x27a8, - BattlenetChallengeAbort = 0x27da, - BattlenetChallengeStart = 0x27d9, - BattlenetNotification = 0x284d, - BattlenetRealmListTicket = 0x284f, - BattlenetResponse = 0x284c, - BattlenetSetSessionState = 0x284e, + BattlegroundPoints = 0x27a9, + BattlenetChallengeAbort = 0x27db, + BattlenetChallengeStart = 0x27da, + BattlenetNotification = 0x284f, + BattlenetRealmListTicket = 0x2851, + BattlenetResponse = 0x284e, + BattlenetSetSessionState = 0x2850, BattlenetUpdateSessionKey = 0x286f, - BattlePayAckFailed = 0x27d2, - BattlePayBattlePetDelivered = 0x27c7, - BattlePayConfirmPurchase = 0x27d1, - BattlePayDeliveryEnded = 0x27c5, - BattlePayDeliveryStarted = 0x27c4, - BattlePayDistributionUpdate = 0x27c3, - BattlePayGetDistributionListResponse = 0x27c1, - BattlePayGetProductListResponse = 0x27bf, - BattlePayGetPurchaseListResponse = 0x27c0, - BattlePayMountDelivered = 0x27c6, + BattlePayAckFailed = 0x27d3, + BattlePayBattlePetDelivered = 0x27c8, + BattlePayBundlePriceUpdate = 0x2862, + BattlePayConfirmPurchase = 0x27d2, + BattlePayDeliveryEnded = 0x27c6, + BattlePayDeliveryStarted = 0x27c5, + BattlePayDistributionUpdate = 0x27c4, + BattlePayGetDistributionListResponse = 0x27c2, + BattlePayGetProductListResponse = 0x27c0, + BattlePayGetPurchaseListResponse = 0x27c1, + BattlePayMountDelivered = 0x27c7, BattlePayOpenCheckoutResult = 0x2868, - BattlePayPurchaseUpdate = 0x27d0, - BattlePayStartDistributionAssignToTargetResponse = 0x27ce, - BattlePayStartPurchaseResponse = 0x27cd, + BattlePayPurchaseUpdate = 0x27d1, + BattlePayStartDistributionAssignToTargetResponse = 0x27cf, + BattlePayStartPurchaseResponse = 0x27ce, BattlePaySubscriptionChanged = 0x2871, - BattlePayToyDelivered = 0x27c8, + BattlePayToyDelivered = 0x27c9, BattlePayVasBnetTransferValidationResult = 0x2866, - BattlePayVasBoostConsumed = 0x27c2, - BattlePayVasCharacterList = 0x2838, + BattlePayVasBoostConsumed = 0x27c3, + BattlePayVasCharacterList = 0x283a, BattlePayVasCharacterQueueStatus = 0x2864, BattlePayVasGuildFollowInfo = 0x29e7, BattlePayVasGuildMasterList = 0x29e6, - BattlePayVasPurchaseComplete = 0x283b, - BattlePayVasPurchaseList = 0x283c, - BattlePayVasPurchaseStarted = 0x283a, - BattlePayVasRealmList = 0x2839, + BattlePayVasPurchaseComplete = 0x283d, + BattlePayVasPurchaseList = 0x283e, + BattlePayVasPurchaseStarted = 0x283c, + BattlePayVasRealmList = 0x283b, BattlePayVasTransferQueueStatus = 0x2863, BattlePetsHealed = 0x260a, BattlePetCageDateError = 0x26a6, @@ -873,7 +883,7 @@ namespace Framework.Constants BattlePetRevoked = 0x2608, BattlePetTrapLevel = 0x2601, BattlePetUpdates = 0x2600, - BinderConfirm = 0x2742, + BinderConfirm = 0x2743, BindPointUpdate = 0x257c, BlackMarketBidOnItemResult = 0x2647, BlackMarketOpenResult = 0x2645, @@ -881,14 +891,14 @@ namespace Framework.Constants BlackMarketRequestItemsResult = 0x2646, BlackMarketWon = 0x2649, BonusRollEmpty = 0x2665, - BonusRollFailed = 0x2879, - BossKillCredit = 0x27cc, + BonusRollFailed = 0x287c, + BossKillCredit = 0x27cd, BreakTarget = 0x266f, BroadcastAchievement = 0x2bbc, BuyFailed = 0x26fa, BuySucceeded = 0x26f9, - CacheInfo = 0x274c, - CacheVersion = 0x274b, + CacheInfo = 0x274d, + CacheVersion = 0x274c, CalendarClearPendingAction = 0x26cc, CalendarCommandResult = 0x26cd, CalendarEventInitialInvites = 0x26bc, @@ -909,9 +919,9 @@ namespace Framework.Constants CalendarSendCalendar = 0x26ba, CalendarSendEvent = 0x26bb, CalendarSendNumPending = 0x26cb, - CameraEffect = 0x276f, - CancelAutoRepeat = 0x271b, - CancelCombat = 0x273a, + CameraEffect = 0x2770, + CancelAutoRepeat = 0x271c, + CancelCombat = 0x273b, CancelOrphanSpellVisual = 0x2c46, CancelScene = 0x2657, CancelSpellVisual = 0x2c44, @@ -929,25 +939,25 @@ namespace Framework.Constants ChallengeModeRewards = 0x2622, ChallengeModeStart = 0x261e, ChallengeModeUpdateDeathCount = 0x261f, - ChangePlayerDifficultyResult = 0x273e, + ChangePlayerDifficultyResult = 0x273f, ChannelList = 0x2bc3, ChannelNotify = 0x2bc0, ChannelNotifyJoined = 0x2bc1, ChannelNotifyLeft = 0x2bc2, - CharacterClassTrialCreate = 0x280c, + CharacterClassTrialCreate = 0x280d, CharacterInventoryOverflowWarning = 0x2870, CharacterItemFixup = 0x285f, - CharacterLoginFailed = 0x274d, - CharacterObjectTestResponse = 0x27d8, - CharacterRenameResult = 0x27b1, - CharacterUpgradeComplete = 0x280b, - CharacterUpgradeQueued = 0x280a, + CharacterLoginFailed = 0x274e, + CharacterObjectTestResponse = 0x27d9, + CharacterRenameResult = 0x27b2, + CharacterUpgradeComplete = 0x280c, + CharacterUpgradeQueued = 0x280b, CharacterUpgradeSpellTierSet = 0x25f5, - CharacterUpgradeStarted = 0x2809, - CharacterUpgradeUnrevokeResult = 0x280d, - CharCustomize = 0x2722, - CharCustomizeFailed = 0x2721, - CharFactionChangeResult = 0x27f6, + CharacterUpgradeStarted = 0x280a, + CharacterUpgradeUnrevokeResult = 0x280e, + CharCustomize = 0x2723, + CharCustomizeFailed = 0x2722, + CharFactionChangeResult = 0x27f7, Chat = 0x2bad, ChatAutoResponded = 0x2bb8, ChatDown = 0x2bbd, @@ -968,40 +978,43 @@ namespace Framework.Constants ClearLossOfControl = 0x269e, ClearSpellCharges = 0x2c28, ClearTarget = 0x26e4, + ClubFinderApplicantsList = 0x28b3, + ClubFinderApplications = 0x28b4, + ClubFinderApplicationsChanged = 0x28b5, + ClubFinderClubsData = 0x28b6, + ClubFinderClubsList = 0x28b2, CoinRemoved = 0x262d, CombatEventFailed = 0x2672, - CommentatorMapInfo = 0x274f, - CommentatorPlayerInfo = 0x2750, - CommentatorStateChanged = 0x274e, + CommentatorMapInfo = 0x2750, + CommentatorPlayerInfo = 0x2751, + CommentatorStateChanged = 0x274f, ComplaintResult = 0x26db, - CompleteShipmentResponse = 0x27ea, + CompleteShipmentResponse = 0x27eb, ConnectTo = 0x304d, - ConquestFormulaConstants = 0x27d3, + ConquestFormulaConstants = 0x27d4, ConsoleWrite = 0x2654, - ConsumptionConversionInfoResponse = 0x2853, - ConsumptionConversionResult = 0x2854, - ContactList = 0x27d6, + ContactList = 0x27d7, ContributionCollectorState = 0x2867, ControlUpdate = 0x2667, - CooldownCheat = 0x2783, + CooldownCheat = 0x2784, CooldownEvent = 0x26ec, CorpseLocation = 0x266e, - CorpseReclaimDelay = 0x2796, - CorpseTransportQuery = 0x275a, - CreateChar = 0x2747, - CreateShipmentResponse = 0x27e9, - CriteriaDeleted = 0x2726, - CriteriaUpdate = 0x2720, + CorpseReclaimDelay = 0x2797, + CorpseTransportQuery = 0x275b, + CreateChar = 0x2748, + CreateShipmentResponse = 0x27ea, + CriteriaDeleted = 0x2727, + CriteriaUpdate = 0x2721, CrossedInebriationThreshold = 0x26f5, CustomLoadScreen = 0x25e3, DailyQuestsReset = 0x2a80, - DamageCalcLog = 0x2814, + DamageCalcLog = 0x2815, DbReply = 0x25a1, - DeathReleaseLoc = 0x270f, + DeathReleaseLoc = 0x2710, DefenseMessage = 0x2bb6, - DeleteChar = 0x2748, - DestroyArenaUnit = 0x278c, - DestructibleBuildingDamage = 0x273b, + DeleteChar = 0x2749, + DestroyArenaUnit = 0x278d, + DestructibleBuildingDamage = 0x273c, DifferentInstanceFromParty = 0x258b, DisenchantCredit = 0x25bc, Dismount = 0x26e3, @@ -1021,43 +1034,43 @@ namespace Framework.Constants DuelOutOfBounds = 0x2675, DuelRequested = 0x2673, DuelWinner = 0x2679, - DurabilityDamageDeath = 0x2792, - Emote = 0x2815, + DurabilityDamageDeath = 0x2793, + Emote = 0x2816, EnableBarberShop = 0x26f0, EnableEncryption = 0x3049, - EnchantmentLog = 0x275b, - EncounterEnd = 0x27cb, - EncounterStart = 0x27ca, + EnchantmentLog = 0x275c, + EncounterEnd = 0x27cc, + EncounterStart = 0x27cb, EnumCharactersResult = 0x2583, EnvironmentalDamageLog = 0x2c21, EquipmentSetId = 0x26e5, ExpectedSpamRecords = 0x2bb1, - ExplorationExperience = 0x27ae, - FactionBonusInfo = 0x276e, + ExplorationExperience = 0x27af, + FactionBonusInfo = 0x276f, FailedPlayerCondition = 0x25e2, FeatureSystemStatus = 0x25d1, FeatureSystemStatusGlueScreen = 0x25d2, - FeignDeathResisted = 0x278f, - FishEscaped = 0x2702, - FishNotHooked = 0x2701, + FeignDeathResisted = 0x2790, + FishEscaped = 0x2703, + FishNotHooked = 0x2702, FlightSplineSync = 0x2df7, - ForcedDeathUpdate = 0x2710, - ForceAnim = 0x279d, + ForcedDeathUpdate = 0x2711, + ForceAnim = 0x279e, ForceObjectRelink = 0x266a, - FriendStatus = 0x27d7, + FriendStatus = 0x27d8, GameEventDebugInitialize = 0x2680, GameObjectActivateAnimKit = 0x25d6, GameObjectCustomAnim = 0x25d7, GameObjectDespawn = 0x25d8, - GameObjectMultiTransition = 0x2877, + GameObjectMultiTransition = 0x287a, GameObjectPlaySpellVisual = 0x2c4b, GameObjectPlaySpellVisualKit = 0x2c4a, - GameObjectResetState = 0x2765, - GameObjectSetState = 0x284b, - GameObjectUiAction = 0x2762, + GameObjectResetState = 0x2766, + GameObjectSetState = 0x284d, + GameObjectUiAction = 0x2763, GameSpeedSet = 0x26b0, - GameTimeSet = 0x2754, - GameTimeUpdate = 0x2753, + GameTimeSet = 0x2755, + GameTimeUpdate = 0x2754, GarrisonAddFollowerResult = 0x2902, GarrisonAddMissionResult = 0x2906, GarrisonAssignFollowerToBuildingResult = 0x2918, @@ -1076,7 +1089,7 @@ namespace Framework.Constants GarrisonFollowerChangedStatus = 0x2915, GarrisonFollowerChangedXp = 0x2912, GarrisonIsUpgradeableResult = 0x2929, - GarrisonLandingPageShipmentInfo = 0x27ec, + GarrisonLandingPageShipmentInfo = 0x27ed, GarrisonLearnBlueprintResult = 0x28f7, GarrisonLearnSpecializationResult = 0x28f5, GarrisonListFollowersCheatResult = 0x2905, @@ -1107,27 +1120,27 @@ namespace Framework.Constants GarrisonUnlearnBlueprintResult = 0x28f8, GarrisonUpgradeResult = 0x28fd, GenerateRandomCharacterNameResult = 0x2584, - GetAccountCharacterListResult = 0x27af, + GetAccountCharacterListResult = 0x27b0, GetDisplayedTrophyListResponse = 0x2928, GetGarrisonInfoResult = 0x28f0, - GetShipmentsOfTypeResponse = 0x27eb, - GetShipmentInfoResponse = 0x27e7, - GetTrophyListResponse = 0x2810, - GmPlayerInfo = 0x2782, + GetShipmentsOfTypeResponse = 0x27ec, + GetShipmentInfoResponse = 0x27e8, + GetTrophyListResponse = 0x2811, + GmPlayerInfo = 0x2783, GmRequestPlayerInfo = 0x25ee, GmTicketCaseStatus = 0x26d2, GmTicketSystemStatus = 0x26d1, - GodMode = 0x2741, + GodMode = 0x2742, GossipComplete = 0x2a96, GossipMessage = 0x2a97, - GossipPoi = 0x27e4, + GossipPoi = 0x27e5, GossipTextUpdate = 0x2a98, GroupActionThrottled = 0x259d, - GroupDecline = 0x27df, - GroupDestroyed = 0x27e1, + GroupDecline = 0x27e0, + GroupDestroyed = 0x27e2, GroupInviteConfirmation = 0x2860, GroupNewLeader = 0x264c, - GroupUninvite = 0x27e0, + GroupUninvite = 0x27e1, GuildAchievementDeleted = 0x29c5, GuildAchievementEarned = 0x29c4, GuildAchievementMembers = 0x29c7, @@ -1141,6 +1154,7 @@ namespace Framework.Constants GuildCommandResult = 0x29ba, GuildCriteriaDeleted = 0x29c6, GuildCriteriaUpdate = 0x29c3, + GuildEventAwayChange = 0x29f0, GuildEventBankContentsChanged = 0x29f8, GuildEventBankMoneyChanged = 0x29f7, GuildEventDisbanded = 0x29ed, @@ -1180,56 +1194,56 @@ namespace Framework.Constants GuildRoster = 0x29bb, GuildRosterUpdate = 0x29bc, GuildSendRankChange = 0x29b9, - HealthUpdate = 0x2705, - HighestThreatUpdate = 0x2716, + HealthUpdate = 0x2706, + HighestThreatUpdate = 0x2717, HotfixMessage = 0x25a3, HotfixResponse = 0x25a4, - IncomingSummonCompleted = 0x28ab, - IncomingSummonPending = 0x28aa, - InitializeFactions = 0x276d, + IncomingSummonCompleted = 0x28ae, + IncomingSummonPending = 0x28ad, + InitializeFactions = 0x276e, InitialSetup = 0x2580, - InitWorldStates = 0x2793, + InitWorldStates = 0x2794, InspectResult = 0x2650, - InstanceEncounterChangePriority = 0x27fc, - InstanceEncounterDisengageUnit = 0x27fb, - InstanceEncounterEnd = 0x2804, - InstanceEncounterEngageUnit = 0x27fa, - InstanceEncounterGainCombatResurrectionCharge = 0x2806, - InstanceEncounterInCombatResurrection = 0x2805, - InstanceEncounterObjectiveComplete = 0x27ff, - InstanceEncounterObjectiveStart = 0x27fe, - InstanceEncounterObjectiveUpdate = 0x2803, - InstanceEncounterPhaseShiftChanged = 0x2807, - InstanceEncounterSetAllowingRelease = 0x2802, - InstanceEncounterSetSuppressingRelease = 0x2801, - InstanceEncounterStart = 0x2800, - InstanceEncounterTimerStart = 0x27fd, - InstanceGroupSizeChanged = 0x273f, + InstanceEncounterChangePriority = 0x27fd, + InstanceEncounterDisengageUnit = 0x27fc, + InstanceEncounterEnd = 0x2805, + InstanceEncounterEngageUnit = 0x27fb, + InstanceEncounterGainCombatResurrectionCharge = 0x2807, + InstanceEncounterInCombatResurrection = 0x2806, + InstanceEncounterObjectiveComplete = 0x2800, + InstanceEncounterObjectiveStart = 0x27ff, + InstanceEncounterObjectiveUpdate = 0x2804, + InstanceEncounterPhaseShiftChanged = 0x2808, + InstanceEncounterSetAllowingRelease = 0x2803, + InstanceEncounterSetSuppressingRelease = 0x2802, + InstanceEncounterStart = 0x2801, + InstanceEncounterTimerStart = 0x27fe, + InstanceGroupSizeChanged = 0x2740, InstanceInfo = 0x2653, InstanceReset = 0x26b5, InstanceResetFailed = 0x26b6, - InstanceSaveCreated = 0x27c9, - InvalidatePageText = 0x270b, + InstanceSaveCreated = 0x27ca, + InvalidatePageText = 0x270c, InvalidatePlayer = 0x26da, - InvalidPromotionCode = 0x279e, - InventoryChangeFailure = 0x276b, - IslandAzeriteXpGain = 0x27ab, - IslandCompleted = 0x27ac, - IslandOpenQueueNpc = 0x2840, + InvalidPromotionCode = 0x279f, + InventoryChangeFailure = 0x276c, + IslandAzeriteXpGain = 0x27ac, + IslandCompleted = 0x27ad, + IslandOpenQueueNpc = 0x2842, IsQuestCompleteResponse = 0x2a83, - ItemChanged = 0x2729, - ItemCooldown = 0x2813, - ItemEnchantTimeUpdate = 0x27a0, + ItemChanged = 0x272a, + ItemCooldown = 0x2814, + ItemEnchantTimeUpdate = 0x27a1, ItemExpirePurchaseRefund = 0x25b2, ItemPurchaseRefundResult = 0x25b0, ItemPushResult = 0x2639, - ItemTimeUpdate = 0x279f, - KickReason = 0x2837, + ItemTimeUpdate = 0x27a0, + KickReason = 0x2839, LearnedSpells = 0x2c4d, LearnPvpTalentsFailed = 0x25ea, LearnTalentsFailed = 0x25e9, LevelUpdate = 0x2588, - LevelUpInfo = 0x2728, + LevelUpInfo = 0x2729, LfgBootPlayer = 0x2a35, LfgDisabled = 0x2a33, LfgInstanceShutdownCountdown = 0x2a25, @@ -1260,21 +1274,21 @@ namespace Framework.Constants LfGuildRecruits = 0x29cf, LightningStormEnd = 0x26d7, LightningStormStart = 0x26d6, - LiveRegionAccountRestoreResult = 0x27bd, - LiveRegionCharacterCopyResult = 0x27bb, - LiveRegionGetAccountCharacterListResult = 0x27b0, + LiveRegionAccountRestoreResult = 0x27be, + LiveRegionCharacterCopyResult = 0x27bc, + LiveRegionGetAccountCharacterListResult = 0x27b1, LoadCufProfiles = 0x25ce, - LoadEquipmentSet = 0x2756, - LoadSelectedTrophyResult = 0x2811, - LoginSetTimeSpeed = 0x2755, + LoadEquipmentSet = 0x2757, + LoadSelectedTrophyResult = 0x2812, + LoginSetTimeSpeed = 0x2756, LoginVerifyWorld = 0x25ad, LogoutCancelAck = 0x26b4, LogoutComplete = 0x26b3, LogoutResponse = 0x26b2, - LogXpGain = 0x2724, + LogXpGain = 0x2725, LootAllPassed = 0x2637, - LootLegacyRulesInEffect = 0x2878, - LootList = 0x278b, + LootLegacyRulesInEffect = 0x287b, + LootList = 0x278c, LootMoneyNotify = 0x2632, LootRelease = 0x2631, LootReleaseAll = 0x2630, @@ -1285,23 +1299,24 @@ namespace Framework.Constants LootRollWon = 0x2638, LossOfControlAuraUpdate = 0x269b, MailCommandResult = 0x265b, - MailListResult = 0x27a1, - MailQueryNextTimeResult = 0x27a2, - MapObjectivesInit = 0x27aa, + MailListResult = 0x27a2, + MailQueryNextTimeResult = 0x27a3, + MapObjectivesInit = 0x27ab, MapObjectiveAdd = 0x2597, MapObjectiveRemove = 0x2598, MapObjEvents = 0x25d9, MasterLootCandidateList = 0x2635, MessageBox = 0x2575, - MinimapPing = 0x2700, + MinimapPing = 0x2701, MirrorImageComponentedData = 0x2c14, MirrorImageCreatureData = 0x2c13, MissileCancel = 0x25da, - ModifyChargeRecoverySpeed = 0x27b4, - ModifyCooldown = 0x27b2, - ModifyCooldownRecoverySpeed = 0x27b3, - ModifyPartyRange = 0x278e, + ModifyChargeRecoverySpeed = 0x27b5, + ModifyCooldown = 0x27b3, + ModifyCooldownRecoverySpeed = 0x27b4, + ModifyPartyRange = 0x278f, Motd = 0x2baf, + MountEquipmentApplyResult = 0x28b7, MountResult = 0x257a, MoveApplyMovementForce = 0x2de1, MoveDisableCollision = 0x2ddd, @@ -1326,7 +1341,7 @@ namespace Framework.Constants MoveSetHovering = 0x2dcf, MoveSetIgnoreMovementForces = 0x2dd7, MoveSetLandWalk = 0x2dcc, - MoveSetMovementForceSpeed = 0x2db4, + MoveSetModMovementForceMagnitude = 0x2db4, MoveSetNormalFall = 0x2dce, MoveSetPitchRate = 0x2dc6, MoveSetRunBackSpeed = 0x2dbf, @@ -1377,7 +1392,7 @@ namespace Framework.Constants MoveUpdateFlightBackSpeed = 0x2daa, MoveUpdateFlightSpeed = 0x2da9, MoveUpdateKnockBack = 0x2db0, - MoveUpdateMovementForceSpeed = 0x2db1, + MoveUpdateModMovementForceMagnitude = 0x2db1, MoveUpdatePitchRate = 0x2dac, MoveUpdateRemoveMovementForce = 0x2db3, MoveUpdateRunBackSpeed = 0x2da5, @@ -1395,30 +1410,30 @@ namespace Framework.Constants NotifyMoney = 0x25af, NotifyReceivedMail = 0x265c, OfferPetitionError = 0x26e9, - OnCancelExpectedRideVehicleAura = 0x2725, + OnCancelExpectedRideVehicleAura = 0x2726, OnMonsterMove = 0x2da2, - OpenAlliedRaceDetailsGiver = 0x2841, - OpenContainer = 0x276c, + OpenAlliedRaceDetailsGiver = 0x2843, + OpenContainer = 0x276d, OpenLfgDungeonFinder = 0x2a31, - OpenShipmentNpcFromGossip = 0x27e6, - OpenShipmentNpcResult = 0x27e8, - OpenTransmogrifier = 0x283e, + OpenShipmentNpcFromGossip = 0x27e7, + OpenShipmentNpcResult = 0x27e9, + OpenTransmogrifier = 0x2840, OverrideLight = 0x26ef, - PageText = 0x2761, - PartyCommandResult = 0x27e3, + PageText = 0x2762, + PartyCommandResult = 0x27e4, PartyInvite = 0x25cf, - PartyKillLog = 0x27a6, - PartyMemberState = 0x27a4, - PartyMemberStateUpdate = 0x27a3, + PartyKillLog = 0x27a7, + PartyMemberState = 0x27a5, + PartyMemberStateUpdate = 0x27a4, PartyUpdate = 0x260c, - PauseMirrorTimer = 0x2758, - PendingRaidLock = 0x2739, + PauseMirrorTimer = 0x2759, + PendingRaidLock = 0x273a, PetitionAlreadySigned = 0x25b8, PetitionRenameGuildResponse = 0x29fa, PetitionShowList = 0x26f2, PetitionShowSignatures = 0x26f3, - PetitionSignResults = 0x2798, - PetActionFeedback = 0x2795, + PetitionSignResults = 0x2799, + PetActionFeedback = 0x2796, PetActionSound = 0x26cf, PetAdded = 0x25a9, PetBattleChatRestricted = 0x2619, @@ -1440,7 +1455,7 @@ namespace Framework.Constants PetClearSpells = 0x2c24, PetDismissSound = 0x26d0, PetGodMode = 0x26aa, - PetGuids = 0x274a, + PetGuids = 0x274b, PetLearnedSpells = 0x2c4f, PetMode = 0x258a, PetNameInvalid = 0x26f7, @@ -1451,47 +1466,48 @@ namespace Framework.Constants PetTameFailure = 0x26e6, PetUnlearnedSpells = 0x2c50, PhaseShiftChange = 0x2577, - PlayedTime = 0x2712, + PlayedTime = 0x2713, PlayerBound = 0x257d, PlayerSaveGuildEmblem = 0x29f9, - PlayerSkinned = 0x2790, - PlayerTabardVendorActivate = 0x27a5, - PlayMusic = 0x27b7, - PlayObjectSound = 0x27b8, - PlayOneShotAnimKit = 0x277a, + PlayerSkinned = 0x2791, + PlayerTabardVendorActivate = 0x27a6, + PlayMusic = 0x27b8, + PlayObjectSound = 0x27b9, + PlayOneShotAnimKit = 0x277b, PlayOrphanSpellVisual = 0x2c47, PlayScene = 0x2656, - PlaySound = 0x27b6, - PlaySpeakerbotSound = 0x27b9, + PlaySound = 0x27b7, + PlaySpeakerbotSound = 0x27ba, PlaySpellVisual = 0x2c45, PlaySpellVisualKit = 0x2c49, - PlayTimeWarning = 0x2743, + PlayTimeWarning = 0x2744, Pong = 0x304e, - PowerUpdate = 0x2706, - PreRessurect = 0x27b5, + PowerUpdate = 0x2707, + PreRessurect = 0x27b6, PrintNotification = 0x25e1, - ProcResist = 0x27a7, - ProposeLevelGrant = 0x271a, + ProcResist = 0x27a8, + ProposeLevelGrant = 0x271b, PushSpellToActionBar = 0x2c51, - PvpCredit = 0x271f, + PvpCredit = 0x2720, PvpLogData = 0x25b3, + PvpMatchStart = 0x28b1, PvpOptionsEnabled = 0x25b6, PvpSeason = 0x25d3, - QueryBattlePetNameResponse = 0x270d, - QueryCommunityNameResponse = 0x2709, - QueryCreatureResponse = 0x2703, - QueryGameObjectResponse = 0x2704, + QueryBattlePetNameResponse = 0x270e, + QueryCommunityNameResponse = 0x270a, + QueryCreatureResponse = 0x2704, + QueryGameObjectResponse = 0x2705, QueryGarrisonCreatureNameResponse = 0x292b, QueryGuildInfoResponse = 0x29e5, - QueryItemTextResponse = 0x2812, - QueryNpcTextResponse = 0x2707, - QueryPageTextResponse = 0x270a, - QueryPetitionResponse = 0x270e, - QueryPetNameResponse = 0x270c, - QueryPlayerNameResponse = 0x2708, + QueryItemTextResponse = 0x2813, + QueryNpcTextResponse = 0x2708, + QueryPageTextResponse = 0x270b, + QueryPetitionResponse = 0x270f, + QueryPetNameResponse = 0x270d, + QueryPlayerNameResponse = 0x2709, QueryQuestInfoResponse = 0x2a95, - QueryTimeResponse = 0x2723, - QueryTreasurePickerResponse = 0x2850, + QueryTimeResponse = 0x2724, + QueryTreasurePickerResponse = 0x2852, QuestCompletionNpcResponse = 0x2a81, QuestConfirmAccept = 0x2a8e, QuestForceRemoved = 0x2a9b, @@ -1517,9 +1533,9 @@ namespace Framework.Constants QuestUpdateCompleteBySpell = 0x2a87, QuestUpdateFailed = 0x2a89, QuestUpdateFailedTimer = 0x2a8a, - RafEmailEnabledResponse = 0x27d4, - RaidDifficultySet = 0x27f7, - RaidGroupOnly = 0x27f9, + RafEmailEnabledResponse = 0x27d5, + RaidDifficultySet = 0x27f8, + RaidGroupOnly = 0x27fa, RaidInstanceMessage = 0x2bb4, RaidMarkersChanged = 0x25b9, RandomRoll = 0x264f, @@ -1527,18 +1543,18 @@ namespace Framework.Constants ReadyCheckCompleted = 0x260f, ReadyCheckResponse = 0x260e, ReadyCheckStarted = 0x260d, - ReadItemResultFailed = 0x27f3, - ReadItemResultOk = 0x27ed, - RealmLookupInformation = 0x2818, + ReadItemResultFailed = 0x27f4, + ReadItemResultOk = 0x27ee, + RealmLookupInformation = 0x2819, RealmQueryResponse = 0x26ee, - RecruitAFriendResponse = 0x27d5, - ReferAFriendExpired = 0x276a, + RecruitAFriendResponse = 0x27d6, + ReferAFriendExpired = 0x276b, ReferAFriendFailure = 0x26f4, RefreshComponent = 0x267c, RefreshSpellHistory = 0x2c2c, RemoveItemPassive = 0x25c0, RemoveLossOfControl = 0x269d, - ReplaceTrophyResponse = 0x280f, + ReplaceTrophyResponse = 0x2810, ReportPvpPlayerAfkResult = 0x26e2, RequestAddonList = 0x2662, RequestCemeteryListResponse = 0x259e, @@ -1547,7 +1563,7 @@ namespace Framework.Constants ResearchComplete = 0x2586, ResetCompressionContext = 0x304f, ResetFailedNotify = 0x26ea, - ResetRangedCombatTimer = 0x271c, + ResetRangedCombatTimer = 0x271d, ResetWeeklyCurrency = 0x2574, RespecWipeConfirm = 0x2629, RespondInspectAchievements = 0x2571, @@ -1556,17 +1572,17 @@ namespace Framework.Constants ResumeToken = 0x25be, ResurrectClearData = 0x257f, ResurrectRequest = 0x257e, - ResyncRunes = 0x2746, + ResyncRunes = 0x2747, RoleChangedInform = 0x258d, RoleChosen = 0x2a39, RolePollInform = 0x258e, RuneRegenDebug = 0x25c8, - ScenarioBoot = 0x27f4, - ScenarioCompleted = 0x2834, + ScenarioBoot = 0x27f5, + ScenarioCompleted = 0x2836, ScenarioPois = 0x2652, ScenarioProgressUpdate = 0x264b, - ScenarioSetShouldShowCriteria = 0x2844, - ScenarioSpellUpdate = 0x2843, + ScenarioSetShouldShowCriteria = 0x2846, + ScenarioSpellUpdate = 0x2845, ScenarioState = 0x264a, SceneObjectEvent = 0x25f8, SceneObjectPetBattleFinalRound = 0x25fd, @@ -1588,45 +1604,45 @@ namespace Framework.Constants ServerTime = 0x26b1, SetupCurrency = 0x2572, SetupResearchHistory = 0x2585, - SetAiAnimKit = 0x2779, - SetAllTaskProgress = 0x27dd, - SetAnimTier = 0x277d, + SetAiAnimKit = 0x277a, + SetAllTaskProgress = 0x27de, + SetAnimTier = 0x277e, SetCurrency = 0x2573, SetDfFastLaunchResult = 0x2a2e, SetDungeonDifficulty = 0x26d3, - SetFactionAtWar = 0x2745, - SetFactionNotVisible = 0x2774, - SetFactionStanding = 0x2775, - SetFactionVisible = 0x2773, + SetFactionAtWar = 0x2746, + SetFactionNotVisible = 0x2775, + SetFactionStanding = 0x2776, + SetFactionVisible = 0x2774, SetFlatSpellModifier = 0x2c36, - SetForcedReactions = 0x2764, + SetForcedReactions = 0x2765, SetItemPurchaseData = 0x25b1, - SetLootMethodFailed = 0x281e, + SetLootMethodFailed = 0x281f, SetMaxWeeklyQuantity = 0x25b7, - SetMeleeAnimKit = 0x277c, - SetMovementAnimKit = 0x277b, + SetMeleeAnimKit = 0x277d, + SetMovementAnimKit = 0x277c, SetPctSpellModifier = 0x2c37, SetPetSpecialization = 0x2644, - SetPlayerDeclinedNamesResult = 0x2711, + SetPlayerDeclinedNamesResult = 0x2712, SetPlayHoverAnim = 0x25cc, - SetProficiency = 0x277e, + SetProficiency = 0x277f, SetSpellCharges = 0x2c29, - SetTaskComplete = 0x27de, + SetTaskComplete = 0x27df, SetTimeZoneInformation = 0x26a5, - SetVehicleRecId = 0x2738, - ShowAdventureMap = 0x283d, + SetVehicleRecId = 0x2739, + ShowAdventureMap = 0x283f, ShowBank = 0x26ae, - ShowMailbox = 0x27f5, + ShowMailbox = 0x27f6, ShowNeutralPlayerFactionSelectUi = 0x25f1, - ShowTaxiNodes = 0x26ff, - ShowTradeSkillResponse = 0x27be, - SocketGems = 0x2770, - SocketGemsFailure = 0x2771, - SortBagsResult = 0x282c, + ShowTaxiNodes = 0x2700, + ShowTradeSkillResponse = 0x27bf, + SocketGems = 0x2771, + SocketGemsFailure = 0x2772, + SortBagsResult = 0x282d, SorStartExperienceIncomplete = 0x25f3, SpecializationChanged = 0x25ed, SpecialMountAnim = 0x26ce, - SpecInvoluntarilyChanged = 0x2760, + SpecInvoluntarilyChanged = 0x2761, SpellAbsorbLog = 0x2c1f, SpellCategoryCooldown = 0x2c17, SpellChannelStart = 0x2c34, @@ -1651,73 +1667,74 @@ namespace Framework.Constants SpellPeriodicAuraLog = 0x2c1b, SpellPrepare = 0x2c38, SpellStart = 0x2c3a, - SpiritHealerConfirm = 0x275d, - StandStateUpdate = 0x2763, + SpiritHealerConfirm = 0x275e, + StandStateUpdate = 0x2764, StartElapsedTimer = 0x261b, StartElapsedTimers = 0x261d, StartLootRoll = 0x2633, - StartMirrorTimer = 0x2757, + StartMirrorTimer = 0x2758, StartTimer = 0x25bb, StopElapsedTimer = 0x261c, - StopMirrorTimer = 0x2759, - StopSpeakerbotSound = 0x27ba, + StopMirrorTimer = 0x275a, + StopSpeakerbotSound = 0x27bb, StreamingMovies = 0x25ba, SummonCancel = 0x26e1, SummonRaidMemberValidateFailed = 0x258f, - SummonRequest = 0x2768, + SummonRequest = 0x2769, SupercededSpells = 0x2c4c, SuspendComms = 0x304a, SuspendToken = 0x25bd, - TalentsInvoluntarilyReset = 0x275f, + TalentsInvoluntarilyReset = 0x2760, TaxiNodeStatus = 0x26ab, TextEmote = 0x26a9, - ThreatClear = 0x2719, - ThreatRemove = 0x2718, - ThreatUpdate = 0x2717, + ThreatClear = 0x271a, + ThreatRemove = 0x2719, + ThreatUpdate = 0x2718, TimeAdjustment = 0x2da1, TimeSyncRequest = 0x2da0, - TitleEarned = 0x2714, - TitleLost = 0x2715, + TitleEarned = 0x2715, + TitleLost = 0x2716, TotemCreated = 0x26fb, - TotemMoved = 0x26fc, + TotemDurationChanged = 0x26fc, + TotemMoved = 0x26fd, TradeStatus = 0x2582, TradeUpdated = 0x2581, - TrainerBuyFailed = 0x271e, - TrainerList = 0x271d, - TransferAborted = 0x2749, + TrainerBuyFailed = 0x271f, + TrainerList = 0x271e, + TransferAborted = 0x274a, TransferPending = 0x25e5, TransmogCollectionUpdate = 0x25c6, TransmogSetCollectionUpdate = 0x25c7, - TriggerCinematic = 0x2816, - TriggerMovie = 0x26fd, - TurnInPetitionResult = 0x279a, - TutorialFlags = 0x2808, - TutorialHighlightSpell = 0x284a, - TutorialUnhighlightSpell = 0x2849, + TriggerCinematic = 0x2817, + TriggerMovie = 0x26fe, + TurnInPetitionResult = 0x279b, + TutorialFlags = 0x2809, + TutorialHighlightSpell = 0x284c, + TutorialUnhighlightSpell = 0x284b, TwitterStatus = 0x2ffd, - UiTime = 0x275c, - UndeleteCharacterResponse = 0x2819, - UndeleteCooldownStatusResponse = 0x281a, + UiTime = 0x275d, + UndeleteCharacterResponse = 0x281a, + UndeleteCooldownStatusResponse = 0x281b, UnlearnedSpells = 0x2c4e, - UpdateAccountData = 0x2751, + UpdateAccountData = 0x2752, UpdateActionButtons = 0x25f6, UpdateCelestialBody = 0x286b, - UpdateCharacterFlags = 0x280e, + UpdateCharacterFlags = 0x280f, UpdateExpansionLevel = 0x2666, UpdateGameTimeState = 0x2872, UpdateInstanceOwnership = 0x26d8, UpdateLastInstance = 0x26b7, - UpdateObject = 0x2817, + UpdateObject = 0x2818, UpdateTalentData = 0x25ec, - UpdateTaskProgress = 0x27dc, + UpdateTaskProgress = 0x27dd, UpdateWeeklySpellUsage = 0x2c19, - UpdateWorldState = 0x2794, + UpdateWorldState = 0x2795, UserlistAdd = 0x2bb9, UserlistRemove = 0x2bba, UserlistUpdate = 0x2bbb, - UseEquipmentSetResult = 0x279b, + UseEquipmentSetResult = 0x279c, VendorInventory = 0x25ca, - VignetteUpdate = 0x27bc, + VignetteUpdate = 0x27bd, VoidItemSwapResponse = 0x25df, VoidStorageContents = 0x25dc, VoidStorageFailed = 0x25db, @@ -1726,31 +1743,31 @@ namespace Framework.Constants WaitQueueFinish = 0x256e, WaitQueueUpdate = 0x256d, WardenData = 0x2576, - WarfrontCompleted = 0x27ad, + WarfrontCompleted = 0x27ae, WargameRequestSuccessfullySentToOpponent = 0x25b4, Weather = 0x26d5, WeeklySpellUsage = 0x2c18, Who = 0x2bae, WhoIs = 0x26d4, - WorldQuestUpdate = 0x2851, + WorldQuestUpdate = 0x2853, WorldServerInfo = 0x25c2, - WorldText = 0x2836, - WowTokenAuctionSold = 0x2824, - WowTokenBuyRequestConfirmation = 0x2826, - WowTokenBuyResultConfirmation = 0x2827, + WorldText = 0x2838, + WowTokenAuctionSold = 0x2825, + WowTokenBuyRequestConfirmation = 0x2827, + WowTokenBuyResultConfirmation = 0x2828, WowTokenCanRedeemForBalanceResult = 0x2861, - WowTokenCanVeteranBuyResult = 0x2825, - WowTokenDistributionGlueUpdate = 0x281f, - WowTokenDistributionUpdate = 0x2820, - WowTokenMarketPriceResponse = 0x2821, - WowTokenRedeemGameTimeUpdated = 0x2828, - WowTokenRedeemRequestConfirmation = 0x2829, - WowTokenRedeemResult = 0x282a, - WowTokenSellRequestConfirmation = 0x2822, - WowTokenSellResultConfirmation = 0x2823, - WowTokenUpdateAuctionableListResponse = 0x282b, + WowTokenCanVeteranBuyResult = 0x2826, + WowTokenDistributionGlueUpdate = 0x2820, + WowTokenDistributionUpdate = 0x2821, + WowTokenMarketPriceResponse = 0x2822, + WowTokenRedeemGameTimeUpdated = 0x2829, + WowTokenRedeemRequestConfirmation = 0x282a, + WowTokenRedeemResult = 0x282b, + WowTokenSellRequestConfirmation = 0x2823, + WowTokenSellResultConfirmation = 0x2824, + WowTokenUpdateAuctionableListResponse = 0x282c, XpGainAborted = 0x25e0, - XpGainEnabled = 0x27f8, + XpGainEnabled = 0x27f9, ZoneUnderAttack = 0x2bb5, // Opcodes that are not generated automatically diff --git a/Source/Framework/Constants/ObjectConst.cs b/Source/Framework/Constants/ObjectConst.cs index a4640c138..dad353014 100644 --- a/Source/Framework/Constants/ObjectConst.cs +++ b/Source/Framework/Constants/ObjectConst.cs @@ -32,7 +32,8 @@ namespace Framework.Constants Corpse = 10, AreaTrigger = 11, SceneObject = 12, - Conversation = 13 + Conversation = 13, + Max = 14 } public enum TypeMask diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 1a53a0cb1..ed974b1bc 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -30,14 +30,11 @@ namespace Framework.Constants public const int MaxMasterySpells = 2; public const int ReqPrimaryTreeTalents = 31; - public const int ExploredZonesSize = 320; + public const int ExploredZonesSize = 192; public const ulong MaxMoneyAmount = 99999999999UL; public const int MaxActionButtons = 132; public const int MaxActionButtonActionValue = 0x00FFFFFF + 1; - public const uint KnowTitlesSize = 6; - public const uint MaxTitleIndex = KnowTitlesSize * 64; - public const int MaxDailyQuests = 25; public const int QuestsCompletedBitsSize = 1750; @@ -45,7 +42,7 @@ namespace Framework.Constants public const uint infinityCooldownDelayCheck = Time.Month / 2; public const int MaxPlayerSummonDelay = 2 * Time.Minute; - public const int TaxiMaskSize = 286; + public const int TaxiMaskSize = 311; // corpse reclaim times public const int DeathExpireStep = (5 * Time.Minute); @@ -76,45 +73,6 @@ namespace Framework.Constants public const int Gold = Silver * 100; } - public struct PlayerFieldOffsets - { - public const byte BytesOffsetSkinId = 0; - public const byte BytesOffsetFaceId = 1; - public const byte BytesOffsetHairStyleId = 2; - public const byte BytesOffsetHairColorId = 3; - - public const byte Bytes2OffsetCustomDisplayOption = 0; // 3 Bytes - public const byte Bytes2OffsetFacialStyle = 3; - - public const byte Bytes3OffsetPartyType = 0; - public const byte Bytes3OffsetBankBagSlots = 1; - public const byte Bytes3OffsetGender = 2; - public const byte Bytes3OffsetInebriation = 3; - - public const byte Bytes4OffsetPvpTitle = 0; - public const byte Bytes4OffsetArenaFaction = 1; - - public const byte FieldBytesOffsetRafGrantableLevel = 0; - public const byte FieldBytesOffsetActionBarToggles = 1; - public const byte FieldBytesOffsetLifetimeMaxPvpRank = 2; - public const byte FieldBytesOffsetNumRespecs = 3; - - 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; - - public const byte FieldKillsOffsetTodayKills = 0; - public const byte FieldKillsOffsetYesterdayKills = 1; - - public const byte RestStateXp = 0; - public const byte RestRestedXp = 1; - public const byte RestStateHonor = 2; - public const byte RestRestedHonor = 3; - } - public enum TradeSlots { Invalid = -1, @@ -737,7 +695,8 @@ namespace Framework.Constants None = 0x00, BonusLevel90 = 0x01, BonusLevel100 = 0x02, - BonusLevel110 = 0x04 + BonusLevel110 = 0x04, + BonusLevel120 = 0x08 } public enum HeirloomItemFlags diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 787f0ec5f..dd4cb4a77 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -31,7 +31,7 @@ namespace Framework.Constants public const int MaxMailItems = 12; public const int MaxDeclinedNameCases = 5; public const int MaxHolidayDurations = 10; - public const int MaxHolidayDates = 16; + public const int MaxHolidayDates = 26; public const int MaxHolidayFlags = 10; public const int DefaultMaxLevel = 120; public const int MaxLevel = 120; @@ -756,11 +756,12 @@ namespace Framework.Constants MythicIsland = 40, PvpIsland = 45, NormalWarfront = 147, + HeroicWarfront = 149, Max } - public enum DifficultyFlags : byte + public enum DifficultyFlags : ushort { Heroic = 0x01, Default = 0x02, @@ -939,10 +940,10 @@ namespace Framework.Constants { Talk = 0, // Source/Target = Creature, Target = Any, Datalong = Talk Type (0=Say, 1=Whisper, 2=Yell, 3=Emote Text, 4=Boss Emote Text), Datalong2 & 1 = Player Talk (Instead Of Creature), Dataint = StringId Emote = 1, // Source/Target = Creature, Datalong = Emote Id, Datalong2 = 0: Set Emote State; > 0: Play Emote State - FieldSet = 2, // Source/Target = Creature, Datalong = Field Id, Datalog2 = Value + FieldSetDeprecated = 2, MoveTo = 3, // Source/Target = Creature, Datalong2 = Time To Reach, X/Y/Z = Destination - FlagSet = 4, // Source/Target = Creature, Datalong = Field Id, Datalog2 = Bitmask - FlagRemove = 5, // Source/Target = Creature, Datalong = Field Id, Datalog2 = Bitmask + FlagSetDeprecated = 4, + FlagRemoveDeprecated = 5, TeleportTo = 6, // Source/Target = Creature/Player (See Datalong2), Datalong = MapId, Datalong2 = 0: Player; 1: Creature, X/Y/Z = Destination, O = Orientation QuestExplored = 7, // Target/Source = Player, Target/Source = Go/Creature, Datalong = Quest Id, Datalong2 = Distance Or 0 KillCredit = 8, // Target/Source = Player, Datalong = Creature Entry, Datalong2 = 0: Personal Credit, 1: Group Credit @@ -1412,979 +1413,1000 @@ namespace Framework.Constants ItemLocked = 34, TwoHandedEquipped = 35, VendorNotInterested = 36, - VendorHatesYou = 37, - VendorSoldOut = 38, - VendorTooFar = 39, - VendorDoesntBuy = 40, - NotEnoughMoney = 41, - ReceiveItemS = 42, - DropBoundItem = 43, - TradeBoundItem = 44, - TradeQuestItem = 45, - TradeTempEnchantBound = 46, - TradeGroundItem = 47, - TradeBag = 48, - SpellFailedS = 49, - ItemCooldown = 50, - PotionCooldown = 51, - FoodCooldown = 52, - SpellCooldown = 53, - AbilityCooldown = 54, - SpellAlreadyKnownS = 55, - PetSpellAlreadyKnownS = 56, - ProficiencyGainedS = 57, - SkillGainedS = 58, - SkillUpSi = 59, - LearnSpellS = 60, - LearnAbilityS = 61, - LearnPassiveS = 62, - LearnRecipeS = 63, - LearnCompanionS = 64, - LearnMountS = 65, - LearnToyS = 66, - LearnHeirloomS = 67, - LearnTransmogS = 68, - CompletedTransmogSetS = 69, - RevokeTransmogS = 70, - InvitePlayerS = 71, - InviteSelf = 72, - InvitedToGroupSs = 73, - InvitedAlreadyInGroupSs = 74, - AlreadyInGroupS = 75, - CrossRealmRaidInvite = 76, - PlayerBusyS = 77, - NewLeaderS = 78, - NewLeaderYou = 79, - NewGuideS = 80, - NewGuideYou = 81, - LeftGroupS = 82, - LeftGroupYou = 83, - GroupDisbanded = 84, - DeclineGroupS = 85, - JoinedGroupS = 86, - UninviteYou = 87, - BadPlayerNameS = 88, - NotInGroup = 89, - TargetNotInGroupS = 90, - TargetNotInInstanceS = 91, - NotInInstanceGroup = 92, - GroupFull = 93, - NotLeader = 94, - PlayerDiedS = 95, - GuildCreateS = 96, - GuildInviteS = 97, - InvitedToGuildSss = 98, - AlreadyInGuildS = 99, - AlreadyInvitedToGuildS = 100, - InvitedToGuild = 101, - AlreadyInGuild = 102, - GuildAccept = 103, - GuildDeclineS = 104, - GuildDeclineAutoS = 105, - GuildPermissions = 106, - GuildJoinS = 107, - GuildFounderS = 108, - GuildPromoteSss = 109, - GuildDemoteSs = 110, - GuildDemoteSss = 111, - GuildInviteSelf = 112, - GuildQuitS = 113, - GuildLeaveS = 114, - GuildRemoveSs = 115, - GuildRemoveSelf = 116, - GuildDisbandS = 117, - GuildDisbandSelf = 118, - GuildLeaderS = 119, - GuildLeaderSelf = 120, - GuildPlayerNotFoundS = 121, - GuildPlayerNotInGuildS = 122, - GuildPlayerNotInGuild = 123, - GuildCantPromoteS = 124, - GuildCantDemoteS = 125, - GuildNotInAGuild = 126, - GuildInternal = 127, - GuildLeaderIsS = 128, - GuildLeaderChangedSs = 129, - GuildDisbanded = 130, - GuildNotAllied = 131, - GuildLeaderLeave = 132, - GuildRanksLocked = 133, - GuildRankInUse = 134, - GuildRankTooHighS = 135, - GuildRankTooLowS = 136, - GuildNameExistsS = 137, - GuildWithdrawLimit = 138, - GuildNotEnoughMoney = 139, - GuildTooMuchMoney = 140, - GuildBankConjuredItem = 141, - GuildBankEquippedItem = 142, - GuildBankBoundItem = 143, - GuildBankQuestItem = 144, - GuildBankWrappedItem = 145, - GuildBankFull = 146, - GuildBankWrongTab = 147, - NoGuildCharter = 148, - OutOfRange = 149, - PlayerDead = 150, - ClientLockedOut = 151, - ClientOnTransport = 152, - KilledByS = 153, - LootLocked = 154, - LootTooFar = 155, - LootDidntKill = 156, - LootBadFacing = 157, - LootNotstanding = 158, - LootStunned = 159, - LootNoUi = 160, - LootWhileInvulnerable = 161, - NoLoot = 162, - QuestAcceptedS = 163, - QuestCompleteS = 164, - QuestFailedS = 165, - QuestFailedBagFullS = 166, - QuestFailedMaxCountS = 167, - QuestFailedLowLevel = 168, - QuestFailedMissingItems = 169, - QuestFailedWrongRace = 170, - QuestFailedNotEnoughMoney = 171, - QuestFailedExpansion = 172, - QuestOnlyOneTimed = 173, - QuestNeedPrereqs = 174, - QuestNeedPrereqsCustom = 175, - QuestAlreadyOn = 176, - QuestAlreadyDone = 177, - QuestAlreadyDoneDaily = 178, - QuestHasInProgress = 179, - QuestRewardExpI = 180, - QuestRewardMoneyS = 181, - QuestMustChoose = 182, - QuestLogFull = 183, - CombatDamageSsi = 184, - InspectS = 185, - CantUseItem = 186, - CantUseItemInArena = 187, - CantUseItemInRatedBattleground = 188, - MustEquipItem = 189, - PassiveAbility = 190, - Hand2skillnotfound = 191, - NoAttackTarget = 192, - InvalidAttackTarget = 193, - AttackPvpTargetWhileUnflagged = 194, - AttackStunned = 195, - AttackPacified = 196, - AttackMounted = 197, - AttackFleeing = 198, - AttackConfused = 199, - AttackCharmed = 200, - AttackDead = 201, - AttackPreventedByMechanicS = 202, - AttackChannel = 203, - Taxisamenode = 204, - Taxinosuchpath = 205, - Taxiunspecifiedservererror = 206, - Taxinotenoughmoney = 207, - Taxitoofaraway = 208, - Taxinovendornearby = 209, - Taxinotvisited = 210, - Taxiplayerbusy = 211, - Taxiplayeralreadymounted = 212, - Taxiplayershapeshifted = 213, - Taxiplayermoving = 214, - Taxinopaths = 215, - Taxinoteligible = 216, - Taxinotstanding = 217, - NoReplyTarget = 218, - GenericNoTarget = 219, - InitiateTradeS = 220, - TradeRequestS = 221, - TradeBlockedS = 222, - TradeTargetDead = 223, - TradeTooFar = 224, - TradeCancelled = 225, - TradeComplete = 226, - TradeBagFull = 227, - TradeTargetBagFull = 228, - TradeMaxCountExceeded = 229, - TradeTargetMaxCountExceeded = 230, - AlreadyTrading = 231, - MountInvalidmountee = 232, - MountToofaraway = 233, - MountAlreadymounted = 234, - MountNotmountable = 235, - MountNotyourpet = 236, - MountOther = 237, - MountLooting = 238, - MountRacecantmount = 239, - MountShapeshifted = 240, - MountNoFavorites = 241, - DismountNopet = 242, - DismountNotmounted = 243, - DismountNotyourpet = 244, - SpellFailedTotems = 245, - SpellFailedReagents = 246, - SpellFailedReagentsGeneric = 247, - CantTradeGold = 248, - SpellFailedEquippedItem = 249, - SpellFailedEquippedItemClassS = 250, - SpellFailedShapeshiftFormS = 251, - SpellFailedAnotherInProgress = 252, - Badattackfacing = 253, - Badattackpos = 254, - ChestInUse = 255, - UseCantOpen = 256, - UseLocked = 257, - DoorLocked = 258, - ButtonLocked = 259, - UseLockedWithItemS = 260, - UseLockedWithSpellS = 261, - UseLockedWithSpellKnownSi = 262, - UseTooFar = 263, - UseBadAngle = 264, - UseObjectMoving = 265, - UseSpellFocus = 266, - UseDestroyed = 267, - SetLootFreeforall = 268, - SetLootRoundrobin = 269, - SetLootMaster = 270, - SetLootGroup = 271, - SetLootThresholdS = 272, - NewLootMasterS = 273, - SpecifyMasterLooter = 274, - LootSpecChangedS = 275, - TameFailed = 276, - ChatWhileDead = 277, - ChatPlayerNotFoundS = 278, - Newtaxipath = 279, - NoPet = 280, - Notyourpet = 281, - PetNotRenameable = 282, - QuestObjectiveCompleteS = 283, - QuestUnknownComplete = 284, - QuestAddKillSii = 285, - QuestAddFoundSii = 286, - QuestAddItemSii = 287, - QuestAddPlayerKillSii = 288, - Cannotcreatedirectory = 289, - Cannotcreatefile = 290, - PlayerWrongFaction = 291, - PlayerIsNeutral = 292, - BankslotFailedTooMany = 293, - BankslotInsufficientFunds = 294, - BankslotNotbanker = 295, - FriendDbError = 296, - FriendListFull = 297, - FriendAddedS = 298, - BattletagFriendAddedS = 299, - FriendOnlineSs = 300, - FriendOfflineS = 301, - FriendNotFound = 302, - FriendWrongFaction = 303, - FriendRemovedS = 304, - BattletagFriendRemovedS = 305, - FriendError = 306, - FriendAlreadyS = 307, - FriendSelf = 308, - FriendDeleted = 309, - IgnoreFull = 310, - IgnoreSelf = 311, - IgnoreNotFound = 312, - IgnoreAlreadyS = 313, - IgnoreAddedS = 314, - IgnoreRemovedS = 315, - IgnoreAmbiguous = 316, - IgnoreDeleted = 317, - OnlyOneBolt = 318, - OnlyOneAmmo = 319, - SpellFailedEquippedSpecificItem = 320, - WrongBagTypeSubclass = 321, - CantWrapStackable = 322, - CantWrapEquipped = 323, - CantWrapWrapped = 324, - CantWrapBound = 325, - CantWrapUnique = 326, - CantWrapBags = 327, - OutOfMana = 328, - OutOfRage = 329, - OutOfFocus = 330, - OutOfEnergy = 331, - OutOfChi = 332, - OutOfHealth = 333, - OutOfRunes = 334, - OutOfRunicPower = 335, - OutOfSoulShards = 336, - OutOfLunarPower = 337, - OutOfHolyPower = 338, - OutOfMaelstrom = 339, - OutOfComboPoints = 340, - OutOfInsanity = 341, - OutOfArcaneCharges = 342, - OutOfFury = 343, - OutOfPain = 344, - OutOfPowerDisplay = 345, - LootGone = 346, - MountForceddismount = 347, - AutofollowTooFar = 348, - UnitNotFound = 349, - InvalidFollowTarget = 350, - InvalidFollowPvpCombat = 351, - InvalidFollowTargetPvpCombat = 352, - InvalidInspectTarget = 353, - GuildemblemSuccess = 354, - GuildemblemInvalidTabardColors = 355, - GuildemblemNoguild = 356, - GuildemblemNotguildmaster = 357, - GuildemblemNotenoughmoney = 358, - GuildemblemInvalidvendor = 359, - EmblemerrorNotabardgeoset = 360, - SpellOutOfRange = 361, - CommandNeedsTarget = 362, - NoammoS = 363, - Toobusytofollow = 364, - DuelRequested = 365, - DuelCancelled = 366, - Deathbindalreadybound = 367, - DeathbindSuccessS = 368, - Noemotewhilerunning = 369, - ZoneExplored = 370, - ZoneExploredXp = 371, - InvalidItemTarget = 372, - InvalidQuestTarget = 373, - IgnoringYouS = 374, - FishNotHooked = 375, - FishEscaped = 376, - SpellFailedNotunsheathed = 377, - PetitionOfferedS = 378, - PetitionSigned = 379, - PetitionSignedS = 380, - PetitionDeclinedS = 381, - PetitionAlreadySigned = 382, - PetitionRestrictedAccountTrial = 383, - PetitionAlreadySignedOther = 384, - PetitionInGuild = 385, - PetitionCreator = 386, - PetitionNotEnoughSignatures = 387, - PetitionNotSameServer = 388, - PetitionFull = 389, - PetitionAlreadySignedByS = 390, - GuildNameInvalid = 391, - SpellUnlearnedS = 392, - PetSpellRooted = 393, - PetSpellAffectingCombat = 394, - PetSpellOutOfRange = 395, - PetSpellNotBehind = 396, - PetSpellTargetsDead = 397, - PetSpellDead = 398, - PetSpellNopath = 399, - ItemCantBeDestroyed = 400, - TicketAlreadyExists = 401, - TicketCreateError = 402, - TicketUpdateError = 403, - TicketDbError = 404, - TicketNoText = 405, - TicketTextTooLong = 406, - ObjectIsBusy = 407, - ExhaustionWellrested = 408, - ExhaustionRested = 409, - ExhaustionNormal = 410, - ExhaustionTired = 411, - ExhaustionExhausted = 412, - NoItemsWhileShapeshifted = 413, - CantInteractShapeshifted = 414, - RealmNotFound = 415, - MailQuestItem = 416, - MailBoundItem = 417, - MailConjuredItem = 418, - MailBag = 419, - MailToSelf = 420, - MailTargetNotFound = 421, - MailDatabaseError = 422, - MailDeleteItemError = 423, - MailWrappedCod = 424, - MailCantSendRealm = 425, - MailSent = 426, - NotHappyEnough = 427, - UseCantImmune = 428, - CantBeDisenchanted = 429, - CantUseDisarmed = 430, - AuctionQuestItem = 431, - AuctionBoundItem = 432, - AuctionConjuredItem = 433, - AuctionLimitedDurationItem = 434, - AuctionWrappedItem = 435, - AuctionLootItem = 436, - AuctionBag = 437, - AuctionEquippedBag = 438, - AuctionDatabaseError = 439, - AuctionBidOwn = 440, - AuctionBidIncrement = 441, - AuctionHigherBid = 442, - AuctionMinBid = 443, - AuctionRepairItem = 444, - AuctionUsedCharges = 445, - AuctionAlreadyBid = 446, - AuctionStarted = 447, - AuctionRemoved = 448, - AuctionOutbidS = 449, - AuctionWonS = 450, - AuctionSoldS = 451, - AuctionExpiredS = 452, - AuctionRemovedS = 453, - AuctionBidPlaced = 454, - LogoutFailed = 455, - QuestPushSuccessS = 456, - QuestPushInvalidS = 457, - QuestPushAcceptedS = 458, - QuestPushDeclinedS = 459, - QuestPushBusyS = 460, - QuestPushDeadS = 461, - QuestPushLogFullS = 462, - QuestPushOnquestS = 463, - QuestPushAlreadyDoneS = 464, - QuestPushNotDailyS = 465, - QuestPushTimerExpiredS = 466, - QuestPushNotInPartyS = 467, - QuestPushDifferentServerDailyS = 468, - QuestPushNotAllowedS = 469, - RaidGroupLowlevel = 470, - RaidGroupOnly = 471, - RaidGroupFull = 472, - RaidGroupRequirementsUnmatch = 473, - CorpseIsNotInInstance = 474, - PvpKillHonorable = 475, - PvpKillDishonorable = 476, - SpellFailedAlreadyAtFullHealth = 477, - SpellFailedAlreadyAtFullMana = 478, - SpellFailedAlreadyAtFullPowerS = 479, - AutolootMoneyS = 480, - GenericStunned = 481, - TargetStunned = 482, - MustRepairDurability = 483, - RaidYouJoined = 484, - RaidYouLeft = 485, - InstanceGroupJoinedWithParty = 486, - InstanceGroupJoinedWithRaid = 487, - RaidMemberAddedS = 488, - RaidMemberRemovedS = 489, - InstanceGroupAddedS = 490, - InstanceGroupRemovedS = 491, - ClickOnItemToFeed = 492, - TooManyChatChannels = 493, - LootRollPending = 494, - LootPlayerNotFound = 495, - NotInRaid = 496, - LoggingOut = 497, - TargetLoggingOut = 498, - NotWhileMounted = 499, - NotWhileShapeshifted = 500, - NotInCombat = 501, - NotWhileDisarmed = 502, - PetBroken = 503, - TalentWipeError = 504, - SpecWipeError = 505, - GlyphWipeError = 506, - PetSpecWipeError = 507, - FeignDeathResisted = 508, - MeetingStoneInQueueS = 509, - MeetingStoneLeftQueueS = 510, - MeetingStoneOtherMemberLeft = 511, - MeetingStonePartyKickedFromQueue = 512, - MeetingStoneMemberStillInQueue = 513, - MeetingStoneSuccess = 514, - MeetingStoneInProgress = 515, - MeetingStoneMemberAddedS = 516, - MeetingStoneGroupFull = 517, - MeetingStoneNotLeader = 518, - MeetingStoneInvalidLevel = 519, - MeetingStoneTargetNotInParty = 520, - MeetingStoneTargetInvalidLevel = 521, - MeetingStoneMustBeLeader = 522, - MeetingStoneNoRaidGroup = 523, - MeetingStoneNeedParty = 524, - MeetingStoneNotFound = 525, - GuildemblemSame = 526, - EquipTradeItem = 527, - PvpToggleOn = 528, - PvpToggleOff = 529, - GroupJoinBattlegroundDeserters = 530, - GroupJoinBattlegroundDead = 531, - GroupJoinBattlegroundS = 532, - GroupJoinBattlegroundFail = 533, - GroupJoinBattlegroundTooMany = 534, - SoloJoinBattlegroundS = 535, - JoinSingleScenarioS = 536, - BattlegroundTooManyQueues = 537, - BattlegroundCannotQueueForRated = 538, - BattledgroundQueuedForRated = 539, - BattlegroundTeamLeftQueue = 540, - BattlegroundNotInBattleground = 541, - AlreadyInArenaTeamS = 542, - InvalidPromotionCode = 543, - BgPlayerJoinedSs = 544, - BgPlayerLeftS = 545, - RestrictedAccount = 546, - RestrictedAccountTrial = 547, - PlayTimeExceeded = 548, - ApproachingPartialPlayTime = 549, - ApproachingPartialPlayTime2 = 550, - ApproachingNoPlayTime = 551, - ApproachingNoPlayTime2 = 552, - UnhealthyTime = 553, - ChatRestrictedTrial = 554, - ChatThrottled = 555, - MailReachedCap = 556, - InvalidRaidTarget = 557, - RaidLeaderReadyCheckStartS = 558, - ReadyCheckInProgress = 559, - ReadyCheckThrottled = 560, - DungeonDifficultyFailed = 561, - DungeonDifficultyChangedS = 562, - TradeWrongRealm = 563, - TradeNotOnTaplist = 564, - ChatPlayerAmbiguousS = 565, - LootCantLootThatNow = 566, - LootMasterInvFull = 567, - LootMasterUniqueItem = 568, - LootMasterOther = 569, - FilteringYouS = 570, - UsePreventedByMechanicS = 571, - ItemUniqueEquippable = 572, - LfgLeaderIsLfmS = 573, - LfgPending = 574, - CantSpeakLangage = 575, - VendorMissingTurnins = 576, - BattlegroundNotInTeam = 577, - NotInBattleground = 578, - NotEnoughHonorPoints = 579, - NotEnoughArenaPoints = 580, - SocketingRequiresMetaGem = 581, - SocketingMetaGemOnlyInMetaslot = 582, - SocketingRequiresHydraulicGem = 583, - SocketingHydraulicGemOnlyInHydraulicslot = 584, - SocketingRequiresCogwheelGem = 585, - SocketingCogwheelGemOnlyInCogwheelslot = 586, - SocketingItemTooLowLevel = 587, - ItemMaxCountSocketed = 588, - SystemDisabled = 589, - QuestFailedTooManyDailyQuestsI = 590, - ItemMaxCountEquippedSocketed = 591, - ItemUniqueEquippableSocketed = 592, - UserSquelched = 593, - TooMuchGold = 594, - NotBarberSitting = 595, - QuestFailedCais = 596, - InviteRestrictedTrial = 597, - VoiceIgnoreFull = 598, - VoiceIgnoreSelf = 599, - VoiceIgnoreNotFound = 600, - VoiceIgnoreAlreadyS = 601, - VoiceIgnoreAddedS = 602, - VoiceIgnoreRemovedS = 603, - VoiceIgnoreAmbiguous = 604, - VoiceIgnoreDeleted = 605, - UnknownMacroOptionS = 606, - NotDuringArenaMatch = 607, - PlayerSilenced = 608, - PlayerUnsilenced = 609, - ComsatDisconnect = 610, - ComsatReconnectAttempt = 611, - ComsatConnectFail = 612, - MailInvalidAttachmentSlot = 613, - MailTooManyAttachments = 614, - MailInvalidAttachment = 615, - MailAttachmentExpired = 616, - VoiceChatParentalDisableMic = 617, - ProfaneChatName = 618, - PlayerSilencedEcho = 619, - PlayerUnsilencedEcho = 620, - LootCantLootThat = 621, - ArenaExpiredCais = 622, - GroupActionThrottled = 623, - AlreadyPickpocketed = 624, - NameInvalid = 625, - NameNoName = 626, - NameTooShort = 627, - NameTooLong = 628, - NameMixedLanguages = 629, - NameProfane = 630, - NameReserved = 631, - NameThreeConsecutive = 632, - NameInvalidSpace = 633, - NameConsecutiveSpaces = 634, - NameRussianConsecutiveSilentCharacters = 635, - NameRussianSilentCharacterAtBeginningOrEnd = 636, - NameDeclensionDoesntMatchBaseName = 637, - ReferAFriendNotReferredBy = 638, - ReferAFriendTargetTooHigh = 639, - ReferAFriendInsufficientGrantableLevels = 640, - ReferAFriendTooFar = 641, - ReferAFriendDifferentFaction = 642, - ReferAFriendNotNow = 643, - ReferAFriendGrantLevelMaxI = 644, - ReferAFriendSummonLevelMaxI = 645, - ReferAFriendSummonCooldown = 646, - ReferAFriendSummonOfflineS = 647, - ReferAFriendInsufExpanLvl = 648, - ReferAFriendNotInLfg = 649, - ReferAFriendNoXrealm = 650, - ReferAFriendMapIncomingTransferNotAllowed = 651, - NotSameAccount = 652, - BadOnUseEnchant = 653, - TradeSelf = 654, - TooManySockets = 655, - ItemMaxLimitCategoryCountExceededIs = 656, - TradeTargetMaxLimitCategoryCountExceededIs = 657, - ItemMaxLimitCategorySocketedExceededIs = 658, - ItemMaxLimitCategoryEquippedExceededIs = 659, - ShapeshiftFormCannotEquip = 660, - ItemInventoryFullSatchel = 661, - ScalingStatItemLevelExceeded = 662, - ScalingStatItemLevelTooLow = 663, - PurchaseLevelTooLow = 664, - GroupSwapFailed = 665, - InviteInCombat = 666, - InvalidGlyphSlot = 667, - GenericNoValidTargets = 668, - CalendarEventAlertS = 669, - PetLearnSpellS = 670, - PetLearnAbilityS = 671, - PetSpellUnlearnedS = 672, - InviteUnknownRealm = 673, - InviteNoPartyServer = 674, - InvitePartyBusy = 675, - PartyTargetAmbiguous = 676, - PartyLfgInviteRaidLocked = 677, - PartyLfgBootLimit = 678, - PartyLfgBootCooldownS = 679, - PartyLfgBootNotEligibleS = 680, - PartyLfgBootInpatientTimerS = 681, - PartyLfgBootInProgress = 682, - PartyLfgBootTooFewPlayers = 683, - PartyLfgBootVoteSucceeded = 684, - PartyLfgBootVoteFailed = 685, - PartyLfgBootInCombat = 686, - PartyLfgBootDungeonComplete = 687, - PartyLfgBootLootRolls = 688, - PartyLfgBootVoteRegistered = 689, - PartyPrivateGroupOnly = 690, - PartyLfgTeleportInCombat = 691, - RaidDisallowedByLevel = 692, - RaidDisallowedByCrossRealm = 693, - PartyRoleNotAvailable = 694, - JoinLfgObjectFailed = 695, - LfgRemovedLevelup = 696, - LfgRemovedXpToggle = 697, - LfgRemovedFactionChange = 698, - BattlegroundInfoThrottled = 699, - BattlegroundAlreadyIn = 700, - ArenaTeamChangeFailedQueued = 701, - ArenaTeamPermissions = 702, - NotWhileFalling = 703, - NotWhileMoving = 704, - NotWhileFatigued = 705, - MaxSockets = 706, - MultiCastActionTotemS = 707, - BattlegroundJoinLevelup = 708, - RemoveFromPvpQueueXpGain = 709, - BattlegroundJoinXpGain = 710, - BattlegroundJoinMercenary = 711, - BattlegroundJoinTooManyHealers = 712, - BattlegroundJoinTooManyTanks = 713, - BattlegroundJoinTooManyDamage = 714, - RaidDifficultyFailed = 715, - RaidDifficultyChangedS = 716, - LegacyRaidDifficultyChangedS = 717, - RaidLockoutChangedS = 718, - RaidConvertedToParty = 719, - PartyConvertedToRaid = 720, - PlayerDifficultyChangedS = 721, - GmresponseDbError = 722, - BattlegroundJoinRangeIndex = 723, - ArenaJoinRangeIndex = 724, - RemoveFromPvpQueueFactionChange = 725, - BattlegroundJoinFailed = 726, - BattlegroundJoinNoValidSpecForRole = 727, - BattlegroundJoinRespec = 728, - BattlegroundInvitationDeclined = 729, - BattlegroundJoinTimedOut = 730, - BattlegroundDupeQueue = 731, - BattlegroundJoinMustCompleteQuest = 732, - InBattlegroundRespec = 733, - MailLimitedDurationItem = 734, - YellRestrictedTrial = 735, - ChatRaidRestrictedTrial = 736, - LfgRoleCheckFailed = 737, - LfgRoleCheckFailedTimeout = 738, - LfgRoleCheckFailedNotViable = 739, - LfgReadyCheckFailed = 740, - LfgReadyCheckFailedTimeout = 741, - LfgGroupFull = 742, - LfgNoLfgObject = 743, - LfgNoSlotsPlayer = 744, - LfgNoSlotsParty = 745, - LfgNoSpec = 746, - LfgMismatchedSlots = 747, - LfgMismatchedSlotsLocalXrealm = 748, - LfgPartyPlayersFromDifferentRealms = 749, - LfgMembersNotPresent = 750, - LfgGetInfoTimeout = 751, - LfgInvalidSlot = 752, - LfgDeserterPlayer = 753, - LfgDeserterParty = 754, - LfgDead = 755, - LfgRandomCooldownPlayer = 756, - LfgRandomCooldownParty = 757, - LfgTooManyMembers = 758, - LfgTooFewMembers = 759, - LfgProposalFailed = 760, - LfgProposalDeclinedSelf = 761, - LfgProposalDeclinedParty = 762, - LfgNoSlotsSelected = 763, - LfgNoRolesSelected = 764, - LfgRoleCheckInitiated = 765, - LfgReadyCheckInitiated = 766, - LfgPlayerDeclinedRoleCheck = 767, - LfgPlayerDeclinedReadyCheck = 768, - LfgJoinedQueue = 769, - LfgJoinedFlexQueue = 770, - LfgJoinedRfQueue = 771, - LfgJoinedScenarioQueue = 772, - LfgJoinedWorldPvpQueue = 773, - LfgJoinedBattlefieldQueue = 774, - LfgJoinedList = 775, - LfgLeftQueue = 776, - LfgLeftList = 777, - LfgRoleCheckAborted = 778, - LfgReadyCheckAborted = 779, - LfgCantUseBattleground = 780, - LfgCantUseDungeons = 781, - LfgReasonTooManyLfg = 782, - InvalidTeleportLocation = 783, - TooFarToInteract = 784, - BattlegroundPlayersFromDifferentRealms = 785, - DifficultyChangeCooldownS = 786, - DifficultyChangeCombatCooldownS = 787, - DifficultyChangeWorldstate = 788, - DifficultyChangeEncounter = 789, - DifficultyChangeCombat = 790, - DifficultyChangePlayerBusy = 791, - DifficultyChangeAlreadyStarted = 792, - DifficultyChangeOtherHeroicS = 793, - DifficultyChangeHeroicInstanceAlreadyRunning = 794, - ArenaTeamPartySize = 795, - QuestForceRemovedS = 796, - AttackNoActions = 797, - InRandomBg = 798, - InNonRandomBg = 799, - AuctionEnoughItems = 800, - BnFriendSelf = 801, - BnFriendAlready = 802, - BnFriendBlocked = 803, - BnFriendListFull = 804, - BnFriendRequestSent = 805, - BnBroadcastThrottle = 806, - BgDeveloperOnly = 807, - CurrencySpellSlotMismatch = 808, - CurrencyNotTradable = 809, - RequiresExpansionS = 810, - QuestFailedSpell = 811, - TalentFailedNotEnoughTalentsInPrimaryTree = 812, - TalentFailedNoPrimaryTreeSelected = 813, - TalentFailedCantRemoveTalent = 814, - TalentFailedUnknown = 815, - WargameRequestFailure = 816, - RankRequiresAuthenticator = 817, - GuildBankVoucherFailed = 818, - WargameRequestSent = 819, - RequiresAchievementI = 820, - RefundResultExceedMaxCurrency = 821, - CantBuyQuantity = 822, - ItemIsBattlePayLocked = 823, - PartyAlreadyInBattlegroundQueue = 824, - PartyConfirmingBattlegroundQueue = 825, - BattlefieldTeamPartySize = 826, - InsuffTrackedCurrencyIs = 827, - NotOnTournamentRealm = 828, - GuildTrialAccountTrial = 829, - GuildTrialAccountVeteran = 830, - GuildUndeletableDueToLevel = 831, - CantDoThatInAGroup = 832, - GuildLeaderReplaced = 833, - TransmogrifyCantEquip = 834, - TransmogrifyInvalidItemType = 835, - TransmogrifyNotSoulbound = 836, - TransmogrifyInvalidSource = 837, - TransmogrifyInvalidDestination = 838, - TransmogrifyMismatch = 839, - TransmogrifyLegendary = 840, - TransmogrifySameItem = 841, - TransmogrifySameAppearance = 842, - TransmogrifyNotEquipped = 843, - VoidDepositFull = 844, - VoidWithdrawFull = 845, - VoidStorageWrapped = 846, - VoidStorageStackable = 847, - VoidStorageUnbound = 848, - VoidStorageRepair = 849, - VoidStorageCharges = 850, - VoidStorageQuest = 851, - VoidStorageConjured = 852, - VoidStorageMail = 853, - VoidStorageBag = 854, - VoidTransferStorageFull = 855, - VoidTransferInvFull = 856, - VoidTransferInternalError = 857, - VoidTransferItemInvalid = 858, - DifficultyDisabledInLfg = 859, - VoidStorageUnique = 860, - VoidStorageLoot = 861, - VoidStorageHoliday = 862, - VoidStorageDuration = 863, - VoidStorageLoadFailed = 864, - VoidStorageInvalidItem = 865, - ParentalControlsChatMuted = 866, - SorStartExperienceIncomplete = 867, - SorInvalidEmail = 868, - SorInvalidComment = 869, - ChallengeModeResetCooldownS = 870, - ChallengeModeResetKeystone = 871, - PetJournalAlreadyInLoadout = 872, - ReportSubmittedSuccessfully = 873, - ReportSubmissionFailed = 874, - SuggestionSubmittedSuccessfully = 875, - BugSubmittedSuccessfully = 876, - ChallengeModeEnabled = 877, - ChallengeModeDisabled = 878, - PetbattleCreateFailed = 879, - PetbattleNotHere = 880, - PetbattleNotHereOnTransport = 881, - PetbattleNotHereUnevenGround = 882, - PetbattleNotHereObstructed = 883, - PetbattleNotWhileInCombat = 884, - PetbattleNotWhileDead = 885, - PetbattleNotWhileFlying = 886, - PetbattleTargetInvalid = 887, - PetbattleTargetOutOfRange = 888, - PetbattleTargetNotCapturable = 889, - PetbattleNotATrainer = 890, - PetbattleDeclined = 891, - PetbattleInBattle = 892, - PetbattleInvalidLoadout = 893, - PetbattleAllPetsDead = 894, - PetbattleNoPetsInSlots = 895, - PetbattleNoAccountLock = 896, - PetbattleWildPetTapped = 897, - PetbattleRestrictedAccount = 898, - PetbattleOpponentNotAvailable = 899, - PetbattleNotWhileInMatchedBattle = 900, - CantHaveMorePetsOfThatType = 901, - CantHaveMorePets = 902, - PvpMapNotFound = 903, - PvpMapNotSet = 904, - PetbattleQueueQueued = 905, - PetbattleQueueAlreadyQueued = 906, - PetbattleQueueJoinFailed = 907, - PetbattleQueueJournalLock = 908, - PetbattleQueueRemoved = 909, - PetbattleQueueProposalDeclined = 910, - PetbattleQueueProposalTimeout = 911, - PetbattleQueueOpponentDeclined = 912, - PetbattleQueueRequeuedInternal = 913, - PetbattleQueueRequeuedRemoved = 914, - PetbattleQueueSlotLocked = 915, - PetbattleQueueSlotEmpty = 916, - PetbattleQueueSlotNoTracker = 917, - PetbattleQueueSlotNoSpecies = 918, - PetbattleQueueSlotCantBattle = 919, - PetbattleQueueSlotRevoked = 920, - PetbattleQueueSlotDead = 921, - PetbattleQueueSlotNoPet = 922, - PetbattleQueueNotWhileNeutral = 923, - PetbattleGameTimeLimitWarning = 924, - PetbattleGameRoundsLimitWarning = 925, - HasRestriction = 926, - ItemUpgradeItemTooLowLevel = 927, - ItemUpgradeNoPath = 928, - ItemUpgradeNoMoreUpgrades = 929, - BonusRollEmpty = 930, - ChallengeModeFull = 931, - ChallengeModeInProgress = 932, - ChallengeModeIncorrectKeystone = 933, - BattletagFriendNotFound = 934, - BattletagFriendNotValid = 935, - BattletagFriendNotAllowed = 936, - BattletagFriendThrottled = 937, - BattletagFriendSuccess = 938, - PetTooHighLevelToUncage = 939, - PetbattleInternal = 940, - CantCagePetYet = 941, - NoLootInChallengeMode = 942, - QuestPetBattleVictoriesPvpIi = 943, - RoleCheckAlreadyInProgress = 944, - RecruitAFriendAccountLimit = 945, - RecruitAFriendFailed = 946, - SetLootPersonal = 947, - SetLootMethodFailedCombat = 948, - ReagentBankFull = 949, - ReagentBankLocked = 950, - GarrisonBuildingExists = 951, - GarrisonInvalidPlot = 952, - GarrisonInvalidBuildingid = 953, - GarrisonInvalidPlotBuilding = 954, - GarrisonRequiresBlueprint = 955, - GarrisonNotEnoughCurrency = 956, - GarrisonNotEnoughGold = 957, - GarrisonCompleteMissionWrongFollowerType = 958, - AlreadyUsingLfgList = 959, - RestrictedAccountLfgListTrial = 960, - ToyUseLimitReached = 961, - ToyAlreadyKnown = 962, - TransmogSetAlreadyKnown = 963, - NotEnoughCurrency = 964, - SpecIsDisabled = 965, - FeatureRestrictedTrial = 966, - CantBeObliterated = 967, - CantBeScrapped = 968, - ArtifactRelicDoesNotMatchArtifact = 969, - MustEquipArtifact = 970, - CantDoThatRightNow = 971, - AffectingCombat = 972, - EquipmentManagerCombatSwapS = 973, - EquipmentManagerBagsFull = 974, - EquipmentManagerMissingItemS = 975, - MovieRecordingWarningPerf = 976, - MovieRecordingWarningDiskFull = 977, - MovieRecordingWarningNoMovie = 978, - MovieRecordingWarningRequirements = 979, - MovieRecordingWarningCompressing = 980, - NoChallengeModeReward = 981, - ClaimedChallengeModeReward = 982, - ChallengeModePeriodResetSs = 983, - CantDoThatChallengeModeActive = 984, - TalentFailedRestArea = 985, - CannotAbandonLastPet = 986, - TestCvarSetSss = 987, - QuestTurnInFailReason = 988, - ClaimedChallengeModeRewardOld = 989, - TalentGrantedByAura = 990, - ChallengeModeAlreadyComplete = 991, - GlyphTargetNotAvailable = 992, - PvpWarmodeToggleOn = 993, - PvpWarmodeToggleOff = 994, - SpellFailedLevelRequirement = 995, - BattlegroundJoinRequiresLevel = 996, - BattlegroundJoinDisqualified = 997, - VoiceChatGenericUnableToConnect = 998, - VoiceChatServiceLost = 999, - VoiceChatChannelNameTooShort = 1000, - VoiceChatChannelNameTooLong = 1001, - VoiceChatChannelAlreadyExists = 1002, - VoiceChatTargetNotFound = 1003, - VoiceChatTooManyRequests = 1004, - VoiceChatPlayerSilenced = 1005, - VoiceChatParentalDisableAll = 1006, - VoiceChatDisabled = 1007, - NoPvpReward = 1008, - ClaimedPvpReward = 1009 + VendorRefuseScrappableAzerite = 37, + VendorHatesYou = 38, + VendorSoldOut = 39, + VendorTooFar = 40, + VendorDoesntBuy = 41, + NotEnoughMoney = 42, + ReceiveItemS = 43, + DropBoundItem = 44, + TradeBoundItem = 45, + TradeQuestItem = 46, + TradeTempEnchantBound = 47, + TradeGroundItem = 48, + TradeBag = 49, + SpellFailedS = 50, + ItemCooldown = 51, + PotionCooldown = 52, + FoodCooldown = 53, + SpellCooldown = 54, + AbilityCooldown = 55, + SpellAlreadyKnownS = 56, + PetSpellAlreadyKnownS = 57, + ProficiencyGainedS = 58, + SkillGainedS = 59, + SkillUpSi = 60, + LearnSpellS = 61, + LearnAbilityS = 62, + LearnPassiveS = 63, + LearnRecipeS = 64, + LearnCompanionS = 65, + LearnMountS = 66, + LearnToyS = 67, + LearnHeirloomS = 68, + LearnTransmogS = 69, + CompletedTransmogSetS = 70, + RevokeTransmogS = 71, + InvitePlayerS = 72, + InviteSelf = 73, + InvitedToGroupSs = 74, + InvitedAlreadyInGroupSs = 75, + AlreadyInGroupS = 76, + CrossRealmRaidInvite = 77, + PlayerBusyS = 78, + NewLeaderS = 79, + NewLeaderYou = 80, + NewGuideS = 81, + NewGuideYou = 82, + LeftGroupS = 83, + LeftGroupYou = 84, + GroupDisbanded = 85, + DeclineGroupS = 86, + JoinedGroupS = 87, + UninviteYou = 88, + BadPlayerNameS = 89, + NotInGroup = 90, + TargetNotInGroupS = 91, + TargetNotInInstanceS = 92, + NotInInstanceGroup = 93, + GroupFull = 94, + NotLeader = 95, + PlayerDiedS = 96, + GuildCreateS = 97, + GuildInviteS = 98, + InvitedToGuildSss = 99, + AlreadyInGuildS = 100, + AlreadyInvitedToGuildS = 101, + InvitedToGuild = 102, + AlreadyInGuild = 103, + GuildAccept = 104, + GuildDeclineS = 105, + GuildDeclineAutoS = 106, + GuildPermissions = 107, + GuildJoinS = 108, + GuildFounderS = 109, + GuildPromoteSss = 110, + GuildDemoteSs = 111, + GuildDemoteSss = 112, + GuildInviteSelf = 113, + GuildQuitS = 114, + GuildLeaveS = 115, + GuildRemoveSs = 116, + GuildRemoveSelf = 117, + GuildDisbandS = 118, + GuildDisbandSelf = 119, + GuildLeaderS = 120, + GuildLeaderSelf = 121, + GuildPlayerNotFoundS = 122, + GuildPlayerNotInGuildS = 123, + GuildPlayerNotInGuild = 124, + GuildCantPromoteS = 125, + GuildCantDemoteS = 126, + GuildNotInAGuild = 127, + GuildInternal = 128, + GuildLeaderIsS = 129, + GuildLeaderChangedSs = 130, + GuildDisbanded = 131, + GuildNotAllied = 132, + GuildLeaderLeave = 133, + GuildRanksLocked = 134, + GuildRankInUse = 135, + GuildRankTooHighS = 136, + GuildRankTooLowS = 137, + GuildNameExistsS = 138, + GuildWithdrawLimit = 139, + GuildNotEnoughMoney = 140, + GuildTooMuchMoney = 141, + GuildBankConjuredItem = 142, + GuildBankEquippedItem = 143, + GuildBankBoundItem = 144, + GuildBankQuestItem = 145, + GuildBankWrappedItem = 146, + GuildBankFull = 147, + GuildBankWrongTab = 148, + NoGuildCharter = 149, + OutOfRange = 150, + PlayerDead = 151, + ClientLockedOut = 152, + ClientOnTransport = 153, + KilledByS = 154, + LootLocked = 155, + LootTooFar = 156, + LootDidntKill = 157, + LootBadFacing = 158, + LootNotstanding = 159, + LootStunned = 160, + LootNoUi = 161, + LootWhileInvulnerable = 162, + NoLoot = 163, + QuestAcceptedS = 164, + QuestCompleteS = 165, + QuestFailedS = 166, + QuestFailedBagFullS = 167, + QuestFailedMaxCountS = 168, + QuestFailedLowLevel = 169, + QuestFailedMissingItems = 170, + QuestFailedWrongRace = 171, + QuestFailedNotEnoughMoney = 172, + QuestFailedExpansion = 173, + QuestOnlyOneTimed = 174, + QuestNeedPrereqs = 175, + QuestNeedPrereqsCustom = 176, + QuestAlreadyOn = 177, + QuestAlreadyDone = 178, + QuestAlreadyDoneDaily = 179, + QuestHasInProgress = 180, + QuestRewardExpI = 181, + QuestRewardMoneyS = 182, + QuestMustChoose = 183, + QuestLogFull = 184, + CombatDamageSsi = 185, + InspectS = 186, + CantUseItem = 187, + CantUseItemInArena = 188, + CantUseItemInRatedBattleground = 189, + MustEquipItem = 190, + PassiveAbility = 191, + Weapon2hskillnotfound = 192, + NoAttackTarget = 193, + InvalidAttackTarget = 194, + AttackPvpTargetWhileUnflagged = 195, + AttackStunned = 196, + AttackPacified = 197, + AttackMounted = 198, + AttackFleeing = 199, + AttackConfused = 200, + AttackCharmed = 201, + AttackDead = 202, + AttackPreventedByMechanicS = 203, + AttackChannel = 204, + Taxisamenode = 205, + Taxinosuchpath = 206, + Taxiunspecifiedservererror = 207, + Taxinotenoughmoney = 208, + Taxitoofaraway = 209, + Taxinovendornearby = 210, + Taxinotvisited = 211, + Taxiplayerbusy = 212, + Taxiplayeralreadymounted = 213, + Taxiplayershapeshifted = 214, + Taxiplayermoving = 215, + Taxinopaths = 216, + Taxinoteligible = 217, + Taxinotstanding = 218, + NoReplyTarget = 219, + GenericNoTarget = 220, + InitiateTradeS = 221, + TradeRequestS = 222, + TradeBlockedS = 223, + TradeTargetDead = 224, + TradeTooFar = 225, + TradeCancelled = 226, + TradeComplete = 227, + TradeBagFull = 228, + TradeTargetBagFull = 229, + TradeMaxCountExceeded = 230, + TradeTargetMaxCountExceeded = 231, + AlreadyTrading = 232, + MountInvalidmountee = 233, + MountToofaraway = 234, + MountAlreadymounted = 235, + MountNotmountable = 236, + MountNotyourpet = 237, + MountOther = 238, + MountLooting = 239, + MountRacecantmount = 240, + MountShapeshifted = 241, + MountNoFavorites = 242, + DismountNopet = 243, + DismountNotmounted = 244, + DismountNotyourpet = 245, + SpellFailedTotems = 246, + SpellFailedReagents = 247, + SpellFailedReagentsGeneric = 248, + CantTradeGold = 249, + SpellFailedEquippedItem = 250, + SpellFailedEquippedItemClassS = 251, + SpellFailedShapeshiftFormS = 252, + SpellFailedAnotherInProgress = 253, + Badattackfacing = 254, + Badattackpos = 255, + ChestInUse = 256, + UseCantOpen = 257, + UseLocked = 258, + DoorLocked = 259, + ButtonLocked = 260, + UseLockedWithItemS = 261, + UseLockedWithSpellS = 262, + UseLockedWithSpellKnownSi = 263, + UseTooFar = 264, + UseBadAngle = 265, + UseObjectMoving = 266, + UseSpellFocus = 267, + UseDestroyed = 268, + SetLootFreeforall = 269, + SetLootRoundrobin = 270, + SetLootMaster = 271, + SetLootGroup = 272, + SetLootThresholdS = 273, + NewLootMasterS = 274, + SpecifyMasterLooter = 275, + LootSpecChangedS = 276, + TameFailed = 277, + ChatWhileDead = 278, + ChatPlayerNotFoundS = 279, + Newtaxipath = 280, + NoPet = 281, + Notyourpet = 282, + PetNotRenameable = 283, + QuestObjectiveCompleteS = 284, + QuestUnknownComplete = 285, + QuestAddKillSii = 286, + QuestAddFoundSii = 287, + QuestAddItemSii = 288, + QuestAddPlayerKillSii = 289, + Cannotcreatedirectory = 290, + Cannotcreatefile = 291, + PlayerWrongFaction = 292, + PlayerIsNeutral = 293, + BankslotFailedTooMany = 294, + BankslotInsufficientFunds = 295, + BankslotNotbanker = 296, + FriendDbError = 297, + FriendListFull = 298, + FriendAddedS = 299, + BattletagFriendAddedS = 300, + FriendOnlineSs = 301, + FriendOfflineS = 302, + FriendNotFound = 303, + FriendWrongFaction = 304, + FriendRemovedS = 305, + BattletagFriendRemovedS = 306, + FriendError = 307, + FriendAlreadyS = 308, + FriendSelf = 309, + FriendDeleted = 310, + IgnoreFull = 311, + IgnoreSelf = 312, + IgnoreNotFound = 313, + IgnoreAlreadyS = 314, + IgnoreAddedS = 315, + IgnoreRemovedS = 316, + IgnoreAmbiguous = 317, + IgnoreDeleted = 318, + OnlyOneBolt = 319, + OnlyOneAmmo = 320, + SpellFailedEquippedSpecificItem = 321, + WrongBagTypeSubclass = 322, + CantWrapStackable = 323, + CantWrapEquipped = 324, + CantWrapWrapped = 325, + CantWrapBound = 326, + CantWrapUnique = 327, + CantWrapBags = 328, + OutOfMana = 329, + OutOfRage = 330, + OutOfFocus = 331, + OutOfEnergy = 332, + OutOfChi = 333, + OutOfHealth = 334, + OutOfRunes = 335, + OutOfRunicPower = 336, + OutOfSoulShards = 337, + OutOfLunarPower = 338, + OutOfHolyPower = 339, + OutOfMaelstrom = 340, + OutOfComboPoints = 341, + OutOfInsanity = 342, + OutOfArcaneCharges = 343, + OutOfFury = 344, + OutOfPain = 345, + OutOfPowerDisplay = 346, + LootGone = 347, + MountForceddismount = 348, + AutofollowTooFar = 349, + UnitNotFound = 350, + InvalidFollowTarget = 351, + InvalidFollowPvpCombat = 352, + InvalidFollowTargetPvpCombat = 353, + InvalidInspectTarget = 354, + GuildemblemSuccess = 355, + GuildemblemInvalidTabardColors = 356, + GuildemblemNoguild = 357, + GuildemblemNotguildmaster = 358, + GuildemblemNotenoughmoney = 359, + GuildemblemInvalidvendor = 360, + EmblemerrorNotabardgeoset = 361, + SpellOutOfRange = 362, + CommandNeedsTarget = 363, + NoammoS = 364, + Toobusytofollow = 365, + DuelRequested = 366, + DuelCancelled = 367, + Deathbindalreadybound = 368, + DeathbindSuccessS = 369, + Noemotewhilerunning = 370, + ZoneExplored = 371, + ZoneExploredXp = 372, + InvalidItemTarget = 373, + InvalidQuestTarget = 374, + IgnoringYouS = 375, + FishNotHooked = 376, + FishEscaped = 377, + SpellFailedNotunsheathed = 378, + PetitionOfferedS = 379, + PetitionSigned = 380, + PetitionSignedS = 381, + PetitionDeclinedS = 382, + PetitionAlreadySigned = 383, + PetitionRestrictedAccountTrial = 384, + PetitionAlreadySignedOther = 385, + PetitionInGuild = 386, + PetitionCreator = 387, + PetitionNotEnoughSignatures = 388, + PetitionNotSameServer = 389, + PetitionFull = 390, + PetitionAlreadySignedByS = 391, + GuildNameInvalid = 392, + SpellUnlearnedS = 393, + PetSpellRooted = 394, + PetSpellAffectingCombat = 395, + PetSpellOutOfRange = 396, + PetSpellNotBehind = 397, + PetSpellTargetsDead = 398, + PetSpellDead = 399, + PetSpellNopath = 400, + ItemCantBeDestroyed = 401, + TicketAlreadyExists = 402, + TicketCreateError = 403, + TicketUpdateError = 404, + TicketDbError = 405, + TicketNoText = 406, + TicketTextTooLong = 407, + ObjectIsBusy = 408, + ExhaustionWellrested = 409, + ExhaustionRested = 410, + ExhaustionNormal = 411, + ExhaustionTired = 412, + ExhaustionExhausted = 413, + NoItemsWhileShapeshifted = 414, + CantInteractShapeshifted = 415, + RealmNotFound = 416, + MailQuestItem = 417, + MailBoundItem = 418, + MailConjuredItem = 419, + MailBag = 420, + MailToSelf = 421, + MailTargetNotFound = 422, + MailDatabaseError = 423, + MailDeleteItemError = 424, + MailWrappedCod = 425, + MailCantSendRealm = 426, + MailTempReturnOutage = 427, + MailSent = 428, + NotHappyEnough = 429, + UseCantImmune = 430, + CantBeDisenchanted = 431, + CantUseDisarmed = 432, + AuctionQuestItem = 433, + AuctionBoundItem = 434, + AuctionConjuredItem = 435, + AuctionLimitedDurationItem = 436, + AuctionWrappedItem = 437, + AuctionLootItem = 438, + AuctionBag = 439, + AuctionEquippedBag = 440, + AuctionDatabaseError = 441, + AuctionBidOwn = 442, + AuctionBidIncrement = 443, + AuctionHigherBid = 444, + AuctionMinBid = 445, + AuctionRepairItem = 446, + AuctionUsedCharges = 447, + AuctionAlreadyBid = 448, + AuctionHouseUnavailable = 449, + AuctionHouseBusy = 450, + AuctionStarted = 451, + AuctionRemoved = 452, + AuctionOutbidS = 453, + AuctionWonS = 454, + AuctionSoldS = 455, + AuctionExpiredS = 456, + AuctionRemovedS = 457, + AuctionBidPlaced = 458, + LogoutFailed = 459, + QuestPushSuccessS = 460, + QuestPushInvalidS = 461, + QuestPushAcceptedS = 462, + QuestPushDeclinedS = 463, + QuestPushBusyS = 464, + QuestPushDeadS = 465, + QuestPushLogFullS = 466, + QuestPushOnquestS = 467, + QuestPushAlreadyDoneS = 468, + QuestPushNotDailyS = 469, + QuestPushTimerExpiredS = 470, + QuestPushNotInPartyS = 471, + QuestPushDifferentServerDailyS = 472, + QuestPushNotAllowedS = 473, + RaidGroupLowlevel = 474, + RaidGroupOnly = 475, + RaidGroupFull = 476, + RaidGroupRequirementsUnmatch = 477, + CorpseIsNotInInstance = 478, + PvpKillHonorable = 479, + PvpKillDishonorable = 480, + SpellFailedAlreadyAtFullHealth = 481, + SpellFailedAlreadyAtFullMana = 482, + SpellFailedAlreadyAtFullPowerS = 483, + AutolootMoneyS = 484, + GenericStunned = 485, + GenericThrottle = 486, + TargetStunned = 487, + MustRepairDurability = 488, + RaidYouJoined = 489, + RaidYouLeft = 490, + InstanceGroupJoinedWithParty = 491, + InstanceGroupJoinedWithRaid = 492, + RaidMemberAddedS = 493, + RaidMemberRemovedS = 494, + InstanceGroupAddedS = 495, + InstanceGroupRemovedS = 496, + ClickOnItemToFeed = 497, + TooManyChatChannels = 498, + LootRollPending = 499, + LootPlayerNotFound = 500, + NotInRaid = 501, + LoggingOut = 502, + TargetLoggingOut = 503, + NotWhileMounted = 504, + NotWhileShapeshifted = 505, + NotInCombat = 506, + NotWhileDisarmed = 507, + PetBroken = 508, + TalentWipeError = 509, + SpecWipeError = 510, + GlyphWipeError = 511, + PetSpecWipeError = 512, + FeignDeathResisted = 513, + MeetingStoneInQueueS = 514, + MeetingStoneLeftQueueS = 515, + MeetingStoneOtherMemberLeft = 516, + MeetingStonePartyKickedFromQueue = 517, + MeetingStoneMemberStillInQueue = 518, + MeetingStoneSuccess = 519, + MeetingStoneInProgress = 520, + MeetingStoneMemberAddedS = 521, + MeetingStoneGroupFull = 522, + MeetingStoneNotLeader = 523, + MeetingStoneInvalidLevel = 524, + MeetingStoneTargetNotInParty = 525, + MeetingStoneTargetInvalidLevel = 526, + MeetingStoneMustBeLeader = 527, + MeetingStoneNoRaidGroup = 528, + MeetingStoneNeedParty = 529, + MeetingStoneNotFound = 530, + MeetingStoneTargetInVehicle = 531, + GuildemblemSame = 532, + EquipTradeItem = 533, + PvpToggleOn = 534, + PvpToggleOff = 535, + GroupJoinBattlegroundDeserters = 536, + GroupJoinBattlegroundDead = 537, + GroupJoinBattlegroundS = 538, + GroupJoinBattlegroundFail = 539, + GroupJoinBattlegroundTooMany = 540, + SoloJoinBattlegroundS = 541, + JoinSingleScenarioS = 542, + BattlegroundTooManyQueues = 543, + BattlegroundCannotQueueForRated = 544, + BattledgroundQueuedForRated = 545, + BattlegroundTeamLeftQueue = 546, + BattlegroundNotInBattleground = 547, + AlreadyInArenaTeamS = 548, + InvalidPromotionCode = 549, + BgPlayerJoinedSs = 550, + BgPlayerLeftS = 551, + RestrictedAccount = 552, + RestrictedAccountTrial = 553, + PlayTimeExceeded = 554, + ApproachingPartialPlayTime = 555, + ApproachingPartialPlayTime2 = 556, + ApproachingNoPlayTime = 557, + ApproachingNoPlayTime2 = 558, + UnhealthyTime = 559, + ChatRestrictedTrial = 560, + ChatThrottled = 561, + MailReachedCap = 562, + InvalidRaidTarget = 563, + RaidLeaderReadyCheckStartS = 564, + ReadyCheckInProgress = 565, + ReadyCheckThrottled = 566, + DungeonDifficultyFailed = 567, + DungeonDifficultyChangedS = 568, + TradeWrongRealm = 569, + TradeNotOnTaplist = 570, + ChatPlayerAmbiguousS = 571, + LootCantLootThatNow = 572, + LootMasterInvFull = 573, + LootMasterUniqueItem = 574, + LootMasterOther = 575, + FilteringYouS = 576, + UsePreventedByMechanicS = 577, + ItemUniqueEquippable = 578, + LfgLeaderIsLfmS = 579, + LfgPending = 580, + CantSpeakLangage = 581, + VendorMissingTurnins = 582, + BattlegroundNotInTeam = 583, + NotInBattleground = 584, + NotEnoughHonorPoints = 585, + NotEnoughArenaPoints = 586, + SocketingRequiresMetaGem = 587, + SocketingMetaGemOnlyInMetaslot = 588, + SocketingRequiresHydraulicGem = 589, + SocketingHydraulicGemOnlyInHydraulicslot = 590, + SocketingRequiresCogwheelGem = 591, + SocketingCogwheelGemOnlyInCogwheelslot = 592, + SocketingItemTooLowLevel = 593, + ItemMaxCountSocketed = 594, + SystemDisabled = 595, + QuestFailedTooManyDailyQuestsI = 596, + ItemMaxCountEquippedSocketed = 597, + ItemUniqueEquippableSocketed = 598, + UserSquelched = 599, + TooMuchGold = 600, + NotBarberSitting = 601, + QuestFailedCais = 602, + InviteRestrictedTrial = 603, + VoiceIgnoreFull = 604, + VoiceIgnoreSelf = 605, + VoiceIgnoreNotFound = 606, + VoiceIgnoreAlreadyS = 607, + VoiceIgnoreAddedS = 608, + VoiceIgnoreRemovedS = 609, + VoiceIgnoreAmbiguous = 610, + VoiceIgnoreDeleted = 611, + UnknownMacroOptionS = 612, + NotDuringArenaMatch = 613, + PlayerSilenced = 614, + PlayerUnsilenced = 615, + ComsatDisconnect = 616, + ComsatReconnectAttempt = 617, + ComsatConnectFail = 618, + MailInvalidAttachmentSlot = 619, + MailTooManyAttachments = 620, + MailInvalidAttachment = 621, + MailAttachmentExpired = 622, + VoiceChatParentalDisableMic = 623, + ProfaneChatName = 624, + PlayerSilencedEcho = 625, + PlayerUnsilencedEcho = 626, + LootCantLootThat = 627, + ArenaExpiredCais = 628, + GroupActionThrottled = 629, + AlreadyPickpocketed = 630, + NameInvalid = 631, + NameNoName = 632, + NameTooShort = 633, + NameTooLong = 634, + NameMixedLanguages = 635, + NameProfane = 636, + NameReserved = 637, + NameThreeConsecutive = 638, + NameInvalidSpace = 639, + NameConsecutiveSpaces = 640, + NameRussianConsecutiveSilentCharacters = 641, + NameRussianSilentCharacterAtBeginningOrEnd = 642, + NameDeclensionDoesntMatchBaseName = 643, + ReferAFriendNotReferredBy = 644, + ReferAFriendTargetTooHigh = 645, + ReferAFriendInsufficientGrantableLevels = 646, + ReferAFriendTooFar = 647, + ReferAFriendDifferentFaction = 648, + ReferAFriendNotNow = 649, + ReferAFriendGrantLevelMaxI = 650, + ReferAFriendSummonLevelMaxI = 651, + ReferAFriendSummonCooldown = 652, + ReferAFriendSummonOfflineS = 653, + ReferAFriendInsufExpanLvl = 654, + ReferAFriendNotInLfg = 655, + ReferAFriendNoXrealm = 656, + ReferAFriendMapIncomingTransferNotAllowed = 657, + NotSameAccount = 658, + BadOnUseEnchant = 659, + TradeSelf = 660, + TooManySockets = 661, + ItemMaxLimitCategoryCountExceededIs = 662, + TradeTargetMaxLimitCategoryCountExceededIs = 663, + ItemMaxLimitCategorySocketedExceededIs = 664, + ItemMaxLimitCategoryEquippedExceededIs = 665, + ShapeshiftFormCannotEquip = 666, + ItemInventoryFullSatchel = 667, + ScalingStatItemLevelExceeded = 668, + ScalingStatItemLevelTooLow = 669, + PurchaseLevelTooLow = 670, + GroupSwapFailed = 671, + InviteInCombat = 672, + InvalidGlyphSlot = 673, + GenericNoValidTargets = 674, + CalendarEventAlertS = 675, + PetLearnSpellS = 676, + PetLearnAbilityS = 677, + PetSpellUnlearnedS = 678, + InviteUnknownRealm = 679, + InviteNoPartyServer = 680, + InvitePartyBusy = 681, + PartyTargetAmbiguous = 682, + PartyLfgInviteRaidLocked = 683, + PartyLfgBootLimit = 684, + PartyLfgBootCooldownS = 685, + PartyLfgBootNotEligibleS = 686, + PartyLfgBootInpatientTimerS = 687, + PartyLfgBootInProgress = 688, + PartyLfgBootTooFewPlayers = 689, + PartyLfgBootVoteSucceeded = 690, + PartyLfgBootVoteFailed = 691, + PartyLfgBootInCombat = 692, + PartyLfgBootDungeonComplete = 693, + PartyLfgBootLootRolls = 694, + PartyLfgBootVoteRegistered = 695, + PartyPrivateGroupOnly = 696, + PartyLfgTeleportInCombat = 697, + RaidDisallowedByLevel = 698, + RaidDisallowedByCrossRealm = 699, + PartyRoleNotAvailable = 700, + JoinLfgObjectFailed = 701, + LfgRemovedLevelup = 702, + LfgRemovedXpToggle = 703, + LfgRemovedFactionChange = 704, + BattlegroundInfoThrottled = 705, + BattlegroundAlreadyIn = 706, + ArenaTeamChangeFailedQueued = 707, + ArenaTeamPermissions = 708, + NotWhileFalling = 709, + NotWhileMoving = 710, + NotWhileFatigued = 711, + MaxSockets = 712, + MultiCastActionTotemS = 713, + BattlegroundJoinLevelup = 714, + RemoveFromPvpQueueXpGain = 715, + BattlegroundJoinXpGain = 716, + BattlegroundJoinMercenary = 717, + BattlegroundJoinTooManyHealers = 718, + BattlegroundJoinRatedTooManyHealers = 719, + BattlegroundJoinTooManyTanks = 720, + BattlegroundJoinTooManyDamage = 721, + RaidDifficultyFailed = 722, + RaidDifficultyChangedS = 723, + LegacyRaidDifficultyChangedS = 724, + RaidLockoutChangedS = 725, + RaidConvertedToParty = 726, + PartyConvertedToRaid = 727, + PlayerDifficultyChangedS = 728, + GmresponseDbError = 729, + BattlegroundJoinRangeIndex = 730, + ArenaJoinRangeIndex = 731, + RemoveFromPvpQueueFactionChange = 732, + BattlegroundJoinFailed = 733, + BattlegroundJoinNoValidSpecForRole = 734, + BattlegroundJoinRespec = 735, + BattlegroundInvitationDeclined = 736, + BattlegroundJoinTimedOut = 737, + BattlegroundDupeQueue = 738, + BattlegroundJoinMustCompleteQuest = 739, + InBattlegroundRespec = 740, + MailLimitedDurationItem = 741, + YellRestrictedTrial = 742, + ChatRaidRestrictedTrial = 743, + LfgRoleCheckFailed = 744, + LfgRoleCheckFailedTimeout = 745, + LfgRoleCheckFailedNotViable = 746, + LfgReadyCheckFailed = 747, + LfgReadyCheckFailedTimeout = 748, + LfgGroupFull = 749, + LfgNoLfgObject = 750, + LfgNoSlotsPlayer = 751, + LfgNoSlotsParty = 752, + LfgNoSpec = 753, + LfgMismatchedSlots = 754, + LfgMismatchedSlotsLocalXrealm = 755, + LfgPartyPlayersFromDifferentRealms = 756, + LfgMembersNotPresent = 757, + LfgGetInfoTimeout = 758, + LfgInvalidSlot = 759, + LfgDeserterPlayer = 760, + LfgDeserterParty = 761, + LfgDead = 762, + LfgRandomCooldownPlayer = 763, + LfgRandomCooldownParty = 764, + LfgTooManyMembers = 765, + LfgTooFewMembers = 766, + LfgProposalFailed = 767, + LfgProposalDeclinedSelf = 768, + LfgProposalDeclinedParty = 769, + LfgNoSlotsSelected = 770, + LfgNoRolesSelected = 771, + LfgRoleCheckInitiated = 772, + LfgReadyCheckInitiated = 773, + LfgPlayerDeclinedRoleCheck = 774, + LfgPlayerDeclinedReadyCheck = 775, + LfgJoinedQueue = 776, + LfgJoinedFlexQueue = 777, + LfgJoinedRfQueue = 778, + LfgJoinedScenarioQueue = 779, + LfgJoinedWorldPvpQueue = 780, + LfgJoinedBattlefieldQueue = 781, + LfgJoinedList = 782, + LfgLeftQueue = 783, + LfgLeftList = 784, + LfgRoleCheckAborted = 785, + LfgReadyCheckAborted = 786, + LfgCantUseBattleground = 787, + LfgCantUseDungeons = 788, + LfgReasonTooManyLfg = 789, + InvalidTeleportLocation = 790, + TooFarToInteract = 791, + BattlegroundPlayersFromDifferentRealms = 792, + DifficultyChangeCooldownS = 793, + DifficultyChangeCombatCooldownS = 794, + DifficultyChangeWorldstate = 795, + DifficultyChangeEncounter = 796, + DifficultyChangeCombat = 797, + DifficultyChangePlayerBusy = 798, + DifficultyChangeAlreadyStarted = 799, + DifficultyChangeOtherHeroicS = 800, + DifficultyChangeHeroicInstanceAlreadyRunning = 801, + ArenaTeamPartySize = 802, + QuestForceRemovedS = 803, + AttackNoActions = 804, + InRandomBg = 805, + InNonRandomBg = 806, + AuctionEnoughItems = 807, + BnFriendSelf = 808, + BnFriendAlready = 809, + BnFriendBlocked = 810, + BnFriendListFull = 811, + BnFriendRequestSent = 812, + BnBroadcastThrottle = 813, + BgDeveloperOnly = 814, + CurrencySpellSlotMismatch = 815, + CurrencyNotTradable = 816, + RequiresExpansionS = 817, + QuestFailedSpell = 818, + TalentFailedNotEnoughTalentsInPrimaryTree = 819, + TalentFailedNoPrimaryTreeSelected = 820, + TalentFailedCantRemoveTalent = 821, + TalentFailedUnknown = 822, + WargameRequestFailure = 823, + RankRequiresAuthenticator = 824, + GuildBankVoucherFailed = 825, + WargameRequestSent = 826, + RequiresAchievementI = 827, + RefundResultExceedMaxCurrency = 828, + CantBuyQuantity = 829, + ItemIsBattlePayLocked = 830, + PartyAlreadyInBattlegroundQueue = 831, + PartyConfirmingBattlegroundQueue = 832, + BattlefieldTeamPartySize = 833, + InsuffTrackedCurrencyIs = 834, + NotOnTournamentRealm = 835, + GuildTrialAccountTrial = 836, + GuildTrialAccountVeteran = 837, + GuildUndeletableDueToLevel = 838, + CantDoThatInAGroup = 839, + GuildLeaderReplaced = 840, + TransmogrifyCantEquip = 841, + TransmogrifyInvalidItemType = 842, + TransmogrifyNotSoulbound = 843, + TransmogrifyInvalidSource = 844, + TransmogrifyInvalidDestination = 845, + TransmogrifyMismatch = 846, + TransmogrifyLegendary = 847, + TransmogrifySameItem = 848, + TransmogrifySameAppearance = 849, + TransmogrifyNotEquipped = 850, + VoidDepositFull = 851, + VoidWithdrawFull = 852, + VoidStorageWrapped = 853, + VoidStorageStackable = 854, + VoidStorageUnbound = 855, + VoidStorageRepair = 856, + VoidStorageCharges = 857, + VoidStorageQuest = 858, + VoidStorageConjured = 859, + VoidStorageMail = 860, + VoidStorageBag = 861, + VoidTransferStorageFull = 862, + VoidTransferInvFull = 863, + VoidTransferInternalError = 864, + VoidTransferItemInvalid = 865, + DifficultyDisabledInLfg = 866, + VoidStorageUnique = 867, + VoidStorageLoot = 868, + VoidStorageHoliday = 869, + VoidStorageDuration = 870, + VoidStorageLoadFailed = 871, + VoidStorageInvalidItem = 872, + ParentalControlsChatMuted = 873, + SorStartExperienceIncomplete = 874, + SorInvalidEmail = 875, + SorInvalidComment = 876, + ChallengeModeResetCooldownS = 877, + ChallengeModeResetKeystone = 878, + PetJournalAlreadyInLoadout = 879, + ReportSubmittedSuccessfully = 880, + ReportSubmissionFailed = 881, + SuggestionSubmittedSuccessfully = 882, + BugSubmittedSuccessfully = 883, + ChallengeModeEnabled = 884, + ChallengeModeDisabled = 885, + PetbattleCreateFailed = 886, + PetbattleNotHere = 887, + PetbattleNotHereOnTransport = 888, + PetbattleNotHereUnevenGround = 889, + PetbattleNotHereObstructed = 890, + PetbattleNotWhileInCombat = 891, + PetbattleNotWhileDead = 892, + PetbattleNotWhileFlying = 893, + PetbattleTargetInvalid = 894, + PetbattleTargetOutOfRange = 895, + PetbattleTargetNotCapturable = 896, + PetbattleNotATrainer = 897, + PetbattleDeclined = 898, + PetbattleInBattle = 899, + PetbattleInvalidLoadout = 900, + PetbattleAllPetsDead = 901, + PetbattleNoPetsInSlots = 902, + PetbattleNoAccountLock = 903, + PetbattleWildPetTapped = 904, + PetbattleRestrictedAccount = 905, + PetbattleOpponentNotAvailable = 906, + PetbattleNotWhileInMatchedBattle = 907, + CantHaveMorePetsOfThatType = 908, + CantHaveMorePets = 909, + PvpMapNotFound = 910, + PvpMapNotSet = 911, + PetbattleQueueQueued = 912, + PetbattleQueueAlreadyQueued = 913, + PetbattleQueueJoinFailed = 914, + PetbattleQueueJournalLock = 915, + PetbattleQueueRemoved = 916, + PetbattleQueueProposalDeclined = 917, + PetbattleQueueProposalTimeout = 918, + PetbattleQueueOpponentDeclined = 919, + PetbattleQueueRequeuedInternal = 920, + PetbattleQueueRequeuedRemoved = 921, + PetbattleQueueSlotLocked = 922, + PetbattleQueueSlotEmpty = 923, + PetbattleQueueSlotNoTracker = 924, + PetbattleQueueSlotNoSpecies = 925, + PetbattleQueueSlotCantBattle = 926, + PetbattleQueueSlotRevoked = 927, + PetbattleQueueSlotDead = 928, + PetbattleQueueSlotNoPet = 929, + PetbattleQueueNotWhileNeutral = 930, + PetbattleGameTimeLimitWarning = 931, + PetbattleGameRoundsLimitWarning = 932, + HasRestriction = 933, + ItemUpgradeItemTooLowLevel = 934, + ItemUpgradeNoPath = 935, + ItemUpgradeNoMoreUpgrades = 936, + BonusRollEmpty = 937, + ChallengeModeFull = 938, + ChallengeModeInProgress = 939, + ChallengeModeIncorrectKeystone = 940, + BattletagFriendNotFound = 941, + BattletagFriendNotValid = 942, + BattletagFriendNotAllowed = 943, + BattletagFriendThrottled = 944, + BattletagFriendSuccess = 945, + PetTooHighLevelToUncage = 946, + PetbattleInternal = 947, + CantCagePetYet = 948, + NoLootInChallengeMode = 949, + QuestPetBattleVictoriesPvpIi = 950, + RoleCheckAlreadyInProgress = 951, + RecruitAFriendAccountLimit = 952, + RecruitAFriendFailed = 953, + SetLootPersonal = 954, + SetLootMethodFailedCombat = 955, + ReagentBankFull = 956, + ReagentBankLocked = 957, + GarrisonBuildingExists = 958, + GarrisonInvalidPlot = 959, + GarrisonInvalidBuildingid = 960, + GarrisonInvalidPlotBuilding = 961, + GarrisonRequiresBlueprint = 962, + GarrisonNotEnoughCurrency = 963, + GarrisonNotEnoughGold = 964, + GarrisonCompleteMissionWrongFollowerType = 965, + AlreadyUsingLfgList = 966, + RestrictedAccountLfgListTrial = 967, + ToyUseLimitReached = 968, + ToyAlreadyKnown = 969, + TransmogSetAlreadyKnown = 970, + NotEnoughCurrency = 971, + SpecIsDisabled = 972, + FeatureRestrictedTrial = 973, + CantBeObliterated = 974, + CantBeScrapped = 975, + ArtifactRelicDoesNotMatchArtifact = 976, + MustEquipArtifact = 977, + CantDoThatRightNow = 978, + AffectingCombat = 979, + EquipmentManagerCombatSwapS = 980, + EquipmentManagerBagsFull = 981, + EquipmentManagerMissingItemS = 982, + MovieRecordingWarningPerf = 983, + MovieRecordingWarningDiskFull = 984, + MovieRecordingWarningNoMovie = 985, + MovieRecordingWarningRequirements = 986, + MovieRecordingWarningCompressing = 987, + NoChallengeModeReward = 988, + ClaimedChallengeModeReward = 989, + ChallengeModePeriodResetSs = 990, + CantDoThatChallengeModeActive = 991, + TalentFailedRestArea = 992, + CannotAbandonLastPet = 993, + TestCvarSetSss = 994, + QuestTurnInFailReason = 995, + ClaimedChallengeModeRewardOld = 996, + TalentGrantedByAura = 997, + ChallengeModeAlreadyComplete = 998, + GlyphTargetNotAvailable = 999, + PvpWarmodeToggleOn = 1000, + PvpWarmodeToggleOff = 1001, + SpellFailedLevelRequirement = 1002, + BattlegroundJoinRequiresLevel = 1003, + BattlegroundJoinDisqualified = 1004, + VoiceChatGenericUnableToConnect = 1005, + VoiceChatServiceLost = 1006, + VoiceChatChannelNameTooShort = 1007, + VoiceChatChannelNameTooLong = 1008, + VoiceChatChannelAlreadyExists = 1009, + VoiceChatTargetNotFound = 1010, + VoiceChatTooManyRequests = 1011, + VoiceChatPlayerSilenced = 1012, + VoiceChatParentalDisableAll = 1013, + VoiceChatDisabled = 1014, + NoPvpReward = 1015, + ClaimedPvpReward = 1016, + AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1017, + AzeriteEssenceSelectionFailedCantRemoveEssence = 1018, + AzeriteEssenceSelectionFailedConditionFailed = 1019, + AzeriteEssenceSelectionFailedRestArea = 1020, + AzeriteEssenceSelectionFailedSlotLocked = 1021, + AzeriteEssenceSelectionFailedNotAtForge = 1022, + AzeriteEssenceSelectionFailedHeartLevelTooLow = 1023, + AzeriteEssenceSelectionFailedNotEquipped = 1024, + SocketingRequiresPunchcardredGem = 1025, + SocketingPunchcardredGemOnlyInPunchcardredslot = 1026, + SocketingRequiresPunchcardyellowGem = 1027, + SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1028, + SocketingRequiresPunchcardblueGem = 1029, + SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1030 } public enum SceneFlags @@ -2413,4 +2435,15 @@ namespace Framework.Constants Max } + + public enum ConversationActorType + { + WorldObjectActor = 0, + CreatureActor = 1 + } + + public enum CorpseDynFlags + { + Lootable = 0x0001 + } } diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs index 453add8e3..fd8e51f93 100644 --- a/Source/Framework/Constants/Spells/SpellConst.cs +++ b/Source/Framework/Constants/Spells/SpellConst.cs @@ -709,7 +709,8 @@ namespace Framework.Constants WrongFaction = 292, NotEnoughCurrency = 293, BattleForAzerothRidingRequirement = 294, - Unknown = 295, + MountEquipmentError = 295, + Unknown = 296, // Ok Cast Value - Here In Case A Future Version Removes Success And We Need To Use A Custom Value (Not Sent To Client Either Way) SpellCastOk = Success @@ -1711,7 +1712,7 @@ namespace Framework.Constants Unk4 = 0x10, // 4 AbsorbEnvironmentalDamage = 0x20, // 5 Unk6 = 0x40, // 6 - RankIgnoresCasterLevel = 0x80, // 7 Spell_C_GetSpellRank returns SpellLevels->MaxLevel * 5 instead of std::min(SpellLevels->MaxLevel, caster->Level) * 5 + RankIgnoresCasterLevel = 0x80, // 7 Spell_C_GetSpellRank returns SpellLevels.MaxLevel * 5 instead of std::min(SpellLevels.MaxLevel, caster.Level) * 5 Unk8 = 0x100, // 8 Unk9 = 0x200, // 9 Unk10 = 0x400, // 10 @@ -2090,7 +2091,17 @@ namespace Framework.Constants RespecAzeriteEmpoweredItem = 259, SummonStabledPet = 260, ScrapItem = 261, - TotalSpellEffects, + Unk262 = 262, + RepairItem = 263, + RemoveGem = 264, + LearnAzeriteEssencePower = 265, + Unk266 = 266, + Unk267 = 267, + ApplyMountEquipment = 268, + UpgradeItem = 269, + Unk270 = 270, + ApplyAreaAuraPartyNonrandom = 271, + TotalSpellEffects } public enum SpellEffectHandle diff --git a/Source/Framework/Constants/UnitConst.cs b/Source/Framework/Constants/UnitConst.cs index 56ef5012a..976e01baa 100644 --- a/Source/Framework/Constants/UnitConst.cs +++ b/Source/Framework/Constants/UnitConst.cs @@ -242,7 +242,7 @@ namespace Framework.Constants /// /// UnitStandStateType /// - public enum UnitStandStateType + public enum UnitStandStateType : byte { Stand = 0, Sit = 1, @@ -256,23 +256,7 @@ namespace Framework.Constants Submerged = 9 } - public struct UnitBytes0Offsets - { - public const byte Race = 0; - public const byte Class = 1; - public const byte PlayerClass = 2; - public const byte Gender = 3; - } - - public struct UnitBytes1Offsets - { - public const byte StandState = 0; - public const byte PetTalents = 1; // unused - public const byte VisFlag = 2; - public const byte AnimTier = 3; - } - - public enum UnitStandFlags + public enum UnitVisFlags { Unk1 = 0x01, Creep = 0x02, @@ -284,22 +268,16 @@ namespace Framework.Constants public enum UnitBytes1Flags { + None = 0x00, AlwaysStand = 0x01, Hover = 0x02, Unk3 = 0x04, All = 0xFF } - public struct UnitBytes2Offsets - { - public const byte SheathState = 0; - public const byte PvpFlag = 1; - public const byte PetFlags = 2; - public const byte ShapeshiftForm = 3; - } - - public enum UnitBytes2Flags + public enum UnitPVPStateFlags { + None = 0x00, PvP = 0x01, Unk1 = 0x02, FFAPvp = 0x04, @@ -310,8 +288,9 @@ namespace Framework.Constants Unk7 = 0x80, } - public enum UnitPetFlags - { + public enum UnitPetFlags : byte + { + None = 0x00, CanBeRenamed = 0x01, CanBeAbandoned = 0x02 } diff --git a/Source/Framework/Constants/Update/UpdateFieldFlags.cs b/Source/Framework/Constants/Update/UpdateFieldFlags.cs deleted file mode 100644 index c94564175..000000000 --- a/Source/Framework/Constants/Update/UpdateFieldFlags.cs +++ /dev/null @@ -1,6542 +0,0 @@ -/* - * Copyright (C) 2012-2019 CypherCore - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace Framework.Constants -{ - public class UpdateFieldFlags - { - public const uint None = 0x0; - public const uint Public = 0x1; - public const uint Private = 0x2; - public const uint Owner = 0x4; - public const uint ItemOwner = 0x8; - public const uint SpecialInfo = 0x10; - public const uint PartyMember = 0x20; - public const uint UnitAll = 0x40; - public const uint Dynamic = 0x80; - public const uint Unknownx100 = 0x100; - public const uint Urgent = 0x200; - public const uint UrgentSelfOnly = 0x400; - - public static uint[] ContainerUpdateFieldFlags = new uint[(int)ContainerFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // ITEM_FIELD_OWNER - Public, // ITEM_FIELD_OWNER+1 - Public, // ITEM_FIELD_OWNER+2 - Public, // ITEM_FIELD_OWNER+3 - Public, // ITEM_FIELD_CONTAINED - Public, // ITEM_FIELD_CONTAINED+1 - Public, // ITEM_FIELD_CONTAINED+2 - Public, // ITEM_FIELD_CONTAINED+3 - Public, // ITEM_FIELD_CREATOR - Public, // ITEM_FIELD_CREATOR+1 - Public, // ITEM_FIELD_CREATOR+2 - Public, // ITEM_FIELD_CREATOR+3 - Public, // ITEM_FIELD_GIFTCREATOR - Public, // ITEM_FIELD_GIFTCREATOR+1 - Public, // ITEM_FIELD_GIFTCREATOR+2 - Public, // ITEM_FIELD_GIFTCREATOR+3 - Owner, // ITEM_FIELD_STACK_COUNT - Owner, // ITEM_FIELD_DURATION - Owner, // ITEM_FIELD_SPELL_CHARGES - Owner, // ITEM_FIELD_SPELL_CHARGES+1 - Owner, // ITEM_FIELD_SPELL_CHARGES+2 - Owner, // ITEM_FIELD_SPELL_CHARGES+3 - Owner, // ITEM_FIELD_SPELL_CHARGES+4 - Public, // ITEM_FIELD_FLAGS - Public, // ITEM_FIELD_ENCHANTMENT - Public, // ITEM_FIELD_ENCHANTMENT+1 - Public, // ITEM_FIELD_ENCHANTMENT+2 - Public, // ITEM_FIELD_ENCHANTMENT+3 - Public, // ITEM_FIELD_ENCHANTMENT+4 - Public, // ITEM_FIELD_ENCHANTMENT+5 - Public, // ITEM_FIELD_ENCHANTMENT+6 - Public, // ITEM_FIELD_ENCHANTMENT+7 - Public, // ITEM_FIELD_ENCHANTMENT+8 - Public, // ITEM_FIELD_ENCHANTMENT+9 - Public, // ITEM_FIELD_ENCHANTMENT+10 - Public, // ITEM_FIELD_ENCHANTMENT+11 - Public, // ITEM_FIELD_ENCHANTMENT+12 - Public, // ITEM_FIELD_ENCHANTMENT+13 - Public, // ITEM_FIELD_ENCHANTMENT+14 - Public, // ITEM_FIELD_ENCHANTMENT+15 - Public, // ITEM_FIELD_ENCHANTMENT+16 - Public, // ITEM_FIELD_ENCHANTMENT+17 - Public, // ITEM_FIELD_ENCHANTMENT+18 - Public, // ITEM_FIELD_ENCHANTMENT+19 - Public, // ITEM_FIELD_ENCHANTMENT+20 - Public, // ITEM_FIELD_ENCHANTMENT+21 - Public, // ITEM_FIELD_ENCHANTMENT+22 - Public, // ITEM_FIELD_ENCHANTMENT+23 - Public, // ITEM_FIELD_ENCHANTMENT+24 - Public, // ITEM_FIELD_ENCHANTMENT+25 - Public, // ITEM_FIELD_ENCHANTMENT+26 - Public, // ITEM_FIELD_ENCHANTMENT+27 - Public, // ITEM_FIELD_ENCHANTMENT+28 - Public, // ITEM_FIELD_ENCHANTMENT+29 - Public, // ITEM_FIELD_ENCHANTMENT+30 - Public, // ITEM_FIELD_ENCHANTMENT+31 - Public, // ITEM_FIELD_ENCHANTMENT+32 - Public, // ITEM_FIELD_ENCHANTMENT+33 - Public, // ITEM_FIELD_ENCHANTMENT+34 - Public, // ITEM_FIELD_ENCHANTMENT+35 - Public, // ITEM_FIELD_ENCHANTMENT+36 - Public, // ITEM_FIELD_ENCHANTMENT+37 - Public, // ITEM_FIELD_ENCHANTMENT+38 - Public, // ITEM_FIELD_PROPERTY_SEED - Public, // ITEM_FIELD_RANDOM_PROPERTIES_ID - Owner, // ITEM_FIELD_DURABILITY - Owner, // ITEM_FIELD_MAXDURABILITY - Public, // ITEM_FIELD_CREATE_PLAYED_TIME - Owner, // ITEM_FIELD_MODIFIERS_MASK - Public, // ITEM_FIELD_CONTEXT - Owner, // ITEM_FIELD_ARTIFACT_XP - Owner, // ITEM_FIELD_ARTIFACT_XP+1 - Owner, // ITEM_FIELD_APPEARANCE_MOD_ID - Public, // CONTAINER_FIELD_SLOT_1 - Public, // CONTAINER_FIELD_SLOT_1+1 - Public, // CONTAINER_FIELD_SLOT_1+2 - Public, // CONTAINER_FIELD_SLOT_1+3 - Public, // CONTAINER_FIELD_SLOT_1+4 - Public, // CONTAINER_FIELD_SLOT_1+5 - Public, // CONTAINER_FIELD_SLOT_1+6 - Public, // CONTAINER_FIELD_SLOT_1+7 - Public, // CONTAINER_FIELD_SLOT_1+8 - Public, // CONTAINER_FIELD_SLOT_1+9 - Public, // CONTAINER_FIELD_SLOT_1+10 - Public, // CONTAINER_FIELD_SLOT_1+11 - Public, // CONTAINER_FIELD_SLOT_1+12 - Public, // CONTAINER_FIELD_SLOT_1+13 - Public, // CONTAINER_FIELD_SLOT_1+14 - Public, // CONTAINER_FIELD_SLOT_1+15 - Public, // CONTAINER_FIELD_SLOT_1+16 - Public, // CONTAINER_FIELD_SLOT_1+17 - Public, // CONTAINER_FIELD_SLOT_1+18 - Public, // CONTAINER_FIELD_SLOT_1+19 - Public, // CONTAINER_FIELD_SLOT_1+20 - Public, // CONTAINER_FIELD_SLOT_1+21 - Public, // CONTAINER_FIELD_SLOT_1+22 - Public, // CONTAINER_FIELD_SLOT_1+23 - Public, // CONTAINER_FIELD_SLOT_1+24 - Public, // CONTAINER_FIELD_SLOT_1+25 - Public, // CONTAINER_FIELD_SLOT_1+26 - Public, // CONTAINER_FIELD_SLOT_1+27 - Public, // CONTAINER_FIELD_SLOT_1+28 - Public, // CONTAINER_FIELD_SLOT_1+29 - Public, // CONTAINER_FIELD_SLOT_1+30 - Public, // CONTAINER_FIELD_SLOT_1+31 - Public, // CONTAINER_FIELD_SLOT_1+32 - Public, // CONTAINER_FIELD_SLOT_1+33 - Public, // CONTAINER_FIELD_SLOT_1+34 - Public, // CONTAINER_FIELD_SLOT_1+35 - Public, // CONTAINER_FIELD_SLOT_1+36 - Public, // CONTAINER_FIELD_SLOT_1+37 - Public, // CONTAINER_FIELD_SLOT_1+38 - Public, // CONTAINER_FIELD_SLOT_1+39 - Public, // CONTAINER_FIELD_SLOT_1+40 - Public, // CONTAINER_FIELD_SLOT_1+41 - Public, // CONTAINER_FIELD_SLOT_1+42 - Public, // CONTAINER_FIELD_SLOT_1+43 - Public, // CONTAINER_FIELD_SLOT_1+44 - Public, // CONTAINER_FIELD_SLOT_1+45 - Public, // CONTAINER_FIELD_SLOT_1+46 - Public, // CONTAINER_FIELD_SLOT_1+47 - Public, // CONTAINER_FIELD_SLOT_1+48 - Public, // CONTAINER_FIELD_SLOT_1+49 - Public, // CONTAINER_FIELD_SLOT_1+50 - Public, // CONTAINER_FIELD_SLOT_1+51 - Public, // CONTAINER_FIELD_SLOT_1+52 - Public, // CONTAINER_FIELD_SLOT_1+53 - Public, // CONTAINER_FIELD_SLOT_1+54 - Public, // CONTAINER_FIELD_SLOT_1+55 - Public, // CONTAINER_FIELD_SLOT_1+56 - Public, // CONTAINER_FIELD_SLOT_1+57 - Public, // CONTAINER_FIELD_SLOT_1+58 - Public, // CONTAINER_FIELD_SLOT_1+59 - Public, // CONTAINER_FIELD_SLOT_1+60 - Public, // CONTAINER_FIELD_SLOT_1+61 - Public, // CONTAINER_FIELD_SLOT_1+62 - Public, // CONTAINER_FIELD_SLOT_1+63 - Public, // CONTAINER_FIELD_SLOT_1+64 - Public, // CONTAINER_FIELD_SLOT_1+65 - Public, // CONTAINER_FIELD_SLOT_1+66 - Public, // CONTAINER_FIELD_SLOT_1+67 - Public, // CONTAINER_FIELD_SLOT_1+68 - Public, // CONTAINER_FIELD_SLOT_1+69 - Public, // CONTAINER_FIELD_SLOT_1+70 - Public, // CONTAINER_FIELD_SLOT_1+71 - Public, // CONTAINER_FIELD_SLOT_1+72 - Public, // CONTAINER_FIELD_SLOT_1+73 - Public, // CONTAINER_FIELD_SLOT_1+74 - Public, // CONTAINER_FIELD_SLOT_1+75 - Public, // CONTAINER_FIELD_SLOT_1+76 - Public, // CONTAINER_FIELD_SLOT_1+77 - Public, // CONTAINER_FIELD_SLOT_1+78 - Public, // CONTAINER_FIELD_SLOT_1+79 - Public, // CONTAINER_FIELD_SLOT_1+80 - Public, // CONTAINER_FIELD_SLOT_1+81 - Public, // CONTAINER_FIELD_SLOT_1+82 - Public, // CONTAINER_FIELD_SLOT_1+83 - Public, // CONTAINER_FIELD_SLOT_1+84 - Public, // CONTAINER_FIELD_SLOT_1+85 - Public, // CONTAINER_FIELD_SLOT_1+86 - Public, // CONTAINER_FIELD_SLOT_1+87 - Public, // CONTAINER_FIELD_SLOT_1+88 - Public, // CONTAINER_FIELD_SLOT_1+89 - Public, // CONTAINER_FIELD_SLOT_1+90 - Public, // CONTAINER_FIELD_SLOT_1+91 - Public, // CONTAINER_FIELD_SLOT_1+92 - Public, // CONTAINER_FIELD_SLOT_1+93 - Public, // CONTAINER_FIELD_SLOT_1+94 - Public, // CONTAINER_FIELD_SLOT_1+95 - Public, // CONTAINER_FIELD_SLOT_1+96 - Public, // CONTAINER_FIELD_SLOT_1+97 - Public, // CONTAINER_FIELD_SLOT_1+98 - Public, // CONTAINER_FIELD_SLOT_1+99 - Public, // CONTAINER_FIELD_SLOT_1+100 - Public, // CONTAINER_FIELD_SLOT_1+101 - Public, // CONTAINER_FIELD_SLOT_1+102 - Public, // CONTAINER_FIELD_SLOT_1+103 - Public, // CONTAINER_FIELD_SLOT_1+104 - Public, // CONTAINER_FIELD_SLOT_1+105 - Public, // CONTAINER_FIELD_SLOT_1+106 - Public, // CONTAINER_FIELD_SLOT_1+107 - Public, // CONTAINER_FIELD_SLOT_1+108 - Public, // CONTAINER_FIELD_SLOT_1+109 - Public, // CONTAINER_FIELD_SLOT_1+110 - Public, // CONTAINER_FIELD_SLOT_1+111 - Public, // CONTAINER_FIELD_SLOT_1+112 - Public, // CONTAINER_FIELD_SLOT_1+113 - Public, // CONTAINER_FIELD_SLOT_1+114 - Public, // CONTAINER_FIELD_SLOT_1+115 - Public, // CONTAINER_FIELD_SLOT_1+116 - Public, // CONTAINER_FIELD_SLOT_1+117 - Public, // CONTAINER_FIELD_SLOT_1+118 - Public, // CONTAINER_FIELD_SLOT_1+119 - Public, // CONTAINER_FIELD_SLOT_1+120 - Public, // CONTAINER_FIELD_SLOT_1+121 - Public, // CONTAINER_FIELD_SLOT_1+122 - Public, // CONTAINER_FIELD_SLOT_1+123 - Public, // CONTAINER_FIELD_SLOT_1+124 - Public, // CONTAINER_FIELD_SLOT_1+125 - Public, // CONTAINER_FIELD_SLOT_1+126 - Public, // CONTAINER_FIELD_SLOT_1+127 - Public, // CONTAINER_FIELD_SLOT_1+128 - Public, // CONTAINER_FIELD_SLOT_1+129 - Public, // CONTAINER_FIELD_SLOT_1+130 - Public, // CONTAINER_FIELD_SLOT_1+131 - Public, // CONTAINER_FIELD_SLOT_1+132 - Public, // CONTAINER_FIELD_SLOT_1+133 - Public, // CONTAINER_FIELD_SLOT_1+134 - Public, // CONTAINER_FIELD_SLOT_1+135 - Public, // CONTAINER_FIELD_SLOT_1+136 - Public, // CONTAINER_FIELD_SLOT_1+137 - Public, // CONTAINER_FIELD_SLOT_1+138 - Public, // CONTAINER_FIELD_SLOT_1+139 - Public, // CONTAINER_FIELD_SLOT_1+140 - Public, // CONTAINER_FIELD_SLOT_1+141 - Public, // CONTAINER_FIELD_SLOT_1+142 - Public, // CONTAINER_FIELD_SLOT_1+143 - Public, // CONTAINER_FIELD_NUM_SLOTS - }; - - public static uint[] AzeriteEmpoweredItemUpdateFieldFlags = new uint[(int)AzeriteEmpoweredItemFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // ITEM_FIELD_OWNER - Public, // ITEM_FIELD_OWNER+1 - Public, // ITEM_FIELD_OWNER+2 - Public, // ITEM_FIELD_OWNER+3 - Public, // ITEM_FIELD_CONTAINED - Public, // ITEM_FIELD_CONTAINED+1 - Public, // ITEM_FIELD_CONTAINED+2 - Public, // ITEM_FIELD_CONTAINED+3 - Public, // ITEM_FIELD_CREATOR - Public, // ITEM_FIELD_CREATOR+1 - Public, // ITEM_FIELD_CREATOR+2 - Public, // ITEM_FIELD_CREATOR+3 - Public, // ITEM_FIELD_GIFTCREATOR - Public, // ITEM_FIELD_GIFTCREATOR+1 - Public, // ITEM_FIELD_GIFTCREATOR+2 - Public, // ITEM_FIELD_GIFTCREATOR+3 - Owner, // ITEM_FIELD_STACK_COUNT - Owner, // ITEM_FIELD_DURATION - Owner, // ITEM_FIELD_SPELL_CHARGES - Owner, // ITEM_FIELD_SPELL_CHARGES+1 - Owner, // ITEM_FIELD_SPELL_CHARGES+2 - Owner, // ITEM_FIELD_SPELL_CHARGES+3 - Owner, // ITEM_FIELD_SPELL_CHARGES+4 - Public, // ITEM_FIELD_FLAGS - Public, // ITEM_FIELD_ENCHANTMENT - Public, // ITEM_FIELD_ENCHANTMENT+1 - Public, // ITEM_FIELD_ENCHANTMENT+2 - Public, // ITEM_FIELD_ENCHANTMENT+3 - Public, // ITEM_FIELD_ENCHANTMENT+4 - Public, // ITEM_FIELD_ENCHANTMENT+5 - Public, // ITEM_FIELD_ENCHANTMENT+6 - Public, // ITEM_FIELD_ENCHANTMENT+7 - Public, // ITEM_FIELD_ENCHANTMENT+8 - Public, // ITEM_FIELD_ENCHANTMENT+9 - Public, // ITEM_FIELD_ENCHANTMENT+10 - Public, // ITEM_FIELD_ENCHANTMENT+11 - Public, // ITEM_FIELD_ENCHANTMENT+12 - Public, // ITEM_FIELD_ENCHANTMENT+13 - Public, // ITEM_FIELD_ENCHANTMENT+14 - Public, // ITEM_FIELD_ENCHANTMENT+15 - Public, // ITEM_FIELD_ENCHANTMENT+16 - Public, // ITEM_FIELD_ENCHANTMENT+17 - Public, // ITEM_FIELD_ENCHANTMENT+18 - Public, // ITEM_FIELD_ENCHANTMENT+19 - Public, // ITEM_FIELD_ENCHANTMENT+20 - Public, // ITEM_FIELD_ENCHANTMENT+21 - Public, // ITEM_FIELD_ENCHANTMENT+22 - Public, // ITEM_FIELD_ENCHANTMENT+23 - Public, // ITEM_FIELD_ENCHANTMENT+24 - Public, // ITEM_FIELD_ENCHANTMENT+25 - Public, // ITEM_FIELD_ENCHANTMENT+26 - Public, // ITEM_FIELD_ENCHANTMENT+27 - Public, // ITEM_FIELD_ENCHANTMENT+28 - Public, // ITEM_FIELD_ENCHANTMENT+29 - Public, // ITEM_FIELD_ENCHANTMENT+30 - Public, // ITEM_FIELD_ENCHANTMENT+31 - Public, // ITEM_FIELD_ENCHANTMENT+32 - Public, // ITEM_FIELD_ENCHANTMENT+33 - Public, // ITEM_FIELD_ENCHANTMENT+34 - Public, // ITEM_FIELD_ENCHANTMENT+35 - Public, // ITEM_FIELD_ENCHANTMENT+36 - Public, // ITEM_FIELD_ENCHANTMENT+37 - Public, // ITEM_FIELD_ENCHANTMENT+38 - Public, // ITEM_FIELD_PROPERTY_SEED - Public, // ITEM_FIELD_RANDOM_PROPERTIES_ID - Owner, // ITEM_FIELD_DURABILITY - Owner, // ITEM_FIELD_MAXDURABILITY - Public, // ITEM_FIELD_CREATE_PLAYED_TIME - Owner, // ITEM_FIELD_MODIFIERS_MASK - Public, // ITEM_FIELD_CONTEXT - Owner, // ITEM_FIELD_ARTIFACT_XP - Owner, // ITEM_FIELD_ARTIFACT_XP+1 - Owner, // ITEM_FIELD_APPEARANCE_MOD_ID - Public, // AZERITE_EMPOWERED_ITEM_FIELD_SELECTIONS - Public, // AZERITE_EMPOWERED_ITEM_FIELD_SELECTIONS+1 - Public, // AZERITE_EMPOWERED_ITEM_FIELD_SELECTIONS+2 - Public, // AZERITE_EMPOWERED_ITEM_FIELD_SELECTIONS+3 - }; - - public static uint[] AzeriteItemUpdateFieldFlags = new uint[(int)AzeriteItemFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // ITEM_FIELD_OWNER - Public, // ITEM_FIELD_OWNER+1 - Public, // ITEM_FIELD_OWNER+2 - Public, // ITEM_FIELD_OWNER+3 - Public, // ITEM_FIELD_CONTAINED - Public, // ITEM_FIELD_CONTAINED+1 - Public, // ITEM_FIELD_CONTAINED+2 - Public, // ITEM_FIELD_CONTAINED+3 - Public, // ITEM_FIELD_CREATOR - Public, // ITEM_FIELD_CREATOR+1 - Public, // ITEM_FIELD_CREATOR+2 - Public, // ITEM_FIELD_CREATOR+3 - Public, // ITEM_FIELD_GIFTCREATOR - Public, // ITEM_FIELD_GIFTCREATOR+1 - Public, // ITEM_FIELD_GIFTCREATOR+2 - Public, // ITEM_FIELD_GIFTCREATOR+3 - Owner, // ITEM_FIELD_STACK_COUNT - Owner, // ITEM_FIELD_DURATION - Owner, // ITEM_FIELD_SPELL_CHARGES - Owner, // ITEM_FIELD_SPELL_CHARGES+1 - Owner, // ITEM_FIELD_SPELL_CHARGES+2 - Owner, // ITEM_FIELD_SPELL_CHARGES+3 - Owner, // ITEM_FIELD_SPELL_CHARGES+4 - Public, // ITEM_FIELD_FLAGS - Public, // ITEM_FIELD_ENCHANTMENT - Public, // ITEM_FIELD_ENCHANTMENT+1 - Public, // ITEM_FIELD_ENCHANTMENT+2 - Public, // ITEM_FIELD_ENCHANTMENT+3 - Public, // ITEM_FIELD_ENCHANTMENT+4 - Public, // ITEM_FIELD_ENCHANTMENT+5 - Public, // ITEM_FIELD_ENCHANTMENT+6 - Public, // ITEM_FIELD_ENCHANTMENT+7 - Public, // ITEM_FIELD_ENCHANTMENT+8 - Public, // ITEM_FIELD_ENCHANTMENT+9 - Public, // ITEM_FIELD_ENCHANTMENT+10 - Public, // ITEM_FIELD_ENCHANTMENT+11 - Public, // ITEM_FIELD_ENCHANTMENT+12 - Public, // ITEM_FIELD_ENCHANTMENT+13 - Public, // ITEM_FIELD_ENCHANTMENT+14 - Public, // ITEM_FIELD_ENCHANTMENT+15 - Public, // ITEM_FIELD_ENCHANTMENT+16 - Public, // ITEM_FIELD_ENCHANTMENT+17 - Public, // ITEM_FIELD_ENCHANTMENT+18 - Public, // ITEM_FIELD_ENCHANTMENT+19 - Public, // ITEM_FIELD_ENCHANTMENT+20 - Public, // ITEM_FIELD_ENCHANTMENT+21 - Public, // ITEM_FIELD_ENCHANTMENT+22 - Public, // ITEM_FIELD_ENCHANTMENT+23 - Public, // ITEM_FIELD_ENCHANTMENT+24 - Public, // ITEM_FIELD_ENCHANTMENT+25 - Public, // ITEM_FIELD_ENCHANTMENT+26 - Public, // ITEM_FIELD_ENCHANTMENT+27 - Public, // ITEM_FIELD_ENCHANTMENT+28 - Public, // ITEM_FIELD_ENCHANTMENT+29 - Public, // ITEM_FIELD_ENCHANTMENT+30 - Public, // ITEM_FIELD_ENCHANTMENT+31 - Public, // ITEM_FIELD_ENCHANTMENT+32 - Public, // ITEM_FIELD_ENCHANTMENT+33 - Public, // ITEM_FIELD_ENCHANTMENT+34 - Public, // ITEM_FIELD_ENCHANTMENT+35 - Public, // ITEM_FIELD_ENCHANTMENT+36 - Public, // ITEM_FIELD_ENCHANTMENT+37 - Public, // ITEM_FIELD_ENCHANTMENT+38 - Public, // ITEM_FIELD_PROPERTY_SEED - Public, // ITEM_FIELD_RANDOM_PROPERTIES_ID - Owner, // ITEM_FIELD_DURABILITY - Owner, // ITEM_FIELD_MAXDURABILITY - Public, // ITEM_FIELD_CREATE_PLAYED_TIME - Owner, // ITEM_FIELD_MODIFIERS_MASK - Public, // ITEM_FIELD_CONTEXT - Owner, // ITEM_FIELD_ARTIFACT_XP - Owner, // ITEM_FIELD_ARTIFACT_XP+1 - Owner, // ITEM_FIELD_APPEARANCE_MOD_ID - Public, // AZERITE_ITEM_FIELD_XP - Public, // AZERITE_ITEM_FIELD_XP+1 - Public, // AZERITE_ITEM_FIELD_LEVEL - Public, // AZERITE_ITEM_FIELD_AURA_LEVEL - Owner, // AZERITE_ITEM_FIELD_KNOWLEDGE_LEVEL - Owner, // AZERITE_ITEM_FIELD_DEBUG_KNOWLEDGE_WEEK - }; - - public static uint[] ItemDynamicUpdateFieldFlags = new uint[(int)ItemDynamicFields.End] - { - Owner, // ITEM_DYNAMIC_FIELD_MODIFIERS - Owner | Unknownx100, // ITEM_DYNAMIC_FIELD_BONUSLIST_IDS - Owner, // ITEM_DYNAMIC_FIELD_ARTIFACT_POWERS - Owner, // ITEM_DYNAMIC_FIELD_GEMS - }; - - public static uint[] UnitUpdateFieldFlags = new uint[(int)ActivePlayerFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // UNIT_FIELD_CHARM - Public, // UNIT_FIELD_CHARM+1 - Public, // UNIT_FIELD_CHARM+2 - Public, // UNIT_FIELD_CHARM+3 - Public, // UNIT_FIELD_SUMMON - Public, // UNIT_FIELD_SUMMON+1 - Public, // UNIT_FIELD_SUMMON+2 - Public, // UNIT_FIELD_SUMMON+3 - Private, // UNIT_FIELD_CRITTER - Private, // UNIT_FIELD_CRITTER+1 - Private, // UNIT_FIELD_CRITTER+2 - Private, // UNIT_FIELD_CRITTER+3 - Public, // UNIT_FIELD_CHARMEDBY - Public, // UNIT_FIELD_CHARMEDBY+1 - Public, // UNIT_FIELD_CHARMEDBY+2 - Public, // UNIT_FIELD_CHARMEDBY+3 - Public, // UNIT_FIELD_SUMMONEDBY - Public, // UNIT_FIELD_SUMMONEDBY+1 - Public, // UNIT_FIELD_SUMMONEDBY+2 - Public, // UNIT_FIELD_SUMMONEDBY+3 - Public, // UNIT_FIELD_CREATEDBY - Public, // UNIT_FIELD_CREATEDBY+1 - Public, // UNIT_FIELD_CREATEDBY+2 - Public, // UNIT_FIELD_CREATEDBY+3 - Public, // UNIT_FIELD_DEMON_CREATOR - Public, // UNIT_FIELD_DEMON_CREATOR+1 - Public, // UNIT_FIELD_DEMON_CREATOR+2 - Public, // UNIT_FIELD_DEMON_CREATOR+3 - Public, // UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET - Public, // UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET+1 - Public, // UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET+2 - Public, // UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET+3 - Public, // UNIT_FIELD_TARGET - Public, // UNIT_FIELD_TARGET+1 - Public, // UNIT_FIELD_TARGET+2 - Public, // UNIT_FIELD_TARGET+3 - Public, // UNIT_FIELD_BATTLE_PET_COMPANION_GUID - Public, // UNIT_FIELD_BATTLE_PET_COMPANION_GUID+1 - Public, // UNIT_FIELD_BATTLE_PET_COMPANION_GUID+2 - Public, // UNIT_FIELD_BATTLE_PET_COMPANION_GUID+3 - Public, // UNIT_FIELD_BATTLE_PET_DB_ID - Public, // UNIT_FIELD_BATTLE_PET_DB_ID+1 - Public | Urgent, // UNIT_FIELD_CHANNEL_DATA - Public | Urgent, // UNIT_FIELD_CHANNEL_DATA+1 - Public, // UNIT_FIELD_SUMMONED_BY_HOME_REALM - Public, // UNIT_FIELD_BYTES_0 - Public, // UNIT_FIELD_DISPLAY_POWER - Public, // UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID - Public, // UNIT_FIELD_HEALTH - Public, // UNIT_FIELD_HEALTH+1 - Public | UrgentSelfOnly, // UNIT_FIELD_POWER - Public | UrgentSelfOnly, // UNIT_FIELD_POWER+1 - Public | UrgentSelfOnly, // UNIT_FIELD_POWER+2 - Public | UrgentSelfOnly, // UNIT_FIELD_POWER+3 - Public | UrgentSelfOnly, // UNIT_FIELD_POWER+4 - Public | UrgentSelfOnly, // UNIT_FIELD_POWER+5 - Public, // UNIT_FIELD_MAXHEALTH - Public, // UNIT_FIELD_MAXHEALTH+1 - Public, // UNIT_FIELD_MAXPOWER - Public, // UNIT_FIELD_MAXPOWER+1 - Public, // UNIT_FIELD_MAXPOWER+2 - Public, // UNIT_FIELD_MAXPOWER+3 - Public, // UNIT_FIELD_MAXPOWER+4 - Public, // UNIT_FIELD_MAXPOWER+5 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+1 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+2 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+3 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+4 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER+5 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+1 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+2 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+3 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+4 - Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+5 - Public, // UNIT_FIELD_LEVEL - Public, // UNIT_FIELD_EFFECTIVE_LEVEL - Public, // UNIT_FIELD_CONTENT_TUNING_ID - Public, // UNIT_FIELD_SCALING_LEVEL_MIN - Public, // UNIT_FIELD_SCALING_LEVEL_MAX - Public, // UNIT_FIELD_SCALING_LEVEL_DELTA - Public, // UNIT_FIELD_SCALING_FACTION_GROUP - Public, // UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID - Public, // UNIT_FIELD_SCALING_DAMAGE_ITEM_LEVEL_CURVE_ID - Public, // UNIT_FIELD_FACTIONTEMPLATE - Public, // UNIT_VIRTUAL_ITEM_SLOT_ID - Public, // UNIT_VIRTUAL_ITEM_SLOT_ID+1 - Public, // UNIT_VIRTUAL_ITEM_SLOT_ID+2 - Public, // UNIT_VIRTUAL_ITEM_SLOT_ID+3 - Public, // UNIT_VIRTUAL_ITEM_SLOT_ID+4 - Public, // UNIT_VIRTUAL_ITEM_SLOT_ID+5 - Public | Urgent, // UNIT_FIELD_FLAGS - Public | Urgent, // UNIT_FIELD_FLAGS_2 - Public | Urgent, // UNIT_FIELD_FLAGS_3 - Public, // UNIT_FIELD_AURASTATE - Public, // UNIT_FIELD_BASEATTACKTIME - Public, // UNIT_FIELD_BASEATTACKTIME+1 - Private, // UNIT_FIELD_RANGEDATTACKTIME - Public, // UNIT_FIELD_BOUNDINGRADIUS - Public, // UNIT_FIELD_COMBATREACH - Dynamic | Urgent, // UNIT_FIELD_DISPLAYID - Dynamic | Urgent, // UNIT_FIELD_DISPLAY_SCALE - Public | Urgent, // UNIT_FIELD_NATIVEDISPLAYID - Public | Urgent, // UNIT_FIELD_NATIVE_X_DISPLAY_SCALE - Public | Urgent, // UNIT_FIELD_MOUNTDISPLAYID - Private | Owner | SpecialInfo, // UNIT_FIELD_MINDAMAGE - Private | Owner | SpecialInfo, // UNIT_FIELD_MAXDAMAGE - Private | Owner | SpecialInfo, // UNIT_FIELD_MINOFFHANDDAMAGE - Private | Owner | SpecialInfo, // UNIT_FIELD_MAXOFFHANDDAMAGE - Public, // UNIT_FIELD_BYTES_1 - Public, // UNIT_FIELD_PETNUMBER - Public, // UNIT_FIELD_PET_NAME_TIMESTAMP - Owner, // UNIT_FIELD_PETEXPERIENCE - Owner, // UNIT_FIELD_PETNEXTLEVELEXP - Public, // UNIT_MOD_CAST_SPEED - Public, // UNIT_MOD_CAST_HASTE - Public, // UNIT_FIELD_MOD_HASTE - Public, // UNIT_FIELD_MOD_RANGED_HASTE - Public, // UNIT_FIELD_MOD_HASTE_REGEN - Public, // UNIT_FIELD_MOD_TIME_RATE - Public, // UNIT_CREATED_BY_SPELL - Public | Dynamic, // UNIT_NPC_FLAGS - Public | Dynamic, // UNIT_NPC_FLAGS+1 - Public, // UNIT_NPC_EMOTESTATE - Private | Owner, // UNIT_FIELD_STAT - Private | Owner, // UNIT_FIELD_STAT+1 - Private | Owner, // UNIT_FIELD_STAT+2 - Private | Owner, // UNIT_FIELD_STAT+3 - Private | Owner, // UNIT_FIELD_POSSTAT - Private | Owner, // UNIT_FIELD_POSSTAT+1 - Private | Owner, // UNIT_FIELD_POSSTAT+2 - Private | Owner, // UNIT_FIELD_POSSTAT+3 - Private | Owner, // UNIT_FIELD_NEGSTAT - Private | Owner, // UNIT_FIELD_NEGSTAT+1 - Private | Owner, // UNIT_FIELD_NEGSTAT+2 - Private | Owner, // UNIT_FIELD_NEGSTAT+3 - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES+1 - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES+2 - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES+3 - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES+4 - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES+5 - Private | Owner | SpecialInfo, // UNIT_FIELD_RESISTANCES+6 - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS+1 - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS+2 - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS+3 - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS+4 - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS+5 - Private | Owner, // UNIT_FIELD_BONUS_RESISTANCE_MODS+6 - Public, // UNIT_FIELD_BASE_MANA - Private | Owner, // UNIT_FIELD_BASE_HEALTH - Public, // UNIT_FIELD_BYTES_2 - Private | Owner, // UNIT_FIELD_ATTACK_POWER - Private | Owner, // UNIT_FIELD_ATTACK_POWER_MOD_POS - Private | Owner, // UNIT_FIELD_ATTACK_POWER_MOD_NEG - Private | Owner, // UNIT_FIELD_ATTACK_POWER_MULTIPLIER - Private | Owner, // UNIT_FIELD_RANGED_ATTACK_POWER - Private | Owner, // UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS - Private | Owner, // UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG - Private | Owner, // UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER - Private | Owner, // UNIT_FIELD_MAIN_HAND_WEAPON_ATTACK_POWER - Private | Owner, // UNIT_FIELD_OFF_HAND_WEAPON_ATTACK_POWER - Private | Owner, // UNIT_FIELD_RANGED_HAND_WEAPON_ATTACK_POWER - Private | Owner, // UNIT_FIELD_ATTACK_SPEED_AURA - Private | Owner, // UNIT_FIELD_LIFESTEAL - Private | Owner, // UNIT_FIELD_MINRANGEDDAMAGE - Private | Owner, // UNIT_FIELD_MAXRANGEDDAMAGE - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER+1 - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER+2 - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER+3 - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER+4 - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER+5 - Private | Owner, // UNIT_FIELD_POWER_COST_MODIFIER+6 - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER+1 - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER+2 - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER+3 - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER+4 - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER+5 - Private | Owner, // UNIT_FIELD_POWER_COST_MULTIPLIER+6 - Private | Owner, // UNIT_FIELD_MAXHEALTHMODIFIER - Public, // UNIT_FIELD_HOVERHEIGHT - Public, // UNIT_FIELD_MIN_ITEM_LEVEL_CUTOFF - Public, // UNIT_FIELD_MIN_ITEM_LEVEL - Public, // UNIT_FIELD_MAXITEMLEVEL - Public, // UNIT_FIELD_WILD_BATTLEPET_LEVEL - Public, // UNIT_FIELD_BATTLEPET_COMPANION_NAME_TIMESTAMP - Public, // UNIT_FIELD_INTERACT_SPELLID - Dynamic | Urgent, // UNIT_FIELD_STATE_SPELL_VISUAL_ID - Dynamic | Urgent, // UNIT_FIELD_STATE_ANIM_ID - Dynamic | Urgent, // UNIT_FIELD_STATE_ANIM_KIT_ID - Dynamic | Urgent, // UNIT_FIELD_STATE_WORLD_EFFECT_ID - Dynamic | Urgent, // UNIT_FIELD_STATE_WORLD_EFFECT_ID+1 - Dynamic | Urgent, // UNIT_FIELD_STATE_WORLD_EFFECT_ID+2 - Dynamic | Urgent, // UNIT_FIELD_STATE_WORLD_EFFECT_ID+3 - Public, // UNIT_FIELD_SCALE_DURATION - Public, // UNIT_FIELD_LOOKS_LIKE_MOUNT_ID - Public, // UNIT_FIELD_LOOKS_LIKE_CREATURE_ID - Public, // UNIT_FIELD_LOOK_AT_CONTROLLER_ID - Public, // UNIT_FIELD_GUILD_GUID - Public, // UNIT_FIELD_GUILD_GUID+1 - Public, // UNIT_FIELD_GUILD_GUID+2 - Public, // UNIT_FIELD_GUILD_GUID+3 - Public, // PLAYER_DUEL_ARBITER - Public, // PLAYER_DUEL_ARBITER+1 - Public, // PLAYER_DUEL_ARBITER+2 - Public, // PLAYER_DUEL_ARBITER+3 - Public, // PLAYER_WOW_ACCOUNT - Public, // PLAYER_WOW_ACCOUNT+1 - Public, // PLAYER_WOW_ACCOUNT+2 - Public, // PLAYER_WOW_ACCOUNT+3 - Public, // PLAYER_LOOT_TARGET_GUID - Public, // PLAYER_LOOT_TARGET_GUID+1 - Public, // PLAYER_LOOT_TARGET_GUID+2 - Public, // PLAYER_LOOT_TARGET_GUID+3 - Public, // PLAYER_FLAGS - Public, // PLAYER_FLAGS_EX - Public, // PLAYER_GUILDRANK - Public, // PLAYER_GUILDDELETE_DATE - Public, // PLAYER_GUILDLEVEL - Public, // PLAYER_BYTES - Public, // PLAYER_BYTES_2 - Public, // PLAYER_BYTES_3 - Public, // PLAYER_BYTES_4 - Public, // PLAYER_DUEL_TEAM - Public, // PLAYER_GUILD_TIMESTAMP - PartyMember, // PLAYER_QUEST_LOG - PartyMember, // PLAYER_QUEST_LOG+1 - PartyMember, // PLAYER_QUEST_LOG+2 - PartyMember, // PLAYER_QUEST_LOG+3 - PartyMember, // PLAYER_QUEST_LOG+4 - PartyMember, // PLAYER_QUEST_LOG+5 - PartyMember, // PLAYER_QUEST_LOG+6 - PartyMember, // PLAYER_QUEST_LOG+7 - PartyMember, // PLAYER_QUEST_LOG+8 - PartyMember, // PLAYER_QUEST_LOG+9 - PartyMember, // PLAYER_QUEST_LOG+10 - PartyMember, // PLAYER_QUEST_LOG+11 - PartyMember, // PLAYER_QUEST_LOG+12 - PartyMember, // PLAYER_QUEST_LOG+13 - PartyMember, // PLAYER_QUEST_LOG+14 - PartyMember, // PLAYER_QUEST_LOG+15 - PartyMember, // PLAYER_QUEST_LOG+16 - PartyMember, // PLAYER_QUEST_LOG+17 - PartyMember, // PLAYER_QUEST_LOG+18 - PartyMember, // PLAYER_QUEST_LOG+19 - PartyMember, // PLAYER_QUEST_LOG+20 - PartyMember, // PLAYER_QUEST_LOG+21 - PartyMember, // PLAYER_QUEST_LOG+22 - PartyMember, // PLAYER_QUEST_LOG+23 - PartyMember, // PLAYER_QUEST_LOG+24 - PartyMember, // PLAYER_QUEST_LOG+25 - PartyMember, // PLAYER_QUEST_LOG+26 - PartyMember, // PLAYER_QUEST_LOG+27 - PartyMember, // PLAYER_QUEST_LOG+28 - PartyMember, // PLAYER_QUEST_LOG+29 - PartyMember, // PLAYER_QUEST_LOG+30 - PartyMember, // PLAYER_QUEST_LOG+31 - PartyMember, // PLAYER_QUEST_LOG+32 - PartyMember, // PLAYER_QUEST_LOG+33 - PartyMember, // PLAYER_QUEST_LOG+34 - PartyMember, // PLAYER_QUEST_LOG+35 - PartyMember, // PLAYER_QUEST_LOG+36 - PartyMember, // PLAYER_QUEST_LOG+37 - PartyMember, // PLAYER_QUEST_LOG+38 - PartyMember, // PLAYER_QUEST_LOG+39 - PartyMember, // PLAYER_QUEST_LOG+40 - PartyMember, // PLAYER_QUEST_LOG+41 - PartyMember, // PLAYER_QUEST_LOG+42 - PartyMember, // PLAYER_QUEST_LOG+43 - PartyMember, // PLAYER_QUEST_LOG+44 - PartyMember, // PLAYER_QUEST_LOG+45 - PartyMember, // PLAYER_QUEST_LOG+46 - PartyMember, // PLAYER_QUEST_LOG+47 - PartyMember, // PLAYER_QUEST_LOG+48 - PartyMember, // PLAYER_QUEST_LOG+49 - PartyMember, // PLAYER_QUEST_LOG+50 - PartyMember, // PLAYER_QUEST_LOG+51 - PartyMember, // PLAYER_QUEST_LOG+52 - PartyMember, // PLAYER_QUEST_LOG+53 - PartyMember, // PLAYER_QUEST_LOG+54 - PartyMember, // PLAYER_QUEST_LOG+55 - PartyMember, // PLAYER_QUEST_LOG+56 - PartyMember, // PLAYER_QUEST_LOG+57 - PartyMember, // PLAYER_QUEST_LOG+58 - PartyMember, // PLAYER_QUEST_LOG+59 - PartyMember, // PLAYER_QUEST_LOG+60 - PartyMember, // PLAYER_QUEST_LOG+61 - PartyMember, // PLAYER_QUEST_LOG+62 - PartyMember, // PLAYER_QUEST_LOG+63 - PartyMember, // PLAYER_QUEST_LOG+64 - PartyMember, // PLAYER_QUEST_LOG+65 - PartyMember, // PLAYER_QUEST_LOG+66 - PartyMember, // PLAYER_QUEST_LOG+67 - PartyMember, // PLAYER_QUEST_LOG+68 - PartyMember, // PLAYER_QUEST_LOG+69 - PartyMember, // PLAYER_QUEST_LOG+70 - PartyMember, // PLAYER_QUEST_LOG+71 - PartyMember, // PLAYER_QUEST_LOG+72 - PartyMember, // PLAYER_QUEST_LOG+73 - PartyMember, // PLAYER_QUEST_LOG+74 - PartyMember, // PLAYER_QUEST_LOG+75 - PartyMember, // PLAYER_QUEST_LOG+76 - PartyMember, // PLAYER_QUEST_LOG+77 - PartyMember, // PLAYER_QUEST_LOG+78 - PartyMember, // PLAYER_QUEST_LOG+79 - PartyMember, // PLAYER_QUEST_LOG+80 - PartyMember, // PLAYER_QUEST_LOG+81 - PartyMember, // PLAYER_QUEST_LOG+82 - PartyMember, // PLAYER_QUEST_LOG+83 - PartyMember, // PLAYER_QUEST_LOG+84 - PartyMember, // PLAYER_QUEST_LOG+85 - PartyMember, // PLAYER_QUEST_LOG+86 - PartyMember, // PLAYER_QUEST_LOG+87 - PartyMember, // PLAYER_QUEST_LOG+88 - PartyMember, // PLAYER_QUEST_LOG+89 - PartyMember, // PLAYER_QUEST_LOG+90 - PartyMember, // PLAYER_QUEST_LOG+91 - PartyMember, // PLAYER_QUEST_LOG+92 - PartyMember, // PLAYER_QUEST_LOG+93 - PartyMember, // PLAYER_QUEST_LOG+94 - PartyMember, // PLAYER_QUEST_LOG+95 - PartyMember, // PLAYER_QUEST_LOG+96 - PartyMember, // PLAYER_QUEST_LOG+97 - PartyMember, // PLAYER_QUEST_LOG+98 - PartyMember, // PLAYER_QUEST_LOG+99 - PartyMember, // PLAYER_QUEST_LOG+100 - PartyMember, // PLAYER_QUEST_LOG+101 - PartyMember, // PLAYER_QUEST_LOG+102 - PartyMember, // PLAYER_QUEST_LOG+103 - PartyMember, // PLAYER_QUEST_LOG+104 - PartyMember, // PLAYER_QUEST_LOG+105 - PartyMember, // PLAYER_QUEST_LOG+106 - PartyMember, // PLAYER_QUEST_LOG+107 - PartyMember, // PLAYER_QUEST_LOG+108 - PartyMember, // PLAYER_QUEST_LOG+109 - PartyMember, // PLAYER_QUEST_LOG+110 - PartyMember, // PLAYER_QUEST_LOG+111 - PartyMember, // PLAYER_QUEST_LOG+112 - PartyMember, // PLAYER_QUEST_LOG+113 - PartyMember, // PLAYER_QUEST_LOG+114 - PartyMember, // PLAYER_QUEST_LOG+115 - PartyMember, // PLAYER_QUEST_LOG+116 - PartyMember, // PLAYER_QUEST_LOG+117 - PartyMember, // PLAYER_QUEST_LOG+118 - PartyMember, // PLAYER_QUEST_LOG+119 - PartyMember, // PLAYER_QUEST_LOG+120 - PartyMember, // PLAYER_QUEST_LOG+121 - PartyMember, // PLAYER_QUEST_LOG+122 - PartyMember, // PLAYER_QUEST_LOG+123 - PartyMember, // PLAYER_QUEST_LOG+124 - PartyMember, // PLAYER_QUEST_LOG+125 - PartyMember, // PLAYER_QUEST_LOG+126 - PartyMember, // PLAYER_QUEST_LOG+127 - PartyMember, // PLAYER_QUEST_LOG+128 - PartyMember, // PLAYER_QUEST_LOG+129 - PartyMember, // PLAYER_QUEST_LOG+130 - PartyMember, // PLAYER_QUEST_LOG+131 - PartyMember, // PLAYER_QUEST_LOG+132 - PartyMember, // PLAYER_QUEST_LOG+133 - PartyMember, // PLAYER_QUEST_LOG+134 - PartyMember, // PLAYER_QUEST_LOG+135 - PartyMember, // PLAYER_QUEST_LOG+136 - PartyMember, // PLAYER_QUEST_LOG+137 - PartyMember, // PLAYER_QUEST_LOG+138 - PartyMember, // PLAYER_QUEST_LOG+139 - PartyMember, // PLAYER_QUEST_LOG+140 - PartyMember, // PLAYER_QUEST_LOG+141 - PartyMember, // PLAYER_QUEST_LOG+142 - PartyMember, // PLAYER_QUEST_LOG+143 - PartyMember, // PLAYER_QUEST_LOG+144 - PartyMember, // PLAYER_QUEST_LOG+145 - PartyMember, // PLAYER_QUEST_LOG+146 - PartyMember, // PLAYER_QUEST_LOG+147 - PartyMember, // PLAYER_QUEST_LOG+148 - PartyMember, // PLAYER_QUEST_LOG+149 - PartyMember, // PLAYER_QUEST_LOG+150 - PartyMember, // PLAYER_QUEST_LOG+151 - PartyMember, // PLAYER_QUEST_LOG+152 - PartyMember, // PLAYER_QUEST_LOG+153 - PartyMember, // PLAYER_QUEST_LOG+154 - PartyMember, // PLAYER_QUEST_LOG+155 - PartyMember, // PLAYER_QUEST_LOG+156 - PartyMember, // PLAYER_QUEST_LOG+157 - PartyMember, // PLAYER_QUEST_LOG+158 - PartyMember, // PLAYER_QUEST_LOG+159 - PartyMember, // PLAYER_QUEST_LOG+160 - PartyMember, // PLAYER_QUEST_LOG+161 - PartyMember, // PLAYER_QUEST_LOG+162 - PartyMember, // PLAYER_QUEST_LOG+163 - PartyMember, // PLAYER_QUEST_LOG+164 - PartyMember, // PLAYER_QUEST_LOG+165 - PartyMember, // PLAYER_QUEST_LOG+166 - PartyMember, // PLAYER_QUEST_LOG+167 - PartyMember, // PLAYER_QUEST_LOG+168 - PartyMember, // PLAYER_QUEST_LOG+169 - PartyMember, // PLAYER_QUEST_LOG+170 - PartyMember, // PLAYER_QUEST_LOG+171 - PartyMember, // PLAYER_QUEST_LOG+172 - PartyMember, // PLAYER_QUEST_LOG+173 - PartyMember, // PLAYER_QUEST_LOG+174 - PartyMember, // PLAYER_QUEST_LOG+175 - PartyMember, // PLAYER_QUEST_LOG+176 - PartyMember, // PLAYER_QUEST_LOG+177 - PartyMember, // PLAYER_QUEST_LOG+178 - PartyMember, // PLAYER_QUEST_LOG+179 - PartyMember, // PLAYER_QUEST_LOG+180 - PartyMember, // PLAYER_QUEST_LOG+181 - PartyMember, // PLAYER_QUEST_LOG+182 - PartyMember, // PLAYER_QUEST_LOG+183 - PartyMember, // PLAYER_QUEST_LOG+184 - PartyMember, // PLAYER_QUEST_LOG+185 - PartyMember, // PLAYER_QUEST_LOG+186 - PartyMember, // PLAYER_QUEST_LOG+187 - PartyMember, // PLAYER_QUEST_LOG+188 - PartyMember, // PLAYER_QUEST_LOG+189 - PartyMember, // PLAYER_QUEST_LOG+190 - PartyMember, // PLAYER_QUEST_LOG+191 - PartyMember, // PLAYER_QUEST_LOG+192 - PartyMember, // PLAYER_QUEST_LOG+193 - PartyMember, // PLAYER_QUEST_LOG+194 - PartyMember, // PLAYER_QUEST_LOG+195 - PartyMember, // PLAYER_QUEST_LOG+196 - PartyMember, // PLAYER_QUEST_LOG+197 - PartyMember, // PLAYER_QUEST_LOG+198 - PartyMember, // PLAYER_QUEST_LOG+199 - PartyMember, // PLAYER_QUEST_LOG+200 - PartyMember, // PLAYER_QUEST_LOG+201 - PartyMember, // PLAYER_QUEST_LOG+202 - PartyMember, // PLAYER_QUEST_LOG+203 - PartyMember, // PLAYER_QUEST_LOG+204 - PartyMember, // PLAYER_QUEST_LOG+205 - PartyMember, // PLAYER_QUEST_LOG+206 - PartyMember, // PLAYER_QUEST_LOG+207 - PartyMember, // PLAYER_QUEST_LOG+208 - PartyMember, // PLAYER_QUEST_LOG+209 - PartyMember, // PLAYER_QUEST_LOG+210 - PartyMember, // PLAYER_QUEST_LOG+211 - PartyMember, // PLAYER_QUEST_LOG+212 - PartyMember, // PLAYER_QUEST_LOG+213 - PartyMember, // PLAYER_QUEST_LOG+214 - PartyMember, // PLAYER_QUEST_LOG+215 - PartyMember, // PLAYER_QUEST_LOG+216 - PartyMember, // PLAYER_QUEST_LOG+217 - PartyMember, // PLAYER_QUEST_LOG+218 - PartyMember, // PLAYER_QUEST_LOG+219 - PartyMember, // PLAYER_QUEST_LOG+220 - PartyMember, // PLAYER_QUEST_LOG+221 - PartyMember, // PLAYER_QUEST_LOG+222 - PartyMember, // PLAYER_QUEST_LOG+223 - PartyMember, // PLAYER_QUEST_LOG+224 - PartyMember, // PLAYER_QUEST_LOG+225 - PartyMember, // PLAYER_QUEST_LOG+226 - PartyMember, // PLAYER_QUEST_LOG+227 - PartyMember, // PLAYER_QUEST_LOG+228 - PartyMember, // PLAYER_QUEST_LOG+229 - PartyMember, // PLAYER_QUEST_LOG+230 - PartyMember, // PLAYER_QUEST_LOG+231 - PartyMember, // PLAYER_QUEST_LOG+232 - PartyMember, // PLAYER_QUEST_LOG+233 - PartyMember, // PLAYER_QUEST_LOG+234 - PartyMember, // PLAYER_QUEST_LOG+235 - PartyMember, // PLAYER_QUEST_LOG+236 - PartyMember, // PLAYER_QUEST_LOG+237 - PartyMember, // PLAYER_QUEST_LOG+238 - PartyMember, // PLAYER_QUEST_LOG+239 - PartyMember, // PLAYER_QUEST_LOG+240 - PartyMember, // PLAYER_QUEST_LOG+241 - PartyMember, // PLAYER_QUEST_LOG+242 - PartyMember, // PLAYER_QUEST_LOG+243 - PartyMember, // PLAYER_QUEST_LOG+244 - PartyMember, // PLAYER_QUEST_LOG+245 - PartyMember, // PLAYER_QUEST_LOG+246 - PartyMember, // PLAYER_QUEST_LOG+247 - PartyMember, // PLAYER_QUEST_LOG+248 - PartyMember, // PLAYER_QUEST_LOG+249 - PartyMember, // PLAYER_QUEST_LOG+250 - PartyMember, // PLAYER_QUEST_LOG+251 - PartyMember, // PLAYER_QUEST_LOG+252 - PartyMember, // PLAYER_QUEST_LOG+253 - PartyMember, // PLAYER_QUEST_LOG+254 - PartyMember, // PLAYER_QUEST_LOG+255 - PartyMember, // PLAYER_QUEST_LOG+256 - PartyMember, // PLAYER_QUEST_LOG+257 - PartyMember, // PLAYER_QUEST_LOG+258 - PartyMember, // PLAYER_QUEST_LOG+259 - PartyMember, // PLAYER_QUEST_LOG+260 - PartyMember, // PLAYER_QUEST_LOG+261 - PartyMember, // PLAYER_QUEST_LOG+262 - PartyMember, // PLAYER_QUEST_LOG+263 - PartyMember, // PLAYER_QUEST_LOG+264 - PartyMember, // PLAYER_QUEST_LOG+265 - PartyMember, // PLAYER_QUEST_LOG+266 - PartyMember, // PLAYER_QUEST_LOG+267 - PartyMember, // PLAYER_QUEST_LOG+268 - PartyMember, // PLAYER_QUEST_LOG+269 - PartyMember, // PLAYER_QUEST_LOG+270 - PartyMember, // PLAYER_QUEST_LOG+271 - PartyMember, // PLAYER_QUEST_LOG+272 - PartyMember, // PLAYER_QUEST_LOG+273 - PartyMember, // PLAYER_QUEST_LOG+274 - PartyMember, // PLAYER_QUEST_LOG+275 - PartyMember, // PLAYER_QUEST_LOG+276 - PartyMember, // PLAYER_QUEST_LOG+277 - PartyMember, // PLAYER_QUEST_LOG+278 - PartyMember, // PLAYER_QUEST_LOG+279 - PartyMember, // PLAYER_QUEST_LOG+280 - PartyMember, // PLAYER_QUEST_LOG+281 - PartyMember, // PLAYER_QUEST_LOG+282 - PartyMember, // PLAYER_QUEST_LOG+283 - PartyMember, // PLAYER_QUEST_LOG+284 - PartyMember, // PLAYER_QUEST_LOG+285 - PartyMember, // PLAYER_QUEST_LOG+286 - PartyMember, // PLAYER_QUEST_LOG+287 - PartyMember, // PLAYER_QUEST_LOG+288 - PartyMember, // PLAYER_QUEST_LOG+289 - PartyMember, // PLAYER_QUEST_LOG+290 - PartyMember, // PLAYER_QUEST_LOG+291 - PartyMember, // PLAYER_QUEST_LOG+292 - PartyMember, // PLAYER_QUEST_LOG+293 - PartyMember, // PLAYER_QUEST_LOG+294 - PartyMember, // PLAYER_QUEST_LOG+295 - PartyMember, // PLAYER_QUEST_LOG+296 - PartyMember, // PLAYER_QUEST_LOG+297 - PartyMember, // PLAYER_QUEST_LOG+298 - PartyMember, // PLAYER_QUEST_LOG+299 - PartyMember, // PLAYER_QUEST_LOG+300 - PartyMember, // PLAYER_QUEST_LOG+301 - PartyMember, // PLAYER_QUEST_LOG+302 - PartyMember, // PLAYER_QUEST_LOG+303 - PartyMember, // PLAYER_QUEST_LOG+304 - PartyMember, // PLAYER_QUEST_LOG+305 - PartyMember, // PLAYER_QUEST_LOG+306 - PartyMember, // PLAYER_QUEST_LOG+307 - PartyMember, // PLAYER_QUEST_LOG+308 - PartyMember, // PLAYER_QUEST_LOG+309 - PartyMember, // PLAYER_QUEST_LOG+310 - PartyMember, // PLAYER_QUEST_LOG+311 - PartyMember, // PLAYER_QUEST_LOG+312 - PartyMember, // PLAYER_QUEST_LOG+313 - PartyMember, // PLAYER_QUEST_LOG+314 - PartyMember, // PLAYER_QUEST_LOG+315 - PartyMember, // PLAYER_QUEST_LOG+316 - PartyMember, // PLAYER_QUEST_LOG+317 - PartyMember, // PLAYER_QUEST_LOG+318 - PartyMember, // PLAYER_QUEST_LOG+319 - PartyMember, // PLAYER_QUEST_LOG+320 - PartyMember, // PLAYER_QUEST_LOG+321 - PartyMember, // PLAYER_QUEST_LOG+322 - PartyMember, // PLAYER_QUEST_LOG+323 - PartyMember, // PLAYER_QUEST_LOG+324 - PartyMember, // PLAYER_QUEST_LOG+325 - PartyMember, // PLAYER_QUEST_LOG+326 - PartyMember, // PLAYER_QUEST_LOG+327 - PartyMember, // PLAYER_QUEST_LOG+328 - PartyMember, // PLAYER_QUEST_LOG+329 - PartyMember, // PLAYER_QUEST_LOG+330 - PartyMember, // PLAYER_QUEST_LOG+331 - PartyMember, // PLAYER_QUEST_LOG+332 - PartyMember, // PLAYER_QUEST_LOG+333 - PartyMember, // PLAYER_QUEST_LOG+334 - PartyMember, // PLAYER_QUEST_LOG+335 - PartyMember, // PLAYER_QUEST_LOG+336 - PartyMember, // PLAYER_QUEST_LOG+337 - PartyMember, // PLAYER_QUEST_LOG+338 - PartyMember, // PLAYER_QUEST_LOG+339 - PartyMember, // PLAYER_QUEST_LOG+340 - PartyMember, // PLAYER_QUEST_LOG+341 - PartyMember, // PLAYER_QUEST_LOG+342 - PartyMember, // PLAYER_QUEST_LOG+343 - PartyMember, // PLAYER_QUEST_LOG+344 - PartyMember, // PLAYER_QUEST_LOG+345 - PartyMember, // PLAYER_QUEST_LOG+346 - PartyMember, // PLAYER_QUEST_LOG+347 - PartyMember, // PLAYER_QUEST_LOG+348 - PartyMember, // PLAYER_QUEST_LOG+349 - PartyMember, // PLAYER_QUEST_LOG+350 - PartyMember, // PLAYER_QUEST_LOG+351 - PartyMember, // PLAYER_QUEST_LOG+352 - PartyMember, // PLAYER_QUEST_LOG+353 - PartyMember, // PLAYER_QUEST_LOG+354 - PartyMember, // PLAYER_QUEST_LOG+355 - PartyMember, // PLAYER_QUEST_LOG+356 - PartyMember, // PLAYER_QUEST_LOG+357 - PartyMember, // PLAYER_QUEST_LOG+358 - PartyMember, // PLAYER_QUEST_LOG+359 - PartyMember, // PLAYER_QUEST_LOG+360 - PartyMember, // PLAYER_QUEST_LOG+361 - PartyMember, // PLAYER_QUEST_LOG+362 - PartyMember, // PLAYER_QUEST_LOG+363 - PartyMember, // PLAYER_QUEST_LOG+364 - PartyMember, // PLAYER_QUEST_LOG+365 - PartyMember, // PLAYER_QUEST_LOG+366 - PartyMember, // PLAYER_QUEST_LOG+367 - PartyMember, // PLAYER_QUEST_LOG+368 - PartyMember, // PLAYER_QUEST_LOG+369 - PartyMember, // PLAYER_QUEST_LOG+370 - PartyMember, // PLAYER_QUEST_LOG+371 - PartyMember, // PLAYER_QUEST_LOG+372 - PartyMember, // PLAYER_QUEST_LOG+373 - PartyMember, // PLAYER_QUEST_LOG+374 - PartyMember, // PLAYER_QUEST_LOG+375 - PartyMember, // PLAYER_QUEST_LOG+376 - PartyMember, // PLAYER_QUEST_LOG+377 - PartyMember, // PLAYER_QUEST_LOG+378 - PartyMember, // PLAYER_QUEST_LOG+379 - PartyMember, // PLAYER_QUEST_LOG+380 - PartyMember, // PLAYER_QUEST_LOG+381 - PartyMember, // PLAYER_QUEST_LOG+382 - PartyMember, // PLAYER_QUEST_LOG+383 - PartyMember, // PLAYER_QUEST_LOG+384 - PartyMember, // PLAYER_QUEST_LOG+385 - PartyMember, // PLAYER_QUEST_LOG+386 - PartyMember, // PLAYER_QUEST_LOG+387 - PartyMember, // PLAYER_QUEST_LOG+388 - PartyMember, // PLAYER_QUEST_LOG+389 - PartyMember, // PLAYER_QUEST_LOG+390 - PartyMember, // PLAYER_QUEST_LOG+391 - PartyMember, // PLAYER_QUEST_LOG+392 - PartyMember, // PLAYER_QUEST_LOG+393 - PartyMember, // PLAYER_QUEST_LOG+394 - PartyMember, // PLAYER_QUEST_LOG+395 - PartyMember, // PLAYER_QUEST_LOG+396 - PartyMember, // PLAYER_QUEST_LOG+397 - PartyMember, // PLAYER_QUEST_LOG+398 - PartyMember, // PLAYER_QUEST_LOG+399 - PartyMember, // PLAYER_QUEST_LOG+400 - PartyMember, // PLAYER_QUEST_LOG+401 - PartyMember, // PLAYER_QUEST_LOG+402 - PartyMember, // PLAYER_QUEST_LOG+403 - PartyMember, // PLAYER_QUEST_LOG+404 - PartyMember, // PLAYER_QUEST_LOG+405 - PartyMember, // PLAYER_QUEST_LOG+406 - PartyMember, // PLAYER_QUEST_LOG+407 - PartyMember, // PLAYER_QUEST_LOG+408 - PartyMember, // PLAYER_QUEST_LOG+409 - PartyMember, // PLAYER_QUEST_LOG+410 - PartyMember, // PLAYER_QUEST_LOG+411 - PartyMember, // PLAYER_QUEST_LOG+412 - PartyMember, // PLAYER_QUEST_LOG+413 - PartyMember, // PLAYER_QUEST_LOG+414 - PartyMember, // PLAYER_QUEST_LOG+415 - PartyMember, // PLAYER_QUEST_LOG+416 - PartyMember, // PLAYER_QUEST_LOG+417 - PartyMember, // PLAYER_QUEST_LOG+418 - PartyMember, // PLAYER_QUEST_LOG+419 - PartyMember, // PLAYER_QUEST_LOG+420 - PartyMember, // PLAYER_QUEST_LOG+421 - PartyMember, // PLAYER_QUEST_LOG+422 - PartyMember, // PLAYER_QUEST_LOG+423 - PartyMember, // PLAYER_QUEST_LOG+424 - PartyMember, // PLAYER_QUEST_LOG+425 - PartyMember, // PLAYER_QUEST_LOG+426 - PartyMember, // PLAYER_QUEST_LOG+427 - PartyMember, // PLAYER_QUEST_LOG+428 - PartyMember, // PLAYER_QUEST_LOG+429 - PartyMember, // PLAYER_QUEST_LOG+430 - PartyMember, // PLAYER_QUEST_LOG+431 - PartyMember, // PLAYER_QUEST_LOG+432 - PartyMember, // PLAYER_QUEST_LOG+433 - PartyMember, // PLAYER_QUEST_LOG+434 - PartyMember, // PLAYER_QUEST_LOG+435 - PartyMember, // PLAYER_QUEST_LOG+436 - PartyMember, // PLAYER_QUEST_LOG+437 - PartyMember, // PLAYER_QUEST_LOG+438 - PartyMember, // PLAYER_QUEST_LOG+439 - PartyMember, // PLAYER_QUEST_LOG+440 - PartyMember, // PLAYER_QUEST_LOG+441 - PartyMember, // PLAYER_QUEST_LOG+442 - PartyMember, // PLAYER_QUEST_LOG+443 - PartyMember, // PLAYER_QUEST_LOG+444 - PartyMember, // PLAYER_QUEST_LOG+445 - PartyMember, // PLAYER_QUEST_LOG+446 - PartyMember, // PLAYER_QUEST_LOG+447 - PartyMember, // PLAYER_QUEST_LOG+448 - PartyMember, // PLAYER_QUEST_LOG+449 - PartyMember, // PLAYER_QUEST_LOG+450 - PartyMember, // PLAYER_QUEST_LOG+451 - PartyMember, // PLAYER_QUEST_LOG+452 - PartyMember, // PLAYER_QUEST_LOG+453 - PartyMember, // PLAYER_QUEST_LOG+454 - PartyMember, // PLAYER_QUEST_LOG+455 - PartyMember, // PLAYER_QUEST_LOG+456 - PartyMember, // PLAYER_QUEST_LOG+457 - PartyMember, // PLAYER_QUEST_LOG+458 - PartyMember, // PLAYER_QUEST_LOG+459 - PartyMember, // PLAYER_QUEST_LOG+460 - PartyMember, // PLAYER_QUEST_LOG+461 - PartyMember, // PLAYER_QUEST_LOG+462 - PartyMember, // PLAYER_QUEST_LOG+463 - PartyMember, // PLAYER_QUEST_LOG+464 - PartyMember, // PLAYER_QUEST_LOG+465 - PartyMember, // PLAYER_QUEST_LOG+466 - PartyMember, // PLAYER_QUEST_LOG+467 - PartyMember, // PLAYER_QUEST_LOG+468 - PartyMember, // PLAYER_QUEST_LOG+469 - PartyMember, // PLAYER_QUEST_LOG+470 - PartyMember, // PLAYER_QUEST_LOG+471 - PartyMember, // PLAYER_QUEST_LOG+472 - PartyMember, // PLAYER_QUEST_LOG+473 - PartyMember, // PLAYER_QUEST_LOG+474 - PartyMember, // PLAYER_QUEST_LOG+475 - PartyMember, // PLAYER_QUEST_LOG+476 - PartyMember, // PLAYER_QUEST_LOG+477 - PartyMember, // PLAYER_QUEST_LOG+478 - PartyMember, // PLAYER_QUEST_LOG+479 - PartyMember, // PLAYER_QUEST_LOG+480 - PartyMember, // PLAYER_QUEST_LOG+481 - PartyMember, // PLAYER_QUEST_LOG+482 - PartyMember, // PLAYER_QUEST_LOG+483 - PartyMember, // PLAYER_QUEST_LOG+484 - PartyMember, // PLAYER_QUEST_LOG+485 - PartyMember, // PLAYER_QUEST_LOG+486 - PartyMember, // PLAYER_QUEST_LOG+487 - PartyMember, // PLAYER_QUEST_LOG+488 - PartyMember, // PLAYER_QUEST_LOG+489 - PartyMember, // PLAYER_QUEST_LOG+490 - PartyMember, // PLAYER_QUEST_LOG+491 - PartyMember, // PLAYER_QUEST_LOG+492 - PartyMember, // PLAYER_QUEST_LOG+493 - PartyMember, // PLAYER_QUEST_LOG+494 - PartyMember, // PLAYER_QUEST_LOG+495 - PartyMember, // PLAYER_QUEST_LOG+496 - PartyMember, // PLAYER_QUEST_LOG+497 - PartyMember, // PLAYER_QUEST_LOG+498 - PartyMember, // PLAYER_QUEST_LOG+499 - PartyMember, // PLAYER_QUEST_LOG+500 - PartyMember, // PLAYER_QUEST_LOG+501 - PartyMember, // PLAYER_QUEST_LOG+502 - PartyMember, // PLAYER_QUEST_LOG+503 - PartyMember, // PLAYER_QUEST_LOG+504 - PartyMember, // PLAYER_QUEST_LOG+505 - PartyMember, // PLAYER_QUEST_LOG+506 - PartyMember, // PLAYER_QUEST_LOG+507 - PartyMember, // PLAYER_QUEST_LOG+508 - PartyMember, // PLAYER_QUEST_LOG+509 - PartyMember, // PLAYER_QUEST_LOG+510 - PartyMember, // PLAYER_QUEST_LOG+511 - PartyMember, // PLAYER_QUEST_LOG+512 - PartyMember, // PLAYER_QUEST_LOG+513 - PartyMember, // PLAYER_QUEST_LOG+514 - PartyMember, // PLAYER_QUEST_LOG+515 - PartyMember, // PLAYER_QUEST_LOG+516 - PartyMember, // PLAYER_QUEST_LOG+517 - PartyMember, // PLAYER_QUEST_LOG+518 - PartyMember, // PLAYER_QUEST_LOG+519 - PartyMember, // PLAYER_QUEST_LOG+520 - PartyMember, // PLAYER_QUEST_LOG+521 - PartyMember, // PLAYER_QUEST_LOG+522 - PartyMember, // PLAYER_QUEST_LOG+523 - PartyMember, // PLAYER_QUEST_LOG+524 - PartyMember, // PLAYER_QUEST_LOG+525 - PartyMember, // PLAYER_QUEST_LOG+526 - PartyMember, // PLAYER_QUEST_LOG+527 - PartyMember, // PLAYER_QUEST_LOG+528 - PartyMember, // PLAYER_QUEST_LOG+529 - PartyMember, // PLAYER_QUEST_LOG+530 - PartyMember, // PLAYER_QUEST_LOG+531 - PartyMember, // PLAYER_QUEST_LOG+532 - PartyMember, // PLAYER_QUEST_LOG+533 - PartyMember, // PLAYER_QUEST_LOG+534 - PartyMember, // PLAYER_QUEST_LOG+535 - PartyMember, // PLAYER_QUEST_LOG+536 - PartyMember, // PLAYER_QUEST_LOG+537 - PartyMember, // PLAYER_QUEST_LOG+538 - PartyMember, // PLAYER_QUEST_LOG+539 - PartyMember, // PLAYER_QUEST_LOG+540 - PartyMember, // PLAYER_QUEST_LOG+541 - PartyMember, // PLAYER_QUEST_LOG+542 - PartyMember, // PLAYER_QUEST_LOG+543 - PartyMember, // PLAYER_QUEST_LOG+544 - PartyMember, // PLAYER_QUEST_LOG+545 - PartyMember, // PLAYER_QUEST_LOG+546 - PartyMember, // PLAYER_QUEST_LOG+547 - PartyMember, // PLAYER_QUEST_LOG+548 - PartyMember, // PLAYER_QUEST_LOG+549 - PartyMember, // PLAYER_QUEST_LOG+550 - PartyMember, // PLAYER_QUEST_LOG+551 - PartyMember, // PLAYER_QUEST_LOG+552 - PartyMember, // PLAYER_QUEST_LOG+553 - PartyMember, // PLAYER_QUEST_LOG+554 - PartyMember, // PLAYER_QUEST_LOG+555 - PartyMember, // PLAYER_QUEST_LOG+556 - PartyMember, // PLAYER_QUEST_LOG+557 - PartyMember, // PLAYER_QUEST_LOG+558 - PartyMember, // PLAYER_QUEST_LOG+559 - PartyMember, // PLAYER_QUEST_LOG+560 - PartyMember, // PLAYER_QUEST_LOG+561 - PartyMember, // PLAYER_QUEST_LOG+562 - PartyMember, // PLAYER_QUEST_LOG+563 - PartyMember, // PLAYER_QUEST_LOG+564 - PartyMember, // PLAYER_QUEST_LOG+565 - PartyMember, // PLAYER_QUEST_LOG+566 - PartyMember, // PLAYER_QUEST_LOG+567 - PartyMember, // PLAYER_QUEST_LOG+568 - PartyMember, // PLAYER_QUEST_LOG+569 - PartyMember, // PLAYER_QUEST_LOG+570 - PartyMember, // PLAYER_QUEST_LOG+571 - PartyMember, // PLAYER_QUEST_LOG+572 - PartyMember, // PLAYER_QUEST_LOG+573 - PartyMember, // PLAYER_QUEST_LOG+574 - PartyMember, // PLAYER_QUEST_LOG+575 - PartyMember, // PLAYER_QUEST_LOG+576 - PartyMember, // PLAYER_QUEST_LOG+577 - PartyMember, // PLAYER_QUEST_LOG+578 - PartyMember, // PLAYER_QUEST_LOG+579 - PartyMember, // PLAYER_QUEST_LOG+580 - PartyMember, // PLAYER_QUEST_LOG+581 - PartyMember, // PLAYER_QUEST_LOG+582 - PartyMember, // PLAYER_QUEST_LOG+583 - PartyMember, // PLAYER_QUEST_LOG+584 - PartyMember, // PLAYER_QUEST_LOG+585 - PartyMember, // PLAYER_QUEST_LOG+586 - PartyMember, // PLAYER_QUEST_LOG+587 - PartyMember, // PLAYER_QUEST_LOG+588 - PartyMember, // PLAYER_QUEST_LOG+589 - PartyMember, // PLAYER_QUEST_LOG+590 - PartyMember, // PLAYER_QUEST_LOG+591 - PartyMember, // PLAYER_QUEST_LOG+592 - PartyMember, // PLAYER_QUEST_LOG+593 - PartyMember, // PLAYER_QUEST_LOG+594 - PartyMember, // PLAYER_QUEST_LOG+595 - PartyMember, // PLAYER_QUEST_LOG+596 - PartyMember, // PLAYER_QUEST_LOG+597 - PartyMember, // PLAYER_QUEST_LOG+598 - PartyMember, // PLAYER_QUEST_LOG+599 - PartyMember, // PLAYER_QUEST_LOG+600 - PartyMember, // PLAYER_QUEST_LOG+601 - PartyMember, // PLAYER_QUEST_LOG+602 - PartyMember, // PLAYER_QUEST_LOG+603 - PartyMember, // PLAYER_QUEST_LOG+604 - PartyMember, // PLAYER_QUEST_LOG+605 - PartyMember, // PLAYER_QUEST_LOG+606 - PartyMember, // PLAYER_QUEST_LOG+607 - PartyMember, // PLAYER_QUEST_LOG+608 - PartyMember, // PLAYER_QUEST_LOG+609 - PartyMember, // PLAYER_QUEST_LOG+610 - PartyMember, // PLAYER_QUEST_LOG+611 - PartyMember, // PLAYER_QUEST_LOG+612 - PartyMember, // PLAYER_QUEST_LOG+613 - PartyMember, // PLAYER_QUEST_LOG+614 - PartyMember, // PLAYER_QUEST_LOG+615 - PartyMember, // PLAYER_QUEST_LOG+616 - PartyMember, // PLAYER_QUEST_LOG+617 - PartyMember, // PLAYER_QUEST_LOG+618 - PartyMember, // PLAYER_QUEST_LOG+619 - PartyMember, // PLAYER_QUEST_LOG+620 - PartyMember, // PLAYER_QUEST_LOG+621 - PartyMember, // PLAYER_QUEST_LOG+622 - PartyMember, // PLAYER_QUEST_LOG+623 - PartyMember, // PLAYER_QUEST_LOG+624 - PartyMember, // PLAYER_QUEST_LOG+625 - PartyMember, // PLAYER_QUEST_LOG+626 - PartyMember, // PLAYER_QUEST_LOG+627 - PartyMember, // PLAYER_QUEST_LOG+628 - PartyMember, // PLAYER_QUEST_LOG+629 - PartyMember, // PLAYER_QUEST_LOG+630 - PartyMember, // PLAYER_QUEST_LOG+631 - PartyMember, // PLAYER_QUEST_LOG+632 - PartyMember, // PLAYER_QUEST_LOG+633 - PartyMember, // PLAYER_QUEST_LOG+634 - PartyMember, // PLAYER_QUEST_LOG+635 - PartyMember, // PLAYER_QUEST_LOG+636 - PartyMember, // PLAYER_QUEST_LOG+637 - PartyMember, // PLAYER_QUEST_LOG+638 - PartyMember, // PLAYER_QUEST_LOG+639 - PartyMember, // PLAYER_QUEST_LOG+640 - PartyMember, // PLAYER_QUEST_LOG+641 - PartyMember, // PLAYER_QUEST_LOG+642 - PartyMember, // PLAYER_QUEST_LOG+643 - PartyMember, // PLAYER_QUEST_LOG+644 - PartyMember, // PLAYER_QUEST_LOG+645 - PartyMember, // PLAYER_QUEST_LOG+646 - PartyMember, // PLAYER_QUEST_LOG+647 - PartyMember, // PLAYER_QUEST_LOG+648 - PartyMember, // PLAYER_QUEST_LOG+649 - PartyMember, // PLAYER_QUEST_LOG+650 - PartyMember, // PLAYER_QUEST_LOG+651 - PartyMember, // PLAYER_QUEST_LOG+652 - PartyMember, // PLAYER_QUEST_LOG+653 - PartyMember, // PLAYER_QUEST_LOG+654 - PartyMember, // PLAYER_QUEST_LOG+655 - PartyMember, // PLAYER_QUEST_LOG+656 - PartyMember, // PLAYER_QUEST_LOG+657 - PartyMember, // PLAYER_QUEST_LOG+658 - PartyMember, // PLAYER_QUEST_LOG+659 - PartyMember, // PLAYER_QUEST_LOG+660 - PartyMember, // PLAYER_QUEST_LOG+661 - PartyMember, // PLAYER_QUEST_LOG+662 - PartyMember, // PLAYER_QUEST_LOG+663 - PartyMember, // PLAYER_QUEST_LOG+664 - PartyMember, // PLAYER_QUEST_LOG+665 - PartyMember, // PLAYER_QUEST_LOG+666 - PartyMember, // PLAYER_QUEST_LOG+667 - PartyMember, // PLAYER_QUEST_LOG+668 - PartyMember, // PLAYER_QUEST_LOG+669 - PartyMember, // PLAYER_QUEST_LOG+670 - PartyMember, // PLAYER_QUEST_LOG+671 - PartyMember, // PLAYER_QUEST_LOG+672 - PartyMember, // PLAYER_QUEST_LOG+673 - PartyMember, // PLAYER_QUEST_LOG+674 - PartyMember, // PLAYER_QUEST_LOG+675 - PartyMember, // PLAYER_QUEST_LOG+676 - PartyMember, // PLAYER_QUEST_LOG+677 - PartyMember, // PLAYER_QUEST_LOG+678 - PartyMember, // PLAYER_QUEST_LOG+679 - PartyMember, // PLAYER_QUEST_LOG+680 - PartyMember, // PLAYER_QUEST_LOG+681 - PartyMember, // PLAYER_QUEST_LOG+682 - PartyMember, // PLAYER_QUEST_LOG+683 - PartyMember, // PLAYER_QUEST_LOG+684 - PartyMember, // PLAYER_QUEST_LOG+685 - PartyMember, // PLAYER_QUEST_LOG+686 - PartyMember, // PLAYER_QUEST_LOG+687 - PartyMember, // PLAYER_QUEST_LOG+688 - PartyMember, // PLAYER_QUEST_LOG+689 - PartyMember, // PLAYER_QUEST_LOG+690 - PartyMember, // PLAYER_QUEST_LOG+691 - PartyMember, // PLAYER_QUEST_LOG+692 - PartyMember, // PLAYER_QUEST_LOG+693 - PartyMember, // PLAYER_QUEST_LOG+694 - PartyMember, // PLAYER_QUEST_LOG+695 - PartyMember, // PLAYER_QUEST_LOG+696 - PartyMember, // PLAYER_QUEST_LOG+697 - PartyMember, // PLAYER_QUEST_LOG+698 - PartyMember, // PLAYER_QUEST_LOG+699 - PartyMember, // PLAYER_QUEST_LOG+700 - PartyMember, // PLAYER_QUEST_LOG+701 - PartyMember, // PLAYER_QUEST_LOG+702 - PartyMember, // PLAYER_QUEST_LOG+703 - PartyMember, // PLAYER_QUEST_LOG+704 - PartyMember, // PLAYER_QUEST_LOG+705 - PartyMember, // PLAYER_QUEST_LOG+706 - PartyMember, // PLAYER_QUEST_LOG+707 - PartyMember, // PLAYER_QUEST_LOG+708 - PartyMember, // PLAYER_QUEST_LOG+709 - PartyMember, // PLAYER_QUEST_LOG+710 - PartyMember, // PLAYER_QUEST_LOG+711 - PartyMember, // PLAYER_QUEST_LOG+712 - PartyMember, // PLAYER_QUEST_LOG+713 - PartyMember, // PLAYER_QUEST_LOG+714 - PartyMember, // PLAYER_QUEST_LOG+715 - PartyMember, // PLAYER_QUEST_LOG+716 - PartyMember, // PLAYER_QUEST_LOG+717 - PartyMember, // PLAYER_QUEST_LOG+718 - PartyMember, // PLAYER_QUEST_LOG+719 - PartyMember, // PLAYER_QUEST_LOG+720 - PartyMember, // PLAYER_QUEST_LOG+721 - PartyMember, // PLAYER_QUEST_LOG+722 - PartyMember, // PLAYER_QUEST_LOG+723 - PartyMember, // PLAYER_QUEST_LOG+724 - PartyMember, // PLAYER_QUEST_LOG+725 - PartyMember, // PLAYER_QUEST_LOG+726 - PartyMember, // PLAYER_QUEST_LOG+727 - PartyMember, // PLAYER_QUEST_LOG+728 - PartyMember, // PLAYER_QUEST_LOG+729 - PartyMember, // PLAYER_QUEST_LOG+730 - PartyMember, // PLAYER_QUEST_LOG+731 - PartyMember, // PLAYER_QUEST_LOG+732 - PartyMember, // PLAYER_QUEST_LOG+733 - PartyMember, // PLAYER_QUEST_LOG+734 - PartyMember, // PLAYER_QUEST_LOG+735 - PartyMember, // PLAYER_QUEST_LOG+736 - PartyMember, // PLAYER_QUEST_LOG+737 - PartyMember, // PLAYER_QUEST_LOG+738 - PartyMember, // PLAYER_QUEST_LOG+739 - PartyMember, // PLAYER_QUEST_LOG+740 - PartyMember, // PLAYER_QUEST_LOG+741 - PartyMember, // PLAYER_QUEST_LOG+742 - PartyMember, // PLAYER_QUEST_LOG+743 - PartyMember, // PLAYER_QUEST_LOG+744 - PartyMember, // PLAYER_QUEST_LOG+745 - PartyMember, // PLAYER_QUEST_LOG+746 - PartyMember, // PLAYER_QUEST_LOG+747 - PartyMember, // PLAYER_QUEST_LOG+748 - PartyMember, // PLAYER_QUEST_LOG+749 - PartyMember, // PLAYER_QUEST_LOG+750 - PartyMember, // PLAYER_QUEST_LOG+751 - PartyMember, // PLAYER_QUEST_LOG+752 - PartyMember, // PLAYER_QUEST_LOG+753 - PartyMember, // PLAYER_QUEST_LOG+754 - PartyMember, // PLAYER_QUEST_LOG+755 - PartyMember, // PLAYER_QUEST_LOG+756 - PartyMember, // PLAYER_QUEST_LOG+757 - PartyMember, // PLAYER_QUEST_LOG+758 - PartyMember, // PLAYER_QUEST_LOG+759 - PartyMember, // PLAYER_QUEST_LOG+760 - PartyMember, // PLAYER_QUEST_LOG+761 - PartyMember, // PLAYER_QUEST_LOG+762 - PartyMember, // PLAYER_QUEST_LOG+763 - PartyMember, // PLAYER_QUEST_LOG+764 - PartyMember, // PLAYER_QUEST_LOG+765 - PartyMember, // PLAYER_QUEST_LOG+766 - PartyMember, // PLAYER_QUEST_LOG+767 - PartyMember, // PLAYER_QUEST_LOG+768 - PartyMember, // PLAYER_QUEST_LOG+769 - PartyMember, // PLAYER_QUEST_LOG+770 - PartyMember, // PLAYER_QUEST_LOG+771 - PartyMember, // PLAYER_QUEST_LOG+772 - PartyMember, // PLAYER_QUEST_LOG+773 - PartyMember, // PLAYER_QUEST_LOG+774 - PartyMember, // PLAYER_QUEST_LOG+775 - PartyMember, // PLAYER_QUEST_LOG+776 - PartyMember, // PLAYER_QUEST_LOG+777 - PartyMember, // PLAYER_QUEST_LOG+778 - PartyMember, // PLAYER_QUEST_LOG+779 - PartyMember, // PLAYER_QUEST_LOG+780 - PartyMember, // PLAYER_QUEST_LOG+781 - PartyMember, // PLAYER_QUEST_LOG+782 - PartyMember, // PLAYER_QUEST_LOG+783 - PartyMember, // PLAYER_QUEST_LOG+784 - PartyMember, // PLAYER_QUEST_LOG+785 - PartyMember, // PLAYER_QUEST_LOG+786 - PartyMember, // PLAYER_QUEST_LOG+787 - PartyMember, // PLAYER_QUEST_LOG+788 - PartyMember, // PLAYER_QUEST_LOG+789 - PartyMember, // PLAYER_QUEST_LOG+790 - PartyMember, // PLAYER_QUEST_LOG+791 - PartyMember, // PLAYER_QUEST_LOG+792 - PartyMember, // PLAYER_QUEST_LOG+793 - PartyMember, // PLAYER_QUEST_LOG+794 - PartyMember, // PLAYER_QUEST_LOG+795 - PartyMember, // PLAYER_QUEST_LOG+796 - PartyMember, // PLAYER_QUEST_LOG+797 - PartyMember, // PLAYER_QUEST_LOG+798 - PartyMember, // PLAYER_QUEST_LOG+799 - PartyMember, // PLAYER_QUEST_LOG+800 - PartyMember, // PLAYER_QUEST_LOG+801 - PartyMember, // PLAYER_QUEST_LOG+802 - PartyMember, // PLAYER_QUEST_LOG+803 - PartyMember, // PLAYER_QUEST_LOG+804 - PartyMember, // PLAYER_QUEST_LOG+805 - PartyMember, // PLAYER_QUEST_LOG+806 - PartyMember, // PLAYER_QUEST_LOG+807 - PartyMember, // PLAYER_QUEST_LOG+808 - PartyMember, // PLAYER_QUEST_LOG+809 - PartyMember, // PLAYER_QUEST_LOG+810 - PartyMember, // PLAYER_QUEST_LOG+811 - PartyMember, // PLAYER_QUEST_LOG+812 - PartyMember, // PLAYER_QUEST_LOG+813 - PartyMember, // PLAYER_QUEST_LOG+814 - PartyMember, // PLAYER_QUEST_LOG+815 - PartyMember, // PLAYER_QUEST_LOG+816 - PartyMember, // PLAYER_QUEST_LOG+817 - PartyMember, // PLAYER_QUEST_LOG+818 - PartyMember, // PLAYER_QUEST_LOG+819 - PartyMember, // PLAYER_QUEST_LOG+820 - PartyMember, // PLAYER_QUEST_LOG+821 - PartyMember, // PLAYER_QUEST_LOG+822 - PartyMember, // PLAYER_QUEST_LOG+823 - PartyMember, // PLAYER_QUEST_LOG+824 - PartyMember, // PLAYER_QUEST_LOG+825 - PartyMember, // PLAYER_QUEST_LOG+826 - PartyMember, // PLAYER_QUEST_LOG+827 - PartyMember, // PLAYER_QUEST_LOG+828 - PartyMember, // PLAYER_QUEST_LOG+829 - PartyMember, // PLAYER_QUEST_LOG+830 - PartyMember, // PLAYER_QUEST_LOG+831 - PartyMember, // PLAYER_QUEST_LOG+832 - PartyMember, // PLAYER_QUEST_LOG+833 - PartyMember, // PLAYER_QUEST_LOG+834 - PartyMember, // PLAYER_QUEST_LOG+835 - PartyMember, // PLAYER_QUEST_LOG+836 - PartyMember, // PLAYER_QUEST_LOG+837 - PartyMember, // PLAYER_QUEST_LOG+838 - PartyMember, // PLAYER_QUEST_LOG+839 - PartyMember, // PLAYER_QUEST_LOG+840 - PartyMember, // PLAYER_QUEST_LOG+841 - PartyMember, // PLAYER_QUEST_LOG+842 - PartyMember, // PLAYER_QUEST_LOG+843 - PartyMember, // PLAYER_QUEST_LOG+844 - PartyMember, // PLAYER_QUEST_LOG+845 - PartyMember, // PLAYER_QUEST_LOG+846 - PartyMember, // PLAYER_QUEST_LOG+847 - PartyMember, // PLAYER_QUEST_LOG+848 - PartyMember, // PLAYER_QUEST_LOG+849 - PartyMember, // PLAYER_QUEST_LOG+850 - PartyMember, // PLAYER_QUEST_LOG+851 - PartyMember, // PLAYER_QUEST_LOG+852 - PartyMember, // PLAYER_QUEST_LOG+853 - PartyMember, // PLAYER_QUEST_LOG+854 - PartyMember, // PLAYER_QUEST_LOG+855 - PartyMember, // PLAYER_QUEST_LOG+856 - PartyMember, // PLAYER_QUEST_LOG+857 - PartyMember, // PLAYER_QUEST_LOG+858 - PartyMember, // PLAYER_QUEST_LOG+859 - PartyMember, // PLAYER_QUEST_LOG+860 - PartyMember, // PLAYER_QUEST_LOG+861 - PartyMember, // PLAYER_QUEST_LOG+862 - PartyMember, // PLAYER_QUEST_LOG+863 - PartyMember, // PLAYER_QUEST_LOG+864 - PartyMember, // PLAYER_QUEST_LOG+865 - PartyMember, // PLAYER_QUEST_LOG+866 - PartyMember, // PLAYER_QUEST_LOG+867 - PartyMember, // PLAYER_QUEST_LOG+868 - PartyMember, // PLAYER_QUEST_LOG+869 - PartyMember, // PLAYER_QUEST_LOG+870 - PartyMember, // PLAYER_QUEST_LOG+871 - PartyMember, // PLAYER_QUEST_LOG+872 - PartyMember, // PLAYER_QUEST_LOG+873 - PartyMember, // PLAYER_QUEST_LOG+874 - PartyMember, // PLAYER_QUEST_LOG+875 - PartyMember, // PLAYER_QUEST_LOG+876 - PartyMember, // PLAYER_QUEST_LOG+877 - PartyMember, // PLAYER_QUEST_LOG+878 - PartyMember, // PLAYER_QUEST_LOG+879 - PartyMember, // PLAYER_QUEST_LOG+880 - PartyMember, // PLAYER_QUEST_LOG+881 - PartyMember, // PLAYER_QUEST_LOG+882 - PartyMember, // PLAYER_QUEST_LOG+883 - PartyMember, // PLAYER_QUEST_LOG+884 - PartyMember, // PLAYER_QUEST_LOG+885 - PartyMember, // PLAYER_QUEST_LOG+886 - PartyMember, // PLAYER_QUEST_LOG+887 - PartyMember, // PLAYER_QUEST_LOG+888 - PartyMember, // PLAYER_QUEST_LOG+889 - PartyMember, // PLAYER_QUEST_LOG+890 - PartyMember, // PLAYER_QUEST_LOG+891 - PartyMember, // PLAYER_QUEST_LOG+892 - PartyMember, // PLAYER_QUEST_LOG+893 - PartyMember, // PLAYER_QUEST_LOG+894 - PartyMember, // PLAYER_QUEST_LOG+895 - PartyMember, // PLAYER_QUEST_LOG+896 - PartyMember, // PLAYER_QUEST_LOG+897 - PartyMember, // PLAYER_QUEST_LOG+898 - PartyMember, // PLAYER_QUEST_LOG+899 - PartyMember, // PLAYER_QUEST_LOG+900 - PartyMember, // PLAYER_QUEST_LOG+901 - PartyMember, // PLAYER_QUEST_LOG+902 - PartyMember, // PLAYER_QUEST_LOG+903 - PartyMember, // PLAYER_QUEST_LOG+904 - PartyMember, // PLAYER_QUEST_LOG+905 - PartyMember, // PLAYER_QUEST_LOG+906 - PartyMember, // PLAYER_QUEST_LOG+907 - PartyMember, // PLAYER_QUEST_LOG+908 - PartyMember, // PLAYER_QUEST_LOG+909 - PartyMember, // PLAYER_QUEST_LOG+910 - PartyMember, // PLAYER_QUEST_LOG+911 - PartyMember, // PLAYER_QUEST_LOG+912 - PartyMember, // PLAYER_QUEST_LOG+913 - PartyMember, // PLAYER_QUEST_LOG+914 - PartyMember, // PLAYER_QUEST_LOG+915 - PartyMember, // PLAYER_QUEST_LOG+916 - PartyMember, // PLAYER_QUEST_LOG+917 - PartyMember, // PLAYER_QUEST_LOG+918 - PartyMember, // PLAYER_QUEST_LOG+919 - PartyMember, // PLAYER_QUEST_LOG+920 - PartyMember, // PLAYER_QUEST_LOG+921 - PartyMember, // PLAYER_QUEST_LOG+922 - PartyMember, // PLAYER_QUEST_LOG+923 - PartyMember, // PLAYER_QUEST_LOG+924 - PartyMember, // PLAYER_QUEST_LOG+925 - PartyMember, // PLAYER_QUEST_LOG+926 - PartyMember, // PLAYER_QUEST_LOG+927 - PartyMember, // PLAYER_QUEST_LOG+928 - PartyMember, // PLAYER_QUEST_LOG+929 - PartyMember, // PLAYER_QUEST_LOG+930 - PartyMember, // PLAYER_QUEST_LOG+931 - PartyMember, // PLAYER_QUEST_LOG+932 - PartyMember, // PLAYER_QUEST_LOG+933 - PartyMember, // PLAYER_QUEST_LOG+934 - PartyMember, // PLAYER_QUEST_LOG+935 - PartyMember, // PLAYER_QUEST_LOG+936 - PartyMember, // PLAYER_QUEST_LOG+937 - PartyMember, // PLAYER_QUEST_LOG+938 - PartyMember, // PLAYER_QUEST_LOG+939 - PartyMember, // PLAYER_QUEST_LOG+940 - PartyMember, // PLAYER_QUEST_LOG+941 - PartyMember, // PLAYER_QUEST_LOG+942 - PartyMember, // PLAYER_QUEST_LOG+943 - PartyMember, // PLAYER_QUEST_LOG+944 - PartyMember, // PLAYER_QUEST_LOG+945 - PartyMember, // PLAYER_QUEST_LOG+946 - PartyMember, // PLAYER_QUEST_LOG+947 - PartyMember, // PLAYER_QUEST_LOG+948 - PartyMember, // PLAYER_QUEST_LOG+949 - PartyMember, // PLAYER_QUEST_LOG+950 - PartyMember, // PLAYER_QUEST_LOG+951 - PartyMember, // PLAYER_QUEST_LOG+952 - PartyMember, // PLAYER_QUEST_LOG+953 - PartyMember, // PLAYER_QUEST_LOG+954 - PartyMember, // PLAYER_QUEST_LOG+955 - PartyMember, // PLAYER_QUEST_LOG+956 - PartyMember, // PLAYER_QUEST_LOG+957 - PartyMember, // PLAYER_QUEST_LOG+958 - PartyMember, // PLAYER_QUEST_LOG+959 - PartyMember, // PLAYER_QUEST_LOG+960 - PartyMember, // PLAYER_QUEST_LOG+961 - PartyMember, // PLAYER_QUEST_LOG+962 - PartyMember, // PLAYER_QUEST_LOG+963 - PartyMember, // PLAYER_QUEST_LOG+964 - PartyMember, // PLAYER_QUEST_LOG+965 - PartyMember, // PLAYER_QUEST_LOG+966 - PartyMember, // PLAYER_QUEST_LOG+967 - PartyMember, // PLAYER_QUEST_LOG+968 - PartyMember, // PLAYER_QUEST_LOG+969 - PartyMember, // PLAYER_QUEST_LOG+970 - PartyMember, // PLAYER_QUEST_LOG+971 - PartyMember, // PLAYER_QUEST_LOG+972 - PartyMember, // PLAYER_QUEST_LOG+973 - PartyMember, // PLAYER_QUEST_LOG+974 - PartyMember, // PLAYER_QUEST_LOG+975 - PartyMember, // PLAYER_QUEST_LOG+976 - PartyMember, // PLAYER_QUEST_LOG+977 - PartyMember, // PLAYER_QUEST_LOG+978 - PartyMember, // PLAYER_QUEST_LOG+979 - PartyMember, // PLAYER_QUEST_LOG+980 - PartyMember, // PLAYER_QUEST_LOG+981 - PartyMember, // PLAYER_QUEST_LOG+982 - PartyMember, // PLAYER_QUEST_LOG+983 - PartyMember, // PLAYER_QUEST_LOG+984 - PartyMember, // PLAYER_QUEST_LOG+985 - PartyMember, // PLAYER_QUEST_LOG+986 - PartyMember, // PLAYER_QUEST_LOG+987 - PartyMember, // PLAYER_QUEST_LOG+988 - PartyMember, // PLAYER_QUEST_LOG+989 - PartyMember, // PLAYER_QUEST_LOG+990 - PartyMember, // PLAYER_QUEST_LOG+991 - PartyMember, // PLAYER_QUEST_LOG+992 - PartyMember, // PLAYER_QUEST_LOG+993 - PartyMember, // PLAYER_QUEST_LOG+994 - PartyMember, // PLAYER_QUEST_LOG+995 - PartyMember, // PLAYER_QUEST_LOG+996 - PartyMember, // PLAYER_QUEST_LOG+997 - PartyMember, // PLAYER_QUEST_LOG+998 - PartyMember, // PLAYER_QUEST_LOG+999 - PartyMember, // PLAYER_QUEST_LOG+1000 - PartyMember, // PLAYER_QUEST_LOG+1001 - PartyMember, // PLAYER_QUEST_LOG+1002 - PartyMember, // PLAYER_QUEST_LOG+1003 - PartyMember, // PLAYER_QUEST_LOG+1004 - PartyMember, // PLAYER_QUEST_LOG+1005 - PartyMember, // PLAYER_QUEST_LOG+1006 - PartyMember, // PLAYER_QUEST_LOG+1007 - PartyMember, // PLAYER_QUEST_LOG+1008 - PartyMember, // PLAYER_QUEST_LOG+1009 - PartyMember, // PLAYER_QUEST_LOG+1010 - PartyMember, // PLAYER_QUEST_LOG+1011 - PartyMember, // PLAYER_QUEST_LOG+1012 - PartyMember, // PLAYER_QUEST_LOG+1013 - PartyMember, // PLAYER_QUEST_LOG+1014 - PartyMember, // PLAYER_QUEST_LOG+1015 - PartyMember, // PLAYER_QUEST_LOG+1016 - PartyMember, // PLAYER_QUEST_LOG+1017 - PartyMember, // PLAYER_QUEST_LOG+1018 - PartyMember, // PLAYER_QUEST_LOG+1019 - PartyMember, // PLAYER_QUEST_LOG+1020 - PartyMember, // PLAYER_QUEST_LOG+1021 - PartyMember, // PLAYER_QUEST_LOG+1022 - PartyMember, // PLAYER_QUEST_LOG+1023 - PartyMember, // PLAYER_QUEST_LOG+1024 - PartyMember, // PLAYER_QUEST_LOG+1025 - PartyMember, // PLAYER_QUEST_LOG+1026 - PartyMember, // PLAYER_QUEST_LOG+1027 - PartyMember, // PLAYER_QUEST_LOG+1028 - PartyMember, // PLAYER_QUEST_LOG+1029 - PartyMember, // PLAYER_QUEST_LOG+1030 - PartyMember, // PLAYER_QUEST_LOG+1031 - PartyMember, // PLAYER_QUEST_LOG+1032 - PartyMember, // PLAYER_QUEST_LOG+1033 - PartyMember, // PLAYER_QUEST_LOG+1034 - PartyMember, // PLAYER_QUEST_LOG+1035 - PartyMember, // PLAYER_QUEST_LOG+1036 - PartyMember, // PLAYER_QUEST_LOG+1037 - PartyMember, // PLAYER_QUEST_LOG+1038 - PartyMember, // PLAYER_QUEST_LOG+1039 - PartyMember, // PLAYER_QUEST_LOG+1040 - PartyMember, // PLAYER_QUEST_LOG+1041 - PartyMember, // PLAYER_QUEST_LOG+1042 - PartyMember, // PLAYER_QUEST_LOG+1043 - PartyMember, // PLAYER_QUEST_LOG+1044 - PartyMember, // PLAYER_QUEST_LOG+1045 - PartyMember, // PLAYER_QUEST_LOG+1046 - PartyMember, // PLAYER_QUEST_LOG+1047 - PartyMember, // PLAYER_QUEST_LOG+1048 - PartyMember, // PLAYER_QUEST_LOG+1049 - PartyMember, // PLAYER_QUEST_LOG+1050 - PartyMember, // PLAYER_QUEST_LOG+1051 - PartyMember, // PLAYER_QUEST_LOG+1052 - PartyMember, // PLAYER_QUEST_LOG+1053 - PartyMember, // PLAYER_QUEST_LOG+1054 - PartyMember, // PLAYER_QUEST_LOG+1055 - PartyMember, // PLAYER_QUEST_LOG+1056 - PartyMember, // PLAYER_QUEST_LOG+1057 - PartyMember, // PLAYER_QUEST_LOG+1058 - PartyMember, // PLAYER_QUEST_LOG+1059 - PartyMember, // PLAYER_QUEST_LOG+1060 - PartyMember, // PLAYER_QUEST_LOG+1061 - PartyMember, // PLAYER_QUEST_LOG+1062 - PartyMember, // PLAYER_QUEST_LOG+1063 - PartyMember, // PLAYER_QUEST_LOG+1064 - PartyMember, // PLAYER_QUEST_LOG+1065 - PartyMember, // PLAYER_QUEST_LOG+1066 - PartyMember, // PLAYER_QUEST_LOG+1067 - PartyMember, // PLAYER_QUEST_LOG+1068 - PartyMember, // PLAYER_QUEST_LOG+1069 - PartyMember, // PLAYER_QUEST_LOG+1070 - PartyMember, // PLAYER_QUEST_LOG+1071 - PartyMember, // PLAYER_QUEST_LOG+1072 - PartyMember, // PLAYER_QUEST_LOG+1073 - PartyMember, // PLAYER_QUEST_LOG+1074 - PartyMember, // PLAYER_QUEST_LOG+1075 - PartyMember, // PLAYER_QUEST_LOG+1076 - PartyMember, // PLAYER_QUEST_LOG+1077 - PartyMember, // PLAYER_QUEST_LOG+1078 - PartyMember, // PLAYER_QUEST_LOG+1079 - PartyMember, // PLAYER_QUEST_LOG+1080 - PartyMember, // PLAYER_QUEST_LOG+1081 - PartyMember, // PLAYER_QUEST_LOG+1082 - PartyMember, // PLAYER_QUEST_LOG+1083 - PartyMember, // PLAYER_QUEST_LOG+1084 - PartyMember, // PLAYER_QUEST_LOG+1085 - PartyMember, // PLAYER_QUEST_LOG+1086 - PartyMember, // PLAYER_QUEST_LOG+1087 - PartyMember, // PLAYER_QUEST_LOG+1088 - PartyMember, // PLAYER_QUEST_LOG+1089 - PartyMember, // PLAYER_QUEST_LOG+1090 - PartyMember, // PLAYER_QUEST_LOG+1091 - PartyMember, // PLAYER_QUEST_LOG+1092 - PartyMember, // PLAYER_QUEST_LOG+1093 - PartyMember, // PLAYER_QUEST_LOG+1094 - PartyMember, // PLAYER_QUEST_LOG+1095 - PartyMember, // PLAYER_QUEST_LOG+1096 - PartyMember, // PLAYER_QUEST_LOG+1097 - PartyMember, // PLAYER_QUEST_LOG+1098 - PartyMember, // PLAYER_QUEST_LOG+1099 - PartyMember, // PLAYER_QUEST_LOG+1100 - PartyMember, // PLAYER_QUEST_LOG+1101 - PartyMember, // PLAYER_QUEST_LOG+1102 - PartyMember, // PLAYER_QUEST_LOG+1103 - PartyMember, // PLAYER_QUEST_LOG+1104 - PartyMember, // PLAYER_QUEST_LOG+1105 - PartyMember, // PLAYER_QUEST_LOG+1106 - PartyMember, // PLAYER_QUEST_LOG+1107 - PartyMember, // PLAYER_QUEST_LOG+1108 - PartyMember, // PLAYER_QUEST_LOG+1109 - PartyMember, // PLAYER_QUEST_LOG+1110 - PartyMember, // PLAYER_QUEST_LOG+1111 - PartyMember, // PLAYER_QUEST_LOG+1112 - PartyMember, // PLAYER_QUEST_LOG+1113 - PartyMember, // PLAYER_QUEST_LOG+1114 - PartyMember, // PLAYER_QUEST_LOG+1115 - PartyMember, // PLAYER_QUEST_LOG+1116 - PartyMember, // PLAYER_QUEST_LOG+1117 - PartyMember, // PLAYER_QUEST_LOG+1118 - PartyMember, // PLAYER_QUEST_LOG+1119 - PartyMember, // PLAYER_QUEST_LOG+1120 - PartyMember, // PLAYER_QUEST_LOG+1121 - PartyMember, // PLAYER_QUEST_LOG+1122 - PartyMember, // PLAYER_QUEST_LOG+1123 - PartyMember, // PLAYER_QUEST_LOG+1124 - PartyMember, // PLAYER_QUEST_LOG+1125 - PartyMember, // PLAYER_QUEST_LOG+1126 - PartyMember, // PLAYER_QUEST_LOG+1127 - PartyMember, // PLAYER_QUEST_LOG+1128 - PartyMember, // PLAYER_QUEST_LOG+1129 - PartyMember, // PLAYER_QUEST_LOG+1130 - PartyMember, // PLAYER_QUEST_LOG+1131 - PartyMember, // PLAYER_QUEST_LOG+1132 - PartyMember, // PLAYER_QUEST_LOG+1133 - PartyMember, // PLAYER_QUEST_LOG+1134 - PartyMember, // PLAYER_QUEST_LOG+1135 - PartyMember, // PLAYER_QUEST_LOG+1136 - PartyMember, // PLAYER_QUEST_LOG+1137 - PartyMember, // PLAYER_QUEST_LOG+1138 - PartyMember, // PLAYER_QUEST_LOG+1139 - PartyMember, // PLAYER_QUEST_LOG+1140 - PartyMember, // PLAYER_QUEST_LOG+1141 - PartyMember, // PLAYER_QUEST_LOG+1142 - PartyMember, // PLAYER_QUEST_LOG+1143 - PartyMember, // PLAYER_QUEST_LOG+1144 - PartyMember, // PLAYER_QUEST_LOG+1145 - PartyMember, // PLAYER_QUEST_LOG+1146 - PartyMember, // PLAYER_QUEST_LOG+1147 - PartyMember, // PLAYER_QUEST_LOG+1148 - PartyMember, // PLAYER_QUEST_LOG+1149 - PartyMember, // PLAYER_QUEST_LOG+1150 - PartyMember, // PLAYER_QUEST_LOG+1151 - PartyMember, // PLAYER_QUEST_LOG+1152 - PartyMember, // PLAYER_QUEST_LOG+1153 - PartyMember, // PLAYER_QUEST_LOG+1154 - PartyMember, // PLAYER_QUEST_LOG+1155 - PartyMember, // PLAYER_QUEST_LOG+1156 - PartyMember, // PLAYER_QUEST_LOG+1157 - PartyMember, // PLAYER_QUEST_LOG+1158 - PartyMember, // PLAYER_QUEST_LOG+1159 - PartyMember, // PLAYER_QUEST_LOG+1160 - PartyMember, // PLAYER_QUEST_LOG+1161 - PartyMember, // PLAYER_QUEST_LOG+1162 - PartyMember, // PLAYER_QUEST_LOG+1163 - PartyMember, // PLAYER_QUEST_LOG+1164 - PartyMember, // PLAYER_QUEST_LOG+1165 - PartyMember, // PLAYER_QUEST_LOG+1166 - PartyMember, // PLAYER_QUEST_LOG+1167 - PartyMember, // PLAYER_QUEST_LOG+1168 - PartyMember, // PLAYER_QUEST_LOG+1169 - PartyMember, // PLAYER_QUEST_LOG+1170 - PartyMember, // PLAYER_QUEST_LOG+1171 - PartyMember, // PLAYER_QUEST_LOG+1172 - PartyMember, // PLAYER_QUEST_LOG+1173 - PartyMember, // PLAYER_QUEST_LOG+1174 - PartyMember, // PLAYER_QUEST_LOG+1175 - PartyMember, // PLAYER_QUEST_LOG+1176 - PartyMember, // PLAYER_QUEST_LOG+1177 - PartyMember, // PLAYER_QUEST_LOG+1178 - PartyMember, // PLAYER_QUEST_LOG+1179 - PartyMember, // PLAYER_QUEST_LOG+1180 - PartyMember, // PLAYER_QUEST_LOG+1181 - PartyMember, // PLAYER_QUEST_LOG+1182 - PartyMember, // PLAYER_QUEST_LOG+1183 - PartyMember, // PLAYER_QUEST_LOG+1184 - PartyMember, // PLAYER_QUEST_LOG+1185 - PartyMember, // PLAYER_QUEST_LOG+1186 - PartyMember, // PLAYER_QUEST_LOG+1187 - PartyMember, // PLAYER_QUEST_LOG+1188 - PartyMember, // PLAYER_QUEST_LOG+1189 - PartyMember, // PLAYER_QUEST_LOG+1190 - PartyMember, // PLAYER_QUEST_LOG+1191 - PartyMember, // PLAYER_QUEST_LOG+1192 - PartyMember, // PLAYER_QUEST_LOG+1193 - PartyMember, // PLAYER_QUEST_LOG+1194 - PartyMember, // PLAYER_QUEST_LOG+1195 - PartyMember, // PLAYER_QUEST_LOG+1196 - PartyMember, // PLAYER_QUEST_LOG+1197 - PartyMember, // PLAYER_QUEST_LOG+1198 - PartyMember, // PLAYER_QUEST_LOG+1199 - PartyMember, // PLAYER_QUEST_LOG+1200 - PartyMember, // PLAYER_QUEST_LOG+1201 - PartyMember, // PLAYER_QUEST_LOG+1202 - PartyMember, // PLAYER_QUEST_LOG+1203 - PartyMember, // PLAYER_QUEST_LOG+1204 - PartyMember, // PLAYER_QUEST_LOG+1205 - PartyMember, // PLAYER_QUEST_LOG+1206 - PartyMember, // PLAYER_QUEST_LOG+1207 - PartyMember, // PLAYER_QUEST_LOG+1208 - PartyMember, // PLAYER_QUEST_LOG+1209 - PartyMember, // PLAYER_QUEST_LOG+1210 - PartyMember, // PLAYER_QUEST_LOG+1211 - PartyMember, // PLAYER_QUEST_LOG+1212 - PartyMember, // PLAYER_QUEST_LOG+1213 - PartyMember, // PLAYER_QUEST_LOG+1214 - PartyMember, // PLAYER_QUEST_LOG+1215 - PartyMember, // PLAYER_QUEST_LOG+1216 - PartyMember, // PLAYER_QUEST_LOG+1217 - PartyMember, // PLAYER_QUEST_LOG+1218 - PartyMember, // PLAYER_QUEST_LOG+1219 - PartyMember, // PLAYER_QUEST_LOG+1220 - PartyMember, // PLAYER_QUEST_LOG+1221 - PartyMember, // PLAYER_QUEST_LOG+1222 - PartyMember, // PLAYER_QUEST_LOG+1223 - PartyMember, // PLAYER_QUEST_LOG+1224 - PartyMember, // PLAYER_QUEST_LOG+1225 - PartyMember, // PLAYER_QUEST_LOG+1226 - PartyMember, // PLAYER_QUEST_LOG+1227 - PartyMember, // PLAYER_QUEST_LOG+1228 - PartyMember, // PLAYER_QUEST_LOG+1229 - PartyMember, // PLAYER_QUEST_LOG+1230 - PartyMember, // PLAYER_QUEST_LOG+1231 - PartyMember, // PLAYER_QUEST_LOG+1232 - PartyMember, // PLAYER_QUEST_LOG+1233 - PartyMember, // PLAYER_QUEST_LOG+1234 - PartyMember, // PLAYER_QUEST_LOG+1235 - PartyMember, // PLAYER_QUEST_LOG+1236 - PartyMember, // PLAYER_QUEST_LOG+1237 - PartyMember, // PLAYER_QUEST_LOG+1238 - PartyMember, // PLAYER_QUEST_LOG+1239 - PartyMember, // PLAYER_QUEST_LOG+1240 - PartyMember, // PLAYER_QUEST_LOG+1241 - PartyMember, // PLAYER_QUEST_LOG+1242 - PartyMember, // PLAYER_QUEST_LOG+1243 - PartyMember, // PLAYER_QUEST_LOG+1244 - PartyMember, // PLAYER_QUEST_LOG+1245 - PartyMember, // PLAYER_QUEST_LOG+1246 - PartyMember, // PLAYER_QUEST_LOG+1247 - PartyMember, // PLAYER_QUEST_LOG+1248 - PartyMember, // PLAYER_QUEST_LOG+1249 - PartyMember, // PLAYER_QUEST_LOG+1250 - PartyMember, // PLAYER_QUEST_LOG+1251 - PartyMember, // PLAYER_QUEST_LOG+1252 - PartyMember, // PLAYER_QUEST_LOG+1253 - PartyMember, // PLAYER_QUEST_LOG+1254 - PartyMember, // PLAYER_QUEST_LOG+1255 - PartyMember, // PLAYER_QUEST_LOG+1256 - PartyMember, // PLAYER_QUEST_LOG+1257 - PartyMember, // PLAYER_QUEST_LOG+1258 - PartyMember, // PLAYER_QUEST_LOG+1259 - PartyMember, // PLAYER_QUEST_LOG+1260 - PartyMember, // PLAYER_QUEST_LOG+1261 - PartyMember, // PLAYER_QUEST_LOG+1262 - PartyMember, // PLAYER_QUEST_LOG+1263 - PartyMember, // PLAYER_QUEST_LOG+1264 - PartyMember, // PLAYER_QUEST_LOG+1265 - PartyMember, // PLAYER_QUEST_LOG+1266 - PartyMember, // PLAYER_QUEST_LOG+1267 - PartyMember, // PLAYER_QUEST_LOG+1268 - PartyMember, // PLAYER_QUEST_LOG+1269 - PartyMember, // PLAYER_QUEST_LOG+1270 - PartyMember, // PLAYER_QUEST_LOG+1271 - PartyMember, // PLAYER_QUEST_LOG+1272 - PartyMember, // PLAYER_QUEST_LOG+1273 - PartyMember, // PLAYER_QUEST_LOG+1274 - PartyMember, // PLAYER_QUEST_LOG+1275 - PartyMember, // PLAYER_QUEST_LOG+1276 - PartyMember, // PLAYER_QUEST_LOG+1277 - PartyMember, // PLAYER_QUEST_LOG+1278 - PartyMember, // PLAYER_QUEST_LOG+1279 - PartyMember, // PLAYER_QUEST_LOG+1280 - PartyMember, // PLAYER_QUEST_LOG+1281 - PartyMember, // PLAYER_QUEST_LOG+1282 - PartyMember, // PLAYER_QUEST_LOG+1283 - PartyMember, // PLAYER_QUEST_LOG+1284 - PartyMember, // PLAYER_QUEST_LOG+1285 - PartyMember, // PLAYER_QUEST_LOG+1286 - PartyMember, // PLAYER_QUEST_LOG+1287 - PartyMember, // PLAYER_QUEST_LOG+1288 - PartyMember, // PLAYER_QUEST_LOG+1289 - PartyMember, // PLAYER_QUEST_LOG+1290 - PartyMember, // PLAYER_QUEST_LOG+1291 - PartyMember, // PLAYER_QUEST_LOG+1292 - PartyMember, // PLAYER_QUEST_LOG+1293 - PartyMember, // PLAYER_QUEST_LOG+1294 - PartyMember, // PLAYER_QUEST_LOG+1295 - PartyMember, // PLAYER_QUEST_LOG+1296 - PartyMember, // PLAYER_QUEST_LOG+1297 - PartyMember, // PLAYER_QUEST_LOG+1298 - PartyMember, // PLAYER_QUEST_LOG+1299 - PartyMember, // PLAYER_QUEST_LOG+1300 - PartyMember, // PLAYER_QUEST_LOG+1301 - PartyMember, // PLAYER_QUEST_LOG+1302 - PartyMember, // PLAYER_QUEST_LOG+1303 - PartyMember, // PLAYER_QUEST_LOG+1304 - PartyMember, // PLAYER_QUEST_LOG+1305 - PartyMember, // PLAYER_QUEST_LOG+1306 - PartyMember, // PLAYER_QUEST_LOG+1307 - PartyMember, // PLAYER_QUEST_LOG+1308 - PartyMember, // PLAYER_QUEST_LOG+1309 - PartyMember, // PLAYER_QUEST_LOG+1310 - PartyMember, // PLAYER_QUEST_LOG+1311 - PartyMember, // PLAYER_QUEST_LOG+1312 - PartyMember, // PLAYER_QUEST_LOG+1313 - PartyMember, // PLAYER_QUEST_LOG+1314 - PartyMember, // PLAYER_QUEST_LOG+1315 - PartyMember, // PLAYER_QUEST_LOG+1316 - PartyMember, // PLAYER_QUEST_LOG+1317 - PartyMember, // PLAYER_QUEST_LOG+1318 - PartyMember, // PLAYER_QUEST_LOG+1319 - PartyMember, // PLAYER_QUEST_LOG+1320 - PartyMember, // PLAYER_QUEST_LOG+1321 - PartyMember, // PLAYER_QUEST_LOG+1322 - PartyMember, // PLAYER_QUEST_LOG+1323 - PartyMember, // PLAYER_QUEST_LOG+1324 - PartyMember, // PLAYER_QUEST_LOG+1325 - PartyMember, // PLAYER_QUEST_LOG+1326 - PartyMember, // PLAYER_QUEST_LOG+1327 - PartyMember, // PLAYER_QUEST_LOG+1328 - PartyMember, // PLAYER_QUEST_LOG+1329 - PartyMember, // PLAYER_QUEST_LOG+1330 - PartyMember, // PLAYER_QUEST_LOG+1331 - PartyMember, // PLAYER_QUEST_LOG+1332 - PartyMember, // PLAYER_QUEST_LOG+1333 - PartyMember, // PLAYER_QUEST_LOG+1334 - PartyMember, // PLAYER_QUEST_LOG+1335 - PartyMember, // PLAYER_QUEST_LOG+1336 - PartyMember, // PLAYER_QUEST_LOG+1337 - PartyMember, // PLAYER_QUEST_LOG+1338 - PartyMember, // PLAYER_QUEST_LOG+1339 - PartyMember, // PLAYER_QUEST_LOG+1340 - PartyMember, // PLAYER_QUEST_LOG+1341 - PartyMember, // PLAYER_QUEST_LOG+1342 - PartyMember, // PLAYER_QUEST_LOG+1343 - PartyMember, // PLAYER_QUEST_LOG+1344 - PartyMember, // PLAYER_QUEST_LOG+1345 - PartyMember, // PLAYER_QUEST_LOG+1346 - PartyMember, // PLAYER_QUEST_LOG+1347 - PartyMember, // PLAYER_QUEST_LOG+1348 - PartyMember, // PLAYER_QUEST_LOG+1349 - PartyMember, // PLAYER_QUEST_LOG+1350 - PartyMember, // PLAYER_QUEST_LOG+1351 - PartyMember, // PLAYER_QUEST_LOG+1352 - PartyMember, // PLAYER_QUEST_LOG+1353 - PartyMember, // PLAYER_QUEST_LOG+1354 - PartyMember, // PLAYER_QUEST_LOG+1355 - PartyMember, // PLAYER_QUEST_LOG+1356 - PartyMember, // PLAYER_QUEST_LOG+1357 - PartyMember, // PLAYER_QUEST_LOG+1358 - PartyMember, // PLAYER_QUEST_LOG+1359 - PartyMember, // PLAYER_QUEST_LOG+1360 - PartyMember, // PLAYER_QUEST_LOG+1361 - PartyMember, // PLAYER_QUEST_LOG+1362 - PartyMember, // PLAYER_QUEST_LOG+1363 - PartyMember, // PLAYER_QUEST_LOG+1364 - PartyMember, // PLAYER_QUEST_LOG+1365 - PartyMember, // PLAYER_QUEST_LOG+1366 - PartyMember, // PLAYER_QUEST_LOG+1367 - PartyMember, // PLAYER_QUEST_LOG+1368 - PartyMember, // PLAYER_QUEST_LOG+1369 - PartyMember, // PLAYER_QUEST_LOG+1370 - PartyMember, // PLAYER_QUEST_LOG+1371 - PartyMember, // PLAYER_QUEST_LOG+1372 - PartyMember, // PLAYER_QUEST_LOG+1373 - PartyMember, // PLAYER_QUEST_LOG+1374 - PartyMember, // PLAYER_QUEST_LOG+1375 - PartyMember, // PLAYER_QUEST_LOG+1376 - PartyMember, // PLAYER_QUEST_LOG+1377 - PartyMember, // PLAYER_QUEST_LOG+1378 - PartyMember, // PLAYER_QUEST_LOG+1379 - PartyMember, // PLAYER_QUEST_LOG+1380 - PartyMember, // PLAYER_QUEST_LOG+1381 - PartyMember, // PLAYER_QUEST_LOG+1382 - PartyMember, // PLAYER_QUEST_LOG+1383 - PartyMember, // PLAYER_QUEST_LOG+1384 - PartyMember, // PLAYER_QUEST_LOG+1385 - PartyMember, // PLAYER_QUEST_LOG+1386 - PartyMember, // PLAYER_QUEST_LOG+1387 - PartyMember, // PLAYER_QUEST_LOG+1388 - PartyMember, // PLAYER_QUEST_LOG+1389 - PartyMember, // PLAYER_QUEST_LOG+1390 - PartyMember, // PLAYER_QUEST_LOG+1391 - PartyMember, // PLAYER_QUEST_LOG+1392 - PartyMember, // PLAYER_QUEST_LOG+1393 - PartyMember, // PLAYER_QUEST_LOG+1394 - PartyMember, // PLAYER_QUEST_LOG+1395 - PartyMember, // PLAYER_QUEST_LOG+1396 - PartyMember, // PLAYER_QUEST_LOG+1397 - PartyMember, // PLAYER_QUEST_LOG+1398 - PartyMember, // PLAYER_QUEST_LOG+1399 - PartyMember, // PLAYER_QUEST_LOG+1400 - PartyMember, // PLAYER_QUEST_LOG+1401 - PartyMember, // PLAYER_QUEST_LOG+1402 - PartyMember, // PLAYER_QUEST_LOG+1403 - PartyMember, // PLAYER_QUEST_LOG+1404 - PartyMember, // PLAYER_QUEST_LOG+1405 - PartyMember, // PLAYER_QUEST_LOG+1406 - PartyMember, // PLAYER_QUEST_LOG+1407 - PartyMember, // PLAYER_QUEST_LOG+1408 - PartyMember, // PLAYER_QUEST_LOG+1409 - PartyMember, // PLAYER_QUEST_LOG+1410 - PartyMember, // PLAYER_QUEST_LOG+1411 - PartyMember, // PLAYER_QUEST_LOG+1412 - PartyMember, // PLAYER_QUEST_LOG+1413 - PartyMember, // PLAYER_QUEST_LOG+1414 - PartyMember, // PLAYER_QUEST_LOG+1415 - PartyMember, // PLAYER_QUEST_LOG+1416 - PartyMember, // PLAYER_QUEST_LOG+1417 - PartyMember, // PLAYER_QUEST_LOG+1418 - PartyMember, // PLAYER_QUEST_LOG+1419 - PartyMember, // PLAYER_QUEST_LOG+1420 - PartyMember, // PLAYER_QUEST_LOG+1421 - PartyMember, // PLAYER_QUEST_LOG+1422 - PartyMember, // PLAYER_QUEST_LOG+1423 - PartyMember, // PLAYER_QUEST_LOG+1424 - PartyMember, // PLAYER_QUEST_LOG+1425 - PartyMember, // PLAYER_QUEST_LOG+1426 - PartyMember, // PLAYER_QUEST_LOG+1427 - PartyMember, // PLAYER_QUEST_LOG+1428 - PartyMember, // PLAYER_QUEST_LOG+1429 - PartyMember, // PLAYER_QUEST_LOG+1430 - PartyMember, // PLAYER_QUEST_LOG+1431 - PartyMember, // PLAYER_QUEST_LOG+1432 - PartyMember, // PLAYER_QUEST_LOG+1433 - PartyMember, // PLAYER_QUEST_LOG+1434 - PartyMember, // PLAYER_QUEST_LOG+1435 - PartyMember, // PLAYER_QUEST_LOG+1436 - PartyMember, // PLAYER_QUEST_LOG+1437 - PartyMember, // PLAYER_QUEST_LOG+1438 - PartyMember, // PLAYER_QUEST_LOG+1439 - PartyMember, // PLAYER_QUEST_LOG+1440 - PartyMember, // PLAYER_QUEST_LOG+1441 - PartyMember, // PLAYER_QUEST_LOG+1442 - PartyMember, // PLAYER_QUEST_LOG+1443 - PartyMember, // PLAYER_QUEST_LOG+1444 - PartyMember, // PLAYER_QUEST_LOG+1445 - PartyMember, // PLAYER_QUEST_LOG+1446 - PartyMember, // PLAYER_QUEST_LOG+1447 - PartyMember, // PLAYER_QUEST_LOG+1448 - PartyMember, // PLAYER_QUEST_LOG+1449 - PartyMember, // PLAYER_QUEST_LOG+1450 - PartyMember, // PLAYER_QUEST_LOG+1451 - PartyMember, // PLAYER_QUEST_LOG+1452 - PartyMember, // PLAYER_QUEST_LOG+1453 - PartyMember, // PLAYER_QUEST_LOG+1454 - PartyMember, // PLAYER_QUEST_LOG+1455 - PartyMember, // PLAYER_QUEST_LOG+1456 - PartyMember, // PLAYER_QUEST_LOG+1457 - PartyMember, // PLAYER_QUEST_LOG+1458 - PartyMember, // PLAYER_QUEST_LOG+1459 - PartyMember, // PLAYER_QUEST_LOG+1460 - PartyMember, // PLAYER_QUEST_LOG+1461 - PartyMember, // PLAYER_QUEST_LOG+1462 - PartyMember, // PLAYER_QUEST_LOG+1463 - PartyMember, // PLAYER_QUEST_LOG+1464 - PartyMember, // PLAYER_QUEST_LOG+1465 - PartyMember, // PLAYER_QUEST_LOG+1466 - PartyMember, // PLAYER_QUEST_LOG+1467 - PartyMember, // PLAYER_QUEST_LOG+1468 - PartyMember, // PLAYER_QUEST_LOG+1469 - PartyMember, // PLAYER_QUEST_LOG+1470 - PartyMember, // PLAYER_QUEST_LOG+1471 - PartyMember, // PLAYER_QUEST_LOG+1472 - PartyMember, // PLAYER_QUEST_LOG+1473 - PartyMember, // PLAYER_QUEST_LOG+1474 - PartyMember, // PLAYER_QUEST_LOG+1475 - PartyMember, // PLAYER_QUEST_LOG+1476 - PartyMember, // PLAYER_QUEST_LOG+1477 - PartyMember, // PLAYER_QUEST_LOG+1478 - PartyMember, // PLAYER_QUEST_LOG+1479 - PartyMember, // PLAYER_QUEST_LOG+1480 - PartyMember, // PLAYER_QUEST_LOG+1481 - PartyMember, // PLAYER_QUEST_LOG+1482 - PartyMember, // PLAYER_QUEST_LOG+1483 - PartyMember, // PLAYER_QUEST_LOG+1484 - PartyMember, // PLAYER_QUEST_LOG+1485 - PartyMember, // PLAYER_QUEST_LOG+1486 - PartyMember, // PLAYER_QUEST_LOG+1487 - PartyMember, // PLAYER_QUEST_LOG+1488 - PartyMember, // PLAYER_QUEST_LOG+1489 - PartyMember, // PLAYER_QUEST_LOG+1490 - PartyMember, // PLAYER_QUEST_LOG+1491 - PartyMember, // PLAYER_QUEST_LOG+1492 - PartyMember, // PLAYER_QUEST_LOG+1493 - PartyMember, // PLAYER_QUEST_LOG+1494 - PartyMember, // PLAYER_QUEST_LOG+1495 - PartyMember, // PLAYER_QUEST_LOG+1496 - PartyMember, // PLAYER_QUEST_LOG+1497 - PartyMember, // PLAYER_QUEST_LOG+1498 - PartyMember, // PLAYER_QUEST_LOG+1499 - PartyMember, // PLAYER_QUEST_LOG+1500 - PartyMember, // PLAYER_QUEST_LOG+1501 - PartyMember, // PLAYER_QUEST_LOG+1502 - PartyMember, // PLAYER_QUEST_LOG+1503 - PartyMember, // PLAYER_QUEST_LOG+1504 - PartyMember, // PLAYER_QUEST_LOG+1505 - PartyMember, // PLAYER_QUEST_LOG+1506 - PartyMember, // PLAYER_QUEST_LOG+1507 - PartyMember, // PLAYER_QUEST_LOG+1508 - PartyMember, // PLAYER_QUEST_LOG+1509 - PartyMember, // PLAYER_QUEST_LOG+1510 - PartyMember, // PLAYER_QUEST_LOG+1511 - PartyMember, // PLAYER_QUEST_LOG+1512 - PartyMember, // PLAYER_QUEST_LOG+1513 - PartyMember, // PLAYER_QUEST_LOG+1514 - PartyMember, // PLAYER_QUEST_LOG+1515 - PartyMember, // PLAYER_QUEST_LOG+1516 - PartyMember, // PLAYER_QUEST_LOG+1517 - PartyMember, // PLAYER_QUEST_LOG+1518 - PartyMember, // PLAYER_QUEST_LOG+1519 - PartyMember, // PLAYER_QUEST_LOG+1520 - PartyMember, // PLAYER_QUEST_LOG+1521 - PartyMember, // PLAYER_QUEST_LOG+1522 - PartyMember, // PLAYER_QUEST_LOG+1523 - PartyMember, // PLAYER_QUEST_LOG+1524 - PartyMember, // PLAYER_QUEST_LOG+1525 - PartyMember, // PLAYER_QUEST_LOG+1526 - PartyMember, // PLAYER_QUEST_LOG+1527 - PartyMember, // PLAYER_QUEST_LOG+1528 - PartyMember, // PLAYER_QUEST_LOG+1529 - PartyMember, // PLAYER_QUEST_LOG+1530 - PartyMember, // PLAYER_QUEST_LOG+1531 - PartyMember, // PLAYER_QUEST_LOG+1532 - PartyMember, // PLAYER_QUEST_LOG+1533 - PartyMember, // PLAYER_QUEST_LOG+1534 - PartyMember, // PLAYER_QUEST_LOG+1535 - PartyMember, // PLAYER_QUEST_LOG+1536 - PartyMember, // PLAYER_QUEST_LOG+1537 - PartyMember, // PLAYER_QUEST_LOG+1538 - PartyMember, // PLAYER_QUEST_LOG+1539 - PartyMember, // PLAYER_QUEST_LOG+1540 - PartyMember, // PLAYER_QUEST_LOG+1541 - PartyMember, // PLAYER_QUEST_LOG+1542 - PartyMember, // PLAYER_QUEST_LOG+1543 - PartyMember, // PLAYER_QUEST_LOG+1544 - PartyMember, // PLAYER_QUEST_LOG+1545 - PartyMember, // PLAYER_QUEST_LOG+1546 - PartyMember, // PLAYER_QUEST_LOG+1547 - PartyMember, // PLAYER_QUEST_LOG+1548 - PartyMember, // PLAYER_QUEST_LOG+1549 - PartyMember, // PLAYER_QUEST_LOG+1550 - PartyMember, // PLAYER_QUEST_LOG+1551 - PartyMember, // PLAYER_QUEST_LOG+1552 - PartyMember, // PLAYER_QUEST_LOG+1553 - PartyMember, // PLAYER_QUEST_LOG+1554 - PartyMember, // PLAYER_QUEST_LOG+1555 - PartyMember, // PLAYER_QUEST_LOG+1556 - PartyMember, // PLAYER_QUEST_LOG+1557 - PartyMember, // PLAYER_QUEST_LOG+1558 - PartyMember, // PLAYER_QUEST_LOG+1559 - PartyMember, // PLAYER_QUEST_LOG+1560 - PartyMember, // PLAYER_QUEST_LOG+1561 - PartyMember, // PLAYER_QUEST_LOG+1562 - PartyMember, // PLAYER_QUEST_LOG+1563 - PartyMember, // PLAYER_QUEST_LOG+1564 - PartyMember, // PLAYER_QUEST_LOG+1565 - PartyMember, // PLAYER_QUEST_LOG+1566 - PartyMember, // PLAYER_QUEST_LOG+1567 - PartyMember, // PLAYER_QUEST_LOG+1568 - PartyMember, // PLAYER_QUEST_LOG+1569 - PartyMember, // PLAYER_QUEST_LOG+1570 - PartyMember, // PLAYER_QUEST_LOG+1571 - PartyMember, // PLAYER_QUEST_LOG+1572 - PartyMember, // PLAYER_QUEST_LOG+1573 - PartyMember, // PLAYER_QUEST_LOG+1574 - PartyMember, // PLAYER_QUEST_LOG+1575 - PartyMember, // PLAYER_QUEST_LOG+1576 - PartyMember, // PLAYER_QUEST_LOG+1577 - PartyMember, // PLAYER_QUEST_LOG+1578 - PartyMember, // PLAYER_QUEST_LOG+1579 - PartyMember, // PLAYER_QUEST_LOG+1580 - PartyMember, // PLAYER_QUEST_LOG+1581 - PartyMember, // PLAYER_QUEST_LOG+1582 - PartyMember, // PLAYER_QUEST_LOG+1583 - PartyMember, // PLAYER_QUEST_LOG+1584 - PartyMember, // PLAYER_QUEST_LOG+1585 - PartyMember, // PLAYER_QUEST_LOG+1586 - PartyMember, // PLAYER_QUEST_LOG+1587 - PartyMember, // PLAYER_QUEST_LOG+1588 - PartyMember, // PLAYER_QUEST_LOG+1589 - PartyMember, // PLAYER_QUEST_LOG+1590 - PartyMember, // PLAYER_QUEST_LOG+1591 - PartyMember, // PLAYER_QUEST_LOG+1592 - PartyMember, // PLAYER_QUEST_LOG+1593 - PartyMember, // PLAYER_QUEST_LOG+1594 - PartyMember, // PLAYER_QUEST_LOG+1595 - PartyMember, // PLAYER_QUEST_LOG+1596 - PartyMember, // PLAYER_QUEST_LOG+1597 - PartyMember, // PLAYER_QUEST_LOG+1598 - PartyMember, // PLAYER_QUEST_LOG+1599 - Public, // PLAYER_VISIBLE_ITEM - Public, // PLAYER_VISIBLE_ITEM+1 - Public, // PLAYER_VISIBLE_ITEM+2 - Public, // PLAYER_VISIBLE_ITEM+3 - Public, // PLAYER_VISIBLE_ITEM+4 - Public, // PLAYER_VISIBLE_ITEM+5 - Public, // PLAYER_VISIBLE_ITEM+6 - Public, // PLAYER_VISIBLE_ITEM+7 - Public, // PLAYER_VISIBLE_ITEM+8 - Public, // PLAYER_VISIBLE_ITEM+9 - Public, // PLAYER_VISIBLE_ITEM+10 - Public, // PLAYER_VISIBLE_ITEM+11 - Public, // PLAYER_VISIBLE_ITEM+12 - Public, // PLAYER_VISIBLE_ITEM+13 - Public, // PLAYER_VISIBLE_ITEM+14 - Public, // PLAYER_VISIBLE_ITEM+15 - Public, // PLAYER_VISIBLE_ITEM+16 - Public, // PLAYER_VISIBLE_ITEM+17 - Public, // PLAYER_VISIBLE_ITEM+18 - Public, // PLAYER_VISIBLE_ITEM+19 - Public, // PLAYER_VISIBLE_ITEM+20 - Public, // PLAYER_VISIBLE_ITEM+21 - Public, // PLAYER_VISIBLE_ITEM+22 - Public, // PLAYER_VISIBLE_ITEM+23 - Public, // PLAYER_VISIBLE_ITEM+24 - Public, // PLAYER_VISIBLE_ITEM+25 - Public, // PLAYER_VISIBLE_ITEM+26 - Public, // PLAYER_VISIBLE_ITEM+27 - Public, // PLAYER_VISIBLE_ITEM+28 - Public, // PLAYER_VISIBLE_ITEM+29 - Public, // PLAYER_VISIBLE_ITEM+30 - Public, // PLAYER_VISIBLE_ITEM+31 - Public, // PLAYER_VISIBLE_ITEM+32 - Public, // PLAYER_VISIBLE_ITEM+33 - Public, // PLAYER_VISIBLE_ITEM+34 - Public, // PLAYER_VISIBLE_ITEM+35 - Public, // PLAYER_VISIBLE_ITEM+36 - Public, // PLAYER_VISIBLE_ITEM+37 - Public, // PLAYER_CHOSEN_TITLE - Public, // PLAYER_FAKE_INEBRIATION - Public, // PLAYER_FIELD_VIRTUAL_PLAYER_REALM - Public, // PLAYER_FIELD_CURRENT_SPEC_ID - Public, // PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID - Public, // PLAYER_FIELD_AVG_ITEM_LEVEL - Public, // PLAYER_FIELD_AVG_ITEM_LEVEL+1 - Public, // PLAYER_FIELD_AVG_ITEM_LEVEL+2 - Public, // PLAYER_FIELD_AVG_ITEM_LEVEL+3 - Public, // PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY - Public, // PLAYER_FIELD_HONOR_LEVEL - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+1 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+2 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+3 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+4 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+5 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+6 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+7 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+8 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+9 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+10 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+11 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+12 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+13 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+14 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+15 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+16 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+17 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+18 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+19 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+20 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+21 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+22 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+23 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+24 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+25 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+26 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+27 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+28 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+29 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+30 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+31 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+32 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+33 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+34 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+35 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+36 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+37 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+38 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+39 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+40 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+41 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+42 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+43 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+44 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+45 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+46 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+47 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+48 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+49 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+50 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+51 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+52 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+53 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+54 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+55 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+56 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+57 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+58 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+59 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+60 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+61 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+62 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+63 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+64 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+65 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+66 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+67 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+68 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+69 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+70 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+71 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+72 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+73 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+74 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+75 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+76 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+77 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+78 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+79 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+80 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+81 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+82 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+83 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+84 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+85 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+86 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+87 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+88 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+89 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+90 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+91 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+92 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+93 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+94 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+95 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+96 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+97 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+98 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+99 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+100 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+101 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+102 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+103 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+104 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+105 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+106 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+107 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+108 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+109 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+110 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+111 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+112 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+113 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+114 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+115 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+116 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+117 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+118 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+119 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+120 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+121 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+122 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+123 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+124 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+125 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+126 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+127 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+128 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+129 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+130 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+131 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+132 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+133 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+134 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+135 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+136 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+137 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+138 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+139 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+140 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+141 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+142 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+143 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+144 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+145 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+146 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+147 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+148 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+149 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+150 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+151 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+152 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+153 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+154 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+155 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+156 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+157 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+158 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+159 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+160 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+161 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+162 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+163 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+164 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+165 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+166 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+167 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+168 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+169 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+170 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+171 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+172 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+173 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+174 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+175 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+176 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+177 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+178 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+179 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+180 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+181 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+182 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+183 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+184 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+185 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+186 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+187 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+188 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+189 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+190 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+191 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+192 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+193 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+194 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+195 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+196 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+197 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+198 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+199 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+200 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+201 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+202 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+203 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+204 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+205 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+206 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+207 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+208 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+209 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+210 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+211 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+212 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+213 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+214 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+215 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+216 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+217 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+218 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+219 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+220 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+221 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+222 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+223 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+224 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+225 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+226 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+227 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+228 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+229 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+230 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+231 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+232 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+233 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+234 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+235 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+236 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+237 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+238 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+239 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+240 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+241 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+242 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+243 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+244 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+245 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+246 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+247 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+248 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+249 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+250 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+251 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+252 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+253 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+254 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+255 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+256 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+257 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+258 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+259 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+260 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+261 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+262 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+263 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+264 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+265 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+266 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+267 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+268 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+269 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+270 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+271 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+272 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+273 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+274 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+275 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+276 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+277 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+278 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+279 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+280 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+281 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+282 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+283 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+284 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+285 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+286 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+287 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+288 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+289 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+290 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+291 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+292 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+293 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+294 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+295 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+296 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+297 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+298 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+299 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+300 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+301 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+302 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+303 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+304 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+305 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+306 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+307 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+308 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+309 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+310 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+311 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+312 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+313 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+314 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+315 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+316 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+317 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+318 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+319 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+320 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+321 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+322 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+323 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+324 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+325 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+326 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+327 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+328 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+329 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+330 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+331 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+332 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+333 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+334 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+335 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+336 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+337 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+338 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+339 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+340 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+341 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+342 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+343 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+344 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+345 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+346 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+347 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+348 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+349 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+350 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+351 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+352 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+353 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+354 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+355 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+356 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+357 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+358 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+359 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+360 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+361 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+362 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+363 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+364 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+365 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+366 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+367 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+368 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+369 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+370 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+371 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+372 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+373 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+374 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+375 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+376 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+377 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+378 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+379 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+380 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+381 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+382 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+383 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+384 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+385 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+386 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+387 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+388 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+389 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+390 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+391 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+392 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+393 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+394 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+395 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+396 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+397 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+398 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+399 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+400 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+401 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+402 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+403 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+404 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+405 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+406 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+407 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+408 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+409 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+410 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+411 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+412 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+413 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+414 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+415 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+416 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+417 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+418 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+419 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+420 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+421 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+422 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+423 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+424 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+425 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+426 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+427 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+428 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+429 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+430 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+431 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+432 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+433 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+434 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+435 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+436 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+437 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+438 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+439 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+440 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+441 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+442 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+443 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+444 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+445 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+446 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+447 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+448 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+449 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+450 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+451 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+452 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+453 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+454 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+455 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+456 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+457 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+458 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+459 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+460 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+461 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+462 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+463 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+464 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+465 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+466 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+467 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+468 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+469 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+470 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+471 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+472 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+473 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+474 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+475 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+476 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+477 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+478 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+479 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+480 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+481 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+482 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+483 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+484 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+485 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+486 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+487 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+488 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+489 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+490 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+491 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+492 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+493 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+494 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+495 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+496 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+497 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+498 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+499 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+500 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+501 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+502 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+503 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+504 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+505 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+506 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+507 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+508 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+509 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+510 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+511 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+512 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+513 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+514 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+515 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+516 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+517 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+518 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+519 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+520 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+521 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+522 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+523 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+524 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+525 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+526 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+527 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+528 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+529 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+530 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+531 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+532 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+533 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+534 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+535 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+536 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+537 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+538 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+539 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+540 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+541 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+542 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+543 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+544 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+545 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+546 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+547 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+548 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+549 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+550 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+551 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+552 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+553 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+554 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+555 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+556 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+557 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+558 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+559 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+560 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+561 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+562 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+563 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+564 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+565 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+566 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+567 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+568 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+569 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+570 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+571 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+572 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+573 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+574 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+575 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+576 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+577 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+578 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+579 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+580 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+581 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+582 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+583 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+584 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+585 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+586 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+587 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+588 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+589 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+590 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+591 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+592 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+593 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+594 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+595 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+596 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+597 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+598 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+599 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+600 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+601 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+602 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+603 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+604 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+605 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+606 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+607 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+608 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+609 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+610 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+611 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+612 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+613 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+614 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+615 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+616 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+617 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+618 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+619 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+620 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+621 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+622 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+623 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+624 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+625 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+626 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+627 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+628 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+629 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+630 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+631 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+632 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+633 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+634 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+635 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+636 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+637 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+638 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+639 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+640 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+641 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+642 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+643 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+644 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+645 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+646 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+647 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+648 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+649 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+650 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+651 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+652 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+653 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+654 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+655 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+656 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+657 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+658 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+659 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+660 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+661 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+662 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+663 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+664 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+665 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+666 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+667 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+668 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+669 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+670 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+671 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+672 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+673 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+674 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+675 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+676 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+677 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+678 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+679 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+680 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+681 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+682 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+683 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+684 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+685 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+686 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+687 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+688 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+689 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+690 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+691 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+692 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+693 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+694 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+695 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+696 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+697 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+698 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+699 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+700 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+701 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+702 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+703 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+704 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+705 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+706 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+707 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+708 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+709 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+710 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+711 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+712 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+713 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+714 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+715 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+716 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+717 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+718 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+719 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+720 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+721 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+722 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+723 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+724 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+725 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+726 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+727 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+728 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+729 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+730 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+731 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+732 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+733 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+734 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+735 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+736 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+737 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+738 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+739 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+740 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+741 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+742 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+743 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+744 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+745 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+746 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+747 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+748 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+749 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+750 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+751 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+752 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+753 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+754 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+755 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+756 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+757 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+758 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+759 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+760 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+761 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+762 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+763 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+764 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+765 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+766 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+767 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+768 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+769 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+770 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+771 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+772 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+773 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+774 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+775 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+776 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+777 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+778 - Public, // ACTIVE_PLAYER_FIELD_INV_SLOT_HEAD+779 - Public, // ACTIVE_PLAYER_FIELD_FARSIGHT - Public, // ACTIVE_PLAYER_FIELD_FARSIGHT+1 - Public, // ACTIVE_PLAYER_FIELD_FARSIGHT+2 - Public, // ACTIVE_PLAYER_FIELD_FARSIGHT+3 - Public, // ACTIVE_PLAYER_FIELD_SUMMONED_BATTLE_PET_ID - Public, // ACTIVE_PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+1 - Public, // ACTIVE_PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+2 - Public, // ACTIVE_PLAYER_FIELD_SUMMONED_BATTLE_PET_ID+3 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+1 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+2 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+3 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+4 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+5 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+6 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+7 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+8 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+9 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+10 - Public, // ACTIVE_PLAYER_FIELD_KNOWN_TITLES+11 - Public, // ACTIVE_PLAYER_FIELD_COINAGE - Public, // ACTIVE_PLAYER_FIELD_COINAGE+1 - Public, // ACTIVE_PLAYER_FIELD_XP - Public, // ACTIVE_PLAYER_FIELD_NEXT_LEVEL_XP - Public, // ACTIVE_PLAYER_FIELD_TRIAL_XP - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+1 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+2 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+3 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+4 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+5 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+6 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+7 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+8 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+9 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+10 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+11 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+12 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+13 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+14 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+15 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+16 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+17 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+18 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+19 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+20 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+21 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+22 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+23 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+24 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+25 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+26 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+27 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+28 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+29 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+30 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+31 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+32 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+33 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+34 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+35 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+36 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+37 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+38 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+39 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+40 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+41 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+42 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+43 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+44 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+45 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+46 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+47 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+48 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+49 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+50 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+51 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+52 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+53 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+54 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+55 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+56 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+57 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+58 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+59 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+60 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+61 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+62 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+63 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+64 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+65 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+66 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+67 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+68 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+69 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+70 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+71 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+72 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+73 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+74 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+75 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+76 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+77 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+78 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+79 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+80 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+81 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+82 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+83 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+84 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+85 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+86 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+87 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+88 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+89 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+90 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+91 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+92 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+93 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+94 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+95 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+96 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+97 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+98 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+99 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+100 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+101 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+102 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+103 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+104 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+105 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+106 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+107 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+108 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+109 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+110 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+111 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+112 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+113 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+114 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+115 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+116 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+117 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+118 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+119 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+120 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+121 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+122 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+123 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+124 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+125 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+126 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+127 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+128 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+129 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+130 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+131 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+132 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+133 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+134 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+135 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+136 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+137 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+138 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+139 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+140 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+141 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+142 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+143 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+144 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+145 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+146 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+147 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+148 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+149 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+150 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+151 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+152 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+153 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+154 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+155 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+156 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+157 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+158 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+159 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+160 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+161 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+162 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+163 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+164 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+165 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+166 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+167 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+168 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+169 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+170 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+171 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+172 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+173 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+174 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+175 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+176 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+177 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+178 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+179 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+180 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+181 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+182 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+183 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+184 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+185 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+186 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+187 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+188 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+189 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+190 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+191 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+192 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+193 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+194 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+195 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+196 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+197 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+198 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+199 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+200 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+201 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+202 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+203 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+204 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+205 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+206 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+207 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+208 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+209 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+210 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+211 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+212 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+213 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+214 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+215 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+216 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+217 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+218 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+219 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+220 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+221 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+222 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+223 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+224 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+225 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+226 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+227 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+228 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+229 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+230 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+231 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+232 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+233 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+234 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+235 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+236 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+237 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+238 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+239 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+240 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+241 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+242 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+243 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+244 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+245 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+246 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+247 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+248 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+249 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+250 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+251 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+252 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+253 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+254 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+255 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+256 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+257 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+258 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+259 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+260 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+261 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+262 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+263 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+264 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+265 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+266 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+267 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+268 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+269 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+270 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+271 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+272 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+273 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+274 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+275 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+276 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+277 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+278 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+279 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+280 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+281 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+282 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+283 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+284 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+285 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+286 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+287 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+288 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+289 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+290 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+291 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+292 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+293 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+294 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+295 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+296 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+297 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+298 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+299 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+300 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+301 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+302 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+303 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+304 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+305 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+306 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+307 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+308 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+309 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+310 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+311 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+312 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+313 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+314 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+315 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+316 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+317 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+318 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+319 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+320 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+321 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+322 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+323 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+324 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+325 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+326 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+327 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+328 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+329 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+330 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+331 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+332 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+333 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+334 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+335 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+336 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+337 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+338 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+339 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+340 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+341 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+342 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+343 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+344 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+345 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+346 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+347 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+348 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+349 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+350 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+351 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+352 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+353 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+354 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+355 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+356 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+357 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+358 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+359 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+360 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+361 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+362 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+363 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+364 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+365 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+366 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+367 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+368 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+369 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+370 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+371 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+372 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+373 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+374 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+375 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+376 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+377 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+378 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+379 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+380 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+381 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+382 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+383 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+384 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+385 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+386 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+387 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+388 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+389 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+390 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+391 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+392 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+393 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+394 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+395 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+396 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+397 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+398 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+399 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+400 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+401 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+402 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+403 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+404 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+405 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+406 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+407 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+408 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+409 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+410 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+411 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+412 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+413 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+414 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+415 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+416 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+417 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+418 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+419 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+420 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+421 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+422 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+423 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+424 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+425 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+426 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+427 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+428 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+429 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+430 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+431 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+432 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+433 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+434 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+435 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+436 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+437 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+438 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+439 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+440 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+441 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+442 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+443 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+444 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+445 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+446 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+447 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+448 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+449 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+450 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+451 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+452 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+453 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+454 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+455 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+456 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+457 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+458 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+459 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+460 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+461 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+462 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+463 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+464 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+465 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+466 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+467 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+468 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+469 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+470 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+471 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+472 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+473 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+474 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+475 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+476 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+477 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+478 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+479 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+480 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+481 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+482 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+483 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+484 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+485 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+486 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+487 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+488 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+489 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+490 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+491 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+492 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+493 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+494 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+495 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+496 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+497 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+498 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+499 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+500 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+501 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+502 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+503 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+504 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+505 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+506 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+507 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+508 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+509 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+510 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+511 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+512 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+513 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+514 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+515 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+516 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+517 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+518 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+519 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+520 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+521 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+522 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+523 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+524 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+525 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+526 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+527 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+528 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+529 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+530 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+531 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+532 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+533 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+534 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+535 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+536 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+537 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+538 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+539 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+540 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+541 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+542 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+543 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+544 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+545 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+546 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+547 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+548 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+549 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+550 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+551 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+552 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+553 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+554 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+555 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+556 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+557 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+558 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+559 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+560 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+561 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+562 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+563 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+564 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+565 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+566 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+567 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+568 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+569 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+570 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+571 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+572 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+573 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+574 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+575 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+576 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+577 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+578 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+579 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+580 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+581 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+582 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+583 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+584 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+585 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+586 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+587 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+588 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+589 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+590 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+591 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+592 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+593 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+594 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+595 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+596 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+597 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+598 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+599 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+600 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+601 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+602 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+603 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+604 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+605 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+606 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+607 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+608 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+609 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+610 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+611 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+612 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+613 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+614 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+615 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+616 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+617 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+618 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+619 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+620 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+621 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+622 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+623 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+624 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+625 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+626 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+627 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+628 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+629 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+630 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+631 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+632 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+633 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+634 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+635 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+636 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+637 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+638 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+639 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+640 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+641 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+642 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+643 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+644 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+645 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+646 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+647 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+648 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+649 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+650 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+651 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+652 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+653 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+654 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+655 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+656 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+657 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+658 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+659 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+660 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+661 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+662 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+663 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+664 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+665 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+666 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+667 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+668 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+669 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+670 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+671 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+672 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+673 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+674 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+675 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+676 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+677 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+678 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+679 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+680 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+681 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+682 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+683 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+684 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+685 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+686 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+687 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+688 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+689 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+690 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+691 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+692 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+693 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+694 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+695 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+696 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+697 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+698 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+699 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+700 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+701 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+702 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+703 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+704 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+705 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+706 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+707 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+708 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+709 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+710 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+711 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+712 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+713 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+714 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+715 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+716 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+717 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+718 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+719 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+720 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+721 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+722 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+723 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+724 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+725 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+726 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+727 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+728 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+729 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+730 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+731 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+732 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+733 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+734 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+735 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+736 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+737 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+738 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+739 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+740 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+741 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+742 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+743 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+744 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+745 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+746 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+747 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+748 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+749 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+750 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+751 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+752 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+753 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+754 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+755 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+756 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+757 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+758 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+759 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+760 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+761 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+762 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+763 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+764 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+765 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+766 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+767 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+768 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+769 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+770 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+771 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+772 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+773 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+774 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+775 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+776 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+777 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+778 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+779 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+780 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+781 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+782 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+783 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+784 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+785 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+786 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+787 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+788 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+789 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+790 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+791 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+792 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+793 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+794 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+795 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+796 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+797 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+798 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+799 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+800 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+801 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+802 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+803 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+804 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+805 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+806 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+807 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+808 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+809 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+810 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+811 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+812 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+813 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+814 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+815 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+816 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+817 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+818 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+819 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+820 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+821 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+822 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+823 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+824 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+825 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+826 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+827 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+828 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+829 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+830 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+831 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+832 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+833 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+834 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+835 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+836 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+837 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+838 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+839 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+840 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+841 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+842 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+843 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+844 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+845 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+846 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+847 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+848 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+849 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+850 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+851 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+852 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+853 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+854 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+855 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+856 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+857 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+858 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+859 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+860 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+861 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+862 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+863 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+864 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+865 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+866 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+867 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+868 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+869 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+870 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+871 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+872 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+873 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+874 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+875 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+876 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+877 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+878 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+879 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+880 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+881 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+882 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+883 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+884 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+885 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+886 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+887 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+888 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+889 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+890 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+891 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+892 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+893 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+894 - Public, // ACTIVE_PLAYER_FIELD_SKILL_LINEID+895 - Public, // ACTIVE_PLAYER_FIELD_CHARACTER_POINTS - Public, // ACTIVE_PLAYER_FIELD_MAX_TALENT_TIERS - Public, // ACTIVE_PLAYER_FIELD_TRACK_CREATURES - Public, // ACTIVE_PLAYER_FIELD_TRACK_RESOURCES - Public, // ACTIVE_PLAYER_FIELD_TRACK_RESOURCES+1 - Public, // ACTIVE_PLAYER_FIELD_EXPERTISE - Public, // ACTIVE_PLAYER_FIELD_OFFHAND_EXPERTISE - Public, // ACTIVE_PLAYER_FIELD_RANGED_EXPERTISE - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING_EXPERTISE - Public, // ACTIVE_PLAYER_FIELD_BLOCK_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_DODGE_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_DODGE_PERCENTAGE_FROM_ATTRIBUTE - Public, // ACTIVE_PLAYER_FIELD_PARRY_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_PARRY_PERCENTAGE_FROM_ATTRIBUTE - Public, // ACTIVE_PLAYER_FIELD_CRIT_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_RANGED_CRIT_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_OFFHAND_CRIT_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_SPELL_CRIT_PERCENTAGE1 - Public, // ACTIVE_PLAYER_FIELD_SHIELD_BLOCK - Public, // ACTIVE_PLAYER_FIELD_SHIELD_BLOCK_CRIT_PERCENTAGE - Public, // ACTIVE_PLAYER_FIELD_MASTERY - Public, // ACTIVE_PLAYER_FIELD_SPEED - Public, // ACTIVE_PLAYER_FIELD_AVOIDANCE - Public, // ACTIVE_PLAYER_FIELD_STURDINESS - Public, // ACTIVE_PLAYER_FIELD_VERSATILITY - Public, // ACTIVE_PLAYER_FIELD_VERSATILITY_BONUS - Public, // ACTIVE_PLAYER_FIELD_PVP_POWER_DAMAGE - Public, // ACTIVE_PLAYER_FIELD_PVP_POWER_HEALING - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+1 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+2 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+3 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+4 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+5 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+6 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+7 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+8 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+9 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+10 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+11 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+12 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+13 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+14 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+15 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+16 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+17 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+18 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+19 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+20 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+21 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+22 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+23 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+24 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+25 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+26 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+27 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+28 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+29 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+30 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+31 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+32 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+33 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+34 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+35 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+36 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+37 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+38 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+39 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+40 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+41 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+42 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+43 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+44 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+45 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+46 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+47 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+48 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+49 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+50 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+51 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+52 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+53 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+54 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+55 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+56 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+57 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+58 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+59 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+60 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+61 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+62 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+63 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+64 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+65 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+66 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+67 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+68 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+69 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+70 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+71 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+72 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+73 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+74 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+75 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+76 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+77 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+78 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+79 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+80 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+81 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+82 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+83 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+84 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+85 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+86 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+87 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+88 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+89 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+90 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+91 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+92 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+93 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+94 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+95 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+96 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+97 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+98 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+99 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+100 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+101 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+102 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+103 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+104 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+105 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+106 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+107 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+108 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+109 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+110 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+111 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+112 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+113 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+114 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+115 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+116 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+117 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+118 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+119 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+120 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+121 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+122 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+123 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+124 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+125 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+126 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+127 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+128 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+129 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+130 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+131 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+132 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+133 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+134 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+135 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+136 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+137 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+138 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+139 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+140 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+141 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+142 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+143 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+144 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+145 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+146 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+147 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+148 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+149 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+150 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+151 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+152 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+153 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+154 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+155 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+156 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+157 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+158 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+159 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+160 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+161 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+162 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+163 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+164 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+165 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+166 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+167 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+168 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+169 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+170 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+171 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+172 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+173 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+174 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+175 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+176 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+177 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+178 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+179 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+180 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+181 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+182 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+183 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+184 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+185 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+186 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+187 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+188 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+189 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+190 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+191 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+192 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+193 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+194 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+195 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+196 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+197 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+198 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+199 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+200 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+201 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+202 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+203 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+204 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+205 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+206 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+207 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+208 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+209 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+210 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+211 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+212 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+213 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+214 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+215 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+216 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+217 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+218 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+219 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+220 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+221 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+222 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+223 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+224 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+225 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+226 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+227 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+228 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+229 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+230 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+231 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+232 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+233 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+234 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+235 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+236 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+237 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+238 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+239 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+240 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+241 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+242 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+243 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+244 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+245 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+246 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+247 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+248 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+249 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+250 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+251 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+252 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+253 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+254 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+255 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+256 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+257 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+258 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+259 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+260 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+261 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+262 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+263 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+264 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+265 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+266 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+267 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+268 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+269 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+270 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+271 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+272 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+273 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+274 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+275 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+276 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+277 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+278 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+279 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+280 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+281 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+282 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+283 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+284 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+285 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+286 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+287 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+288 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+289 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+290 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+291 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+292 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+293 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+294 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+295 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+296 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+297 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+298 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+299 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+300 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+301 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+302 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+303 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+304 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+305 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+306 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+307 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+308 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+309 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+310 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+311 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+312 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+313 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+314 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+315 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+316 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+317 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+318 - Public, // ACTIVE_PLAYER_FIELD_EXPLORED_ZONES+319 - Public, // ACTIVE_PLAYER_FIELD_REST_INFO - Public, // ACTIVE_PLAYER_FIELD_REST_INFO+1 - Public, // ACTIVE_PLAYER_FIELD_REST_INFO+2 - Public, // ACTIVE_PLAYER_FIELD_REST_INFO+3 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS+1 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS+2 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS+3 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS+4 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS+5 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_POS+6 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+1 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+2 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+3 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+4 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+5 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+6 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+1 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+2 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+3 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+4 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+5 - Public, // ACTIVE_PLAYER_FIELD_MOD_DAMAGE_DONE_PCT+6 - Public, // ACTIVE_PLAYER_FIELD_MOD_HEALING_DONE_POS - Public, // ACTIVE_PLAYER_FIELD_MOD_HEALING_PCT - Public, // ACTIVE_PLAYER_FIELD_MOD_HEALING_DONE_PCT - Public, // ACTIVE_PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT - Public, // ACTIVE_PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS - Public, // ACTIVE_PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS+1 - Public, // ACTIVE_PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS+2 - Public, // ACTIVE_PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS - Public, // ACTIVE_PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS+1 - Public, // ACTIVE_PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS+2 - Public, // ACTIVE_PLAYER_FIELD_MOD_SPELL_POWER_PCT - Public, // ACTIVE_PLAYER_FIELD_MOD_RESILIENCE_PERCENT - Public, // ACTIVE_PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT - Public, // ACTIVE_PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT - Public, // ACTIVE_PLAYER_FIELD_MOD_TARGET_RESISTANCE - Public, // ACTIVE_PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE - Public, // ACTIVE_PLAYER_FIELD_LOCAL_FLAGS - Public, // ACTIVE_PLAYER_FIELD_BYTES - Public, // ACTIVE_PLAYER_FIELD_PVP_MEDALS - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+1 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+2 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+3 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+4 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+5 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+6 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+7 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+8 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+9 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+10 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_PRICE+11 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+1 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+2 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+3 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+4 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+5 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+6 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+7 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+8 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+9 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+10 - Public, // ACTIVE_PLAYER_FIELD_BUYBACK_TIMESTAMP+11 - Public, // ACTIVE_PLAYER_FIELD_KILLS - Public, // ACTIVE_PLAYER_FIELD_LIFETIME_HONORABLE_KILLS - Public, // ACTIVE_PLAYER_FIELD_WATCHED_FACTION_INDEX - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+1 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+2 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+3 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+4 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+5 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+6 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+7 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+8 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+9 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+10 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+11 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+12 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+13 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+14 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+15 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+16 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+17 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+18 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+19 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+20 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+21 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+22 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+23 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+24 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+25 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+26 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+27 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+28 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+29 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+30 - Public, // ACTIVE_PLAYER_FIELD_COMBAT_RATING+31 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+1 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+2 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+3 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+4 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+5 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+6 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+7 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+8 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+9 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+10 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+11 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+12 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+13 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+14 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+15 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+16 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+17 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+18 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+19 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+20 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+21 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+22 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+23 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+24 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+25 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+26 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+27 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+28 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+29 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+30 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+31 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+32 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+33 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+34 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+35 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+36 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+37 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+38 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+39 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+40 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+41 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+42 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+43 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+44 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+45 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+46 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+47 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+48 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+49 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+50 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+51 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+52 - Public, // ACTIVE_PLAYER_FIELD_ARENA_TEAM_INFO+53 - Public, // ACTIVE_PLAYER_FIELD_MAX_LEVEL - Public, // ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA - Public, // ACTIVE_PLAYER_FIELD_MAX_CREATURE_SCALING_LEVEL - Public, // ACTIVE_PLAYER_FIELD_NO_REAGENT_COST - Public, // ACTIVE_PLAYER_FIELD_NO_REAGENT_COST+1 - Public, // ACTIVE_PLAYER_FIELD_NO_REAGENT_COST+2 - Public, // ACTIVE_PLAYER_FIELD_NO_REAGENT_COST+3 - Public, // ACTIVE_PLAYER_FIELD_PET_SPELL_POWER - Public, // ACTIVE_PLAYER_FIELD_PROFESSION_SKILL_LINE - Public, // ACTIVE_PLAYER_FIELD_PROFESSION_SKILL_LINE+1 - Public, // ACTIVE_PLAYER_FIELD_UI_HIT_MODIFIER - Public, // ACTIVE_PLAYER_FIELD_UI_SPELL_HIT_MODIFIER - Public, // ACTIVE_PLAYER_FIELD_HOME_REALM_TIME_OFFSET - Public, // ACTIVE_PLAYER_FIELD_MOD_PET_HASTE - Public, // ACTIVE_PLAYER_FIELD_BYTES2 - Public | UrgentSelfOnly, // ACTIVE_PLAYER_FIELD_BYTES3 - Public, // ACTIVE_PLAYER_FIELD_LFG_BONUS_FACTION_ID - Public, // ACTIVE_PLAYER_FIELD_LOOT_SPEC_ID - Public | UrgentSelfOnly, // ACTIVE_PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE - Public, // ACTIVE_PLAYER_FIELD_BAG_SLOT_FLAGS - Public, // ACTIVE_PLAYER_FIELD_BAG_SLOT_FLAGS+1 - Public, // ACTIVE_PLAYER_FIELD_BAG_SLOT_FLAGS+2 - Public, // ACTIVE_PLAYER_FIELD_BAG_SLOT_FLAGS+3 - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS+1 - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS+2 - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS+3 - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS+4 - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS+5 - Public, // ACTIVE_PLAYER_FIELD_BANK_BAG_SLOT_FLAGS+6 - Public, // ACTIVE_PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+2 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+3 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+4 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+5 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+6 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+7 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+8 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+9 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+10 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+11 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+12 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+13 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+14 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+15 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+16 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+17 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+18 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+19 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+20 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+21 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+22 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+23 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+24 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+25 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+26 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+27 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+28 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+29 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+30 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+31 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+32 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+33 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+34 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+35 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+36 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+37 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+38 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+39 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+40 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+41 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+42 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+43 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+44 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+45 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+46 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+47 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+48 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+49 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+50 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+51 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+52 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+53 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+54 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+55 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+56 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+57 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+58 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+59 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+60 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+61 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+62 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+63 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+64 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+65 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+66 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+67 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+68 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+69 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+70 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+71 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+72 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+73 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+74 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+75 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+76 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+77 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+78 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+79 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+80 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+81 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+82 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+83 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+84 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+85 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+86 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+87 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+88 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+89 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+90 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+91 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+92 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+93 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+94 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+95 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+96 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+97 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+98 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+99 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+100 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+101 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+102 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+103 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+104 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+105 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+106 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+107 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+108 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+109 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+110 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+111 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+112 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+113 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+114 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+115 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+116 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+117 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+118 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+119 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+120 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+121 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+122 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+123 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+124 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+125 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+126 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+127 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+128 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+129 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+130 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+131 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+132 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+133 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+134 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+135 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+136 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+137 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+138 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+139 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+140 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+141 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+142 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+143 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+144 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+145 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+146 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+147 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+148 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+149 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+150 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+151 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+152 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+153 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+154 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+155 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+156 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+157 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+158 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+159 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+160 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+161 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+162 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+163 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+164 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+165 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+166 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+167 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+168 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+169 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+170 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+171 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+172 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+173 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+174 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+175 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+176 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+177 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+178 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+179 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+180 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+181 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+182 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+183 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+184 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+185 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+186 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+187 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+188 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+189 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+190 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+191 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+192 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+193 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+194 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+195 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+196 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+197 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+198 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+199 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+200 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+201 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+202 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+203 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+204 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+205 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+206 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+207 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+208 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+209 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+210 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+211 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+212 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+213 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+214 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+215 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+216 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+217 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+218 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+219 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+220 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+221 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+222 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+223 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+224 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+225 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+226 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+227 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+228 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+229 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+230 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+231 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+232 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+233 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+234 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+235 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+236 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+237 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+238 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+239 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+240 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+241 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+242 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+243 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+244 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+245 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+246 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+247 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+248 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+249 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+250 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+251 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+252 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+253 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+254 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+255 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+256 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+257 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+258 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+259 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+260 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+261 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+262 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+263 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+264 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+265 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+266 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+267 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+268 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+269 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+270 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+271 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+272 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+273 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+274 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+275 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+276 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+277 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+278 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+279 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+280 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+281 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+282 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+283 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+284 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+285 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+286 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+287 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+288 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+289 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+290 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+291 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+292 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+293 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+294 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+295 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+296 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+297 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+298 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+299 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+300 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+301 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+302 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+303 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+304 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+305 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+306 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+307 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+308 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+309 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+310 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+311 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+312 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+313 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+314 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+315 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+316 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+317 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+318 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+319 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+320 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+321 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+322 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+323 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+324 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+325 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+326 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+327 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+328 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+329 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+330 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+331 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+332 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+333 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+334 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+335 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+336 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+337 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+338 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+339 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+340 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+341 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+342 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+343 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+344 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+345 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+346 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+347 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+348 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+349 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+350 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+351 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+352 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+353 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+354 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+355 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+356 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+357 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+358 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+359 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+360 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+361 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+362 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+363 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+364 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+365 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+366 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+367 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+368 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+369 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+370 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+371 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+372 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+373 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+374 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+375 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+376 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+377 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+378 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+379 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+380 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+381 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+382 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+383 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+384 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+385 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+386 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+387 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+388 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+389 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+390 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+391 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+392 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+393 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+394 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+395 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+396 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+397 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+398 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+399 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+400 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+401 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+402 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+403 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+404 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+405 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+406 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+407 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+408 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+409 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+410 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+411 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+412 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+413 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+414 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+415 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+416 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+417 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+418 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+419 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+420 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+421 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+422 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+423 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+424 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+425 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+426 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+427 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+428 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+429 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+430 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+431 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+432 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+433 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+434 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+435 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+436 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+437 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+438 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+439 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+440 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+441 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+442 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+443 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+444 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+445 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+446 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+447 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+448 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+449 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+450 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+451 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+452 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+453 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+454 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+455 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+456 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+457 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+458 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+459 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+460 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+461 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+462 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+463 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+464 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+465 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+466 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+467 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+468 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+469 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+470 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+471 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+472 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+473 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+474 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+475 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+476 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+477 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+478 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+479 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+480 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+481 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+482 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+483 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+484 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+485 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+486 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+487 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+488 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+489 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+490 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+491 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+492 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+493 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+494 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+495 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+496 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+497 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+498 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+499 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+500 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+501 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+502 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+503 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+504 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+505 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+506 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+507 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+508 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+509 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+510 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+511 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+512 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+513 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+514 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+515 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+516 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+517 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+518 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+519 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+520 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+521 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+522 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+523 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+524 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+525 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+526 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+527 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+528 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+529 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+530 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+531 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+532 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+533 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+534 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+535 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+536 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+537 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+538 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+539 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+540 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+541 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+542 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+543 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+544 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+545 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+546 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+547 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+548 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+549 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+550 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+551 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+552 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+553 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+554 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+555 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+556 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+557 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+558 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+559 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+560 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+561 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+562 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+563 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+564 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+565 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+566 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+567 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+568 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+569 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+570 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+571 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+572 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+573 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+574 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+575 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+576 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+577 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+578 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+579 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+580 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+581 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+582 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+583 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+584 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+585 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+586 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+587 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+588 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+589 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+590 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+591 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+592 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+593 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+594 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+595 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+596 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+597 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+598 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+599 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+600 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+601 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+602 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+603 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+604 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+605 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+606 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+607 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+608 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+609 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+610 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+611 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+612 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+613 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+614 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+615 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+616 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+617 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+618 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+619 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+620 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+621 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+622 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+623 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+624 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+625 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+626 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+627 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+628 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+629 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+630 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+631 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+632 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+633 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+634 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+635 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+636 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+637 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+638 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+639 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+640 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+641 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+642 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+643 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+644 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+645 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+646 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+647 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+648 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+649 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+650 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+651 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+652 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+653 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+654 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+655 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+656 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+657 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+658 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+659 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+660 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+661 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+662 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+663 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+664 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+665 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+666 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+667 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+668 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+669 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+670 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+671 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+672 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+673 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+674 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+675 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+676 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+677 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+678 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+679 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+680 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+681 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+682 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+683 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+684 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+685 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+686 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+687 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+688 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+689 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+690 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+691 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+692 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+693 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+694 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+695 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+696 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+697 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+698 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+699 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+700 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+701 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+702 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+703 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+704 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+705 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+706 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+707 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+708 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+709 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+710 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+711 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+712 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+713 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+714 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+715 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+716 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+717 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+718 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+719 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+720 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+721 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+722 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+723 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+724 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+725 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+726 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+727 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+728 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+729 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+730 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+731 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+732 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+733 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+734 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+735 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+736 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+737 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+738 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+739 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+740 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+741 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+742 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+743 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+744 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+745 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+746 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+747 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+748 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+749 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+750 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+751 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+752 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+753 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+754 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+755 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+756 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+757 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+758 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+759 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+760 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+761 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+762 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+763 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+764 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+765 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+766 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+767 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+768 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+769 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+770 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+771 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+772 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+773 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+774 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+775 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+776 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+777 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+778 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+779 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+780 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+781 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+782 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+783 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+784 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+785 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+786 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+787 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+788 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+789 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+790 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+791 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+792 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+793 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+794 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+795 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+796 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+797 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+798 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+799 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+800 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+801 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+802 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+803 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+804 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+805 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+806 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+807 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+808 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+809 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+810 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+811 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+812 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+813 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+814 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+815 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+816 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+817 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+818 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+819 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+820 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+821 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+822 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+823 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+824 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+825 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+826 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+827 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+828 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+829 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+830 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+831 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+832 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+833 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+834 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+835 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+836 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+837 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+838 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+839 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+840 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+841 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+842 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+843 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+844 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+845 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+846 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+847 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+848 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+849 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+850 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+851 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+852 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+853 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+854 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+855 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+856 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+857 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+858 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+859 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+860 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+861 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+862 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+863 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+864 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+865 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+866 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+867 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+868 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+869 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+870 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+871 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+872 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+873 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+874 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+875 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+876 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+877 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+878 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+879 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+880 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+881 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+882 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+883 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+884 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+885 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+886 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+887 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+888 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+889 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+890 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+891 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+892 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+893 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+894 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+895 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+896 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+897 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+898 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+899 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+900 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+901 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+902 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+903 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+904 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+905 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+906 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+907 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+908 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+909 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+910 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+911 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+912 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+913 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+914 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+915 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+916 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+917 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+918 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+919 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+920 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+921 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+922 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+923 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+924 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+925 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+926 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+927 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+928 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+929 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+930 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+931 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+932 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+933 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+934 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+935 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+936 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+937 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+938 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+939 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+940 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+941 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+942 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+943 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+944 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+945 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+946 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+947 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+948 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+949 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+950 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+951 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+952 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+953 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+954 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+955 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+956 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+957 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+958 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+959 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+960 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+961 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+962 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+963 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+964 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+965 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+966 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+967 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+968 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+969 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+970 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+971 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+972 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+973 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+974 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+975 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+976 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+977 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+978 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+979 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+980 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+981 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+982 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+983 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+984 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+985 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+986 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+987 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+988 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+989 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+990 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+991 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+992 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+993 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+994 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+995 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+996 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+997 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+998 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+999 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1000 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1001 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1002 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1003 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1004 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1005 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1006 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1007 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1008 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1009 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1010 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1011 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1012 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1013 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1014 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1015 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1016 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1017 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1018 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1019 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1020 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1021 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1022 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1023 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1024 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1025 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1026 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1027 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1028 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1029 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1030 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1031 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1032 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1033 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1034 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1035 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1036 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1037 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1038 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1039 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1040 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1041 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1042 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1043 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1044 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1045 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1046 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1047 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1048 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1049 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1050 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1051 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1052 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1053 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1054 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1055 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1056 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1057 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1058 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1059 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1060 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1061 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1062 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1063 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1064 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1065 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1066 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1067 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1068 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1069 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1070 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1071 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1072 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1073 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1074 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1075 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1076 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1077 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1078 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1079 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1080 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1081 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1082 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1083 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1084 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1085 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1086 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1087 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1088 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1089 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1090 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1091 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1092 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1093 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1094 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1095 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1096 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1097 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1098 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1099 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1100 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1101 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1102 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1103 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1104 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1105 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1106 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1107 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1108 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1109 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1110 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1111 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1112 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1113 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1114 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1115 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1116 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1117 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1118 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1119 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1120 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1121 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1122 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1123 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1124 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1125 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1126 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1127 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1128 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1129 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1130 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1131 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1132 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1133 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1134 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1135 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1136 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1137 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1138 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1139 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1140 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1141 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1142 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1143 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1144 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1145 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1146 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1147 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1148 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1149 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1150 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1151 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1152 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1153 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1154 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1155 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1156 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1157 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1158 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1159 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1160 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1161 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1162 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1163 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1164 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1165 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1166 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1167 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1168 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1169 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1170 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1171 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1172 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1173 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1174 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1175 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1176 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1177 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1178 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1179 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1180 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1181 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1182 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1183 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1184 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1185 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1186 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1187 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1188 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1189 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1190 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1191 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1192 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1193 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1194 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1195 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1196 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1197 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1198 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1199 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1200 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1201 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1202 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1203 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1204 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1205 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1206 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1207 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1208 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1209 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1210 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1211 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1212 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1213 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1214 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1215 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1216 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1217 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1218 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1219 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1220 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1221 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1222 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1223 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1224 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1225 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1226 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1227 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1228 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1229 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1230 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1231 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1232 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1233 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1234 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1235 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1236 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1237 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1238 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1239 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1240 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1241 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1242 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1243 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1244 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1245 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1246 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1247 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1248 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1249 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1250 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1251 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1252 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1253 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1254 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1255 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1256 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1257 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1258 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1259 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1260 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1261 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1262 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1263 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1264 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1265 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1266 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1267 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1268 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1269 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1270 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1271 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1272 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1273 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1274 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1275 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1276 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1277 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1278 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1279 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1280 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1281 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1282 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1283 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1284 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1285 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1286 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1287 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1288 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1289 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1290 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1291 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1292 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1293 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1294 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1295 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1296 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1297 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1298 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1299 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1300 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1301 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1302 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1303 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1304 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1305 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1306 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1307 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1308 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1309 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1310 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1311 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1312 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1313 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1314 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1315 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1316 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1317 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1318 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1319 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1320 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1321 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1322 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1323 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1324 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1325 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1326 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1327 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1328 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1329 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1330 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1331 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1332 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1333 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1334 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1335 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1336 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1337 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1338 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1339 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1340 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1341 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1342 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1343 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1344 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1345 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1346 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1347 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1348 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1349 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1350 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1351 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1352 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1353 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1354 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1355 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1356 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1357 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1358 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1359 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1360 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1361 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1362 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1363 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1364 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1365 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1366 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1367 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1368 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1369 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1370 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1371 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1372 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1373 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1374 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1375 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1376 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1377 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1378 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1379 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1380 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1381 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1382 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1383 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1384 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1385 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1386 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1387 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1388 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1389 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1390 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1391 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1392 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1393 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1394 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1395 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1396 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1397 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1398 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1399 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1400 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1401 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1402 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1403 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1404 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1405 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1406 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1407 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1408 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1409 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1410 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1411 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1412 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1413 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1414 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1415 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1416 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1417 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1418 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1419 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1420 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1421 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1422 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1423 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1424 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1425 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1426 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1427 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1428 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1429 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1430 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1431 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1432 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1433 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1434 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1435 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1436 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1437 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1438 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1439 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1440 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1441 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1442 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1443 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1444 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1445 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1446 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1447 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1448 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1449 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1450 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1451 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1452 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1453 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1454 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1455 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1456 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1457 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1458 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1459 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1460 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1461 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1462 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1463 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1464 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1465 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1466 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1467 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1468 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1469 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1470 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1471 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1472 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1473 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1474 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1475 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1476 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1477 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1478 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1479 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1480 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1481 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1482 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1483 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1484 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1485 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1486 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1487 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1488 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1489 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1490 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1491 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1492 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1493 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1494 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1495 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1496 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1497 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1498 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1499 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1500 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1501 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1502 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1503 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1504 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1505 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1506 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1507 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1508 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1509 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1510 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1511 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1512 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1513 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1514 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1515 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1516 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1517 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1518 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1519 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1520 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1521 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1522 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1523 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1524 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1525 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1526 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1527 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1528 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1529 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1530 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1531 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1532 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1533 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1534 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1535 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1536 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1537 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1538 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1539 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1540 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1541 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1542 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1543 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1544 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1545 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1546 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1547 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1548 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1549 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1550 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1551 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1552 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1553 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1554 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1555 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1556 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1557 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1558 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1559 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1560 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1561 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1562 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1563 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1564 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1565 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1566 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1567 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1568 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1569 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1570 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1571 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1572 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1573 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1574 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1575 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1576 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1577 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1578 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1579 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1580 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1581 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1582 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1583 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1584 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1585 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1586 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1587 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1588 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1589 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1590 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1591 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1592 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1593 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1594 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1595 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1596 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1597 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1598 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1599 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1600 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1601 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1602 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1603 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1604 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1605 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1606 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1607 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1608 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1609 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1610 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1611 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1612 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1613 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1614 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1615 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1616 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1617 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1618 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1619 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1620 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1621 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1622 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1623 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1624 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1625 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1626 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1627 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1628 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1629 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1630 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1631 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1632 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1633 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1634 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1635 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1636 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1637 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1638 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1639 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1640 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1641 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1642 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1643 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1644 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1645 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1646 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1647 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1648 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1649 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1650 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1651 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1652 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1653 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1654 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1655 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1656 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1657 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1658 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1659 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1660 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1661 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1662 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1663 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1664 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1665 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1666 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1667 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1668 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1669 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1670 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1671 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1672 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1673 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1674 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1675 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1676 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1677 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1678 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1679 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1680 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1681 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1682 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1683 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1684 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1685 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1686 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1687 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1688 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1689 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1690 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1691 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1692 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1693 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1694 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1695 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1696 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1697 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1698 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1699 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1700 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1701 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1702 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1703 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1704 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1705 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1706 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1707 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1708 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1709 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1710 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1711 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1712 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1713 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1714 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1715 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1716 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1717 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1718 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1719 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1720 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1721 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1722 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1723 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1724 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1725 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1726 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1727 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1728 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1729 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1730 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1731 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1732 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1733 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1734 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1735 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1736 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1737 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1738 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1739 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1740 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1741 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1742 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1743 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1744 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1745 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1746 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1747 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1748 - Public, // ACTIVE_PLAYER_FIELD_QUEST_COMPLETED+1749 - Public, // ACTIVE_PLAYER_FIELD_HONOR - Public, // ACTIVE_PLAYER_FIELD_HONOR_NEXT_LEVEL - Public, // ACTIVE_PLAYER_FIELD_PVP_TIER_MAX_FROM_WINS - Public, // ACTIVE_PLAYER_FIELD_PVP_LAST_WEEKS_TIER_MAX_FROM_WINS - }; - - public static uint[] UnitDynamicUpdateFieldFlags = new uint[(int)ActivePlayerDynamicFields.End] - { - Public | Urgent, // UNIT_DYNAMIC_FIELD_PASSIVE_SPELLS - Public | Urgent, // UNIT_DYNAMIC_FIELD_WORLD_EFFECTS - Public | Urgent, // UNIT_DYNAMIC_FIELD_CHANNEL_OBJECTS - Public, // PLAYER_DYNAMIC_FIELD_ARENA_COOLDOWNS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_RESERACH_SITE - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_RESEARCH_SITE_PROGRESS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_DAILY_QUESTS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_AVAILABLE_QUEST_LINE_X_QUEST_ID - None, // - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_HEIRLOOMS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_HEIRLOOM_FLAGS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_TOYS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_TRANSMOG - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_SELF_RES_SPELLS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_SPELL_PCT_MOD_BY_LABEL - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_SPELL_FLAT_MOD_BY_LABEL - Public, // ACTIVE_PLAYER_DYNAMIC_FIELD_RESERACH - }; - - public static uint[] GameObjectUpdateFieldFlags = new uint[(int)GameObjectFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // GAMEOBJECT_FIELD_CREATED_BY - Public, // GAMEOBJECT_FIELD_CREATED_BY+1 - Public, // GAMEOBJECT_FIELD_CREATED_BY+2 - Public, // GAMEOBJECT_FIELD_CREATED_BY+3 - Public, // GAMEOBJECT_FIELD_GUILD_GUID - Public, // GAMEOBJECT_FIELD_GUILD_GUID+1 - Public, // GAMEOBJECT_FIELD_GUILD_GUID+2 - Public, // GAMEOBJECT_FIELD_GUILD_GUID+3 - Dynamic | Urgent, // GAMEOBJECT_DISPLAYID - Public | Urgent, // GAMEOBJECT_FLAGS - Public, // GAMEOBJECT_PARENTROTATION - Public, // GAMEOBJECT_PARENTROTATION+1 - Public, // GAMEOBJECT_PARENTROTATION+2 - Public, // GAMEOBJECT_PARENTROTATION+3 - Public, // GAMEOBJECT_FACTION - Public, // GAMEOBJECT_LEVEL - Public | Urgent, // GAMEOBJECT_BYTES_1 - Public | Dynamic | Urgent, // GAMEOBJECT_SPELL_VISUAL_ID - Dynamic | Urgent, // GAMEOBJECT_STATE_SPELL_VISUAL_ID - Dynamic | Urgent, // GAMEOBJECT_STATE_ANIM_ID - Dynamic | Urgent, // GAMEOBJECT_STATE_ANIM_KIT_ID - Dynamic | Urgent, // GAMEOBJECT_STATE_WORLD_EFFECT_ID - Dynamic | Urgent, // GAMEOBJECT_STATE_WORLD_EFFECT_ID+1 - Dynamic | Urgent, // GAMEOBJECT_STATE_WORLD_EFFECT_ID+2 - Dynamic | Urgent, // GAMEOBJECT_STATE_WORLD_EFFECT_ID+3 - Public | Urgent, // GAMEOBJECT_FIELD_CUSTOM_PARAM - }; - - public static uint[] GameObjectDynamicUpdateFieldFlags = new uint[(int)GameObjectDynamicFields.End] - { - Public, // GAMEOBJECT_DYNAMIC_ENABLE_DOODAD_SETS - }; - - public static uint[] DynamicObjectUpdateFieldFlags = new uint[(int)DynamicObjectFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // DYNAMICOBJECT_CASTER - Public, // DYNAMICOBJECT_CASTER+1 - Public, // DYNAMICOBJECT_CASTER+2 - Public, // DYNAMICOBJECT_CASTER+3 - Public, // DYNAMICOBJECT_TYPE - Public, // DYNAMICOBJECT_SPELL_X_SPELL_VISUAL_ID - Public, // DYNAMICOBJECT_SPELLID - Public, // DYNAMICOBJECT_RADIUS - Public, // DYNAMICOBJECT_CASTTIME - }; - - public static uint[] CorpseUpdateFieldFlags = new uint[(int)CorpseFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // CORPSE_FIELD_OWNER - Public, // CORPSE_FIELD_OWNER+1 - Public, // CORPSE_FIELD_OWNER+2 - Public, // CORPSE_FIELD_OWNER+3 - Public, // CORPSE_FIELD_PARTY - Public, // CORPSE_FIELD_PARTY+1 - Public, // CORPSE_FIELD_PARTY+2 - Public, // CORPSE_FIELD_PARTY+3 - Public, // CORPSE_FIELD_GUILD_GUID - Public, // CORPSE_FIELD_GUILD_GUID+1 - Public, // CORPSE_FIELD_GUILD_GUID+2 - Public, // CORPSE_FIELD_GUILD_GUID+3 - Public, // CORPSE_FIELD_DISPLAY_ID - Public, // CORPSE_FIELD_ITEM - Public, // CORPSE_FIELD_ITEM+1 - Public, // CORPSE_FIELD_ITEM+2 - Public, // CORPSE_FIELD_ITEM+3 - Public, // CORPSE_FIELD_ITEM+4 - Public, // CORPSE_FIELD_ITEM+5 - Public, // CORPSE_FIELD_ITEM+6 - Public, // CORPSE_FIELD_ITEM+7 - Public, // CORPSE_FIELD_ITEM+8 - Public, // CORPSE_FIELD_ITEM+9 - Public, // CORPSE_FIELD_ITEM+10 - Public, // CORPSE_FIELD_ITEM+11 - Public, // CORPSE_FIELD_ITEM+12 - Public, // CORPSE_FIELD_ITEM+13 - Public, // CORPSE_FIELD_ITEM+14 - Public, // CORPSE_FIELD_ITEM+15 - Public, // CORPSE_FIELD_ITEM+16 - Public, // CORPSE_FIELD_ITEM+17 - Public, // CORPSE_FIELD_ITEM+18 - Public, // CORPSE_FIELD_BYTES_1 - Public, // CORPSE_FIELD_BYTES_2 - Public, // CORPSE_FIELD_FLAGS - Dynamic, // CORPSE_FIELD_DYNAMIC_FLAGS - Public, // CORPSE_FIELD_FACTIONTEMPLATE - Public, // CORPSE_FIELD_CUSTOM_DISPLAY_OPTION - }; - - public static uint[] AreaTriggerUpdateFieldFlags = new uint[(int)AreaTriggerFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE+1 - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE+2 - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE+3 - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE+4 - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE+5 - Public | Urgent, // AREATRIGGER_OVERRIDE_SCALE_CURVE+6 - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE+1 - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE+2 - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE+3 - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE+4 - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE+5 - Public | Urgent, // AREATRIGGER_EXTRA_SCALE_CURVE+6 - Public, // AREATRIGGER_CASTER - Public, // AREATRIGGER_CASTER+1 - Public, // AREATRIGGER_CASTER+2 - Public, // AREATRIGGER_CASTER+3 - Public, // AREATRIGGER_DURATION - Public | Urgent, // AREATRIGGER_TIME_TO_TARGET - Public | Urgent, // AREATRIGGER_TIME_TO_TARGET_SCALE - Public | Urgent, // AREATRIGGER_TIME_TO_TARGET_EXTRA_SCALE - Public, // AREATRIGGER_SPELLID - Public, // AREATRIGGER_SPELL_FOR_VISUALS - Public, // AREATRIGGER_SPELL_X_SPELL_VISUAL_ID - Dynamic | Urgent, // AREATRIGGER_BOUNDS_RADIUS_2D - Public, // AREATRIGGER_DECAL_PROPERTIES_ID - Public, // AREATRIGGER_CREATING_EFFECT_GUID - Public, // AREATRIGGER_CREATING_EFFECT_GUID+1 - Public, // AREATRIGGER_CREATING_EFFECT_GUID+2 - Public, // AREATRIGGER_CREATING_EFFECT_GUID+3 - }; - - public static uint[] SceneObjectUpdateFieldFlags = new uint[(int)SceneObjectFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Public, // SCENEOBJECT_FIELD_SCRIPT_PACKAGE_ID - Public, // SCENEOBJECT_FIELD_RND_SEED_VAL - Public, // SCENEOBJECT_FIELD_CREATEDBY - Public, // SCENEOBJECT_FIELD_CREATEDBY+1 - Public, // SCENEOBJECT_FIELD_CREATEDBY+2 - Public, // SCENEOBJECT_FIELD_CREATEDBY+3 - Public, // SCENEOBJECT_FIELD_SCENE_TYPE - }; - - public static uint[] ConversationUpdateFieldFlags = new uint[(int)ConversationFields.End] - { - Public, // OBJECT_FIELD_GUID - Public, // OBJECT_FIELD_GUID+1 - Public, // OBJECT_FIELD_GUID+2 - Public, // OBJECT_FIELD_GUID+3 - Dynamic, // OBJECT_FIELD_ENTRY - Dynamic | Urgent, // OBJECT_DYNAMIC_FLAGS - Public, // OBJECT_FIELD_SCALE_X - Dynamic, // CONVERSATION_LAST_LINE_END_TIME - }; - - public static uint[] ConversationDynamicUpdateFieldFlags = new uint[(int)ConversationDynamicFields.End] - { - Public, // CONVERSATION_DYNAMIC_FIELD_ACTORS - Unknownx100, // CONVERSATION_DYNAMIC_FIELD_LINES - }; - } -} diff --git a/Source/Framework/Constants/Update/UpdateFields.cs b/Source/Framework/Constants/Update/UpdateFields.cs deleted file mode 100644 index c6e386044..000000000 --- a/Source/Framework/Constants/Update/UpdateFields.cs +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Copyright (C) 2012-2019 CypherCore - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace Framework.Constants -{ - public enum ObjectFields - { - Guid = 0x000, // Size: 4, Flags: Public - Entry = 0x004, // Size: 1, Flags: Dynamic - DynamicFlags = 0x005, // Size: 1, Flags: Dynamic, Urgent - ScaleX = 0x006, // Size: 1, Flags: Public - End = 0x007, - } - - public enum ItemFields - { - Owner = ObjectFields.End + 0x000, // Size: 4, Flags: Public - Contained = ObjectFields.End + 0x004, // Size: 4, Flags: Public - Creator = ObjectFields.End + 0x008, // Size: 4, Flags: Public - GiftCreator = ObjectFields.End + 0x00c, // Size: 4, Flags: Public - StackCount = ObjectFields.End + 0x010, // Size: 1, Flags: Owner - Duration = ObjectFields.End + 0x011, // Size: 1, Flags: Owner - SpellCharges = ObjectFields.End + 0x012, // Size: 5, Flags: Owner - Flags = ObjectFields.End + 0x017, // Size: 1, Flags: Public - Enchantment = ObjectFields.End + 0x018, // Size: 39, Flags: Public - PropertySeed = ObjectFields.End + 0x03f, // Size: 1, Flags: Public - RandomPropertiesId = ObjectFields.End + 0x040, // Size: 1, Flags: Public - Durability = ObjectFields.End + 0x041, // Size: 1, Flags: Owner - MaxDurability = ObjectFields.End + 0x042, // Size: 1, Flags: Owner - CreatePlayedTime = ObjectFields.End + 0x043, // Size: 1, Flags: Public - ModifiersMask = ObjectFields.End + 0x044, // Size: 1, Flags: Owner - Context = ObjectFields.End + 0x045, // Size: 1, Flags: Public - ArtifactXp = ObjectFields.End + 0x046, // Size: 2, Flags: OWNER - AppearanceModId = ObjectFields.End + 0x048, // Size: 1, Flags: OWNER - End = ObjectFields.End + 0x049 - } - - public enum ItemDynamicFields - { - Modifiers = 0x000, // Flags: Owner - BonusListIds = 0x001, // Flags: Owner, 0x100 - ArtifactPowers = 0x002, // Flags: OWNER - Gems = 0x003, // Flags: OWNER - End = 0x004 - } - - public enum ContainerFields - { - Slot1 = ItemFields.End + 0x000, // Size: 144, Flags: Public - NumSlots = ItemFields.End + 0x090, // Size: 1, Flags: Public - End = ItemFields.End + 0x091 - } - - public enum AzeriteEmpoweredItemFields - { - Selections = ItemFields.End + 0x000, // Size: 4, Flags: PUBLIC - End = ItemFields.End + 0x004, - } - - public enum AzeriteEmpoweredItemDynamicFields - { - End = ItemDynamicFields.End + 0x000, - } - - public enum AzeriteItemFields - { - Xp = ItemFields.End + 0x000, // Size: 2, Flags: PUBLIC - Level = ItemFields.End + 0x002, // Size: 1, Flags: PUBLIC - AuraLevel = ItemFields.End + 0x003, // Size: 1, Flags: PUBLIC - KnowledgeLevel = ItemFields.End + 0x004, // Size: 1, Flags: OWNER - DebugKnowledgeWeek = ItemFields.End + 0x005, // Size: 1, Flags: OWNER - End = ItemFields.End + 0x006, - } - - public enum AzeriteItemDynamicFields - { - End = ItemDynamicFields.End + 0x000, - } - - public enum UnitFields - { - Charm = ObjectFields.End + 0x000, // Size: 4, Flags: Public - Summon = ObjectFields.End + 0x004, // Size: 4, Flags: Public - Critter = ObjectFields.End + 0x008, // Size: 4, Flags: Privaten - CharmedBy = ObjectFields.End + 0x00c, // Size: 4, Flags: Public - SummonedBy = ObjectFields.End + 0x010, // Size: 4, Flags: Public - CreatedBy = ObjectFields.End + 0x014, // Size: 4, Flags: Public - DemonCreator = ObjectFields.End + 0x018, // Size: 4, Flags: Public - LookAtControllerTarget = ObjectFields.End + 0x01c, // Size: 4, Flags: Public - Target = ObjectFields.End + 0x020, // Size: 4, Flags: Public - BattlePetCompanionGuid = ObjectFields.End + 0x024, // Size: 4, Flags: Public - BattlePetDbId = ObjectFields.End + 0x028, // Size: 2, Flags: Public - ChannelData = ObjectFields.End + 0x02a, // Size: 2, Flags: Public, Urgent - SummonedByHomeRealm = ObjectFields.End + 0x02c, // Size: 1, Flags: Public - Bytes0 = ObjectFields.End + 0x02d, // Size: 1, Flags: Public - DisplayPower = ObjectFields.End + 0x02e, // Size: 1, Flags: Public - OverrideDisplayPowerId = ObjectFields.End + 0x02f, // Size: 1, Flags: Public - Health = ObjectFields.End + 0x030, // Size: 2, Flags: Public - Power = ObjectFields.End + 0x032, // Size: 6, Flags: Public, UrgentSelfOnly - MaxHealth = ObjectFields.End + 0x038, // Size: 2, Flags: Public - MaxPower = ObjectFields.End + 0x03a, // Size: 6, Flags: Public - PowerRegenFlatModifier = ObjectFields.End + 0x040, // Size: 6, Flags: Private, Owner, UnitAll - PowerRegenInterruptedFlatModifier = ObjectFields.End + 0x046, // Size: 6, Flags: Private, Owner, UnitAll - Level = ObjectFields.End + 0x04c, // Size: 1, Flags: Public - EffectiveLevel = ObjectFields.End + 0x04d, // Size: 1, Flags: Public - ContentTuningId = ObjectFields.End + 0x04e, // Size: 1, Flags: Public - ScalingLevelMin = ObjectFields.End + 0x04f, // Size: 1, Flags: Public - ScalingLevelMax = ObjectFields.End + 0x050, // Size: 1, Flags: Public - ScalingLevelDelta = ObjectFields.End + 0x051, // Size: 1, Flags: Public - ScalingFactionGroup = ObjectFields.End + 0x052, // Size: 1, Flags: Public - ScalingHealthItemLevelCurveId = ObjectFields.End + 0x053, // Size: 1, Flags: Public - ScalingDamageItemLevelCurveId = ObjectFields.End + 0x054, // Size: 1, Flags: Public - FactionTemplate = ObjectFields.End + 0x055, // Size: 1, Flags: Public - VirtualItemSlotId = ObjectFields.End + 0x056, // Size: 6, Flags: Public - Flags = ObjectFields.End + 0x05c, // Size: 1, Flags: Public, Urgent - Flags2 = ObjectFields.End + 0x05d, // Size: 1, Flags: Public, Urgent - Flags3 = ObjectFields.End + 0x05e, // Size: 1, Flags: Public, UrgentScalingLevelDelta - AuraState = ObjectFields.End + 0x05f, // Size: 1, Flags: Public - BaseAttackTime = ObjectFields.End + 0x060, // Size: 2, Flags: Public - RangedAttackTime = ObjectFields.End + 0x062, // Size: 1, Flags: Private - BoundingRadius = ObjectFields.End + 0x063, // Size: 1, Flags: Public - CombatReach = ObjectFields.End + 0x064, // Size: 1, Flags: Public - DisplayId = ObjectFields.End + 0x065, // Size: 1, Flags: Dynamic, Urgent - DisplayScale = ObjectFields.End + 0x066, // Size: 1, Flags: Dynamic, Urgent - NativeDisplayId = ObjectFields.End + 0x067, // Size: 1, Flags: Public, Urgent - NativeXDisplayScale = ObjectFields.End + 0x068, // Size: 1, Flags: Public, Urgent - MountDisplayId = ObjectFields.End + 0x069, // Size: 1, Flags: Public, Urgent - MinDamage = ObjectFields.End + 0x06a, // Size: 1, Flags: Private, Owner, SpecialInfo - MaxDamage = ObjectFields.End + 0x06b, // Size: 1, Flags: Private, Owner, SpecialInfo - MinOffHandDamage = ObjectFields.End + 0x06c, // Size: 1, Flags: Private, Owner, SpecialInfo - MaxOffHandDamage = ObjectFields.End + 0x06d, // Size: 1, Flags: Private, Owner, SpecialInfo - Bytes1 = ObjectFields.End + 0x06e, // Size: 1, Flags: Public - PetNumber = ObjectFields.End + 0x06f, // Size: 1, Flags: Public - PetNameTimestamp = ObjectFields.End + 0x070, // Size: 1, Flags: Public - PetExperience = ObjectFields.End + 0x071, // Size: 1, Flags: Owner - PetNextLevelExp = ObjectFields.End + 0x072, // Size: 1, Flags: Owner - ModCastSpeed = ObjectFields.End + 0x073, // Size: 1, Flags: Public - ModCastHaste = ObjectFields.End + 0x074, // Size: 1, Flags: Public - ModHaste = ObjectFields.End + 0x075, // Size: 1, Flags: Public - ModRangedHaste = ObjectFields.End + 0x076, // Size: 1, Flags: Public - ModHasteRegen = ObjectFields.End + 0x077, // Size: 1, Flags: Public - ModTimeRate = ObjectFields.End + 0x078, // Size: 1, Flags: Public - CreatedBySpell = ObjectFields.End + 0x079, // Size: 1, Flags: Public - NpcFlags = ObjectFields.End + 0x07a, // Size: 2, Flags: Public, Dynamic - NpcEmotestate = ObjectFields.End + 0x07c, // Size: 1, Flags: Public - Stat = ObjectFields.End + 0x07d, // Size: 4, Flags: Private, Owner - PosStat = ObjectFields.End + 0x081, // Size: 4, Flags: Private, Owner - NegStat = ObjectFields.End + 0x085, // Size: 4, Flags: Private, Owner - Resistances = ObjectFields.End + 0x089, // Size: 7, Flags: Private, Owner, SpecialInfo - BonusResistanceMods = ObjectFields.End + 0x090, // Size: 7, Flags: Private, Owner - BaseMana = ObjectFields.End + 0x097, // Size: 1, Flags: Public - BaseHealth = ObjectFields.End + 0x098, // Size: 1, Flags: Private, Owner - Bytes2 = ObjectFields.End + 0x099, // Size: 1, Flags: Public - AttackPower = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner - AttackPowerModPos = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner - AttackPowerModNeg = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner - AttackPowerMultiplier = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner - RangedAttackPower = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner - RangedAttackPowerModPos = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner - RangedAttackPowerModNeg = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner - RangedAttackPowerMultiplier = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner - MainHandWeaponAttackPower = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner - OffHandWeaponAttackPower = ObjectFields.End + 0x0a3, // Size: 1, Flags: Private, Owner - RangedHandWeaponAttackPower = ObjectFields.End + 0x0a4, // Size: 1, Flags: Private, Owner - AttackSpeedAura = ObjectFields.End + 0x0a5, // Size: 1, Flags: Private, Owner - Lifesteal = ObjectFields.End + 0x0a6, // Size: 1, Flags: Private, Owner - MinRangedDamage = ObjectFields.End + 0x0a7, // Size: 1, Flags: Private, Owner - MaxRangedDamage = ObjectFields.End + 0x0a8, // Size: 1, Flags: Private, Owner - PowerCostModifier = ObjectFields.End + 0x0a9, // Size: 7, Flags: Private, Owner - PowerCostMultiplier = ObjectFields.End + 0x0b0, // Size: 7, Flags: Private, Owner - MaxHealthModifier = ObjectFields.End + 0x0b7, // Size: 1, Flags: Private, Owner - HoverHeight = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public - MinItemLevelCutoff = ObjectFields.End + 0x0b9, // Size: 1, Flags: Public - MinItemLevel = ObjectFields.End + 0x0ba, // Size: 1, Flags: Public - MaxItemlevel = ObjectFields.End + 0x0bb, // Size: 1, Flags: Public - WildBattlepetLevel = ObjectFields.End + 0x0bc, // Size: 1, Flags: Public - BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0bd, // Size: 1, Flags: Public - InteractSpellid = ObjectFields.End + 0x0be, // Size: 1, Flags: Public - StateSpellVisualId = ObjectFields.End + 0x0bf, // Size: 1, Flags: Dynamic, Urgent - StateAnimId = ObjectFields.End + 0x0c0, // Size: 1, Flags: Dynamic, Urgent - StateAnimKitId = ObjectFields.End + 0x0c1, // Size: 1, Flags: Dynamic, Urgent - StateWorldEffectId = ObjectFields.End + 0x0c2, // Size: 4, Flags: Dynamic, Urgent - ScaleDuration = ObjectFields.End + 0x0c6, // Size: 1, Flags: Public - LooksLikeMountId = ObjectFields.End + 0x0c7, // Size: 1, Flags: Public - LooksLikeCreatureId = ObjectFields.End + 0x0c8, // Size: 1, Flags: Public - LookAtControllerId = ObjectFields.End + 0x0c9, // Size: 1, Flags: Public - GuildGuid = ObjectFields.End + 0x0ca, // Size: 4, Flags: Public - End = ObjectFields.End + 0x0ce - } - - public enum UnitDynamicFields - { - PassiveSpells = 0x000, // Flags: Public, Urgent - WorldEffects = 0x001, // Flags: Public, Urgent - ChannelObjects = 0x002, // Flags: PUBLIC, URGENT - End = 0x003 - } - - public enum PlayerFields - { - DuelArbiter = UnitFields.End + 0x000, // Size: 4, Flags: Public - WowAccount = UnitFields.End + 0x004, // Size: 4, Flags: Public - LootTargetGuid = UnitFields.End + 0x008, // Size: 4, Flags: Public - Flags = UnitFields.End + 0x00c, // Size: 1, Flags: Public - FlagsEx = UnitFields.End + 0x00d, // Size: 1, Flags: Public - GuildRank = UnitFields.End + 0x00e, // Size: 1, Flags: Public - GuildDeleteDate = UnitFields.End + 0x00f, // Size: 1, Flags: Public - GuildLevel = UnitFields.End + 0x010, // Size: 1, Flags: Public - Bytes = UnitFields.End + 0x011, // Size: 1, Flags: Public - Bytes2 = UnitFields.End + 0x012, // Size: 1, Flags: Public - Bytes3 = UnitFields.End + 0x013, // Size: 1, Flags: Public - Bytes4 = UnitFields.End + 0x014, // Size: 1, Flags: Public - DuelTeam = UnitFields.End + 0x015, // Size: 1, Flags: Public - GuildTimestamp = UnitFields.End + 0x016, // Size: 1, Flags: Public - QuestLog = UnitFields.End + 0x017, // Size: 1600, Flags: PartyMember - VisibleItem = UnitFields.End + 0x657, // Size: 38, Flags: Public - ChosenTitle = UnitFields.End + 0x67d, // Size: 1, Flags: Public - FakeInebriation = UnitFields.End + 0x67e, // Size: 1, Flags: Public - VirtualRealm = UnitFields.End + 0x67f, // Size: 1, Flags: Public - CurrentSpecId = UnitFields.End + 0x680, // Size: 1, Flags: Public - TaxiMountAnimKitId = UnitFields.End + 0x681, // Size: 1, Flags: Public - AvgItemLevel = UnitFields.End + 0x682, // Size: 4, Flags: Public - CurrentBattlePetBreedQuality = UnitFields.End + 0x686, // Size: 1, Flags: Public - HonorLevel = UnitFields.End + 0x687, // Size: 1, Flags: Public - End = UnitFields.End + 0x688 - } - - public enum PlayerDynamicFields - { - ArenaCooldowns = UnitDynamicFields.End + 0x000, // Flags: Public - End = UnitDynamicFields.End + 0x001, - } - - public enum ActivePlayerFields - { - InvSlotHead = PlayerFields.End + 0x000, // Size: 780, Flags: Public - Farsight = PlayerFields.End + 0x30c, // Size: 4, Flags: Public - SummonedBattlePetId = PlayerFields.End + 0x310, // Size: 4, Flags: Public - KnownTitles = PlayerFields.End + 0x314, // Size: 12, Flags: Public - Coinage = PlayerFields.End + 0x320, // Size: 2, Flags: Public - Xp = PlayerFields.End + 0x322, // Size: 1, Flags: Public - NextLevelXp = PlayerFields.End + 0x323, // Size: 1, Flags: Public - TrialXp = PlayerFields.End + 0x324, // Size: 1, Flags: Public - SkillLineId = PlayerFields.End + 0x325, // Size: 128, Flags: Public - SkillLineStep = PlayerFields.End + 0x3a5, // Size: 128, Flags: Public - SkillLineRank = PlayerFields.End + 0x425, // Size: 128, Flags: Public - SkillLineStartRank = PlayerFields.End + 0x4a5, // Size: 128, Flags: Public - SkillLineMaxRank = PlayerFields.End + 0x525, // Size: 128, Flags: Public - SkillLineTempBonus = PlayerFields.End + 0x5a5, // Size: 128, Flags: Public - SkillLinePermBonus = PlayerFields.End + 0x625, // Size: 128, Flags: Public - CharacterPoints = PlayerFields.End + 0x6a5, // Size: 1, Flags: Public - MaxTalentTiers = PlayerFields.End + 0x6a6, // Size: 1, Flags: Public - TrackCreatures = PlayerFields.End + 0x6a7, // Size: 1, Flags: Public - TrackResources = PlayerFields.End + 0x6a8, // Size: 2, Flags: Public - Expertise = PlayerFields.End + 0x6aa, // Size: 1, Flags: Public - OffhandExpertise = PlayerFields.End + 0x6ab, // Size: 1, Flags: Public - RangedExpertise = PlayerFields.End + 0x6ac, // Size: 1, Flags: Public - CombatRatingExpertise = PlayerFields.End + 0x6ad, // Size: 1, Flags: Public - BlockPercentage = PlayerFields.End + 0x6ae, // Size: 1, Flags: Public - DodgePercentage = PlayerFields.End + 0x6af, // Size: 1, Flags: Public - DodgePercentageFromAttribute = PlayerFields.End + 0x6b0, // Size: 1, Flags: Public - ParryPercentage = PlayerFields.End + 0x6b1, // Size: 1, Flags: Public - ParryPercentageFromAttribute = PlayerFields.End + 0x6b2, // Size: 1, Flags: Public - CritPercentage = PlayerFields.End + 0x6b3, // Size: 1, Flags: Public - RangedCritPercentage = PlayerFields.End + 0x6b4, // Size: 1, Flags: Public - OffhandCritPercentage = PlayerFields.End + 0x6b5, // Size: 1, Flags: Public - SpellCritPercentage1 = PlayerFields.End + 0x6b6, // Size: 1, Flags: Public - ShieldBlock = PlayerFields.End + 0x6b7, // Size: 1, Flags: Public - ShieldBlockCritPercentage = PlayerFields.End + 0x6b8, // Size: 1, Flags: Public - Mastery = PlayerFields.End + 0x6b9, // Size: 1, Flags: Public - Speed = PlayerFields.End + 0x6ba, // Size: 1, Flags: Public - Avoidance = PlayerFields.End + 0x6bb, // Size: 1, Flags: Public - Sturdiness = PlayerFields.End + 0x6bc, // Size: 1, Flags: Public - Versatility = PlayerFields.End + 0x6bd, // Size: 1, Flags: Public - VersatilityBonus = PlayerFields.End + 0x6be, // Size: 1, Flags: Public - PvpPowerDamage = PlayerFields.End + 0x6bf, // Size: 1, Flags: Public - PvpPowerHealing = PlayerFields.End + 0x6c0, // Size: 1, Flags: Public - ExploredZones = PlayerFields.End + 0x6c1, // Size: 320, Flags: Public - RestInfo = PlayerFields.End + 0x801, // Size: 4, Flags: Public - ModDamageDonePos = PlayerFields.End + 0x805, // Size: 7, Flags: Public - ModDamageDoneNeg = PlayerFields.End + 0x80c, // Size: 7, Flags: Public - ModDamageDonePct = PlayerFields.End + 0x813, // Size: 7, Flags: Public - ModHealingDonePos = PlayerFields.End + 0x81a, // Size: 1, Flags: Public - ModHealingPct = PlayerFields.End + 0x81b, // Size: 1, Flags: Public - ModHealingDonePct = PlayerFields.End + 0x81c, // Size: 1, Flags: Public - ModPeriodicHealingDonePercent = PlayerFields.End + 0x81d, // Size: 1, Flags: Public - WeaponDmgMultipliers = PlayerFields.End + 0x81e, // Size: 3, Flags: Public - WeaponAtkSpeedMultipliers = PlayerFields.End + 0x821, // Size: 3, Flags: Public - ModSpellPowerPct = PlayerFields.End + 0x824, // Size: 1, Flags: Public - ModResiliencePercent = PlayerFields.End + 0x825, // Size: 1, Flags: Public - OverrideSpellPowerByApPct = PlayerFields.End + 0x826, // Size: 1, Flags: Public - OverrideApBySpellPowerPercent = PlayerFields.End + 0x827, // Size: 1, Flags: Public - ModTargetResistance = PlayerFields.End + 0x828, // Size: 1, Flags: Public - ModTargetPhysicalResistance = PlayerFields.End + 0x829, // Size: 1, Flags: Public - LocalFlags = PlayerFields.End + 0x82a, // Size: 1, Flags: Public - Bytes = PlayerFields.End + 0x82b, // Size: 1, Flags: Public - PvpMedals = PlayerFields.End + 0x82c, // Size: 1, Flags: Public - BuyBackPrice = PlayerFields.End + 0x82d, // Size: 12, Flags: Public - BuyBackTimestamp = PlayerFields.End + 0x839, // Size: 12, Flags: Public - Kills = PlayerFields.End + 0x845, // Size: 1, Flags: Public - LifetimeHonorableKills = PlayerFields.End + 0x846, // Size: 1, Flags: Public - WatchedFactionIndex = PlayerFields.End + 0x847, // Size: 1, Flags: Public - CombatRating = PlayerFields.End + 0x848, // Size: 32, Flags: Public - ArenaTeamInfo = PlayerFields.End + 0x868, // Size: 54, Flags: Public - MaxLevel = PlayerFields.End + 0x89e, // Size: 1, Flags: Public - ScalingPlayerLevelDelta = PlayerFields.End + 0x89f, // Size: 1, Flags: Public - MaxCreatureScalingLevel = PlayerFields.End + 0x8a0, // Size: 1, Flags: Public - NoReagentCost = PlayerFields.End + 0x8a1, // Size: 4, Flags: Public - PetSpellPower = PlayerFields.End + 0x8a5, // Size: 1, Flags: Public - ProfessionSkillLine = PlayerFields.End + 0x8a6, // Size: 2, Flags: Public - UiHitModifier = PlayerFields.End + 0x8a8, // Size: 1, Flags: Public - UiSpellHitModifier = PlayerFields.End + 0x8a9, // Size: 1, Flags: Public - HomeRealmTimeOffset = PlayerFields.End + 0x8aa, // Size: 1, Flags: Public - ModPetHaste = PlayerFields.End + 0x8ab, // Size: 1, Flags: Public - Bytes2 = PlayerFields.End + 0x8ac, // Size: 1, Flags: Public - Bytes3 = PlayerFields.End + 0x8ad, // Size: 1, Flags: Public, UrgentSelfOnly - LfgBonusFactionId = PlayerFields.End + 0x8ae, // Size: 1, Flags: Public - LootSpecId = PlayerFields.End + 0x8af, // Size: 1, Flags: Public - OverrideZonePvpType = PlayerFields.End + 0x8b0, // Size: 1, Flags: Public, UrgentSelfOnly - BagSlotFlags = PlayerFields.End + 0x8b1, // Size: 4, Flags: Public - BankBagSlotFlags = PlayerFields.End + 0x8b5, // Size: 7, Flags: Public - InsertItemsLeftToRight = PlayerFields.End + 0x8bc, // Size: 1, Flags: Public - QuestCompleted = PlayerFields.End + 0x8bd, // Size: 1750, Flags: Public - Honor = PlayerFields.End + 0xf93, // Size: 1, Flags: Public - HonorNextLevel = PlayerFields.End + 0xf94, // Size: 1, Flags: Public - PvpTierMaxFromWins = PlayerFields.End + 0xf95, // Size: 1, Flags: Public - PvpLastWeeksTierMaxFromWins = PlayerFields.End + 0xf96, // Size: 1, Flags: Public - End = PlayerFields.End + 0xf97, - } - - public enum ActivePlayerDynamicFields - { - ReserachSite = PlayerDynamicFields.End + 0x000, // Flags: Public - ResearchSiteProgress = PlayerDynamicFields.End + 0x001, // Flags: Public - DailyQuests = PlayerDynamicFields.End + 0x002, // Flags: Public - AvailableQuestLineXQuestId = PlayerDynamicFields.End + 0x003, // Flags: Public - Heirlooms = PlayerDynamicFields.End + 0x005, // Flags: Public - HeirloomFlags = PlayerDynamicFields.End + 0x006, // Flags: Public - Toys = PlayerDynamicFields.End + 0x007, // Flags: Public - Transmog = PlayerDynamicFields.End + 0x008, // Flags: Public - ConditionalTransmog = PlayerDynamicFields.End + 0x009, // Flags: Public - SelfResSpells = PlayerDynamicFields.End + 0x00a, // Flags: Public - CharacterRestrictions = PlayerDynamicFields.End + 0x00b, // Flags: Public - SpellPctModByLabel = PlayerDynamicFields.End + 0x00c, // Flags: Public - SpellFlatModByLabel = PlayerDynamicFields.End + 0x00d, // Flags: Public - Reserach = PlayerDynamicFields.End + 0x00e, // Flags: Public - End = PlayerDynamicFields.End + 0x00f, - } - - public enum GameObjectFields - { - CreatedBy = ObjectFields.End + 0x000, // Size: 4, Flags: Public - GuildGuid = ObjectFields.End + 0x004, // Size: 4, Flags: Public - DisplayId = ObjectFields.End + 0x008, // Size: 1, Flags: Dynamic, Urgent - Flags = ObjectFields.End + 0x009, // Size: 1, Flags: Public, Urgent - ParentRotation = ObjectFields.End + 0x00a, // Size: 4, Flags: Public - Faction = ObjectFields.End + 0x00e, // Size: 1, Flags: Public - Level = ObjectFields.End + 0x00f, // Size: 1, Flags: Public - Bytes1 = ObjectFields.End + 0x010, // Size: 1, Flags: Public, Urgent - SpellVisualId = ObjectFields.End + 0x011, // Size: 1, Flags: Public, Dynamic, Urgent - StateSpellVisualId = ObjectFields.End + 0x012, // Size: 1, Flags: Dynamic, Urgent - StateAnimId = ObjectFields.End + 0x013, // Size: 1, Flags: Dynamic, Urgent - StateAnimKitId = ObjectFields.End + 0x014, // Size: 1, Flags: Dynamic, Urgent - StateWorldEffectId = ObjectFields.End + 0x015, // Size: 4, Flags: Dynamic, Urgent - CustomParam = ObjectFields.End + 0x019, // Size: 1, Flags: Public, Urgent - End = ObjectFields.End + 0x01a, - } - - public enum GameObjectDynamicFields - { - EnableDoodadSets = 0x000, // Flags: PUBLIC - End = 0x001 - } - - public enum DynamicObjectFields - { - Caster = ObjectFields.End + 0x000, // Size: 4, Flags: Public - Type = ObjectFields.End + 0x004, // Size: 1, Flags: Public - SpellXSpellVisualId = ObjectFields.End + 0x005, // Size: 1, Flags: Public - SpellId = ObjectFields.End + 0x006, // Size: 1, Flags: Public - Radius = ObjectFields.End + 0x007, // Size: 1, Flags: Public - CastTime = ObjectFields.End + 0x008, // Size: 1, Flags: Public - End = ObjectFields.End + 0x009 - } - - public enum CorpseFields - { - Owner = ObjectFields.End + 0x000, // Size: 4, Flags: Public - Party = ObjectFields.End + 0x004, // Size: 4, Flags: Public - GuildGuid = ObjectFields.End + 0x008, // Size: 4, Flags: PUBLIC - DisplayId = ObjectFields.End + 0x00C, // Size: 1, Flags: Public - Item = ObjectFields.End + 0x00D, // Size: 19, Flags: Public - Bytes1 = ObjectFields.End + 0x020, // Size: 1, Flags: Public - Bytes2 = ObjectFields.End + 0x021, // Size: 1, Flags: Public - Flags = ObjectFields.End + 0x022, // Size: 1, Flags: Public - DynamicFlags = ObjectFields.End + 0x023, // Size: 1, Flags: Dynamic - FactionTemplate = ObjectFields.End + 0x024, // Size: 1, Flags: Public - CustomDisplayOption = ObjectFields.End + 0x025, // Size: 1, Flags: PUBLIC - End = ObjectFields.End + 0x026 - } - - public enum AreaTriggerFields - { - OverrideScaleCurve = ObjectFields.End + 0x000, // Size: 7, Flags: Public, Urgent - ExtraScaleCurve = ObjectFields.End + 0x007, // Size: 7, Flags: Public, Urgent - Caster = ObjectFields.End + 0x00e, // Size: 4, Flags: Public - Duration = ObjectFields.End + 0x012, // Size: 1, Flags: Public - TimeToTarget = ObjectFields.End + 0x013, // Size: 1, Flags: Public, Urgent - TimeToTargetScale = ObjectFields.End + 0x014, // Size: 1, Flags: Public, Urgent - TimeToTargetExtraScale = ObjectFields.End + 0x015, // Size: 1, Flags: Public, Urgent - SpellId = ObjectFields.End + 0x016, // Size: 1, Flags: Public - SpellForVisuals = ObjectFields.End + 0x017, // Size: 1, Flags: PUBLIC - SpellXSpellVisualId = ObjectFields.End + 0x018, // Size: 1, Flags: Dynamic - BoundsRadius2d = ObjectFields.End + 0x019, // Size: 1, Flags: Dynamic, Urgent - DecalPropertiesId = ObjectFields.End + 0x01A, // Size: 1, Flags: Public - CreatingEffectGuid = ObjectFields.End + 0x01B, // Size: 4, Flags: PUBLIC - End = ObjectFields.End + 0x01F - } - - public enum SceneObjectFields - { - ScriptPackageId = ObjectFields.End + 0x000, // Size: 1, Flags: Public - RndSeedVal = ObjectFields.End + 0x001, // Size: 1, Flags: Public - Createdby = ObjectFields.End + 0x002, // Size: 4, Flags: Public - SceneType = ObjectFields.End + 0x006, // Size: 1, Flags: Public - End = ObjectFields.End + 0x007 - } - - public enum ConversationFields - { - LastLineEndTime = ObjectFields.End + 0x000, // Size: 1, Flags: DYNAMIC - End = ObjectFields.End + 0x001 - } - - public enum ConversationDynamicFields - { - Actors = 0x000, // Flags: Public - Lines = 0x001, // Flags: 0x100 - End = 0x002 - } -} diff --git a/Source/Framework/Constants/Update/UpdateFlags.cs b/Source/Framework/Constants/Update/UpdateFlags.cs index 538316d2a..f8e221582 100644 --- a/Source/Framework/Constants/Update/UpdateFlags.cs +++ b/Source/Framework/Constants/Update/UpdateFlags.cs @@ -42,4 +42,13 @@ namespace Framework.Constants //UPDATEFLAG_SCENEOBJECT = 0x10000, //UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000 } + + public enum UpdateFieldFlag + { + None = 0, + Owner = 0x01, + PartyMember = 0x02, + UnitAll = 0x04, + Empath = 0x08 + } } diff --git a/Source/Framework/Cryptography/PacketCrypt.cs b/Source/Framework/Cryptography/PacketCrypt.cs index 2830f7ed1..df994f882 100644 --- a/Source/Framework/Cryptography/PacketCrypt.cs +++ b/Source/Framework/Cryptography/PacketCrypt.cs @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +using Security.Cryptography; using System; using System.Security.Cryptography; @@ -25,66 +26,54 @@ namespace Framework.Cryptography static readonly byte[] ServerEncryptionKey = { 0x08, 0xF1, 0x95, 0x9F, 0x47, 0xE5, 0xD2, 0xDB, 0xA1, 0x3D, 0x77, 0x8F, 0x3F, 0x3E, 0xE7, 0x00 }; static readonly byte[] ServerDecryptionKey = { 0x40, 0xAA, 0xD3, 0x92, 0x26, 0x71, 0x43, 0x47, 0x3A, 0x31, 0x08, 0xA6, 0xE7, 0xDC, 0x98, 0x2A }; - public void Initialize(byte[] sessionKey) + public void Initialize(byte[] key) { if (IsInitialized) throw new InvalidOperationException("PacketCrypt already initialized!"); - SARC4Encrypt = new SARC4(); - SARC4Decrypt = new SARC4(); + _clientDecrypt = new AuthenticatedAesCng(); + _clientDecrypt.Key = key; + _clientDecrypt.CngMode = CngChainingMode.Gcm; + _clientDecrypt.TagSize = 96; - var encryptSHA1 = new HMACSHA1(ServerEncryptionKey); - var decryptSHA1 = new HMACSHA1(ServerDecryptionKey); - - SARC4Encrypt.PrepareKey(encryptSHA1.ComputeHash(sessionKey)); - SARC4Decrypt.PrepareKey(decryptSHA1.ComputeHash(sessionKey)); - - var PacketEncryptionDummy = new byte[0x400]; - var PacketDecryptionDummy = new byte[0x400]; - - SARC4Encrypt.ProcessBuffer(PacketEncryptionDummy, PacketEncryptionDummy.Length); - SARC4Decrypt.ProcessBuffer(PacketDecryptionDummy, PacketDecryptionDummy.Length); + _serverEncrypt = new AuthenticatedAesCng(); + _serverEncrypt.Key = key; + _serverEncrypt.CngMode = CngChainingMode.Gcm; + _serverEncrypt.TagSize = 96; IsInitialized = true; } - public void Initialize(byte[] sessionKey, byte[] serverSeed, byte[] clientSeed) + public bool Encrypt(ref byte[] data, int length, ref byte[] tag) { if (IsInitialized) - throw new InvalidOperationException("PacketCrypt already initialized!"); + { + _serverEncrypt.IV = BitConverter.GetBytes(_serverCounter).Combine(BitConverter.GetBytes(0x52565253)); - SARC4Encrypt = new SARC4(); - SARC4Decrypt = new SARC4(); + using (IAuthenticatedCryptoTransform encryptor = _serverEncrypt.CreateAuthenticatedEncryptor()) + { + data = encryptor.TransformFinalBlock(data, 0, length); + tag = encryptor.GetTag(); + } + } - var encryptSHA1 = new HMACSHA1(serverSeed); - var decryptSHA1 = new HMACSHA1(clientSeed); - - SARC4Encrypt.PrepareKey(encryptSHA1.ComputeHash(sessionKey)); - SARC4Decrypt.PrepareKey(decryptSHA1.ComputeHash(sessionKey)); - - var PacketEncryptionDummy = new byte[0x400]; - var PacketDecryptionDummy = new byte[0x400]; - - SARC4Encrypt.ProcessBuffer(PacketEncryptionDummy, PacketEncryptionDummy.Length); - SARC4Decrypt.ProcessBuffer(PacketDecryptionDummy, PacketDecryptionDummy.Length); - - IsInitialized = true; + ++_serverCounter; + return true; } - public void Encrypt(byte[] data, int count) + public bool Decrypt(ref byte[] data, int length, byte[] tag) { - if (!IsInitialized) - throw new InvalidOperationException("PacketCrypt not initialized!"); + if (IsInitialized) + { + _clientDecrypt.IV = BitConverter.GetBytes(_clientCounter).Combine(BitConverter.GetBytes(0x544E4C43)); + _clientDecrypt.Tag = tag; - SARC4Encrypt.ProcessBuffer(data, count); - } + using (ICryptoTransform decryptor = _clientDecrypt.CreateDecryptor()) + data = decryptor.TransformFinalBlock(data, 0, length); + } - public void Decrypt(byte[] data, int count) - { - if (!IsInitialized) - throw new InvalidOperationException("PacketCrypt not initialized!"); - - SARC4Decrypt.ProcessBuffer(data, count); + ++_clientCounter; + return true; } public void Dispose() @@ -93,7 +82,11 @@ namespace Framework.Cryptography } public bool IsInitialized { get; set; } - SARC4 SARC4Encrypt; - SARC4 SARC4Decrypt; + + AuthenticatedAesCng _clientDecrypt; + AuthenticatedAesCng _serverEncrypt; + ulong _clientCounter; + ulong _serverCounter; } + } diff --git a/Source/Framework/Cryptography/RsaCrypt.cs b/Source/Framework/Cryptography/RsaCrypt.cs index 8e7813eef..8b9591ba3 100644 --- a/Source/Framework/Cryptography/RsaCrypt.cs +++ b/Source/Framework/Cryptography/RsaCrypt.cs @@ -15,103 +15,32 @@ * along with this program. If not, see . */ -using System; -using System.Numerics; +using System.Security.Cryptography; namespace Framework.Cryptography { - public class RsaCrypt : IDisposable + public class RsaCrypt { - public RsaCrypt() + public static RSACryptoServiceProvider RSA; + static RsaCrypt() { - Dispose(); + RSA = new RSACryptoServiceProvider(2048); + RSA.ImportParameters(RsaStore.RSAParameters); } - - public void InitializeEncryption(T p, T q, T dp, T dq, T iq, bool isBigEndian = false) - { - _p = p.ToBigInteger(isBigEndian); - _q = q.ToBigInteger(isBigEndian); - _dp = dp.ToBigInteger(isBigEndian); - _dq = dq.ToBigInteger(isBigEndian); - _iq = iq.ToBigInteger(isBigEndian); - - if (_p.IsZero && _q.IsZero) - throw new InvalidOperationException("'0' isn't allowed for p or q"); - else - _isEncryptionInitialized = true; - } - - public void InitializeDecryption(T e, T n, bool reverseBytes = false) - { - _e = e.ToBigInteger(reverseBytes); - _n = n.ToBigInteger(reverseBytes); - - _isDecryptionInitialized = true; - } - - public byte[] Encrypt(T data, bool isBigEndian = false) - { - if (!_isEncryptionInitialized) - throw new InvalidOperationException("Encryption not initialized"); - - var bData = data.ToBigInteger(isBigEndian); - - var m1 = BigInteger.ModPow(bData % _p, _dp, _p); - var m2 = BigInteger.ModPow(bData % _q, _dq, _q); - - var h = (_iq * (m1 - m2)) % _p; - - // Be sure to use the positive remainder - if (h.Sign == -1) - h = _p + h; - - var m = m2 + h * _q; - - return m.ToByteArray(); - } - - public byte[] Decrypt(T data, bool isBigEndian = false) - { - if (!_isDecryptionInitialized) - throw new InvalidOperationException("Encryption not initialized"); - - var c = data.ToBigInteger(isBigEndian); - - return BigInteger.ModPow(c, _e, _n).ToByteArray(); - } - - public void Dispose() - { - _e = 0; - _n = 0; - _p = 0; - _q = 0; - _dp = 0; - _dq = 0; - _iq = 0; - - _isEncryptionInitialized = false; - _isDecryptionInitialized = false; - } - - BigInteger _e; - BigInteger _n; - BigInteger _p; - BigInteger _q; - BigInteger _dp; - BigInteger _dq; - BigInteger _iq; - bool _isEncryptionInitialized; - bool _isDecryptionInitialized; } public class RsaStore { - public static byte[] DP = { 0xE1, 0xA6, 0x22, 0xAB, 0xFF, 0x57, 0x83, 0x45, 0x3F, 0x93, 0x76, 0xC8, 0xFA, 0xD9, 0x17, 0xE1, 0x49, 0x73, 0xC2, 0x13, 0x28, 0x0B, 0x1F, 0xE2, 0x9A, 0xF4, 0x7F, 0x7C, 0x37, 0x56, 0xA1, 0xDF, 0x51, 0x97, 0x2F, 0x15, 0x10, 0x97, 0xCD, 0x2A, 0x40, 0x09, 0xFC, 0x0A, 0xC3, 0x3F, 0x88, 0x86, 0xA9, 0x51, 0x13, 0xE1, 0x76, 0xCF, 0xA8, 0x37, 0x9A, 0x91, 0x3B, 0xD0, 0x70, 0xA1, 0xD7, 0x03, 0x71, 0x59, 0x6C, 0xB3, 0x41, 0xB8, 0x32, 0x68, 0x56, 0xC8, 0xB8, 0xD1, 0xF9, 0x1D, 0x04, 0xC5, 0x13, 0xB5, 0x8E, 0x57, 0x73, 0x02, 0x97, 0x7B, 0x33, 0x60, 0x68, 0xA9, 0xC2, 0x40, 0x96, 0x3C, 0x57, 0x4E, 0x4F, 0xC0, 0xAB, 0x21, 0x5C, 0xBA, 0x7D, 0x65, 0xAA, 0x1B, 0xD6, 0x43, 0x06, 0xCE, 0x3E, 0x0C, 0xB9, 0xB2, 0x82, 0xB0, 0xC9, 0x54, 0x59, 0x32, 0xC5, 0x88, 0x08, 0x9C, 0x9B, 0xBF }; - public static byte[] DQ = { 0xE3, 0xB1, 0xED, 0x52, 0xEF, 0xE6, 0x88, 0x40, 0x50, 0x89, 0x4C, 0x99, 0xE5, 0xF7, 0xED, 0x03, 0x1C, 0x54, 0x11, 0x24, 0x2F, 0x9D, 0xE8, 0xE6, 0x39, 0xFA, 0x19, 0xF4, 0x06, 0x55, 0x0B, 0x8B, 0x95, 0xC8, 0xB1, 0xE2, 0x7C, 0x75, 0x3B, 0x2A, 0x40, 0xC3, 0xE7, 0xE0, 0x25, 0x18, 0xBF, 0xB5, 0x03, 0x1B, 0x5A, 0x57, 0x92, 0x3C, 0x85, 0x7D, 0x7F, 0x43, 0x56, 0x1F, 0x1E, 0x80, 0xC3, 0xBA, 0xF0, 0x53, 0xD7, 0x6A, 0xD0, 0xF2, 0xDD, 0x9C, 0xC6, 0x53, 0xE7, 0xB4, 0xD3, 0x9D, 0xAB, 0xBF, 0xE0, 0x97, 0x50, 0x92, 0x23, 0xB9, 0xB7, 0xDC, 0xAA, 0xC4, 0x20, 0x93, 0x5A, 0xF5, 0xDE, 0x76, 0x28, 0x93, 0x91, 0x44, 0x1E, 0x4C, 0x15, 0x2F, 0x7F, 0x45, 0x3C, 0x3B, 0x7D, 0x36, 0x3B, 0x24, 0xC7, 0x8C, 0x65, 0x43, 0xAE, 0x65, 0x84, 0xBC, 0xF9, 0x76, 0x4E, 0x3C, 0x44, 0x05, 0xBC, 0xFA }; - public static byte[] InverseQ = { 0x63, 0xC1, 0x14, 0x2B, 0x57, 0x0B, 0x8A, 0x3C, 0x27, 0xDB, 0x96, 0x82, 0x27, 0xEB, 0xF6, 0x45, 0x6D, 0x07, 0x50, 0xE8, 0x4A, 0xD4, 0xB6, 0x7A, 0x3C, 0x8B, 0x4D, 0x65, 0xF0, 0x50, 0x70, 0x84, 0x71, 0x2B, 0xC6, 0x6D, 0x28, 0x2D, 0x76, 0x38, 0x73, 0x93, 0xDB, 0x44, 0xD7, 0xC0, 0x7F, 0xD9, 0x57, 0x18, 0x28, 0x57, 0xF1, 0x13, 0x38, 0xA4, 0x91, 0x67, 0x1E, 0x13, 0x73, 0x55, 0xFC, 0x7B, 0xAF, 0x50, 0xFA, 0xFD, 0x16, 0x12, 0x6F, 0xA4, 0x95, 0x15, 0x9C, 0x07, 0x18, 0xA6, 0x46, 0xFD, 0xB3, 0xCF, 0xA5, 0x0E, 0x05, 0x30, 0xEC, 0x2C, 0xCD, 0x62, 0xDD, 0x6F, 0xB1, 0xFE, 0x6C, 0x05, 0x2F, 0x11, 0xA6, 0xA0, 0x98, 0xAC, 0x9B, 0x15, 0xF0, 0x04, 0xC4, 0x7B, 0x79, 0xAA, 0x51, 0x25, 0x2A, 0x84, 0x73, 0xE6, 0x77, 0x47, 0xA3, 0xEB, 0xCF, 0x6D, 0xC8, 0x96, 0x3A, 0x1B, 0x02, 0x52 }; - public static byte[] P = { 0x7D, 0xBD, 0xB9, 0xE1, 0x2D, 0xAE, 0x42, 0x56, 0x6E, 0x2B, 0xE2, 0x89, 0xD9, 0xBB, 0x0C, 0x1F, 0x67, 0x28, 0xC1, 0x4D, 0x91, 0x3C, 0xAD, 0x5F, 0xF0, 0x43, 0x86, 0x5C, 0x27, 0xDC, 0x58, 0xB3, 0x0E, 0x75, 0x77, 0x78, 0x49, 0x35, 0xE7, 0xE7, 0xDF, 0xFD, 0x74, 0xAB, 0x4E, 0xFE, 0xD3, 0xAB, 0x6B, 0x96, 0xF7, 0x89, 0xB2, 0x5A, 0x6A, 0x25, 0x03, 0x5A, 0x92, 0x1A, 0xF1, 0xFC, 0x05, 0x4E, 0xCE, 0xDD, 0x37, 0xA4, 0x02, 0x53, 0x76, 0xCB, 0xC2, 0xD9, 0x63, 0xCB, 0x51, 0x94, 0xEC, 0x5C, 0x39, 0xCC, 0xB2, 0x17, 0x0C, 0xA3, 0x43, 0x9A, 0xD0, 0x83, 0x27, 0x67, 0x52, 0x64, 0x37, 0x0E, 0x38, 0xB7, 0x9B, 0xF4, 0x2D, 0xB8, 0x0F, 0x30, 0x72, 0xD3, 0x15, 0xF3, 0x2C, 0x39, 0x55, 0x72, 0x2C, 0x55, 0x80, 0x63, 0xA0, 0xA1, 0x6F, 0x28, 0xF3, 0xF3, 0x5A, 0x6F, 0x68, 0x59, 0xB3, 0xF3 }; - public static byte[] Q = { 0x0B, 0x1A, 0x13, 0x07, 0x12, 0xEF, 0xDD, 0x97, 0x01, 0x9A, 0x21, 0x7D, 0xFA, 0xA3, 0xB7, 0xE2, 0x39, 0x2E, 0x04, 0x92, 0x96, 0x45, 0x2A, 0xEB, 0x57, 0x03, 0xAC, 0xB1, 0x83, 0xCD, 0x25, 0x4F, 0x2C, 0xA9, 0xA1, 0x54, 0x26, 0x54, 0xCF, 0xE6, 0x1B, 0x53, 0x51, 0x3A, 0xC1, 0x15, 0xF4, 0x17, 0xBB, 0x17, 0x1F, 0x37, 0x66, 0x36, 0x1A, 0xD4, 0xB1, 0x5B, 0x49, 0xA8, 0xF1, 0x02, 0xB0, 0x42, 0xA9, 0x66, 0xA0, 0xE2, 0x52, 0x2C, 0x8C, 0x89, 0xA2, 0xDD, 0xA6, 0xF1, 0xA3, 0xDF, 0xB6, 0x80, 0x63, 0xB8, 0x10, 0xDA, 0xDE, 0x84, 0x56, 0xFA, 0xFB, 0x72, 0x65, 0x5E, 0xA3, 0x9C, 0x78, 0x65, 0xD0, 0x73, 0x07, 0x34, 0x1D, 0xE1, 0x4D, 0x77, 0xE8, 0x00, 0x0F, 0x80, 0x1C, 0x5A, 0x21, 0x55, 0x0A, 0x8C, 0xF4, 0x93, 0xF5, 0xF8, 0x40, 0xF2, 0x40, 0xEA, 0x52, 0x12, 0x40, 0xF0, 0xBF, 0xFA }; - public static byte[] WherePacketHmac = { 0x2C, 0x1F, 0x1D, 0x80, 0xC3, 0x8C, 0x23, 0x64, 0xDA, 0x90, 0xCA, 0x8E, 0x2C, 0xFC, 0x0C, 0xCE, 0x09, 0xD3, 0x62, 0xF9, 0xF3, 0x8B, 0xBE, 0x9F, 0x19, 0xEF, 0x58, 0xA1, 0x1C, 0x34, 0x14, 0x41, 0x3F, 0x23, 0xFD, 0xD3, 0xE8, 0x14, 0xEC, 0x2A, 0xFD, 0x4F, 0x95, 0xBA, 0x30, 0x7E, 0x56, 0x5D, 0x83, 0x95, 0x81, 0x69, 0xB0, 0x5A, 0xB4, 0x9D, 0xA8, 0x55, 0xFF, 0xFC, 0xEE, 0x58, 0x0A, 0x2F }; + public static RSAParameters RSAParameters = new RSAParameters() + { + Modulus = new byte[] { 0xee, 0xb3, 0xdc, 0xd4, 0xd3, 0xc3, 0xb4, 0x54, 0x51, 0xce, 0x66, 0x5b, 0xcb, 0x32, 0xb8, 0xf0, 0xf7, 0x92, 0x53, 0xc6, 0x19, 0xf2, 0x0c, 0x85, 0x2f, 0x8a, 0x26, 0xa9, 0x7a, 0x45, 0x9f, 0x60, 0xc4, 0xeb, 0xcd, 0xea, 0x7f, 0x8d, 0x59, 0xd8, 0x57, 0xb2, 0x60, 0x7b, 0x09, 0x4c, 0x9b, 0x68, 0xb8, 0xc7, 0xed, 0xef, 0x1e, 0x80, 0x0d, 0xe6, 0x6b, 0x37, 0x5b, 0x53, 0x90, 0xeb, 0x18, 0x13, 0x0d, 0x7f, 0x43, 0x64, 0x83, 0xda, 0x98, 0xe6, 0xac, 0xc2, 0x30, 0xa2, 0x82, 0xa5, 0xc6, 0xcb, 0xc7, 0xfb, 0x86, 0x9f, 0x9f, 0xa9, 0x02, 0x6a, 0x03, 0x49, 0xc5, 0x38, 0xfb, 0xc0, 0xc8, 0x55, 0xcc, 0xc0, 0xce, 0x25, 0x91, 0xbe, 0x85, 0xcf, 0xd1, 0xd1, 0x37, 0xce, 0xcc, 0x83, 0xd2, 0xea, 0x30, 0x80, 0x07, 0x7b, 0x80, 0x9f, 0x9d, 0x44, 0x54, 0x22, 0x29, 0xbe, 0x86, 0xda, 0xdb, 0x48, 0xc5, 0xa9, 0xf9, 0x13, 0x36, 0x95, 0x23, 0x76, 0xf1, 0x0e, 0xdc, 0x84, 0x0d, 0x94, 0x02, 0x12, 0xa8, 0x97, 0xf3, 0x3b, 0x14, 0xee, 0xaa, 0x6f, 0x98, 0x05, 0x27, 0x4e, 0x1f, 0xa3, 0x60, 0xa5, 0xa9, 0xda, 0xd8, 0x17, 0xdf, 0x33, 0xcb, 0xe2, 0x13, 0x54, 0x8b, 0x18, 0xb0, 0xca, 0xb9, 0xbb, 0x88, 0x64, 0x06, 0xdf, 0x75, 0xa6, 0xd7, 0x61, 0x00, 0xbb, 0xb0, 0x5a, 0x0e, 0x7a, 0xd4, 0x77, 0x08, 0x4d, 0x15, 0xe2, 0x10, 0x83, 0xb0, 0x04, 0xaa, 0x9e, 0x8b, 0x77, 0xa9, 0x06, 0x89, 0x5d, 0x08, 0x5d, 0x0f, 0xb8, 0x2e, 0x6b, 0xc1, 0xcb, 0x64, 0xcf, 0x6e, 0x5c, 0xdb, 0x4f, 0x58, 0x65, 0x08, 0x51, 0xfb, 0x0d, 0x48, 0x1a, 0x6f, 0xb6, 0x3d, 0x1f, 0x0b, 0xdd, 0xfe, 0x1b, 0x1d, 0xf0, 0xbf, 0xb0, 0x27, 0x6b, 0xf5, 0x8e, 0xbc, 0xc7, 0x40, 0x01, 0xff, 0xa7, 0x0b, 0x80, 0xd6, 0x5f }, + Exponent = new byte[] { 0x01, 0x00, 0x01 }, + P = new byte[] { 0xf3, 0xb3, 0x59, 0x68, 0x6f, 0x5a, 0xf3, 0xf3, 0x28, 0x6f, 0xa1, 0xa0, 0x63, 0x80, 0x55, 0x2c, 0x72, 0x55, 0x39, 0x2c, 0xf3, 0x15, 0xd3, 0x72, 0x30, 0x0f, 0xb8, 0x2d, 0xf4, 0x9b, 0xb7, 0x38, 0x0e, 0x37, 0x64, 0x52, 0x67, 0x27, 0x83, 0xd0, 0x9a, 0x43, 0xa3, 0x0c, 0x17, 0xb2, 0xcc, 0x39, 0x5c, 0xec, 0x94, 0x51, 0xcb, 0x63, 0xd9, 0xc2, 0xcb, 0x76, 0x53, 0x02, 0xa4, 0x37, 0xdd, 0xce, 0x4e, 0x05, 0xfc, 0xf1, 0x1a, 0x92, 0x5a, 0x03, 0x25, 0x6a, 0x5a, 0xb2, 0x89, 0xf7, 0x96, 0x6b, 0xab, 0xd3, 0xfe, 0x4e, 0xab, 0x74, 0xfd, 0xdf, 0xe7, 0xe7, 0x35, 0x49, 0x78, 0x77, 0x75, 0x0e, 0xb3, 0x58, 0xdc, 0x27, 0x5c, 0x86, 0x43, 0xf0, 0x5f, 0xad, 0x3c, 0x91, 0x4d, 0xc1, 0x28, 0x67, 0x1f, 0x0c, 0xbb, 0xd9, 0x89, 0xe2, 0x2b, 0x6e, 0x56, 0x42, 0xae, 0x2d, 0xe1, 0xb9, 0xbd, 0x7d }, + Q = new byte[] { 0xfa, 0xbf, 0xf0, 0x40, 0x12, 0x52, 0xea, 0x40, 0xf2, 0x40, 0xf8, 0xf5, 0x93, 0xf4, 0x8c, 0x0a, 0x55, 0x21, 0x5a, 0x1c, 0x80, 0x0f, 0x00, 0xe8, 0x77, 0x4d, 0xe1, 0x1d, 0x34, 0x07, 0x73, 0xd0, 0x65, 0x78, 0x9c, 0xa3, 0x5e, 0x65, 0x72, 0xfb, 0xfa, 0x56, 0x84, 0xde, 0xda, 0x10, 0xb8, 0x63, 0x80, 0xb6, 0xdf, 0xa3, 0xf1, 0xa6, 0xdd, 0xa2, 0x89, 0x8c, 0x2c, 0x52, 0xe2, 0xa0, 0x66, 0xa9, 0x42, 0xb0, 0x02, 0xf1, 0xa8, 0x49, 0x5b, 0xb1, 0xd4, 0x1a, 0x36, 0x66, 0x37, 0x1f, 0x17, 0xbb, 0x17, 0xf4, 0x15, 0xc1, 0x3a, 0x51, 0x53, 0x1b, 0xe6, 0xcf, 0x54, 0x26, 0x54, 0xa1, 0xa9, 0x2c, 0x4f, 0x25, 0xcd, 0x83, 0xb1, 0xac, 0x03, 0x57, 0xeb, 0x2a, 0x45, 0x96, 0x92, 0x04, 0x2e, 0x39, 0xe2, 0xb7, 0xa3, 0xfa, 0x7d, 0x21, 0x9a, 0x01, 0x97, 0xdd, 0xef, 0x12, 0x07, 0x13, 0x1a, 0x0b }, + DP = new byte[] { 0xbf, 0x9b, 0x9c, 0x08, 0x88, 0xc5, 0x32, 0x59, 0x54, 0xc9, 0xb0, 0x82, 0xb2, 0xb9, 0x0c, 0x3e, 0xce, 0x06, 0x43, 0xd6, 0x1b, 0xaa, 0x65, 0x7d, 0xba, 0x5c, 0x21, 0xab, 0xc0, 0x4f, 0x4e, 0x57, 0x3c, 0x96, 0x40, 0xc2, 0xa9, 0x68, 0x60, 0x33, 0x7b, 0x97, 0x02, 0x73, 0x57, 0x8e, 0xb5, 0x13, 0xc5, 0x04, 0x1d, 0xf9, 0xd1, 0xb8, 0xc8, 0x56, 0x68, 0x32, 0xb8, 0x41, 0xb3, 0x6c, 0x59, 0x71, 0x03, 0xd7, 0xa1, 0x70, 0xd0, 0x3b, 0x91, 0x9a, 0x37, 0xa8, 0xcf, 0x76, 0xe1, 0x13, 0x51, 0xa9, 0x86, 0x88, 0x3f, 0xc3, 0x0a, 0xfc, 0x09, 0x40, 0x2a, 0xcd, 0x97, 0x10, 0x15, 0x2f, 0x97, 0x51, 0xdf, 0xa1, 0x56, 0x37, 0x7c, 0x7f, 0xf4, 0x9a, 0xe2, 0x1f, 0x0b, 0x28, 0x13, 0xc2, 0x73, 0x49, 0xe1, 0x17, 0xd9, 0xfa, 0xc8, 0x76, 0x93, 0x3f, 0x45, 0x83, 0x57, 0xff, 0xab, 0x22, 0xa6, 0xe1 }, + DQ = new byte[] { 0xfa, 0xbc, 0x05, 0x44, 0x3c, 0x4e, 0x76, 0xf9, 0xbc, 0x84, 0x65, 0xae, 0x43, 0x65, 0x8c, 0xc7, 0x24, 0x3b, 0x36, 0x7d, 0x3b, 0x3c, 0x45, 0x7f, 0x2f, 0x15, 0x4c, 0x1e, 0x44, 0x91, 0x93, 0x28, 0x76, 0xde, 0xf5, 0x5a, 0x93, 0x20, 0xc4, 0xaa, 0xdc, 0xb7, 0xb9, 0x23, 0x92, 0x50, 0x97, 0xe0, 0xbf, 0xab, 0x9d, 0xd3, 0xb4, 0xe7, 0x53, 0xc6, 0x9c, 0xdd, 0xf2, 0xd0, 0x6a, 0xd7, 0x53, 0xf0, 0xba, 0xc3, 0x80, 0x1e, 0x1f, 0x56, 0x43, 0x7f, 0x7d, 0x85, 0x3c, 0x92, 0x57, 0x5a, 0x1b, 0x03, 0xb5, 0xbf, 0x18, 0x25, 0xe0, 0xe7, 0xc3, 0x40, 0x2a, 0x3b, 0x75, 0x7c, 0xe2, 0xb1, 0xc8, 0x95, 0x8b, 0x0b, 0x55, 0x06, 0xf4, 0x19, 0xfa, 0x39, 0xe6, 0xe8, 0x9d, 0x2f, 0x24, 0x11, 0x54, 0x1c, 0x03, 0xed, 0xf7, 0xe5, 0x99, 0x4c, 0x89, 0x50, 0x40, 0x88, 0xe6, 0xef, 0x52, 0xed, 0xb1, 0xe3 }, + InverseQ = new byte[] { 0x52, 0x02, 0x1b, 0x3a, 0x96, 0xc8, 0x6d, 0xcf, 0xeb, 0xa3, 0x47, 0x77, 0xe6, 0x73, 0x84, 0x2a, 0x25, 0x51, 0xaa, 0x79, 0x7b, 0xc4, 0x04, 0xf0, 0x15, 0x9b, 0xac, 0x98, 0xa0, 0xa6, 0x11, 0x2f, 0x05, 0x6c, 0xfe, 0xb1, 0x6f, 0xdd, 0x62, 0xcd, 0x2c, 0xec, 0x30, 0x05, 0x0e, 0xa5, 0xcf, 0xb3, 0xfd, 0x46, 0xa6, 0x18, 0x07, 0x9c, 0x15, 0x95, 0xa4, 0x6f, 0x12, 0x16, 0xfd, 0xfa, 0x50, 0xaf, 0x7b, 0xfc, 0x55, 0x73, 0x13, 0x1e, 0x67, 0x91, 0xa4, 0x38, 0x13, 0xf1, 0x57, 0x28, 0x18, 0x57, 0xd9, 0x7f, 0xc0, 0xd7, 0x44, 0xdb, 0x93, 0x73, 0x38, 0x76, 0x2d, 0x28, 0x6d, 0xc6, 0x2b, 0x71, 0x84, 0x70, 0x50, 0xf0, 0x65, 0x4d, 0x8b, 0x3c, 0x7a, 0xb6, 0xd4, 0x4a, 0xe8, 0x50, 0x07, 0x6d, 0x45, 0xf6, 0xeb, 0x27, 0x82, 0x96, 0xdb, 0x27, 0x3c, 0x8a, 0x0b, 0x57, 0x2b, 0x14, 0xc1, 0x63 }, + D = new byte[] { 0x22, 0x9a, 0xe6, 0xaf, 0xe0, 0x07, 0x66, 0x34, 0x37, 0x2b, 0xe2, 0x00, 0xfa, 0xc3, 0x5e, 0xb6, 0x68, 0x5d, 0xc9, 0x51, 0x55, 0xdf, 0x96, 0x5b, 0x14, 0x9a, 0x45, 0xa2, 0x9a, 0x3c, 0x4f, 0xaf, 0xba, 0xbc, 0xa8, 0xbc, 0x8f, 0x43, 0x51, 0xbc, 0x20, 0x72, 0x96, 0xb4, 0x1f, 0x94, 0x00, 0x8f, 0xbd, 0x02, 0x17, 0x07, 0x6c, 0x77, 0x8a, 0x0c, 0x56, 0x8c, 0xce, 0xeb, 0x9d, 0x7d, 0xc7, 0x9e, 0xb3, 0x7d, 0x38, 0xaa, 0xf0, 0xc6, 0x97, 0x16, 0x12, 0x03, 0x91, 0x03, 0x6e, 0x47, 0x54, 0x3b, 0xa4, 0xc1, 0x5d, 0x31, 0xf4, 0xf6, 0x8e, 0x88, 0x09, 0xf3, 0xfe, 0xe8, 0x94, 0xee, 0xcc, 0xdc, 0x4b, 0x73, 0xc4, 0x2f, 0x04, 0x23, 0x07, 0xc9, 0x2a, 0x14, 0xd7, 0xaf, 0x5e, 0x4c, 0xda, 0x1d, 0xe3, 0x6c, 0x1c, 0x29, 0x96, 0x6b, 0x0d, 0x64, 0xa3, 0x81, 0xd4, 0x65, 0x6f, 0xad, 0x78, 0xce, 0x9b, 0x52, 0xad, 0x39, 0x9e, 0x02, 0x4d, 0x33, 0x34, 0x5a, 0xb3, 0xda, 0x2d, 0x50, 0xd3, 0xf5, 0xac, 0x7c, 0xa7, 0x29, 0x23, 0x98, 0x5c, 0x35, 0xea, 0xf1, 0x8f, 0x8f, 0xf4, 0x79, 0x0e, 0x4c, 0xbd, 0x56, 0x96, 0x9b, 0xb5, 0xf6, 0x4e, 0xbb, 0xf0, 0x04, 0x5b, 0x6e, 0x7d, 0x5c, 0x31, 0x22, 0x42, 0x04, 0xeb, 0x07, 0x81, 0x20, 0xf9, 0x2e, 0x06, 0x26, 0x31, 0xea, 0x03, 0x33, 0xd9, 0x06, 0x63, 0x32, 0xff, 0x18, 0x65, 0x0c, 0xae, 0x28, 0x31, 0x77, 0x9f, 0xa9, 0x74, 0x9c, 0x7c, 0x3e, 0x30, 0xd1, 0x1c, 0x6e, 0xb8, 0x21, 0x6b, 0xea, 0x5c, 0x4b, 0x3d, 0x9c, 0xf4, 0x4b, 0x7e, 0x41, 0x2b, 0x59, 0x08, 0x5a, 0x62, 0x24, 0xba, 0xff, 0xbd, 0x79, 0x0b, 0x88, 0xe0, 0x7a, 0xf5, 0x0b, 0x25, 0x70, 0x72, 0x1e, 0x1f, 0x91, 0xfb, 0xeb, 0xa7, 0xce, 0x31, 0xf2, 0xdb, 0xc0, 0x16, 0x79 }, + }; } } diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 55a91f792..6e8e85271 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -21,7 +21,7 @@ namespace Framework.Database { public override void PreparedStatements() { - const string SelectItemInstanceContent = "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyType, ii.randomPropertyId, " + + const string SelectItemInstanceContent = "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomBonusListId, " + "ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " + "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " + "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " + @@ -168,8 +168,8 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1"); PrepareStatement(CharStatements.INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)"); PrepareStatement(CharStatements.REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)"); - PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyType, randomPropertyId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyType = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?"); + PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?"); PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?"); @@ -625,8 +625,8 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?"); // Void Storage - PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?"); - PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?"); + PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?"); PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?"); @@ -643,10 +643,10 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_GUILD_FINDER_GUILD_SETTINGS, "DELETE FROM guild_finder_guild_settings WHERE guildId = ?"); // Items that hold loot or money - PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_type, rnd_prop, rnd_suffix, context, bonus_list_ids FROM item_loot_items WHERE container_id = ?"); + PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids FROM item_loot_items WHERE container_id = ?"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ?"); - PrepareStatement(CharStatements.INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_type, rnd_prop, rnd_suffix, context, bonus_list_ids) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.SEL_ITEMCONTAINER_MONEY, "SELECT money FROM item_loot_money WHERE container_id = ?"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_MONEY, "DELETE FROM item_loot_money WHERE container_id = ?"); PrepareStatement(CharStatements.INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)"); diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index 269ab2d5d..b42bf650c 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -22,12 +22,12 @@ namespace Framework.Database public override void PreparedStatements() { // Achievement.db2 - PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " + - "Points, Flags, UiOrder, IconFileID, CriteriaTree, SharesCriteria FROM achievement ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " + + "Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria FROM achievement ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT_LOCALE, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?"); // AnimationData.db2 - PrepareStatement(HotfixStatements.SEL_ANIMATION_DATA, "SELECT ID, Fallback, BehaviorTier, BehaviorID, Flags1, Flags2 FROM animation_data ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_ANIMATION_DATA, "SELECT ID, BehaviorID, BehaviorTier, Fallback, Flags1, Flags2 FROM animation_data ORDER BY ID DESC"); // AnimKit.db2 PrepareStatement(HotfixStatements.SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC"); @@ -36,42 +36,42 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaID, AreaGroupID FROM area_group_member ORDER BY ID DESC"); // AreaTable.db2 - PrepareStatement(HotfixStatements.SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " + - "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, ExplorationLevel, IntroSound, UwIntroSound, FactionGroupMask, " + - "AmbientMultiplier, MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, Flags1, Flags2, " + + PrepareStatement(HotfixStatements.SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " + + "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, ExplorationLevel, IntroSound, UwIntroSound, FactionGroupMask, " + + "AmbientMultiplier, MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, Flags1, Flags2, " + "LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4 FROM area_table ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_AREA_TABLE_LOCALE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?"); // AreaTrigger.db2 - PrepareStatement(HotfixStatements.SEL_AREA_TRIGGER, "SELECT PosX, PosY, PosZ, ID, ContinentID, PhaseUseFlags, PhaseID, PhaseGroupID, Radius, BoxLength, " + + PrepareStatement(HotfixStatements.SEL_AREA_TRIGGER, "SELECT PosX, PosY, PosZ, ID, ContinentID, PhaseUseFlags, PhaseID, PhaseGroupID, Radius, BoxLength, " + "BoxWidth, BoxHeight, BoxYaw, ShapeType, ShapeID, AreaTriggerActionSetID, Flags FROM area_trigger ORDER BY ID DESC"); // ArmorLocation.db2 - PrepareStatement(HotfixStatements.SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location" + + PrepareStatement(HotfixStatements.SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location" + " ORDER BY ID DESC"); // Artifact.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT, "SELECT Name, ID, UiTextureKitID, UiNameColor, UiBarOverlayColor, UiBarBackgroundColor, " + + PrepareStatement(HotfixStatements.SEL_ARTIFACT, "SELECT Name, ID, UiTextureKitID, UiNameColor, UiBarOverlayColor, UiBarBackgroundColor, " + "ChrSpecializationID, Flags, ArtifactCategoryID, UiModelSceneID, SpellVisualKitID FROM artifact ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ARTIFACT_LOCALE, "SELECT ID, Name_lang FROM artifact_locale WHERE locale = ?"); // ArtifactAppearance.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE, "SELECT Name, ID, ArtifactAppearanceSetID, DisplayIndex, UnlockPlayerConditionID, " + - "ItemAppearanceModifierID, UiSwatchColor, UiModelSaturation, UiModelOpacity, OverrideShapeshiftFormID, OverrideShapeshiftDisplayID, " + - "UiItemAppearanceID, UiAltItemAppearanceID, Flags, UiCameraID FROM artifact_appearance ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE, "SELECT Name, ID, ArtifactAppearanceSetID, DisplayIndex, UnlockPlayerConditionID, " + + "ItemAppearanceModifierID, UiSwatchColor, UiModelSaturation, UiModelOpacity, OverrideShapeshiftFormID, OverrideShapeshiftDisplayID, " + + "UiItemAppearanceID, UiAltItemAppearanceID, Flags, UiCameraID, UsablePlayerConditionID FROM artifact_appearance ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE, "SELECT ID, Name_lang FROM artifact_appearance_locale WHERE locale = ?"); // ArtifactAppearanceSet.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET, "SELECT Name, Description, ID, DisplayIndex, UiCameraID, AltHandUICameraID, " + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET, "SELECT Name, Description, ID, DisplayIndex, UiCameraID, AltHandUICameraID, " + "ForgeAttachmentOverride, Flags, ArtifactID FROM artifact_appearance_set ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET_LOCALE, "SELECT ID, Name_lang, Description_lang FROM artifact_appearance_set_locale" + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET_LOCALE, "SELECT ID, Name_lang, Description_lang FROM artifact_appearance_set_locale" + " WHERE locale = ?"); // ArtifactCategory.db2 PrepareStatement(HotfixStatements.SEL_ARTIFACT_CATEGORY, "SELECT ID, XpMultCurrencyID, XpMultCurveID FROM artifact_category ORDER BY ID DESC"); // ArtifactPower.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_POWER, "SELECT DisplayPosX, DisplayPosY, ID, ArtifactID, MaxPurchasableRank, Label, Flags, Tier" + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_POWER, "SELECT DisplayPosX, DisplayPosY, ID, ArtifactID, MaxPurchasableRank, Label, Flags, Tier" + " FROM artifact_power ORDER BY ID DESC"); // ArtifactPowerLink.db2 @@ -81,19 +81,19 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_ARTIFACT_POWER_PICKER, "SELECT ID, PlayerConditionID FROM artifact_power_picker ORDER BY ID DESC"); // ArtifactPowerRank.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_POWER_RANK, "SELECT ID, RankIndex, SpellID, ItemBonusListID, AuraPointsOverride, ArtifactPowerID" + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_POWER_RANK, "SELECT ID, RankIndex, SpellID, ItemBonusListID, AuraPointsOverride, ArtifactPowerID" + " FROM artifact_power_rank ORDER BY ID DESC"); // ArtifactQuestXp.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_QUEST_XP, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_QUEST_XP, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " + "Difficulty7, Difficulty8, Difficulty9, Difficulty10 FROM artifact_quest_xp ORDER BY ID DESC"); // ArtifactTier.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_TIER, "SELECT ID, ArtifactTier, MaxNumTraits, MaxArtifactKnowledge, KnowledgePlayerCondition, " + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_TIER, "SELECT ID, ArtifactTier, MaxNumTraits, MaxArtifactKnowledge, KnowledgePlayerCondition, " + "MinimumEmpowerKnowledge FROM artifact_tier ORDER BY ID DESC"); // ArtifactUnlock.db2 - PrepareStatement(HotfixStatements.SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock" + + PrepareStatement(HotfixStatements.SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock" + " ORDER BY ID DESC"); // AuctionHouse.db2 @@ -107,7 +107,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons ORDER BY ID DESC"); // BarberShopStyle.db2 - PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style" + + PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style" + " ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?"); @@ -115,28 +115,28 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, StateMultiplier, QualityEnum FROM battle_pet_breed_quality ORDER BY ID DESC"); // BattlePetBreedState.db2 - PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state" + + PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state" + " ORDER BY ID DESC"); // BattlePetSpecies.db2 - PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " + + PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " + "Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID FROM battle_pet_species ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE, "SELECT ID, Description_lang, SourceText_lang FROM battle_pet_species_locale WHERE locale = ?"); // BattlePetSpeciesState.db2 - PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state" + + PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state" + " ORDER BY ID DESC"); // BattlemasterList.db2 - PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " + - "RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID, " + - "MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16" + + PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " + + "RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID, " + + "MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16" + " FROM battlemaster_list ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang" + + PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang" + " FROM battlemaster_list_locale WHERE locale = ?"); // BroadcastText.db2 - PrepareStatement(HotfixStatements.SEL_BROADCAST_TEXT, "SELECT Text, Text1, ID, LanguageID, ConditionID, EmotesID, Flags, ChatBubbleDurationMs, " + + PrepareStatement(HotfixStatements.SEL_BROADCAST_TEXT, "SELECT Text, Text1, ID, LanguageID, ConditionID, EmotesID, Flags, ChatBubbleDurationMs, " + "SoundEntriesID1, SoundEntriesID2, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3 FROM broadcast_text ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_BROADCAST_TEXT_LOCALE, "SELECT ID, Text_lang, Text1_lang FROM broadcast_text_locale WHERE locale = ?"); @@ -144,20 +144,20 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions ORDER BY ID DESC"); // CharacterFacialHairStyles.db2 - PrepareStatement(HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT ID, Geoset1, Geoset2, Geoset3, Geoset4, Geoset5, RaceID, SexID, VariationID" + + PrepareStatement(HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT ID, Geoset1, Geoset2, Geoset3, Geoset4, Geoset5, RaceID, SexID, VariationID" + " FROM character_facial_hair_styles ORDER BY ID DESC"); // CharBaseSection.db2 - PrepareStatement(HotfixStatements.SEL_CHAR_BASE_SECTION, "SELECT ID, LayoutResType, VariationEnum, ResolutionVariationEnum FROM char_base_section" + + PrepareStatement(HotfixStatements.SEL_CHAR_BASE_SECTION, "SELECT ID, LayoutResType, VariationEnum, ResolutionVariationEnum FROM char_base_section" + " ORDER BY ID DESC"); // CharSections.db2 - PrepareStatement(HotfixStatements.SEL_CHAR_SECTIONS, "SELECT ID, RaceID, SexID, BaseSection, VariationIndex, ColorIndex, Flags, MaterialResourcesID1, " + + PrepareStatement(HotfixStatements.SEL_CHAR_SECTIONS, "SELECT ID, RaceID, SexID, BaseSection, VariationIndex, ColorIndex, Flags, MaterialResourcesID1, " + "MaterialResourcesID2, MaterialResourcesID3 FROM char_sections ORDER BY ID DESC"); // CharStartOutfit.db2 - PrepareStatement(HotfixStatements.SEL_CHAR_START_OUTFIT, "SELECT ID, ClassID, SexID, OutfitID, PetDisplayID, PetFamilyID, ItemID1, ItemID2, ItemID3, " + - "ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, " + + PrepareStatement(HotfixStatements.SEL_CHAR_START_OUTFIT, "SELECT ID, ClassID, SexID, OutfitID, PetDisplayID, PetFamilyID, ItemID1, ItemID2, ItemID3, " + + "ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, " + "ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, RaceID FROM char_start_outfit ORDER BY ID DESC"); // CharTitles.db2 @@ -169,90 +169,95 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS_LOCALE, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?"); // ChrClasses.db2 - PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " + - "SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, Flags, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, " + - "DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet FROM chr_classes ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " + + "SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, SpellTextureBlobFileDataID, Flags, CinematicSequenceID, " + + "DefaultSpec, PrimaryStatPriority, DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet" + + " FROM chr_classes ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale WHERE locale = ?"); // ChrClassesXPowerTypes.db2 PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, PowerType, ClassID FROM chr_classes_x_power_types ORDER BY ID DESC"); // ChrRaces.db2 - PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, ID, Flags, " + - "MaleDisplayId, FemaleDisplayId, HighResMaleDisplayId, HighResFemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, " + - "MaleCustomizeOffset1, MaleCustomizeOffset2, MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, " + - "LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " + - "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " + - "UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, FactionID, CinematicSequenceID, ResSicknessSpellID, " + - "SplashSoundID, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, " + - "CharComponentTexLayoutHiResID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " + - "FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex" + + PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, ID, Flags, " + + "MaleDisplayId, FemaleDisplayId, HighResMaleDisplayId, HighResFemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, " + + "MaleCustomizeOffset1, MaleCustomizeOffset2, MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, " + + "LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " + + "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " + + "UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, FactionID, CinematicSequenceID, ResSicknessSpellID, " + + "SplashSoundID, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, " + + "CharComponentTexLayoutHiResID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " + + "FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex" + " FROM chr_races ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" + + PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" + " FROM chr_races_locale WHERE locale = ?"); // ChrSpecialization.db2 - PrepareStatement(HotfixStatements.SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " + + PrepareStatement(HotfixStatements.SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " + "SpellIconFileID, PrimaryStatPriority, AnimReplacements, MasterySpellID1, MasterySpellID2 FROM chr_specialization ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_CHR_SPECIALIZATION_LOCALE, "SELECT ID, Name_lang, FemaleName_lang, Description_lang FROM chr_specialization_locale" + + PrepareStatement(HotfixStatements.SEL_CHR_SPECIALIZATION_LOCALE, "SELECT ID, Name_lang, FemaleName_lang, Description_lang FROM chr_specialization_locale" + " WHERE locale = ?"); // CinematicCamera.db2 - PrepareStatement(HotfixStatements.SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera" + + PrepareStatement(HotfixStatements.SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera" + " ORDER BY ID DESC"); // CinematicSequences.db2 - PrepareStatement(HotfixStatements.SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" + + PrepareStatement(HotfixStatements.SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" + " FROM cinematic_sequences ORDER BY ID DESC"); // ContentTuning.db2 - PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpectedStatModID, DifficultyESMID FROM content_tuning" + + PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpansionID FROM content_tuning ORDER BY ID DESC"); + + // ContentTuningXExpected.db2 + PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, ContentTuningID FROM content_tuning_x_expected" + " ORDER BY ID DESC"); // ConversationLine.db2 - PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " + + PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " + "AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line ORDER BY ID DESC"); // CreatureDisplayInfo.db2 - PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, SizeClass, CreatureModelScale, CreatureModelAlpha, BloodID, " + - "ExtendedDisplayInfoID, NPCSoundID, ParticleColorID, PortraitCreatureDisplayInfoID, PortraitTextureFileDataID, ObjectEffectPackageID, " + - "AnimReplacementSetID, Flags, StateSpellVisualKitID, PlayerOverrideScale, PetInstanceScale, UnarmedWeaponType, MountPoofSpellVisualKitID, " + - "DissolveEffectID, Gender, DissolveOutEffectID, CreatureModelMinLod, TextureVariationFileDataID1, TextureVariationFileDataID2, " + + PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, SizeClass, CreatureModelScale, CreatureModelAlpha, BloodID, " + + "ExtendedDisplayInfoID, NPCSoundID, ParticleColorID, PortraitCreatureDisplayInfoID, PortraitTextureFileDataID, ObjectEffectPackageID, " + + "AnimReplacementSetID, Flags, StateSpellVisualKitID, PlayerOverrideScale, PetInstanceScale, UnarmedWeaponType, MountPoofSpellVisualKitID, " + + "DissolveEffectID, Gender, DissolveOutEffectID, CreatureModelMinLod, TextureVariationFileDataID1, TextureVariationFileDataID2, " + "TextureVariationFileDataID3 FROM creature_display_info ORDER BY ID DESC"); // CreatureDisplayInfoExtra.db2 - PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, " + - "HairColorID, FacialHairID, Flags, BakeMaterialResourcesID, HDBakeMaterialResourcesID, CustomDisplayOption1, CustomDisplayOption2, " + + PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, " + + "HairColorID, FacialHairID, Flags, BakeMaterialResourcesID, HDBakeMaterialResourcesID, CustomDisplayOption1, CustomDisplayOption2, " + "CustomDisplayOption3 FROM creature_display_info_extra ORDER BY ID DESC"); // CreatureFamily.db2 - PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " + + PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " + "IconFileID, SkillLine1, SkillLine2 FROM creature_family ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY_LOCALE, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?"); // CreatureModelData.db2 - PrepareStatement(HotfixStatements.SEL_CREATURE_MODEL_DATA, "SELECT ID, GeoBox1, GeoBox2, GeoBox3, GeoBox4, GeoBox5, GeoBox6, Flags, FileDataID, BloodID, " + - "FootprintTextureID, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, FoleyMaterialID, FootstepCameraEffectID, " + - "DeathThudCameraEffectID, SoundID, SizeClass, CollisionWidth, CollisionHeight, WorldEffectScale, CreatureGeosetDataID, HoverHeight, " + - "AttachedEffectScale, ModelScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, MountHeight, OverrideLootEffectScale, " + - "OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale FROM creature_model_data ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_CREATURE_MODEL_DATA, "SELECT ID, GeoBox1, GeoBox2, GeoBox3, GeoBox4, GeoBox5, GeoBox6, Flags, FileDataID, BloodID, " + + "FootprintTextureID, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, FoleyMaterialID, FootstepCameraEffectID, " + + "DeathThudCameraEffectID, SoundID, SizeClass, CollisionWidth, CollisionHeight, WorldEffectScale, CreatureGeosetDataID, HoverHeight, " + + "AttachedEffectScale, ModelScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, MountHeight, OverrideLootEffectScale, " + + "OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, Unknown820_1, Unknown820_2, Unknown820_31, Unknown820_32" + + " FROM creature_model_data ORDER BY ID DESC"); // CreatureType.db2 PrepareStatement(HotfixStatements.SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CREATURE_TYPE_LOCALE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?"); // Criteria.db2 - PrepareStatement(HotfixStatements.SEL_CRITERIA, "SELECT ID, Type, Asset, ModifierTreeId, StartEvent, StartAsset, StartTimer, FailEvent, FailAsset, Flags, " + + PrepareStatement(HotfixStatements.SEL_CRITERIA, "SELECT ID, Type, Asset, ModifierTreeId, StartEvent, StartAsset, StartTimer, FailEvent, FailAsset, Flags, " + "EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC"); // CriteriaTree.db2 - PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree" + + PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree" + " ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE_LOCALE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?"); // CurrencyTypes.db2 - PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + - "MaxEarnablePerWeek, Flags, Quality, FactionID FROM currency_types ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + + "MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID FROM currency_types ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?"); // Curve.db2 @@ -262,36 +267,36 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CURVE_POINT, "SELECT ID, PosX, PosY, CurveID, OrderIndex FROM curve_point ORDER BY ID DESC"); // DestructibleModelData.db2 - PrepareStatement(HotfixStatements.SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State1Wmo, " + - "State1DestructionDoodadSet, State1ImpactEffectDoodadSet, State1AmbientDoodadSet, State2Wmo, State2DestructionDoodadSet, " + - "State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State3Wmo, State3InitDoodadSet, State3AmbientDoodadSet, EjectDirection, DoNotHighlight, " + - "State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data" + + PrepareStatement(HotfixStatements.SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State1Wmo, " + + "State1DestructionDoodadSet, State1ImpactEffectDoodadSet, State1AmbientDoodadSet, State2Wmo, State2DestructionDoodadSet, " + + "State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State3Wmo, State3InitDoodadSet, State3AmbientDoodadSet, EjectDirection, DoNotHighlight, " + + "State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data" + " ORDER BY ID DESC"); // Difficulty.db2 - PrepareStatement(HotfixStatements.SEL_DIFFICULTY, "SELECT ID, Name, InstanceType, OrderIndex, OldEnumValue, FallbackDifficultyID, MinPlayers, MaxPlayers, " + - "Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty" + + PrepareStatement(HotfixStatements.SEL_DIFFICULTY, "SELECT ID, Name, InstanceType, OrderIndex, OldEnumValue, FallbackDifficultyID, MinPlayers, MaxPlayers, " + + "Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty" + " ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_DIFFICULTY_LOCALE, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?"); // DungeonEncounter.db2 - PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, Bit, CreatureDisplayID, Flags, SpellIconFileID" + - " FROM dungeon_encounter ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, CompleteWorldStateID, Bit, CreatureDisplayID, " + + "Flags, SpellIconFileID, Faction FROM dungeon_encounter ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER_LOCALE, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?"); // DurabilityCosts.db2 - PrepareStatement(HotfixStatements.SEL_DURABILITY_COSTS, "SELECT ID, WeaponSubClassCost1, WeaponSubClassCost2, WeaponSubClassCost3, WeaponSubClassCost4, " + - "WeaponSubClassCost5, WeaponSubClassCost6, WeaponSubClassCost7, WeaponSubClassCost8, WeaponSubClassCost9, WeaponSubClassCost10, " + - "WeaponSubClassCost11, WeaponSubClassCost12, WeaponSubClassCost13, WeaponSubClassCost14, WeaponSubClassCost15, WeaponSubClassCost16, " + - "WeaponSubClassCost17, WeaponSubClassCost18, WeaponSubClassCost19, WeaponSubClassCost20, WeaponSubClassCost21, ArmorSubClassCost1, " + - "ArmorSubClassCost2, ArmorSubClassCost3, ArmorSubClassCost4, ArmorSubClassCost5, ArmorSubClassCost6, ArmorSubClassCost7, ArmorSubClassCost8" + + PrepareStatement(HotfixStatements.SEL_DURABILITY_COSTS, "SELECT ID, WeaponSubClassCost1, WeaponSubClassCost2, WeaponSubClassCost3, WeaponSubClassCost4, " + + "WeaponSubClassCost5, WeaponSubClassCost6, WeaponSubClassCost7, WeaponSubClassCost8, WeaponSubClassCost9, WeaponSubClassCost10, " + + "WeaponSubClassCost11, WeaponSubClassCost12, WeaponSubClassCost13, WeaponSubClassCost14, WeaponSubClassCost15, WeaponSubClassCost16, " + + "WeaponSubClassCost17, WeaponSubClassCost18, WeaponSubClassCost19, WeaponSubClassCost20, WeaponSubClassCost21, ArmorSubClassCost1, " + + "ArmorSubClassCost2, ArmorSubClassCost3, ArmorSubClassCost4, ArmorSubClassCost5, ArmorSubClassCost6, ArmorSubClassCost7, ArmorSubClassCost8" + " FROM durability_costs ORDER BY ID DESC"); // DurabilityQuality.db2 PrepareStatement(HotfixStatements.SEL_DURABILITY_QUALITY, "SELECT ID, Data FROM durability_quality ORDER BY ID DESC"); // Emotes.db2 - PrepareStatement(HotfixStatements.SEL_EMOTES, "SELECT ID, RaceMask, EmoteSlashCommand, AnimID, EmoteFlags, EmoteSpecProc, EmoteSpecProcParam, EventSoundID, " + + PrepareStatement(HotfixStatements.SEL_EMOTES, "SELECT ID, RaceMask, EmoteSlashCommand, AnimID, EmoteFlags, EmoteSpecProc, EmoteSpecProcParam, EventSoundID, " + "SpellVisualKitID, ClassMask FROM emotes ORDER BY ID DESC"); // EmotesText.db2 @@ -301,74 +306,74 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_EMOTES_TEXT_SOUND, "SELECT ID, RaceID, ClassID, SexID, SoundID, EmotesTextID FROM emotes_text_sound ORDER BY ID DESC"); // ExpectedStat.db2 - PrepareStatement(HotfixStatements.SEL_EXPECTED_STAT, "SELECT ID, ExpansionID, CreatureHealth, PlayerHealth, CreatureAutoAttackDps, CreatureArmor, " + + PrepareStatement(HotfixStatements.SEL_EXPECTED_STAT, "SELECT ID, ExpansionID, CreatureHealth, PlayerHealth, CreatureAutoAttackDps, CreatureArmor, " + "PlayerMana, PlayerPrimaryStat, PlayerSecondaryStat, ArmorConstant, CreatureSpellDamage, Lvl FROM expected_stat ORDER BY ID DESC"); // ExpectedStatMod.db2 - PrepareStatement(HotfixStatements.SEL_EXPECTED_STAT_MOD, "SELECT ID, CreatureHealthMod, PlayerHealthMod, CreatureAutoAttackDPSMod, CreatureArmorMod, " + + PrepareStatement(HotfixStatements.SEL_EXPECTED_STAT_MOD, "SELECT ID, CreatureHealthMod, PlayerHealthMod, CreatureAutoAttackDPSMod, CreatureArmorMod, " + "PlayerManaMod, PlayerPrimaryStatMod, PlayerSecondaryStatMod, ArmorConstantMod, CreatureSpellDamageMod FROM expected_stat_mod ORDER BY ID DESC"); // Faction.db2 - PrepareStatement(HotfixStatements.SEL_FACTION, "SELECT ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, " + - "Description, ID, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, ReputationClassMask1, " + - "ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, " + - "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, " + + PrepareStatement(HotfixStatements.SEL_FACTION, "SELECT ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, " + + "Description, ID, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, ReputationClassMask1, " + + "ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, " + + "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, " + "ParentFactionMod1, ParentFactionMod2, ParentFactionCap1, ParentFactionCap2 FROM faction ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_FACTION_LOCALE, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE locale = ?"); // FactionTemplate.db2 - PrepareStatement(HotfixStatements.SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, FactionGroup, FriendGroup, EnemyGroup, Enemies1, Enemies2, Enemies3, " + + PrepareStatement(HotfixStatements.SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, FactionGroup, FriendGroup, EnemyGroup, Enemies1, Enemies2, Enemies3, " + "Enemies4, Friend1, Friend2, Friend3, Friend4 FROM faction_template ORDER BY ID DESC"); // GameobjectDisplayInfo.db2 - PrepareStatement(HotfixStatements.SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, GeoBoxMaxZ, " + + PrepareStatement(HotfixStatements.SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, GeoBoxMaxZ, " + "FileDataID, ObjectEffectPackageID, OverrideLootEffectScale, OverrideNameScale FROM gameobject_display_info ORDER BY ID DESC"); // Gameobjects.db2 - PrepareStatement(HotfixStatements.SEL_GAMEOBJECTS, "SELECT Name, PosX, PosY, PosZ, Rot1, Rot2, Rot3, Rot4, ID, OwnerID, DisplayID, Scale, TypeID, " + - "PhaseUseFlags, PhaseID, PhaseGroupID, PropValue1, PropValue2, PropValue3, PropValue4, PropValue5, PropValue6, PropValue7, PropValue8" + + PrepareStatement(HotfixStatements.SEL_GAMEOBJECTS, "SELECT Name, PosX, PosY, PosZ, Rot1, Rot2, Rot3, Rot4, ID, OwnerID, DisplayID, Scale, TypeID, " + + "PhaseUseFlags, PhaseID, PhaseGroupID, PropValue1, PropValue2, PropValue3, PropValue4, PropValue5, PropValue6, PropValue7, PropValue8" + " FROM gameobjects ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_GAMEOBJECTS_LOCALE, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?"); // GarrAbility.db2 - PrepareStatement(HotfixStatements.SEL_GARR_ABILITY, "SELECT Name, Description, ID, GarrAbilityCategoryID, GarrFollowerTypeID, IconFileDataID, " + + PrepareStatement(HotfixStatements.SEL_GARR_ABILITY, "SELECT Name, Description, ID, GarrAbilityCategoryID, GarrFollowerTypeID, IconFileDataID, " + "FactionChangeGarrAbilityID, Flags FROM garr_ability ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_GARR_ABILITY_LOCALE, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?"); // GarrBuilding.db2 - PrepareStatement(HotfixStatements.SEL_GARR_BUILDING, "SELECT ID, HordeName, AllianceName, Description, Tooltip, GarrTypeID, BuildingType, " + - "HordeGameObjectID, AllianceGameObjectID, GarrSiteID, UpgradeLevel, BuildSeconds, CurrencyTypeID, CurrencyQty, HordeUiTextureKitID, " + - "AllianceUiTextureKitID, IconFileDataID, AllianceSceneScriptPackageID, HordeSceneScriptPackageID, MaxAssignments, ShipmentCapacity, " + + PrepareStatement(HotfixStatements.SEL_GARR_BUILDING, "SELECT ID, HordeName, AllianceName, Description, Tooltip, GarrTypeID, BuildingType, " + + "HordeGameObjectID, AllianceGameObjectID, GarrSiteID, UpgradeLevel, BuildSeconds, CurrencyTypeID, CurrencyQty, HordeUiTextureKitID, " + + "AllianceUiTextureKitID, IconFileDataID, AllianceSceneScriptPackageID, HordeSceneScriptPackageID, MaxAssignments, ShipmentCapacity, " + "GarrAbilityID, BonusGarrAbilityID, GoldCost, Flags FROM garr_building ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_GARR_BUILDING_LOCALE, "SELECT ID, HordeName_lang, AllianceName_lang, Description_lang, Tooltip_lang" + + PrepareStatement(HotfixStatements.SEL_GARR_BUILDING_LOCALE, "SELECT ID, HordeName_lang, AllianceName_lang, Description_lang, Tooltip_lang" + " FROM garr_building_locale WHERE locale = ?"); // GarrBuildingPlotInst.db2 - PrepareStatement(HotfixStatements.SEL_GARR_BUILDING_PLOT_INST, "SELECT MapOffsetX, MapOffsetY, ID, GarrBuildingID, GarrSiteLevelPlotInstID, " + + PrepareStatement(HotfixStatements.SEL_GARR_BUILDING_PLOT_INST, "SELECT MapOffsetX, MapOffsetY, ID, GarrBuildingID, GarrSiteLevelPlotInstID, " + "UiTextureAtlasMemberID FROM garr_building_plot_inst ORDER BY ID DESC"); // GarrClassSpec.db2 - PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC, "SELECT ClassSpec, ClassSpecMale, ClassSpecFemale, ID, UiTextureAtlasMemberID, GarrFollItemSetID, " + + PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC, "SELECT ClassSpec, ClassSpecMale, ClassSpecFemale, ID, UiTextureAtlasMemberID, GarrFollItemSetID, " + "FollowerClassLimit, Flags FROM garr_class_spec ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC_LOCALE, "SELECT ID, ClassSpec_lang, ClassSpecMale_lang, ClassSpecFemale_lang FROM garr_class_spec_locale" + + PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC_LOCALE, "SELECT ID, ClassSpec_lang, ClassSpecMale_lang, ClassSpecFemale_lang FROM garr_class_spec_locale" + " WHERE locale = ?"); // GarrFollower.db2 - PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER, "SELECT HordeSourceText, AllianceSourceText, TitleName, ID, GarrTypeID, GarrFollowerTypeID, " + - "HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " + - "FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " + - "HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " + - "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender FROM garr_follower" + + PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER, "SELECT HordeSourceText, AllianceSourceText, TitleName, ID, GarrTypeID, GarrFollowerTypeID, " + + "HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " + + "FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " + + "HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " + + "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender FROM garr_follower" + " ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER_LOCALE, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, TitleName_lang FROM garr_follower_locale" + + PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER_LOCALE, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, TitleName_lang FROM garr_follower_locale" + " WHERE locale = ?"); // GarrFollowerXAbility.db2 - PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, OrderIndex, FactionIndex, GarrAbilityID, GarrFollowerID" + + PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, OrderIndex, FactionIndex, GarrAbilityID, GarrFollowerID" + " FROM garr_follower_x_ability ORDER BY ID DESC"); // GarrPlot.db2 - PrepareStatement(HotfixStatements.SEL_GARR_PLOT, "SELECT ID, Name, PlotType, HordeConstructObjID, AllianceConstructObjID, Flags, UiCategoryID, " + + PrepareStatement(HotfixStatements.SEL_GARR_PLOT, "SELECT ID, Name, PlotType, HordeConstructObjID, AllianceConstructObjID, Flags, UiCategoryID, " + "UpgradeRequirement1, UpgradeRequirement2 FROM garr_plot ORDER BY ID DESC"); // GarrPlotBuilding.db2 @@ -378,11 +383,11 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name, GarrPlotID FROM garr_plot_instance ORDER BY ID DESC"); // GarrSiteLevel.db2 - PrepareStatement(HotfixStatements.SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallUiPosX, TownHallUiPosY, GarrSiteID, GarrLevel, MapID, UpgradeMovieID, " + + PrepareStatement(HotfixStatements.SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallUiPosX, TownHallUiPosY, GarrSiteID, GarrLevel, MapID, UpgradeMovieID, " + "UiTextureKitID, MaxBuildingLevel, UpgradeCost, UpgradeGoldCost FROM garr_site_level ORDER BY ID DESC"); // GarrSiteLevelPlotInst.db2 - PrepareStatement(HotfixStatements.SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, UiMarkerPosX, UiMarkerPosY, GarrSiteLevelID, GarrPlotInstanceID, UiMarkerSize" + + PrepareStatement(HotfixStatements.SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, UiMarkerPosX, UiMarkerPosY, GarrSiteLevelID, GarrPlotInstanceID, UiMarkerSize" + " FROM garr_site_level_plot_inst ORDER BY ID DESC"); // GemProperties.db2 @@ -392,7 +397,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell ORDER BY ID DESC"); // GlyphProperties.db2 - PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, SpellIconID, GlyphType, GlyphExclusiveCategoryID FROM glyph_properties" + + PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, GlyphType, GlyphExclusiveCategoryID, SpellIconFileDataID FROM glyph_properties" + " ORDER BY ID DESC"); // GlyphRequiredSpec.db2 @@ -411,20 +416,21 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID FROM guild_perk_spells ORDER BY ID DESC"); // Heirloom.db2 - PrepareStatement(HotfixStatements.SEL_HEIRLOOM, "SELECT SourceText, ID, ItemID, LegacyUpgradedItemID, StaticUpgradedItemID, SourceTypeEnum, Flags, " + - "LegacyItemID, UpgradeItemID1, UpgradeItemID2, UpgradeItemID3, UpgradeItemBonusListID1, UpgradeItemBonusListID2, UpgradeItemBonusListID3" + - " FROM heirloom ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_HEIRLOOM, "SELECT SourceText, ID, ItemID, LegacyUpgradedItemID, StaticUpgradedItemID, SourceTypeEnum, Flags, " + + "LegacyItemID, UpgradeItemID1, UpgradeItemID2, UpgradeItemID3, UpgradeItemID4, UpgradeItemBonusListID1, UpgradeItemBonusListID2, " + + "UpgradeItemBonusListID3, UpgradeItemBonusListID4 FROM heirloom ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_HEIRLOOM_LOCALE, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?"); // Holidays.db2 - PrepareStatement(HotfixStatements.SEL_HOLIDAYS, "SELECT ID, Region, Looping, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags, " + - "Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " + - "Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, CalendarFlags1, CalendarFlags2, CalendarFlags3, " + - "CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, " + - "TextureFileDataID2, TextureFileDataID3 FROM holidays ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_HOLIDAYS, "SELECT ID, Region, Looping, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags, " + + "Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " + + "Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, Date17, Date18, Date19, Date20, Date21, Date22, " + + "Date23, Date24, Date25, Date26, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, " + + "CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays" + + " ORDER BY ID DESC"); // ImportPriceArmor.db2 - PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" + + PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" + " ORDER BY ID DESC"); // ImportPriceQuality.db2 @@ -437,19 +443,19 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Data FROM import_price_weapon ORDER BY ID DESC"); // Item.db2 - PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " + + PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " + "ItemGroupSoundsID FROM item ORDER BY ID DESC"); // ItemAppearance.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" + + PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" + " ORDER BY ID DESC"); // ItemArmorQuality.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " + + PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " + "Qualitymod7 FROM item_armor_quality ORDER BY ID DESC"); // ItemArmorShield.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_SHIELD, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + + PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_SHIELD, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + " FROM item_armor_shield ORDER BY ID DESC"); // ItemArmorTotal.db2 @@ -460,18 +466,18 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_ITEM_BAG_FAMILY_LOCALE, "SELECT ID, Name_lang FROM item_bag_family_locale WHERE locale = ?"); // ItemBonus.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, ParentItemBonusListID, Type, OrderIndex FROM item_bonus" + + PrepareStatement(HotfixStatements.SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, ParentItemBonusListID, Type, OrderIndex FROM item_bonus" + " ORDER BY ID DESC"); // ItemBonusListLevelDelta.db2 PrepareStatement(HotfixStatements.SEL_ITEM_BONUS_LIST_LEVEL_DELTA, "SELECT ItemLevelDelta, ID FROM item_bonus_list_level_delta ORDER BY ID DESC"); // ItemBonusTreeNode.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, ItemContext, ChildItemBonusTreeID, ChildItemBonusListID, ChildItemLevelSelectorID, " + + PrepareStatement(HotfixStatements.SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, ItemContext, ChildItemBonusTreeID, ChildItemBonusListID, ChildItemLevelSelectorID, " + "ParentItemBonusTreeID FROM item_bonus_tree_node ORDER BY ID DESC"); // ItemChildEquipment.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ChildItemID, ChildItemEquipSlot, ParentItemID FROM item_child_equipment" + + PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment" + " ORDER BY ID DESC"); // ItemClass.db2 @@ -482,44 +488,45 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemID FROM item_currency_cost ORDER BY ID DESC"); // ItemDamageAmmo.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_AMMO, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" + + PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_AMMO, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" + " FROM item_damage_ammo ORDER BY ID DESC"); // ItemDamageOneHand.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_ONE_HAND, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" + + PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_ONE_HAND, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" + " FROM item_damage_one_hand ORDER BY ID DESC"); // ItemDamageOneHandCaster.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_ONE_HAND_CASTER, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, " + + PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_ONE_HAND_CASTER, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, " + "Quality7 FROM item_damage_one_hand_caster ORDER BY ID DESC"); // ItemDamageTwoHand.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_TWO_HAND, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" + + PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_TWO_HAND, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" + " FROM item_damage_two_hand ORDER BY ID DESC"); // ItemDamageTwoHandCaster.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_TWO_HAND_CASTER, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, " + + PrepareStatement(HotfixStatements.SEL_ITEM_DAMAGE_TWO_HAND_CASTER, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, " + "Quality7 FROM item_damage_two_hand_caster ORDER BY ID DESC"); // ItemDisenchantLoot.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, Subclass, Quality, MinLevel, MaxLevel, SkillRequired, ExpansionID, Class" + + PrepareStatement(HotfixStatements.SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, Subclass, Quality, MinLevel, MaxLevel, SkillRequired, ExpansionID, Class" + " FROM item_disenchant_loot ORDER BY ID DESC"); // ItemEffect.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_EFFECT, "SELECT ID, LegacySlotIndex, TriggerType, Charges, CoolDownMSec, CategoryCoolDownMSec, SpellCategoryID, " + + PrepareStatement(HotfixStatements.SEL_ITEM_EFFECT, "SELECT ID, LegacySlotIndex, TriggerType, Charges, CoolDownMSec, CategoryCoolDownMSec, SpellCategoryID, " + "SpellID, ChrSpecializationID, ParentItemID FROM item_effect ORDER BY ID DESC"); // ItemExtendedCost.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaRating, ArenaBracket, Flags, MinFactionID, MinReputation, " + - "RequiredAchievement, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemCount5, CurrencyID1, " + - "CurrencyID2, CurrencyID3, CurrencyID4, CurrencyID5, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, CurrencyCount5" + + PrepareStatement(HotfixStatements.SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaRating, ArenaBracket, Flags, MinFactionID, MinReputation, " + + "RequiredAchievement, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemCount5, CurrencyID1, " + + "CurrencyID2, CurrencyID3, CurrencyID4, CurrencyID5, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, CurrencyCount5" + " FROM item_extended_cost ORDER BY ID DESC"); // ItemLevelSelector.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, MinItemLevel, ItemLevelSelectorQualitySetID FROM item_level_selector ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, MinItemLevel, ItemLevelSelectorQualitySetID, AzeriteUnlockMappingSet" + + " FROM item_level_selector ORDER BY ID DESC"); // ItemLevelSelectorQuality.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR_QUALITY, "SELECT ID, QualityItemBonusListID, Quality, ParentILSQualitySetID" + + PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR_QUALITY, "SELECT ID, QualityItemBonusListID, Quality, ParentILSQualitySetID" + " FROM item_level_selector_quality ORDER BY ID DESC"); // ItemLevelSelectorQualitySet.db2 @@ -530,35 +537,25 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?"); // ItemLimitCategoryCondition.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION, "SELECT ID, AddQuantity, PlayerConditionID, ParentItemLimitCategoryID" + + PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION, "SELECT ID, AddQuantity, PlayerConditionID, ParentItemLimitCategoryID" + " FROM item_limit_category_condition ORDER BY ID DESC"); // ItemModifiedAppearance.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " + + PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " + "TransmogSourceTypeEnum FROM item_modified_appearance ORDER BY ID DESC"); // ItemPriceBase.db2 PrepareStatement(HotfixStatements.SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base ORDER BY ID DESC"); - // ItemRandomProperties.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5" + - " FROM item_random_properties ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES_LOCALE, "SELECT ID, Name_lang FROM item_random_properties_locale WHERE locale = ?"); - - // ItemRandomSuffix.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5, " + - "AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_SUFFIX_LOCALE, "SELECT ID, Name_lang FROM item_random_suffix_locale WHERE locale = ?"); - // ItemSearchName.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " + - "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" + + PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " + + "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" + " FROM item_search_name ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE, "SELECT ID, Display_lang FROM item_search_name_locale WHERE locale = ?"); // ItemSet.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_SET, "SELECT ID, Name, SetFlags, RequiredSkill, RequiredSkillRank, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " + - "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set" + + PrepareStatement(HotfixStatements.SEL_ITEM_SET, "SELECT ID, Name, SetFlags, RequiredSkill, RequiredSkillRank, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " + + "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set" + " ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ITEM_SET_LOCALE, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?"); @@ -566,64 +563,64 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, Threshold, ItemSetID FROM item_set_spell ORDER BY ID DESC"); // ItemSparse.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, DmgVariance, " + - "DurationInInventory, QualityModifier, BagFamily, ItemRange, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, " + - "StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, " + - "StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " + - "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " + - "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " + - "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " + - "TotemCategoryID, InstanceBound, ZoneBound, ItemSet, ItemRandomSuffixGroupID, RandomSelect, LockID, StartQuestID, PageID, ItemDelay, " + - "ScalingStatDistributionID, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, " + - "SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, " + - "StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, " + - "StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, " + - "MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" + + PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, DmgVariance, " + + "DurationInInventory, QualityModifier, BagFamily, ItemRange, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, " + + "StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, " + + "StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " + + "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " + + "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " + + "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " + + "TotemCategoryID, InstanceBound, ZoneBound, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, MinFactionID, " + + "RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, " + + "SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " + + "StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " + + "StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " + + "RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" + " FROM item_sparse_locale WHERE locale = ?"); // ItemSpec.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec" + + PrepareStatement(HotfixStatements.SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec" + " ORDER BY ID DESC"); // ItemSpecOverride.db2 PrepareStatement(HotfixStatements.SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override ORDER BY ID DESC"); // ItemUpgrade.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_UPGRADE, "SELECT ID, ItemUpgradePathID, ItemLevelIncrement, PrerequisiteID, CurrencyType, CurrencyAmount" + + PrepareStatement(HotfixStatements.SEL_ITEM_UPGRADE, "SELECT ID, ItemUpgradePathID, ItemLevelIncrement, PrerequisiteID, CurrencyType, CurrencyAmount" + " FROM item_upgrade ORDER BY ID DESC"); // ItemXBonusTree.db2 PrepareStatement(HotfixStatements.SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemBonusTreeID, ItemID FROM item_x_bonus_tree ORDER BY ID DESC"); // Keychain.db2 - PrepareStatement(HotfixStatements.SEL_KEYCHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " + - "Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain" + + PrepareStatement(HotfixStatements.SEL_KEYCHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " + + "Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain" + " ORDER BY ID DESC"); // LfgDungeons.db2 - PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, MinLevel, MaxLevel, TypeID, Subtype, Faction, IconTextureFileID, " + - "RewardsBgTextureFileID, PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, " + - "TargetLevel, TargetLevelMin, TargetLevelMax, RandomID, ScenarioID, FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, " + + PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, MinLevel, MaxLevel, TypeID, Subtype, Faction, IconTextureFileID, " + + "RewardsBgTextureFileID, PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, " + + "TargetLevel, TargetLevelMin, TargetLevelMax, RandomID, ScenarioID, FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, " + "MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, MentorCharLevel, Flags1, Flags2 FROM lfg_dungeons ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS_LOCALE, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?"); // Light.db2 - PrepareStatement(HotfixStatements.SEL_LIGHT, "SELECT ID, GameCoordsX, GameCoordsY, GameCoordsZ, GameFalloffStart, GameFalloffEnd, ContinentID, " + - "LightParamsID1, LightParamsID2, LightParamsID3, LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light" + + PrepareStatement(HotfixStatements.SEL_LIGHT, "SELECT ID, GameCoordsX, GameCoordsY, GameCoordsZ, GameFalloffStart, GameFalloffEnd, ContinentID, " + + "LightParamsID1, LightParamsID2, LightParamsID3, LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light" + " ORDER BY ID DESC"); // LiquidType.db2 - PrepareStatement(HotfixStatements.SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, " + - "SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, LightID, ParticleScale, ParticleMovement, " + - "ParticleTexSlots, MaterialID, MinimapStaticCol, FrameCountTexture1, FrameCountTexture2, FrameCountTexture3, FrameCountTexture4, " + - "FrameCountTexture5, FrameCountTexture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, Float7, `Float8`, Float9, Float10, " + - "Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Coefficient1, Coefficient2, " + + PrepareStatement(HotfixStatements.SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, " + + "SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, LightID, ParticleScale, ParticleMovement, " + + "ParticleTexSlots, MaterialID, MinimapStaticCol, FrameCountTexture1, FrameCountTexture2, FrameCountTexture3, FrameCountTexture4, " + + "FrameCountTexture5, FrameCountTexture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, Float7, `Float8`, Float9, Float10, " + + "Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Coefficient1, Coefficient2, " + "Coefficient3, Coefficient4 FROM liquid_type ORDER BY ID DESC"); // Lock.db2 - PrepareStatement(HotfixStatements.SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " + - "Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, " + + PrepareStatement(HotfixStatements.SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " + + "Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, " + "Action6, Action7, Action8 FROM `lock` ORDER BY ID DESC"); // MailTemplate.db2 @@ -631,32 +628,32 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_MAIL_TEMPLATE_LOCALE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?"); // Map.db2 - PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " + - "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " + - "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, Flags1, Flags2 FROM map ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " + + PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " + + "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " + + "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " + "PvpLongDescription_lang FROM map_locale WHERE locale = ?"); // MapDifficulty.db2 - PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY, "SELECT ID, Message, ItemContextPickerID, ContentTuningID, DifficultyID, LockID, ResetInterval, " + - "MaxPlayers, ItemContext, Flags, MapID FROM map_difficulty ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY, "SELECT ID, Message, DifficultyID, LockID, ResetInterval, MaxPlayers, ItemContext, " + + "ItemContextPickerID, Flags, ContentTuningID, MapID FROM map_difficulty ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY_LOCALE, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?"); // ModifierTree.db2 - PrepareStatement(HotfixStatements.SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree" + + PrepareStatement(HotfixStatements.SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree" + " ORDER BY ID DESC"); // Mount.db2 - PrepareStatement(HotfixStatements.SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " + + PrepareStatement(HotfixStatements.SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " + "PlayerConditionID, MountFlyRideHeight, UiModelSceneID FROM mount ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_MOUNT_LOCALE, "SELECT ID, Name_lang, SourceText_lang, Description_lang FROM mount_locale WHERE locale = ?"); // MountCapability.db2 - PrepareStatement(HotfixStatements.SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " + - "ReqMapID FROM mount_capability ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " + + "ReqMapID, PlayerConditionID FROM mount_capability ORDER BY ID DESC"); // MountTypeXCapability.db2 - PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" + + PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" + " ORDER BY ID DESC"); // MountXDisplay.db2 @@ -678,11 +675,11 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_NAMES_RESERVED_LOCALE, "SELECT ID, Name, LocaleMask FROM names_reserved_locale ORDER BY ID DESC"); // NumTalentsAtLevel.db2 - PrepareStatement(HotfixStatements.SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level" + + PrepareStatement(HotfixStatements.SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level" + " ORDER BY ID DESC"); // OverrideSpellData.db2 - PrepareStatement(HotfixStatements.SEL_OVERRIDE_SPELL_DATA, "SELECT ID, Spells1, Spells2, Spells3, Spells4, Spells5, Spells6, Spells7, Spells8, Spells9, " + + PrepareStatement(HotfixStatements.SEL_OVERRIDE_SPELL_DATA, "SELECT ID, Spells1, Spells2, Spells3, Spells4, Spells5, Spells6, Spells7, Spells8, Spells9, " + "Spells10, PlayerActionBarFileDataID, Flags FROM override_spell_data ORDER BY ID DESC"); // Phase.db2 @@ -692,22 +689,22 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group ORDER BY ID DESC"); // PlayerCondition.db2 - PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, MinLevel, MaxLevel, ClassMask, SkillLogic, LanguageID, " + - "MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " + - "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " + - "LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " + - "MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " + - "PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " + - "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, SkillID1, SkillID2, SkillID3, " + - "SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, " + - "MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, " + - "CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, " + - "CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, " + - "ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, " + - "AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, LfgStatus1, " + - "LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, " + - "CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, " + - "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2" + + PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, MinLevel, MaxLevel, ClassMask, SkillLogic, LanguageID, " + + "MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " + + "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " + + "LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " + + "MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " + + "PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " + + "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, SkillID1, SkillID2, SkillID3, " + + "SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, " + + "MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, " + + "CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, " + + "CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, " + + "ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, " + + "AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, LfgStatus1, " + + "LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, " + + "CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, " + + "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2" + " FROM player_condition ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION_LOCALE, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?"); @@ -715,11 +712,11 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, ActualType, Red, Green, Blue FROM power_display ORDER BY ID DESC"); // PowerType.db2 - PrepareStatement(HotfixStatements.SEL_POWER_TYPE, "SELECT ID, NameGlobalStringTag, CostGlobalStringTag, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " + + PrepareStatement(HotfixStatements.SEL_POWER_TYPE, "SELECT ID, NameGlobalStringTag, CostGlobalStringTag, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " + "DefaultPower, DisplayModifier, RegenInterruptTimeMS, RegenPeace, RegenCombat, Flags FROM power_type ORDER BY ID DESC"); // PrestigeLevelInfo.db2 - PrepareStatement(HotfixStatements.SEL_PRESTIGE_LEVEL_INFO, "SELECT ID, Name, PrestigeLevel, BadgeTextureFileDataID, Flags, AwardedAchievementID" + + PrepareStatement(HotfixStatements.SEL_PRESTIGE_LEVEL_INFO, "SELECT ID, Name, PrestigeLevel, BadgeTextureFileDataID, Flags, AwardedAchievementID" + " FROM prestige_level_info ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_PRESTIGE_LEVEL_INFO_LOCALE, "SELECT ID, Name_lang FROM prestige_level_info_locale WHERE locale = ?"); @@ -730,7 +727,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_PVP_ITEM, "SELECT ID, ItemID, ItemLevelDelta FROM pvp_item ORDER BY ID DESC"); // PvpTalent.db2 - PrepareStatement(HotfixStatements.SEL_PVP_TALENT, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, Flags, ActionBarSpellID, PvpTalentCategoryID, " + + PrepareStatement(HotfixStatements.SEL_PVP_TALENT, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, Flags, ActionBarSpellID, PvpTalentCategoryID, " + "LevelRequired FROM pvp_talent ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_PVP_TALENT_LOCALE, "SELECT ID, Description_lang FROM pvp_talent_locale WHERE locale = ?"); @@ -738,15 +735,15 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_PVP_TALENT_CATEGORY, "SELECT ID, TalentSlotMask FROM pvp_talent_category ORDER BY ID DESC"); // PvpTalentSlotUnlock.db2 - PrepareStatement(HotfixStatements.SEL_PVP_TALENT_SLOT_UNLOCK, "SELECT ID, Slot, LevelRequired, DeathKnightLevelRequired, DemonHunterLevelRequired" + + PrepareStatement(HotfixStatements.SEL_PVP_TALENT_SLOT_UNLOCK, "SELECT ID, Slot, LevelRequired, DeathKnightLevelRequired, DemonHunterLevelRequired" + " FROM pvp_talent_slot_unlock ORDER BY ID DESC"); // QuestFactionReward.db2 - PrepareStatement(HotfixStatements.SEL_QUEST_FACTION_REWARD, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " + + PrepareStatement(HotfixStatements.SEL_QUEST_FACTION_REWARD, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " + "Difficulty7, Difficulty8, Difficulty9, Difficulty10 FROM quest_faction_reward ORDER BY ID DESC"); // QuestMoneyReward.db2 - PrepareStatement(HotfixStatements.SEL_QUEST_MONEY_REWARD, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " + + PrepareStatement(HotfixStatements.SEL_QUEST_MONEY_REWARD, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " + "Difficulty7, Difficulty8, Difficulty9, Difficulty10 FROM quest_money_reward ORDER BY ID DESC"); // QuestPackageItem.db2 @@ -760,19 +757,19 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_QUEST_V2, "SELECT ID, UniqueBitFlag FROM quest_v2 ORDER BY ID DESC"); // QuestXp.db2 - PrepareStatement(HotfixStatements.SEL_QUEST_XP, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, Difficulty7, " + + PrepareStatement(HotfixStatements.SEL_QUEST_XP, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, Difficulty7, " + "Difficulty8, Difficulty9, Difficulty10 FROM quest_xp ORDER BY ID DESC"); // RandPropPoints.db2 - PrepareStatement(HotfixStatements.SEL_RAND_PROP_POINTS, "SELECT ID, DamageReplaceStat, Epic1, Epic2, Epic3, Epic4, Epic5, Superior1, Superior2, Superior3, " + - "Superior4, Superior5, Good1, Good2, Good3, Good4, Good5 FROM rand_prop_points ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_RAND_PROP_POINTS, "SELECT ID, DamageReplaceStat, DamageSecondary, Epic1, Epic2, Epic3, Epic4, Epic5, Superior1, " + + "Superior2, Superior3, Superior4, Superior5, Good1, Good2, Good3, Good4, Good5 FROM rand_prop_points ORDER BY ID DESC"); // RewardPack.db2 - PrepareStatement(HotfixStatements.SEL_REWARD_PACK, "SELECT ID, CharTitleID, Money, ArtifactXPDifficulty, ArtifactXPMultiplier, ArtifactXPCategoryID, " + + PrepareStatement(HotfixStatements.SEL_REWARD_PACK, "SELECT ID, CharTitleID, Money, ArtifactXPDifficulty, ArtifactXPMultiplier, ArtifactXPCategoryID, " + "TreasurePickerID FROM reward_pack ORDER BY ID DESC"); // RewardPackXCurrencyType.db2 - PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE, "SELECT ID, CurrencyTypeID, Quantity, RewardPackID FROM reward_pack_x_currency_type" + + PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE, "SELECT ID, CurrencyTypeID, Quantity, RewardPackID FROM reward_pack_x_currency_type" + " ORDER BY ID DESC"); // RewardPackXItem.db2 @@ -782,7 +779,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_RULESET_ITEM_UPGRADE, "SELECT ID, ItemID, ItemUpgradeID FROM ruleset_item_upgrade ORDER BY ID DESC"); // ScalingStatDistribution.db2 - PrepareStatement(HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" + + PrepareStatement(HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" + " FROM scaling_stat_distribution ORDER BY ID DESC"); // Scenario.db2 @@ -790,7 +787,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_SCENARIO_LOCALE, "SELECT ID, Name_lang FROM scenario_locale WHERE locale = ?"); // ScenarioStep.db2 - PrepareStatement(HotfixStatements.SEL_SCENARIO_STEP, "SELECT ID, Description, Title, ScenarioID, Criteriatreeid, RewardQuestID, RelatedStep, Supersedes, " + + PrepareStatement(HotfixStatements.SEL_SCENARIO_STEP, "SELECT ID, Description, Title, ScenarioID, Criteriatreeid, RewardQuestID, RelatedStep, Supersedes, " + "OrderIndex, Flags, VisibilityPlayerConditionID, WidgetSetID FROM scenario_step ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SCENARIO_STEP_LOCALE, "SELECT ID, Description_lang, Title_lang FROM scenario_step_locale WHERE locale = ?"); @@ -807,76 +804,76 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text ORDER BY ID DESC"); // SkillLine.db2 - PrepareStatement(HotfixStatements.SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " + + PrepareStatement(HotfixStatements.SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " + "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID FROM skill_line ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_SKILL_LINE_LOCALE, "SELECT ID, DisplayName_lang, AlternateVerb_lang, Description_lang, HordeDisplayName_lang" + + PrepareStatement(HotfixStatements.SEL_SKILL_LINE_LOCALE, "SELECT ID, DisplayName_lang, AlternateVerb_lang, Description_lang, HordeDisplayName_lang" + " FROM skill_line_locale WHERE locale = ?"); // SkillLineAbility.db2 - PrepareStatement(HotfixStatements.SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, SupercedesSpell, " + - "AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, SkillupSkillLineID" + + PrepareStatement(HotfixStatements.SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, SupercedesSpell, " + + "AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, SkillupSkillLineID" + " FROM skill_line_ability ORDER BY ID DESC"); // SkillRaceClassInfo.db2 - PrepareStatement(HotfixStatements.SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID" + + PrepareStatement(HotfixStatements.SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID" + " FROM skill_race_class_info ORDER BY ID DESC"); // SoundKit.db2 - PrepareStatement(HotfixStatements.SEL_SOUND_KIT, "SELECT ID, SoundType, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, SoundKitAdvancedID, " + - "VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, DialogType, PitchAdjust, BusOverwriteID, MaxInstances" + + PrepareStatement(HotfixStatements.SEL_SOUND_KIT, "SELECT ID, SoundType, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, SoundKitAdvancedID, " + + "VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, DialogType, PitchAdjust, BusOverwriteID, MaxInstances" + " FROM sound_kit ORDER BY ID DESC"); // SpecializationSpells.db2 - PrepareStatement(HotfixStatements.SEL_SPECIALIZATION_SPELLS, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, DisplayOrder" + + PrepareStatement(HotfixStatements.SEL_SPECIALIZATION_SPELLS, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, DisplayOrder" + " FROM specialization_spells ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPECIALIZATION_SPELLS_LOCALE, "SELECT ID, Description_lang FROM specialization_spells_locale WHERE locale = ?"); // SpellAuraOptions.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_AURA_OPTIONS, "SELECT ID, DifficultyID, CumulativeAura, ProcCategoryRecovery, ProcChance, ProcCharges, " + + PrepareStatement(HotfixStatements.SEL_SPELL_AURA_OPTIONS, "SELECT ID, DifficultyID, CumulativeAura, ProcCategoryRecovery, ProcChance, ProcCharges, " + "SpellProcsPerMinuteID, ProcTypeMask1, ProcTypeMask2, SpellID FROM spell_aura_options ORDER BY ID DESC"); // SpellAuraRestrictions.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, " + - "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, SpellID" + + PrepareStatement(HotfixStatements.SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, " + + "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, SpellID" + " FROM spell_aura_restrictions ORDER BY ID DESC"); // SpellCastTimes.db2 PrepareStatement(HotfixStatements.SEL_SPELL_CAST_TIMES, "SELECT ID, Base, PerLevel, Minimum FROM spell_cast_times ORDER BY ID DESC"); // SpellCastingRequirements.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " + + PrepareStatement(HotfixStatements.SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " + "RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements ORDER BY ID DESC"); // SpellCategories.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORIES, "SELECT ID, DifficultyID, Category, DefenseType, DispelType, Mechanic, PreventionType, " + + PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORIES, "SELECT ID, DifficultyID, Category, DefenseType, DispelType, Mechanic, PreventionType, " + "StartRecoveryCategory, ChargeCategory, SpellID FROM spell_categories ORDER BY ID DESC"); // SpellCategory.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category" + + PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category" + " ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY_LOCALE, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?"); // SpellClassOptions.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, ModalNextSpell, SpellClassSet, SpellClassMask1, SpellClassMask2, " + + PrepareStatement(HotfixStatements.SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, ModalNextSpell, SpellClassSet, SpellClassMask1, SpellClassMask2, " + "SpellClassMask3, SpellClassMask4 FROM spell_class_options ORDER BY ID DESC"); // SpellCooldowns.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_COOLDOWNS, "SELECT ID, DifficultyID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, SpellID" + + PrepareStatement(HotfixStatements.SEL_SPELL_COOLDOWNS, "SELECT ID, DifficultyID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, SpellID" + " FROM spell_cooldowns ORDER BY ID DESC"); // SpellDuration.db2 PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration ORDER BY ID DESC"); // SpellEffect.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, EffectAura, " + - "EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " + - "EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " + - "ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " + - "EffectRadiusIndex2, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ImplicitTarget1, " + + PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, EffectAura, " + + "EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " + + "EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " + + "ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " + + "EffectRadiusIndex2, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ImplicitTarget1, " + "ImplicitTarget2, SpellID FROM spell_effect ORDER BY ID DESC"); // SpellEquippedItems.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_EQUIPPED_ITEMS, "SELECT ID, SpellID, EquippedItemClass, EquippedItemInvTypes, EquippedItemSubclass" + + PrepareStatement(HotfixStatements.SEL_SPELL_EQUIPPED_ITEMS, "SELECT ID, SpellID, EquippedItemClass, EquippedItemInvTypes, EquippedItemSubclass" + " FROM spell_equipped_items ORDER BY ID DESC"); // SpellFocusObject.db2 @@ -884,41 +881,41 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_SPELL_FOCUS_OBJECT_LOCALE, "SELECT ID, Name_lang FROM spell_focus_object_locale WHERE locale = ?"); // SpellInterrupts.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_INTERRUPTS, "SELECT ID, DifficultyID, InterruptFlags, AuraInterruptFlags1, AuraInterruptFlags2, " + + PrepareStatement(HotfixStatements.SEL_SPELL_INTERRUPTS, "SELECT ID, DifficultyID, InterruptFlags, AuraInterruptFlags1, AuraInterruptFlags2, " + "ChannelInterruptFlags1, ChannelInterruptFlags2, SpellID FROM spell_interrupts ORDER BY ID DESC"); // SpellItemEnchantment.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " + - "EffectScalingPoints2, EffectScalingPoints3, TransmogCost, IconFileDataID, TransmogPlayerConditionID, EffectPointsMin1, EffectPointsMin2, " + - "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " + + PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " + + "EffectScalingPoints2, EffectScalingPoints3, TransmogPlayerConditionID, TransmogCost, IconFileDataID, EffectPointsMin1, EffectPointsMin2, " + + "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " + "ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale WHERE locale = ?"); // SpellItemEnchantmentCondition.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LtOperandType1, LtOperandType2, LtOperandType3, LtOperandType4, " + - "LtOperandType5, LtOperand1, LtOperand2, LtOperand3, LtOperand4, LtOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, " + - "RtOperandType1, RtOperandType2, RtOperandType3, RtOperandType4, RtOperandType5, RtOperand1, RtOperand2, RtOperand3, RtOperand4, RtOperand5, " + + PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LtOperandType1, LtOperandType2, LtOperandType3, LtOperandType4, " + + "LtOperandType5, LtOperand1, LtOperand2, LtOperand3, LtOperand4, LtOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, " + + "RtOperandType1, RtOperandType2, RtOperandType3, RtOperandType4, RtOperandType5, RtOperand1, RtOperand2, RtOperand3, RtOperand4, RtOperand5, " + "Logic1, Logic2, Logic3, Logic4, Logic5 FROM spell_item_enchantment_condition ORDER BY ID DESC"); // SpellLearnSpell.db2 PrepareStatement(HotfixStatements.SEL_SPELL_LEARN_SPELL, "SELECT ID, SpellID, LearnSpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC"); // SpellLevels.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, BaseLevel, MaxLevel, SpellLevel, MaxPassiveAuraLevel, SpellID" + + PrepareStatement(HotfixStatements.SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, BaseLevel, MaxLevel, SpellLevel, MaxPassiveAuraLevel, SpellID" + " FROM spell_levels ORDER BY ID DESC"); // SpellMisc.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " + - "MinDuration, SpellIconFileDataID, ActiveIconFileDataID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, " + - "Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID FROM spell_misc" + - " ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " + + "MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, " + + "Attributes6, Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID" + + " FROM spell_misc ORDER BY ID DESC"); // SpellName.db2 PrepareStatement(HotfixStatements.SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPELL_NAME_LOCALE, "SELECT ID, Name_lang FROM spell_name_locale WHERE locale = ?"); // SpellPower.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_POWER, "SELECT ID, OrderIndex, ManaCost, ManaCostPerLevel, ManaPerSecond, PowerDisplayID, AltPowerBarID, " + + PrepareStatement(HotfixStatements.SEL_SPELL_POWER, "SELECT ID, OrderIndex, ManaCost, ManaCostPerLevel, ManaPerSecond, PowerDisplayID, AltPowerBarID, " + "PowerCostPct, PowerCostMaxPct, PowerPctPerSecond, PowerType, RequiredAuraSpellID, OptionalCost, SpellID FROM spell_power ORDER BY ID DESC"); // SpellPowerDifficulty.db2 @@ -928,72 +925,72 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC"); // SpellProcsPerMinuteMod.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" + + PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" + " ORDER BY ID DESC"); // SpellRadius.db2 PrepareStatement(HotfixStatements.SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius ORDER BY ID DESC"); // SpellRange.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_RANGE, "SELECT ID, DisplayName, DisplayNameShort, Flags, RangeMin1, RangeMin2, RangeMax1, RangeMax2" + + PrepareStatement(HotfixStatements.SEL_SPELL_RANGE, "SELECT ID, DisplayName, DisplayNameShort, Flags, RangeMin1, RangeMin2, RangeMax1, RangeMax2" + " FROM spell_range ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPELL_RANGE_LOCALE, "SELECT ID, DisplayName_lang, DisplayNameShort_lang FROM spell_range_locale WHERE locale = ?"); // SpellReagents.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " + - "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents" + + PrepareStatement(HotfixStatements.SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " + + "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents" + " ORDER BY ID DESC"); // SpellScaling.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling" + + PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling" + " ORDER BY ID DESC"); // SpellShapeshift.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " + + PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " + "ShapeshiftMask2 FROM spell_shapeshift ORDER BY ID DESC"); // SpellShapeshiftForm.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureType, Flags, AttackIconFileID, BonusActionBar, CombatRoundTime, " + - "DamageVariance, MountTypeID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, " + + PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureType, Flags, AttackIconFileID, BonusActionBar, CombatRoundTime, " + + "DamageVariance, MountTypeID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, " + "PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM_LOCALE, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE locale = ?"); // SpellTargetRestrictions.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, DifficultyID, ConeDegrees, MaxTargets, MaxTargetLevel, TargetCreatureType, " + + PrepareStatement(HotfixStatements.SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, DifficultyID, ConeDegrees, MaxTargets, MaxTargetLevel, TargetCreatureType, " + "Targets, Width, SpellID FROM spell_target_restrictions ORDER BY ID DESC"); // SpellTotems.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_TOTEMS, "SELECT ID, SpellID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2" + + PrepareStatement(HotfixStatements.SEL_SPELL_TOTEMS, "SELECT ID, SpellID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2" + " FROM spell_totems ORDER BY ID DESC"); // SpellXSpellVisual.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " + - "ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" + + PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " + + "ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" + " FROM spell_x_spell_visual ORDER BY ID DESC"); // SummonProperties.db2 PrepareStatement(HotfixStatements.SEL_SUMMON_PROPERTIES, "SELECT ID, Control, Faction, Title, Slot, Flags FROM summon_properties ORDER BY ID DESC"); // TactKey.db2 - PrepareStatement(HotfixStatements.SEL_TACT_KEY, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " + + PrepareStatement(HotfixStatements.SEL_TACT_KEY, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " + "Key16 FROM tact_key ORDER BY ID DESC"); // Talent.db2 - PrepareStatement(HotfixStatements.SEL_TALENT, "SELECT ID, Description, TierID, Flags, ColumnIndex, ClassID, SpecID, SpellID, OverridesSpellID, " + + PrepareStatement(HotfixStatements.SEL_TALENT, "SELECT ID, Description, TierID, Flags, ColumnIndex, ClassID, SpecID, SpellID, OverridesSpellID, " + "CategoryMask1, CategoryMask2 FROM talent ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_TALENT_LOCALE, "SELECT ID, Description_lang FROM talent_locale WHERE locale = ?"); // TaxiNodes.db2 - PrepareStatement(HotfixStatements.SEL_TAXI_NODES, "SELECT Name, PosX, PosY, PosZ, MapOffsetX, MapOffsetY, FlightMapOffsetX, FlightMapOffsetY, ID, " + - "ContinentID, ConditionID, CharacterBitNumber, Flags, UiTextureKitID, Facing, SpecialIconConditionID, VisibilityConditionID, " + - "MountCreatureID1, MountCreatureID2 FROM taxi_nodes ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_TAXI_NODES, "SELECT Name, PosX, PosY, PosZ, MapOffsetX, MapOffsetY, FlightMapOffsetX, FlightMapOffsetY, ID, " + + "ContinentID, ConditionID, CharacterBitNumber, Flags, UiTextureKitID, MinimapAtlasMemberID, Facing, SpecialIconConditionID, " + + "VisibilityConditionID, MountCreatureID1, MountCreatureID2 FROM taxi_nodes ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_TAXI_NODES_LOCALE, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?"); // TaxiPath.db2 PrepareStatement(HotfixStatements.SEL_TAXI_PATH, "SELECT ID, FromTaxiNode, ToTaxiNode, Cost FROM taxi_path ORDER BY ID DESC"); // TaxiPathNode.db2 - PrepareStatement(HotfixStatements.SEL_TAXI_PATH_NODE, "SELECT LocX, LocY, LocZ, ID, PathID, NodeIndex, ContinentID, Flags, Delay, ArrivalEventID, " + + PrepareStatement(HotfixStatements.SEL_TAXI_PATH_NODE, "SELECT LocX, LocY, LocZ, ID, PathID, NodeIndex, ContinentID, Flags, Delay, ArrivalEventID, " + "DepartureEventID FROM taxi_path_node ORDER BY ID DESC"); // TotemCategory.db2 @@ -1008,8 +1005,8 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday ORDER BY ID DESC"); // TransmogSet.db2 - PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " + - "ParentTransmogSetID, ExpansionID, UiOrder FROM transmog_set ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " + + "ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder FROM transmog_set ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_LOCALE, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?"); // TransmogSetGroup.db2 @@ -1020,64 +1017,64 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_ITEM, "SELECT ID, TransmogSetID, ItemModifiedAppearanceID, Flags FROM transmog_set_item ORDER BY ID DESC"); // TransportAnimation.db2 - PrepareStatement(HotfixStatements.SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation" + + PrepareStatement(HotfixStatements.SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation" + " ORDER BY ID DESC"); // TransportRotation.db2 - PrepareStatement(HotfixStatements.SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation" + + PrepareStatement(HotfixStatements.SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation" + " ORDER BY ID DESC"); // UiMap.db2 - PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " + + PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " + "BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID FROM ui_map ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_UI_MAP_LOCALE, "SELECT ID, Name_lang FROM ui_map_locale WHERE locale = ?"); // UiMapAssignment.db2 - PrepareStatement(HotfixStatements.SEL_UI_MAP_ASSIGNMENT, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, Region1X, Region1Y, Region1Z, Region2X, Region2Y, " + + PrepareStatement(HotfixStatements.SEL_UI_MAP_ASSIGNMENT, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, Region1X, Region1Y, Region1Z, Region2X, Region2Y, " + "Region2Z, ID, UiMapID, OrderIndex, MapID, AreaID, WmoDoodadPlacementID, WmoGroupID FROM ui_map_assignment ORDER BY ID DESC"); // UiMapLink.db2 - PrepareStatement(HotfixStatements.SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID FROM ui_map_link" + - " ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, " + + "OverrideHighlightFileDataID, OverrideHighlightAtlasID FROM ui_map_link ORDER BY ID DESC"); // UiMapXMapArt.db2 PrepareStatement(HotfixStatements.SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art ORDER BY ID DESC"); // UnitPowerBar.db2 - PrepareStatement(HotfixStatements.SEL_UNIT_POWER_BAR, "SELECT ID, Name, Cost, OutOfError, ToolTip, MinPower, MaxPower, StartPower, CenterPower, " + - "RegenerationPeace, RegenerationCombat, BarType, Flags, StartInset, EndInset, FileDataID1, FileDataID2, FileDataID3, FileDataID4, " + + PrepareStatement(HotfixStatements.SEL_UNIT_POWER_BAR, "SELECT ID, Name, Cost, OutOfError, ToolTip, MinPower, MaxPower, StartPower, CenterPower, " + + "RegenerationPeace, RegenerationCombat, BarType, Flags, StartInset, EndInset, FileDataID1, FileDataID2, FileDataID3, FileDataID4, " + "FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6 FROM unit_power_bar ORDER BY ID DESC"); - PrepareStatement(HotfixStatements.SEL_UNIT_POWER_BAR_LOCALE, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" + + PrepareStatement(HotfixStatements.SEL_UNIT_POWER_BAR_LOCALE, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" + " WHERE locale = ?"); // Vehicle.db2 - PrepareStatement(HotfixStatements.SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " + - "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, UiLocomotionType, " + - "VehicleUIIndicatorID, MissileTargetingID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, PowerDisplayID1, " + + PrepareStatement(HotfixStatements.SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " + + "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, UiLocomotionType, " + + "VehicleUIIndicatorID, MissileTargetingID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, PowerDisplayID1, " + "PowerDisplayID2, PowerDisplayID3 FROM vehicle ORDER BY ID DESC"); // VehicleSeat.db2 - PrepareStatement(HotfixStatements.SEL_VEHICLE_SEAT, "SELECT ID, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, CameraOffsetX, CameraOffsetY, " + - "CameraOffsetZ, Flags, FlagsB, FlagsC, AttachmentID, EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, " + - "EnterMinArcHeight, EnterMaxArcHeight, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " + - "ExitPreDelay, ExitSpeed, ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, ExitAnimStart, ExitAnimLoop, " + - "ExitAnimEnd, VehicleEnterAnim, VehicleEnterAnimBone, VehicleExitAnim, VehicleExitAnimBone, VehicleRideAnimLoop, VehicleRideAnimLoopBone, " + - "PassengerAttachmentID, PassengerYaw, PassengerPitch, PassengerRoll, VehicleEnterAnimDelay, VehicleExitAnimDelay, VehicleAbilityDisplay, " + - "EnterUISoundID, ExitUISoundID, UiSkinFileDataID, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " + - "CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, CameraSeatZoomMax, EnterAnimKitID, RideAnimKitID, " + + PrepareStatement(HotfixStatements.SEL_VEHICLE_SEAT, "SELECT ID, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, CameraOffsetX, CameraOffsetY, " + + "CameraOffsetZ, Flags, FlagsB, FlagsC, AttachmentID, EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, " + + "EnterMinArcHeight, EnterMaxArcHeight, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " + + "ExitPreDelay, ExitSpeed, ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, ExitAnimStart, ExitAnimLoop, " + + "ExitAnimEnd, VehicleEnterAnim, VehicleEnterAnimBone, VehicleExitAnim, VehicleExitAnimBone, VehicleRideAnimLoop, VehicleRideAnimLoopBone, " + + "PassengerAttachmentID, PassengerYaw, PassengerPitch, PassengerRoll, VehicleEnterAnimDelay, VehicleExitAnimDelay, VehicleAbilityDisplay, " + + "EnterUISoundID, ExitUISoundID, UiSkinFileDataID, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " + + "CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, CameraSeatZoomMax, EnterAnimKitID, RideAnimKitID, " + "ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID FROM vehicle_seat ORDER BY ID DESC"); // WmoAreaTable.db2 - PrepareStatement(HotfixStatements.SEL_WMO_AREA_TABLE, "SELECT AreaName, ID, WmoID, NameSetID, WmoGroupID, SoundProviderPref, SoundProviderPrefUnderwater, " + + PrepareStatement(HotfixStatements.SEL_WMO_AREA_TABLE, "SELECT AreaName, ID, WmoID, NameSetID, WmoGroupID, SoundProviderPref, SoundProviderPrefUnderwater, " + "AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, IntroSound, UwIntroSound, AreaTableID, Flags FROM wmo_area_table ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_WMO_AREA_TABLE_LOCALE, "SELECT ID, AreaName_lang FROM wmo_area_table_locale WHERE locale = ?"); // WorldEffect.db2 - PrepareStatement(HotfixStatements.SEL_WORLD_EFFECT, "SELECT ID, QuestFeedbackEffectID, WhenToDisplay, TargetType, TargetAsset, PlayerConditionID, " + + PrepareStatement(HotfixStatements.SEL_WORLD_EFFECT, "SELECT ID, QuestFeedbackEffectID, WhenToDisplay, TargetType, TargetAsset, PlayerConditionID, " + "CombatConditionID FROM world_effect ORDER BY ID DESC"); // WorldMapOverlay.db2 - PrepareStatement(HotfixStatements.SEL_WORLD_MAP_OVERLAY, "SELECT ID, UiMapArtID, TextureWidth, TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectBottom, " + + PrepareStatement(HotfixStatements.SEL_WORLD_MAP_OVERLAY, "SELECT ID, UiMapArtID, TextureWidth, TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectBottom, " + "HitRectLeft, HitRectRight, PlayerConditionID, Flags, AreaID1, AreaID2, AreaID3, AreaID4 FROM world_map_overlay ORDER BY ID DESC"); // WorldSafeLocs.db2 @@ -1189,6 +1186,8 @@ namespace Framework.Database SEL_CONTENT_TUNING, + SEL_CONTENT_TUNING_X_EXPECTED, + SEL_CONVERSATION_LINE, SEL_CREATURE_DISPLAY_INFO, @@ -1359,12 +1358,6 @@ namespace Framework.Database SEL_ITEM_PRICE_BASE, - SEL_ITEM_RANDOM_PROPERTIES, - SEL_ITEM_RANDOM_PROPERTIES_LOCALE, - - SEL_ITEM_RANDOM_SUFFIX, - SEL_ITEM_RANDOM_SUFFIX_LOCALE, - SEL_ITEM_SEARCH_NAME, SEL_ITEM_SEARCH_NAME_LOCALE, diff --git a/Source/Framework/Database/Databases/LoginDatabase.cs b/Source/Framework/Database/Databases/LoginDatabase.cs index 4ff821ec3..b78713979 100644 --- a/Source/Framework/Database/Databases/LoginDatabase.cs +++ b/Source/Framework/Database/Databases/LoginDatabase.cs @@ -27,8 +27,7 @@ namespace Framework.Database PrepareStatement(LoginStatements.SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE flag <> 3 ORDER BY name"); PrepareStatement(LoginStatements.DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()"); PrepareStatement(LoginStatements.UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()"); - PrepareStatement(LoginStatements.SEL_IP_INFO, "(SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?) " + - "UNION (SELECT NULL AS banned, country FROM ip2nation WHERE INET_NTOA(ip) = ?)"); + PrepareStatement(LoginStatements.SEL_IP_INFO, "SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?"); PrepareStatement(LoginStatements.INS_IP_AUTO_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Cypher Auth', 'Failed login autoban')"); PrepareStatement(LoginStatements.SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate"); @@ -38,7 +37,6 @@ namespace Framework.Database PrepareStatement(LoginStatements.DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?"); PrepareStatement(LoginStatements.UPD_ACCOUNT_INFO_CONTINUED_SESSION, "UPDATE account SET sessionkey = ? WHERE id = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?"); - PrepareStatement(LoginStatements.SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1"); PrepareStatement(LoginStatements.SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.os, ba.id, aa.gmLevel, " + @@ -95,7 +93,6 @@ namespace Framework.Database PrepareStatement(LoginStatements.SEL_LAST_IP, "SELECT last_ip FROM account WHERE id = ?"); PrepareStatement(LoginStatements.SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?"); PrepareStatement(LoginStatements.DEL_ACCOUNT, "DELETE FROM account WHERE id = ?"); - PrepareStatement(LoginStatements.SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1"); PrepareStatement(LoginStatements.SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1"); PrepareStatement(LoginStatements.GET_EMAIL_BY_ID, "SELECT email FROM account WHERE id = ?"); // 0: uint32, 1: uint32, 2: uint8, 3: uint32, 4: string // Complete name: "Login_Insert_AccountLoginDeLete_IP_Logging" @@ -191,7 +188,6 @@ namespace Framework.Database UPD_ACCOUNT_INFO_CONTINUED_SESSION, SEL_ACCOUNT_INFO_CONTINUED_SESSION, UPD_VS, - SEL_LOGON_COUNTRY, SEL_ACCOUNT_ID_BY_NAME, SEL_ACCOUNT_LIST_BY_NAME, SEL_ACCOUNT_INFO_BY_NAME, diff --git a/Source/Framework/Database/MySqlBase.cs b/Source/Framework/Database/MySqlBase.cs index 5bd77db1e..b5d4b371c 100644 --- a/Source/Framework/Database/MySqlBase.cs +++ b/Source/Framework/Database/MySqlBase.cs @@ -220,8 +220,8 @@ namespace Framework.Database { try { - string query = File.ReadAllText(path); - if (query.Length > 1048576) //Default size limit of querys + string query = File.ReadAllText(path); + if (Encoding.UTF8.GetByteCount(query) > 1048576) //Default size limit of querys Apply("SET GLOBAL max_allowed_packet=1073741824;"); using (var connection = _connectionInfo.GetConnection()) @@ -229,6 +229,7 @@ namespace Framework.Database connection.Open(); using (MySqlCommand cmd = connection.CreateCommand()) { + cmd.CommandTimeout = 120; cmd.CommandText = query; cmd.ExecuteNonQuery(); return true; diff --git a/Source/Framework/Framework.csproj b/Source/Framework/Framework.csproj index e665da40e..91d9cc2ef 100644 --- a/Source/Framework/Framework.csproj +++ b/Source/Framework/Framework.csproj @@ -12,7 +12,8 @@ - + + diff --git a/Source/Framework/IO/ByteBuffer.cs b/Source/Framework/IO/ByteBuffer.cs index a7b333d14..cc8fbb6c2 100644 --- a/Source/Framework/IO/ByteBuffer.cs +++ b/Source/Framework/IO/ByteBuffer.cs @@ -162,30 +162,30 @@ namespace Framework.IO //BitPacking public byte ReadBit() { - if (BitPosition == 8) + if (_bitPosition == 8) { BitValue = ReadUInt8(); - BitPosition = 0; + _bitPosition = 0; } int returnValue = BitValue; BitValue = (byte)(2 * returnValue); - ++BitPosition; + ++_bitPosition; return (byte)(returnValue >> 7); } public bool HasBit() { - if (BitPosition == 8) + if (_bitPosition == 8) { BitValue = ReadUInt8(); - BitPosition = 0; + _bitPosition = 0; } int returnValue = BitValue; BitValue = (byte)(2 * returnValue); - ++BitPosition; + ++_bitPosition; return Convert.ToBoolean(returnValue >> 7); } @@ -203,64 +203,64 @@ namespace Framework.IO #endregion #region Write Methods - public void WriteInt8(T data) + public void WriteInt8(sbyte data) { FlushBits(); - writeStream.Write(Convert.ToSByte(data)); + writeStream.Write(data); } - public void WriteInt16(T data) + public void WriteInt16(short data) { FlushBits(); - writeStream.Write(Convert.ToInt16(data)); + writeStream.Write(data); } - public void WriteInt32(T data) + public void WriteInt32(int data) { FlushBits(); - writeStream.Write(Convert.ToInt32(data)); + writeStream.Write(data); } - public void WriteInt64(T data) + public void WriteInt64(long data) { FlushBits(); - writeStream.Write(Convert.ToInt64(data)); + writeStream.Write(data); } - public void WriteUInt8(T data) + public void WriteUInt8(byte data) { FlushBits(); - writeStream.Write(Convert.ToByte(data)); + writeStream.Write(data); } - public void WriteUInt16(T data) + public void WriteUInt16(ushort data) { FlushBits(); - writeStream.Write(Convert.ToUInt16(data)); + writeStream.Write(data); } - public void WriteUInt32(T data) + public void WriteUInt32(uint data) { FlushBits(); - writeStream.Write(Convert.ToUInt32(data)); + writeStream.Write(data); } - public void WriteUInt64(T data) + public void WriteUInt64(ulong data) { FlushBits(); - writeStream.Write(Convert.ToUInt64(data)); + writeStream.Write(data); } - public void WriteFloat(T data) + public void WriteFloat(float data) { FlushBits(); - writeStream.Write(Convert.ToSingle(data)); + writeStream.Write(data); } - public void WriteDouble(T data) + public void WriteDouble(double data) { FlushBits(); - writeStream.Write(Convert.ToDouble(data)); + writeStream.Write(data); } /// @@ -329,16 +329,16 @@ namespace Framework.IO public bool WriteBit(object bit) { - --BitPosition; + --_bitPosition; if (Convert.ToBoolean(bit)) - BitValue |= (byte)(1 << BitPosition); + BitValue |= (byte)(1 << _bitPosition); - if (BitPosition == 0) + if (_bitPosition == 0) { writeStream.Write(BitValue); - BitPosition = 8; + _bitPosition = 8; BitValue = 0; } return Convert.ToBoolean(bit); @@ -363,22 +363,27 @@ namespace Framework.IO } #endregion + public bool HasUnfinishedBitPack() + { + return _bitPosition != 8; + } + public void FlushBits() { - if (BitPosition == 8) + if (_bitPosition == 8) return; writeStream.Write(BitValue); BitValue = 0; - BitPosition = 8; + _bitPosition = 8; } public void ResetBitPos() { - if (BitPosition > 7) + if (_bitPosition > 7) return; - BitPosition = 8; + _bitPosition = 8; BitValue = 0; } @@ -412,12 +417,12 @@ namespace Framework.IO public void Clear() { - BitPosition = 8; + _bitPosition = 8; BitValue = 0; writeStream = new BinaryWriter(new MemoryStream()); } - byte BitPosition = 8; + byte _bitPosition = 8; byte BitValue; BinaryWriter writeStream; BinaryReader readStream; diff --git a/Source/Framework/Util/CollectionExtensions.cs b/Source/Framework/Util/CollectionExtensions.cs index 2d48ca870..efd5b5d3f 100644 --- a/Source/Framework/Util/CollectionExtensions.cs +++ b/Source/Framework/Util/CollectionExtensions.cs @@ -103,6 +103,11 @@ namespace System.Collections.Generic int cur = list.Count; if (size < cur) list.RemoveRange((int)size, cur - (int)size); + else + { + for (var i = list.Count; i < size; ++i) + list.Add(default(T)); + } } public static void RandomResize(this IList list, uint size) diff --git a/Source/Game/AI/AISelector.cs b/Source/Game/AI/AISelector.cs index 0c60ba577..addea7873 100644 --- a/Source/Game/AI/AISelector.cs +++ b/Source/Game/AI/AISelector.cs @@ -70,7 +70,7 @@ namespace Game.AI return new VehicleAI(creature); else if (creature.HasUnitTypeMask(UnitTypeMask.ControlableGuardian) && ((Guardian)creature).GetOwner().IsTypeId(TypeId.Player)) return new PetAI(creature); - else if (creature.HasFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick)) + else if (creature.HasNpcFlag(NPCFlags.SpellClick)) return new NullCreatureAI(creature); else if (creature.IsGuard()) return new GuardAI(creature); diff --git a/Source/Game/AI/CoreAI/CreatureAI.cs b/Source/Game/AI/CoreAI/CreatureAI.cs index 4d8276557..7700df73c 100644 --- a/Source/Game/AI/CoreAI/CreatureAI.cs +++ b/Source/Game/AI/CoreAI/CreatureAI.cs @@ -333,9 +333,9 @@ namespace Game.AI if (point) { point.SetObjectScale(SharedConst.BoundaryVisualizeCreatureScale); - point.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.Stunned | UnitFlags.ImmuneToNpc); + point.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.Stunned | UnitFlags.ImmuneToNpc); if (!hasOutOfBoundsNeighbor) - point.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + point.AddUnitFlag(UnitFlags.NotSelectable); } Q.Remove(front); } diff --git a/Source/Game/AI/CoreAI/PassiveAI.cs b/Source/Game/AI/CoreAI/PassiveAI.cs index 69cc205e8..6247fc856 100644 --- a/Source/Game/AI/CoreAI/PassiveAI.cs +++ b/Source/Game/AI/CoreAI/PassiveAI.cs @@ -65,14 +65,14 @@ namespace Game.AI public override void JustDied(Unit unit) { // We died while possessed, disable our loot - me.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); + me.RemoveDynamicFlag(UnitDynFlags.Lootable); } public override void KilledUnit(Unit victim) { // We killed a creature, disable victim's loot if (victim.IsTypeId(TypeId.Unit)) - victim.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); + me.RemoveDynamicFlag(UnitDynFlags.Lootable); } public override void OnCharmed(bool apply) diff --git a/Source/Game/AI/PlayerAI/PlayerAI.cs b/Source/Game/AI/PlayerAI/PlayerAI.cs index 41384f5f9..5d8cafcce 100644 --- a/Source/Game/AI/PlayerAI/PlayerAI.cs +++ b/Source/Game/AI/PlayerAI/PlayerAI.cs @@ -392,7 +392,7 @@ namespace Game.AI public PlayerAI(Player player) : base(player) { me = player; - _selfSpec = player.GetUInt32Value(PlayerFields.CurrentSpecId); + _selfSpec = player.GetPrimarySpecialization(); _isSelfHealer = IsPlayerHealer(player); _isSelfRangedAttacker = IsPlayerRangedAttacker(player); } @@ -414,15 +414,15 @@ namespace Game.AI default: return false; case Class.Paladin: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PaladinHoly; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.PaladinHoly; case Class.Priest: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PriestDiscipline || who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PriestHoly; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.PriestDiscipline || who.GetPrimarySpecialization() == (uint)TalentSpecialization.PriestHoly; case Class.Shaman: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.ShamanRestoration; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.ShamanRestoration; case Class.Monk: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.MonkMistweaver; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.MonkMistweaver; case Class.Druid: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.DruidRestoration; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.DruidRestoration; } } bool IsPlayerRangedAttacker(Player who) @@ -454,11 +454,11 @@ namespace Game.AI return false; } case Class.Priest: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PriestShadow; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.PriestShadow; case Class.Shaman: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.ShamanElemental; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.ShamanElemental; case Class.Druid: - return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.DruidBalance; + return who.GetPrimarySpecialization() == (uint)TalentSpecialization.DruidBalance; } } @@ -659,7 +659,7 @@ namespace Game.AI return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who); } public bool IsRangedAttacker(Player who = null) { return (!who || who == me) ? _isSelfRangedAttacker : IsPlayerRangedAttacker(who); } - uint GetSpec(Player who = null) { return (!who || who == me) ? _selfSpec : who.GetUInt32Value(PlayerFields.CurrentSpecId); } + uint GetSpec(Player who = null) { return (!who || who == me) ? _selfSpec : who.GetPrimarySpecialization(); } void SetIsRangedAttacker(bool state) { _isSelfRangedAttacker = state; } // this allows overriding of the default ranged attacker detection public virtual Unit SelectAttackTarget() { return me.GetCharmer() ? me.GetCharmer().GetVictim() : null; } diff --git a/Source/Game/AI/ScriptedAI/ScriptedAI.cs b/Source/Game/AI/ScriptedAI/ScriptedAI.cs index 8bed3deb9..c70e09911 100644 --- a/Source/Game/AI/ScriptedAI/ScriptedAI.cs +++ b/Source/Game/AI/ScriptedAI/ScriptedAI.cs @@ -125,7 +125,7 @@ namespace Game.AI return null; //Silenced so we can't cast - if (me.HasFlag(UnitFields.Flags, UnitFlags.Silenced)) + if (me.HasUnitFlag(UnitFlags.Silenced)) return null; //Using the extended script system we first create a list of viable spells diff --git a/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs b/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs index 06d9c94f7..868c625b2 100644 --- a/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs +++ b/Source/Game/AI/ScriptedAI/ScriptedEscortAI.cs @@ -133,7 +133,7 @@ namespace Game.AI //add a small delay before going to first waypoint, normal in near all cases m_uiWPWaitTimer = 1000; - if (me.getFaction() != me.GetCreatureTemplate().Faction) + if (me.GetFaction() != me.GetCreatureTemplate().Faction) me.RestoreFaction(); Reset(); @@ -162,7 +162,7 @@ namespace Game.AI { me.GetMotionMaster().MoveTargetedHome(); if (HasImmuneToNPCFlags) - me.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc); + me.AddUnitFlag(UnitFlags.ImmuneToNpc); Reset(); } } @@ -463,11 +463,12 @@ namespace Game.AI } //disable npcflags - me.SetUInt64Value(UnitFields.NpcFlags, (ulong)NPCFlags.None); - if (me.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc)) + me.SetNpcFlags(NPCFlags.None); + me.SetNpcFlags2(NPCFlags2.None); + if (me.HasUnitFlag(UnitFlags.ImmuneToNpc)) { HasImmuneToNPCFlags = true; - me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc); + me.RemoveUnitFlag(UnitFlags.ImmuneToNpc); } Log.outDebug(LogFilter.Scripts, $"EscortAI started. ActiveAttacker = {m_bIsActiveAttacker}, Run = {m_bIsRunning}, PlayerGUID = {m_uiPlayerGUID.ToString()}"); diff --git a/Source/Game/AI/ScriptedAI/ScriptedFollowerAI.cs b/Source/Game/AI/ScriptedAI/ScriptedFollowerAI.cs index 8b06c4548..6b4c9f6db 100644 --- a/Source/Game/AI/ScriptedAI/ScriptedFollowerAI.cs +++ b/Source/Game/AI/ScriptedAI/ScriptedFollowerAI.cs @@ -168,7 +168,7 @@ namespace Game.AI if (!IsCombatMovementAllowed()) SetCombatMovement(true); - if (me.getFaction() != me.GetCreatureTemplate().Faction) + if (me.GetFaction() != me.GetCreatureTemplate().Faction) me.SetFaction(me.GetCreatureTemplate().Faction); Reset(); @@ -318,7 +318,8 @@ namespace Game.AI Log.outDebug(LogFilter.Scripts, "FollowerAI start with WAYPOINT_MOTION_TYPE, set to MoveIdle."); } - me.SetUInt64Value(UnitFields.NpcFlags, (uint)NPCFlags.None); + me.SetNpcFlags(NPCFlags.None); + me.SetNpcFlags2(NPCFlags2.None); AddFollowState(eFollowState.Inprogress); diff --git a/Source/Game/AI/SmartScripts/SmartAI.cs b/Source/Game/AI/SmartScripts/SmartAI.cs index 401a66c80..ef61503da 100644 --- a/Source/Game/AI/SmartScripts/SmartAI.cs +++ b/Source/Game/AI/SmartScripts/SmartAI.cs @@ -131,8 +131,8 @@ namespace Game.AI if (invoker && invoker.GetTypeId() == TypeId.Player) { - mEscortNPCFlags = me.GetUInt32Value(UnitFields.NpcFlags); - me.SetFlag(UnitFields.NpcFlags, 0); + mEscortNPCFlags = me.m_unitData.NpcFlags[0]; + me.SetNpcFlags(NPCFlags.None); } GetScript().ProcessEventsFor(SmartEvents.WaypointStart, null, mCurrentWPID, GetScript().GetPathId()); @@ -227,7 +227,7 @@ namespace Game.AI if (mEscortNPCFlags != 0) { - me.SetFlag(UnitFields.NpcFlags, mEscortNPCFlags); + me.SetNpcFlags((NPCFlags)mEscortNPCFlags); mEscortNPCFlags = 0; } @@ -591,7 +591,7 @@ namespace Game.AI mDespawnState = 0; mEscortState = SmartEscortState.None; me.SetVisible(true); - if (me.getFaction() != me.GetCreatureTemplate().Faction) + if (me.GetFaction() != me.GetCreatureTemplate().Faction) me.RestoreFaction(); mJustReset = true; JustReachedHome(); @@ -646,7 +646,7 @@ namespace Game.AI public override void AttackStart(Unit who) { // dont allow charmed npcs to act on their own - if (me.HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled)) + if (me.HasUnitFlag(UnitFlags.PlayerControlled)) { if (who && mCanAutoAttack) me.Attack(who, true); diff --git a/Source/Game/AI/SmartScripts/SmartAIManager.cs b/Source/Game/AI/SmartScripts/SmartAIManager.cs index 48162e25b..6d5e528b6 100644 --- a/Source/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Source/Game/AI/SmartScripts/SmartAIManager.cs @@ -1715,7 +1715,7 @@ namespace Game.AI [FieldOffset(16)] public Raw raw; - [FieldOffset(32)] + [FieldOffset(40)] public string param_string; #region Structs diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 31512a46e..2f74dbd21 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -221,7 +221,7 @@ namespace Game.AI CreatureTemplate ci = Global.ObjectMgr.GetCreatureTemplate(obj.ToCreature().GetEntry()); if (ci != null) { - if (obj.ToCreature().getFaction() != ci.Faction) + if (obj.ToCreature().GetFaction() != ci.Faction) { obj.ToCreature().SetFaction(ci.Faction); Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_FACTION: Creature entry {0}, GuidLow {1} set faction to {2}", @@ -647,7 +647,7 @@ namespace Game.AI { if (IsUnit(obj)) { - obj.ToUnit().SetUInt32Value(UnitFields.NpcEmotestate, e.Action.emote.emoteId); + obj.ToUnit().SetEmoteState((Emote)e.Action.emote.emoteId); Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_EMOTE_STATE. Unit {0} set emotestate to {1}", obj.GetGUID().ToString(), e.Action.emote.emoteId); } @@ -668,13 +668,13 @@ namespace Game.AI { if (e.Action.unitFlag.type == 0) { - obj.ToUnit().SetFlag(UnitFields.Flags, e.Action.unitFlag.flag); + obj.ToUnit().AddUnitFlag((UnitFlags)e.Action.unitFlag.flag); Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_UNIT_FLAG. Unit {0} added flag {1} to UNIT_FIELD_FLAGS", obj.GetGUID().ToString(), e.Action.unitFlag.flag); } else { - obj.ToUnit().SetFlag(UnitFields.Flags2, e.Action.unitFlag.flag); + obj.ToUnit().AddUnitFlag2((UnitFlags2)e.Action.unitFlag.flag); Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_UNIT_FLAG. Unit {0} added flag {1} to UNIT_FIELD_FLAGS_2", obj.GetGUID().ToString(), e.Action.unitFlag.flag); } @@ -696,13 +696,13 @@ namespace Game.AI { if (e.Action.unitFlag.type == 0) { - obj.ToUnit().RemoveFlag(UnitFields.Flags2, e.Action.unitFlag.flag); + obj.ToUnit().RemoveUnitFlag((UnitFlags)e.Action.unitFlag.flag); Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_REMOVE_UNIT_FLAG. Unit {0} removed flag {1} to UNIT_FIELD_FLAGS", obj.GetGUID().ToString(), e.Action.unitFlag.flag); } else { - obj.ToUnit().RemoveFlag(UnitFields.Flags2, e.Action.unitFlag.flag); + obj.ToUnit().RemoveUnitFlag2((UnitFlags2)e.Action.unitFlag.flag); Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_REMOVE_UNIT_FLAG. Unit {0} removed flag {1} to UNIT_FIELD_FLAGS_2", obj.GetGUID().ToString(), e.Action.unitFlag.flag); } @@ -1756,7 +1756,7 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().SetUInt64Value(UnitFields.NpcFlags, e.Action.unitFlag.flag); + obj.ToUnit().SetNpcFlags((NPCFlags)e.Action.unitFlag.flag); break; } case SmartActions.AddNpcFlag: @@ -1767,7 +1767,7 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().SetFlag64(UnitFields.NpcFlags, e.Action.unitFlag.flag); + obj.ToUnit().AddNpcFlag((NPCFlags)e.Action.unitFlag.flag); break; } case SmartActions.RemoveNpcFlag: @@ -1778,7 +1778,7 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().RemoveFlag64(UnitFields.NpcFlags, e.Action.unitFlag.flag); + obj.ToUnit().RemoveNpcFlag((NPCFlags)e.Action.unitFlag.flag); break; } case SmartActions.CrossCast: @@ -1937,7 +1937,25 @@ namespace Game.AI break; foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().SetByteFlag(UnitFields.Bytes1, (byte)e.Action.setunitByte.type, e.Action.setunitByte.byte1); + { + switch (e.Action.setunitByte.type) + { + case 0: + obj.ToUnit().SetStandState((UnitStandStateType)e.Action.setunitByte.byte1); + break; + case 1: + // pet talent points + break; + case 2: + obj.ToUnit().AddVisFlags((UnitVisFlags)e.Action.setunitByte.byte1); + break; + case 3: + // this is totally wrong to maintain compatibility with existing scripts + // TODO: fix with animtier overhaul + obj.ToUnit().SetAnimTier((UnitBytes1Flags)(obj.ToUnit().m_unitData.AnimTier | e.Action.setunitByte.byte1), false); + break; + } + } break; } case SmartActions.RemoveUnitFieldBytes1: @@ -1948,7 +1966,23 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().RemoveByteFlag(UnitFields.Bytes1, (byte)e.Action.delunitByte.type, e.Action.delunitByte.byte1); + { + switch (e.Action.setunitByte.type) + { + case 0: + obj.ToUnit().SetStandState(UnitStandStateType.Stand); + break; + case 1: + // pet talent points + break; + case 2: + obj.ToUnit().RemoveVisFlags((UnitVisFlags)e.Action.setunitByte.byte1); + break; + case 3: + obj.ToUnit().SetAnimTier((UnitBytes1Flags)(obj.ToUnit().m_unitData.AnimTier & ~e.Action.setunitByte.byte1), false); + break; + } + } break; } case SmartActions.InterruptSpell: @@ -1981,7 +2015,7 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().SetUInt32Value(ObjectFields.DynamicFlags, e.Action.unitFlag.flag); + obj.ToUnit().SetDynamicFlags((UnitDynFlags)e.Action.unitFlag.flag); break; } case SmartActions.AddDynamicFlag: @@ -1992,7 +2026,7 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().SetFlag(ObjectFields.DynamicFlags, e.Action.unitFlag.flag); + obj.ToUnit().AddDynamicFlag((UnitDynFlags)e.Action.unitFlag.flag); break; } case SmartActions.RemoveDynamicFlag: @@ -2003,7 +2037,7 @@ namespace Game.AI foreach (var obj in targets) if (IsUnit(obj)) - obj.ToUnit().RemoveFlag(ObjectFields.DynamicFlags, e.Action.unitFlag.flag); + obj.ToUnit().RemoveDynamicFlag((UnitDynFlags)e.Action.unitFlag.flag); break; } case SmartActions.JumpToPos: @@ -2163,7 +2197,7 @@ namespace Game.AI foreach (var obj in targets) if (IsGameObject(obj)) - obj.ToGameObject().SetUInt32Value(GameObjectFields.Flags, e.Action.goFlag.flag); + obj.ToGameObject().SetFlags((GameObjectFlags)e.Action.goFlag.flag); break; } case SmartActions.AddGoFlag: @@ -2174,7 +2208,7 @@ namespace Game.AI foreach (var obj in targets) if (IsGameObject(obj)) - obj.ToGameObject().SetFlag(GameObjectFields.Flags, e.Action.goFlag.flag); + obj.ToGameObject().AddFlag((GameObjectFlags)e.Action.goFlag.flag); break; } case SmartActions.RemoveGoFlag: @@ -2185,7 +2219,7 @@ namespace Game.AI foreach (var obj in targets) if (IsGameObject(obj)) - obj.ToGameObject().RemoveFlag(GameObjectFields.Flags, e.Action.goFlag.flag); + obj.ToGameObject().RemoveFlag((GameObjectFlags)e.Action.goFlag.flag); break; } case SmartActions.SummonCreatureGroup: diff --git a/Source/Game/Achievements/AchievementManager.cs b/Source/Game/Achievements/AchievementManager.cs index 87d69c42f..5041c7468 100644 --- a/Source/Game/Achievements/AchievementManager.cs +++ b/Source/Game/Achievements/AchievementManager.cs @@ -514,7 +514,7 @@ namespace Game.Achievements //! Since no common attributes were found, (not even in titleRewardFlags field) //! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! condition fields to the condition system. - uint titleId = reward.TitleId[achievement.Id == 1793 ? _owner.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender) : (_owner.GetTeam() == Team.Alliance ? 0 : 1)]; + uint titleId = reward.TitleId[achievement.Id == 1793 ? _owner.m_playerData.NativeSex : (_owner.GetTeam() == Team.Alliance ? 0 : 1)]; if (titleId != 0) { CharTitlesRecord titleEntry = CliDB.CharTitlesStorage.LookupByKey(titleId); diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 35d904583..140769eb6 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -284,7 +284,7 @@ namespace Game.Achievements SetCriteriaProgress(criteria, referencePlayer.GetReputationMgr().GetVisibleFactionCount(), referencePlayer); break; case CriteriaTypes.EarnHonorableKill: - SetCriteriaProgress(criteria, referencePlayer.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills), referencePlayer); + SetCriteriaProgress(criteria, referencePlayer.m_activePlayerData.LifetimeHonorableKills, referencePlayer); break; case CriteriaTypes.HighestGoldValueOwned: SetCriteriaProgress(criteria, referencePlayer.GetMoney(), referencePlayer, ProgressType.Highest); @@ -1063,12 +1063,12 @@ namespace Game.Achievements if (area.AreaBit < 0) continue; - int playerIndexOffset = (int)((uint)area.AreaBit / 32); + int playerIndexOffset = (int)((uint)area.AreaBit / 64); if (playerIndexOffset >= PlayerConst.ExploredZonesSize) continue; - uint mask = 1u << (int)((uint)area.AreaBit % 32); - if (Convert.ToBoolean(referencePlayer.GetUInt32Value(ActivePlayerFields.ExploredZones + playerIndexOffset) & mask)) + ulong mask = 1ul << (int)((uint)area.AreaBit % 64); + if (Convert.ToBoolean(referencePlayer.m_activePlayerData.ExploredZones[playerIndexOffset] & mask)) { matchFound = true; break; diff --git a/Source/Game/Arenas/ArenaScore.cs b/Source/Game/Arenas/ArenaScore.cs index b476ce1cf..24c48c2ae 100644 --- a/Source/Game/Arenas/ArenaScore.cs +++ b/Source/Game/Arenas/ArenaScore.cs @@ -29,7 +29,7 @@ namespace Game.Arenas TeamId = (int)(team == Team.Alliance ? BattlegroundTeamId.Alliance : BattlegroundTeamId.Horde); } - public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) + public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData) { base.BuildPvPLogPlayerDataPacket(out playerData); diff --git a/Source/Game/AuctionHouse/AuctionManager.cs b/Source/Game/AuctionHouse/AuctionManager.cs index a5df0869d..c8c2591be 100644 --- a/Source/Game/AuctionHouse/AuctionManager.cs +++ b/Source/Game/AuctionHouse/AuctionManager.cs @@ -555,38 +555,6 @@ namespace Game string name = proto.GetName(player.GetSession().GetSessionDbcLocale()); if (string.IsNullOrEmpty(name)) continue; - - // DO NOT use GetItemEnchantMod(proto.RandomProperty) as it may return a result - // that matches the search but it may not equal item.GetItemRandomPropertyId() - // used in BuildAuctionInfo() which then causes wrong items to be listed - int propRefID = item.GetItemRandomPropertyId(); - if (propRefID != 0) - { - string suffix = null; - // Append the suffix to the name (ie: of the Monkey) if one exists - // These are found in ItemRandomProperties.dbc, not ItemRandomSuffix.dbc - // even though the DBC names seem misleading - if (propRefID < 0) - { - ItemRandomSuffixRecord itemRandSuffix = CliDB.ItemRandomSuffixStorage.LookupByKey(-propRefID); - if (itemRandSuffix != null) - suffix = itemRandSuffix.Name[player.GetSession().GetSessionDbcLocale()]; - } - else - { - ItemRandomPropertiesRecord itemRandProp = CliDB.ItemRandomPropertiesStorage.LookupByKey(propRefID); - if (itemRandProp != null) - suffix = itemRandProp.Name[player.GetSession().GetSessionDbcLocale()]; - } - - // dbc local name - if (!string.IsNullOrEmpty(suffix)) - { - // Append the suffix (ie: of the Monkey) to the name using localization - // or default enUS if localization is invalid - name += ' ' + suffix; - } - } } // Add the item if no search term or if entered search term was found @@ -645,7 +613,7 @@ namespace Game } byte i = 0; - foreach (ItemDynamicFieldGems gemData in item.GetGems()) + foreach (SocketedGem gemData in item.m_itemData.Gems) { if (gemData.ItemId != 0) { diff --git a/Source/Game/BattleFields/BattleField.cs b/Source/Game/BattleFields/BattleField.cs index dd0b096cc..5780c956b 100644 --- a/Source/Game/BattleFields/BattleField.cs +++ b/Source/Game/BattleFields/BattleField.cs @@ -501,7 +501,7 @@ namespace Game.BattleFields { creature.CombatStop(); creature.SetReactState(ReactStates.Passive); - creature.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + creature.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); creature.DisappearAndDie(); creature.SetVisible(false); } @@ -509,14 +509,14 @@ namespace Game.BattleFields public void ShowNpc(Creature creature, bool aggressive) { creature.SetVisible(true); - creature.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + creature.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); if (!creature.IsAlive()) creature.Respawn(true); if (aggressive) creature.SetReactState(ReactStates.Aggressive); else { - creature.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + creature.AddUnitFlag(UnitFlags.NonAttackable); creature.SetReactState(ReactStates.Passive); } } diff --git a/Source/Game/BattleFields/Zones/WinterGrasp.cs b/Source/Game/BattleFields/Zones/WinterGrasp.cs index 8c90403c1..82344cd4e 100644 --- a/Source/Game/BattleFields/Zones/WinterGrasp.cs +++ b/Source/Game/BattleFields/Zones/WinterGrasp.cs @@ -187,7 +187,7 @@ namespace Game.BattleFields // Update faction of relic, only attacker can click on relic.SetFaction(WGConst.WintergraspFaction[GetAttackerTeam()]); // Set in use (not allow to click on before last door is broken) - relic.SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse | GameObjectFlags.NotSelectable); + relic.AddFlag(GameObjectFlags.InUse | GameObjectFlags.NotSelectable); m_titansRelicGUID = relic.GetGUID(); } else @@ -1157,7 +1157,7 @@ namespace Game.BattleFields } _wg.SetRelicInteractible(true); if (_wg.GetRelic()) - _wg.GetRelic().RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse | GameObjectFlags.NotSelectable); + _wg.GetRelic().RemoveFlag(GameObjectFlags.InUse | GameObjectFlags.NotSelectable); else Log.outError(LogFilter.Server, "BattlefieldWG: Titan Relic not found."); break; diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 354990be8..0368c8aa2 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -426,7 +426,7 @@ namespace Game.BattleGrounds player.SendPacket(battlefieldStatus); // Correctly display EnemyUnitFrame - player.SetByteValue(PlayerFields.Bytes4, 3, (byte)player.GetBGTeam()); + player.SetArenaFaction((byte)player.GetBGTeam()); player.RemoveAurasDueToSpell(BattlegroundConst.SpellArenaPreparation); player.ResetAllPowers(); @@ -974,7 +974,7 @@ namespace Game.BattleGrounds public virtual void AddPlayer(Player player) { // remove afk from player - if (player.HasFlag(PlayerFields.Flags, PlayerFlags.AFK)) + if (player.isAFK()) player.ToggleAFK(); // score struct must be created in inherited class @@ -985,7 +985,7 @@ namespace Game.BattleGrounds BattlegroundPlayer bp = new BattlegroundPlayer(); bp.OfflineRemoveTime = 0; bp.Team = team; - bp.ActiveSpec = player.GetInt32Value(PlayerFields.CurrentSpecId); + bp.ActiveSpec = (int)player.GetPrimarySpecialization(); // Add to list/maps m_Players[guid] = bp; @@ -1221,12 +1221,9 @@ namespace Game.BattleGrounds { pvpLogData = new PVPLogData(); - if (GetStatus() == BattlegroundStatus.WaitLeave) - pvpLogData.Winner.Set((byte)GetWinner()); - foreach (var score in PlayerScores) { - PVPLogData.PlayerData playerData; + PVPLogData.PVPMatchPlayerStatistics playerData; score.Value.BuildPvPLogPlayerDataPacket(out playerData); @@ -1234,14 +1231,14 @@ namespace Game.BattleGrounds if (player) { playerData.IsInWorld = true; - playerData.PrimaryTalentTree = (int)player.GetUInt32Value(PlayerFields.CurrentSpecId); + playerData.PrimaryTalentTree = (int)player.GetPrimarySpecialization(); playerData.Sex = (int)player.GetGender(); playerData.PlayerRace = player.GetRace(); playerData.PlayerClass = (int)player.GetClass(); playerData.HonorLevel = (int)player.GetHonorLevel(); } - pvpLogData.Players.Add(playerData); + pvpLogData.Statistics.Add(playerData); } pvpLogData.PlayerCount[(int)BattlegroundTeamId.Horde] = (sbyte)GetPlayersCountByTeam(Team.Horde); @@ -1534,9 +1531,6 @@ namespace Game.BattleGrounds // casting visual effect creature.SetChannelSpellId(BattlegroundConst.SpellSpiritHealChannel); creature.SetChannelSpellXSpellVisualId(BattlegroundConst.SpellSpiritHealChannelVisual); - // correct cast speed - creature.SetFloatValue(UnitFields.ModCastSpeed, 1.0f); - creature.SetFloatValue(UnitFields.ModCastHaste, 1.0f); //creature.CastSpell(creature, SPELL_SPIRIT_HEAL_CHANNEL, true); return true; } @@ -1649,7 +1643,7 @@ namespace Game.BattleGrounds if (!isArena()) { // To be able to remove insignia -- ONLY IN Battlegrounds - victim.SetFlag(UnitFields.Flags, UnitFlags.Skinnable); + victim.AddUnitFlag(UnitFlags.Skinnable); RewardXPAtKill(killer, victim); } } diff --git a/Source/Game/BattleGrounds/BattleGroundManager.cs b/Source/Game/BattleGrounds/BattleGroundManager.cs index e0bb86786..5d6439015 100644 --- a/Source/Game/BattleGrounds/BattleGroundManager.cs +++ b/Source/Game/BattleGrounds/BattleGroundManager.cs @@ -702,7 +702,7 @@ namespace Game.BattleGrounds CreatureTemplate cInfo = Global.ObjectMgr.GetCreatureTemplate(entry); if (cInfo != null) { - if (!cInfo.Npcflag.HasAnyFlag(NPCFlags.BattleMaster)) + if (!cInfo.Npcflag.HasAnyFlag((uint)NPCFlags.BattleMaster)) Log.outError(LogFilter.Sql, "Creature (Entry: {0}) listed in `battlemaster_entry` is not a battlemaster.", entry); } else @@ -733,10 +733,10 @@ namespace Game.BattleGrounds var templates = Global.ObjectMgr.GetCreatureTemplates(); foreach (var creature in templates) { - if (creature.Value.Npcflag.HasAnyFlag(NPCFlags.BattleMaster) && !mBattleMastersMap.ContainsKey(creature.Value.Entry)) + if (creature.Value.Npcflag.HasAnyFlag((uint)NPCFlags.BattleMaster) && !mBattleMastersMap.ContainsKey(creature.Value.Entry)) { Log.outError(LogFilter.Sql, "CreatureTemplate (Entry: {0}) has UNIT_NPC_FLAG_BATTLEMASTER but no data in `battlemaster_entry` table. Removing flag!", creature.Value.Entry); - templates[creature.Key].Npcflag &= ~NPCFlags.BattleMaster; + templates[creature.Key].Npcflag &= ~(uint)NPCFlags.BattleMaster; } } } diff --git a/Source/Game/BattleGrounds/BattleGroundScore.cs b/Source/Game/BattleGrounds/BattleGroundScore.cs index 07202609c..ac624c5e6 100644 --- a/Source/Game/BattleGrounds/BattleGroundScore.cs +++ b/Source/Game/BattleGrounds/BattleGroundScore.cs @@ -57,9 +57,9 @@ namespace Game.BattleGrounds } } - public virtual void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) + public virtual void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData) { - playerData = new PVPLogData.PlayerData(); + playerData = new PVPLogData.PVPMatchPlayerStatistics(); playerData.PlayerGUID = PlayerGuid; playerData.Kills = KillingBlows; playerData.Faction = (byte)TeamId; diff --git a/Source/Game/BattleGrounds/Zones/ArathiBasin.cs b/Source/Game/BattleGrounds/Zones/ArathiBasin.cs index 1d81cce3b..d320db8bd 100644 --- a/Source/Game/BattleGrounds/Zones/ArathiBasin.cs +++ b/Source/Game/BattleGrounds/Zones/ArathiBasin.cs @@ -833,7 +833,7 @@ namespace Game.BattleGrounds.Zones } } - public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) + public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData) { base.BuildPvPLogPlayerDataPacket(out playerData); diff --git a/Source/Game/BattleGrounds/Zones/EyeofStorm.cs b/Source/Game/BattleGrounds/Zones/EyeofStorm.cs index 557102cd4..4315f4c62 100644 --- a/Source/Game/BattleGrounds/Zones/EyeofStorm.cs +++ b/Source/Game/BattleGrounds/Zones/EyeofStorm.cs @@ -999,7 +999,7 @@ namespace Game.BattleGrounds.Zones } } - public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) + public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData) { base.BuildPvPLogPlayerDataPacket(out playerData); diff --git a/Source/Game/BattleGrounds/Zones/StrandofAncients.cs b/Source/Game/BattleGrounds/Zones/StrandofAncients.cs index 30ef1757d..ead79249e 100644 --- a/Source/Game/BattleGrounds/Zones/StrandofAncients.cs +++ b/Source/Game/BattleGrounds/Zones/StrandofAncients.cs @@ -689,9 +689,9 @@ namespace Game.BattleGrounds.Zones if (dem) { if (start) - dem.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + dem.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); else - dem.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); + dem.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable); } } } @@ -768,9 +768,9 @@ namespace Game.BattleGrounds.Zones if (go) { if (CanInteractWithObject(objectId)) - go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.RemoveFlag(GameObjectFlags.NotSelectable); else - go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); + go.AddFlag(GameObjectFlags.NotSelectable); } } @@ -1153,7 +1153,7 @@ namespace Game.BattleGrounds.Zones } } - public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) + public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData) { base.BuildPvPLogPlayerDataPacket(out playerData); diff --git a/Source/Game/BattleGrounds/Zones/WarsongGluch.cs b/Source/Game/BattleGrounds/Zones/WarsongGluch.cs index a23420dcc..6b1170c9c 100644 --- a/Source/Game/BattleGrounds/Zones/WarsongGluch.cs +++ b/Source/Game/BattleGrounds/Zones/WarsongGluch.cs @@ -966,7 +966,7 @@ namespace Game.BattleGrounds.Zones } } - public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) + public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData) { base.BuildPvPLogPlayerDataPacket(out playerData); diff --git a/Source/Game/BattlePets/BattlePetManager.cs b/Source/Game/BattlePets/BattlePetManager.cs index 2aa33b3ba..143d6fe64 100644 --- a/Source/Game/BattlePets/BattlePetManager.cs +++ b/Source/Game/BattlePets/BattlePetManager.cs @@ -406,7 +406,7 @@ namespace Game.BattlePets return; // TODO: set proper CreatureID for spell DEFAULT_SUMMON_BATTLE_PET_SPELL (default EffectMiscValueA is 40721 - Murkimus the Gladiator) - _owner.GetPlayer().SetGuidValue(ActivePlayerFields.SummonedBattlePetId, guid); + _owner.GetPlayer().SetSummonedBattlePetGUID(guid); _owner.GetPlayer().CastSpell(_owner.GetPlayer(), speciesEntry.SummonSpellID != 0 ? speciesEntry.SummonSpellID : SharedConst.DefaultSummonBattlePetSpell); // TODO: set pet level, quality... update fields @@ -416,10 +416,10 @@ namespace Game.BattlePets { Player ownerPlayer = _owner.GetPlayer(); Creature pet = ObjectAccessor.GetCreatureOrPetOrVehicle(ownerPlayer, ownerPlayer.GetCritterGUID()); - if (pet && ownerPlayer.GetGuidValue(ActivePlayerFields.SummonedBattlePetId) == pet.GetGuidValue(UnitFields.BattlePetCompanionGuid)) + if (pet && ownerPlayer.m_activePlayerData.SummonedBattlePetGUID == pet.GetBattlePetCompanionGUID()) { pet.DespawnOrUnsummon(); - ownerPlayer.SetGuidValue(ActivePlayerFields.SummonedBattlePetId, ObjectGuid.Empty); + ownerPlayer.SetSummonedBattlePetGUID(ObjectGuid.Empty); } } diff --git a/Source/Game/Calendar/CalendarManager.cs b/Source/Game/Calendar/CalendarManager.cs index bc8067dff..7682315fe 100644 --- a/Source/Game/Calendar/CalendarManager.cs +++ b/Source/Game/Calendar/CalendarManager.cs @@ -546,7 +546,7 @@ namespace Game Player invitee = Global.ObjAccessor.FindPlayer(inviteeGuid); uint inviteeLevel = invitee ? invitee.getLevel() : Player.GetLevelFromDB(inviteeGuid); - uint inviteeGuildId = invitee ? invitee.GetGuildId() : Player.GetGuildIdFromDB(inviteeGuid); + ulong inviteeGuildId = invitee ? invitee.GetGuildId() : Player.GetGuildIdFromDB(inviteeGuid); CalendarEventInviteInfo inviteInfo = new CalendarEventInviteInfo(); inviteInfo.Guid = inviteeGuid; diff --git a/Source/Game/Chat/Channels/ChannelAppenders.cs b/Source/Game/Chat/Channels/ChannelAppenders.cs index b0ccbd432..40635c45c 100644 --- a/Source/Game/Chat/Channels/ChannelAppenders.cs +++ b/Source/Game/Chat/Channels/ChannelAppenders.cs @@ -65,9 +65,9 @@ namespace Game.Chat LocaleConstant localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); ChannelNotifyJoined notify = new ChannelNotifyJoined(); - //notify->ChannelWelcomeMsg = ""; + //notify.ChannelWelcomeMsg = ""; notify.ChatChannelID = (int)_source.GetChannelId(); - //notify->InstanceID = 0; + //notify.InstanceID = 0; notify.ChannelFlags = _source.GetFlags(); notify.Channel = _source.GetName(localeIdx); return notify; diff --git a/Source/Game/Chat/Commands/AccountCommands.cs b/Source/Game/Chat/Commands/AccountCommands.cs index 9713be3cb..163f25778 100644 --- a/Source/Game/Chat/Commands/AccountCommands.cs +++ b/Source/Game/Chat/Commands/AccountCommands.cs @@ -750,7 +750,7 @@ namespace Game.Chat var ipBytes = System.Net.IPAddress.Parse(handler.GetSession().GetRemoteAddress()).GetAddressBytes(); Array.Reverse(ipBytes); - PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY); + /*PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY); stmt.AddValue(0, BitConverter.ToUInt32(ipBytes, 0)); SQLResult result = DB.Login.Query(stmt); @@ -767,7 +767,7 @@ namespace Game.Chat { handler.SendSysMessage("[IP2NATION] Table empty"); Log.outDebug(LogFilter.Server, "[IP2NATION] Table empty"); - } + }*/ } else if (param == "off") { diff --git a/Source/Game/Chat/Commands/BNetAccountCommands.cs b/Source/Game/Chat/Commands/BNetAccountCommands.cs index 4eab55815..47c97cb07 100644 --- a/Source/Game/Chat/Commands/BNetAccountCommands.cs +++ b/Source/Game/Chat/Commands/BNetAccountCommands.cs @@ -285,7 +285,8 @@ namespace Game.Chat.Commands } [CommandGroup("lock", RBACPermissions.CommandBnetAccount, true)] - class LockCommands { + class LockCommands + { [Command("country", RBACPermissions.CommandBnetAccountLockCountry, true)] static bool HandleLockCountryCommand(StringArguments args, CommandHandler handler) { @@ -300,7 +301,7 @@ namespace Game.Chat.Commands { if (param == "on") { - PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY); + /*PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY); var ipBytes = System.Net.IPAddress.Parse(handler.GetSession().GetRemoteAddress()).GetAddressBytes(); Array.Reverse(ipBytes); stmt.AddValue(0, BitConverter.ToUInt32(ipBytes, 0)); @@ -318,7 +319,7 @@ namespace Game.Chat.Commands { handler.SendSysMessage("[IP2NATION] Table empty"); Log.outDebug(LogFilter.Server, "[IP2NATION] Table empty"); - } + }*/ } else if (param == "off") { diff --git a/Source/Game/Chat/Commands/CharacterCommands.cs b/Source/Game/Chat/Commands/CharacterCommands.cs index 4a6cf94b5..e17e06132 100644 --- a/Source/Game/Chat/Commands/CharacterCommands.cs +++ b/Source/Game/Chat/Commands/CharacterCommands.cs @@ -52,7 +52,7 @@ namespace Game.Chat if (string.IsNullOrEmpty(name)) continue; - string activeStr = target.GetUInt32Value(PlayerFields.ChosenTitle) == titleInfo.MaskID + string activeStr = target.m_playerData.PlayerTitle == titleInfo.MaskID ? handler.GetCypherString(CypherStrings.Active) : ""; string titleNameStr = string.Format(name.ConvertFormatSyntax(), targetName); @@ -600,7 +600,7 @@ namespace Game.Chat if (!int.TryParse(daysStr, out keepDays) || keepDays < 0) return false; } - // config option value 0 -> disabled and can't be used + // config option value 0 . disabled and can't be used else if (keepDays <= 0) return false; @@ -777,7 +777,7 @@ namespace Game.Chat { player.GiveLevel((uint)newLevel); player.InitTalentForLevel(); - player.SetUInt32Value(ActivePlayerFields.Xp, 0); + player.SetXP(0); if (handler.needReportToTarget(player)) { diff --git a/Source/Game/Chat/Commands/CheatCommands.cs b/Source/Game/Chat/Commands/CheatCommands.cs index 59d86c541..142983939 100644 --- a/Source/Game/Chat/Commands/CheatCommands.cs +++ b/Source/Game/Chat/Commands/CheatCommands.cs @@ -245,9 +245,9 @@ namespace Game.Chat.Commands for (ushort i = 0; i < PlayerConst.ExploredZonesSize; ++i) { if (flag != 0) - handler.GetSession().GetPlayer().SetFlag(ActivePlayerFields.ExploredZones + i, 0xFFFFFFFF); + handler.GetSession().GetPlayer().AddExploredZones(i, 0xFFFFFFFFFFFFFFFF); else - handler.GetSession().GetPlayer().SetFlag(ActivePlayerFields.ExploredZones + i, 0); + handler.GetSession().GetPlayer().RemoveExploredZones(i, 0xFFFFFFFFFFFFFFFF); } return true; diff --git a/Source/Game/Chat/Commands/DebugCommands.cs b/Source/Game/Chat/Commands/DebugCommands.cs index 4e33e57dd..66493eb35 100644 --- a/Source/Game/Chat/Commands/DebugCommands.cs +++ b/Source/Game/Chat/Commands/DebugCommands.cs @@ -435,78 +435,6 @@ namespace Game.Chat return true; } - [Command("getitemvalue", RBACPermissions.CommandDebugGetitemvalue)] - static bool HandleDebugGetItemValueCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - if (!ulong.TryParse(args.NextString(), out ulong guid)) - return false; - - if (!uint.TryParse(args.NextString(), out uint index)) - return false; - - Item item = handler.GetSession().GetPlayer().GetItemByGuid(ObjectGuid.Create(HighGuid.Item, guid)); - if (!item) - return false; - - if (index >= item.valuesCount) - return false; - - uint value = item.GetUInt32Value(index); - - handler.SendSysMessage("Item {0}: value at {1} is {2}", guid, index, value); - - return true; - } - - [Command("getvalue", RBACPermissions.CommandDebugGetvalue)] - static bool HandleDebugGetValueCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - string fieldStr = args.NextString(); - string valueStr = args.NextString(); - - if (string.IsNullOrEmpty(fieldStr)) - return false; - - Unit target = handler.getSelectedUnit(); - if (!target) - { - handler.SendSysMessage(CypherStrings.SelectCharOrCreature); - return false; - } - - if (!uint.TryParse(fieldStr, out uint field)) - return false; - - ObjectGuid guid = target.GetGUID(); - if (field >= target.valuesCount) - { - handler.SendSysMessage(CypherStrings.TooBigIndex, field, guid.ToString(), target.valuesCount); - return false; - } - - if (!bool.TryParse(valueStr, out bool isInt32)) - isInt32 = true; - - if (isInt32) - { - uint value = target.GetUInt32Value(field); - handler.SendSysMessage(CypherStrings.GetUintField, guid.ToString(), field, value); - } - else - { - float value = target.GetFloatValue(field); - handler.SendSysMessage(CypherStrings.GetFloatField, guid.ToString(), field, value); - } - - return true; - } - [Command("hostil", RBACPermissions.CommandDebugHostil)] static bool HandleDebugHostileRefListCommand(StringArguments args, CommandHandler handler) { @@ -570,31 +498,6 @@ namespace Game.Chat return true; } - [Command("Mod32Value", RBACPermissions.CommandDebugMod32value)] - static bool HandleDebugMod32ValueCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - uint field = args.NextUInt32(); - int value = args.NextInt32(); - - if (field >= handler.GetSession().GetPlayer().valuesCount) - { - handler.SendSysMessage(CypherStrings.TooBigIndex, field, handler.GetSession().GetPlayer().GetGUID().ToString(), handler.GetSession().GetPlayer().valuesCount); - return false; - } - - uint currentValue = handler.GetSession().GetPlayer().GetUInt32Value(field); - - currentValue += (uint)value; - handler.GetSession().GetPlayer().SetUInt32Value(field, currentValue); - - handler.SendSysMessage(CypherStrings.Change32bitField, field, currentValue); - - return true; - } - [Command("moveflags", RBACPermissions.CommandDebugMoveflags)] static bool HandleDebugMoveflagsCommand(StringArguments args, CommandHandler handler) { @@ -794,103 +697,6 @@ namespace Game.Chat return true; } - [Command("setbit", RBACPermissions.CommandDebugSetbit)] - static bool HandleDebugSet32BitCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - WorldObject target = handler.GetSelectedObject(); - if (!target) - { - handler.SendSysMessage(CypherStrings.SelectCharOrCreature); - return false; - } - - uint field = args.NextUInt32(); - uint val = args.NextUInt32(); - if (val > 32) //uint = 32 bits - return false; - - uint value = (uint)(val != 0 ? 1 << ((int)val - 1) : 0); - target.SetUInt32Value(field, value); - - handler.SendSysMessage(CypherStrings.Set32bitField, field, value); - return true; - } - - [Command("setitemvalue", RBACPermissions.CommandDebugSetitemvalue)] - static bool HandleDebugSetItemValueCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - if (!ulong.TryParse(args.NextString(), out ulong guid)) - return false; - - if (!uint.TryParse(args.NextString(), out uint index)) - return false; - - if (!uint.TryParse(args.NextString(), out uint value)) - return false; - - Item item = handler.GetSession().GetPlayer().GetItemByGuid(ObjectGuid.Create(HighGuid.Item, guid)); - if (!item) - return false; - - if (index >= item.valuesCount) - return false; - - item.SetUInt32Value(index, value); - return true; - } - - [Command("setvalue", RBACPermissions.CommandDebugSetvalue)] - static bool HandleDebugSetValueCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - WorldObject target = handler.GetSelectedObject(); - if (!target) - { - handler.SendSysMessage(CypherStrings.SelectCharOrCreature); - return false; - } - - ObjectGuid guid = target.GetGUID(); - - uint field = args.NextUInt32(); - if (field >= target.valuesCount) - { - handler.SendSysMessage(CypherStrings.TooBigIndex, field, guid.ToString(), target.valuesCount); - return false; - } - - string valueStr = args.NextString(); - if (!bool.TryParse(args.NextString(), out bool isInt32)) - isInt32 = true; - - if (isInt32) - { - if (!uint.TryParse(valueStr, out uint value)) - return false; - - target.SetUInt32Value(field, value); - handler.SendSysMessage(CypherStrings.SetUintField, guid.ToString(), field, value); - } - else - { - if (!float.TryParse(valueStr, out float value)) - return false; - - target.SetFloatValue(field, value); - handler.SendSysMessage(CypherStrings.SetFloatField, guid.ToString(), field, value); - } - - return true; - } - [Command("setvid", RBACPermissions.CommandDebugSetvid)] static bool HandleDebugSetVehicleIdCommand(StringArguments args, CommandHandler handler) { @@ -992,49 +798,6 @@ namespace Game.Chat return true; } - [Command("update", RBACPermissions.CommandDebugUpdate)] - static bool HandleDebugUpdateCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - Unit unit = handler.getSelectedUnit(); - if (!unit) - { - handler.SendSysMessage(CypherStrings.SelectCharOrCreature); - return false; - } - - uint updateIndex = args.NextUInt32(); - - //check updateIndex - if (unit.IsTypeId(TypeId.Player)) - { - if (updateIndex >= (int)PlayerFields.End) - return true; - } - else if (updateIndex >= (int)UnitFields.End) - return true; - - uint value; - string valueStr = args.NextString(); - if (string.IsNullOrEmpty(valueStr)) - { - value = unit.GetUInt32Value(updateIndex); - - handler.SendSysMessage(CypherStrings.Update, unit.GetGUID().ToString(), updateIndex, value); - return true; - } - - if (!uint.TryParse(valueStr, out value)) - return false; - - handler.SendSysMessage(CypherStrings.UpdateChange, unit.GetGUID().ToString(), updateIndex, value); - unit.SetUInt32Value(updateIndex, value); - - return true; - } - [Command("uws", RBACPermissions.CommandDebugUws)] static bool HandleDebugUpdateWorldStateCommand(StringArguments args, CommandHandler handler) { diff --git a/Source/Game/Chat/Commands/GameObjectCommands.cs b/Source/Game/Chat/Commands/GameObjectCommands.cs index 1057ac5e9..fdb316118 100644 --- a/Source/Game/Chat/Commands/GameObjectCommands.cs +++ b/Source/Game/Chat/Commands/GameObjectCommands.cs @@ -625,19 +625,34 @@ namespace Game.Chat if (string.IsNullOrEmpty(state)) return false; - if (!int.TryParse(state, out int objectState)) + if (!uint.TryParse(state, out uint objectState)) return false; - if (objectType < 4) - obj.SetByteValue(GameObjectFields.Bytes1, (byte)objectType, (byte)objectState); - else if (objectType == 4) - obj.SendCustomAnim((uint)objectState); - else if (objectType == 5) + switch (objectType) { - if (objectState < 0 || objectState > (uint)GameObjectDestructibleState.Rebuilding) - return false; + case 0: + obj.SetGoState((GameObjectState)objectState); + break; + case 1: + obj.SetGoType((GameObjectTypes)objectState); + break; + case 2: + obj.SetGoArtKit((byte)objectState); + break; + case 3: + obj.SetGoAnimProgress(objectState); + break; + case 4: + obj.SendCustomAnim(objectState); + break; + case 5: + if (objectState < 0 || objectState > (uint)GameObjectDestructibleState.Rebuilding) + return false; - obj.SetDestructibleState((GameObjectDestructibleState)objectState); + obj.SetDestructibleState((GameObjectDestructibleState)objectState); + break; + default: + break; } handler.SendSysMessage("Set gobject type {0} state {1}", objectType, objectState); diff --git a/Source/Game/Chat/Commands/GuildCommands.cs b/Source/Game/Chat/Commands/GuildCommands.cs index 29cd0b83a..ed77f8c16 100644 --- a/Source/Game/Chat/Commands/GuildCommands.cs +++ b/Source/Game/Chat/Commands/GuildCommands.cs @@ -103,7 +103,7 @@ namespace Game.Chat if (!handler.extractPlayerTarget(args, out target, out targetGuid)) return false; - uint guildId = target != null ? target.GetGuildId() : Player.GetGuildIdFromDB(targetGuid); + ulong guildId = target != null ? target.GetGuildId() : Player.GetGuildIdFromDB(targetGuid); if (guildId == 0) return false; diff --git a/Source/Game/Chat/Commands/LookupCommands.cs b/Source/Game/Chat/Commands/LookupCommands.cs index 66304bbd9..4298b6d93 100644 --- a/Source/Game/Chat/Commands/LookupCommands.cs +++ b/Source/Game/Chat/Commands/LookupCommands.cs @@ -834,7 +834,7 @@ namespace Game.Chat string knownStr = target && target.HasTitle(titleInfo) ? handler.GetCypherString(CypherStrings.Known) : ""; - string activeStr = target && target.GetUInt32Value(PlayerFields.ChosenTitle) == titleInfo.MaskID + string activeStr = target && target.m_playerData.PlayerTitle == titleInfo.MaskID ? handler.GetCypherString(CypherStrings.Active) : ""; string titleNameStr = string.Format(name.ConvertFormatSyntax(), targetName); diff --git a/Source/Game/Chat/Commands/MiscCommands.cs b/Source/Game/Chat/Commands/MiscCommands.cs index ae5a27d7f..c94df6507 100644 --- a/Source/Game/Chat/Commands/MiscCommands.cs +++ b/Source/Game/Chat/Commands/MiscCommands.cs @@ -345,7 +345,7 @@ namespace Game.Chat return false; } - Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantment.GenerateItemRandomPropertyId(itemId), null, 0, bonusListIDs); + Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, 0, bonusListIDs); // remove binding (let GM give it to another player later) if (player == playerTarget) @@ -420,7 +420,7 @@ namespace Game.Chat InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, template.Value.GetId(), 1); if (msg == InventoryResult.Ok) { - Item item = playerTarget.StoreNewItem(dest, template.Value.GetId(), true, ItemRandomEnchantmentId.Empty, null, 0, bonusListIDs); + Item item = playerTarget.StoreNewItem(dest, template.Value.GetId(), true, 0, null, 0, bonusListIDs); // remove binding (let GM give it to another player later) if (player == playerTarget) @@ -451,7 +451,7 @@ namespace Game.Chat { if (args.Empty()) { - if (handler.GetSession().GetPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.Developer)) + if (handler.GetSession().GetPlayer().HasPlayerFlag(PlayerFlags.Developer)) handler.GetSession().SendNotification(CypherStrings.DevOn); else handler.GetSession().SendNotification(CypherStrings.DevOff); @@ -462,14 +462,14 @@ namespace Game.Chat if (argstr == "on") { - handler.GetSession().GetPlayer().SetFlag(PlayerFields.Flags, PlayerFlags.Developer); + handler.GetSession().GetPlayer().HasPlayerFlag(PlayerFlags.Developer); handler.GetSession().SendNotification(CypherStrings.DevOn); return true; } if (argstr == "off") { - handler.GetSession().GetPlayer().RemoveFlag(PlayerFields.Flags, PlayerFlags.Developer); + handler.GetSession().GetPlayer().RemovePlayerFlag(PlayerFlags.Developer); handler.GetSession().SendNotification(CypherStrings.DevOff); return true; } @@ -1181,16 +1181,15 @@ namespace Game.Chat return false; } - int offset = area.AreaBit / 32; + uint offset = (uint)area.AreaBit / 64; if (offset >= PlayerConst.ExploredZonesSize) { handler.SendSysMessage(CypherStrings.BadValue); return false; } - uint val = (1u << (area.AreaBit % 32)); - uint currFields = playerTarget.GetUInt32Value(ActivePlayerFields.ExploredZones + offset); - playerTarget.SetUInt32Value(ActivePlayerFields.ExploredZones + offset, (currFields | val)); + ulong val = 1ul << (area.AreaBit % 64); + playerTarget.AddExploredZones(offset, val); handler.SendSysMessage(CypherStrings.ExploreArea); return true; @@ -1222,16 +1221,15 @@ namespace Game.Chat return false; } - int offset = area.AreaBit / 32; + uint offset = (uint)area.AreaBit / 64; if (offset >= PlayerConst.ExploredZonesSize) { handler.SendSysMessage(CypherStrings.BadValue); return false; } - uint val = (1u << (area.AreaBit % 32)); - uint currFields = playerTarget.GetUInt32Value(ActivePlayerFields.ExploredZones + offset); - playerTarget.SetUInt32Value(ActivePlayerFields.ExploredZones + offset, (currFields ^ val)); + uint val = (1u << (area.AreaBit % 64)); + playerTarget.RemoveExploredZones(offset, val); handler.SendSysMessage(CypherStrings.UnexploreArea); return true; @@ -1404,7 +1402,7 @@ namespace Game.Chat mapId = target.GetMapId(); areaId = target.GetAreaId(); alive = target.IsAlive() ? handler.GetCypherString(CypherStrings.Yes) : handler.GetCypherString(CypherStrings.No); - gender = (Gender)target.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender); + gender = (Gender)(byte)target.m_playerData.NativeSex; } // get additional information from DB else @@ -1996,7 +1994,7 @@ namespace Game.Chat } go.ModifyHealth(-damage, player); - handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), guidLow, -damage, go.m_goValue.Building.Health); + handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), guidLow, -damage, go.GetGoValue().Building.Health); } return true; diff --git a/Source/Game/Chat/Commands/ModifyCommands.cs b/Source/Game/Chat/Commands/ModifyCommands.cs index ce92212ab..a0f51b631 100644 --- a/Source/Game/Chat/Commands/ModifyCommands.cs +++ b/Source/Game/Chat/Commands/ModifyCommands.cs @@ -122,22 +122,22 @@ namespace Game.Chat if (!uint.TryParse(pfactionid, out uint factionid)) { - uint _factionid = target.getFaction(); - uint _flag = target.GetUInt32Value(UnitFields.Flags); - ulong _npcflag = target.GetUInt64Value(UnitFields.NpcFlags); - uint _dyflag = target.GetUInt32Value(ObjectFields.DynamicFlags); + uint _factionid = target.GetFaction(); + uint _flag = target.m_unitData.Flags; + ulong _npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1]; + uint _dyflag = target.m_objectData.DynamicFlags; handler.SendSysMessage(CypherStrings.CurrentFaction, target.GetGUID().ToString(), _factionid, _flag, _npcflag, _dyflag); return true; } if (!uint.TryParse(args.NextString(), out uint flag)) - flag = target.GetUInt32Value(UnitFields.Flags); + flag = target.m_unitData.Flags; if (!ulong.TryParse(args.NextString(), out ulong npcflag)) - npcflag = target.GetUInt64Value(UnitFields.NpcFlags); + npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1]; if (!uint.TryParse(args.NextString(), out uint dyflag)) - dyflag = target.GetUInt32Value(ObjectFields.DynamicFlags); + dyflag = target.m_objectData.DynamicFlags; if (!CliDB.FactionTemplateStorage.ContainsKey(factionid)) { @@ -148,9 +148,10 @@ namespace Game.Chat handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid, flag, npcflag, dyflag); target.SetFaction(factionid); - target.SetUInt32Value(UnitFields.Flags, flag); - target.SetUInt64Value(UnitFields.NpcFlags, npcflag); - target.SetUInt32Value(ObjectFields.DynamicFlags, dyflag); + target.SetUnitFlags((UnitFlags)flag); + target.SetNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF)); + target.SetNpcFlags2((NPCFlags2)(npcflag >> 32)); + target.SetDynamicFlags((UnitDynFlags)dyflag); return true; } @@ -217,7 +218,7 @@ namespace Game.Chat NotifyModification(handler, target, CypherStrings.YouChangeSize, CypherStrings.YoursSizeChanged, Scale); Creature creatureTarget = target.ToCreature(); if (creatureTarget) - creatureTarget.SetFloatValue(UnitFields.DisplayScale, Scale); + creatureTarget.SetDisplayId(creatureTarget.GetDisplayId(), Scale); else target.SetObjectScale(Scale); return true; @@ -322,51 +323,6 @@ namespace Game.Chat return true; } - [Command("bit", RBACPermissions.CommandModifyBit)] - static bool HandleModifyBitCommand(StringArguments args, CommandHandler handler) - { - if (args.Empty()) - return false; - - Unit target = handler.getSelectedUnit(); - if (!target) - { - handler.SendSysMessage(CypherStrings.NoCharSelected); - - return false; - } - - // check online security - if (target.IsTypeId(TypeId.Player) && handler.HasLowerSecurity(target.ToPlayer(), ObjectGuid.Empty)) - return false; - - ushort field = args.NextUInt16(); - int bit = args.NextInt32(); - - if (field < (int)ObjectFields.End || field >= target.valuesCount) - { - handler.SendSysMessage(CypherStrings.BadValue); - return false; - } - if (bit < 1 || bit > 32) - { - handler.SendSysMessage(CypherStrings.BadValue); - return false; - } - - if (target.HasFlag(field, (1 << (bit - 1)))) - { - target.RemoveFlag(field, (1 << (bit - 1))); - handler.SendSysMessage(CypherStrings.RemoveBit, bit, field); - } - else - { - target.SetFlag(field, (1 << (bit - 1))); - handler.SendSysMessage(CypherStrings.SetBit, bit, field); - } - return true; - } - [Command("honor", RBACPermissions.CommandModifyHonor)] static bool HandleModifyHonorCommand(StringArguments args, CommandHandler handler) { @@ -591,7 +547,7 @@ namespace Game.Chat return false; uint anim_id = args.NextUInt32(); - handler.GetSession().GetPlayer().SetUInt32Value(UnitFields.NpcEmotestate, anim_id); + handler.GetSession().GetPlayer().SetEmoteState((Emote)anim_id); return true; } @@ -637,8 +593,8 @@ namespace Game.Chat } // Set gender - target.SetByteValue(UnitFields.Bytes0, 3, (byte)gender); - target.SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)gender); + target.SetGender(gender); + target.SetNativeSex(gender); // Change display ID target.InitDisplayIds(); diff --git a/Source/Game/Chat/Commands/NPCCommands.cs b/Source/Game/Chat/Commands/NPCCommands.cs index be10f6abf..68fa348fe 100644 --- a/Source/Game/Chat/Commands/NPCCommands.cs +++ b/Source/Game/Chat/Commands/NPCCommands.cs @@ -44,8 +44,8 @@ namespace Game.Chat CreatureTemplate cInfo = target.GetCreatureTemplate(); - uint faction = target.getFaction(); - ulong npcflags = target.GetUInt64Value(UnitFields.NpcFlags); + uint faction = target.GetFaction(); + ulong npcflags = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1]; uint mechanicImmuneMask = cInfo.MechanicImmuneMask; uint displayid = target.GetDisplayId(); uint nativeid = target.GetNativeDisplayId(); @@ -63,22 +63,22 @@ namespace Game.Chat handler.SendSysMessage(CypherStrings.NpcinfoHealth, target.GetCreateHealth(), target.GetMaxHealth(), target.GetHealth()); handler.SendSysMessage(CypherStrings.NpcinfoInhabitType, cInfo.InhabitType); - handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags, target.GetUInt32Value(UnitFields.Flags)); - foreach (uint value in Enum.GetValues(typeof(UnitFlags))) - if (target.GetUInt32Value(UnitFields.Flags).HasAnyFlag(value)) + handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags, target.m_unitData.Flags); + foreach (UnitFlags value in Enum.GetValues(typeof(UnitFlags))) + if (target.HasUnitFlag(value)) handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags)value, value); - handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags2, target.GetUInt32Value(UnitFields.Flags2)); - foreach (uint value in Enum.GetValues(typeof(UnitFlags2))) - if (target.GetUInt32Value(UnitFields.Flags2).HasAnyFlag(value)) + handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags2, target.m_unitData.Flags2); + foreach (UnitFlags2 value in Enum.GetValues(typeof(UnitFlags2))) + if (target.HasUnitFlag2(value)) handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags2)value, value); - handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags3, target.GetUInt32Value(UnitFields.Flags3)); - foreach (uint value in Enum.GetValues(typeof(UnitFlags3))) - if (target.GetUInt32Value(UnitFields.Flags3).HasAnyFlag(value)) + handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags3, target.m_unitData.Flags3); + foreach (UnitFlags3 value in Enum.GetValues(typeof(UnitFlags3))) + if (target.HasUnitFlag3(value)) handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags3)value, value); - handler.SendSysMessage(CypherStrings.NpcinfoDynamicFlags, target.GetUInt32Value(ObjectFields.DynamicFlags)); + handler.SendSysMessage(CypherStrings.NpcinfoDynamicFlags, target.GetDynamicFlags()); handler.SendSysMessage(CypherStrings.CommandRawpawntimes, defRespawnDelayStr, curRespawnDelayStr); handler.SendSysMessage(CypherStrings.NpcinfoLoot, cInfo.LootId, cInfo.PickPocketId, cInfo.SkinLootId); handler.SendSysMessage(CypherStrings.NpcinfoDungeonId, target.GetInstanceId()); @@ -243,7 +243,7 @@ namespace Game.Chat return false; } - target.SetUInt32Value(UnitFields.NpcEmotestate, emote); + target.SetEmoteState((Emote)emote); return true; } @@ -402,13 +402,13 @@ namespace Game.Chat uint level = (creatureTarget.getLevel() < (player.getLevel() - 5)) ? (player.getLevel() - 5) : creatureTarget.getLevel(); // prepare visual effect for levelup - pet.SetUInt32Value(UnitFields.Level, level - 1); + pet.SetLevel(level - 1); // add to world pet.GetMap().AddToMap(pet.ToCreature()); // visual effect for levelup - pet.SetUInt32Value(UnitFields.Level, level); + pet.SetLevel(level); // caster have pet now player.SetMinion(pet, true); @@ -685,7 +685,8 @@ namespace Game.Chat return false; } - creature.SetUInt64Value(UnitFields.NpcFlags, npcFlags); + creature.SetNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF)); + creature.SetNpcFlags2((NPCFlags2)(npcFlags >> 32)); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_NPCFLAG); stmt.AddValue(0, npcFlags); diff --git a/Source/Game/Chat/Commands/PetCommands.cs b/Source/Game/Chat/Commands/PetCommands.cs index f852490b2..c15243c96 100644 --- a/Source/Game/Chat/Commands/PetCommands.cs +++ b/Source/Game/Chat/Commands/PetCommands.cs @@ -63,8 +63,8 @@ namespace Game.Chat creatureTarget.RemoveCorpse(); creatureTarget.SetHealth(0); // just for nice GM-mode view - pet.SetGuidValue(UnitFields.CreatedBy, player.GetGUID()); - pet.SetUInt32Value(UnitFields.FactionTemplate, player.getFaction()); + pet.SetCreatorGUID(player.GetGUID()); + pet.SetFaction(player.GetFaction()); if (!pet.InitStatsForLevel(creatureTarget.getLevel())) { @@ -74,7 +74,7 @@ namespace Game.Chat } // prepare visual effect for levelup - pet.SetUInt32Value(UnitFields.Level, creatureTarget.getLevel() - 1); + pet.SetLevel(creatureTarget.getLevel() - 1); pet.GetCharmInfo().SetPetNumber(Global.ObjectMgr.GeneratePetNumber(), true); // this enables pet details window (Shift+P) @@ -84,7 +84,7 @@ namespace Game.Chat pet.GetMap().AddToMap(pet.ToCreature()); // visual effect for levelup - pet.SetUInt32Value(UnitFields.Level, creatureTarget.getLevel()); + pet.SetLevel(creatureTarget.getLevel()); player.SetMinion(pet, true); pet.SavePetToDB(PetSaveMode.AsCurrent); diff --git a/Source/Game/Chat/Commands/ReloadCommand.cs b/Source/Game/Chat/Commands/ReloadCommand.cs index 9db4740e5..518482d18 100644 --- a/Source/Game/Chat/Commands/ReloadCommand.cs +++ b/Source/Game/Chat/Commands/ReloadCommand.cs @@ -395,12 +395,12 @@ namespace Game.Chat return true; } - [Command("item_enchantment_template", RBACPermissions.CommandReloadItemEnchantmentTemplate, true)] - static bool HandleReloadItemEnchantementsCommand(StringArguments args, CommandHandler handler) + [Command("item_random_bonus_list_template", RBACPermissions.CommandReloadItemRandomBonusListTemplate, true)] + static bool HandleReloadItemRandomBonusListTemplatesCommand(StringArguments args, CommandHandler handler) { - Log.outInfo(LogFilter.Server, "Re-Loading Item Random Enchantments Table..."); - ItemEnchantment.LoadRandomEnchantmentsTable(); - handler.SendGlobalGMSysMessage("DB table `item_enchantment_template` reloaded."); + Log.outInfo(LogFilter.Server, "Re-Loading Random item bonus list definitions..."); + ItemEnchantmentManager.LoadItemRandomBonusListTemplates(); + handler.SendGlobalGMSysMessage("DB table `item_random_bonus_list_template` reloaded."); return true; } @@ -1015,7 +1015,7 @@ namespace Game.Chat static bool HandleReloadAllItemCommand(StringArguments args, CommandHandler handler) { HandleReloadPageTextsCommand(null, handler); - HandleReloadItemEnchantementsCommand(null, handler); + HandleReloadItemRandomBonusListTemplatesCommand(null, handler); return true; } diff --git a/Source/Game/Chat/Commands/ResetCommands.cs b/Source/Game/Chat/Commands/ResetCommands.cs index 100c8d2f3..f5e27b2a9 100644 --- a/Source/Game/Chat/Commands/ResetCommands.cs +++ b/Source/Game/Chat/Commands/ResetCommands.cs @@ -51,8 +51,7 @@ namespace Game.Chat if (!handler.extractPlayerTarget(args, out target)) return false; - target.SetUInt32Value(ActivePlayerFields.Kills, 0); - target.SetUInt32Value(ActivePlayerFields.LifetimeHonorableKills, 0); + target.ResetHonorStats(); target.UpdateCriteria(CriteriaTypes.EarnHonorableKill); return true; @@ -74,18 +73,18 @@ namespace Game.Chat player.SetShapeshiftForm(ShapeShiftForm.None); player.setFactionForRace(player.GetRace()); - player.SetUInt32Value(UnitFields.DisplayPower, (uint)powerType); + player.SetPowerType(powerType); // reset only if player not in some form; if (player.GetShapeshiftForm() == ShapeShiftForm.None) player.InitDisplayIds(); - player.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (byte)UnitBytes2Flags.PvP); + player.SetPvpFlags(UnitPVPStateFlags.PvP); - player.SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); + player.SetUnitFlags(UnitFlags.PvpAttackable); //-1 is default value - player.SetUInt32Value(ActivePlayerFields.WatchedFactionIndex, 0xFFFFFFFF); + player.SetWatchedFactionIndex(0xFFFFFFFF); return true; } @@ -110,7 +109,7 @@ namespace Game.Chat target.InitStatsForLevel(true); target.InitTaxiNodesForLevel(); target.InitTalentForLevel(); - target.SetUInt32Value(ActivePlayerFields.Xp, 0); + target.SetXP(0); target._ApplyAllLevelScaleItemMods(true); diff --git a/Source/Game/Chat/Commands/TitleCommands.cs b/Source/Game/Chat/Commands/TitleCommands.cs index 32ffbaf51..d8f874540 100644 --- a/Source/Game/Chat/Commands/TitleCommands.cs +++ b/Source/Game/Chat/Commands/TitleCommands.cs @@ -62,7 +62,7 @@ namespace Game.Chat.Commands string tNameLink = handler.GetNameLink(target); target.SetTitle(titleInfo); // to be sure that title now known - target.SetUInt32Value(PlayerFields.ChosenTitle, titleInfo.MaskID); + target.SetChosenTitle(titleInfo.MaskID); handler.SendSysMessage(CypherStrings.TitleCurrentRes, id, (target.GetGender() == Gender.Male ? titleInfo.Name : titleInfo.Name1)[handler.GetSessionDbcLocale()], tNameLink); return true; @@ -150,9 +150,9 @@ namespace Game.Chat.Commands handler.SendSysMessage(CypherStrings.TitleRemoveRes, id, titleNameStr, tNameLink); - if (!target.HasTitle(target.GetUInt32Value(PlayerFields.ChosenTitle))) + if (!target.HasTitle(target.m_playerData.PlayerTitle)) { - target.SetUInt32Value(PlayerFields.ChosenTitle, 0); + target.SetChosenTitle(0); handler.SendSysMessage(CypherStrings.CurrentTitleReset, tNameLink); } @@ -189,12 +189,12 @@ namespace Game.Chat.Commands titles &= ~titles2; // remove not existed titles - target.SetUInt64Value(ActivePlayerFields.KnownTitles, titles); + target.SetKnownTitles(0, titles); handler.SendSysMessage(CypherStrings.Done); - if (!target.HasTitle(target.GetUInt32Value(PlayerFields.ChosenTitle))) + if (!target.HasTitle(target.m_playerData.PlayerTitle)) { - target.SetUInt32Value(PlayerFields.ChosenTitle, 0); + target.SetChosenTitle(0); handler.SendSysMessage(CypherStrings.CurrentTitleReset, handler.GetNameLink(target)); } diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs index 320132aba..6defd27b2 100644 --- a/Source/Game/Conditions/ConditionManager.cs +++ b/Source/Game/Conditions/ConditionManager.cs @@ -1689,7 +1689,7 @@ namespace Game if (condition.Gender >= 0 && (int)player.GetGender() != condition.Gender) return false; - if (condition.NativeGender >= 0 && player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender) != condition.NativeGender) + if (condition.NativeGender >= 0 && player.m_playerData.NativeSex != condition.NativeGender) return false; if (condition.PowerType != -1 && condition.PowerTypeComp != 0) @@ -1701,7 +1701,7 @@ namespace Game if (condition.ChrSpecializationIndex >= 0 || condition.ChrSpecializationRole >= 0) { - ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(player.GetUInt32Value(PlayerFields.CurrentSpecId)); + ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(player.GetPrimarySpecialization()); if (spec != null) { if (condition.ChrSpecializationIndex >= 0 && spec.OrderIndex != condition.ChrSpecializationIndex) @@ -1785,10 +1785,10 @@ namespace Game } } - if (condition.PvpMedal != 0 && !Convert.ToBoolean((1 << (condition.PvpMedal - 1)) & player.GetUInt32Value(ActivePlayerFields.PvpMedals))) + if (condition.PvpMedal != 0 && !Convert.ToBoolean((1 << (condition.PvpMedal - 1)) & player.m_activePlayerData.PvpMedals)) return false; - if (condition.LifetimeMaxPVPRank != 0 && player.GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetLifetimeMaxPvpRank) != condition.LifetimeMaxPVPRank) + if (condition.LifetimeMaxPVPRank != 0 && player.m_activePlayerData.LifetimeMaxRank != condition.LifetimeMaxPVPRank) return false; if (condition.MovementFlags[0] != 0 && !Convert.ToBoolean((uint)player.GetUnitMovementFlags() & condition.MovementFlags[0])) @@ -1841,7 +1841,7 @@ namespace Game { uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(condition.PrevQuestID[i]); if (questBit != 0) - results[i] = (player.GetUInt32Value(ActivePlayerFields.QuestCompleted + (int)((questBit - 1) >> 5)) & (1 << (int)((questBit - 1) & 31))) != 0; + results[i] = (player.m_activePlayerData.QuestCompleted[((int)questBit - 1) >> 6] & (1ul << (((int)questBit - 1) & 63))) != 0; } if (!PlayerConditionLogic(condition.PrevQuestLogic, results)) @@ -1920,7 +1920,7 @@ namespace Game { AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(condition.Explored[i]); if (area != null) - if (area.AreaBit != -1 && !Convert.ToBoolean(player.GetUInt32Value(ActivePlayerFields.ExploredZones + area.AreaBit / 32) & (1 << (area.AreaBit % 32)))) + if (area.AreaBit != -1 && !Convert.ToBoolean(player.m_activePlayerData.ExploredZones[area.AreaBit / 64] & (1ul << ((int)area.AreaBit % 64)))) return false; } } @@ -2014,16 +2014,16 @@ namespace Game } } - if (condition.MinAvgItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel)) < condition.MinAvgItemLevel) + if (condition.MinAvgItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[0]) < condition.MinAvgItemLevel) return false; - if (condition.MaxAvgItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel)) > condition.MaxAvgItemLevel) + if (condition.MaxAvgItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[0]) > condition.MaxAvgItemLevel) return false; - if (condition.MinAvgEquippedItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel + 1)) < condition.MinAvgEquippedItemLevel) + if (condition.MinAvgEquippedItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[1]) < condition.MinAvgEquippedItemLevel) return false; - if (condition.MaxAvgEquippedItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel + 1)) > condition.MaxAvgEquippedItemLevel) + if (condition.MaxAvgEquippedItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[1]) > condition.MaxAvgEquippedItemLevel) return false; if (condition.ModifierTreeID != 0 && !player.ModifierTreeSatisfied(condition.ModifierTreeID)) diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index fa64ef6ca..bc14b12fe 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -76,6 +76,7 @@ namespace Game.DataStorage CinematicCameraStorage = DBReader.Read("CinematicCamera.db2", HotfixStatements.SEL_CINEMATIC_CAMERA); CinematicSequencesStorage = DBReader.Read("CinematicSequences.db2", HotfixStatements.SEL_CINEMATIC_SEQUENCES); ContentTuningStorage = DBReader.Read("ContentTuning.db2", HotfixStatements.SEL_CONTENT_TUNING); + ContentTuningXExpectedStorage = DBReader.Read("ContentTuningXExpected.db2", HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED); ConversationLineStorage = DBReader.Read("ConversationLine.db2", HotfixStatements.SEL_CONVERSATION_LINE); CreatureDisplayInfoStorage = DBReader.Read("CreatureDisplayInfo.db2", HotfixStatements.SEL_CREATURE_DISPLAY_INFO); CreatureDisplayInfoExtraStorage = DBReader.Read("CreatureDisplayInfoExtra.db2", HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA); @@ -153,8 +154,6 @@ namespace Game.DataStorage ItemLimitCategoryConditionStorage = DBReader.Read("ItemLimitCategoryCondition.db2", HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION); ItemModifiedAppearanceStorage = DBReader.Read("ItemModifiedAppearance.db2", HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE); ItemPriceBaseStorage = DBReader.Read("ItemPriceBase.db2", HotfixStatements.SEL_ITEM_PRICE_BASE); - ItemRandomPropertiesStorage = DBReader.Read("ItemRandomProperties.db2", HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES, HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES_LOCALE); - ItemRandomSuffixStorage = DBReader.Read("ItemRandomSuffix.db2", HotfixStatements.SEL_ITEM_RANDOM_SUFFIX, HotfixStatements.SEL_ITEM_RANDOM_SUFFIX_LOCALE); ItemSearchNameStorage = DBReader.Read("ItemSearchName.db2", HotfixStatements.SEL_ITEM_SEARCH_NAME, HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE); ItemSetStorage = DBReader.Read("ItemSet.db2", HotfixStatements.SEL_ITEM_SET, HotfixStatements.SEL_ITEM_SET_LOCALE); ItemSetSpellStorage = DBReader.Read("ItemSetSpell.db2", HotfixStatements.SEL_ITEM_SET_SPELL); @@ -324,13 +323,13 @@ namespace Game.DataStorage } // Check loaded DB2 files proper version - if (!AreaTableStorage.ContainsKey(10048) || // last area added in 8.0.1 (28153) - !CharTitlesStorage.ContainsKey(633) || // last char title added in 8.0.1 (28153) - !GemPropertiesStorage.ContainsKey(3745) || // last gem property added in 8.0.1 (28153) - !ItemStorage.ContainsKey(164760) || // last item added in 8.0.1 (28153) - !ItemExtendedCostStorage.ContainsKey(6448) || // last item extended cost added in 8.0.1 (28153) - !MapStorage.ContainsKey(2103) || // last map added in 8.0.1 (28153) - !SpellNameStorage.ContainsKey(281872)) // last spell added in 8.0.1 (28153) + if (!AreaTableStorage.ContainsKey(10521) || // last area added in 8.0.1 (28153) + !CharTitlesStorage.ContainsKey(649) || // last char title added in 8.0.1 (28153) + !GemPropertiesStorage.ContainsKey(3746) || // last gem property added in 8.0.1 (28153) + !ItemStorage.ContainsKey(168279) || // last item added in 8.0.1 (28153) + !ItemExtendedCostStorage.ContainsKey(6545) || // last item extended cost added in 8.0.1 (28153) + !MapStorage.ContainsKey(2178) || // last map added in 8.0.1 (28153) + !SpellNameStorage.ContainsKey(296952)) // last spell added in 8.0.1 (28153) { Log.outError(LogFilter.Misc, "You have _outdated_ DB2 files. Please extract correct versions from current using client."); Global.WorldMgr.ShutdownServ(10, ShutdownMask.Force, ShutdownExitCode.Error); @@ -420,6 +419,7 @@ namespace Game.DataStorage public static DB6Storage CinematicCameraStorage; public static DB6Storage CinematicSequencesStorage; public static DB6Storage ContentTuningStorage; + public static DB6Storage ContentTuningXExpectedStorage; public static DB6Storage ConversationLineStorage; public static DB6Storage CreatureDisplayInfoStorage; public static DB6Storage CreatureDisplayInfoExtraStorage; @@ -497,8 +497,6 @@ namespace Game.DataStorage public static DB6Storage ItemLimitCategoryConditionStorage; public static DB6Storage ItemModifiedAppearanceStorage; public static DB6Storage ItemPriceBaseStorage; - public static DB6Storage ItemRandomPropertiesStorage; - public static DB6Storage ItemRandomSuffixStorage; public static DB6Storage ItemSearchNameStorage; public static DB6Storage ItemSetStorage; public static DB6Storage ItemSetSpellStorage; @@ -725,6 +723,8 @@ namespace Game.DataStorage return row.Health; case -8: return row.DamageReplaceStat; + case -9: + return row.DamageSecondary; default: break; } diff --git a/Source/Game/DataStorage/ClientReader/DB6Storage.cs b/Source/Game/DataStorage/ClientReader/DB6Storage.cs index 316fac45b..b415ab04b 100644 --- a/Source/Game/DataStorage/ClientReader/DB6Storage.cs +++ b/Source/Game/DataStorage/ClientReader/DB6Storage.cs @@ -232,34 +232,34 @@ namespace Game.DataStorage switch (Type.GetTypeCode(type)) { case TypeCode.Boolean: - buffer.WriteUInt8(fieldInfo.GetValue(entry)); + buffer.WriteUInt8((byte)((bool)fieldInfo.GetValue(entry) ? 1 : 0)); break; case TypeCode.SByte: - buffer.WriteInt8(fieldInfo.GetValue(entry)); + buffer.WriteInt8((sbyte)fieldInfo.GetValue(entry)); break; case TypeCode.Byte: - buffer.WriteUInt8(fieldInfo.GetValue(entry)); + buffer.WriteUInt8((byte)fieldInfo.GetValue(entry)); break; case TypeCode.Int16: - buffer.WriteInt16(fieldInfo.GetValue(entry)); + buffer.WriteInt16((short)fieldInfo.GetValue(entry)); break; case TypeCode.UInt16: - buffer.WriteUInt16(fieldInfo.GetValue(entry)); + buffer.WriteUInt16((ushort)fieldInfo.GetValue(entry)); break; case TypeCode.Int32: - buffer.WriteInt32(fieldInfo.GetValue(entry)); + buffer.WriteInt32((int)fieldInfo.GetValue(entry)); break; case TypeCode.UInt32: - buffer.WriteUInt32(fieldInfo.GetValue(entry)); + buffer.WriteUInt32((uint)fieldInfo.GetValue(entry)); break; case TypeCode.Int64: - buffer.WriteInt64(fieldInfo.GetValue(entry)); + buffer.WriteInt64((long)fieldInfo.GetValue(entry)); break; case TypeCode.UInt64: - buffer.WriteUInt64(fieldInfo.GetValue(entry)); + buffer.WriteUInt64((ulong)fieldInfo.GetValue(entry)); break; case TypeCode.Single: - buffer.WriteFloat(fieldInfo.GetValue(entry)); + buffer.WriteFloat((float)fieldInfo.GetValue(entry)); break; case TypeCode.Object: switch (type.Name) @@ -294,34 +294,34 @@ namespace Game.DataStorage switch (Type.GetTypeCode(type)) { case TypeCode.Boolean: - buffer.WriteUInt8(array.GetValue(i)); + buffer.WriteUInt8((byte)((bool)array.GetValue(i) ? 1 : 0)); break; case TypeCode.SByte: - buffer.WriteInt8(array.GetValue(i)); + buffer.WriteInt8((sbyte)array.GetValue(i)); break; case TypeCode.Byte: - buffer.WriteUInt8(array.GetValue(i)); + buffer.WriteUInt8((byte)array.GetValue(i)); break; case TypeCode.Int16: - buffer.WriteInt16(array.GetValue(i)); + buffer.WriteInt16((short)array.GetValue(i)); break; case TypeCode.UInt16: - buffer.WriteUInt16(array.GetValue(i)); + buffer.WriteUInt16((ushort)array.GetValue(i)); break; case TypeCode.Int32: - buffer.WriteInt32(array.GetValue(i)); + buffer.WriteInt32((int)array.GetValue(i)); break; case TypeCode.UInt32: - buffer.WriteUInt32(array.GetValue(i)); + buffer.WriteUInt32((uint)array.GetValue(i)); break; case TypeCode.Int64: - buffer.WriteInt64(array.GetValue(i)); + buffer.WriteInt64((long)array.GetValue(i)); break; case TypeCode.UInt64: - buffer.WriteUInt64(array.GetValue(i)); + buffer.WriteUInt64((ulong)array.GetValue(i)); break; case TypeCode.Single: - buffer.WriteFloat(array.GetValue(i)); + buffer.WriteFloat((float)array.GetValue(i)); break; case TypeCode.String: var str = (string)array.GetValue(i); diff --git a/Source/Game/DataStorage/ClientReader/DBReader.cs b/Source/Game/DataStorage/ClientReader/DBReader.cs index 3dd07bf8c..2672f4114 100644 --- a/Source/Game/DataStorage/ClientReader/DBReader.cs +++ b/Source/Game/DataStorage/ClientReader/DBReader.cs @@ -32,8 +32,8 @@ namespace Game.DataStorage { class DBReader { - private const int HeaderSize = 72 + 1 * 36; - private const uint WDC2FmtSig = 0x32434457; // WDC2 + private const int HeaderSize = 72; + private const uint WDC3FmtSig = 0x33434457; // WDC3 public static DB6Storage Read(string fileName, HotfixStatements preparedStatement, HotfixStatements preparedStatementLocale = 0) where T : new() { @@ -71,7 +71,7 @@ namespace Game.DataStorage { Header = new WDCHeader(); Header.Signature = reader.ReadUInt32(); - if (Header.Signature != WDC2FmtSig) + if (Header.Signature != WDC3FmtSig) return false; Header.RecordCount = reader.ReadUInt32(); @@ -126,28 +126,41 @@ namespace Game.DataStorage } } + long previousStringTableSize = 0; for (int sectionIndex = 0; sectionIndex < Header.SectionsCount; sectionIndex++) { + if (sections[sectionIndex].TactKeyLookup != 0)// && !hasTactKeyFunc(sections[sectionIndex].TactKeyLookup)) + { + previousStringTableSize += sections[sectionIndex].StringTableSize; + //Console.WriteLine("Detected db2 with encrypted section! HasKey {0}", CASC.HasKey(Sections[sectionIndex].TactKeyLookup)); + continue; + } + reader.BaseStream.Position = sections[sectionIndex].FileOffset; byte[] recordsData; Dictionary stringsTable = null; - List> offsetmap = null; + SparseEntry[] sparseEntries = null; + if (!Header.HasOffsetTable()) { // records data recordsData = reader.ReadBytes((int)(sections[sectionIndex].NumRecords * Header.RecordSize)); - Array.Resize(ref recordsData, recordsData.Length + 8); // pad with extra zeros so we don't crash when reading - // string data stringsTable = new Dictionary(); + long stringDataOffset = 0; + if (sectionIndex == 0) + stringDataOffset = (Header.RecordCount - sections[sectionIndex].NumRecords) * Header.RecordSize; + else + stringDataOffset = previousStringTableSize; + for (int i = 0; i < sections[sectionIndex].StringTableSize;) { long oldPos = reader.BaseStream.Position; - stringsTable[oldPos] = reader.ReadCString(); + stringsTable[oldPos + stringDataOffset] = reader.ReadCString(); i += (int)(reader.BaseStream.Position - oldPos); } @@ -159,29 +172,23 @@ namespace Game.DataStorage if (reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset) throw new Exception("reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset"); - - offsetmap = new List>(); - for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++) - { - int offset = reader.ReadInt32(); - short length = reader.ReadInt16(); - - if (offset == 0 || length == 0) - continue; - - offsetmap.Add(new Tuple(offset, length)); - } } + Array.Resize(ref recordsData, recordsData.Length + 8); // pad with extra zeros so we don't crash when reading + // index data int[] indexData = reader.ReadArray((uint)(sections[sectionIndex].IndexDataSize / 4)); + bool isIndexEmpty = Header.HasIndexTable() && indexData.Count(i => i == 0) == sections[sectionIndex].NumRecords; // duplicate rows data Dictionary copyData = new Dictionary(); - for (int i = 0; i < sections[sectionIndex].CopyTableSize / 8; i++) + for (int i = 0; i < sections[sectionIndex].NumCopyRecords; i++) copyData[reader.ReadInt32()] = reader.ReadInt32(); + if (sections[sectionIndex].NumSparseRecords > 0) + sparseEntries = reader.ReadArray((uint)sections[sectionIndex].NumSparseRecords); + // reference data ReferenceData refData = null; @@ -208,24 +215,31 @@ namespace Game.DataStorage }; } + if (sections[sectionIndex].NumSparseRecords > 0) + { + // TODO: use this shit + int[] sparseIndexData = reader.ReadArray((uint)sections[sectionIndex].NumSparseRecords); + + if (Header.HasIndexTable() && indexData.Length != sparseIndexData.Length) + throw new Exception("indexData.Length != sparseIndexData.Length"); + + //indexData = sparseIndexData; + } + BitReader bitReader = new BitReader(recordsData); - for (int i = 0; i < Header.RecordCount; ++i) + for (int i = 0; i < sections[sectionIndex].NumRecords; ++i) { bitReader.Position = 0; - if (offsetmap != null) - bitReader.Offset = offsetmap[i].Item1 - sections[sectionIndex].FileOffset; + if (Header.HasOffsetTable()) + bitReader.Offset = sparseEntries[i].Offset - sections[sectionIndex].FileOffset; else bitReader.Offset = i * (int)Header.RecordSize; bool hasRef = refData.Entries.TryGetValue(i, out int refId); - var rec = new WDC2Row(this, bitReader, sections[sectionIndex].FileOffset, sections[sectionIndex].IndexDataSize != 0 ? indexData[i] : -1, hasRef ? refId : -1, stringsTable); - - if (sections[sectionIndex].IndexDataSize != 0) - _records.Add(indexData[i], rec); - else - _records.Add(rec.Id, rec); + var rec = new WDC3Row(this, bitReader, sections[sectionIndex].FileOffset, Header.HasIndexTable() ? (isIndexEmpty ? i : indexData[i]) : -1, hasRef ? refId : -1, stringsTable); + _records.Add(rec.Id, rec); } foreach (var copyRow in copyData) @@ -234,6 +248,8 @@ namespace Game.DataStorage rec.Id = copyRow.Key; _records.Add(copyRow.Key, rec); } + + previousStringTableSize += sections[sectionIndex].StringTableSize; } } @@ -246,10 +262,10 @@ namespace Game.DataStorage internal Value32[][] PalletData; internal Dictionary[] CommonData; - Dictionary _records = new Dictionary(); + Dictionary _records = new Dictionary(); } - class WDC2Row + class WDC3Row { private BitReader _data; private int _dataOffset; @@ -265,7 +281,7 @@ namespace Game.DataStorage private Dictionary[] _commonData; private Dictionary _stringsTable; - public WDC2Row(DBReader reader, BitReader data, int recordsOffset, int id, int refId, Dictionary stringsTable) + public WDC3Row(DBReader reader, BitReader data, int recordsOffset, int id, int refId, Dictionary stringsTable) { _data = data; _recordsOffset = recordsOffset; @@ -553,9 +569,9 @@ namespace Game.DataStorage return obj; } - public WDC2Row Clone() + public WDC3Row Clone() { - return (WDC2Row)MemberwiseClone(); + return (WDC3Row)MemberwiseClone(); } } @@ -669,14 +685,15 @@ namespace Game.DataStorage [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct SectionHeader { - public long TactKeyLookup; + public ulong TactKeyLookup; public int FileOffset; public int NumRecords; public int StringTableSize; - public int CopyTableSize; public int SparseTableOffset; // CatalogDataOffset, absolute value, {uint offset, ushort size}[MaxId - MinId + 1] public int IndexDataSize; // int indexData[IndexDataSize / 4] public int ParentLookupDataSize; // uint NumRecords, uint minId, uint maxId, {uint id, uint index}[NumRecords], questionable usefulness... + public int NumSparseRecords; + public int NumCopyRecords; } [StructLayout(LayoutKind.Sequential, Pack = 1)] diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index b99974ba3..d0cb33290 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -136,6 +136,13 @@ namespace Game.DataStorage _defaultChrSpecializationsByClass[(uint)chrSpec.ClassID] = chrSpec; } + foreach (ContentTuningXExpectedRecord contentTuningXExpectedStat in CliDB.ContentTuningXExpectedStorage.Values) + { + ExpectedStatModRecord expectedStatMod = CliDB.ExpectedStatModStorage.LookupByKey(contentTuningXExpectedStat.ExpectedStatModID); + if (expectedStatMod != null) + _expectedStatModsByContentTuning.Add(contentTuningXExpectedStat.ContentTuningID, expectedStatMod); + } + foreach (CurvePointRecord curvePoint in CliDB.CurvePointStorage.Values) { if (CliDB.CurveStorage.ContainsKey(curvePoint.CurveID)) @@ -396,6 +403,12 @@ namespace Game.DataStorage CliDB.RulesetItemUpgradeStorage.Clear(); + foreach (SkillLineRecord skill in CliDB.SkillLineStorage.Values) + { + if (skill.ParentSkillLineID != 0) + _skillLinesByParentSkillLine.Add(skill.ParentSkillLineID, skill); + } + foreach (SkillLineAbilityRecord skillLineAbility in CliDB.SkillLineAbilityStorage.Values) _skillLineAbilitiesBySkillupSkill.Add(skillLineAbility.SkillupSkillLineID != 0 ? skillLineAbility.SkillupSkillLineID : skillLineAbility.SkillLine, skillLineAbility); @@ -969,61 +982,93 @@ namespace Game.DataStorage if (expectedStatRecord == null) return 1.0f; - ExpectedStatModRecord[] mods = new ExpectedStatModRecord[3]; - ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(contentTuningId); - if (contentTuning != null) - { - mods[0] = CliDB.ExpectedStatModStorage.LookupByKey(contentTuning.ExpectedStatModID); - mods[1] = CliDB.ExpectedStatModStorage.LookupByKey(contentTuning.DifficultyESMID); - } + ExpectedStatModRecord classMod = null; switch (unitClass) { case Class.Warrior: - mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(4); + classMod = CliDB.ExpectedStatModStorage.LookupByKey(4); break; case Class.Paladin: - mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(2); + classMod = CliDB.ExpectedStatModStorage.LookupByKey(2); break; case Class.Rogue: - mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(3); + classMod = CliDB.ExpectedStatModStorage.LookupByKey(3); break; case Class.Mage: - mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(1); + classMod = CliDB.ExpectedStatModStorage.LookupByKey(1); break; default: break; } + + List contentTuningMods = _expectedStatModsByContentTuning.LookupByKey(contentTuningId); float value = 0.0f; switch (stat) { case ExpectedStatType.CreatureHealth: - value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureHealth * (expectedStatMod != null ? expectedStatMod.CreatureHealthMod : 1.0f)); + value = expectedStatRecord.CreatureHealth; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureHealthMod : 1.0f); + if (classMod != null) + value *= classMod.CreatureHealthMod; break; case ExpectedStatType.PlayerHealth: - value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerHealth * (expectedStatMod != null ? expectedStatMod.PlayerHealthMod : 1.0f)); + value = expectedStatRecord.PlayerHealth; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerHealthMod : 1.0f); + if (classMod != null) + value *= classMod.PlayerHealthMod; break; case ExpectedStatType.CreatureAutoAttackDps: - value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureAutoAttackDps * (expectedStatMod != null ? expectedStatMod.CreatureAutoAttackDPSMod : 1.0f)); + value = expectedStatRecord.CreatureAutoAttackDps; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureAutoAttackDPSMod : 1.0f); + if (classMod != null) + value *= classMod.CreatureAutoAttackDPSMod; break; case ExpectedStatType.CreatureArmor: - value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureArmor * (expectedStatMod != null ? expectedStatMod.CreatureArmorMod : 1.0f)); + value = expectedStatRecord.CreatureArmor; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureArmorMod : 1.0f); + if (classMod != null) + value *= classMod.CreatureArmorMod; break; case ExpectedStatType.PlayerMana: - value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerMana * (expectedStatMod != null ? expectedStatMod.PlayerManaMod : 1.0f)); + value = expectedStatRecord.PlayerMana; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerManaMod : 1.0f); + if (classMod != null) + value *= classMod.PlayerManaMod; break; case ExpectedStatType.PlayerPrimaryStat: - value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerPrimaryStat * (expectedStatMod != null ? expectedStatMod.PlayerPrimaryStatMod : 1.0f)); + value = expectedStatRecord.PlayerPrimaryStat; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerPrimaryStatMod : 1.0f); + if (classMod != null) + value *= classMod.PlayerPrimaryStatMod; break; case ExpectedStatType.PlayerSecondaryStat: - value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerSecondaryStat * (expectedStatMod != null ? expectedStatMod.PlayerSecondaryStatMod : 1.0f)); + value = expectedStatRecord.PlayerSecondaryStat; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerSecondaryStatMod : 1.0f); + if (classMod != null) + value *= classMod.PlayerSecondaryStatMod; break; case ExpectedStatType.ArmorConstant: - value = mods.Sum(expectedStatMod => expectedStatRecord.ArmorConstant * (expectedStatMod != null ? expectedStatMod.ArmorConstantMod : 1.0f)); + value = expectedStatRecord.ArmorConstant; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.ArmorConstantMod : 1.0f); + if (classMod != null) + value *= classMod.ArmorConstantMod; break; case ExpectedStatType.None: break; case ExpectedStatType.CreatureSpellDamage: - value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureSpellDamage * (expectedStatMod != null ? expectedStatMod.CreatureSpellDamageMod : 1.0f)); + value = expectedStatRecord.CreatureSpellDamage; + if (contentTuningMods != null) + value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureSpellDamageMod : 1.0f); + if (classMod != null) + value *= classMod.CreatureSpellDamageMod; break; default: break; @@ -1479,6 +1524,11 @@ namespace Game.DataStorage return _rulesetItemUpgrade.LookupByKey(itemId); } + public List GetSkillLinesForParentSkill(uint parentSkillId) + { + return _skillLinesByParentSkillLine.LookupByKey(parentSkillId); + } + public List GetSkillLineAbilitiesBySkill(uint skillId) { return _skillLineAbilitiesBySkillupSkill.LookupByKey(skillId); @@ -1903,6 +1953,7 @@ namespace Game.DataStorage MultiMap _curvePoints = new MultiMap(); Dictionary, EmotesTextSoundRecord> _emoteTextSounds = new Dictionary, EmotesTextSoundRecord>(); Dictionary, ExpectedStatRecord> _expectedStatsByLevel = new Dictionary, ExpectedStatRecord>(); + MultiMap _expectedStatModsByContentTuning = new MultiMap(); MultiMap _factionTeams = new MultiMap(); Dictionary _heirlooms = new Dictionary(); MultiMap _glyphBindableSpells = new MultiMap(); @@ -1933,6 +1984,7 @@ namespace Game.DataStorage MultiMap _rewardPackCurrencyTypes = new MultiMap(); MultiMap _rewardPackItems = new MultiMap(); Dictionary _rulesetItemUpgrade = new Dictionary(); + MultiMap _skillLinesByParentSkillLine = new MultiMap(); MultiMap _skillLineAbilitiesBySkillupSkill = new MultiMap(); MultiMap _skillRaceClassInfoBySkill = new MultiMap(); MultiMap _specializationSpellsBySpec = new MultiMap(); diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs index 5d581a647..48fbf6eb4 100644 --- a/Source/Game/DataStorage/Structs/A_Records.cs +++ b/Source/Game/DataStorage/Structs/A_Records.cs @@ -36,6 +36,7 @@ namespace Game.DataStorage public AchievementFlags Flags; public ushort UiOrder; public uint IconFileID; + public int RewardItemID; public uint CriteriaTree; public ushort SharesCriteria; } @@ -43,9 +44,9 @@ namespace Game.DataStorage public sealed class AnimationDataRecord { public uint Id; - public ushort Fallback; + public ushort BehaviorID; public byte BehaviorTier; - public int BehaviorID; + public int Fallback; public int[] Flags = new int[2]; } @@ -161,6 +162,7 @@ namespace Game.DataStorage public uint UiAltItemAppearanceID; public byte Flags; public ushort UiCameraID; + public uint UsablePlayerConditionID; } public sealed class ArtifactAppearanceSetRecord diff --git a/Source/Game/DataStorage/Structs/B_Records.cs b/Source/Game/DataStorage/Structs/B_Records.cs index 3b0ea5db7..7e5095299 100644 --- a/Source/Game/DataStorage/Structs/B_Records.cs +++ b/Source/Game/DataStorage/Structs/B_Records.cs @@ -36,7 +36,7 @@ namespace Game.DataStorage public string DisplayName; public string Description; public uint Id; - public byte Type; // value 0 -> hair, value 2 -> facialhair + public byte Type; // value 0 . hair, value 2 . facialhair public float CostModifier; public byte Race; public byte Sex; @@ -76,7 +76,7 @@ namespace Game.DataStorage public sealed class BattlePetSpeciesStateRecord { public uint Id; - public byte BattlePetStateID; + public ushort BattlePetStateID; public int Value; public uint BattlePetSpeciesID; } diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index 5aea61d2d..4f81a5247 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -102,6 +102,7 @@ namespace Game.DataStorage public uint IconFileDataID; public uint LowResScreenFileDataID; public int StartingLevel; + public uint SpellTextureBlobFileDataID; public ushort Flags; public ushort CinematicSequenceID; public ushort DefaultSpec; @@ -214,8 +215,14 @@ namespace Game.DataStorage public int MinLevel; public int MaxLevel; public int Flags; + public int ExpansionID; + } + + public sealed class ContentTuningXExpectedRecord + { + public uint Id; public int ExpectedStatModID; - public int DifficultyESMID; + public uint ContentTuningID; } public sealed class ConversationLineRecord @@ -322,6 +329,9 @@ namespace Game.DataStorage public float OverrideNameScale; public float OverrideSelectionRadius; public float TamedPetBaseScale; + public sbyte Unknown820_1; // scale related + public float Unknown820_2; // scale related + public float[] Unknown820_3 = new float[2]; // scale related } public sealed class CreatureTypeRecord @@ -373,6 +383,7 @@ namespace Game.DataStorage public uint Flags; public sbyte Quality; public int FactionID; + public int ItemGroupSoundsID; } public sealed class CurveRecord diff --git a/Source/Game/DataStorage/Structs/D_Records.cs b/Source/Game/DataStorage/Structs/D_Records.cs index b75732fa1..ca543a138 100644 --- a/Source/Game/DataStorage/Structs/D_Records.cs +++ b/Source/Game/DataStorage/Structs/D_Records.cs @@ -71,10 +71,12 @@ namespace Game.DataStorage public short MapID; public sbyte DifficultyID; public int OrderIndex; + public int CompleteWorldStateID; public sbyte Bit; public int CreatureDisplayID; public byte Flags; public int SpellIconFileID; + public int Faction; } public sealed class DurabilityCostsRecord diff --git a/Source/Game/DataStorage/Structs/F_Records.cs b/Source/Game/DataStorage/Structs/F_Records.cs index 8dc2d2146..3d09d8bb2 100644 --- a/Source/Game/DataStorage/Structs/F_Records.cs +++ b/Source/Game/DataStorage/Structs/F_Records.cs @@ -29,7 +29,7 @@ namespace Game.DataStorage public short ReputationIndex; public ushort ParentFactionID; public byte Expansion; - public byte FriendshipRepID; + public uint FriendshipRepID; public byte Flags; public ushort ParagonFactionID; public short[] ReputationClassMask = new short[4]; diff --git a/Source/Game/DataStorage/Structs/G_Records.cs b/Source/Game/DataStorage/Structs/G_Records.cs index cc4dab3b2..6e3bf31e1 100644 --- a/Source/Game/DataStorage/Structs/G_Records.cs +++ b/Source/Game/DataStorage/Structs/G_Records.cs @@ -131,8 +131,8 @@ namespace Game.DataStorage public int AllianceCreatureID; public byte HordeGarrFollRaceID; public byte AllianceGarrFollRaceID; - public byte HordeGarrClassSpecID; - public byte AllianceGarrClassSpecID; + public uint HordeGarrClassSpecID; + public uint AllianceGarrClassSpecID; public byte Quality; public byte FollowerLevel; public ushort ItemLevelWeapon; @@ -232,9 +232,9 @@ namespace Game.DataStorage { public uint Id; public uint SpellID; - public ushort SpellIconID; public byte GlyphType; public byte GlyphExclusiveCategoryID; + public uint SpellIconID; } public sealed class GlyphRequiredSpecRecord diff --git a/Source/Game/DataStorage/Structs/GameTablesRecords.cs b/Source/Game/DataStorage/Structs/GameTablesRecords.cs index 089e5b04f..4aeadb18a 100644 --- a/Source/Game/DataStorage/Structs/GameTablesRecords.cs +++ b/Source/Game/DataStorage/Structs/GameTablesRecords.cs @@ -166,6 +166,7 @@ namespace Game.DataStorage public float Gem3; public float Health; public float DamageReplaceStat; + public float DamageSecondary; } public sealed class GtXpRecord diff --git a/Source/Game/DataStorage/Structs/H_Records.cs b/Source/Game/DataStorage/Structs/H_Records.cs index 64e647a0e..1f2f2651f 100644 --- a/Source/Game/DataStorage/Structs/H_Records.cs +++ b/Source/Game/DataStorage/Structs/H_Records.cs @@ -29,8 +29,8 @@ namespace Game.DataStorage public sbyte SourceTypeEnum; public byte Flags; public int LegacyItemID; - public int[] UpgradeItemID = new int[3]; - public ushort[] UpgradeItemBonusListID = new ushort[3]; + public int[] UpgradeItemID = new int[4]; + public ushort[] UpgradeItemBonusListID = new ushort[4]; } public sealed class HolidaysRecord diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs index 3d2b16da5..888913156 100644 --- a/Source/Game/DataStorage/Structs/I_Records.cs +++ b/Source/Game/DataStorage/Structs/I_Records.cs @@ -102,16 +102,33 @@ namespace Game.DataStorage public uint Id; public int[] Value = new int[3]; public ushort ParentItemBonusListID; - public ItemBonusType Type; + public ItemBonusType BonusType; public byte OrderIndex; } + public sealed class ItemBonusListGroupEntryRecord + { + public uint Id; + public int ItemBonusListID; + public int ItemLevelSelectorID; + public int OrderIndex; + public int ItemExtendedCostID; + public int ItemBonusListGroupID; + } + public sealed class ItemBonusListLevelDeltaRecord { public short ItemLevelDelta; public uint Id; } + public sealed class ItemBonusSequenceSpellRecord + { + public uint Id; + public int SpellID; + public int ItemID; + } + public sealed class ItemBonusTreeNodeRecord { public uint Id; @@ -125,9 +142,9 @@ namespace Game.DataStorage public sealed class ItemChildEquipmentRecord { public uint Id; + public uint ParentItemID; public uint ChildItemID; public byte ChildItemEquipSlot; - public uint ParentItemID; } public sealed class ItemClassRecord @@ -206,6 +223,7 @@ namespace Game.DataStorage public uint Id; public ushort MinItemLevel; public ushort ItemLevelSelectorQualitySetID; + public ushort AzeriteUnlockMappingSet; } public sealed class ItemLevelSelectorQualityRecord @@ -257,21 +275,6 @@ namespace Game.DataStorage public float Weapon; } - public sealed class ItemRandomPropertiesRecord - { - public uint Id; - public LocalizedString Name; - public ushort[] Enchantment = new ushort[ItemConst.MaxItemRandomProperties]; - } - - public sealed class ItemRandomSuffixRecord - { - public uint Id; - public LocalizedString Name; - public ushort[] Enchantment = new ushort[ItemConst.MaxItemRandomProperties]; - public ushort[] AllocationPct = new ushort[ItemConst.MaxItemRandomProperties]; - } - public sealed class ItemSearchNameRecord { public long AllowableRace; @@ -345,8 +348,6 @@ namespace Game.DataStorage public ushort InstanceBound; public ushort ZoneBound; public ushort ItemSet; - public ushort ItemRandomSuffixGroupID; - public ushort RandomSelect; public ushort LockID; public ushort StartQuestID; public ushort PageID; diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs index acda4b90d..01fc91f2e 100644 --- a/Source/Game/DataStorage/Structs/M_Records.cs +++ b/Source/Game/DataStorage/Structs/M_Records.cs @@ -50,6 +50,7 @@ namespace Game.DataStorage public byte MaxPlayers; public short WindSettingsID; public int ZmpFileDataID; + public int WdtFileDataID; public MapFlags[] Flags = new MapFlags[2]; // Helpers @@ -95,14 +96,14 @@ namespace Game.DataStorage { public uint Id; public LocalizedString Message; // m_message_lang (text showed when transfer to map failed) - public uint ItemContextPickerID; - public int ContentTuningID; - public byte DifficultyID; - public byte LockID; + public uint DifficultyID; + public int LockID; public byte ResetInterval; - public byte MaxPlayers; - public byte ItemContext; - public byte Flags; + public uint MaxPlayers; + public int ItemContext; + public uint ItemContextPickerID; + public int Flags; + public int ContentTuningID; public uint MapID; public uint GetRaidDuration() @@ -121,7 +122,7 @@ namespace Game.DataStorage public uint Parent; public sbyte Operator; public sbyte Amount; - public byte Type; + public uint Type; public uint Asset; public int SecondaryAsset; public sbyte TertiaryAsset; @@ -154,6 +155,7 @@ namespace Game.DataStorage public uint ReqSpellKnownID; public uint ModSpellAuraID; public short ReqMapID; + public int PlayerConditionID; } public sealed class MountTypeXCapabilityRecord diff --git a/Source/Game/DataStorage/Structs/R_Records.cs b/Source/Game/DataStorage/Structs/R_Records.cs index c3dacd4fd..3e6634561 100644 --- a/Source/Game/DataStorage/Structs/R_Records.cs +++ b/Source/Game/DataStorage/Structs/R_Records.cs @@ -21,6 +21,7 @@ namespace Game.DataStorage { public uint Id; public int DamageReplaceStat; + public int DamageSecondary; public uint[] Epic = new uint[5]; public uint[] Superior = new uint[5]; public uint[] Good = new uint[5]; diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs index 64f1d949d..93281ad60 100644 --- a/Source/Game/DataStorage/Structs/S_Records.cs +++ b/Source/Game/DataStorage/Structs/S_Records.cs @@ -139,7 +139,7 @@ namespace Game.DataStorage public sealed class SoundKitRecord { public uint Id; - public byte SoundType; + public uint SoundType; public float VolumeFloat; public ushort Flags; public float MinDistance; @@ -331,9 +331,9 @@ namespace Game.DataStorage public string HordeName; public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects]; public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects]; + public uint TransmogPlayerConditionID; public uint TransmogCost; public uint IconFileDataID; - public uint TransmogPlayerConditionID; public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects]; public ushort ItemVisual; public EnchantmentSlotMask Flags; @@ -392,6 +392,7 @@ namespace Game.DataStorage public float MinDuration; public uint SpellIconFileDataID; public uint ActiveIconFileDataID; + public uint ContentTuningID; public int[] Attributes = new int[14]; public uint SpellID; } diff --git a/Source/Game/DataStorage/Structs/T_Records.cs b/Source/Game/DataStorage/Structs/T_Records.cs index 93a6f4afa..76cd67dea 100644 --- a/Source/Game/DataStorage/Structs/T_Records.cs +++ b/Source/Game/DataStorage/Structs/T_Records.cs @@ -48,10 +48,11 @@ namespace Game.DataStorage public Vector2 FlightMapOffset; public uint Id; public ushort ContinentID; - public ushort ConditionID; + public uint ConditionID; public ushort CharacterBitNumber; public TaxiNodeFlags Flags; public int UiTextureKitID; + public int MinimapAtlasMemberID; public float Facing; public uint SpecialIconConditionID; public uint VisibilityConditionID; @@ -75,8 +76,8 @@ namespace Game.DataStorage public ushort ContinentID; public TaxiPathNodeFlags Flags; public uint Delay; - public ushort ArrivalEventID; - public ushort DepartureEventID; + public uint ArrivalEventID; + public uint DepartureEventID; } public sealed class TotemCategoryRecord @@ -112,7 +113,9 @@ namespace Game.DataStorage public uint TransmogSetGroupID; public int ItemNameDescriptionID; public ushort ParentTransmogSetID; + public byte Unknown810; public byte ExpansionID; + public int PatchID; public short UiOrder; } diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs index 395820875..5bf83d9f0 100644 --- a/Source/Game/DataStorage/Structs/U_Records.cs +++ b/Source/Game/DataStorage/Structs/U_Records.cs @@ -58,6 +58,8 @@ namespace Game.DataStorage public int ParentUiMapID; public int OrderIndex; public int ChildUiMapID; + public int OverrideHighlightFileDataID; + public int OverrideHighlightAtlasID; } public sealed class UiMapXMapArtRecord diff --git a/Source/Game/DataStorage/Structs/W_Records.cs b/Source/Game/DataStorage/Structs/W_Records.cs index 18b67d270..3967026e7 100644 --- a/Source/Game/DataStorage/Structs/W_Records.cs +++ b/Source/Game/DataStorage/Structs/W_Records.cs @@ -44,7 +44,7 @@ namespace Game.DataStorage public uint Id; public uint QuestFeedbackEffectID; public byte WhenToDisplay; - public byte TargetType; + public int TargetType; public int TargetAsset; public uint PlayerConditionID; public ushort CombatConditionID; diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 5c3f1d77a..3e67b3764 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -26,6 +26,7 @@ using System; using System.Collections.Generic; using Game; using Framework.Dynamic; +using Game.Network; namespace Game.Entities { @@ -42,7 +43,7 @@ namespace Game.Entities m_updateFlag.Stationary = true; m_updateFlag.AreaTrigger = true; - valuesCount = (int)AreaTriggerFields.End; + m_areaTriggerData = new AreaTriggerFieldData(); _spline = new Spline(); } @@ -114,19 +115,35 @@ namespace Game.Entities SetObjectScale(1.0f); - SetGuidValue(AreaTriggerFields.Caster, caster.GetGUID()); - SetGuidValue(AreaTriggerFields.CreatingEffectGuid, castId); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID()); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId); - SetUInt32Value(AreaTriggerFields.SpellId, spell.Id); - SetUInt32Value(AreaTriggerFields.SpellForVisuals, spell.Id); - SetUInt32Value(AreaTriggerFields.SpellXSpellVisualId, spellXSpellVisualId); - SetUInt32Value(AreaTriggerFields.TimeToTargetScale, GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : GetUInt32Value(AreaTriggerFields.Duration)); - SetFloatValue(AreaTriggerFields.BoundsRadius2d, GetTemplate().MaxSearchRadius); - SetUInt32Value(AreaTriggerFields.DecalPropertiesId, GetMiscTemplate().DecalPropertiesId); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellID), spell.Id); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellXSpellVisualID), spellXSpellVisualId); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : m_areaTriggerData.Duration); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetTemplate().MaxSearchRadius); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetMiscTemplate().DecalPropertiesId); + + ScaleCurve extraScaleCurve = m_areaTriggerData.ModifyValue(m_areaTriggerData.ExtraScaleCurve); + + if (GetMiscTemplate().ExtraScale.Structured.StartTimeOffset != 0) + SetUpdateFieldValue(ref extraScaleCurve.StartTimeOffset, GetMiscTemplate().ExtraScale.Structured.StartTimeOffset); + if (GetMiscTemplate().ExtraScale.Structured.X != 0 || GetMiscTemplate().ExtraScale.Structured.Y != 0) + { + Vector2 point = new Vector2(GetMiscTemplate().ExtraScale.Structured.X, GetMiscTemplate().ExtraScale.Structured.Y); + SetUpdateFieldValue(ref extraScaleCurve.Points[0], point); + } + if (GetMiscTemplate().ExtraScale.Structured.Z != 0 || GetMiscTemplate().ExtraScale.Structured.W != 0) + { + Vector2 point = new Vector2(GetMiscTemplate().ExtraScale.Structured.Z, GetMiscTemplate().ExtraScale.Structured.W); + SetUpdateFieldValue(ref extraScaleCurve.Points[1], point); + } + if (GetMiscTemplate().ExtraScale.Raw.Data[5] != 0) + SetUpdateFieldValue(ref extraScaleCurve.ParameterCurve, GetMiscTemplate().ExtraScale.Raw.Data[5]); + if (GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0) + SetUpdateFieldValue(ref extraScaleCurve.OverrideActive, GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0 ? true : false); - for (byte scaleCurveIndex = 0; scaleCurveIndex < SharedConst.MaxAreatriggerScale; ++scaleCurveIndex) - if (GetMiscTemplate().ExtraScale.Raw.Data[scaleCurveIndex] != 0) - SetUInt32Value(AreaTriggerFields.ExtraScaleCurve + scaleCurveIndex, (uint)GetMiscTemplate().ExtraScale.Raw.Data[scaleCurveIndex]); PhasingHandler.InheritPhaseShift(this, caster); @@ -137,7 +154,7 @@ namespace Game.Entities UpdateShape(); - uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : GetUInt32Value(AreaTriggerFields.Duration); + uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : m_areaTriggerData.Duration; if (GetTemplate().HasFlag(AreaTriggerFlags.HasCircularMovement)) { @@ -234,7 +251,7 @@ namespace Game.Entities _totalDuration = newDuration; // negative duration (permanent areatrigger) sent as 0 - SetUInt32Value(AreaTriggerFields.Duration, (uint)Math.Max(newDuration, 0)); + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Duration), (uint)Math.Max(newDuration, 0)); } void _UpdateDuration(int newDuration) @@ -242,7 +259,8 @@ namespace Game.Entities _duration = newDuration; // should be sent in object create packets only - updateValues[(int)AreaTriggerFields.Duration].SignedValue = _duration; + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Duration), (uint)_duration); + m_areaTriggerData.ClearChanged(m_areaTriggerData.Duration); } float GetProgress() @@ -619,7 +637,8 @@ namespace Game.Entities _spline.initLengths(); // should be sent in object create packets only - updateValues[(int)AreaTriggerFields.TimeToTarget].UnsignedValue = timeToTarget; + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); + m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); if (IsInWorld) { @@ -648,7 +667,8 @@ namespace Game.Entities Cypher.Assert(cmi.Center.HasValue || cmi.PathTarget.HasValue); // should be sent in object create packets only - updateValues[(int)AreaTriggerFields.TimeToTarget].UnsignedValue = timeToTarget; + SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); + m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); _circularMovementInfo.Set(cmi); @@ -822,6 +842,41 @@ namespace Game.Entities _ai = null; } + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt8((byte)flags); + m_objectData.WriteCreate(buffer, flags, this, target); + m_areaTriggerData.WriteCreate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.AreaTrigger)) + m_areaTriggerData.WriteUpdate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_areaTriggerData); + base.ClearUpdateMask(remove); + } + AreaTriggerAI GetAI() { return _ai; } [System.Diagnostics.Conditional("DEBUG")] @@ -838,11 +893,11 @@ namespace Game.Entities } public bool IsRemoved() { return _isRemoved; } - public uint GetSpellId() { return GetUInt32Value(AreaTriggerFields.SpellId); } + public uint GetSpellId() { return m_areaTriggerData.SpellID; } public AuraEffect GetAuraEffect() { return _aurEff; } public uint GetTimeSinceCreated() { return _timeSinceCreated; } - public uint GetTimeToTarget() { return GetUInt32Value(AreaTriggerFields.TimeToTarget); } - public uint GetTimeToTargetScale() { return GetUInt32Value(AreaTriggerFields.TimeToTargetScale); } + public uint GetTimeToTarget() { return m_areaTriggerData.TimeToTarget; } + public uint GetTimeToTargetScale() { return m_areaTriggerData.TimeToTargetScale; } public int GetDuration() { return _duration; } public int GetTotalDuration() { return _totalDuration; } @@ -852,7 +907,7 @@ namespace Game.Entities public AreaTriggerMiscTemplate GetMiscTemplate() { return _areaTriggerMiscTemplate; } - public ObjectGuid GetCasterGuid() { return GetGuidValue(AreaTriggerFields.Caster); } + public ObjectGuid GetCasterGuid() { return m_areaTriggerData.Caster; } public Vector3 GetRollPitchYaw() { return _rollPitchYaw; } public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; } @@ -863,6 +918,8 @@ namespace Game.Entities public Optional GetCircularMovementInfo() { return _circularMovementInfo; } + AreaTriggerFieldData m_areaTriggerData; + ObjectGuid _targetGuid; AuraEffect _aurEff; diff --git a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs index 5479c1622..a62eacc24 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs @@ -104,10 +104,19 @@ namespace Game.Entities public uint StartTimeOffset; [FieldOffset(4)] - public float[] Points; + public float X; + + [FieldOffset(8)] + public float Y; + + [FieldOffset(12)] + public float Z; + + [FieldOffset(16)] + public float W; [FieldOffset(20)] - public curveparameters CurveParameters; + public uint CurveParameters; [FieldOffset(24)] public uint OverrideActive; diff --git a/Source/Game/Entities/Conversation.cs b/Source/Game/Entities/Conversation.cs index 8f5b2e72e..8fd6d516a 100644 --- a/Source/Game/Entities/Conversation.cs +++ b/Source/Game/Entities/Conversation.cs @@ -20,6 +20,7 @@ using Game.DataStorage; using Game.Maps; using Game.Spells; using System.Collections.Generic; +using Game.Network; namespace Game.Entities { @@ -35,8 +36,7 @@ namespace Game.Entities m_updateFlag.Stationary = true; m_updateFlag.Conversation = true; - valuesCount = (int)ConversationFields.End; - _dynamicValuesCount = (int)ConversationDynamicFields.End; + m_conversationData = new ConversationData(); } public override void AddToWorld() @@ -117,7 +117,7 @@ namespace Game.Entities SetEntry(conversationEntry); SetObjectScale(1.0f); - SetUInt32Value(ConversationFields.LastLineEndTime, conversationTemplate.LastLineEndTime); + SetUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.LastLineEndTime), conversationTemplate.LastLineEndTime); _duration = conversationTemplate.LastLineEndTime; _textureKitId = conversationTemplate.TextureKitId; @@ -126,11 +126,12 @@ namespace Game.Entities ConversationActorTemplate actor = conversationTemplate.Actors[actorIndex]; if (actor != null) { - ConversationDynamicFieldActor actorField = new ConversationDynamicFieldActor(); - actorField.ActorTemplate.CreatureId = actor.CreatureId; - actorField.ActorTemplate.CreatureModelId = actor.CreatureModelId; - actorField.Type = ConversationDynamicFieldActor.ActorType.CreatureActor; - SetDynamicStructuredValue(ConversationDynamicFields.Actors, actorIndex, actorField); + ConversationActor actorField = new ConversationActor(); + actorField.CreatureID = actor.CreatureId; + actorField.CreatureDisplayInfoID = actor.CreatureModelId; + actorField.Type = ConversationActorType.CreatureActor; + + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Actors), actorField); } } @@ -150,17 +151,30 @@ namespace Game.Entities Global.ScriptMgr.OnConversationCreate(this, creator); List actorIndices = new List(); + List lines = new List(); foreach (ConversationLineTemplate line in conversationTemplate.Lines) { actorIndices.Add(line.ActorIdx); - AddDynamicStructuredValue(ConversationDynamicFields.Lines, line); + + ConversationLine lineField = new ConversationLine(); + lineField.ConversationLineID = line.Id; + lineField.StartTime = line.StartTime; + lineField.UiCameraID = line.UiCameraID; + lineField.ActorIndex = line.ActorIdx; + lineField.Flags = line.Flags; + + lines.Add(lineField); } + SetUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Lines), lines); + + Global.ScriptMgr.OnConversationCreate(this, creator); + // All actors need to be set foreach (ushort actorIndex in actorIndices) { - ConversationDynamicFieldActor actor = GetDynamicStructuredValue(ConversationDynamicFields.Actors, actorIndex); - if (actor == null || actor.IsEmpty()) + ConversationActor actor = actorIndex < m_conversationData.Actors.Size() ? m_conversationData.Actors[actorIndex] : null; + if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty())) { Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex})."); return false; @@ -175,10 +189,9 @@ namespace Game.Entities void AddActor(ObjectGuid actorGuid, ushort actorIdx) { - ConversationDynamicFieldActor actorField = new ConversationDynamicFieldActor(); - actorField.ActorGuid = actorGuid; - actorField.Type = ConversationDynamicFieldActor.ActorType.WorldObjectActor; - SetDynamicStructuredValue(ConversationDynamicFields.Actors, actorIdx, actorField); + ConversationActor actorField = m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Actors, actorIdx); + SetUpdateFieldValue(ref actorField.ActorGUID, actorGuid); + SetUpdateFieldValue(ref actorField.Type, ConversationActorType.WorldObjectActor); } void AddParticipant(ObjectGuid participantGuid) @@ -191,6 +204,41 @@ namespace Game.Entities return Global.ConversationDataStorage.GetConversationTemplate(GetEntry()).ScriptId; } + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + m_objectData.WriteCreate(buffer, flags, this, target); + m_conversationData.WriteCreate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteUInt8((byte)flags); + data.WriteBytes(buffer); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.Conversation)) + m_conversationData.WriteUpdate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_conversationData); + base.ClearUpdateMask(remove); + } + uint GetDuration() { return _duration; } public uint GetTextureKitId() { return _textureKitId; } @@ -202,35 +250,12 @@ namespace Game.Entities public override float GetStationaryO() { return _stationaryPosition.GetOrientation(); } void RelocateStationaryPosition(Position pos) { _stationaryPosition.Relocate(pos); } + ConversationData m_conversationData; + Position _stationaryPosition = new Position(); ObjectGuid _creatorGuid; uint _duration; uint _textureKitId; List _participants = new List(); } - - class ConversationDynamicFieldActor - { - public enum ActorType - { - WorldObjectActor = 0, - CreatureActor = 1 - } - - public bool IsEmpty() - { - return ActorGuid.IsEmpty(); // this one is good enough - } - - public ObjectGuid ActorGuid; - public ActorTemplateStruct ActorTemplate; - - public struct ActorTemplateStruct - { - public uint CreatureId; - public uint CreatureModelId; - } - - public ActorType Type; - } } diff --git a/Source/Game/Entities/Corpse.cs b/Source/Game/Entities/Corpse.cs index f8d184882..dda55a057 100644 --- a/Source/Game/Entities/Corpse.cs +++ b/Source/Game/Entities/Corpse.cs @@ -21,6 +21,9 @@ using Game.DataStorage; using Game.Loots; using Game.Maps; using System.Collections.Generic; +using System.Text; +using Framework.Collections; +using Game.Network; namespace Game.Entities { @@ -34,7 +37,7 @@ namespace Game.Entities m_updateFlag.Stationary = true; - valuesCount = (int)CorpseFields.End; + m_corpseData = new CorpseData(); m_time = Time.UnixTime; } @@ -79,7 +82,7 @@ namespace Game.Entities _Create(ObjectGuid.Create(HighGuid.Corpse, owner.GetMapId(), 0, guidlow)); SetObjectScale(1); - SetGuidValue(CorpseFields.Owner, owner.GetGUID()); + SetOwnerGUID(owner.GetGUID()); _cellCoord = GridDefines.ComputeCellCoord(GetPositionX(), GetPositionY()); @@ -94,6 +97,14 @@ namespace Game.Entities SQLTransaction trans = new SQLTransaction(); DeleteFromDB(trans); + StringBuilder items = new StringBuilder(); + for (var i = 0; i < EquipmentSlot.End; ++i) + items.Append($"{m_corpseData.Items[i]} "); + + uint bytes1 = ((uint)m_corpseData.RaceID << 8) | ((uint)m_corpseData.Sex << 16) | ((uint)m_corpseData.SkinID << 24); + uint bytes2 = ((uint)m_corpseData.FaceID) | ((uint)m_corpseData.HairStyleID << 8) | ((uint)m_corpseData.HairColorID << 16) | ((uint)m_corpseData.FacialHairStyleID << 24); + + byte index = 0; PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE); stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // guid @@ -102,14 +113,14 @@ namespace Game.Entities stmt.AddValue(index++, GetPositionZ()); // posZ stmt.AddValue(index++, GetOrientation()); // orientation stmt.AddValue(index++, GetMapId()); // mapId - stmt.AddValue(index++, GetUInt32Value(CorpseFields.DisplayId)); // displayId - stmt.AddValue(index++, _ConcatFields(CorpseFields.Item, EquipmentSlot.End)); // itemCache - stmt.AddValue(index++, GetUInt32Value(CorpseFields.Bytes1)); // bytes1 - stmt.AddValue(index++, GetUInt32Value(CorpseFields.Bytes2)); // bytes2 - stmt.AddValue(index++, GetUInt32Value(CorpseFields.Flags)); // flags - stmt.AddValue(index++, GetUInt32Value(CorpseFields.DynamicFlags)); // dynFlags - stmt.AddValue(index++, (uint)m_time); // time - stmt.AddValue(index++, (uint)GetCorpseType()); // corpseType + stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId + stmt.AddValue(index++, items.ToString()); // itemCache + stmt.AddValue(index++, bytes1); // bytes1 + stmt.AddValue(index++, bytes2); // bytes2 + stmt.AddValue(index++, (uint)m_corpseData.Flags); // flags + stmt.AddValue(index++, (uint)m_corpseData.DynamicFlags); // dynFlags + stmt.AddValue(index++, (uint)m_time); // time + stmt.AddValue(index++, (uint)GetCorpseType()); // corpseType stmt.AddValue(index++, GetInstanceId()); // instanceId trans.Append(stmt); @@ -153,16 +164,24 @@ namespace Game.Entities _Create(ObjectGuid.Create(HighGuid.Corpse, mapId, 0, guid)); SetObjectScale(1.0f); - SetUInt32Value(CorpseFields.DisplayId, field.Read(5)); - _LoadIntoDataField(field.Read(6), (int)CorpseFields.Item, EquipmentSlot.End); - SetUInt32Value(CorpseFields.Bytes1, field.Read(7)); - SetUInt32Value(CorpseFields.Bytes2, field.Read(8)); - SetUInt32Value(CorpseFields.Flags, field.Read(9)); - SetUInt32Value(CorpseFields.DynamicFlags, field.Read(10)); - SetGuidValue(CorpseFields.Owner, ObjectGuid.Create(HighGuid.Player, field.Read(14))); - CharacterInfo characterInfo = Global.WorldMgr.GetCharacterInfo(GetGuidValue(CorpseFields.Owner)); - if (characterInfo != null) - SetUInt32Value(CorpseFields.FactionTemplate, CliDB.ChrRacesStorage.LookupByKey(characterInfo.RaceID).FactionID); + SetDisplayId(field.Read(5)); + StringArray items = new StringArray(field.Read(6), ' '); + for (uint index = 0; index < EquipmentSlot.End; ++index) + SetItem(index, uint.Parse(items[(int)index])); + + uint bytes1 = field.Read(7); + uint bytes2 = field.Read(8); + SetRace((Race)((bytes1 >> 8) & 0xFF)); + SetSex((Gender)((bytes1 >> 16) & 0xFF)); + SetSkin((byte)((bytes1 >> 24) & 0xFF)); + SetFace((byte)(bytes2 & 0xFF)); + SetHairStyle((byte)((bytes2 >> 8) & 0xFF)); + SetHairColor((byte)((bytes2 >> 16) & 0xFF)); + SetFacialHairStyle((byte)((bytes2 >> 24) & 0xFF)); + SetFlags((CorpseFlags)field.Read(9)); + SetCorpseDynamicFlags((CorpseDynFlags)field.Read(10)); + SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read(14))); + SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(m_corpseData.RaceID).FactionID); m_time = field.Read(11); @@ -196,7 +215,60 @@ namespace Game.Entities return m_time < t - 3 * Time.Day; } - public ObjectGuid GetOwnerGUID() { return GetGuidValue(CorpseFields.Owner); } + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + m_objectData.WriteCreate(buffer, flags, this, target); + m_corpseData.WriteCreate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteUInt8((byte)flags); + data.WriteBytes(buffer); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.Corpse)) + m_corpseData.WriteUpdate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_corpseData); + base.ClearUpdateMask(remove); + } + + public void AddCorpseDynamicFlag(CorpseDynFlags dynamicFlags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DynamicFlags), (uint)dynamicFlags); } + public void RemoveCorpseDynamicFlag(CorpseDynFlags dynamicFlags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DynamicFlags), (uint)dynamicFlags); } + public void SetCorpseDynamicFlags(CorpseDynFlags dynamicFlags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DynamicFlags), (uint)dynamicFlags); } + public ObjectGuid GetOwnerGUID() { return m_corpseData.Owner; } + public void SetOwnerGUID(ObjectGuid owner) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Owner), owner); } + public void SetPartyGUID(ObjectGuid partyGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.PartyGUID), partyGuid); } + public void SetGuildGUID(ObjectGuid guildGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.GuildGUID), guildGuid); } + public void SetDisplayId(uint displayId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DisplayID), displayId); } + public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), (byte)race); } + public void SetSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), (byte)sex); } + public void SetSkin(byte skin) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.SkinID), skin); } + public void SetFace(byte face) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FaceID), face); } + public void SetHairStyle(byte hairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairStyleID), hairStyle); } + public void SetHairColor(byte hairColor) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairColorID), hairColor); } + public void SetFacialHairStyle(byte facialHairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FacialHairStyleID), facialHairStyle); } + public void SetFlags(CorpseFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Flags), (uint)flags); } + public void SetFactionTemplate(int factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FactionTemplate), factionTemplate); } + public void SetItem(uint slot, uint item) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Items, (int)slot), item); } + public void SetCustomDisplayOption(uint slot, byte customDisplayOption) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.CustomDisplayOption, (int)slot), customDisplayOption); } public long GetGhostTime() { return m_time; } public void ResetGhostTime() { m_time = Time.UnixTime; } @@ -205,6 +277,8 @@ namespace Game.Entities public CellCoord GetCellCoord() { return _cellCoord; } public void SetCellCoord(CellCoord cellCoord) { _cellCoord = cellCoord; } + public CorpseData m_corpseData; + public Loot loot = new Loot(); public Player lootRecipient; public bool lootForBody; diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 88c387b2a..df0c9e29b 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -46,8 +46,6 @@ namespace Game.Entities m_meleeDamageSchoolMask = SpellSchoolMask.Normal; m_regenTimer = SharedConst.CreatureRegenInterval; - valuesCount = (int)UnitFields.End; - _dynamicValuesCount = (int)UnitDynamicFields.End; m_SightDistance = SharedConst.SightRangeUnit; @@ -192,9 +190,8 @@ namespace Game.Entities m_creatureInfo = cinfo; // map mode related always // equal to player Race field, but creature does not have race - SetByteValue(UnitFields.Bytes0, 0, 0); - - SetByteValue(UnitFields.Bytes0, 1, (byte)cinfo.UnitClass); + SetRace(0); + SetClass((Class)cinfo.UnitClass); // Cancel load if no model defined if (cinfo.GetFirstValidModel() == null) @@ -213,7 +210,7 @@ namespace Game.Entities SetDisplayId(model.CreatureDisplayID, model.DisplayScale); SetNativeDisplayId(model.CreatureDisplayID, model.DisplayScale); - SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); + SetGender((Gender)minfo.gender); // Load creature equipment if (data == null || data.equipmentId == 0) @@ -226,12 +223,12 @@ namespace Game.Entities SetName(normalInfo.Name); // at normal entry always - SetFloatValue(UnitFields.ModCastSpeed, 1.0f); - SetFloatValue(UnitFields.ModCastHaste, 1.0f); - SetFloatValue(UnitFields.ModHaste, 1.0f); - SetFloatValue(UnitFields.ModRangedHaste, 1.0f); - SetFloatValue(UnitFields.ModHasteRegen, 1.0f); - SetFloatValue(UnitFields.ModTimeRate, 1.0f); + SetModCastingSpeed(1.0f); + SetModSpellHaste(1.0f); + SetModHaste(1.0f); + SetModRangedHaste(1.0f); + SetModHasteRegen(1.0f); + SetModTimeRate(1.0f); SetSpeedRate(UnitMoveType.Walk, cinfo.SpeedWalk); SetSpeedRate(UnitMoveType.Run, cinfo.SpeedRun); @@ -240,7 +237,7 @@ namespace Game.Entities SetObjectScale(cinfo.Scale); - SetFloatValue(UnitFields.HoverHeight, cinfo.HoverHeight); + SetHoverHeight(cinfo.HoverHeight); // checked at loading m_defaultMovementType = (MovementGeneratorType)cinfo.MovementType; @@ -273,19 +270,20 @@ namespace Game.Entities ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, data); if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent)) - SetUInt64Value(UnitFields.NpcFlags, npcFlags | Global.GameEventMgr.GetNPCFlag(this)); - else - SetUInt64Value(UnitFields.NpcFlags, npcFlags); + npcFlags |= Global.GameEventMgr.GetNPCFlag(this); - SetUInt32Value(UnitFields.Flags, unitFlags); - SetUInt32Value(UnitFields.Flags2, unitFlags2); - SetUInt32Value(UnitFields.Flags3, unitFlags3); + SetNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF)); + SetNpcFlags2((NPCFlags2)(npcFlags >> 32)); - SetUInt32Value(ObjectFields.DynamicFlags, dynamicFlags); + SetUnitFlags((UnitFlags)unitFlags); + SetUnitFlags2((UnitFlags2)unitFlags2); + SetUnitFlags3((UnitFlags3)unitFlags3); - SetUInt32Value(UnitFields.StateAnimId, (uint)CliDB.AnimationDataStorage.Count); + SetDynamicFlags((UnitDynFlags)dynamicFlags); - RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StateAnimID), (uint)CliDB.AnimationDataStorage.Count); + + RemoveUnitFlag(UnitFlags.InCombat); SetBaseAttackTime(WeaponAttackType.BaseAttack, cInfo.BaseAttackTime); SetBaseAttackTime(WeaponAttackType.OffAttack, cInfo.BaseAttackTime); @@ -323,14 +321,14 @@ namespace Game.Entities Player owner = GetCharmerOrOwnerPlayerOrPlayerItself(); if (owner != null) // this check comes in case we don't have a player { - SetFaction(owner.getFaction()); // vehicles should have same as owner faction + SetFaction(owner.GetFaction()); // vehicles should have same as owner faction owner.VehicleSpellInitialize(); } } // trigger creature is always not selectable and can not be attacked if (IsTrigger()) - SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + AddUnitFlag(UnitFlags.NotSelectable); InitializeReactState(); @@ -411,7 +409,7 @@ namespace Game.Entities else if (m_corpseRemoveTime <= Time.UnixTime) { RemoveCorpse(false); - Log.outDebug(LogFilter.Unit, "Removing corpse... {0} ", GetUInt32Value(ObjectFields.Entry)); + Log.outDebug(LogFilter.Unit, "Removing corpse... {0} ", GetEntry()); } break; case DeathState.Alive: @@ -519,7 +517,7 @@ namespace Game.Entities if (!IsInEvadeMode() && (!bInCombat || IsPolymorphed() || CanNotReachTarget())) // regenerate health if not in combat or if polymorphed RegenerateHealth(); - if (HasFlag(UnitFields.Flags2, UnitFlags2.RegeneratePower)) + if (HasUnitFlag2(UnitFlags2.RegeneratePower)) { if (GetPowerType() == PowerType.Energy) Regenerate(PowerType.Energy); @@ -798,7 +796,7 @@ namespace Game.Entities //! Need to be called after LoadCreaturesAddon - MOVEMENTFLAG_HOVER is set there if (HasUnitMovementFlag(MovementFlag.Hover)) { - z += GetFloatValue(UnitFields.HoverHeight); + z += m_unitData.HoverHeight; //! Relocate again with updated Z coord Relocate(x, y, z, ang); @@ -810,7 +808,7 @@ namespace Game.Entities { SetDisplayId(display.CreatureDisplayID, display.DisplayScale); SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale); - SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); + SetGender((Gender)minfo.gender); } LastUsedScriptID = GetScriptId(); @@ -956,7 +954,7 @@ namespace Game.Entities { m_lootRecipient.Clear(); m_lootRecipientGroup.Clear(); - RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable | UnitDynFlags.Tapped); + RemoveDynamicFlag(UnitDynFlags.Lootable | UnitDynFlags.Tapped); return; } @@ -972,7 +970,7 @@ namespace Game.Entities if (group) m_lootRecipientGroup = group.GetGUID(); - SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Tapped); + AddDynamicFlag(UnitDynFlags.Tapped); } public bool isTappedBy(Player player) @@ -1011,11 +1009,11 @@ namespace Game.Entities CreatureData data = Global.ObjectMgr.NewOrExistCreatureData(m_spawnId); uint displayId = GetNativeDisplayId(); - ulong npcflag = GetUInt64Value(UnitFields.NpcFlags); - uint unitFlags = GetUInt32Value(UnitFields.Flags); - uint unitFlags2 = GetUInt32Value(UnitFields.Flags2); - uint unitFlags3 = GetUInt32Value(UnitFields.Flags3); - uint dynamicflags = GetUInt32Value(ObjectFields.DynamicFlags); + ulong npcflag = ((ulong)m_unitData.NpcFlags[1] << 32) | m_unitData.NpcFlags[0]; + uint unitFlags = m_unitData.Flags; + uint unitFlags2 = m_unitData.Flags2; + uint unitFlags3 = m_unitData.Flags3; + UnitDynFlags dynamicflags = (UnitDynFlags)(uint)m_objectData.DynamicFlags; // check if it's a custom model and if not, use 0 for displayId CreatureTemplate cinfo = GetCreatureTemplate(); @@ -1037,7 +1035,7 @@ namespace Game.Entities if (unitFlags3 == cinfo.UnitFlags3) unitFlags3 = 0; - if (dynamicflags == cinfo.DynamicFlags) + if (dynamicflags == (UnitDynFlags)cinfo.DynamicFlags) dynamicflags = 0; } @@ -1064,7 +1062,7 @@ namespace Game.Entities data.unit_flags = unitFlags; data.unit_flags2 = unitFlags2; data.unit_flags3 = unitFlags3; - data.dynamicflags = dynamicflags; + data.dynamicflags = (uint)dynamicflags; data.phaseId = GetDBPhase() > 0 ? (uint)GetDBPhase() : data.phaseId; data.phaseGroup = GetDBPhase() < 0 ? (uint)-GetDBPhase() : data.phaseGroup; @@ -1119,14 +1117,14 @@ namespace Game.Entities if (HasScalableLevels()) { - SetUInt32Value(UnitFields.ScalingLevelMin, cInfo.levelScaling.Value.MinLevel); - SetUInt32Value(UnitFields.ScalingLevelMax, cInfo.levelScaling.Value.MaxLevel); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMin), cInfo.levelScaling.Value.MinLevel); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMax), cInfo.levelScaling.Value.MaxLevel); int mindelta = Math.Min(cInfo.levelScaling.Value.DeltaLevelMax, cInfo.levelScaling.Value.DeltaLevelMin); int maxdelta = Math.Max(cInfo.levelScaling.Value.DeltaLevelMax, cInfo.levelScaling.Value.DeltaLevelMin); int delta = mindelta == maxdelta ? mindelta : RandomHelper.IRand(mindelta, maxdelta); - SetInt32Value(UnitFields.ScalingLevelDelta, delta); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelDelta), delta); } UpdateLevelDependantStats(); @@ -1434,9 +1432,9 @@ namespace Game.Entities return false; // This set of checks is should be done only for creatures - if ((HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc) && !who.IsTypeId(TypeId.Player)) // flag is valid only for non player characters - || (HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc) && who.IsTypeId(TypeId.Player)) // immune to PC and target is a player, return false - || (who.GetOwner() && who.GetOwner().IsTypeId(TypeId.Player) && HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc))) // player pets are immune to pc as well + if ((HasUnitFlag(UnitFlags.ImmuneToNpc) && !who.IsTypeId(TypeId.Player)) // flag is valid only for non player characters + || (HasUnitFlag(UnitFlags.ImmuneToPc) && who.IsTypeId(TypeId.Player)) // immune to PC and target is a player, return false + || (who.GetOwner() && who.GetOwner().IsTypeId(TypeId.Player) && HasUnitFlag(UnitFlags.ImmuneToPc))) // player pets are immune to pc as well return false; // Do not attack non-combat pets @@ -1530,9 +1528,10 @@ namespace Game.Entities DoNotReacquireTarget(); // cancel delayed re-target SetTarget(ObjectGuid.Empty); // drop target - dead mobs shouldn't ever target things - SetUInt64Value(UnitFields.NpcFlags, (ulong)NPCFlags.None); + SetNpcFlags(NPCFlags.None); + SetNpcFlags2(NPCFlags2.None); - SetUInt32Value(UnitFields.MountDisplayId, 0); // if creature is mounted on a virtual mount, remove it at death + SetMountDisplayId(0); // if creature is mounted on a virtual mount, remove it at death setActive(false); @@ -1576,16 +1575,17 @@ namespace Game.Entities ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, creatureData); if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent)) - SetUInt64Value(UnitFields.NpcFlags, npcFlags | Global.GameEventMgr.GetNPCFlag(this)); - else - SetUInt64Value(UnitFields.NpcFlags, npcFlags); + npcFlags |= Global.GameEventMgr.GetNPCFlag(this); - SetUInt32Value(UnitFields.Flags, unitFlags); - SetUInt32Value(UnitFields.Flags2, unitFlags2); - SetUInt32Value(UnitFields.Flags3, unitFlags3); - SetUInt32Value(ObjectFields.DynamicFlags, dynamicFlags); + SetNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF)); + SetNpcFlags2((NPCFlags2)(npcFlags >> 32)); - RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); + SetUnitFlags((UnitFlags)unitFlags); + SetUnitFlags2((UnitFlags2)unitFlags2); + SetUnitFlags3((UnitFlags3)unitFlags3); + SetDynamicFlags((UnitDynFlags)dynamicFlags); + + RemoveUnitFlag(UnitFlags.InCombat); SetMeleeDamageSchool((SpellSchools)cInfo.DmgSchool); } @@ -1633,7 +1633,7 @@ namespace Game.Entities { SetDisplayId(display.CreatureDisplayID, display.DisplayScale); SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale); - SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); + SetGender((Gender)minfo.gender); } GetMotionMaster().InitDefault(); @@ -1805,9 +1805,9 @@ namespace Game.Entities float dist = GetDistance(victim); if (dist > range || dist < minrange) continue; - if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasFlag(UnitFields.Flags, UnitFlags.Silenced)) + if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasUnitFlag(UnitFlags.Silenced)) continue; - if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasFlag(UnitFields.Flags, UnitFlags.Pacified)) + if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasUnitFlag(UnitFlags.Pacified)) continue; return spellInfo; } @@ -1854,9 +1854,9 @@ namespace Game.Entities if (dist > range || dist < minrange) continue; - if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasFlag(UnitFields.Flags, UnitFlags.Silenced)) + if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasUnitFlag(UnitFlags.Silenced)) continue; - if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasFlag(UnitFields.Flags, UnitFlags.Pacified)) + if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasUnitFlag(UnitFlags.Pacified)) continue; return spellInfo; } @@ -1969,7 +1969,7 @@ namespace Game.Entities if (IsCivilian()) return false; - if (HasFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.ImmuneToPc)) + if (HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.ImmuneToPc)) return false; // skip fighting creature @@ -1983,7 +1983,7 @@ namespace Game.Entities // only from same creature faction if (checkfaction) { - if (getFaction() != u.getFaction()) + if (GetFaction() != u.GetFaction()) return false; } else @@ -2009,7 +2009,7 @@ namespace Game.Entities if (target.HasUnitState(UnitState.Died)) { // guards can detect fake death - if (IsGuard() && target.HasFlag(UnitFields.Flags2, UnitFlags2.FeignDeath)) + if (IsGuard() && target.HasUnitFlag2(UnitFlags2.FeignDeath)) return true; else return false; @@ -2099,18 +2099,16 @@ namespace Game.Entities // 2 StandFlags // 3 StandMiscFlags - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.StandState, (byte)(cainfo.bytes1 & 0xFF)); - //SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.PetTalent, (byte)((cainfo.bytes1 >> 8) & 0xFF)); - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.PetTalents, 0); - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.VisFlag, (byte)((cainfo.bytes1 >> 16) & 0xFF)); - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier, (byte)((cainfo.bytes1 >> 24) & 0xFF)); + SetStandState((UnitStandStateType)(cainfo.bytes1 & 0xFF)); + SetVisFlags((UnitVisFlags)((cainfo.bytes1 >> 16) & 0xFF)); + SetAnimTier((UnitBytes1Flags)((cainfo.bytes1 >> 24) & 0xFF), false); //! Suspected correlation between UNIT_FIELD_BYTES_1, offset 3, value 0x2: //! If no inhabittype_fly (if no MovementFlag_DisableGravity or MovementFlag_CanFly flag found in sniffs) //! Check using InhabitType as movement flags are assigned dynamically //! basing on whether the creature is in air or not //! Set MovementFlag_Hover. Otherwise do nothing. - if (Convert.ToBoolean(GetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier) & (byte)UnitBytes1Flags.Hover) && !Convert.ToBoolean(GetCreatureTemplate().InhabitType & InhabitType.Air)) + if (Convert.ToBoolean(m_unitData.AnimTier & (byte)UnitBytes1Flags.Hover) && !Convert.ToBoolean(GetCreatureTemplate().InhabitType & InhabitType.Air)) AddUnitMovementFlag(MovementFlag.Hover); } @@ -2121,16 +2119,14 @@ namespace Game.Entities // 2 PetFlags Pet only, so always 0 for default creature // 3 ShapeshiftForm Must be determined/set by shapeshift spell/aura - SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.SheathState, (byte)(cainfo.bytes2 & 0xFF)); - //SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, uint8((cainfo->bytes2 >> 8) & 0xFF)); - //SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, uint8((cainfo->bytes2 >> 16) & 0xFF)); - SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, 0); - //SetByteValue(UnitFields.Bytes2, UNIT_BYTES_2_OFFSET_SHAPESHIFT_FORM, uint8((cainfo->bytes2 >> 24) & 0xFF)); - SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.ShapeshiftForm, 0); + SetSheath((SheathState)(cainfo.bytes2 & 0xFF)); + SetPvpFlags(UnitPVPStateFlags.None); + SetPetFlags(UnitPetFlags.None); + SetShapeshiftForm(ShapeShiftForm.None); } if (cainfo.emote != 0) - SetUInt32Value(UnitFields.NpcEmotestate, cainfo.emote); + SetEmoteState((Emote)cainfo.emote); SetAIAnimKitId(cainfo.aiAnimKit); SetMovementAnimKitId(cainfo.movementAnimKit); @@ -2289,7 +2285,7 @@ namespace Game.Entities { if (loot.loot_type != LootType.Skinning && !IsPet() && GetCreatureTemplate().SkinLootId != 0 && hasLootRecipient()) if (LootStorage.Skinning.HaveLootFor(GetCreatureTemplate().SkinLootId)) - SetFlag(UnitFields.Flags, UnitFlags.Skinnable); + AddUnitFlag(UnitFlags.Skinnable); long now = Time.UnixTime; // Do not reset corpse remove time if corpse is already removed @@ -2380,12 +2376,12 @@ namespace Game.Entities // between UNIT_FIELD_SCALING_LEVEL_MIN and UNIT_FIELD_SCALING_LEVEL_MAX if (HasScalableLevels()) { - int targetLevelWithDelta = ((int)unitTarget.getLevel() + GetInt32Value(UnitFields.ScalingLevelDelta)); + int targetLevelWithDelta = (int)unitTarget.getLevel() + m_unitData.ScalingLevelDelta; if (target.IsPlayer()) - targetLevelWithDelta += target.GetInt32Value(ActivePlayerFields.ScalingPlayerLevelDelta); + targetLevelWithDelta += target.ToPlayer().m_activePlayerData.ScalingPlayerLevelDelta; - return (uint)MathFunctions.RoundToInterval(ref targetLevelWithDelta, GetInt32Value(UnitFields.ScalingLevelMin), GetInt32Value(UnitFields.ScalingLevelMax)); + return (uint)MathFunctions.RoundToInterval(ref targetLevelWithDelta, m_unitData.ScalingLevelMin, m_unitData.ScalingLevelMax); } } @@ -2409,7 +2405,7 @@ namespace Game.Entities if (creatureData != null) return creatureData.ScriptId; - return Global.ObjectMgr.GetCreatureTemplate(GetEntry()).ScriptID; + return Global.ObjectMgr.GetCreatureTemplate(GetEntry()) != null ? Global.ObjectMgr.GetCreatureTemplate(GetEntry()).ScriptID : 0; } public VendorItemData GetVendorItems() @@ -2668,8 +2664,8 @@ namespace Game.Entities CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(GetDisplayId()); if (minfo != null) { - SetFloatValue(UnitFields.BoundingRadius, (IsPet() ? 1.0f : minfo.BoundingRadius) * scale); - SetFloatValue(UnitFields.CombatReach, (IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * scale); + SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * scale); + SetCombatReach((IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * scale); } } @@ -2680,8 +2676,8 @@ namespace Game.Entities CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(modelId); if (minfo != null) { - SetFloatValue(UnitFields.BoundingRadius, (IsPet() ? 1.0f : minfo.BoundingRadius) * GetObjectScale()); - SetFloatValue(UnitFields.CombatReach, (IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * GetObjectScale()); + SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * GetObjectScale()); + SetCombatReach((IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * GetObjectScale()); } } @@ -2697,7 +2693,7 @@ namespace Game.Entities if (IsFocusing(null, true)) m_suppressedTarget = guid; else - SetGuidValue(UnitFields.Target, guid); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), guid); } public void FocusTarget(Spell focusSpell, WorldObject target) @@ -2716,7 +2712,7 @@ namespace Game.Entities // store pre-cast values for target and orientation (used to later restore) if (!IsFocusing(null, true)) { // only overwrite these fields if we aren't transitioning from one spell focus to another - m_suppressedTarget = GetGuidValue(UnitFields.Target); + m_suppressedTarget = GetTarget(); m_suppressedOrientation = GetOrientation(); } @@ -2724,9 +2720,9 @@ namespace Game.Entities // set target, then force send update packet to players if it changed to provide appropriate facing ObjectGuid newTarget = target ? target.GetGUID() : ObjectGuid.Empty; - if (GetGuidValue(UnitFields.Target) != newTarget) + if (GetTarget() != newTarget) { - SetGuidValue(UnitFields.Target, newTarget); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), newTarget); // here we determine if the (relatively expensive) forced update is worth it, or whether we can afford to wait until the scheduled update tick // only require instant update for spells that actually have a visual @@ -2794,7 +2790,7 @@ namespace Game.Entities if (IsPet())// player pets do not use delay system { - SetGuidValue(UnitFields.Target, m_suppressedTarget); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), m_suppressedTarget); if (!m_suppressedTarget.IsEmpty()) { WorldObject objTarget = Global.ObjAccessor.GetWorldObject(this, m_suppressedTarget); diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index a21593085..1d9414f7f 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -42,7 +42,7 @@ namespace Game.Entities public uint RequiredExpansion; public uint VignetteID; // @todo Read Vignette.db2 public uint Faction; - public NPCFlags Npcflag; + public ulong Npcflag; public float SpeedWalk; public float SpeedRun; public float Scale; diff --git a/Source/Game/Entities/DynamicObject.cs b/Source/Game/Entities/DynamicObject.cs index fe9423be5..461cc552a 100644 --- a/Source/Game/Entities/DynamicObject.cs +++ b/Source/Game/Entities/DynamicObject.cs @@ -17,6 +17,7 @@ using Framework.Constants; using Game.Spells; +using Game.Network; namespace Game.Entities { @@ -29,7 +30,7 @@ namespace Game.Entities m_updateFlag.Stationary = true; - valuesCount = (int)DynamicObjectFields.End; + m_dynamicObjectData = new DynamicObjectData(); } public override void Dispose() @@ -77,7 +78,6 @@ namespace Game.Entities public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, uint spellXSpellVisualId) { - _spellXSpellVisualId = spellXSpellVisualId; SetMap(caster.GetMap()); Relocate(pos); if (!IsPositionValid()) @@ -91,13 +91,13 @@ namespace Game.Entities SetEntry(spell.Id); SetObjectScale(1f); - SetGuidValue(DynamicObjectFields.Caster, caster.GetGUID()); - SetUInt32Value(DynamicObjectFields.Type, (uint)type); - SetUInt32Value(DynamicObjectFields.SpellXSpellVisualId, spellXSpellVisualId); - SetUInt32Value(DynamicObjectFields.SpellId, spell.Id); - SetFloatValue(DynamicObjectFields.Radius, radius); - SetUInt32Value(DynamicObjectFields.CastTime, Time.GetMSTime()); + SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Caster), caster.GetGUID()); + SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Type), (byte)type); + SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellXSpellVisualID), spellXSpellVisualId); + SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellID), spell.Id); + SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Radius), radius); + SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.CastTime), Time.GetMSTime()); if (IsWorldObject()) setActive(true); //must before add to map to be put in world container @@ -207,7 +207,7 @@ namespace Game.Entities if (caster != null) { caster.SetViewpoint(this, true); - _isViewpoint = true; + _isViewpoint = true; } } @@ -242,16 +242,51 @@ namespace Game.Entities return Global.SpellMgr.GetSpellInfo(GetSpellId()); } - public Unit GetCaster() { return _caster; } - public uint GetSpellId() { return GetUInt32Value(DynamicObjectFields.SpellId); } - public ObjectGuid GetCasterGUID() { return GetGuidValue(DynamicObjectFields.Caster); } - public float GetRadius() { return GetFloatValue(DynamicObjectFields.Radius); } + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + buffer.WriteUInt8((byte)flags); + m_objectData.WriteCreate(buffer, flags, this, target); + m_dynamicObjectData.WriteCreate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.DynamicObject)) + m_dynamicObjectData.WriteUpdate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_dynamicObjectData); + base.ClearUpdateMask(remove); + } + + public Unit GetCaster() { return _caster; } + public uint GetSpellId() { return m_dynamicObjectData.SpellID; } + public ObjectGuid GetCasterGUID() { return m_dynamicObjectData.Caster; } + public float GetRadius() { return m_dynamicObjectData.Radius; } + + DynamicObjectData m_dynamicObjectData; Aura _aura; Aura _removedAura; Unit _caster; int _duration; // for non-aura dynobjects - uint _spellXSpellVisualId; bool _isViewpoint; } diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index d55a1d4e6..1184278ba 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -31,6 +31,7 @@ using Game.Spells; using System; using System.Collections.Generic; using System.Linq; +using Game.Network; namespace Game.Entities { @@ -44,13 +45,14 @@ namespace Game.Entities m_updateFlag.Stationary = true; m_updateFlag.Rotation = true; - valuesCount = (int)GameObjectFields.End; m_respawnDelayTime = 300; m_lootState = LootState.NotReady; m_spawnedByDefault = true; ResetLootMode(); // restore default loot mode m_stationaryPosition = new Position(); + + m_gameObjectData = new GameObjectFieldData(); } public override void Dispose() @@ -248,8 +250,8 @@ namespace Game.Entities if (m_goTemplateAddon != null) { - SetUInt32Value(GameObjectFields.Faction, m_goTemplateAddon.faction); - SetUInt32Value(GameObjectFields.Flags, m_goTemplateAddon.flags); + SetFaction(m_goTemplateAddon.faction); + SetFlags((GameObjectFlags)m_goTemplateAddon.flags); if (m_goTemplateAddon.WorldEffectID != 0) { @@ -267,7 +269,7 @@ namespace Game.Entities m_model = CreateModel(); if (m_model != null && m_model.isMapObject()) - SetFlag(GameObjectFields.Flags, GameObjectFlags.MapObject); + AddFlag(GameObjectFlags.MapObject); // GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3 SetGoType(goInfo.type); @@ -275,7 +277,7 @@ namespace Game.Entities SetGoState(goState); SetGoArtKit((byte)artKit); - SetUInt32Value(GameObjectFields.StateAnimId, (uint)CliDB.AnimationDataStorage.Count); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.SpawnTrackingStateAnimID), (uint)CliDB.AnimationDataStorage.Count); switch (goInfo.type) { @@ -287,7 +289,8 @@ namespace Game.Entities m_goValue.Building.Health = 20000;//goinfo.DestructibleBuilding.intactNumHits + goinfo.DestructibleBuilding.damagedNumHits; m_goValue.Building.MaxHealth = m_goValue.Building.Health; SetGoAnimProgress(255); - SetUInt32Value(GameObjectFields.ParentRotation, goInfo.DestructibleBuilding.DestructibleModelRec); + // yes, even after the updatefield rewrite this garbage hack is still in client + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.ParentRotation), new Quaternion(goInfo.DestructibleBuilding.DestructibleModelRec, 0f, 0f, 0f)); break; case GameObjectTypes.Transport: m_goValue.Transport.AnimationInfo = Global.TransportMgr.GetTransportAnimInfo(goInfo.entry); @@ -324,7 +327,7 @@ namespace Game.Entities SetGoAnimProgress(animProgress); break; case GameObjectTypes.FishingNode: - SetUInt32Value(GameObjectFields.Level, 1); + SetLevel(1); SetGoAnimProgress(255); break; case GameObjectTypes.Trap: @@ -341,10 +344,11 @@ namespace Game.Entities } break; case GameObjectTypes.PhaseableMo: - SetByteValue(GameObjectFields.Flags, 1, (byte)(m_goInfo.PhaseableMO.AreaNameSet & 0xF)); + RemoveFlag((GameObjectFlags)0xF00); + AddFlag((GameObjectFlags)((m_goInfo.PhaseableMO.AreaNameSet & 0xF) << 8)); break; case GameObjectTypes.CapturePoint: - SetUInt32Value(GameObjectFields.SpellVisualId, m_goInfo.CapturePoint.SpellVisual1); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.SpellVisualID), m_goInfo.CapturePoint.SpellVisual1); break; default: SetGoAnimProgress(animProgress); @@ -438,15 +442,15 @@ namespace Game.Entities m_goValue.Transport.PathProgress += diff; /* TODO: Fix movement in unloaded grid - currently GO will just disappear public uint timer = m_goValue.Transport.PathProgress % GetTransportPeriod(); - TransportAnimationEntry const* node = m_goValue.Transport.AnimationInfo->GetAnimNode(timer); - if (node && m_goValue.Transport.CurrentSeg != node->TimeSeg) + TransportAnimationEntry const* node = m_goValue.Transport.AnimationInfo.GetAnimNode(timer); + if (node && m_goValue.Transport.CurrentSeg != node.TimeSeg) { - m_goValue.Transport.CurrentSeg = node->TimeSeg; + m_goValue.Transport.CurrentSeg = node.TimeSeg; - G3D.Quat rotation = m_goValue.Transport.AnimationInfo->GetAnimRotation(timer); + G3D.Quat rotation = m_goValue.Transport.AnimationInfo.GetAnimRotation(timer); G3D.Vector3 pos = rotation.toRotationMatrix() G3D.Matrix3.fromEulerAnglesZYX(GetOrientation(), 0.0f, 0.0f) - G3D.Vector3(node->X, node->Y, node->Z); + G3D.Vector3(node.X, node.Y, node.Z); pos += G3D.Vector3(GetStationaryX(), GetStationaryY(), GetStationaryZ()); @@ -454,7 +458,7 @@ namespace Game.Entities TC_LOG_DEBUG("misc", "Src: {0} Dest: {1}", src.toString().c_str(), pos.toString().c_str()); - GetMap()->GameObjectRelocation(this, pos.x, pos.y, pos.z, GetOrientation()); + GetMap().GameObjectRelocation(this, pos.x, pos.y, pos.z, GetOrientation()); } */ if (!m_goValue.Transport.StopFrames.Empty()) @@ -464,8 +468,9 @@ namespace Game.Entities uint visualStateAfter = (m_goValue.Transport.StateUpdateTimer / 20000) & 1; if (visualStateBefore != visualStateAfter) { - ForceValuesUpdateAtIndex(GameObjectFields.Level); - ForceValuesUpdateAtIndex(GameObjectFields.Bytes1); + m_gameObjectData.ModifyValue(m_gameObjectData.Level); + m_gameObjectData.ModifyValue(m_gameObjectData.State); + ForceUpdateFieldChange(); } } } @@ -480,7 +485,7 @@ namespace Game.Entities if (caster != null && caster.IsTypeId(TypeId.Player)) { SetGoState(GameObjectState.Active); - SetUInt32Value(GameObjectFields.Flags, (uint)GameObjectFlags.NoDespawn); + SetFlags(GameObjectFlags.NoDespawn); UpdateData udata = new UpdateData(caster.GetMapId()); UpdateObject packet; @@ -650,7 +655,7 @@ namespace Game.Entities case GameObjectTypes.Goober: if (m_cooldownTime < Time.UnixTime) { - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + RemoveFlag(GameObjectFlags.InUse); SetLootState(LootState.JustDeactivated); m_cooldownTime = 0; @@ -770,7 +775,7 @@ namespace Game.Entities //reset flags GameObjectTemplateAddon addon = GetTemplateAddon(); if (addon != null) - SetUInt32Value(GameObjectFields.Flags, addon.flags); + SetFlags((GameObjectFlags)addon.flags); } if (m_respawnDelayTime == 0) @@ -823,7 +828,7 @@ namespace Game.Entities SetGoState(GameObjectState.Ready); GameObjectTemplateAddon addon = GetTemplateAddon(); if (addon != null) - SetUInt32Value(GameObjectFields.Flags, addon.flags); + SetFlags((GameObjectFlags)addon.flags); uint poolid = GetSpawnId() != 0 ? Global.PoolMgr.IsPartOfAPool(GetSpawnId()) : 0; if (poolid != 0) @@ -918,7 +923,7 @@ namespace Game.Entities data.animprogress = GetGoAnimProgress(); data.go_state = GetGoState(); data.spawnDifficulties = spawnDifficulties; - data.artKit = GetGoArtKit(); + data.artKit = (byte)GetGoArtKit(); Global.ObjectMgr.NewGOData(m_spawnId, data); data.phaseId = GetDBPhase() > 0 ? (uint)GetDBPhase() : data.phaseId; @@ -980,7 +985,7 @@ namespace Game.Entities if (!GetGoInfo().GetDespawnPossibility() && !GetGoInfo().IsDespawnAtAction()) { - SetFlag(GameObjectFields.Flags, GameObjectFlags.NoDespawn); + AddFlag(GameObjectFlags.NoDespawn); m_respawnDelayTime = 0; m_respawnTime = 0; } @@ -1104,7 +1109,7 @@ namespace Game.Entities if (GetGoType() == GameObjectTypes.SpellFocus && GetGoInfo().SpellFocus.serverOnly == 1) return true; - if (GetUInt32Value(GameObjectFields.DisplayId) == 0) + if (GetDisplayId() == 0) return true; return false; @@ -1157,7 +1162,7 @@ namespace Game.Entities } } - bool ActivateToQuest(Player target) + public bool ActivateToQuest(Player target) { if (target.HasQuestForGO((int)GetEntry())) return true; @@ -1231,7 +1236,7 @@ namespace Game.Entities if (m_lootState == LootState.Ready || m_lootState == LootState.JustDeactivated) return; - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + RemoveFlag(GameObjectFlags.InUse); SetGoState(m_prevGoState); SetLootState(LootState.JustDeactivated); @@ -1254,7 +1259,7 @@ namespace Game.Entities public void SetGoArtKit(byte kit) { - SetByteValue(GameObjectFields.Bytes1, 2, kit); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.ArtKit), kit); GameObjectData data = Global.ObjectMgr.GetGOData(m_spawnId); if (data != null) data.artKit = kit; @@ -1278,9 +1283,9 @@ namespace Game.Entities void SwitchDoorOrButton(bool activate, bool alternative = false) { if (activate) - SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + AddFlag(GameObjectFlags.InUse); else - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + RemoveFlag(GameObjectFlags.InUse); if (GetGoState() == GameObjectState.Ready) //if closed . open SetGoState(alternative ? GameObjectState.ActiveAlternative : GameObjectState.Active); @@ -1423,7 +1428,7 @@ namespace Game.Entities { guid = player.GetGUID(); //this slot in now used by player player.TeleportTo(GetMapId(), x_lowest, y_lowest, GetPositionZ(), GetOrientation(), (TeleportToOptions.NotLeaveTransport | TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet)); - player.SetStandState(UnitStandStateType.SitLowChair + (int)info.Chair.chairheight); + player.SetStandState(UnitStandStateType.SitLowChair + (byte)info.Chair.chairheight); return; } } @@ -1487,7 +1492,7 @@ namespace Game.Entities if (trapEntry != 0) TriggeringLinkedGameObject(trapEntry, user); - SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse); + AddFlag(GameObjectFlags.InUse); SetLootState(LootState.Activated, user); // this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389) @@ -1864,7 +1869,7 @@ namespace Game.Entities // fallback, will always work player.TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), (TeleportToOptions.NotLeaveTransport | TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet)); - player.SetStandState((UnitStandStateType)(UnitStandStateType.SitLowChair + (int)info.BarberChair.chairheight), info.BarberChair.SitAnimKit); + player.SetStandState((UnitStandStateType.SitLowChair + (byte)info.BarberChair.chairheight), info.BarberChair.SitAnimKit); return; } case GameObjectTypes.ArtifactForge: @@ -1972,16 +1977,16 @@ namespace Game.Entities return; // remove immunity flags, to allow spell to target anything - trigger.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc | UnitFlags.ImmuneToPc); + trigger.RemoveUnitFlag(UnitFlags.ImmuneToNpc | UnitFlags.ImmuneToPc); Unit owner = GetOwner(); if (owner) { - trigger.SetFaction(owner.getFaction()); - if (owner.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) - trigger.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + trigger.SetFaction(owner.GetFaction()); + if (owner.HasUnitFlag(UnitFlags.PvpAttackable)) + trigger.AddUnitFlag(UnitFlags.PvpAttackable); // copy pvp state flags from owner - trigger.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, owner.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag)); + trigger.SetPvpFlags(owner.GetPvpFlags()); // needed for GO casts for proper target validation checks trigger.SetOwnerGUID(owner.GetGUID()); trigger.CastSpell(target != null ? target : trigger, spellInfo, triggered, null, null, owner.GetGUID()); @@ -2097,10 +2102,7 @@ namespace Game.Entities public void SetParentRotation(Quaternion rotation) { - SetFloatValue(GameObjectFields.ParentRotation + 0, rotation.X); - SetFloatValue(GameObjectFields.ParentRotation + 1, rotation.Y); - SetFloatValue(GameObjectFields.ParentRotation + 2, rotation.Z); - SetFloatValue(GameObjectFields.ParentRotation + 3, rotation.W); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.ParentRotation), rotation); } public void SetWorldRotationAngles(float z_rot, float y_rot, float x_rot) @@ -2165,7 +2167,7 @@ namespace Game.Entities switch (state) { case GameObjectDestructibleState.Intact: - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Damaged | GameObjectFlags.Destroyed); + RemoveFlag(GameObjectFlags.Damaged | GameObjectFlags.Destroyed); SetDisplayId(m_goInfo.displayId); if (setHealth) { @@ -2179,8 +2181,8 @@ namespace Game.Entities EventInform(m_goInfo.DestructibleBuilding.DamagedEvent, eventInvoker); Global.ScriptMgr.OnGameObjectDamaged(this, eventInvoker); - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed); - SetFlag(GameObjectFields.Flags, GameObjectFlags.Damaged); + RemoveFlag(GameObjectFlags.Destroyed); + AddFlag(GameObjectFlags.Damaged); uint modelId = m_goInfo.displayId; DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec); @@ -2211,8 +2213,8 @@ namespace Game.Entities bg.DestroyGate(eventInvoker, this); } - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Damaged); - SetFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed); + RemoveFlag(GameObjectFlags.Damaged); + AddFlag(GameObjectFlags.Destroyed); uint modelId = m_goInfo.displayId; DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec); @@ -2232,7 +2234,7 @@ namespace Game.Entities case GameObjectDestructibleState.Rebuilding: { EventInform(m_goInfo.DestructibleBuilding.RebuildingEvent, eventInvoker); - RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Damaged | GameObjectFlags.Destroyed); + RemoveFlag(GameObjectFlags.Damaged | GameObjectFlags.Destroyed); uint modelId = m_goInfo.displayId; DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec); @@ -2277,7 +2279,7 @@ namespace Game.Entities public void SetGoState(GameObjectState state) { - SetByteValue(GameObjectFields.Bytes1, 0, (byte)state); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.State), (sbyte)state); Global.ScriptMgr.OnGameObjectStateChanged(this, state); if (m_model != null && !IsTransport()) { @@ -2327,7 +2329,7 @@ namespace Game.Entities public void SetDisplayId(uint displayid) { - SetUInt32Value(GameObjectFields.DisplayId, displayid); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.DisplayID), displayid); UpdateModel(); } @@ -2357,7 +2359,8 @@ namespace Game.Entities case GameObjectTypes.GarrisonBuilding: case GameObjectTypes.GarrisonPlot: case GameObjectTypes.PhaseableMo: - return (byte)(GetByteValue(GameObjectFields.Flags, 1) & 0xF); + var flags = (GameObjectFlags)(uint)m_gameObjectData.Flags; + return (byte)(((int)flags >> 8) & 0xF); default: break; } @@ -2386,7 +2389,10 @@ namespace Game.Entities if (m_model != null) GetMap().InsertGameObjectModel(m_model); - ApplyModFlag(GameObjectFields.Flags, GameObjectFlags.MapObject, m_model != null && m_model.isMapObject()); + if (m_model != null && m_model.isMapObject()) + AddFlag(GameObjectFlags.MapObject); + else + RemoveFlag(GameObjectFlags.MapObject); } Player GetLootRecipient() @@ -2434,7 +2440,7 @@ namespace Game.Entities m_lootRecipientGroup = unitGroup.GetGUID(); } - bool IsLootAllowedFor(Player player) + public bool IsLootAllowedFor(Player player) { if (m_lootRecipient.IsEmpty() && m_lootRecipientGroup.IsEmpty()) return true; @@ -2455,103 +2461,39 @@ namespace Game.Entities return ObjectAccessor.GetGameObject(this, m_linkedTrap); } - public override void BuildValuesUpdate(UpdateType updateType, ByteBuffer data, Player target) + public override void BuildValuesCreate(WorldPacket data, Player target) { - if (!target) - return; + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); - bool isStoppableTransport = GetGoType() == GameObjectTypes.Transport && !m_goValue.Transport.StopFrames.Empty(); - bool forcedFlags = GetGoType() == GameObjectTypes.Chest && GetGoInfo().Chest.usegrouplootrules != 0 && HasLootRecipient(); - bool targetIsGM = target.IsGameMaster(); + buffer.WriteUInt8((byte)flags); + m_objectData.WriteCreate(buffer, flags, this, target); + m_gameObjectData.WriteCreate(buffer, flags, this, target); - ByteBuffer fieldBuffer = new ByteBuffer(); - UpdateMask updateMask = new UpdateMask(valuesCount); + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } - uint[] flags = UpdateFieldFlags.GameObjectUpdateFieldFlags; - uint visibleFlag = UpdateFieldFlags.Public; - if (GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); - for (int index = 0; index < valuesCount; ++index) - { - if (_fieldNotifyFlags.HasAnyFlag(flags[index]) || - ((updateType == UpdateType.Values ? _changesMask.Get(index) : updateValues[index].UnsignedValue != 0) && flags[index].HasAnyFlag(visibleFlag)) || - (index == (int)GameObjectFields.Flags && forcedFlags)) - { - updateMask.SetBit(index); + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); - if (index == (int)ObjectFields.DynamicFlags) - { - GameObjectDynamicLowFlags dynFlags = 0; - short pathProgress = -1; - switch (GetGoType()) - { - case GameObjectTypes.QuestGiver: - if (ActivateToQuest(target)) - dynFlags |= GameObjectDynamicLowFlags.Activate; - break; - case GameObjectTypes.Chest: - case GameObjectTypes.Goober: - if (ActivateToQuest(target) || targetIsGM) - dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle; - break; - case GameObjectTypes.Generic: - if (ActivateToQuest(target)) - dynFlags |= GameObjectDynamicLowFlags.Sparkle; - break; - case GameObjectTypes.Transport: - case GameObjectTypes.MapObjTransport: - uint transportPeriod = GetTransportPeriod(); - if (transportPeriod != 0) - { - float timer = (float)m_goValue.Transport.PathProgress % transportPeriod; - pathProgress = (short)(timer / transportPeriod * 65535.0f); - } - break; - default: - break; - } + if (m_values.HasChanged(TypeId.GameObject)) + m_gameObjectData.WriteUpdate(buffer, flags, this, target); - fieldBuffer.WriteUInt16(dynFlags); - fieldBuffer.WriteInt16(pathProgress); - } - else if (index == (int)GameObjectFields.Flags) - { - GameObjectFlags _flags = (GameObjectFlags)GetUInt32Value(GameObjectFields.Flags); - if (GetGoType() == GameObjectTypes.Chest) - if (GetGoInfo().Chest.usegrouplootrules != 0 && !IsLootAllowedFor(target)) - _flags |= GameObjectFlags.Locked | GameObjectFlags.NotSelectable; + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } - fieldBuffer.WriteUInt32(_flags); - } - else if (index == (int)GameObjectFields.Level) - { - if (isStoppableTransport) - fieldBuffer.WriteUInt32(m_goValue.Transport.PathProgress); - else - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue); - } - else if (index == (int)GameObjectFields.Bytes1) - { - uint bytes1 = GetUInt32Value(index); - if (isStoppableTransport && GetGoState() == GameObjectState.TransportActive) - { - if (Convert.ToBoolean((m_goValue.Transport.StateUpdateTimer / 20000) & 1)) - { - bytes1 &= 0xFFFFFF00; - bytes1 |= (int)GameObjectState.TransportStopped; - } - } - - fieldBuffer.WriteUInt32(bytes1); - } - else - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue); - } - } - - updateMask.AppendToPacket(data); - data.WriteBytes(fieldBuffer); + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_gameObjectData); + base.ClearUpdateMask(remove); } public void GetRespawnPosition(out float x, out float y, out float z, out float ori) @@ -2632,7 +2574,8 @@ namespace Game.Entities public GameObjectTemplate GetGoInfo() { return m_goInfo; } public GameObjectTemplateAddon GetTemplateAddon() { return m_goTemplateAddon; } - GameObjectData GetGoData() { return m_goData; } + public GameObjectData GetGoData() { return m_goData; } + public GameObjectValue GetGoValue() { return m_goValue; } public ulong GetSpawnId() { return m_spawnId; } @@ -2651,9 +2594,9 @@ namespace Game.Entities Cypher.Assert(false); } m_spawnedByDefault = false; // all object with owner is despawned after delay - SetGuidValue(GameObjectFields.CreatedBy, owner); + SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.CreatedBy), owner); } - public ObjectGuid GetOwnerGUID() { return GetGuidValue(GameObjectFields.CreatedBy); } + public ObjectGuid GetOwnerGUID() { return m_gameObjectData.CreatedBy; } public void SetSpellId(uint id) { @@ -2688,12 +2631,18 @@ namespace Game.Entities public void SetSpawnedByDefault(bool b) { m_spawnedByDefault = b; } public uint GetRespawnDelay() { return m_respawnDelayTime; } - public GameObjectTypes GetGoType() { return (GameObjectTypes)GetByteValue(GameObjectFields.Bytes1, 1); } - public void SetGoType(GameObjectTypes type) { SetByteValue(GameObjectFields.Bytes1, 1, (byte)type); } - public GameObjectState GetGoState() { return (GameObjectState)GetByteValue(GameObjectFields.Bytes1, 0); } - byte GetGoArtKit() { return GetByteValue(GameObjectFields.Bytes1, 2); } - byte GetGoAnimProgress() { return GetByteValue(GameObjectFields.Bytes1, 3); } - public void SetGoAnimProgress(uint animprogress) { SetByteValue(GameObjectFields.Bytes1, 3, (byte)animprogress); } + public bool HasFlag(GameObjectFlags flags) { return (m_gameObjectData.Flags & (uint)flags) != 0; } + public void AddFlag(GameObjectFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Flags), (uint)flags); } + public void RemoveFlag(GameObjectFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Flags), (uint)flags); } + public void SetFlags(GameObjectFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Flags), (uint)flags); } + public void SetLevel(uint level) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Level), level); } + + public GameObjectTypes GetGoType() { return (GameObjectTypes)(sbyte)m_gameObjectData.TypeID; } + public void SetGoType(GameObjectTypes type) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.TypeID), (sbyte)type); } + public GameObjectState GetGoState() { return (GameObjectState)(sbyte)m_gameObjectData.State; } + uint GetGoArtKit() { return m_gameObjectData.ArtKit; } + byte GetGoAnimProgress() { return m_gameObjectData.PercentHealth; } + public void SetGoAnimProgress(uint animprogress) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.PercentHealth), (byte)animprogress); } public LootState getLootState() { return m_lootState; } public LootModes GetLootMode() { return m_LootMode; } @@ -2732,19 +2681,19 @@ namespace Game.Entities GameObjectDestructibleState GetDestructibleState() { - if (HasFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed)) + if ((m_gameObjectData.Flags & (uint)GameObjectFlags.Destroyed) != 0) return GameObjectDestructibleState.Destroyed; - if (HasFlag(GameObjectFields.Flags, GameObjectFlags.Damaged)) + if ((m_gameObjectData.Flags & (uint)GameObjectFlags.Damaged) != 0) return GameObjectDestructibleState.Damaged; return GameObjectDestructibleState.Intact; } public GameObjectAI GetAI() { return m_AI; } - public uint GetDisplayId() { return GetUInt32Value(GameObjectFields.DisplayId); } + public uint GetDisplayId() { return m_gameObjectData.DisplayID; } - uint GetFaction() { return GetUInt32Value(GameObjectFields.Faction); } - public void SetFaction(uint faction) { SetUInt32Value(GameObjectFields.Faction, faction); } + public uint GetFaction() { return m_gameObjectData.FactionTemplate; } + public void SetFaction(uint faction) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.FactionTemplate), faction); } public override float GetStationaryX() { return m_stationaryPosition.GetPositionX(); } public override float GetStationaryY() { return m_stationaryPosition.GetPositionY(); } @@ -2766,7 +2715,8 @@ namespace Game.Entities } #region Fields - public GameObjectValue m_goValue; + protected GameObjectFieldData m_gameObjectData; + protected GameObjectValue m_goValue; protected GameObjectTemplate m_goInfo; protected GameObjectTemplateAddon m_goTemplateAddon; GameObjectData m_goData; diff --git a/Source/Game/Entities/Item/Bag.cs b/Source/Game/Entities/Item/Bag.cs index a9d018046..6984c7698 100644 --- a/Source/Game/Entities/Item/Bag.cs +++ b/Source/Game/Entities/Item/Bag.cs @@ -17,6 +17,7 @@ using Framework.Constants; using Framework.Database; +using Game.Network; namespace Game.Entities { @@ -27,8 +28,7 @@ namespace Game.Entities objectTypeMask |= TypeMask.Container; objectTypeId = TypeId.Container; - valuesCount = (int)ContainerFields.End; - _dynamicValuesCount = (int)ItemDynamicFields.End; + m_containerData = new ContainerData(); } public override void Dispose() @@ -86,20 +86,20 @@ namespace Game.Entities if (owner) { - SetGuidValue(ItemFields.Owner, owner.GetGUID()); - SetGuidValue(ItemFields.Contained, owner.GetGUID()); + SetOwnerGUID(owner.GetGUID()); + SetContainedIn(owner.GetGUID()); } - SetUInt32Value(ItemFields.MaxDurability, itemProto.MaxDurability); - SetUInt32Value(ItemFields.Durability, itemProto.MaxDurability); - SetUInt32Value(ItemFields.StackCount, 1); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.MaxDurability), itemProto.MaxDurability); + SetDurability(itemProto.MaxDurability); + SetCount(1); // Setting the number of Slots the Container has - SetUInt32Value(ContainerFields.NumSlots, itemProto.GetContainerSlots()); + SetBagSize(itemProto.GetContainerSlots()); // Cleaning 20 slots for (byte i = 0; i < ItemConst.MaxBagSize; ++i) - SetGuidValue(ContainerFields.Slot1 + (i * 4), ObjectGuid.Empty); + SetSlot(i, ObjectGuid.Empty); m_bagslot = new Item[ItemConst.MaxBagSize]; return true; @@ -111,11 +111,11 @@ namespace Game.Entities return false; ItemTemplate itemProto = GetTemplate(); // checked in Item.LoadFromDB - SetUInt32Value(ContainerFields.NumSlots, itemProto.GetContainerSlots()); + SetBagSize(itemProto.GetContainerSlots()); // cleanup bag content related item value fields (its will be filled correctly from `character_inventory`) for (byte i = 0; i < ItemConst.MaxBagSize; ++i) { - SetGuidValue(ContainerFields.Slot1 + (i * 4), ObjectGuid.Empty); + SetSlot(i, ObjectGuid.Empty); m_bagslot[i] = null; } return true; @@ -144,9 +144,9 @@ namespace Game.Entities { if (m_bagslot[slot] != null) m_bagslot[slot].SetContainer(null); - + m_bagslot[slot] = null; - SetGuidValue(ContainerFields.Slot1 + (slot * 4), ObjectGuid.Empty); + SetSlot(slot, ObjectGuid.Empty); } public void StoreItem(byte slot, Item pItem, bool update) @@ -154,9 +154,9 @@ namespace Game.Entities if (pItem != null && pItem.GetGUID() != GetGUID()) { m_bagslot[slot] = pItem; - SetGuidValue(ContainerFields.Slot1 + (slot * 4), pItem.GetGUID()); - pItem.SetGuidValue(ItemFields.Contained, GetGUID()); - pItem.SetGuidValue(ItemFields.Owner, GetOwnerGUID()); + SetSlot(slot, pItem.GetGUID()); + pItem.SetContainedIn(GetGUID()); + pItem.SetOwnerGUID(GetOwnerGUID()); pItem.SetContainer(this); pItem.SetSlot(slot); } @@ -171,6 +171,45 @@ namespace Game.Entities m_bagslot[i].BuildCreateUpdateBlockForPlayer(data, target); } + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt8((byte)flags); + m_objectData.WriteCreate(buffer, flags, this, target); + m_itemData.WriteCreate(buffer, flags, this, target); + m_containerData.WriteCreate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.Item)) + m_itemData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.Container)) + m_containerData.WriteUpdate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_containerData); + base.ClearUpdateMask(remove); + } + public bool IsEmpty() { for (var i = 0; i < GetBagSize(); ++i) @@ -243,13 +282,17 @@ namespace Game.Entities return null; } - public uint GetBagSize() { return GetUInt32Value(ContainerFields.NumSlots); } + public uint GetBagSize() { return m_containerData.NumSlots; } + void SetBagSize(uint numSlots) { SetUpdateFieldValue(m_values.ModifyValue(m_containerData).ModifyValue(m_containerData.NumSlots), numSlots); } + + void SetSlot(int slot, ObjectGuid guid) { SetUpdateFieldValue(ref m_values.ModifyValue(m_containerData).ModifyValue(m_containerData.Slots, slot), guid); } public static Item NewItemOrBag(ItemTemplate proto) { return (proto.GetInventoryType() == InventoryType.Bag) ? new Bag() : new Item(); } + ContainerData m_containerData; Item[] m_bagslot = new Item[36]; } } diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 9edbad82c..37ff0c4f4 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -39,8 +39,8 @@ namespace Game.Entities objectTypeMask |= TypeMask.Item; objectTypeId = TypeId.Item; - valuesCount = (int)ItemFields.End; - _dynamicValuesCount = (int)ItemDynamicFields.End; + m_itemData = new ItemData(); + uState = ItemUpdateState.New; uQueuePos = -1; m_lastPlayedTimeUpdate = Time.UnixTime; @@ -58,7 +58,7 @@ namespace Game.Entities if (owner) { SetOwnerGUID(owner.GetGUID()); - SetGuidValue(ItemFields.Contained, owner.GetGUID()); + SetContainedIn(owner.GetGUID()); } ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(itemid); @@ -66,18 +66,18 @@ namespace Game.Entities return false; _bonusData = new BonusData(itemProto); - SetUInt32Value(ItemFields.StackCount, 1); - SetUInt32Value(ItemFields.MaxDurability, itemProto.MaxDurability); - SetUInt32Value(ItemFields.Durability, itemProto.MaxDurability); + SetCount(1); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.MaxDurability), itemProto.MaxDurability); + SetDurability(itemProto.MaxDurability); - for (var i = 0; i < itemProto.Effects.Count; ++i) + for (int i = 0; i < itemProto.Effects.Count; ++i) { if (i < 5) SetSpellCharges(i, itemProto.Effects[i].Charges); } - SetUInt32Value(ItemFields.Duration, itemProto.GetDuration()); - SetUInt32Value(ItemFields.CreatePlayedTime, 0); + SetExpiration(itemProto.GetDuration()); + SetCreatePlayedTime(0); if (itemProto.GetArtifactID() != 0) { @@ -117,18 +117,20 @@ namespace Game.Entities public void UpdateDuration(Player owner, uint diff) { - uint dur = GetUInt32Value(ItemFields.Duration); + uint duration = m_itemData.Expiration; + if (duration == 0) + return; - Log.outDebug(LogFilter.Player, "Item.UpdateDuration Item (Entry: {0} Duration {1} Diff {2})", GetEntry(), dur, diff); + Log.outDebug(LogFilter.Player, "Item.UpdateDuration Item (Entry: {0} Duration {1} Diff {2})", GetEntry(), duration, diff); - if (dur <= diff) + if (duration <= diff) { Global.ScriptMgr.OnItemExpire(owner, GetTemplate()); owner.DestroyItem(GetBagSlot(), GetSlot(), true); return; } - SetUInt32Value(ItemFields.Duration, dur - diff); + SetExpiration(duration - diff); SetState(ItemUpdateState.Changed, owner); // save new time in database } @@ -144,37 +146,37 @@ namespace Game.Entities stmt = DB.Characters.GetPreparedStatement(uState == ItemUpdateState.New ? CharStatements.REP_ITEM_INSTANCE : CharStatements.UPD_ITEM_INSTANCE); stmt.AddValue(index, GetEntry()); stmt.AddValue(++index, GetOwnerGUID().GetCounter()); - stmt.AddValue(++index, GetGuidValue(ItemFields.Creator).GetCounter()); - stmt.AddValue(++index, GetGuidValue(ItemFields.GiftCreator).GetCounter()); + stmt.AddValue(++index, GetCreator().GetCounter()); + stmt.AddValue(++index, GetGiftCreator().GetCounter()); stmt.AddValue(++index, GetCount()); - stmt.AddValue(++index, GetUInt32Value(ItemFields.Duration)); + stmt.AddValue(++index, (uint)m_itemData.Expiration); StringBuilder ss = new StringBuilder(); for (byte i = 0; i < ItemConst.MaxSpells; ++i) ss.AppendFormat("{0} ", GetSpellCharges(i)); stmt.AddValue(++index, ss.ToString()); - stmt.AddValue(++index, GetUInt32Value(ItemFields.Flags)); + stmt.AddValue(++index, (uint)m_itemData.DynamicFlags); ss.Clear(); for (EnchantmentSlot slot = 0; slot < EnchantmentSlot.Max; ++slot) ss.AppendFormat("{0} {1} {2} ", GetEnchantmentId(slot), GetEnchantmentDuration(slot), GetEnchantmentCharges(slot)); stmt.AddValue(++index, ss.ToString()); - stmt.AddValue(++index, (byte)GetItemRandomEnchantmentId().Type); - stmt.AddValue(++index, GetItemRandomEnchantmentId().Id); - stmt.AddValue(++index, GetUInt32Value(ItemFields.Durability)); - stmt.AddValue(++index, GetUInt32Value(ItemFields.CreatePlayedTime)); + stmt.AddValue(++index, m_randomBonusListId); + stmt.AddValue(++index, (uint)m_itemData.Durability); + stmt.AddValue(++index, (uint)m_itemData.CreatePlayedTime); stmt.AddValue(++index, m_text); stmt.AddValue(++index, GetModifier(ItemModifier.UpgradeId)); stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetSpeciesId)); stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetBreedData)); stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetLevel)); stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetDisplayId)); - stmt.AddValue(++index, (byte)GetUInt32Value(ItemFields.Context)); + stmt.AddValue(++index, (byte)m_itemData.Context); ss.Clear(); - foreach (uint bonusListID in GetDynamicValues(ItemDynamicFields.BonusListIds)) + + foreach (int bonusListID in (List)m_itemData.BonusListIDs) ss.Append(bonusListID + ' '); stmt.AddValue(++index, ss.ToString()); @@ -182,7 +184,7 @@ namespace Game.Entities DB.Characters.Execute(stmt); - if ((uState == ItemUpdateState.Changed) && HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped)) + if ((uState == ItemUpdateState.Changed) && HasItemFlag(ItemFieldFlags.Wrapped)) { stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GIFT_OWNER); stmt.AddValue(0, GetOwnerGUID().GetCounter()); @@ -194,17 +196,18 @@ namespace Game.Entities stmt.AddValue(0, GetGUID().GetCounter()); trans.Append(stmt); - if (!GetGems().Empty()) + if (m_itemData.Gems.Size() != 0) { stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_ITEM_INSTANCE_GEMS); stmt.AddValue(0, GetGUID().GetCounter()); int i = 0; int gemFields = 4; - foreach (ItemDynamicFieldGems gemData in GetGems()) + + foreach (SocketedGem gemData in m_itemData.Gems) { if (gemData.ItemId != 0) { - stmt.AddValue(1 + i * gemFields, gemData.ItemId); + stmt.AddValue(1 + i * gemFields, (uint)gemData.ItemId); StringBuilder gemBonusListIDs = new StringBuilder(); foreach (ushort bonusListID in gemData.BonusListIDs) { @@ -213,7 +216,7 @@ namespace Game.Entities } stmt.AddValue(2 + i * gemFields, gemBonusListIDs.ToString()); - stmt.AddValue(3 + i * gemFields, gemData.Context); + stmt.AddValue(3 + i * gemFields, (byte)gemData.Context); stmt.AddValue(4 + i * gemFields, m_gemScalingLevels[i]); } else @@ -225,6 +228,7 @@ namespace Game.Entities } ++i; } + for (; i < ItemConst.MaxGemSockets; ++i) { stmt.AddValue(1 + i * gemFields, 0); @@ -283,12 +287,12 @@ namespace Game.Entities { stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_ITEM_INSTANCE_ARTIFACT); stmt.AddValue(0, GetGUID().GetCounter()); - stmt.AddValue(1, GetUInt64Value(ItemFields.ArtifactXp)); + stmt.AddValue(1, (ulong)m_itemData.ArtifactXP); stmt.AddValue(2, GetModifier(ItemModifier.ArtifactAppearanceId)); stmt.AddValue(3, GetModifier(ItemModifier.ArtifactTier)); trans.Append(stmt); - foreach (ItemDynamicFieldArtifactPowers artifactPower in GetArtifactPowers()) + foreach (ArtifactPower artifactPower in m_itemData.ArtifactPowers) { stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_ITEM_INSTANCE_ARTIFACT_POWERS); stmt.AddValue(0, GetGUID().GetCounter()); @@ -344,7 +348,7 @@ namespace Game.Entities stmt.AddValue(0, GetGUID().GetCounter()); trans.Append(stmt); - if (HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped)) + if (HasItemFlag(ItemFieldFlags.Wrapped)) { stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GIFT); stmt.AddValue(0, GetGUID().GetCounter()); @@ -390,22 +394,23 @@ namespace Game.Entities if (creator != 0) { if (!Convert.ToBoolean(itemFlags & (int)ItemFieldFlags.Child)) - SetGuidValue(ItemFields.Creator, ObjectGuid.Create(HighGuid.Player, creator)); + SetCreator(ObjectGuid.Create(HighGuid.Player, creator)); else - SetGuidValue(ItemFields.Creator, ObjectGuid.Create(HighGuid.Item, creator)); + SetCreator(ObjectGuid.Create(HighGuid.Item, creator)); } ulong giftCreator = fields.Read(3); if (giftCreator != 0) - SetGuidValue(ItemFields.GiftCreator, ObjectGuid.Create(HighGuid.Player, giftCreator)); + SetGiftCreator(ObjectGuid.Create(HighGuid.Player, giftCreator)); + SetCount(fields.Read(4)); uint duration = fields.Read(5); - SetUInt32Value(ItemFields.Duration, duration); + SetExpiration(duration); // update duration if need, and remove if not need if (proto.GetDuration() != duration) { - SetUInt32Value(ItemFields.Duration, proto.GetDuration()); + SetExpiration(proto.GetDuration()); need_save = true; } @@ -419,22 +424,22 @@ namespace Game.Entities } } - SetUInt32Value(ItemFields.Flags, itemFlags); + SetItemFlags((ItemFieldFlags)itemFlags); - uint durability = fields.Read(11); - SetUInt32Value(ItemFields.Durability, durability); + uint durability = fields.Read(10); + SetDurability(durability); // update max durability (and durability) if need - SetUInt32Value(ItemFields.MaxDurability, proto.MaxDurability); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.MaxDurability), proto.MaxDurability); if (durability > proto.MaxDurability) { - SetUInt32Value(ItemFields.Durability, proto.MaxDurability); + SetDurability(proto.MaxDurability); need_save = true; } - SetUInt32Value(ItemFields.CreatePlayedTime, fields.Read(12)); - SetText(fields.Read(13)); + SetCreatePlayedTime(fields.Read(11)); + SetText(fields.Read(12)); - uint upgradeId = fields.Read(14); + uint upgradeId = fields.Read(13); ItemUpgradeRecord rulesetUpgrade = CliDB.ItemUpgradeStorage.LookupByKey(Global.DB2Mgr.GetRulesetItemUpgrade(entry)); ItemUpgradeRecord upgrade = CliDB.ItemUpgradeStorage.LookupByKey(upgradeId); if (rulesetUpgrade == null || upgrade == null || rulesetUpgrade.ItemUpgradePathID != upgrade.ItemUpgradePathID) @@ -450,42 +455,41 @@ namespace Game.Entities } SetModifier(ItemModifier.UpgradeId, upgradeId); - SetModifier(ItemModifier.BattlePetSpeciesId, fields.Read(15)); - SetModifier(ItemModifier.BattlePetBreedData, fields.Read(16)); - SetModifier(ItemModifier.BattlePetLevel, fields.Read(17)); - SetModifier(ItemModifier.BattlePetDisplayId, fields.Read(18)); + SetModifier(ItemModifier.BattlePetSpeciesId, fields.Read(14)); + SetModifier(ItemModifier.BattlePetBreedData, fields.Read(15)); + SetModifier(ItemModifier.BattlePetLevel, fields.Read(16)); + SetModifier(ItemModifier.BattlePetDisplayId, fields.Read(17)); - SetUInt32Value(ItemFields.Context, fields.Read(19)); + SetContext(fields.Read(18)); - var bonusListIDs = new StringArray(fields.Read(20), ' '); - if (!tokens.IsEmpty()) + var bonusListString = new StringArray(fields.Read(19), ' '); + List bonusListIDs = new List(); + for (var i = 0; i < bonusListString.Length; ++i) { - for (var i = 0; i < bonusListIDs.Length; ++i) - { - if (uint.TryParse(tokens[i], out uint bonusListID)) - AddBonuses(bonusListID); - } + if (uint.TryParse(tokens[i], out uint bonusListID)) + bonusListIDs.Add(bonusListID); } + SetBonuses(bonusListIDs); - SetModifier(ItemModifier.TransmogAppearanceAllSpecs, fields.Read(21)); - SetModifier(ItemModifier.TransmogAppearanceSpec1, fields.Read(22)); - SetModifier(ItemModifier.TransmogAppearanceSpec2, fields.Read(23)); - SetModifier(ItemModifier.TransmogAppearanceSpec3, fields.Read(24)); - SetModifier(ItemModifier.TransmogAppearanceSpec4, fields.Read(25)); + SetModifier(ItemModifier.TransmogAppearanceAllSpecs, fields.Read(20)); + SetModifier(ItemModifier.TransmogAppearanceSpec1, fields.Read(21)); + SetModifier(ItemModifier.TransmogAppearanceSpec2, fields.Read(22)); + SetModifier(ItemModifier.TransmogAppearanceSpec3, fields.Read(23)); + SetModifier(ItemModifier.TransmogAppearanceSpec4, fields.Read(24)); - SetModifier(ItemModifier.EnchantIllusionAllSpecs, fields.Read(26)); - SetModifier(ItemModifier.EnchantIllusionSpec1, fields.Read(27)); - SetModifier(ItemModifier.EnchantIllusionSpec2, fields.Read(28)); - SetModifier(ItemModifier.EnchantIllusionSpec3, fields.Read(29)); - SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read(30)); + SetModifier(ItemModifier.EnchantIllusionAllSpecs, fields.Read(25)); + SetModifier(ItemModifier.EnchantIllusionSpec1, fields.Read(26)); + SetModifier(ItemModifier.EnchantIllusionSpec2, fields.Read(27)); + SetModifier(ItemModifier.EnchantIllusionSpec3, fields.Read(28)); + SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read(29)); int gemFields = 4; ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets]; for (int i = 0; i < ItemConst.MaxGemSockets; ++i) { gemData[i] = new ItemDynamicFieldGems(); - gemData[i].ItemId = fields.Read(31 + i * gemFields); - var gemBonusListIDs = new StringArray(fields.Read(32 + i * gemFields), ' '); + gemData[i].ItemId = fields.Read(30 + i * gemFields); + var gemBonusListIDs = new StringArray(fields.Read(31 + i * gemFields), ' '); if (!gemBonusListIDs.IsEmpty()) { uint b = 0; @@ -496,31 +500,33 @@ namespace Game.Entities } } - gemData[i].Context = fields.Read(33 + i * gemFields); + gemData[i].Context = fields.Read(32 + i * gemFields); if (gemData[i].ItemId != 0) - SetGem((ushort)i, gemData[i], fields.Read(34 + i * gemFields)); + SetGem((ushort)i, gemData[i], fields.Read(33 + i * gemFields)); } - SetModifier(ItemModifier.ScalingStatDistributionFixedLevel, fields.Read(43)); - SetModifier(ItemModifier.ArtifactKnowledgeLevel, fields.Read(44)); + SetModifier(ItemModifier.ScalingStatDistributionFixedLevel, fields.Read(42)); + SetModifier(ItemModifier.ArtifactKnowledgeLevel, fields.Read(43)); // Enchants must be loaded after all other bonus/scaling data - _LoadIntoDataField(fields.Read(8), (uint)ItemFields.Enchantment, (uint)EnchantmentSlot.Max * (uint)EnchantmentOffset.Max); - m_randomEnchantment.Type = (ItemRandomEnchantmentType)fields.Read(9); - m_randomEnchantment.Id = fields.Read(10); - if (m_randomEnchantment.Type == ItemRandomEnchantmentType.Property) - SetUInt32Value(ItemFields.RandomPropertiesId, m_randomEnchantment.Id); - else if (m_randomEnchantment.Type == ItemRandomEnchantmentType.Suffix) + var enchantmentTokens = new StringArray(fields.Read(8), ' '); + if (enchantmentTokens.Length == (int)EnchantmentSlot.Max * (int)EnchantmentOffset.Max) { - SetInt32Value(ItemFields.RandomPropertiesId, -(int)m_randomEnchantment.Id); - // recalculate suffix factor - UpdateItemSuffixFactor(); + for (int i = 0; i < (int)EnchantmentSlot.Max; ++i) + { + ItemEnchantment enchantmentField = m_itemData.ModifyValue(m_itemData.Enchantment, i); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), uint.Parse(enchantmentTokens[i * (int)EnchantmentOffset.Max + 0])); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), uint.Parse(enchantmentTokens[i * (int)EnchantmentOffset.Max + 1])); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), short.Parse(enchantmentTokens[i * (int)EnchantmentOffset.Max + 2])); + } } + m_randomBonusListId = fields.Read(10); + // Remove bind flag for items vs NO_BIND set if (IsSoulBound() && GetBonding() == ItemBondingType.None) { - ApplyModFlag(ItemFields.Flags, ItemFieldFlags.Soulbound, false); + RemoveItemFlag(ItemFieldFlags.Soulbound); need_save = true; } @@ -528,9 +534,9 @@ namespace Game.Entities { byte index = 0; PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD); - stmt.AddValue(index++, GetUInt32Value(ItemFields.Duration)); - stmt.AddValue(index++, GetUInt32Value(ItemFields.Flags)); - stmt.AddValue(index++, GetUInt32Value(ItemFields.Durability)); + stmt.AddValue(index++, (uint)m_itemData.Expiration); + stmt.AddValue(index++, (uint)m_itemData.DynamicFlags); + stmt.AddValue(index++, (uint)m_itemData.Durability); stmt.AddValue(index++, GetModifier(ItemModifier.UpgradeId)); stmt.AddValue(index++, guid); DB.Characters.Execute(stmt); @@ -538,12 +544,12 @@ namespace Game.Entities return true; } - public void LoadArtifactData(Player owner, ulong xp, uint artifactAppearanceId, uint artifactTier, List powers) + public void LoadArtifactData(Player owner, ulong xp, uint artifactAppearanceId, uint artifactTier, List powers) { for (byte i = 0; i <= artifactTier; ++i) InitArtifactPowers(GetTemplate().GetArtifactID(), i); - SetUInt64Value(ItemFields.ArtifactXp, xp); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactXP), xp); SetModifier(ItemModifier.ArtifactAppearanceId, artifactAppearanceId); SetModifier(ItemModifier.ArtifactTier, artifactTier); @@ -552,7 +558,7 @@ namespace Game.Entities SetAppearanceModId(artifactAppearance.ItemAppearanceModifierID); byte totalPurchasedRanks = 0; - foreach (ItemDynamicFieldArtifactPowers power in powers) + foreach (ArtifactPowerLoadInfo power in powers) { power.CurrentRankWithBonus += power.PurchasedRank; totalPurchasedRanks += power.PurchasedRank; @@ -595,17 +601,16 @@ namespace Game.Entities } } - SetArtifactPower(power); + SetArtifactPower((ushort)power.ArtifactPowerId, power.PurchasedRank, power.CurrentRankWithBonus); } - foreach (ItemDynamicFieldArtifactPowers power in powers) + foreach (ArtifactPowerLoadInfo power in powers) { ArtifactPowerRecord scaledArtifactPowerEntry = CliDB.ArtifactPowerStorage.LookupByKey(power.ArtifactPowerId); if (!scaledArtifactPowerEntry.Flags.HasAnyFlag(ArtifactPowerFlag.ScalesWithNumPowers)) continue; - power.CurrentRankWithBonus = (byte)(totalPurchasedRanks + 1); - SetArtifactPower(power); + SetArtifactPower((ushort)power.ArtifactPowerId, power.PurchasedRank, (byte)(totalPurchasedRanks + 1)); } CheckArtifactRelicSlotUnlock(owner != null ? owner : GetOwner()); @@ -670,69 +675,12 @@ namespace Game.Entities return proto.GetSkill(); } - public void SetItemRandomProperties(ItemRandomEnchantmentId randomPropId) + public void SetItemRandomBonusList(uint bonusListId) { - if (randomPropId.Id == 0) + if (bonusListId == 0) return; - switch (randomPropId.Type) - { - case ItemRandomEnchantmentType.Property: - { - ItemRandomPropertiesRecord item_rand = CliDB.ItemRandomPropertiesStorage.LookupByKey(randomPropId.Id); - if (item_rand != null) - { - if (GetUInt32Value(ItemFields.RandomPropertiesId) != randomPropId.Id) - { - SetUInt32Value(ItemFields.RandomPropertiesId, randomPropId.Id); - SetState(ItemUpdateState.Changed, GetOwner()); - } - for (EnchantmentSlot i = EnchantmentSlot.Prop0; i <= EnchantmentSlot.Prop4; ++i) - SetEnchantment(i, item_rand.Enchantment[i - EnchantmentSlot.Prop0], 0, 0); - } - } - break; - case ItemRandomEnchantmentType.Suffix: - { - ItemRandomSuffixRecord item_rand = CliDB.ItemRandomSuffixStorage.LookupByKey(randomPropId.Id); - if (item_rand != null) - { - if (GetInt32Value(ItemFields.RandomPropertiesId) != -(int)randomPropId.Id || GetItemSuffixFactor() == 0) - { - SetInt32Value(ItemFields.RandomPropertiesId, -(int)randomPropId.Id); - UpdateItemSuffixFactor(); - SetState(ItemUpdateState.Changed, GetOwner()); - } - - for (var i = EnchantmentSlot.Prop0; i <= EnchantmentSlot.Prop4; ++i) - SetEnchantment(i, item_rand.Enchantment[i - EnchantmentSlot.Prop0], 0, 0); - } - } - break; - case ItemRandomEnchantmentType.BonusList: - AddBonuses(randomPropId.Id); - break; - default: - break; - } - } - - void UpdateItemSuffixFactor() - { - if (GetTemplate().GetRandomSuffix() == 0) - return; - - uint suffixFactor = 0; - Player owner = GetOwner(); - if (owner) - suffixFactor = ItemEnchantment.GetRandomPropertyPoints(GetItemLevel(owner), GetQuality(), GetTemplate().GetInventoryType(), GetTemplate().GetSubClass()); - else - suffixFactor = ItemEnchantment.GenerateEnchSuffixFactor(GetEntry()); - - if (GetItemSuffixFactor() == suffixFactor) - return; - - SetUInt32Value(ItemFields.PropertySeed, suffixFactor); + AddBonuses(bonusListId); } public void SetState(ItemUpdateState state, Player forplayer = null) @@ -817,7 +765,7 @@ namespace Game.Entities if (m_lootGenerated) return false; - if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!HasFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable) || !trade))) + if ((!mail || !IsBoundAccountWide()) && (IsSoulBound() && (!HasItemFlag(ItemFieldFlags.BopTradeable) || !trade))) return false; if (IsBag() && (Player.IsBagPos(GetPos()) || !ToBag().IsEmpty())) @@ -840,7 +788,7 @@ namespace Game.Entities public void SetCount(uint value) { - SetUInt32Value(ItemFields.StackCount, value); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.StackCount), value); Player player = GetOwner(); if (player) @@ -974,7 +922,7 @@ namespace Game.Entities { uint oldEnchant = GetEnchantmentId(slot); if (oldEnchant != 0) - owner.GetSession().SendEnchantmentLog(GetOwnerGUID(), ObjectGuid.Empty, GetGUID(), GetEntry(), oldEnchant, (uint)slot); + owner.GetSession().SendEnchantmentLog(GetOwnerGUID(), ObjectGuid.Empty, GetGUID(), GetEntry(), (uint)oldEnchant, (uint)slot); if (id != 0) owner.GetSession().SendEnchantmentLog(GetOwnerGUID(), caster, GetGUID(), GetEntry(), id, (uint)slot); @@ -983,9 +931,10 @@ namespace Game.Entities ApplyArtifactPowerEnchantmentBonuses(slot, GetEnchantmentId(slot), false, owner); ApplyArtifactPowerEnchantmentBonuses(slot, id, true, owner); - SetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Id, id); - SetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Duration, duration); - SetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Charges, charges); + ItemEnchantment enchantmentField = m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), id); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), duration); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), (short)charges); SetState(ItemUpdateState.Changed, owner); } @@ -994,7 +943,7 @@ namespace Game.Entities if (GetEnchantmentDuration(slot) == duration) return; - SetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Duration, duration); + SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.Duration), duration); SetState(ItemUpdateState.Changed, owner); // Cannot use GetOwner() here, has to be passed as an argument to avoid freeze due to hashtable locking } @@ -1004,7 +953,7 @@ namespace Game.Entities if (GetEnchantmentCharges(slot) == charges) return; - SetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Charges, charges); + SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.Charges), (short)charges); SetState(ItemUpdateState.Changed, GetOwner()); } @@ -1013,20 +962,18 @@ namespace Game.Entities if (GetEnchantmentId(slot) == 0) return; - for (byte x = 0; x < ItemConst.MaxItemEnchantmentEffects; ++x) - SetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + x, 0); + ItemEnchantment enchantmentField = m_itemData.ModifyValue(m_itemData.Enchantment, (int)slot); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.ID), 0u); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Duration), 0u); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Charges), (short)0); + SetUpdateFieldValue(enchantmentField.ModifyValue(enchantmentField.Inactive), (ushort)0); SetState(ItemUpdateState.Changed, GetOwner()); } - public List GetGems() - { - return GetDynamicStructuredValues(ItemDynamicFields.Gems); - } - - public ItemDynamicFieldGems GetGem(ushort slot) + public SocketedGem GetGem(ushort slot) { //ASSERT(slot < MAX_GEM_SOCKETS); - return GetDynamicStructuredValue(ItemDynamicFields.Gems, slot); + return slot < m_itemData.Gems.Size() ? m_itemData.Gems[slot] : null; } public void SetGem(ushort slot, ItemDynamicFieldGems gem, uint gemScalingLevel) @@ -1052,7 +999,7 @@ namespace Game.Entities { foreach (ItemBonusRecord itemBonus in bonuses) - gemBonus.AddBonus(itemBonus.Type, itemBonus.Value); + gemBonus.AddBonus(itemBonus.BonusType, itemBonus.Value); } uint gemBaseItemLevel = gemTemplate.GetBaseItemLevel(); @@ -1076,7 +1023,7 @@ namespace Game.Entities if (bonusesEffect != null) { foreach (ItemBonusRecord itemBonus in bonusesEffect) - if (itemBonus.Type == ItemBonusType.ItemLevel) + if (itemBonus.BonusType == ItemBonusType.ItemLevel) _bonusData.GemItemLevelBonus[slot] += (uint)itemBonus.Value[0]; } @@ -1090,7 +1037,7 @@ namespace Game.Entities var bonusesEffect = Global.DB2Mgr.GetItemBonusList(artifactrBonusListId); if (bonusesEffect != null) foreach (ItemBonusRecord itemBonus in bonusesEffect) - if (itemBonus.Type == ItemBonusType.ItemLevel) + if (itemBonus.BonusType == ItemBonusType.ItemLevel) _bonusData.GemItemLevelBonus[slot] += (uint)itemBonus.Value[0]; } break; @@ -1104,13 +1051,17 @@ namespace Game.Entities } } - SetDynamicStructuredValue(ItemDynamicFields.Gems, slot, gem); + SocketedGem gemField = m_itemData.ModifyValue(m_itemData.Gems, slot); + SetUpdateFieldValue(gemField.ModifyValue(gemField.ItemId), gem.ItemId); + SetUpdateFieldValue(gemField.ModifyValue(gemField.Context), gem.Context); + for (int i = 0; i < 16; ++i) + SetUpdateFieldValue(ref gemField.ModifyValue(gemField.BonusListIDs, i), gem.BonusListIDs[i]); } public bool GemsFitSockets() { uint gemSlot = 0; - foreach (ItemDynamicFieldGems gemData in GetGems()) + foreach (SocketedGem gemData in m_itemData.Gems) { SocketColor SocketColor = GetTemplate().GetSocketColor(gemSlot); if (SocketColor == 0) // no socket slot @@ -1134,12 +1085,14 @@ namespace Game.Entities public byte GetGemCountWithID(uint GemID) { - return (byte)GetGems().Count(gemData => gemData.ItemId == GemID); + var list = (List)m_itemData.Gems.GetEnumerator(); + return (byte)list.Count(gemData => gemData.ItemId == GemID); } public byte GetGemCountWithLimitCategory(uint limitCategory) { - return (byte)GetGems().Count(gemData => + var list = (List)m_itemData.Gems.GetEnumerator(); + return (byte)list.Count(gemData => { ItemTemplate gemProto = Global.ObjectMgr.GetItemTemplate(gemData.ItemId); if (gemProto == null) @@ -1165,7 +1118,7 @@ namespace Game.Entities public void SendTimeUpdate(Player owner) { - uint duration = GetUInt32Value(ItemFields.Duration); + uint duration = m_itemData.Expiration; if (duration == 0) return; @@ -1203,13 +1156,13 @@ namespace Game.Entities if (newItem == null) return null; - newItem.SetUInt32Value(ItemFields.Creator, GetUInt32Value(ItemFields.Creator)); - newItem.SetUInt32Value(ItemFields.GiftCreator, GetUInt32Value(ItemFields.GiftCreator)); - newItem.SetUInt32Value(ItemFields.Flags, GetUInt32Value(ItemFields.Flags)); - newItem.SetUInt32Value(ItemFields.Duration, GetUInt32Value(ItemFields.Duration)); + newItem.SetCreator(GetCreator()); + newItem.SetGiftCreator(GetGiftCreator()); + newItem.SetItemFlags((ItemFieldFlags)(m_itemData.DynamicFlags & ~(uint)(ItemFieldFlags.Refundable | ItemFieldFlags.BopTradeable))); + newItem.SetExpiration(m_itemData.Expiration); // player CAN be NULL in which case we must not update random properties because that accesses player's item update queue if (player != null) - newItem.SetItemRandomProperties(GetItemRandomEnchantmentId()); + newItem.SetItemRandomBonusList(m_randomBonusListId); return newItem; } @@ -1223,7 +1176,7 @@ namespace Game.Entities if (GetOwnerGUID() == player.GetGUID()) return false; - if (HasFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable)) + if (HasItemFlag(ItemFieldFlags.BopTradeable)) if (allowedGUIDs.Contains(player.GetGUID())) return false; @@ -1242,75 +1195,64 @@ namespace Game.Entities ClearUpdateMask(false); } - public override void BuildDynamicValuesUpdate(UpdateType updateType, WorldPacket data, Player target) + public override UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) { - if (!target) - return; + if (target.GetGUID() == GetOwnerGUID()) + return UpdateFieldFlag.Owner; - ByteBuffer fieldBuffer = new ByteBuffer(); - UpdateMask fieldMask = new UpdateMask(_dynamicValuesCount); + return UpdateFieldFlag.None; + } - uint[] flags = null; - uint visibleFlag = GetDynamicUpdateFieldData(target, out flags); + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); - for (ushort index = 0; index < _dynamicValuesCount; ++index) - { - var values = _dynamicValues[index]; - if (_fieldNotifyFlags.HasAnyFlag(flags[index]) || - ((updateType == UpdateType.Values ? _dynamicChangesMask[index] != DynamicFieldChangeType.Unchanged : !values.Empty()) && flags[index].HasAnyFlag(visibleFlag))) - { - ByteBuffer arrayValuesBuffer = new ByteBuffer(); - fieldMask.SetBit(index); + m_objectData.WriteCreate(buffer, flags, this, target); + m_itemData.WriteCreate(buffer, flags, this, target); - DynamicUpdateMask arrayValuesMask = new DynamicUpdateMask((uint)values.Length); - arrayValuesMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType); + data.WriteUInt32(buffer.GetSize() + 1); + data.WriteUInt8((byte)flags); + data.WriteBytes(buffer); + } - if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged) - arrayValuesMask.SetCount(values.Length); + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); - if (index != (int)ItemDynamicFields.Modifiers) - { - for (var v = 0; v < values.Length; ++v) - { - if (updateType != UpdateType.Values || _dynamicChangesArrayMask[index].Get(v)) - { - arrayValuesMask.SetBit(v); - arrayValuesBuffer.WriteUInt32(values[v]); - } - } - } - else - { - int m = 0; + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); - if (updateType == UpdateType.Values && _dynamicChangesMask[index] != DynamicFieldChangeType.ValueAndSizeChanged && _changesMask.Get((int)ItemFields.ModifiersMask)) - { - arrayValuesMask.DynamicFieldChangeType |= (int)DynamicFieldChangeType.ValueAndSizeChanged; - arrayValuesMask.SetCount(m); - } + if (m_values.HasChanged(TypeId.Item)) + m_itemData.WriteUpdate(buffer, flags, this, target); - // in case of ITEM_DYNAMIC_FIELD_MODIFIERS it is ITEM_FIELD_MODIFIERS_MASK that controls index of each value, not updatemask - // so we just have to write this starting from 0 index - for (var v = 0; v < values.Length; ++v) - { - if (values[v] != 0) - { - arrayValuesMask.SetBit(m++); - arrayValuesBuffer.WriteUInt32(values[v]); - } - } - if (updateType == UpdateType.Values && _changesMask.Get((int)ItemFields.ModifiersMask)) - arrayValuesMask.SetCount(m); - } + data.WriteUInt32(buffer.GetSize()); + data.WriteUInt32(m_values.GetChangedObjectTypeMask()); + data.WriteBytes(buffer); + } - arrayValuesMask.AppendToPacket(fieldBuffer); - fieldBuffer.WriteBytes(arrayValuesBuffer); - } - } + void BuildValuesUpdateWithFlag(ByteBuffer data, UpdateFieldFlag flags, Player target) + { + UpdateMask valuesMask = new UpdateMask(14); + valuesMask.Set((int)TypeId.Item); - fieldMask.AppendToPacket(data); - data.WriteBytes(fieldBuffer); + WorldPacket buffer = new WorldPacket(); + UpdateMask mask = new UpdateMask(40); + + buffer.WriteUInt32(valuesMask.GetBlock(0)); + m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags); + m_itemData.WriteUpdate(buffer, mask, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_itemData); + base.ClearUpdateMask(remove); } public override void AddToObjectUpdate() @@ -1351,14 +1293,14 @@ namespace Game.Entities public void SetNotRefundable(Player owner, bool changestate = true, SQLTransaction trans = null, bool addToCollection = true) { - if (!HasFlag(ItemFields.Flags, ItemFieldFlags.Refundable)) + if (!HasItemFlag(ItemFieldFlags.Refundable)) return; ItemExpirePurchaseRefund itemExpirePurchaseRefund = new ItemExpirePurchaseRefund(); itemExpirePurchaseRefund.ItemGUID = GetGUID(); owner.SendPacket(itemExpirePurchaseRefund); - RemoveFlag(ItemFields.Flags, ItemFieldFlags.Refundable); + RemoveItemFlag(ItemFieldFlags.Refundable); // Following is not applicable in the trading procedure if (changestate) SetState(ItemUpdateState.Changed, owner); @@ -1376,7 +1318,7 @@ namespace Game.Entities public void UpdatePlayedTime(Player owner) { // Get current played time - uint current_playtime = GetUInt32Value(ItemFields.CreatePlayedTime); + uint current_playtime = m_itemData.CreatePlayedTime; // Calculate time elapsed since last played time update long curtime = Time.UnixTime; uint elapsed = (uint)(curtime - m_lastPlayedTimeUpdate); @@ -1386,7 +1328,7 @@ namespace Game.Entities { // No? Proceed. // Update the data field - SetUInt32Value(ItemFields.CreatePlayedTime, new_playtime); + SetCreatePlayedTime(new_playtime); // Flag as changed to get saved to DB SetState(ItemUpdateState.Changed, owner); // Speaks for itself @@ -1401,7 +1343,7 @@ namespace Game.Entities { long curtime = Time.UnixTime; uint elapsed = (uint)(curtime - m_lastPlayedTimeUpdate); - return GetUInt32Value(ItemFields.CreatePlayedTime) + elapsed; + return m_itemData.CreatePlayedTime + elapsed; } public bool IsRefundExpired() @@ -1411,13 +1353,13 @@ namespace Game.Entities public void SetSoulboundTradeable(List allowedLooters) { - SetFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable); + AddItemFlag(ItemFieldFlags.BopTradeable); allowedGUIDs = allowedLooters; } public void ClearSoulboundTradeable(Player currentOwner) { - RemoveFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable); + RemoveItemFlag(ItemFieldFlags.BopTradeable); if (allowedGUIDs.Empty()) return; @@ -1432,7 +1374,7 @@ namespace Game.Entities public bool CheckSoulboundTradeExpire() { // called from owner's update - GetOwner() MUST be valid - if (GetUInt32Value(ItemFields.CreatePlayedTime) + 2 * Time.Hour < GetOwner().GetTotalPlayedTime()) + if (m_itemData.CreatePlayedTime + 2 * Time.Hour < GetOwner().GetTotalPlayedTime()) { ClearSoulboundTradeable(GetOwner()); return true; // remove from tradeable list @@ -1465,9 +1407,6 @@ namespace Game.Entities bool HasStats() { - if (GetItemRandomPropertyId() != 0) - return true; - ItemTemplate proto = GetTemplate(); Player owner = GetOwner(); for (byte i = 0; i < ItemConst.MaxStats; ++i) @@ -1810,7 +1749,7 @@ namespace Game.Entities stmt_items = DB.Characters.GetPreparedStatement(CharStatements.INS_ITEMCONTAINER_ITEMS); - // container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix + // container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, context, bonus_list_ids stmt_items.AddValue(0, loot.containerID.GetCounter()); stmt_items.AddValue(1, _li.itemid); stmt_items.AddValue(2, _li.count); @@ -1820,16 +1759,14 @@ namespace Game.Entities stmt_items.AddValue(6, _li.is_counted); stmt_items.AddValue(7, _li.is_underthreshold); stmt_items.AddValue(8, _li.needs_quest); - stmt_items.AddValue(9, (byte)_li.randomPropertyId.Type); - stmt_items.AddValue(10, _li.randomPropertyId.Id); - stmt_items.AddValue(11, _li.randomSuffix); - stmt_items.AddValue(12, _li.context); + stmt_items.AddValue(9, _li.randomBonusListId); + stmt_items.AddValue(10, _li.context); string bonusListIDs = ""; foreach (int bonusListID in _li.BonusListIDs) bonusListIDs += bonusListID + ' '; - stmt_items.AddValue(13, bonusListIDs); + stmt_items.AddValue(11, bonusListIDs); trans.Append(stmt_items); } } @@ -1872,7 +1809,7 @@ namespace Game.Entities // Create an empty LootItem LootItem loot_item = new LootItem(); - // item_id, itm_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix + // item_id, itm_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, context, bonus_list_ids loot_item.itemid = item_result.Read(0); loot_item.count = item_result.Read(1); loot_item.follow_loot_rules = item_result.Read(2); @@ -1882,11 +1819,10 @@ namespace Game.Entities loot_item.canSave = true; loot_item.is_underthreshold = item_result.Read(6); loot_item.needs_quest = item_result.Read(7); - loot_item.randomPropertyId = new ItemRandomEnchantmentId((ItemRandomEnchantmentType)item_result.Read(8), item_result.Read(9)); - loot_item.randomSuffix = item_result.Read(10); - loot_item.context = item_result.Read(11); + loot_item.randomBonusListId = item_result.Read(8); + loot_item.context = item_result.Read(9); - StringArray bonusLists = new StringArray(item_result.Read(12), ' '); + StringArray bonusLists = new StringArray(item_result.Read(10), ' '); if (!bonusLists.IsEmpty()) { foreach (string line in bonusLists) @@ -1953,9 +1889,9 @@ namespace Game.Entities public uint GetItemLevel(Player owner) { - uint minItemLevel = owner.GetUInt32Value(UnitFields.MinItemLevel); - uint minItemLevelCutoff = owner.GetUInt32Value(UnitFields.MinItemLevelCutoff); - uint maxItemLevel = GetTemplate().GetFlags3().HasAnyFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0 : owner.GetUInt32Value(UnitFields.MaxItemlevel); + uint minItemLevel = owner.m_unitData.MinItemLevel; + uint minItemLevelCutoff = owner.m_unitData.MinItemLevelCutoff; + uint maxItemLevel = GetTemplate().GetFlags3().HasAnyFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0u : owner.m_unitData.MaxItemLevel; bool pvpBonus = owner.IsUsingPvpItemLevels(); return GetItemLevel(GetTemplate(), _bonusData, owner.getLevel(), GetModifier(ItemModifier.ScalingStatDistributionFixedLevel), GetModifier(ItemModifier.UpgradeId), minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus); @@ -2015,7 +1951,7 @@ namespace Game.Entities { Cypher.Assert(index < ItemConst.MaxStats); uint itemLevel = GetItemLevel(owner); - uint randomPropPoints = ItemEnchantment.GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate().GetInventoryType(), GetTemplate().GetSubClass()); + uint randomPropPoints = ItemEnchantmentManager.GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate().GetInventoryType(), GetTemplate().GetSubClass()); if (randomPropPoints != 0) { float statValue = (_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f; @@ -2074,7 +2010,7 @@ namespace Game.Entities public uint GetDisplayId(Player owner) { ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs; - if (HasFlag(ItemFields.ModifiersMask, ItemConst.AppearanceModifierMaskSpecSpecific)) + if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0) transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]; ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier)); @@ -2095,19 +2031,48 @@ namespace Game.Entities public uint GetModifier(ItemModifier modifier) { - return GetDynamicValue(ItemDynamicFields.Modifiers, (byte)modifier); + if ((m_itemData.ModifiersMask & (1 << (int)modifier)) == 0) + return 0; + + int valueIndex = 0; + uint mask = m_itemData.ModifiersMask; + for (int i = 0; i < (int)modifier; ++i) + if ((mask & (1 << i)) != 0) + ++valueIndex; + + return m_itemData.Modifiers[valueIndex]; } public void SetModifier(ItemModifier modifier, uint value) { - ApplyModFlag(ItemFields.ModifiersMask, 1 << (int)modifier, value != 0); - SetDynamicValue(ItemDynamicFields.Modifiers, (byte)modifier, value); + int valueIndex = 0; + uint mask = m_itemData.ModifiersMask; + for (int i = 0; i < (int)modifier; ++i) + if ((mask & (1 << i)) != 0) + ++valueIndex; + + if (value != 0) + { + if ((mask & (1 << (int)modifier)) != 0) + return; + + SetUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ModifiersMask), 1u << (int)modifier); + InsertDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers), valueIndex, value); + } + else + { + if ((mask & (1 << (int)modifier)) == 0) + return; + + RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ModifiersMask), 1u << (int)modifier); + RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers), valueIndex); + } } public uint GetVisibleEntry(Player owner) { ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs; - if (HasFlag(ItemFields.ModifiersMask, ItemConst.AppearanceModifierMaskSpecSpecific)) + if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0) transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]; ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier)); @@ -2120,7 +2085,7 @@ namespace Game.Entities public ushort GetVisibleAppearanceModId(Player owner) { ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs; - if (HasFlag(ItemFields.ModifiersMask, ItemConst.AppearanceModifierMaskSpecSpecific)) + if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0) transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]; ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier)); @@ -2133,14 +2098,14 @@ namespace Game.Entities public uint GetVisibleEnchantmentId(Player owner) { ItemModifier illusionModifier = ItemModifier.EnchantIllusionAllSpecs; - if (HasFlag(ItemFields.ModifiersMask, ItemConst.IllusionModifierMaskSpecSpecific)) + if ((m_itemData.ModifiersMask & ItemConst.IllusionModifierMaskSpecSpecific) != 0) illusionModifier = ItemConst.IllusionModifierSlotBySpec[owner.GetActiveTalentGroup()]; uint enchantIllusion = GetModifier(illusionModifier); if (enchantIllusion != 0) return enchantIllusion; - return GetEnchantmentId(EnchantmentSlot.Perm); + return (uint)GetEnchantmentId(EnchantmentSlot.Perm); } public ushort GetVisibleItemVisual(Player owner) @@ -2154,50 +2119,77 @@ namespace Game.Entities public void AddBonuses(uint bonusListID) { - if (HasDynamicValue(ItemDynamicFields.BonusListIds, bonusListID)) + var bonusListIDs = (List)m_itemData.BonusListIDs; + if (bonusListIDs.Contains(bonusListID)) return; var bonuses = Global.DB2Mgr.GetItemBonusList(bonusListID); if (bonuses != null) { - AddDynamicValue(ItemDynamicFields.BonusListIds, bonusListID); + bonusListIDs.Add(bonusListID); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.BonusListIDs), bonusListIDs); foreach (ItemBonusRecord bonus in bonuses) - _bonusData.AddBonus((ItemBonusType)bonus.Type, bonus.Value); + _bonusData.AddBonus(bonus.BonusType, bonus.Value); - SetUInt32Value(ItemFields.AppearanceModId, _bonusData.AppearanceModID); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ItemAppearanceModID), (byte)_bonusData.AppearanceModID); } } - public List GetArtifactPowers() + public void SetBonuses(List bonusListIDs) { - return GetDynamicStructuredValues(ItemDynamicFields.ArtifactPowers); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.BonusListIDs), bonusListIDs); + + foreach (uint bonusListID in (List)m_itemData.BonusListIDs) + { + var bonuses = Global.DB2Mgr.GetItemBonusList(bonusListID); + if (bonuses != null) + { + foreach (ItemBonusRecord bonus in bonuses) + _bonusData.AddBonus(bonus.BonusType, bonus.Value); + } + } + + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ItemAppearanceModID), (byte)_bonusData.AppearanceModID); } - public ItemDynamicFieldArtifactPowers GetArtifactPower(uint artifactPowerId) + public void ClearBonuses() + { + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.BonusListIDs), new List()); + _bonusData = new BonusData(GetTemplate()); + SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ItemAppearanceModID), (byte)_bonusData.AppearanceModID); + } + + public ArtifactPower GetArtifactPower(uint artifactPowerId) { var index = m_artifactPowerIdToIndex.LookupByKey(artifactPowerId); if (index != 0) - return GetDynamicStructuredValue(ItemDynamicFields.ArtifactPowers, index); + return m_itemData.ArtifactPowers[index]; return null; } - public void SetArtifactPower(ItemDynamicFieldArtifactPowers artifactPower, bool createIfMissing = false) + void AddArtifactPower(ArtifactPowerLoadInfo artifactPower) { - var foundIndex = m_artifactPowerIdToIndex.LookupByKey(artifactPower.ArtifactPowerId); - ushort index; + int index = m_artifactPowerIdToIndex.Count; + m_artifactPowerIdToIndex[artifactPower.ArtifactPowerId] = (ushort)index; + + ArtifactPower powerField = new ArtifactPower(); + powerField.ArtifactPowerId = (ushort)artifactPower.ArtifactPowerId; + powerField.PurchasedRank = artifactPower.PurchasedRank; + powerField.CurrentRankWithBonus = artifactPower.CurrentRankWithBonus; + + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactPowers), powerField); + } + + public void SetArtifactPower(ushort artifactPowerId, byte purchasedRank, byte currentRankWithBonus) + { + var foundIndex = m_artifactPowerIdToIndex.LookupByKey(artifactPowerId); if (foundIndex != 0) - index = foundIndex; - else { - if (!createIfMissing) - return; - - index = (ushort)m_artifactPowerIdToIndex.Count; - m_artifactPowerIdToIndex[artifactPower.ArtifactPowerId] = index; + ArtifactPower artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, foundIndex); + SetUpdateFieldValue(ref artifactPower.PurchasedRank, purchasedRank); + SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, currentRankWithBonus); } - - SetDynamicStructuredValue(ItemDynamicFields.ArtifactPowers, index, artifactPower); } public void InitArtifactPowers(byte artifactId, byte artifactTier) @@ -2210,18 +2202,18 @@ namespace Game.Entities if (m_artifactPowerIdToIndex.ContainsKey(artifactPower.Id)) continue; - ItemDynamicFieldArtifactPowers powerData = new ItemDynamicFieldArtifactPowers(); + ArtifactPowerLoadInfo powerData = new ArtifactPowerLoadInfo(); powerData.ArtifactPowerId = artifactPower.Id; powerData.PurchasedRank = 0; powerData.CurrentRankWithBonus = (byte)((artifactPower.Flags & ArtifactPowerFlag.First) == ArtifactPowerFlag.First ? 1 : 0); - SetArtifactPower(powerData, true); + AddArtifactPower(powerData); } } public uint GetTotalPurchasedArtifactPowers() { uint purchasedRanks = 0; - foreach (ItemDynamicFieldArtifactPowers power in GetArtifactPowers()) + foreach (ArtifactPower power in m_itemData.ArtifactPowers) purchasedRanks += power.PurchasedRank; return purchasedRanks; @@ -2238,47 +2230,55 @@ namespace Game.Entities { case ItemEnchantmentType.ArtifactPowerBonusRankByType: { - foreach (ItemDynamicFieldArtifactPowers artifactPower in GetArtifactPowers()) + for (int artifactPowerIndex = 0; artifactPowerIndex < m_itemData.ArtifactPowers.Size(); ++artifactPowerIndex) { + ArtifactPower artifactPower = m_itemData.ArtifactPowers[artifactPowerIndex]; if (CliDB.ArtifactPowerStorage.LookupByKey(artifactPower.ArtifactPowerId).Label == enchant.EffectArg[i]) { - ItemDynamicFieldArtifactPowers newPower = artifactPower; + byte newRank = artifactPower.CurrentRankWithBonus; if (apply) - newPower.CurrentRankWithBonus += (byte)enchant.EffectPointsMin[i]; + newRank += (byte)enchant.EffectPointsMin[i]; else - newPower.CurrentRankWithBonus -= (byte)enchant.EffectPointsMin[i]; + newRank -= (byte)enchant.EffectPointsMin[i]; + + artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); + SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, newRank); if (IsEquipped()) { - ArtifactPowerRankRecord artifactPowerRank = Global.DB2Mgr.GetArtifactPowerRank(artifactPower.ArtifactPowerId, (byte)(newPower.CurrentRankWithBonus != 0 ? newPower.CurrentRankWithBonus - 1 : 0)); + ArtifactPowerRankRecord artifactPowerRank = Global.DB2Mgr.GetArtifactPowerRank(artifactPower.ArtifactPowerId, (byte)(newRank != 0 ? newRank - 1 : 0)); if (artifactPowerRank != null) - owner.ApplyArtifactPowerRank(this, artifactPowerRank, newPower.CurrentRankWithBonus != 0); + owner.ApplyArtifactPowerRank(this, artifactPowerRank, newRank != 0); } - - SetArtifactPower(newPower); } } } break; case ItemEnchantmentType.ArtifactPowerBonusRankByID: { - ItemDynamicFieldArtifactPowers artifactPower = GetArtifactPower(enchant.EffectArg[i]); - if (artifactPower != null) + var indexItr = m_artifactPowerIdToIndex.LookupByKey(enchant.EffectArg[i]); + ushort index; + if (indexItr != 0) + index = indexItr; + + ushort artifactPowerIndex = m_artifactPowerIdToIndex.LookupByKey(enchant.EffectArg[i]); + if (artifactPowerIndex != 0) { - ItemDynamicFieldArtifactPowers newPower = artifactPower; + byte newRank = m_itemData.ArtifactPowers[artifactPowerIndex].CurrentRankWithBonus; if (apply) - newPower.CurrentRankWithBonus += (byte)enchant.EffectPointsMin[i]; + newRank += (byte)enchant.EffectPointsMin[i]; else - newPower.CurrentRankWithBonus -= (byte)enchant.EffectPointsMin[i]; + newRank -= (byte)enchant.EffectPointsMin[i]; + + ArtifactPower artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); + SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, newRank); if (IsEquipped()) { - ArtifactPowerRankRecord artifactPowerRank = Global.DB2Mgr.GetArtifactPowerRank(artifactPower.ArtifactPowerId, (byte)(newPower.CurrentRankWithBonus != 0 ? newPower.CurrentRankWithBonus - 1 : 0)); + ArtifactPowerRankRecord artifactPowerRank = Global.DB2Mgr.GetArtifactPowerRank(m_itemData.ArtifactPowers[artifactPowerIndex].ArtifactPowerId, (byte)(newRank != 0 ? newRank - 1 : 0)); if (artifactPowerRank != null) - owner.ApplyArtifactPowerRank(this, artifactPowerRank, newPower.CurrentRankWithBonus != 0); + owner.ApplyArtifactPowerRank(this, artifactPowerRank, newRank != 0); } - - SetArtifactPower(newPower); } } break; @@ -2291,24 +2291,26 @@ namespace Game.Entities PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(artifactPowerPicker.PlayerConditionID); if (playerCondition == null || ConditionManager.IsPlayerMeetingCondition(owner, playerCondition)) { - foreach (ItemDynamicFieldArtifactPowers artifactPower in GetArtifactPowers()) + for (int artifactPowerIndex = 0; artifactPowerIndex < m_itemData.ArtifactPowers.Size(); ++artifactPowerIndex) { + ArtifactPower artifactPower = m_itemData.ArtifactPowers[artifactPowerIndex]; if (CliDB.ArtifactPowerStorage.LookupByKey(artifactPower.ArtifactPowerId).Label == _bonusData.GemRelicType[slot - EnchantmentSlot.Sock1]) { - ItemDynamicFieldArtifactPowers newPower = artifactPower; + byte newRank = artifactPower.CurrentRankWithBonus; if (apply) - newPower.CurrentRankWithBonus += (byte)enchant.EffectPointsMin[i]; + newRank += (byte)enchant.EffectPointsMin[i]; else - newPower.CurrentRankWithBonus -= (byte)enchant.EffectPointsMin[i]; + newRank -= (byte)enchant.EffectPointsMin[i]; + + artifactPower = m_itemData.ModifyValue(m_itemData.ArtifactPowers, artifactPowerIndex); + SetUpdateFieldValue(ref artifactPower.CurrentRankWithBonus, newRank); if (IsEquipped()) { - ArtifactPowerRankRecord artifactPowerRank = Global.DB2Mgr.GetArtifactPowerRank(artifactPower.ArtifactPowerId, (byte)(newPower.CurrentRankWithBonus != 0 ? newPower.CurrentRankWithBonus - 1 : 0)); + ArtifactPowerRankRecord artifactPowerRank = Global.DB2Mgr.GetArtifactPowerRank(artifactPower.ArtifactPowerId, (byte)(newRank != 0 ? newRank - 1 : 0)); if (artifactPowerRank != null) - owner.ApplyArtifactPowerRank(this, artifactPowerRank, newPower.CurrentRankWithBonus != 0); + owner.ApplyArtifactPowerRank(this, artifactPowerRank, newRank != 0); } - - SetArtifactPower(newPower); } } } @@ -2329,6 +2331,7 @@ namespace Game.Entities SetAppearanceModId(parent.GetAppearanceModId()); } + public void SetArtifactXP(ulong xp) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ArtifactXP), xp); } public void GiveArtifactXp(ulong amount, Item sourceItem, ArtifactCategory artifactCategoryId) { Player owner = GetOwner(); @@ -2353,7 +2356,7 @@ namespace Game.Entities amount = 5 * (amount / 5); } - SetUInt64Value(ItemFields.ArtifactXp, GetUInt64Value(ItemFields.ArtifactXp) + amount); + SetArtifactXP(m_itemData.ArtifactXP + amount); ArtifactXpGain artifactXpGain = new ArtifactXpGain(); artifactXpGain.ArtifactGUID = GetGUID(); @@ -2363,6 +2366,16 @@ namespace Game.Entities SetState(ItemUpdateState.Changed, owner); } + public void SetContext(int context) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Context), context); } + public void SetPetitionId(uint petitionId) + { + SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, 0).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.ID), petitionId); + } + public void SetPetitionNumSignatures(uint signatures) + { + SetUpdateFieldValue(m_itemData.ModifyValue(m_itemData.Enchantment, 0).ModifyValue((ItemEnchantment itemEnchantment) => itemEnchantment.Duration), signatures); + } + public void SetFixedLevel(uint level) { if (!_bonusData.HasFixedLevel || GetModifier(ItemModifier.ScalingStatDistributionFixedLevel) != 0) @@ -2457,7 +2470,7 @@ namespace Game.Entities eff.SetBonuses.Add(itemSetSpell); // spell cast only if fit form requirement, in other case will cast at form change - if (itemSetSpell.ChrSpecID == 0 || itemSetSpell.ChrSpecID == player.GetUInt32Value(PlayerFields.CurrentSpecId)) + if (itemSetSpell.ChrSpecID == 0 || itemSetSpell.ChrSpecID == player.GetPrimarySpecialization()) player.ApplyEquipSpell(spellInfo, null, true); } } @@ -2513,14 +2526,34 @@ namespace Game.Entities public BonusData GetBonus() { return _bonusData; } - public ObjectGuid GetOwnerGUID() { return GetGuidValue(ItemFields.Owner); } - public void SetOwnerGUID(ObjectGuid guid) { SetGuidValue(ItemFields.Owner, guid); } + public ObjectGuid GetOwnerGUID() { return m_itemData.Owner; } + public void SetOwnerGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Owner), guid); } + public ObjectGuid GetContainedIn() { return m_itemData.ContainedIn; } + public void SetContainedIn(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ContainedIn), guid); } + public ObjectGuid GetCreator() { return m_itemData.Creator; } + public void SetCreator(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Creator), guid); } + public ObjectGuid GetGiftCreator() { return m_itemData.GiftCreator; } + public void SetGiftCreator(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.GiftCreator), guid); } + + void SetExpiration(uint expiration) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Expiration), expiration); } public ItemBondingType GetBonding() { return _bonusData.Bonding; } - public void SetBinding(bool val) { ApplyModFlag(ItemFields.Flags, (uint)ItemFieldFlags.Soulbound, val); } - public bool IsSoulBound() { return HasFlag(ItemFields.Flags, ItemFieldFlags.Soulbound); } + public void SetBinding(bool val) + { + if (val) + AddItemFlag(ItemFieldFlags.Soulbound); + else + RemoveItemFlag(ItemFieldFlags.Soulbound); + } + + public bool IsSoulBound() { return HasItemFlag(ItemFieldFlags.Soulbound); } public bool IsBoundAccountWide() { return GetTemplate().GetFlags().HasAnyFlag(ItemFlags.IsBoundToAccount); } - bool IsBattlenetAccountBound() { return GetTemplate().GetFlags2().HasAnyFlag(ItemFlags2.BnetAccountTradeOk); } + public bool IsBattlenetAccountBound() { return GetTemplate().GetFlags2().HasAnyFlag(ItemFlags2.BnetAccountTradeOk); } + + public bool HasItemFlag(ItemFieldFlags flag) { return (m_itemData.DynamicFlags & (uint)flag) != 0; } + public void AddItemFlag(ItemFieldFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.DynamicFlags), (uint)flags); } + public void RemoveItemFlag(ItemFieldFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.DynamicFlags), (uint)flags); } + public void SetItemFlags(ItemFieldFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.DynamicFlags), (uint)flags); } public Bag ToBag() { @@ -2530,14 +2563,15 @@ namespace Game.Entities return null; } - public bool IsLocked() { return !HasFlag(ItemFields.Flags, ItemFieldFlags.Unlocked); } + public bool IsLocked() { return !HasItemFlag(ItemFieldFlags.Unlocked); } public bool IsBag() { return GetTemplate().GetInventoryType() == InventoryType.Bag; } public bool IsCurrencyToken() { return GetTemplate().IsCurrencyToken(); } - public bool IsBroken() { return GetUInt32Value(ItemFields.MaxDurability) > 0 && GetUInt32Value(ItemFields.Durability) == 0; } + public bool IsBroken() { return m_itemData.MaxDurability > 0 && m_itemData.Durability == 0; } + public void SetDurability(uint durability) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Durability), durability); } public void SetInTrade(bool b = true) { mb_in_trade = b; } public bool IsInTrade() { return mb_in_trade; } - public uint GetCount() { return GetUInt32Value(ItemFields.StackCount); } + public uint GetCount() { return m_itemData.StackCount; } public uint GetMaxStackCount() { return GetTemplate().GetMaxStackSize(); } public byte GetSlot() { return m_slot; } @@ -2548,27 +2582,18 @@ namespace Game.Entities bool IsInBag() { return m_container != null; } - public int GetItemRandomPropertyId() { return GetInt32Value(ItemFields.RandomPropertiesId); } - public uint GetItemSuffixFactor() { return GetUInt32Value(ItemFields.PropertySeed); } - public ItemRandomEnchantmentId GetItemRandomEnchantmentId() { return m_randomEnchantment; } - public uint GetEnchantmentId(EnchantmentSlot slot) - { - return GetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Id); - } - public uint GetEnchantmentDuration(EnchantmentSlot slot) - { - return GetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Duration); - } - public uint GetEnchantmentCharges(EnchantmentSlot slot) - { - return GetUInt32Value(ItemFields.Enchantment + (int)slot * (int)EnchantmentOffset.Max + (int)EnchantmentOffset.Charges); - } + public uint GetItemRandomBonusListId() { return m_randomBonusListId; } + public uint GetEnchantmentId(EnchantmentSlot slot) { return m_itemData.Enchantment[(int)slot].ID; } + public uint GetEnchantmentDuration(EnchantmentSlot slot) { return m_itemData.Enchantment[(int)slot].Duration; } + public int GetEnchantmentCharges(EnchantmentSlot slot) { return m_itemData.Enchantment[(int)slot].Charges; } + + public void SetCreatePlayedTime(uint createPlayedTime) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.CreatePlayedTime), createPlayedTime); } public string GetText() { return m_text; } public void SetText(string text) { m_text = text; } - public int GetSpellCharges(int index = 0) { return GetInt32Value(ItemFields.SpellCharges + index); } - public void SetSpellCharges(int index, int value) { SetInt32Value(ItemFields.SpellCharges + index, value); } + public int GetSpellCharges(int index = 0) { return m_itemData.SpellCharges[index]; } + public void SetSpellCharges(int index, int value) { SetUpdateFieldValue(ref m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.SpellCharges, index), value); } public ItemUpdateState GetState() { return uState; } @@ -2596,8 +2621,8 @@ namespace Game.Entities Cypher.Assert(index < ItemConst.MaxGemSockets); return _bonusData.socketColor[index]; } - public uint GetAppearanceModId() { return GetUInt32Value(ItemFields.AppearanceModId); } - public void SetAppearanceModId(uint appearanceModId) { SetUInt32Value(ItemFields.AppearanceModId, appearanceModId); } + public uint GetAppearanceModId() { return m_itemData.ItemAppearanceModID; } + public void SetAppearanceModId(uint appearanceModId) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ItemAppearanceModID), (byte)appearanceModId); } public uint GetArmor(Player owner) { return GetTemplate().GetArmor(GetItemLevel(owner)); } public void GetDamage(Player owner, out float minDamage, out float maxDamage) { GetTemplate().GetDamage(GetItemLevel(owner), out minDamage, out maxDamage); } public float GetRepairCostMultiplier() { return _bonusData.RepairCostMultiplier; } @@ -2702,6 +2727,8 @@ namespace Game.Entities } #region Fields + public ItemData m_itemData; + public bool m_lootGenerated; public Loot loot; internal BonusData _bonusData; @@ -2717,7 +2744,7 @@ namespace Game.Entities bool mb_in_trade; long m_lastPlayedTimeUpdate; List allowedGUIDs = new List(); - ItemRandomEnchantmentId m_randomEnchantment; // store separately to easily find which bonus list is the one randomly given for stat rerolling + uint m_randomBonusListId; // store separately to easily find which bonus list is the one randomly given for stat rerolling ObjectGuid m_childItem; Dictionary m_artifactPowerIdToIndex = new Dictionary(); Array m_gemScalingLevels = new Array(ItemConst.MaxGemSockets); @@ -2811,7 +2838,7 @@ namespace Game.Entities if (bonuses != null) { foreach (ItemBonusRecord bonus in bonuses) - AddBonus(bonus.Type, bonus.Value); + AddBonus(bonus.BonusType, bonus.Value); } } } @@ -2926,13 +2953,11 @@ namespace Game.Entities } } - [StructLayout(LayoutKind.Sequential)] - public class ItemDynamicFieldArtifactPowers + public class ArtifactPowerLoadInfo { public uint ArtifactPowerId; public byte PurchasedRank; public byte CurrentRankWithBonus; - public ushort Padding; } [StructLayout(LayoutKind.Sequential)] diff --git a/Source/Game/Entities/Item/ItemEnchantment.cs b/Source/Game/Entities/Item/ItemEnchantment.cs index 567379cb6..710274a7c 100644 --- a/Source/Game/Entities/Item/ItemEnchantment.cs +++ b/Source/Game/Entities/Item/ItemEnchantment.cs @@ -22,148 +22,79 @@ using System.Collections.Generic; namespace Game.Entities { - public class ItemEnchantment + public class ItemEnchantmentManager { - static ItemEnchantment() + public static void LoadItemRandomBonusListTemplates() { - RandomItemEnch = new EnchantmentStore(); - } + uint oldMSTime = Time.GetMSTime(); - public static void LoadRandomEnchantmentsTable() - { - // for reload case - RandomItemEnch[ItemRandomEnchantmentType.Property].Clear(); - RandomItemEnch[ItemRandomEnchantmentType.Suffix].Clear(); + _storage.Clear(); - // 0 1 2 3 - SQLResult result = DB.World.Query("SELECT entry, type, ench, chance FROM item_enchantment_template"); + // 0 1 2 + SQLResult result = DB.World.Query("SELECT Id, BonusListID, Chance FROM item_random_bonus_list_template"); if (result.IsEmpty()) { Log.outError(LogFilter.Player, "Loaded 0 Item Enchantment definitions. DB table `item_enchantment_template` is empty."); + return; } uint count = 0; do { - uint entry = result.Read(0); - ItemRandomEnchantmentType type = (ItemRandomEnchantmentType)result.Read(1); - uint ench = result.Read(2); - float chance = result.Read(3); + uint id = result.Read(0); + uint bonusListId = result.Read(1); + float chance = result.Read(2); - switch (type) + if (Global.DB2Mgr.GetItemBonusList(bonusListId) == null) { - case ItemRandomEnchantmentType.Property: - if (!CliDB.ItemRandomPropertiesStorage.ContainsKey(ench)) - { - Log.outError(LogFilter.Sql, "Property {0} used in `item_enchantment_template` by entry {1} doesn't have exist in ItemRandomProperties.db2", ench, entry); - continue; - } - break; - case ItemRandomEnchantmentType.Suffix: - if (!CliDB.ItemRandomSuffixStorage.ContainsKey(ench)) - { - Log.outError(LogFilter.Sql, "Suffix {0} used in `item_enchantment_template` by entry {1} doesn't have exist in ItemRandomSuffix.db2", ench, entry); - continue; - } - break; - case ItemRandomEnchantmentType.BonusList: - if (Global.DB2Mgr.GetItemBonusList(ench) == null) - { - Log.outError(LogFilter.Sql, "Bonus list {0} used in `item_enchantment_template` by entry {1} doesn't have exist in ItemBonus.db2", ench, entry); - continue; - } - break; - default: - Log.outError(LogFilter.Sql, "Invalid random enchantment type specified in `item_enchantment_template` table for `entry` {0} `ench` {1}", entry, ench); - break; + Log.outError(LogFilter.Sql, $"Bonus list {bonusListId} used in `item_random_bonus_list_template` by id {id} doesn't have exist in ItemBonus.db2"); + continue; } if (chance < 0.000001f || chance > 100.0f) { - Log.outError(LogFilter.Sql, "Random item enchantment for entry {0} type {1} ench {2} has invalid chance {3}", entry, type, ench, chance); + Log.outError(LogFilter.Sql, $"Bonus list {bonusListId} used in `item_random_bonus_list_template` by id {id} has invalid chance {chance}"); continue; } - switch (type) - { - case ItemRandomEnchantmentType.Property: - RandomItemEnch[ItemRandomEnchantmentType.Property].Add(entry, new EnchStoreItem(type, ench, chance)); - break; - case ItemRandomEnchantmentType.Suffix: - case ItemRandomEnchantmentType.BonusList: // random bonus lists use RandomSuffix field in Item-sparse.db2 - RandomItemEnch[ItemRandomEnchantmentType.Suffix].Add(entry, new EnchStoreItem(type, ench, chance)); - break; - default: - break; - } + if (!_storage.ContainsKey(id)) + _storage[id] = new RandomBonusListIds(); + + RandomBonusListIds ids = _storage[id]; + ids.BonusListIDs.Add(bonusListId); + ids.Chances.Add(chance); ++count; } while (result.NextRow()); - Log.outInfo(LogFilter.Player, "Loaded {0} Item Enchantment definitions", count); + Log.outInfo(LogFilter.Player, $"Loaded {count} Random item bonus list definitions in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); } - public static ItemRandomEnchantmentId GetItemEnchantMod(int entry, ItemRandomEnchantmentType type) - { - if (entry == 0) - return ItemRandomEnchantmentId.Empty; - - if (entry == -1) - return ItemRandomEnchantmentId.Empty; - - var tab = RandomItemEnch[type].LookupByKey(entry); - if (tab == null) - { - Log.outError(LogFilter.Player, "Item RandomProperty / RandomSuffix id #{0} used in `item_template` but it does not have records in `item_enchantment_template` table.", entry); - return ItemRandomEnchantmentId.Empty; - } - - var selectedItem = tab.SelectRandomElementByWeight(enchant => enchant.chance); - - return new ItemRandomEnchantmentId(selectedItem.type, selectedItem.ench); - } - - public static ItemRandomEnchantmentId GenerateItemRandomPropertyId(uint item_id) + public static uint GenerateItemRandomBonusListId(uint item_id) { ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(item_id); if (itemProto == null) - return ItemRandomEnchantmentId.Empty; + return 0; // item must have one from this field values not null if it can have random enchantments - if (itemProto.GetRandomProperty() == 0 && itemProto.GetRandomSuffix() == 0) - return ItemRandomEnchantmentId.Empty; + if (itemProto.RandomBonusListTemplateId == 0) + return 0; - // item can have not null only one from field values - if (itemProto.GetRandomProperty() != 0 && itemProto.GetRandomSuffix() != 0) + var tab = _storage.LookupByKey(itemProto.RandomBonusListTemplateId); + if (tab == null) { - Log.outError(LogFilter.Sql, "Item template {0} have RandomProperty == {1} and RandomSuffix == {2}, but must have one from field =0", itemProto.GetId(), itemProto.GetRandomProperty(), itemProto.GetRandomSuffix()); - return ItemRandomEnchantmentId.Empty; + Log.outError(LogFilter.Sql, $"Item RandomBonusListTemplateId id {itemProto.RandomBonusListTemplateId} used in `item_template_addon` but it does not have records in `item_random_bonus_list_template` table."); + return 0; } - - // RandomProperty case - if (itemProto.GetRandomProperty() != 0) - return GetItemEnchantMod((int)itemProto.GetRandomProperty(), ItemRandomEnchantmentType.Property); - // RandomSuffix case - else - return GetItemEnchantMod((int)itemProto.GetRandomSuffix(), ItemRandomEnchantmentType.Suffix); - } - - public static uint GenerateEnchSuffixFactor(uint item_id) - { - ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(item_id); - - if (itemProto == null) - return 0; - if (itemProto.GetRandomSuffix() == 0) - return 0; - - return GetRandomPropertyPoints(itemProto.GetBaseItemLevel(), itemProto.GetQuality(), itemProto.GetInventoryType(), itemProto.GetSubClass()); + //todo fix me this is ulgy + return tab.BonusListIDs.SelectRandomElementByWeight(x => (float)tab.Chances[tab.BonusListIDs.IndexOf(x)]); } public static uint GetRandomPropertyPoints(uint itemLevel, ItemQuality quality, InventoryType inventoryType, uint subClass) - { + { uint propIndex; + switch (inventoryType) { case InventoryType.Head: @@ -208,11 +139,11 @@ namespace Game.Entities default: return 0; } + RandPropPointsRecord randPropPointsEntry = CliDB.RandPropPointsStorage.LookupByKey(itemLevel); if (randPropPointsEntry == null) return 0; - // Select rare/epic modifier switch (quality) { case ItemQuality.Uncommon: @@ -225,69 +156,16 @@ namespace Game.Entities case ItemQuality.Artifact: return randPropPointsEntry.Epic[propIndex]; } + return 0; } - static EnchantmentStore RandomItemEnch; - - public class EnchStoreItem - { - public EnchStoreItem() - { - ench = 0; - chance = 0; - } - public EnchStoreItem(ItemRandomEnchantmentType _type, uint _ench, float _chance) - { - type = _type; - ench = _ench; - chance = _chance; - } - - public ItemRandomEnchantmentType type; - public uint ench; - public float chance; - } - - class EnchantmentStore - { - public EnchantmentStore() - { - _data[(byte)ItemRandomEnchantmentType.Property] = new MultiMap(); - _data[(byte)ItemRandomEnchantmentType.Suffix] = new MultiMap(); - } - - public MultiMap this[ItemRandomEnchantmentType type] - { - get - { - //(type != ItemRandomEnchantmentType.BonusList, "Random bonus lists do not have their own storage, use Suffix for them"); - return _data[(byte)type]; - } - } - - MultiMap[] _data = new MultiMap[2]; - } + static Dictionary _storage = new Dictionary(); } - public struct ItemRandomEnchantmentId + public class RandomBonusListIds { - public static ItemRandomEnchantmentId Empty = default(ItemRandomEnchantmentId); - - public ItemRandomEnchantmentId(ItemRandomEnchantmentType type, uint id) - { - Type = type; - Id = id; - } - - public ItemRandomEnchantmentType Type; - public uint Id; - } - - public enum ItemRandomEnchantmentType - { - Property = 0, - Suffix = 1, - BonusList = 2 + public List BonusListIDs = new List(); + public List Chances = new List(); } } diff --git a/Source/Game/Entities/Item/ItemTemplate.cs b/Source/Game/Entities/Item/ItemTemplate.cs index 0ef302d71..dbbc2b285 100644 --- a/Source/Game/Entities/Item/ItemTemplate.cs +++ b/Source/Game/Entities/Item/ItemTemplate.cs @@ -223,9 +223,9 @@ namespace Game.Entities if (GetFlags().HasAnyFlag(ItemFlags.IsBoundToAccount) && alwaysAllowBoundToAccount) return true; - uint spec = player.GetUInt32Value(ActivePlayerFields.LootSpecId); + uint spec = player.GetLootSpecId(); if (spec == 0) - spec = player.GetUInt32Value(PlayerFields.CurrentSpecId); + spec = player.GetPrimarySpecialization(); if (spec == 0) spec = player.GetDefaultSpecId(); @@ -295,8 +295,6 @@ namespace Game.Entities public uint GetPageText() { return ExtendedData.PageID; } public uint GetStartQuest() { return ExtendedData.StartQuestID; } public uint GetLockID() { return ExtendedData.LockID; } - public uint GetRandomProperty() { return ExtendedData.RandomSelect; } - public uint GetRandomSuffix() { return ExtendedData.ItemRandomSuffixGroupID; } public uint GetItemSet() { return ExtendedData.ItemSet; } public uint GetArea() { return ExtendedData.ZoneBound; } public uint GetMap() { return ExtendedData.InstanceBound; } @@ -345,6 +343,7 @@ namespace Game.Entities public uint MaxMoneyLoot; public ItemFlagsCustom FlagsCu; public float SpellPPMRate; + public uint RandomBonusListTemplateId; public BitArray[] Specializations = new BitArray[3]; public uint ItemSpecClassMask; diff --git a/Source/Game/Entities/Object/Update/UpdateData.cs b/Source/Game/Entities/Object/Update/UpdateData.cs index 01586befb..c1642d498 100644 --- a/Source/Game/Entities/Object/Update/UpdateData.cs +++ b/Source/Game/Entities/Object/Update/UpdateData.cs @@ -56,13 +56,13 @@ namespace Game.Entities if (buffer.WriteBit(!outOfRangeGUIDs.Empty())) { buffer.WriteUInt16(0); // object limit to instantly destroy - objects before this index on m_outOfRangeGUIDs list get "smoothly phased out" - buffer.WriteUInt32(outOfRangeGUIDs.Count); + buffer.WriteInt32(outOfRangeGUIDs.Count); foreach (var guid in outOfRangeGUIDs) buffer.WritePackedGuid(guid); } var bytes = data.GetData(); - buffer.WriteUInt32(bytes.Length); + buffer.WriteInt32(bytes.Length); buffer.WriteBytes(bytes); packet.Data = buffer.GetData(); diff --git a/Source/Game/Entities/Object/Update/UpdateField.cs b/Source/Game/Entities/Object/Update/UpdateField.cs new file mode 100644 index 000000000..8b8d1d987 --- /dev/null +++ b/Source/Game/Entities/Object/Update/UpdateField.cs @@ -0,0 +1,453 @@ +/* + * Copyright (C) 2012-2019 CypherCore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Framework.Constants; +using Game.Network; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace Game.Entities +{ + public class UpdateFieldHolder + { + public UpdateFieldHolder(WorldObject owner) { _owner = owner; } + + public BaseUpdateData ModifyValue(BaseUpdateData updateData) + { + _changesMask.Set(updateData.Bit); + return updateData; + } + + public void ClearChangesMask(BaseUpdateData updateData) + { + _changesMask.Reset(updateData.Bit); + } + + public void ClearChangesMask(BaseUpdateData updateData, ref UpdateField updateField) where T : new() where U : new() + { + _changesMask.Reset(updateData.Bit); + + IHasChangesMask hasChangesMask = (IHasChangesMask)updateField._value; + if (hasChangesMask != null) + hasChangesMask.ClearChangesMask(); + } + + public uint GetChangedObjectTypeMask() + { + return _changesMask.GetBlock(0); + } + + public bool HasChanged(TypeId index) + { + return _changesMask[(int)index]; + } + + UpdateMask _changesMask = new UpdateMask((int)TypeId.Max); + WorldObject _owner; + } + + public interface IUpdateField + { + void SetValue(T value); + T GetValue(); + } + + public class UpdateField : IUpdateField where T : new() + { + public T _value; + public int BlockBit; + public int Bit; + + public UpdateField(int blockBit, int bit) + { + BlockBit = blockBit; + Bit = bit; + _value = new T(); + } + + public static implicit operator T(UpdateField updateField) + { + return updateField._value; + } + + public void SetValue(T value) { _value = value; } + + public T GetValue() { return _value; } + } + + public class UpdateFieldArray where T : new() + { + public T[] _values; + public int FirstElementBit; + public int Bit; + + public UpdateFieldArray(uint size, int bit, int firstElementBit) + { + _values = new T[size]; + for (var i = 0; i < size; ++i) + _values[i] = new T(); + + Bit = bit; + FirstElementBit = firstElementBit; + } + + public T this[int index] + { + get + { + return _values[index]; + } + set + { + _values[index] = value; + } + } + + public int GetSize() { return _values.Length; } + + public IEnumerator GetEnumerator() + { + foreach (var obj in _values) + yield return obj; + } + } + + public class DynamicUpdateField where T : new() + { + public List _values; + public List _updateMask; + public int BlockBit; + public int Bit; + + public DynamicUpdateField() + { + _values = new List(); + _updateMask = new List(); + + BlockBit = -1; + Bit = -1; + } + + public DynamicUpdateField(int blockBit, int bit) + { + _values = new List(); + _updateMask = new List(); + + BlockBit = blockBit; + Bit = bit; + } + + public int FindIndex(T value) + { + return _values.IndexOf(value); + } + + public bool HasChanged(int index) + { + return (_updateMask[index / 32] & (1 << (index % 32))) != 0; + } + + public void WriteUpdateMask(WorldPacket data) + { + data.WriteBits(_values.Count, 32); + if (_values.Count > 32) + { + if (data.HasUnfinishedBitPack()) + for (int block = 0; block < _values.Count / 32; ++block) + data.WriteBits(_updateMask[block], 32); + else + for (int block = 0; block < _values.Count / 32; ++block) + data.WriteUInt32(_updateMask[block]); + } + + if ((_values.Count % 32) != 0) + data.WriteBits(_updateMask.Last(), _values.Count % 32); + } + + public void ClearChangesMask() + { + for (var i = 0; i < _updateMask.Count; ++i) + _updateMask[i] = 0; + } + + public void AddValue(T value) + { + MarkChanged(_values.Count); + + if (value is IHasChangesMask) + { + IHasChangesMask hasChanges = (IHasChangesMask)value; + if (hasChanges != null) + hasChanges.GetUpdateMask().SetAll(); + } + + _values.Add(value); + } + + public void InsertValue(int index, T value) + { + _values.Insert(index, value); + for (int i = index; i < _values.Count; ++i) + { + MarkChanged(i); + // also mark all fields of value as changed + IHasChangesMask hasChangesMask = (IHasChangesMask)_values[i]; + if (hasChangesMask != null) + hasChangesMask.GetUpdateMask().SetAll(); + } + } + + public void RemoveValue(int index) + { + // remove by shifting entire container - client might rely on values being sorted for certain fields + _values.RemoveAt(index); + for (int i = index; i < _values.Count; ++i) + { + MarkChanged(i); + // also mark all fields of value as changed + IHasChangesMask hasChanges = (IHasChangesMask)_values[i]; + if (hasChanges != null) + hasChanges.GetUpdateMask().SetAll(); + } + if ((_values.Count % 32) != 0) + _updateMask[UpdateMask.GetBlockIndex(_values.Count)] &= (uint)~UpdateMask.GetBlockFlag(_values.Count); + else + _updateMask.RemoveAt(_updateMask.Count - 1); + } + + public void Clear() + { + _values.Clear(); + _updateMask.Clear(); + } + + public void MarkChanged(int index) + { + int block = UpdateMask.GetBlockIndex(index); + if (block >= _updateMask.Count) + _updateMask.Add(0); + + _updateMask[block] |= (uint)UpdateMask.GetBlockFlag(index); + } + + public void ClearChanged(int index) + { + int block = UpdateMask.GetBlockIndex(index); + if (block >= _updateMask.Count) + _updateMask.Add(0); + + _updateMask[block] &= ~(uint)UpdateMask.GetBlockFlag(index); + } + + public int Size() + { + return _values.Count; + } + + public T this[int index] + { + get + { + if (_values.Count <= index) + _values.Add(new T()); + + return _values[index]; + } + set + { + _values[index] = value; + } + } + + public static implicit operator List(DynamicUpdateField updateField) + { + return updateField._values; + } + + public IEnumerator GetEnumerator() + { + foreach (var obj in _values) + yield return obj; + } + } + + public interface IHasChangesMask + { + void ClearChangesMask(); + UpdateMask GetUpdateMask(); + } + + public abstract class BaseUpdateData : IHasChangesMask + { + public UpdateMask _changesMask; + public int _blockBit; + public int Bit; + + public BaseUpdateData(int blockBit, TypeId bit, int changeMask) + { + _blockBit = blockBit; + Bit = (int)bit; + _changesMask = new UpdateMask(changeMask); + } + + public BaseUpdateData(int changeMask) + { + _changesMask = new UpdateMask(changeMask); + } + + public abstract void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver); + public abstract void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver); + + public abstract void ClearChangesMask(); + + public UpdateMask GetUpdateMask() + { + return _changesMask; + } + + public void ClearChanged(UpdateField updateField) where U : new() + { + _changesMask.Reset(updateField.Bit); + } + + public void ClearChanged(UpdateFieldArray updateField, int index) where U : new() + { + _changesMask.Reset(updateField.Bit); + _changesMask.Reset(updateField.FirstElementBit + index); + } + + public void ClearChanged(DynamicUpdateField updateField, int index) where U : new() + { + _changesMask.Reset(Bit); + updateField.ClearChanged(index); + } + + public void ClearChangesMask(UpdateField updateField) where U : new() + { + if (typeof(U).BaseType == typeof(IHasChangesMask)) + ((IHasChangesMask)updateField._value).ClearChangesMask(); + } + + public void ClearChangesMask(UpdateFieldArray updateField) where U : new() + { + if (typeof(U).BaseType == typeof(IHasChangesMask)) + { + for (int i = 0; i < updateField.GetSize(); ++i) + ((IHasChangesMask)updateField[i]).ClearChangesMask(); + } + } + + public void ClearChangesMask(DynamicUpdateField updateField) where U : new() + { + if (typeof(U).BaseType == typeof(IHasChangesMask)) + { + for (int i = 0; i < updateField.Size(); ++i) + ((IHasChangesMask)updateField[i]).ClearChangesMask(); + + updateField.ClearChangesMask(); + } + } + + public UpdateField ModifyValue(Expression>> expression) where UU : new() + { + var fieldInfo = ((MemberExpression)expression.Body).Member as FieldInfo; + if (fieldInfo == null) + throw new ArgumentException("The lambda expression 'property' should point to a valid Property"); + + var updateField = (UpdateField)fieldInfo.GetValue(this); + _changesMask.Set(updateField.BlockBit); + _changesMask.Set(updateField.Bit); + return updateField; + } + + public ref UU ModifyValue(Expression>> expression, int index) where UU : new() + { + var fieldInfo = ((MemberExpression)expression.Body).Member as FieldInfo; + if (fieldInfo == null) + throw new ArgumentException("The lambda expression 'property' should point to a valid Property"); + + var updateFieldArray = (UpdateFieldArray)fieldInfo.GetValue(this); + _changesMask.Set(updateFieldArray.Bit); + _changesMask.Set(updateFieldArray.FirstElementBit + index); + return ref updateFieldArray._values[index]; + } + + public UpdateField ModifyValue(UpdateField updateField) where U : new() + { + _changesMask.Set(updateField.BlockBit); + _changesMask.Set(updateField.Bit); + return updateField; + } + + public ref U ModifyValue(UpdateFieldArray updateField, int index) where U : new() + { + _changesMask.Set(updateField.Bit); + _changesMask.Set(updateField.FirstElementBit + index); + return ref updateField._values[index]; + } + + public DynamicUpdateField ModifyValue(DynamicUpdateField updateField) where U : new() + { + _changesMask.Set(updateField.BlockBit); + _changesMask.Set(updateField.Bit); + return updateField; + } + + public DynamicUpdateFieldSetter ModifyValue(DynamicUpdateField updateField, int index) where U : new() + { + if (index >= updateField._values.Count) + { + // fill with zeros until reaching desired slot + updateField._values.Resize((uint)index + 1); + updateField._updateMask.Resize((uint)(updateField._values.Count + 31) / 32); + } + + _changesMask.Set(updateField.BlockBit); + _changesMask.Set(updateField.Bit); + updateField.MarkChanged(index); + + return new DynamicUpdateFieldSetter(updateField, index); + } + } + + public class DynamicUpdateFieldSetter : IUpdateField where T : new() + { + public DynamicUpdateFieldSetter(DynamicUpdateField dynamicUpdateField, int index) + { + _dynamicUpdateField = dynamicUpdateField; + _index = index; + } + + public void SetValue(T value) + { + _dynamicUpdateField[_index] = value; + } + + public T GetValue() { return _dynamicUpdateField[_index]; } + + public static implicit operator T(DynamicUpdateFieldSetter dynamicUpdateFieldSetter) + { + return dynamicUpdateFieldSetter.GetValue(); + } + + DynamicUpdateField _dynamicUpdateField; + int _index; + } +} diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs new file mode 100644 index 000000000..416ae25a0 --- /dev/null +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -0,0 +1,4796 @@ +/* + * Copyright (C) 2012-2019 CypherCore + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Framework.Constants; +using Game.Network; +using System; +using System.Collections.Generic; +using System.Linq; +using Framework.GameMath; +using System.Runtime.CompilerServices; +using Game.Spells; +using Game.DataStorage; + +namespace Game.Entities +{ + public class ObjectFieldData : BaseUpdateData + { + public UpdateField EntryId = new UpdateField(0, 1); + public UpdateField DynamicFlags = new UpdateField(0, 2); + public UpdateField Scale = new UpdateField(0, 3); + + public ObjectFieldData() : base(0, TypeId.Object, 4) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) + { + data.WriteUInt32(EntryId); + data.WriteUInt32(GetViewerDependentDynamicFlags(DynamicFlags, owner, receiver)); + data.WriteFloat(Scale); + } + + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(EntryId); + } + if (_changesMask[2]) + { + data.WriteUInt32(GetViewerDependentDynamicFlags(DynamicFlags, owner, receiver)); + } + if (_changesMask[3]) + { + data.WriteFloat(Scale); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(EntryId); + ClearChangesMask(DynamicFlags); + ClearChangesMask(Scale); + _changesMask.ResetAll(); + } + + uint GetViewerDependentDynamicFlags(uint dynamicFlags, WorldObject obj, Player receiver) + { + UnitDynFlags unitDynFlags = (UnitDynFlags)dynamicFlags; + + Unit unit = obj.ToUnit(); + if (unit != null) + { + unitDynFlags &= ~UnitDynFlags.Tapped; + + Creature creature = obj.ToCreature(); + if (creature != null) + { + if (creature.hasLootRecipient() && !creature.isTappedBy(receiver)) + unitDynFlags |= UnitDynFlags.Tapped; + + if (!receiver.isAllowedToLoot(creature)) + unitDynFlags &= ~UnitDynFlags.Lootable; + } + + // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras + if (unitDynFlags.HasAnyFlag(UnitDynFlags.TrackUnit)) + if (!unit.HasAuraTypeWithCaster(AuraType.ModStalked, receiver.GetGUID())) + unitDynFlags &= ~UnitDynFlags.TrackUnit; + } + else + { + GameObject gameObject = obj.ToGameObject(); + if (gameObject != null) + { + GameObjectDynamicLowFlags dynFlags = 0; + ushort pathProgress = 0xFFFF; + switch (gameObject.GetGoType()) + { + case GameObjectTypes.QuestGiver: + if (gameObject.ActivateToQuest(receiver)) + dynFlags |= GameObjectDynamicLowFlags.Activate; + break; + case GameObjectTypes.Chest: + case GameObjectTypes.Goober: + if (gameObject.ActivateToQuest(receiver)) + dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle; + else if (receiver.IsGameMaster()) + dynFlags |= GameObjectDynamicLowFlags.Activate; + break; + case GameObjectTypes.Generic: + if (gameObject.ActivateToQuest(receiver)) + dynFlags |= GameObjectDynamicLowFlags.Sparkle; + break; + case GameObjectTypes.Transport: + case GameObjectTypes.MapObjTransport: + { + uint transportPeriod = gameObject.GetTransportPeriod(); + if (transportPeriod != 0) + { + float timer = (float)(gameObject.GetGoValue().Transport.PathProgress % transportPeriod); + pathProgress = (ushort)(timer / (float)transportPeriod * 65535.0f); + } + break; + } + default: + break; + } + + unitDynFlags = (UnitDynFlags)((pathProgress << 16) | (ushort)dynFlags); + } + } + + return (uint)unitDynFlags; + } + } + + public class ItemEnchantment : BaseUpdateData + { + public UpdateField ID = new UpdateField(0, 1); + public UpdateField Duration = new UpdateField(0, 2); + public UpdateField Charges = new UpdateField(0, 3); + public UpdateField Inactive = new UpdateField(0, 4); + + public ItemEnchantment() : base(5) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteUInt32(ID); + data.WriteUInt32(Duration); + data.WriteInt16(Charges); + data.WriteUInt16(Inactive); + } + + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 5); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(ID); + } + if (_changesMask[2]) + { + data.WriteUInt32(Duration); + } + if (_changesMask[3]) + { + data.WriteInt16(Charges); + } + if (_changesMask[4]) + { + data.WriteUInt16(Inactive); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(ID); + ClearChangesMask(Duration); + ClearChangesMask(Charges); + ClearChangesMask(Inactive); + _changesMask.ResetAll(); + } + } + + public class ArtifactPower + { + public ushort ArtifactPowerId; + public byte PurchasedRank; + public byte CurrentRankWithBonus; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteUInt16(ArtifactPowerId); + data.WriteUInt8(PurchasedRank); + data.WriteUInt8(CurrentRankWithBonus); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.FlushBits(); + data.WriteUInt16(ArtifactPowerId); + data.WriteUInt8(PurchasedRank); + data.WriteUInt8(CurrentRankWithBonus); + } + } + + public class SocketedGem : BaseUpdateData + { + public UpdateField ItemId = new UpdateField(0, 1); + public UpdateField Context = new UpdateField(0, 2); + public UpdateFieldArray BonusListIDs = new UpdateFieldArray(16, 3, 4); + + public SocketedGem() : base(20) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteUInt32(ItemId); + for (int i = 0; i < 16; ++i) + data.WriteUInt16(BonusListIDs[i]); + + data.WriteUInt8(Context); + } + + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 1); + if (_changesMask.GetBlock(0) != 0) + data.WriteBits(_changesMask.GetBlock(0), 32); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(ItemId); + } + if (_changesMask[2]) + { + data.WriteUInt8(Context); + } + } + if (_changesMask[3]) + { + for (int i = 0; i < 16; ++i) + { + if (_changesMask[4 + i]) + { + data.WriteUInt16(BonusListIDs[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(ItemId); + ClearChangesMask(Context); + ClearChangesMask(BonusListIDs); + _changesMask.ResetAll(); + } + } + + public class ItemData : BaseUpdateData + { + public UpdateField> BonusListIDs = new UpdateField>(0, 1); + public DynamicUpdateField Modifiers = new DynamicUpdateField(0, 2); + public DynamicUpdateField ArtifactPowers = new DynamicUpdateField(0, 3); + public DynamicUpdateField Gems = new DynamicUpdateField(0, 4); + public UpdateField Owner = new UpdateField(0, 5); + public UpdateField ContainedIn = new UpdateField(0, 6); + public UpdateField Creator = new UpdateField(0, 7); + public UpdateField GiftCreator = new UpdateField(0, 8); + public UpdateField StackCount = new UpdateField(0, 9); + public UpdateField Expiration = new UpdateField(0, 10); + public UpdateField DynamicFlags = new UpdateField(0, 11); + public UpdateField Durability = new UpdateField(0, 12); + public UpdateField MaxDurability = new UpdateField(0, 13); + public UpdateField CreatePlayedTime = new UpdateField(0, 14); + public UpdateField ModifiersMask = new UpdateField(0, 15); + public UpdateField Context = new UpdateField(0, 16); + public UpdateField ArtifactXP = new UpdateField(0, 17); + public UpdateField ItemAppearanceModID = new UpdateField(0, 18); + public UpdateField Field_130 = new UpdateField(0, 19); + public UpdateFieldArray SpellCharges = new UpdateFieldArray(5, 20, 21); + public UpdateFieldArray Enchantment = new UpdateFieldArray(13, 26, 27); + + public ItemData() : base(0, TypeId.Item, 40) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + List bonusList = BonusListIDs; + data.WriteInt32(bonusList.Count); + for (int i = 0; i < bonusList.Count; ++i) + data.WriteUInt32(bonusList[i]); + + data.WritePackedGuid(Owner); + data.WritePackedGuid(ContainedIn); + data.WritePackedGuid(Creator); + data.WritePackedGuid(GiftCreator); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteUInt32(StackCount); + data.WriteUInt32(Expiration); + for (int i = 0; i < 5; ++i) + { + data.WriteInt32(SpellCharges[i]); + } + } + data.WriteUInt32(DynamicFlags); + for (int i = 0; i < 13; ++i) + { + Enchantment[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteUInt32(Durability); + data.WriteUInt32(MaxDurability); + } + data.WriteUInt32(CreatePlayedTime); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteUInt32(ModifiersMask); + } + data.WriteInt32(Context); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteUInt64(ArtifactXP); + data.WriteUInt8(ItemAppearanceModID); + } + data.WriteInt32(Modifiers.Size()); + data.WriteInt32(ArtifactPowers.Size()); + data.WriteInt32(Gems.Size()); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteUInt32(Field_130); + } + for (int i = 0; i < Modifiers.Size(); ++i) + { + data.WriteUInt32(Modifiers[i]); + } + for (int i = 0; i < ArtifactPowers.Size(); ++i) + { + ArtifactPowers[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + for (int i = 0; i < Gems.Size(); ++i) + { + Gems[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + } + + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + UpdateMask allowedMaskForTarget = new UpdateMask(40, new uint[] { 0xFC0149FFu, 0x000000FFu }); + AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + WriteUpdate(data, _changesMask & allowedMaskForTarget, fieldVisibilityFlags, owner, receiver); + } + + public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) + { + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + allowedMaskForTarget |= new UpdateMask(40, new uint[] { 0x03FEB600u, 0x00000000u }); + } + + public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 2); + for (uint i = 0; i < 2; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + List bonusList = BonusListIDs; + data.WriteBits(bonusList.Count, 32); + for (int i = 0; i < bonusList.Count; ++i) + data.WriteUInt32(bonusList[i]); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + Modifiers.WriteUpdateMask(data); + } + if (_changesMask[3]) + { + ArtifactPowers.WriteUpdateMask(data); + } + if (_changesMask[4]) + { + Gems.WriteUpdateMask(data); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + for (int i = 0; i < Modifiers.Size(); ++i) + { + if (Modifiers.HasChanged(i)) + { + data.WriteUInt32(Modifiers[i]); + } + } + } + if (_changesMask[3]) + { + for (int i = 0; i < ArtifactPowers.Size(); ++i) + { + if (ArtifactPowers.HasChanged(i)) + { + ArtifactPowers[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[4]) + { + for (int i = 0; i < Gems.Size(); ++i) + { + if (Gems.HasChanged(i)) + { + Gems[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[5]) + { + data.WritePackedGuid(Owner); + } + if (_changesMask[6]) + { + data.WritePackedGuid(ContainedIn); + } + if (_changesMask[7]) + { + data.WritePackedGuid(Creator); + } + if (_changesMask[8]) + { + data.WritePackedGuid(GiftCreator); + } + if (_changesMask[9]) + { + data.WriteUInt32(StackCount); + } + if (_changesMask[10]) + { + data.WriteUInt32(Expiration); + } + if (_changesMask[11]) + { + data.WriteUInt32(DynamicFlags); + } + if (_changesMask[12]) + { + data.WriteUInt32(Durability); + } + if (_changesMask[13]) + { + data.WriteUInt32(MaxDurability); + } + if (_changesMask[14]) + { + data.WriteUInt32(CreatePlayedTime); + } + if (_changesMask[15]) + { + data.WriteUInt32(ModifiersMask); + } + if (_changesMask[16]) + { + data.WriteInt32(Context); + } + if (_changesMask[17]) + { + data.WriteUInt64(ArtifactXP); + } + if (_changesMask[18]) + { + data.WriteUInt8(ItemAppearanceModID); + } + if (_changesMask[19]) + { + data.WriteUInt32(Field_130); + } + } + if (_changesMask[20]) + { + for (int i = 0; i < 5; ++i) + { + if (_changesMask[21 + i]) + { + data.WriteInt32(SpellCharges[i]); + } + } + } + if (_changesMask[26]) + { + for (int i = 0; i < 13; ++i) + { + if (_changesMask[27 + i]) + { + Enchantment[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(BonusListIDs); + ClearChangesMask(Modifiers); + ClearChangesMask(ArtifactPowers); + ClearChangesMask(Gems); + ClearChangesMask(Owner); + ClearChangesMask(ContainedIn); + ClearChangesMask(Creator); + ClearChangesMask(GiftCreator); + ClearChangesMask(StackCount); + ClearChangesMask(Expiration); + ClearChangesMask(DynamicFlags); + ClearChangesMask(Durability); + ClearChangesMask(MaxDurability); + ClearChangesMask(CreatePlayedTime); + ClearChangesMask(ModifiersMask); + ClearChangesMask(Context); + ClearChangesMask(ArtifactXP); + ClearChangesMask(ItemAppearanceModID); + ClearChangesMask(Field_130); + ClearChangesMask(SpellCharges); + ClearChangesMask(Enchantment); + _changesMask.ResetAll(); + } + } + + public class ContainerData : BaseUpdateData + { + public UpdateField NumSlots = new UpdateField(0, 1); + public UpdateFieldArray Slots = new UpdateFieldArray(36, 2, 3); + + public ContainerData() : base(0, TypeId.Item, 39) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Bag owner, Player receiver) + { + for (int i = 0; i < 36; ++i) + { + data.WritePackedGuid(Slots[i]); + } + data.WriteUInt32(NumSlots); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Bag owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 2); + for (uint i = 0; i < 2; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(NumSlots); + } + } + if (_changesMask[2]) + { + for (int i = 0; i < 36; ++i) + { + if (_changesMask[3 + i]) + { + data.WritePackedGuid(Slots[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(NumSlots); + ClearChangesMask(Slots); + _changesMask.ResetAll(); + } + } + + public class AzeriteEmpoweredItemData : BaseUpdateData + { + public UpdateFieldArray Selections = new UpdateFieldArray(5, 0, 1); + + public AzeriteEmpoweredItemData() : base(6) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + for (int i = 0; i < 5; ++i) + { + data.WriteInt32(Selections[i]); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 1); + if (_changesMask.GetBlock(0) != 0) + data.WriteBits(_changesMask.GetBlock(0), 32); + + data.FlushBits(); + if (_changesMask[0]) + { + for (int i = 0; i < 5; ++i) + { + if (_changesMask[1 + i]) + { + data.WriteInt32(Selections[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Selections); + _changesMask.ResetAll(); + } + } + + public class UnlockedAzeriteEssence + { + uint AzeriteEssenceID; + uint Rank; + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.WriteUInt32(AzeriteEssenceID); + data.WriteUInt32(Rank); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.FlushBits(); + data.WriteUInt32(AzeriteEssenceID); + data.WriteUInt32(Rank); + } + } + + public class SelectedAzeriteEssences + { + uint Field_0; + uint Enabled; + uint[] AzeriteEssenceID = new uint[3]; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + for (int i = 0; i < 3; ++i) + { + data.WriteUInt32(AzeriteEssenceID[i]); + } + data.WriteUInt32(Field_0); + data.WriteBits(Enabled, 1); + data.FlushBits(); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + data.FlushBits(); + data.WriteUInt32(Field_0); + data.WriteBits(Enabled, 1); + for (int i = 0; i < 3; ++i) + { + data.WriteUInt32(AzeriteEssenceID[i]); + } + data.FlushBits(); + } + } + + public class AzeriteItemData : BaseUpdateData + { + public DynamicUpdateField UnlockedEssences = new DynamicUpdateField(0, 1); + public DynamicUpdateField UnlockedEssenceMilestones = new DynamicUpdateField(0, 2); + public DynamicUpdateField SelectedEssences = new DynamicUpdateField(0, 3); + public UpdateField Xp = new UpdateField(0, 4); + public UpdateField Level = new UpdateField(0, 5); + public UpdateField AuraLevel = new UpdateField(0, 6); + public UpdateField KnowledgeLevel = new UpdateField(0, 7); + public UpdateField DEBUGknowledgeWeek = new UpdateField(0, 8); + public AzeriteItemData() : base(9) { } + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteUInt64(Xp); + data.WriteUInt32(Level); + data.WriteUInt32(AuraLevel); + data.WriteUInt32(KnowledgeLevel); + data.WriteUInt32(DEBUGknowledgeWeek); + } + data.WriteInt32(UnlockedEssences.Size()); + data.WriteInt32(SelectedEssences.Size()); + data.WriteInt32(UnlockedEssenceMilestones.Size()); + for (int i = 0; i < UnlockedEssences.Size(); ++i) + { + UnlockedEssences[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + for (int i = 0; i < UnlockedEssenceMilestones.Size(); ++i) + { + data.WriteUInt32(UnlockedEssenceMilestones[i]); + } + for (int i = 0; i < SelectedEssences.Size(); ++i) + { + SelectedEssences[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) + { + UpdateMask allowedMaskForTarget = new UpdateMask(9, new[] { 0x0000000Fu }); + AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + WriteUpdate(data, _changesMask & allowedMaskForTarget, fieldVisibilityFlags, owner, receiver); + } + void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) + { + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + allowedMaskForTarget |= new UpdateMask(9, new[] { 0x000001F0u }); + } + public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) { + data.WriteBits(_changesMask.GetBlock(0), 9); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + UnlockedEssences.WriteUpdateMask(data); + } + if (_changesMask[2]) + { + UnlockedEssenceMilestones.WriteUpdateMask(data); + } + if (_changesMask[3]) + { + SelectedEssences.WriteUpdateMask(data); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + for (int i = 0; i < UnlockedEssences.Size(); ++i) + { + if (UnlockedEssences.HasChanged(i)) + { + UnlockedEssences[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[2]) + { + for (int i = 0; i < UnlockedEssenceMilestones.Size(); ++i) + { + if (UnlockedEssenceMilestones.HasChanged(i)) + { + data.WriteUInt32(UnlockedEssenceMilestones[i]); + } + } + } + if (_changesMask[3]) + { + for (int i = 0; i < SelectedEssences.Size(); ++i) + { + if (SelectedEssences.HasChanged(i)) + { + SelectedEssences[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[4]) + { + data.WriteUInt64(Xp); + } + if (_changesMask[5]) + { + data.WriteUInt32(Level); + } + if (_changesMask[6]) + { + data.WriteUInt32(AuraLevel); + } + if (_changesMask[7]) + { + data.WriteUInt32(KnowledgeLevel); + } + if (_changesMask[8]) + { + data.WriteUInt32(DEBUGknowledgeWeek); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(UnlockedEssences); + ClearChangesMask(UnlockedEssenceMilestones); + ClearChangesMask(SelectedEssences); + ClearChangesMask(Xp); + ClearChangesMask(Level); + ClearChangesMask(AuraLevel); + ClearChangesMask(KnowledgeLevel); + ClearChangesMask(DEBUGknowledgeWeek); + _changesMask.ResetAll(); + } + } + + public class UnitChannel + { + public uint SpellID; + public uint SpellXSpellVisualID; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.WriteUInt32(SpellID); + data.WriteUInt32(SpellXSpellVisualID); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.FlushBits(); + data.WriteUInt32(SpellID); + data.WriteUInt32(SpellXSpellVisualID); + } + } + + public class VisibleItem : BaseUpdateData + { + public UpdateField ItemID = new UpdateField(0, 1); + public UpdateField ItemAppearanceModID = new UpdateField(0, 2); + public UpdateField ItemVisual = new UpdateField(0, 3); + + public VisibleItem() : base(4) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.WriteUInt32(ItemID); + data.WriteUInt16(ItemAppearanceModID); + data.WriteUInt16(ItemVisual); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { + + data.WriteBits(_changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(ItemID); + } + if (_changesMask[2]) + { + data.WriteUInt16(ItemAppearanceModID); + } + if (_changesMask[3]) + { + data.WriteUInt16(ItemVisual); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(ItemID); + ClearChangesMask(ItemAppearanceModID); + ClearChangesMask(ItemVisual); + _changesMask.ResetAll(); + } + } + + public class PassiveSpellHistory + { + int SpellID; + int AuraSpellID; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.WriteInt32(SpellID); + data.WriteInt32(AuraSpellID); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.FlushBits(); + data.WriteInt32(SpellID); + data.WriteInt32(AuraSpellID); + } + } + + public class UnitData : BaseUpdateData + { + public UpdateField> StateWorldEffectIDs = new UpdateField>(0, 1); + public DynamicUpdateField PassiveSpells = new DynamicUpdateField(0, 2); + public DynamicUpdateField WorldEffects = new DynamicUpdateField(0, 3); + public DynamicUpdateField ChannelObjects = new DynamicUpdateField(0, 4); + public UpdateField DisplayID = new UpdateField(0, 5); + public UpdateField StateSpellVisualID = new UpdateField(0, 6); + public UpdateField StateAnimID = new UpdateField(0, 7); + public UpdateField StateAnimKitID = new UpdateField(0, 8); + public UpdateField StateWorldEffectsQuestObjectiveID = new UpdateField(0, 9); + public UpdateField Charm = new UpdateField(0, 10); + public UpdateField Summon = new UpdateField(0, 11); + public UpdateField Critter = new UpdateField(0, 12); + public UpdateField CharmedBy = new UpdateField(0, 13); + public UpdateField SummonedBy = new UpdateField(0, 14); + public UpdateField CreatedBy = new UpdateField(0, 15); + public UpdateField DemonCreator = new UpdateField(0, 16); + public UpdateField LookAtControllerTarget = new UpdateField(0, 17); + public UpdateField Target = new UpdateField(0, 18); + public UpdateField BattlePetCompanionGUID = new UpdateField(0, 19); + public UpdateField BattlePetDBID = new UpdateField(0, 20); + public UpdateField ChannelData = new UpdateField(0, 21); + public UpdateField SummonedByHomeRealm = new UpdateField(0, 22); + public UpdateField Race = new UpdateField(0, 23); + public UpdateField ClassId = new UpdateField(0, 24); + public UpdateField PlayerClassId = new UpdateField(0, 25); + public UpdateField Sex = new UpdateField(0, 26); + public UpdateField DisplayPower = new UpdateField(0, 27); + public UpdateField OverrideDisplayPowerID = new UpdateField(0, 28); + public UpdateField Health = new UpdateField(0, 29); + public UpdateField MaxHealth = new UpdateField(0, 30); + public UpdateField Level = new UpdateField(0, 31); + public UpdateField EffectiveLevel = new UpdateField(32, 33); + public UpdateField ContentTuningID = new UpdateField(32, 34); + public UpdateField ScalingLevelMin = new UpdateField(32, 35); + public UpdateField ScalingLevelMax = new UpdateField(32, 36); + public UpdateField ScalingLevelDelta = new UpdateField(32, 37); + public UpdateField ScalingFactionGroup = new UpdateField(32, 38); + public UpdateField ScalingHealthItemLevelCurveID = new UpdateField(32, 39); + public UpdateField ScalingDamageItemLevelCurveID = new UpdateField(32, 40); + public UpdateField FactionTemplate = new UpdateField(32, 41); + public UpdateField Flags = new UpdateField(32, 42); + public UpdateField Flags2 = new UpdateField(32, 43); + public UpdateField Flags3 = new UpdateField(32, 44); + public UpdateField AuraState = new UpdateField(32, 45); + public UpdateField RangedAttackRoundBaseTime = new UpdateField(32, 46); + public UpdateField BoundingRadius = new UpdateField(32, 47); + public UpdateField CombatReach = new UpdateField(32, 48); + public UpdateField DisplayScale = new UpdateField(32, 49); + public UpdateField NativeDisplayID = new UpdateField(32, 50); + public UpdateField NativeXDisplayScale = new UpdateField(32, 51); + public UpdateField MountDisplayID = new UpdateField(32, 52); + public UpdateField CosmeticMountDisplayID = new UpdateField(32, 53); + public UpdateField MinDamage = new UpdateField(32, 54); + public UpdateField MaxDamage = new UpdateField(32, 55); + public UpdateField MinOffHandDamage = new UpdateField(32, 56); + public UpdateField MaxOffHandDamage = new UpdateField(32, 57); + public UpdateField StandState = new UpdateField(32, 58); + public UpdateField PetTalentPoints = new UpdateField(32, 59); + public UpdateField VisFlags = new UpdateField(32, 60); + public UpdateField AnimTier = new UpdateField(32, 61); + public UpdateField PetNumber = new UpdateField(32, 62); + public UpdateField PetNameTimestamp = new UpdateField(32, 63); + public UpdateField PetExperience = new UpdateField(64, 65); + public UpdateField PetNextLevelExperience = new UpdateField(64, 66); + public UpdateField ModCastingSpeed = new UpdateField(64, 67); + public UpdateField ModSpellHaste = new UpdateField(64, 68); + public UpdateField ModHaste = new UpdateField(64, 69); + public UpdateField ModRangedHaste = new UpdateField(64, 70); + public UpdateField ModHasteRegen = new UpdateField(64, 71); + public UpdateField ModTimeRate = new UpdateField(64, 72); + public UpdateField CreatedBySpell = new UpdateField(64, 73); + public UpdateField EmoteState = new UpdateField(64, 74); + public UpdateField BaseMana = new UpdateField(64, 75); + public UpdateField BaseHealth = new UpdateField(64, 76); + public UpdateField SheatheState = new UpdateField(64, 77); + public UpdateField PvpFlags = new UpdateField(64, 78); + public UpdateField PetFlags = new UpdateField(64, 79); + public UpdateField ShapeshiftForm = new UpdateField(64, 80); + public UpdateField AttackPower = new UpdateField(64, 81); + public UpdateField AttackPowerModPos = new UpdateField(64, 82); + public UpdateField AttackPowerModNeg = new UpdateField(64, 83); + public UpdateField AttackPowerMultiplier = new UpdateField(64, 84); + public UpdateField RangedAttackPower = new UpdateField(64, 85); + public UpdateField RangedAttackPowerModPos = new UpdateField(64, 86); + public UpdateField RangedAttackPowerModNeg = new UpdateField(64, 87); + public UpdateField RangedAttackPowerMultiplier = new UpdateField(64, 88); + public UpdateField MainHandWeaponAttackPower = new UpdateField(64, 89); + public UpdateField OffHandWeaponAttackPower = new UpdateField(64, 90); + public UpdateField RangedWeaponAttackPower = new UpdateField(64, 91); + public UpdateField SetAttackSpeedAura = new UpdateField(64, 92); + public UpdateField Lifesteal = new UpdateField(64, 93); + public UpdateField MinRangedDamage = new UpdateField(64, 94); + public UpdateField MaxRangedDamage = new UpdateField(64, 95); + public UpdateField ManaCostModifierModifier = new UpdateField(96, 97); + public UpdateField MaxHealthModifier = new UpdateField(96, 98); + public UpdateField HoverHeight = new UpdateField(96, 99); + public UpdateField MinItemLevelCutoff = new UpdateField(96, 100); + public UpdateField MinItemLevel = new UpdateField(96, 101); + public UpdateField MaxItemLevel = new UpdateField(96, 102); + public UpdateField AzeriteItemLevel = new UpdateField(96, 103); + public UpdateField WildBattlePetLevel = new UpdateField(96, 104); + public UpdateField BattlePetCompanionNameTimestamp = new UpdateField(96, 105); + public UpdateField InteractSpellID = new UpdateField(96, 106); + public UpdateField ScaleDuration = new UpdateField(96, 107); + public UpdateField SpellOverrideNameID = new UpdateField(96, 108); + public UpdateField LooksLikeMountID = new UpdateField(96, 109); + public UpdateField LooksLikeCreatureID = new UpdateField(96, 110); + public UpdateField LookAtControllerID = new UpdateField(96, 111); + public UpdateField TaxiNodesID = new UpdateField(96, 112); + public UpdateField GuildGUID = new UpdateField(96, 113); + public UpdateFieldArray NpcFlags = new UpdateFieldArray(2, 114, 115); + public UpdateFieldArray Power = new UpdateFieldArray(6, 117, 118); + public UpdateFieldArray MaxPower = new UpdateFieldArray(6, 117, 124); + public UpdateFieldArray PowerRegenFlatModifier = new UpdateFieldArray(6, 117, 130); + public UpdateFieldArray PowerRegenInterruptedFlatModifier = new UpdateFieldArray(6, 117, 136); + public UpdateFieldArray VirtualItems = new UpdateFieldArray(3, 142, 143); + public UpdateFieldArray AttackRoundBaseTime = new UpdateFieldArray(2, 146, 147); + public UpdateFieldArray Stats = new UpdateFieldArray(4, 149, 150); + public UpdateFieldArray StatPosBuff = new UpdateFieldArray(4, 149, 154); + public UpdateFieldArray StatNegBuff = new UpdateFieldArray(4, 149, 158); + public UpdateFieldArray Resistances = new UpdateFieldArray(7, 162, 163); + public UpdateFieldArray BonusResistanceMods = new UpdateFieldArray(7, 162, 170); + public UpdateFieldArray PowerCostModifier = new UpdateFieldArray(7, 162, 177); + public UpdateFieldArray PowerCostMultiplier = new UpdateFieldArray(7, 162, 184); + + public UnitData() : base(191) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.WriteUInt32(GetViewerDependentDisplayId(DisplayID, owner, receiver)); + for (int i = 0; i < 2; ++i) + data.WriteUInt32(GetViewerDependentNpcFlags(NpcFlags[i], i, owner, receiver)); + + data.WriteUInt32(StateSpellVisualID); + data.WriteUInt32(StateAnimID); + data.WriteUInt32(StateAnimKitID); + data.WriteInt32(((List)StateWorldEffectIDs).Count); + data.WriteUInt32(StateWorldEffectsQuestObjectiveID); + for (int i = 0; i < ((List)StateWorldEffectIDs).Count; ++i) + data.WriteUInt32(((List)StateWorldEffectIDs)[i]); + + data.WritePackedGuid(Charm); + data.WritePackedGuid(Summon); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + data.WritePackedGuid(Critter); + + data.WritePackedGuid(CharmedBy); + data.WritePackedGuid(SummonedBy); + data.WritePackedGuid(CreatedBy); + data.WritePackedGuid(DemonCreator); + data.WritePackedGuid(LookAtControllerTarget); + data.WritePackedGuid(Target); + data.WritePackedGuid(BattlePetCompanionGUID); + data.WriteUInt64(BattlePetDBID); + ((UnitChannel)ChannelData).WriteCreate(data, fieldVisibilityFlags, owner, receiver); + data.WriteUInt32(SummonedByHomeRealm); + data.WriteUInt8(Race); + data.WriteUInt8(ClassId); + data.WriteUInt8(PlayerClassId); + data.WriteUInt8(Sex); + data.WriteUInt8(DisplayPower); + data.WriteUInt32(OverrideDisplayPowerID); + data.WriteUInt64(Health); + for (int i = 0; i < 6; ++i) + { + data.WriteInt32(Power[i]); + data.WriteUInt32(MaxPower[i]); + } + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner) || fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) + { + for (int i = 0; i < 6; ++i) + { + data.WriteFloat(PowerRegenFlatModifier[i]); + data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); + } + } + data.WriteUInt64(MaxHealth); + data.WriteUInt32(Level); + data.WriteInt32(EffectiveLevel); + data.WriteInt32(ContentTuningID); + data.WriteInt32(ScalingLevelMin); + data.WriteInt32(ScalingLevelMax); + data.WriteInt32(ScalingLevelDelta); + data.WriteInt32(ScalingFactionGroup); + data.WriteInt32(ScalingHealthItemLevelCurveID); + data.WriteInt32(ScalingDamageItemLevelCurveID); + data.WriteUInt32(GetViewerDependentFactionTemplate(FactionTemplate, owner, receiver)); + for (int i = 0; i < 3; ++i) + VirtualItems[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + + data.WriteUInt32(GetViewerDependentFlags(Flags, owner, receiver)); + data.WriteUInt32(Flags2); + data.WriteUInt32(Flags3); + data.WriteUInt32(GetViewerDependentAuraState(AuraState, owner, receiver)); + for (int i = 0; i < 2; ++i) + data.WriteUInt32(AttackRoundBaseTime[i]); + + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + data.WriteUInt32(RangedAttackRoundBaseTime); + + data.WriteFloat(BoundingRadius); + data.WriteFloat(CombatReach); + data.WriteFloat(DisplayScale); + data.WriteUInt32(NativeDisplayID); + data.WriteFloat(NativeXDisplayScale); + data.WriteUInt32(MountDisplayID); + data.WriteInt32(CosmeticMountDisplayID); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner) || fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) + { + data.WriteFloat(MinDamage); + data.WriteFloat(MaxDamage); + data.WriteFloat(MinOffHandDamage); + data.WriteFloat(MaxOffHandDamage); + } + data.WriteUInt8(StandState); + data.WriteUInt8(PetTalentPoints); + data.WriteUInt8(VisFlags); + data.WriteUInt8(AnimTier); + data.WriteUInt32(PetNumber); + data.WriteUInt32(PetNameTimestamp); + data.WriteUInt32(PetExperience); + data.WriteUInt32(PetNextLevelExperience); + data.WriteFloat(ModCastingSpeed); + data.WriteFloat(ModSpellHaste); + data.WriteFloat(ModHaste); + data.WriteFloat(ModRangedHaste); + data.WriteFloat(ModHasteRegen); + data.WriteFloat(ModTimeRate); + data.WriteUInt32(CreatedBySpell); + data.WriteInt32(EmoteState); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + for (int i = 0; i < 4; ++i) + { + data.WriteInt32(Stats[i]); + data.WriteInt32(StatPosBuff[i]); + data.WriteInt32(StatNegBuff[i]); + } + } + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner) || fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) + { + for (int i = 0; i < 7; ++i) + { + data.WriteInt32(Resistances[i]); + } + } + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + for (int i = 0; i < 7; ++i) + { + data.WriteInt32(BonusResistanceMods[i]); + data.WriteInt32(PowerCostModifier[i]); + data.WriteFloat(PowerCostMultiplier[i]); + } + } + data.WriteUInt32(BaseMana); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + data.WriteUInt32(BaseHealth); + + data.WriteUInt8(SheatheState); + data.WriteUInt8((byte)GetViewerDependentPvpFlags(PvpFlags, owner, receiver)); + data.WriteUInt8(PetFlags); + data.WriteUInt8(ShapeshiftForm); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + { + data.WriteInt32(AttackPower); + data.WriteInt32(AttackPowerModPos); + data.WriteInt32(AttackPowerModNeg); + data.WriteFloat(AttackPowerMultiplier); + data.WriteInt32(RangedAttackPower); + data.WriteInt32(RangedAttackPowerModPos); + data.WriteInt32(RangedAttackPowerModNeg); + data.WriteFloat(RangedAttackPowerMultiplier); + data.WriteInt32(MainHandWeaponAttackPower); + data.WriteInt32(OffHandWeaponAttackPower); + data.WriteInt32(RangedWeaponAttackPower); + data.WriteInt32(SetAttackSpeedAura); + data.WriteFloat(Lifesteal); + data.WriteFloat(MinRangedDamage); + data.WriteFloat(MaxRangedDamage); + data.WriteFloat(ManaCostModifierModifier); + data.WriteFloat(MaxHealthModifier); + } + data.WriteFloat(HoverHeight); + data.WriteUInt32(MinItemLevelCutoff); + data.WriteUInt32(MinItemLevel); + data.WriteUInt32(MaxItemLevel); + data.WriteInt32(AzeriteItemLevel); + data.WriteInt32(WildBattlePetLevel); + data.WriteUInt32(BattlePetCompanionNameTimestamp); + data.WriteInt32(InteractSpellID); + data.WriteInt32(ScaleDuration); + data.WriteInt32(SpellOverrideNameID); + data.WriteInt32(LooksLikeMountID); + data.WriteInt32(LooksLikeCreatureID); + data.WriteInt32(LookAtControllerID); + data.WriteInt32(TaxiNodesID); + data.WritePackedGuid(GuildGUID); + data.WriteInt32(PassiveSpells.Size()); + data.WriteInt32(WorldEffects.Size()); + data.WriteInt32(ChannelObjects.Size()); + for (int i = 0; i < PassiveSpells.Size(); ++i) + PassiveSpells[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + + for (int i = 0; i < WorldEffects.Size(); ++i) + data.WriteInt32(WorldEffects[i]); + + for (int i = 0; i < ChannelObjects.Size(); ++i) + data.WritePackedGuid(ChannelObjects[i]); + } + + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + UpdateMask allowedMaskForTarget = new UpdateMask(191, new uint[] { 0xFFFFEFFFu, 0xFC3FBFFFu, 0x0001EFFFu, 0xFFDFFFF9u, 0x001FC003u, 0x00000000u }); + AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + WriteUpdate(data, _changesMask & allowedMaskForTarget, fieldVisibilityFlags, owner, receiver); + } + + public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) + { + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + allowedMaskForTarget |= new UpdateMask(191, new uint[] { 0x00001000u, 0x03C04000u, 0xFFFE1000u, 0x00200006u, 0xFFE03FFCu, 0x7FFFFFFFu }); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) + allowedMaskForTarget |= new UpdateMask(191, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x00200000u, 0x00003FFCu, 0x00000000u }); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) + allowedMaskForTarget |= new UpdateMask(191, new uint[] { 0x00000000u, 0x03C00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000003FCu }); + } + + public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 6); + for (uint i = 0; i < 6; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + List list = StateWorldEffectIDs; + data.WriteBits(list.Count, 32); + for (int i = 0; i < list.Count; ++i) + { + data.WriteUInt32(list[i]); + } + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + PassiveSpells.WriteUpdateMask(data); + } + if (_changesMask[3]) + { + WorldEffects.WriteUpdateMask(data); + } + if (_changesMask[4]) + { + ChannelObjects.WriteUpdateMask(data); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + for (int i = 0; i < PassiveSpells.Size(); ++i) + { + if (PassiveSpells.HasChanged(i)) + { + PassiveSpells[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[3]) + { + for (int i = 0; i < WorldEffects.Size(); ++i) + { + if (WorldEffects.HasChanged(i)) + { + data.WriteInt32(WorldEffects[i]); + } + } + } + if (_changesMask[4]) + { + for (int i = 0; i < ChannelObjects.Size(); ++i) + { + if (ChannelObjects.HasChanged(i)) + { + data.WritePackedGuid(ChannelObjects[i]); + } + } + } + if (_changesMask[5]) + { + data.WriteUInt32(GetViewerDependentDisplayId(DisplayID, owner, receiver)); + } + if (_changesMask[6]) + { + data.WriteUInt32(StateSpellVisualID); + } + if (_changesMask[7]) + { + data.WriteUInt32(StateAnimID); + } + if (_changesMask[8]) + { + data.WriteUInt32(StateAnimKitID); + } + if (_changesMask[9]) + { + data.WriteUInt32(StateWorldEffectsQuestObjectiveID); + } + if (_changesMask[10]) + { + data.WritePackedGuid(Charm); + } + if (_changesMask[11]) + { + data.WritePackedGuid(Summon); + } + if (_changesMask[12]) + { + data.WritePackedGuid(Critter); + } + if (_changesMask[13]) + { + data.WritePackedGuid(CharmedBy); + } + if (_changesMask[14]) + { + data.WritePackedGuid(SummonedBy); + } + if (_changesMask[15]) + { + data.WritePackedGuid(CreatedBy); + } + if (_changesMask[16]) + { + data.WritePackedGuid(DemonCreator); + } + if (_changesMask[17]) + { + data.WritePackedGuid(LookAtControllerTarget); + } + if (_changesMask[18]) + { + data.WritePackedGuid(Target); + } + if (_changesMask[19]) + { + data.WritePackedGuid(BattlePetCompanionGUID); + } + if (_changesMask[20]) + { + data.WriteUInt64(BattlePetDBID); + } + if (_changesMask[21]) + { + ((UnitChannel)ChannelData).WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + if (_changesMask[22]) + { + data.WriteUInt32(SummonedByHomeRealm); + } + if (_changesMask[23]) + { + data.WriteUInt8(Race); + } + if (_changesMask[24]) + { + data.WriteUInt8(ClassId); + } + if (_changesMask[25]) + { + data.WriteUInt8(PlayerClassId); + } + if (_changesMask[26]) + { + data.WriteUInt8(Sex); + } + if (_changesMask[27]) + { + data.WriteUInt8(DisplayPower); + } + if (_changesMask[28]) + { + data.WriteUInt32(OverrideDisplayPowerID); + } + if (_changesMask[29]) + { + data.WriteUInt64(Health); + } + if (_changesMask[30]) + { + data.WriteUInt64(MaxHealth); + } + if (_changesMask[31]) + { + data.WriteUInt32(Level); + } + } + if (_changesMask[32]) + { + if (_changesMask[33]) + { + data.WriteInt32(EffectiveLevel); + } + if (_changesMask[34]) + { + data.WriteInt32(ContentTuningID); + } + if (_changesMask[35]) + { + data.WriteInt32(ScalingLevelMin); + } + if (_changesMask[36]) + { + data.WriteInt32(ScalingLevelMax); + } + if (_changesMask[37]) + { + data.WriteInt32(ScalingLevelDelta); + } + if (_changesMask[38]) + { + data.WriteInt32(ScalingFactionGroup); + } + if (_changesMask[39]) + { + data.WriteInt32(ScalingHealthItemLevelCurveID); + } + if (_changesMask[40]) + { + data.WriteInt32(ScalingDamageItemLevelCurveID); + } + if (_changesMask[41]) + { + data.WriteUInt32(GetViewerDependentFactionTemplate(FactionTemplate, owner, receiver)); + } + if (_changesMask[42]) + { + data.WriteUInt32(GetViewerDependentFlags(Flags, owner, receiver)); + } + if (_changesMask[43]) + { + data.WriteUInt32(Flags2); + } + if (_changesMask[44]) + { + data.WriteUInt32(Flags3); + } + if (_changesMask[45]) + { + data.WriteUInt32(GetViewerDependentAuraState(AuraState, owner, receiver)); + } + if (_changesMask[46]) + { + data.WriteUInt32(RangedAttackRoundBaseTime); + } + if (_changesMask[47]) + { + data.WriteFloat(BoundingRadius); + } + if (_changesMask[48]) + { + data.WriteFloat(CombatReach); + } + if (_changesMask[49]) + { + data.WriteFloat(DisplayScale); + } + if (_changesMask[50]) + { + data.WriteUInt32(NativeDisplayID); + } + if (_changesMask[51]) + { + data.WriteFloat(NativeXDisplayScale); + } + if (_changesMask[52]) + { + data.WriteUInt32(MountDisplayID); + } + if (_changesMask[53]) + { + data.WriteInt32(CosmeticMountDisplayID); + } + if (_changesMask[54]) + { + data.WriteFloat(MinDamage); + } + if (_changesMask[55]) + { + data.WriteFloat(MaxDamage); + } + if (_changesMask[56]) + { + data.WriteFloat(MinOffHandDamage); + } + if (_changesMask[57]) + { + data.WriteFloat(MaxOffHandDamage); + } + if (_changesMask[58]) + { + data.WriteUInt8(StandState); + } + if (_changesMask[59]) + { + data.WriteUInt8(PetTalentPoints); + } + if (_changesMask[60]) + { + data.WriteUInt8(VisFlags); + } + if (_changesMask[61]) + { + data.WriteUInt8(AnimTier); + } + if (_changesMask[62]) + { + data.WriteUInt32(PetNumber); + } + if (_changesMask[63]) + { + data.WriteUInt32(PetNameTimestamp); + } + } + if (_changesMask[64]) + { + if (_changesMask[65]) + { + data.WriteUInt32(PetExperience); + } + if (_changesMask[66]) + { + data.WriteUInt32(PetNextLevelExperience); + } + if (_changesMask[67]) + { + data.WriteFloat(ModCastingSpeed); + } + if (_changesMask[68]) + { + data.WriteFloat(ModSpellHaste); + } + if (_changesMask[69]) + { + data.WriteFloat(ModHaste); + } + if (_changesMask[70]) + { + data.WriteFloat(ModRangedHaste); + } + if (_changesMask[71]) + { + data.WriteFloat(ModHasteRegen); + } + if (_changesMask[72]) + { + data.WriteFloat(ModTimeRate); + } + if (_changesMask[73]) + { + data.WriteUInt32(CreatedBySpell); + } + if (_changesMask[74]) + { + data.WriteInt32(EmoteState); + } + if (_changesMask[75]) + { + data.WriteUInt32(BaseMana); + } + if (_changesMask[76]) + { + data.WriteUInt32(BaseHealth); + } + if (_changesMask[77]) + { + data.WriteUInt8(SheatheState); + } + if (_changesMask[78]) + { + data.WriteUInt8((byte)GetViewerDependentPvpFlags(PvpFlags, owner, receiver)); + } + if (_changesMask[79]) + { + data.WriteUInt8(PetFlags); + } + if (_changesMask[80]) + { + data.WriteUInt8(ShapeshiftForm); + } + if (_changesMask[81]) + { + data.WriteInt32(AttackPower); + } + if (_changesMask[82]) + { + data.WriteInt32(AttackPowerModPos); + } + if (_changesMask[83]) + { + data.WriteInt32(AttackPowerModNeg); + } + if (_changesMask[84]) + { + data.WriteFloat(AttackPowerMultiplier); + } + if (_changesMask[85]) + { + data.WriteInt32(RangedAttackPower); + } + if (_changesMask[86]) + { + data.WriteInt32(RangedAttackPowerModPos); + } + if (_changesMask[87]) + { + data.WriteInt32(RangedAttackPowerModNeg); + } + if (_changesMask[88]) + { + data.WriteFloat(RangedAttackPowerMultiplier); + } + if (_changesMask[89]) + { + data.WriteInt32(MainHandWeaponAttackPower); + } + if (_changesMask[90]) + { + data.WriteInt32(OffHandWeaponAttackPower); + } + if (_changesMask[91]) + { + data.WriteInt32(RangedWeaponAttackPower); + } + if (_changesMask[92]) + { + data.WriteInt32(SetAttackSpeedAura); + } + if (_changesMask[93]) + { + data.WriteFloat(Lifesteal); + } + if (_changesMask[94]) + { + data.WriteFloat(MinRangedDamage); + } + if (_changesMask[95]) + { + data.WriteFloat(MaxRangedDamage); + } + } + if (_changesMask[96]) + { + if (_changesMask[97]) + { + data.WriteFloat(ManaCostModifierModifier); + } + if (_changesMask[98]) + { + data.WriteFloat(MaxHealthModifier); + } + if (_changesMask[99]) + { + data.WriteFloat(HoverHeight); + } + if (_changesMask[100]) + { + data.WriteUInt32(MinItemLevelCutoff); + } + if (_changesMask[101]) + { + data.WriteUInt32(MinItemLevel); + } + if (_changesMask[102]) + { + data.WriteUInt32(MaxItemLevel); + } + if (_changesMask[103]) + { + data.WriteInt32(AzeriteItemLevel); + } + if (_changesMask[104]) + { + data.WriteInt32(WildBattlePetLevel); + } + if (_changesMask[105]) + { + data.WriteUInt32(BattlePetCompanionNameTimestamp); + } + if (_changesMask[106]) + { + data.WriteInt32(InteractSpellID); + } + if (_changesMask[107]) + { + data.WriteInt32(ScaleDuration); + } + if (_changesMask[108]) + { + data.WriteInt32(SpellOverrideNameID); + } + if (_changesMask[109]) + { + data.WriteInt32(LooksLikeMountID); + } + if (_changesMask[110]) + { + data.WriteInt32(LooksLikeCreatureID); + } + if (_changesMask[111]) + { + data.WriteInt32(LookAtControllerID); + } + if (_changesMask[112]) + { + data.WriteInt32(TaxiNodesID); + } + if (_changesMask[113]) + { + data.WritePackedGuid(GuildGUID); + } + } + if (_changesMask[114]) + { + for (int i = 0; i < 2; ++i) + { + if (_changesMask[115 + i]) + { + data.WriteUInt32(GetViewerDependentNpcFlags(NpcFlags[i], i, owner, receiver)); + } + } + } + if (_changesMask[117]) + { + for (int i = 0; i < 6; ++i) + { + if (_changesMask[118 + i]) + { + data.WriteInt32(Power[i]); + } + if (_changesMask[124 + i]) + { + data.WriteUInt32(MaxPower[i]); + } + if (_changesMask[130 + i]) + { + data.WriteFloat(PowerRegenFlatModifier[i]); + } + if (_changesMask[136 + i]) + { + data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); + } + } + } + if (_changesMask[142]) + { + for (int i = 0; i < 3; ++i) + { + if (_changesMask[143 + i]) + { + VirtualItems[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[146]) + { + for (int i = 0; i < 2; ++i) + { + if (_changesMask[147 + i]) + { + data.WriteUInt32(AttackRoundBaseTime[i]); + } + } + } + if (_changesMask[149]) + { + for (int i = 0; i < 4; ++i) + { + if (_changesMask[150 + i]) + { + data.WriteInt32(Stats[i]); + } + if (_changesMask[154 + i]) + { + data.WriteInt32(StatPosBuff[i]); + } + if (_changesMask[158 + i]) + { + data.WriteInt32(StatNegBuff[i]); + } + } + } + if (_changesMask[162]) + { + for (int i = 0; i < 7; ++i) + { + if (_changesMask[163 + i]) + { + data.WriteInt32(Resistances[i]); + } + if (_changesMask[170 + i]) + { + data.WriteInt32(BonusResistanceMods[i]); + } + if (_changesMask[177 + i]) + { + data.WriteInt32(PowerCostModifier[i]); + } + if (_changesMask[184 + i]) + { + data.WriteFloat(PowerCostMultiplier[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(StateWorldEffectIDs); + ClearChangesMask(PassiveSpells); + ClearChangesMask(WorldEffects); + ClearChangesMask(ChannelObjects); + ClearChangesMask(DisplayID); + ClearChangesMask(StateSpellVisualID); + ClearChangesMask(StateAnimID); + ClearChangesMask(StateAnimKitID); + ClearChangesMask(StateWorldEffectsQuestObjectiveID); + ClearChangesMask(Charm); + ClearChangesMask(Summon); + ClearChangesMask(Critter); + ClearChangesMask(CharmedBy); + ClearChangesMask(SummonedBy); + ClearChangesMask(CreatedBy); + ClearChangesMask(DemonCreator); + ClearChangesMask(LookAtControllerTarget); + ClearChangesMask(Target); + ClearChangesMask(BattlePetCompanionGUID); + ClearChangesMask(BattlePetDBID); + ClearChangesMask(ChannelData); + ClearChangesMask(SummonedByHomeRealm); + ClearChangesMask(Race); + ClearChangesMask(ClassId); + ClearChangesMask(PlayerClassId); + ClearChangesMask(Sex); + ClearChangesMask(DisplayPower); + ClearChangesMask(OverrideDisplayPowerID); + ClearChangesMask(Health); + ClearChangesMask(MaxHealth); + ClearChangesMask(Level); + ClearChangesMask(EffectiveLevel); + ClearChangesMask(ContentTuningID); + ClearChangesMask(ScalingLevelMin); + ClearChangesMask(ScalingLevelMax); + ClearChangesMask(ScalingLevelDelta); + ClearChangesMask(ScalingFactionGroup); + ClearChangesMask(ScalingHealthItemLevelCurveID); + ClearChangesMask(ScalingDamageItemLevelCurveID); + ClearChangesMask(FactionTemplate); + ClearChangesMask(Flags); + ClearChangesMask(Flags2); + ClearChangesMask(Flags3); + ClearChangesMask(AuraState); + ClearChangesMask(RangedAttackRoundBaseTime); + ClearChangesMask(BoundingRadius); + ClearChangesMask(CombatReach); + ClearChangesMask(DisplayScale); + ClearChangesMask(NativeDisplayID); + ClearChangesMask(NativeXDisplayScale); + ClearChangesMask(MountDisplayID); + ClearChangesMask(CosmeticMountDisplayID); + ClearChangesMask(MinDamage); + ClearChangesMask(MaxDamage); + ClearChangesMask(MinOffHandDamage); + ClearChangesMask(MaxOffHandDamage); + ClearChangesMask(StandState); + ClearChangesMask(PetTalentPoints); + ClearChangesMask(VisFlags); + ClearChangesMask(AnimTier); + ClearChangesMask(PetNumber); + ClearChangesMask(PetNameTimestamp); + ClearChangesMask(PetExperience); + ClearChangesMask(PetNextLevelExperience); + ClearChangesMask(ModCastingSpeed); + ClearChangesMask(ModSpellHaste); + ClearChangesMask(ModHaste); + ClearChangesMask(ModRangedHaste); + ClearChangesMask(ModHasteRegen); + ClearChangesMask(ModTimeRate); + ClearChangesMask(CreatedBySpell); + ClearChangesMask(EmoteState); + ClearChangesMask(BaseMana); + ClearChangesMask(BaseHealth); + ClearChangesMask(SheatheState); + ClearChangesMask(PvpFlags); + ClearChangesMask(PetFlags); + ClearChangesMask(ShapeshiftForm); + ClearChangesMask(AttackPower); + ClearChangesMask(AttackPowerModPos); + ClearChangesMask(AttackPowerModNeg); + ClearChangesMask(AttackPowerMultiplier); + ClearChangesMask(RangedAttackPower); + ClearChangesMask(RangedAttackPowerModPos); + ClearChangesMask(RangedAttackPowerModNeg); + ClearChangesMask(RangedAttackPowerMultiplier); + ClearChangesMask(MainHandWeaponAttackPower); + ClearChangesMask(OffHandWeaponAttackPower); + ClearChangesMask(RangedWeaponAttackPower); + ClearChangesMask(SetAttackSpeedAura); + ClearChangesMask(Lifesteal); + ClearChangesMask(MinRangedDamage); + ClearChangesMask(MaxRangedDamage); + ClearChangesMask(ManaCostModifierModifier); + ClearChangesMask(MaxHealthModifier); + ClearChangesMask(HoverHeight); + ClearChangesMask(MinItemLevelCutoff); + ClearChangesMask(MinItemLevel); + ClearChangesMask(MaxItemLevel); + ClearChangesMask(AzeriteItemLevel); + ClearChangesMask(WildBattlePetLevel); + ClearChangesMask(BattlePetCompanionNameTimestamp); + ClearChangesMask(InteractSpellID); + ClearChangesMask(ScaleDuration); + ClearChangesMask(SpellOverrideNameID); + ClearChangesMask(LooksLikeMountID); + ClearChangesMask(LooksLikeCreatureID); + ClearChangesMask(LookAtControllerID); + ClearChangesMask(TaxiNodesID); + ClearChangesMask(GuildGUID); + ClearChangesMask(NpcFlags); + ClearChangesMask(Power); + ClearChangesMask(MaxPower); + ClearChangesMask(PowerRegenFlatModifier); + ClearChangesMask(PowerRegenInterruptedFlatModifier); + ClearChangesMask(VirtualItems); + ClearChangesMask(AttackRoundBaseTime); + ClearChangesMask(Stats); + ClearChangesMask(StatPosBuff); + ClearChangesMask(StatNegBuff); + ClearChangesMask(Resistances); + ClearChangesMask(BonusResistanceMods); + ClearChangesMask(PowerCostModifier); + ClearChangesMask(PowerCostMultiplier); + _changesMask.ResetAll(); + } + + uint GetViewerDependentDisplayId(uint displayId, Unit unit, Player receiver) + { + if (unit.IsCreature()) + { + CreatureTemplate cinfo = unit.ToCreature().GetCreatureTemplate(); + + // this also applies for transform auras + SpellInfo transform = Global.SpellMgr.GetSpellInfo(unit.getTransForm()); + if (transform != null) + { + foreach (SpellEffectInfo effect in transform.GetEffectsForDifficulty(unit.GetMap().GetDifficultyID())) + { + if (effect != null && effect.IsAura(AuraType.Transform)) + { + CreatureTemplate transformInfo = Global.ObjectMgr.GetCreatureTemplate((uint)effect.MiscValue); + if (transformInfo != null) + { + cinfo = transformInfo; + break; + } + } + } + } + + if (cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Trigger)) + if (receiver.IsGameMaster()) + displayId = cinfo.GetFirstVisibleModel().CreatureDisplayID; + } + + return displayId; + } + uint GetViewerDependentNpcFlags(uint npcFlag, int i, Unit unit, Player receiver) + { + if (i == 0 && unit.IsCreature() && !receiver.CanSeeSpellClickOn(unit.ToCreature())) + npcFlag &= ~(uint)NPCFlags.SpellClick; + + return npcFlag; + } + uint GetViewerDependentFactionTemplate(uint factionTemplate, Unit unit, Player receiver) + { + if (unit.IsControlledByPlayer() && receiver != unit && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && unit.IsInRaidWith(receiver)) + { + FactionTemplateRecord ft1 = unit.GetFactionTemplateEntry(); + FactionTemplateRecord ft2 = receiver.GetFactionTemplateEntry(); + if (ft1 != null && ft2 != null && !ft1.IsFriendlyTo(ft2)) + // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work) + factionTemplate = receiver.GetFaction(); + } + + return factionTemplate; + } + uint GetViewerDependentFlags(uint flags, Unit unit, Player receiver) + { + // Gamemasters should be always able to select units - remove not selectable flag + if (receiver.IsGameMaster()) + flags &= ~(uint)UnitFlags.NotSelectable; + + return flags; + } + uint GetViewerDependentAuraState(uint auraState, Unit unit, Player receiver) + { + // Check per caster aura states to not enable using a spell in client if specified aura is not by target + return unit.BuildAuraStateUpdateForTarget(receiver); + } + uint GetViewerDependentPvpFlags(uint pvpFlags, Unit unit, Player receiver) + { + if (unit.IsControlledByPlayer() && receiver != unit && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && unit.IsInRaidWith(receiver)) + { + FactionTemplateRecord ft1 = unit.GetFactionTemplateEntry(); + FactionTemplateRecord ft2 = receiver.GetFactionTemplateEntry(); + if (ft1 != null && ft2 != null && !ft1.IsFriendlyTo(ft2)) + // Allow targeting opposite faction in party when enabled in config + pvpFlags &= (uint)UnitPVPStateFlags.Sanctuary; + } + + return pvpFlags; + } + } + + public class QuestLog : BaseUpdateData + { + public UpdateField QuestID = new UpdateField(0, 1); + public UpdateField StateFlags = new UpdateField(0, 2); + public UpdateField EndTime = new UpdateField(0, 3); + public UpdateField AcceptTime = new UpdateField(0, 4); + public UpdateFieldArray ObjectiveProgress = new UpdateFieldArray(24, 5, 6); + + public QuestLog() : base(30) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteUInt32(QuestID); + data.WriteUInt32(StateFlags); + data.WriteUInt32(EndTime); + data.WriteUInt32(AcceptTime); + for (int i = 0; i < 24; ++i) + { + data.WriteUInt16(ObjectiveProgress[i]); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 1); + if (_changesMask.GetBlock(0) != 0) + data.WriteBits(_changesMask.GetBlock(0), 32); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(QuestID); + } + if (_changesMask[2]) + { + data.WriteUInt32(StateFlags); + } + if (_changesMask[3]) + { + data.WriteUInt32(EndTime); + } + if (_changesMask[4]) + { + data.WriteUInt32(AcceptTime); + } + } + if (_changesMask[5]) + { + for (int i = 0; i < 24; ++i) + { + if (_changesMask[6 + i]) + { + data.WriteUInt16(ObjectiveProgress[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(QuestID); + ClearChangesMask(StateFlags); + ClearChangesMask(EndTime); + ClearChangesMask(AcceptTime); + ClearChangesMask(ObjectiveProgress); + _changesMask.ResetAll(); + } + } + + public class ArenaCooldown : BaseUpdateData + { + public UpdateField SpellID = new UpdateField(0, 1); + public UpdateField Charges = new UpdateField(0, 2); + public UpdateField Flags = new UpdateField(0, 3); + public UpdateField StartTime = new UpdateField(0, 4); + public UpdateField EndTime = new UpdateField(0, 5); + public UpdateField NextChargeTime = new UpdateField(0, 6); + public UpdateField MaxCharges = new UpdateField(0, 7); + + public ArenaCooldown() : base(8) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteInt32(SpellID); + data.WriteInt32(Charges); + data.WriteUInt32(Flags); + data.WriteUInt32(StartTime); + data.WriteUInt32(EndTime); + data.WriteUInt32(NextChargeTime); + data.WriteUInt8(MaxCharges); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 8); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteInt32(SpellID); + } + if (_changesMask[2]) + { + data.WriteInt32(Charges); + } + if (_changesMask[3]) + { + data.WriteUInt32(Flags); + } + if (_changesMask[4]) + { + data.WriteUInt32(StartTime); + } + if (_changesMask[5]) + { + data.WriteUInt32(EndTime); + } + if (_changesMask[6]) + { + data.WriteUInt32(NextChargeTime); + } + if (_changesMask[7]) + { + data.WriteUInt8(MaxCharges); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(SpellID); + ClearChangesMask(Charges); + ClearChangesMask(Flags); + ClearChangesMask(StartTime); + ClearChangesMask(EndTime); + ClearChangesMask(NextChargeTime); + ClearChangesMask(MaxCharges); + _changesMask.ResetAll(); + } + } + + public class PlayerData : BaseUpdateData + { + public DynamicUpdateField ArenaCooldowns = new DynamicUpdateField(0, 1); + public UpdateField DuelArbiter = new UpdateField(0, 2); + public UpdateField WowAccount = new UpdateField(0, 3); + public UpdateField LootTargetGUID = new UpdateField(0, 4); + public UpdateField PlayerFlags = new UpdateField(0, 5); + public UpdateField PlayerFlagsEx = new UpdateField(0, 6); + public UpdateField GuildRankID = new UpdateField(0, 7); + public UpdateField GuildDeleteDate = new UpdateField(0, 8); + public UpdateField GuildLevel = new UpdateField(0, 9); + public UpdateField SkinID = new UpdateField(0, 10); + public UpdateField FaceID = new UpdateField(0, 11); + public UpdateField HairStyleID = new UpdateField(0, 12); + public UpdateField HairColorID = new UpdateField(0, 13); + public UpdateField FacialHairStyleID = new UpdateField(0, 14); + public UpdateField PartyType = new UpdateField(0, 15); + public UpdateField NativeSex = new UpdateField(0, 16); + public UpdateField Inebriation = new UpdateField(0, 17); + public UpdateField PvpTitle = new UpdateField(0, 18); + public UpdateField ArenaFaction = new UpdateField(0, 19); + public UpdateField DuelTeam = new UpdateField(0, 20); + public UpdateField GuildTimeStamp = new UpdateField(0, 21); + public UpdateField PlayerTitle = new UpdateField(0, 22); + public UpdateField FakeInebriation = new UpdateField(0, 23); + public UpdateField VirtualPlayerRealm = new UpdateField(0, 24); + public UpdateField CurrentSpecID = new UpdateField(0, 25); + public UpdateField TaxiMountAnimKitID = new UpdateField(0, 26); + public UpdateField CurrentBattlePetBreedQuality = new UpdateField(0, 27); + public UpdateField HonorLevel = new UpdateField(0, 28); + public UpdateField Field_B0 = new UpdateField(0, 29); + public UpdateField Field_B4 = new UpdateField(0, 30); + public UpdateFieldArray CustomDisplayOption = new UpdateFieldArray(3, 31, 32); + public UpdateFieldArray QuestLog = new UpdateFieldArray(100, 35, 36); + public UpdateFieldArray VisibleItems = new UpdateFieldArray(19, 136, 137); + public UpdateFieldArray AvgItemLevel = new UpdateFieldArray(4, 156, 157); + + public PlayerData() : base(161) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { + data.WritePackedGuid(DuelArbiter); + data.WritePackedGuid(WowAccount); + data.WritePackedGuid(LootTargetGUID); + data.WriteUInt32(PlayerFlags); + data.WriteUInt32(PlayerFlagsEx); + data.WriteUInt32(GuildRankID); + data.WriteUInt32(GuildDeleteDate); + data.WriteUInt32(GuildLevel); + data.WriteUInt8(SkinID); + data.WriteUInt8(FaceID); + data.WriteUInt8(HairStyleID); + data.WriteUInt8(HairColorID); + for (int i = 0; i < 3; ++i) + { + data.WriteUInt8(CustomDisplayOption[i]); + } + data.WriteUInt8(FacialHairStyleID); + data.WriteUInt8(PartyType); + data.WriteUInt8(NativeSex); + data.WriteUInt8(Inebriation); + data.WriteUInt8(PvpTitle); + data.WriteUInt8(ArenaFaction); + data.WriteUInt32(DuelTeam); + data.WriteInt32(GuildTimeStamp); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) + { + for (int i = 0; i < 100; ++i) + { + QuestLog[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + } + for (int i = 0; i < 19; ++i) + { + VisibleItems[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + data.WriteUInt32(PlayerTitle); + data.WriteInt32(FakeInebriation); + data.WriteUInt32(VirtualPlayerRealm); + data.WriteUInt32(CurrentSpecID); + data.WriteInt32(TaxiMountAnimKitID); + for (int i = 0; i < 4; ++i) + { + data.WriteFloat(AvgItemLevel[i]); + } + data.WriteUInt8(CurrentBattlePetBreedQuality); + data.WriteUInt32(HonorLevel); + data.WriteInt32(ArenaCooldowns.Size()); + data.WriteInt32(Field_B0); + data.WriteInt32(Field_B4); + for (int i = 0; i < ArenaCooldowns.Size(); ++i) + { + ArenaCooldown arenaCooldown = ArenaCooldowns[i]; + arenaCooldown.WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + UpdateMask allowedMaskForTarget = new UpdateMask(161, new[] { 0xFFFFFFFFu, 0x00000007u, 0x00000000u, 0x00000000u, 0xFFFFFF00u, 0x00000001u }); + AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + WriteUpdate(data, _changesMask & allowedMaskForTarget, fieldVisibilityFlags, owner, receiver); + } + public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) + { + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) + allowedMaskForTarget |= new UpdateMask(161, new[] { 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x000000FFu, 0x00000000u }); + } + public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlocksMask(0), 6); + for (uint i = 0; i < 6; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + ArenaCooldowns.WriteUpdateMask(data); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + for (int i = 0; i < ArenaCooldowns.Size(); ++i) + { + if (ArenaCooldowns.HasChanged(i)) + { + ArenaCooldown arenaCooldown = ArenaCooldowns[i]; + arenaCooldown.WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[2]) + { + data.WritePackedGuid(DuelArbiter); + } + if (_changesMask[3]) + { + data.WritePackedGuid(WowAccount); + } + if (_changesMask[4]) + { + data.WritePackedGuid(LootTargetGUID); + } + if (_changesMask[5]) + { + data.WriteUInt32(PlayerFlags); + } + if (_changesMask[6]) + { + data.WriteUInt32(PlayerFlagsEx); + } + if (_changesMask[7]) + { + data.WriteUInt32(GuildRankID); + } + if (_changesMask[8]) + { + data.WriteUInt32(GuildDeleteDate); + } + if (_changesMask[9]) + { + data.WriteUInt32(GuildLevel); + } + if (_changesMask[10]) + { + data.WriteUInt8(SkinID); + } + if (_changesMask[11]) + { + data.WriteUInt8(FaceID); + } + if (_changesMask[12]) + { + data.WriteUInt8(HairStyleID); + } + if (_changesMask[13]) + { + data.WriteUInt8(HairColorID); + } + if (_changesMask[14]) + { + data.WriteUInt8(FacialHairStyleID); + } + if (_changesMask[15]) + { + data.WriteUInt8(PartyType); + } + if (_changesMask[16]) + { + data.WriteUInt8(NativeSex); + } + if (_changesMask[17]) + { + data.WriteUInt8(Inebriation); + } + if (_changesMask[18]) + { + data.WriteUInt8(PvpTitle); + } + if (_changesMask[19]) + { + data.WriteUInt8(ArenaFaction); + } + if (_changesMask[20]) + { + data.WriteUInt32(DuelTeam); + } + if (_changesMask[21]) + { + data.WriteInt32(GuildTimeStamp); + } + if (_changesMask[22]) + { + data.WriteUInt32(PlayerTitle); + } + if (_changesMask[23]) + { + data.WriteInt32(FakeInebriation); + } + if (_changesMask[24]) + { + data.WriteUInt32(VirtualPlayerRealm); + } + if (_changesMask[25]) + { + data.WriteUInt32(CurrentSpecID); + } + if (_changesMask[26]) + { + data.WriteInt32(TaxiMountAnimKitID); + } + if (_changesMask[27]) + { + data.WriteUInt8(CurrentBattlePetBreedQuality); + } + if (_changesMask[28]) + { + data.WriteUInt32(HonorLevel); + } + if (_changesMask[29]) + { + data.WriteInt32(Field_B0); + } + if (_changesMask[30]) + { + data.WriteInt32(Field_B4); + } + } + if (_changesMask[31]) + { + for (int i = 0; i < 3; ++i) + { + if (_changesMask[32 + i]) + { + data.WriteUInt8(CustomDisplayOption[i]); + } + } + } + if (_changesMask[35]) + { + for (int i = 0; i < 100; ++i) + { + if (_changesMask[36 + i]) + { + QuestLog[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[136]) + { + for (int i = 0; i < 19; ++i) + { + if (_changesMask[137 + i]) + { + VisibleItems[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[156]) + { + for (int i = 0; i < 4; ++i) + { + if (_changesMask[157 + i]) + { + data.WriteFloat(AvgItemLevel[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(ArenaCooldowns); + ClearChangesMask(DuelArbiter); + ClearChangesMask(WowAccount); + ClearChangesMask(LootTargetGUID); + ClearChangesMask(PlayerFlags); + ClearChangesMask(PlayerFlagsEx); + ClearChangesMask(GuildRankID); + ClearChangesMask(GuildDeleteDate); + ClearChangesMask(GuildLevel); + ClearChangesMask(SkinID); + ClearChangesMask(FaceID); + ClearChangesMask(HairStyleID); + ClearChangesMask(HairColorID); + ClearChangesMask(FacialHairStyleID); + ClearChangesMask(PartyType); + ClearChangesMask(NativeSex); + ClearChangesMask(Inebriation); + ClearChangesMask(PvpTitle); + ClearChangesMask(ArenaFaction); + ClearChangesMask(DuelTeam); + ClearChangesMask(GuildTimeStamp); + ClearChangesMask(PlayerTitle); + ClearChangesMask(FakeInebriation); + ClearChangesMask(VirtualPlayerRealm); + ClearChangesMask(CurrentSpecID); + ClearChangesMask(TaxiMountAnimKitID); + ClearChangesMask(CurrentBattlePetBreedQuality); + ClearChangesMask(HonorLevel); + ClearChangesMask(Field_B0); + ClearChangesMask(Field_B4); + ClearChangesMask(CustomDisplayOption); + ClearChangesMask(QuestLog); + ClearChangesMask(VisibleItems); + ClearChangesMask(AvgItemLevel); + _changesMask.ResetAll(); + } + } + + public class SkillInfo : BaseUpdateData + { + public UpdateFieldArray SkillLineID = new UpdateFieldArray(256, 0, 1); + public UpdateFieldArray SkillStep = new UpdateFieldArray(256, 0, 257); + public UpdateFieldArray SkillRank = new UpdateFieldArray(256, 0, 513); + public UpdateFieldArray SkillStartingRank = new UpdateFieldArray(256, 0, 769); + public UpdateFieldArray SkillMaxRank = new UpdateFieldArray(256, 0, 1025); + public UpdateFieldArray SkillTempBonus = new UpdateFieldArray(256, 0, 1281); + public UpdateFieldArray SkillPermBonus = new UpdateFieldArray(256, 0, 1537); + + public SkillInfo() : base(1793) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + for (int i = 0; i < 256; ++i) + { + data.WriteUInt16(SkillLineID[i]); + data.WriteUInt16(SkillStep[i]); + data.WriteUInt16(SkillRank[i]); + data.WriteUInt16(SkillStartingRank[i]); + data.WriteUInt16(SkillMaxRank[i]); + data.WriteUInt16(SkillTempBonus[i]); + data.WriteUInt16(SkillPermBonus[i]); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + for (uint i = 0; i < 1; ++i) + data.WriteUInt32(_changesMask.GetBlocksMask(i)); + data.WriteBits(_changesMask.GetBlocksMask(1), 25); + for (uint i = 0; i < 57; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + data.FlushBits(); + if (_changesMask[0]) + { + for (int i = 0; i < 256; ++i) + { + if (_changesMask[1 + i]) + { + data.WriteUInt16(SkillLineID[i]); + } + if (_changesMask[257 + i]) + { + data.WriteUInt16(SkillStep[i]); + } + if (_changesMask[513 + i]) + { + data.WriteUInt16(SkillRank[i]); + } + if (_changesMask[769 + i]) + { + data.WriteUInt16(SkillStartingRank[i]); + } + if (_changesMask[1025 + i]) + { + data.WriteUInt16(SkillMaxRank[i]); + } + if (_changesMask[1281 + i]) + { + data.WriteUInt16(SkillTempBonus[i]); + } + if (_changesMask[1537 + i]) + { + data.WriteUInt16(SkillPermBonus[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(SkillLineID); + ClearChangesMask(SkillStep); + ClearChangesMask(SkillRank); + ClearChangesMask(SkillStartingRank); + ClearChangesMask(SkillMaxRank); + ClearChangesMask(SkillTempBonus); + ClearChangesMask(SkillPermBonus); + _changesMask.ResetAll(); + } + } + + public class RestInfo : BaseUpdateData + { + public UpdateField Threshold = new UpdateField(0, 1); + public UpdateField StateID = new UpdateField(0, 2); + + public RestInfo() : base(3) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteUInt32(Threshold); + data.WriteUInt8(StateID); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(Threshold); + } + if (_changesMask[2]) + { + data.WriteUInt8(StateID); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Threshold); + ClearChangesMask(StateID); + _changesMask.ResetAll(); + } + } + + public class PVPInfo : BaseUpdateData + { + public UpdateField Field_0 = new UpdateField(0, 1); + public UpdateField Field_4 = new UpdateField(0, 2); + public UpdateField Field_8 = new UpdateField(0, 3); + public UpdateField Field_C = new UpdateField(0, 4); + public UpdateField Rating = new UpdateField(0, 5); + public UpdateField Field_14 = new UpdateField(0, 6); + public UpdateField Field_18 = new UpdateField(0, 7); + public UpdateField PvpTierID = new UpdateField(0, 8); + public UpdateField Field_20 = new UpdateField(0, 9); + + public PVPInfo() : base(10) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteUInt32(Field_0); + data.WriteUInt32(Field_4); + data.WriteUInt32(Field_8); + data.WriteUInt32(Field_C); + data.WriteUInt32(Rating); + data.WriteUInt32(Field_14); + data.WriteUInt32(Field_18); + data.WriteUInt32(PvpTierID); + data.WriteBits((uint)Field_20, 1); + data.FlushBits(); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 10); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(Field_0); + } + if (_changesMask[2]) + { + data.WriteUInt32(Field_4); + } + if (_changesMask[3]) + { + data.WriteUInt32(Field_8); + } + if (_changesMask[4]) + { + data.WriteUInt32(Field_C); + } + if (_changesMask[5]) + { + data.WriteUInt32(Rating); + } + if (_changesMask[6]) + { + data.WriteUInt32(Field_14); + } + if (_changesMask[7]) + { + data.WriteUInt32(Field_18); + } + if (_changesMask[8]) + { + data.WriteUInt32(PvpTierID); + } + if (_changesMask[9]) + { + data.WriteBits(Field_20, 1); + } + } + data.FlushBits(); + } + + public override void ClearChangesMask() + { + ClearChangesMask(Field_0); + ClearChangesMask(Field_4); + ClearChangesMask(Field_8); + ClearChangesMask(Field_C); + ClearChangesMask(Rating); + ClearChangesMask(Field_14); + ClearChangesMask(Field_18); + ClearChangesMask(PvpTierID); + ClearChangesMask(Field_20); + _changesMask.ResetAll(); + } + } + + public class CharacterRestriction + { + public int Field_0; + public int Field_4; + public int Field_8; + public uint Type; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteInt32(Field_0); + data.WriteInt32(Field_4); + data.WriteInt32(Field_8); + data.WriteBits(Type, 5); + data.FlushBits(); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.FlushBits(); + data.WriteInt32(Field_0); + data.WriteInt32(Field_4); + data.WriteInt32(Field_8); + data.WriteBits(Type, 5); + data.FlushBits(); + } + } + + public class SpellPctModByLabel + { + public int ModIndex; + public float ModifierValue; + public int LabelID; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteInt32(ModIndex); + data.WriteFloat(ModifierValue); + data.WriteInt32(LabelID); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.FlushBits(); + data.WriteInt32(ModIndex); + data.WriteFloat(ModifierValue); + data.WriteInt32(LabelID); + } + } + + public class SpellFlatModByLabel + { + public int ModIndex; + public int ModifierValue; + public int LabelID; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteInt32(ModIndex); + data.WriteInt32(ModifierValue); + data.WriteInt32(LabelID); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.FlushBits(); + data.WriteInt32(ModIndex); + data.WriteInt32(ModifierValue); + data.WriteInt32(LabelID); + } + } + + public class Research + { + public short ResearchProjectID; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.WriteInt16(ResearchProjectID); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + data.FlushBits(); + data.WriteInt16(ResearchProjectID); + } + } + + public class ActivePlayerData : BaseUpdateData + { + public UpdateField BackpackAutoSortDisabled = new UpdateField(0, 1); + public UpdateField BankAutoSortDisabled = new UpdateField(0, 2); + public UpdateField SortBagsRightToLeft = new UpdateField(0, 3); + public UpdateField InsertItemsLeftToRight = new UpdateField(0, 4); + public UpdateFieldArray> Research = new UpdateFieldArray>(1, 20, 21);//-1-1 + public DynamicUpdateField KnownTitles = new DynamicUpdateField(0, 5); + public DynamicUpdateField ResearchSites = new DynamicUpdateField(0, 6); + public DynamicUpdateField ResearchSiteProgress = new DynamicUpdateField(0, 7); + public DynamicUpdateField DailyQuestsCompleted = new DynamicUpdateField(0, 8); + public DynamicUpdateField AvailableQuestLineXQuestIDs = new DynamicUpdateField(0, 9); + public DynamicUpdateField Heirlooms = new DynamicUpdateField(0, 10); + public DynamicUpdateField HeirloomFlags = new DynamicUpdateField(0, 11); + public DynamicUpdateField Toys = new DynamicUpdateField(0, 12); + public DynamicUpdateField ToyFlags = new DynamicUpdateField(0, 13); + public DynamicUpdateField Transmog = new DynamicUpdateField(0, 14); + public DynamicUpdateField ConditionalTransmog = new DynamicUpdateField(0, 15); + public DynamicUpdateField SelfResSpells = new DynamicUpdateField(0, 16); + public DynamicUpdateField SpellPctModByLabel = new DynamicUpdateField(0, 17); + public DynamicUpdateField SpellFlatModByLabel = new DynamicUpdateField(0, 18); + public DynamicUpdateField CharacterRestrictions = new DynamicUpdateField(0, 19); + public UpdateField FarsightObject = new UpdateField(0, 22); + public UpdateField SummonedBattlePetGUID = new UpdateField(0, 23); + public UpdateField Coinage = new UpdateField(0, 24); + public UpdateField XP = new UpdateField(0, 25); + public UpdateField NextLevelXP = new UpdateField(0, 26); + public UpdateField TrialXP = new UpdateField(0, 27); + public UpdateField Skill = new UpdateField(0, 28); + public UpdateField CharacterPoints = new UpdateField(0, 29); + public UpdateField MaxTalentTiers = new UpdateField(0, 30); + public UpdateField TrackCreatureMask = new UpdateField(0, 31); + public UpdateField MainhandExpertise = new UpdateField(0, 32); + public UpdateField OffhandExpertise = new UpdateField(0, 33); + public UpdateField RangedExpertise = new UpdateField(34, 35); + public UpdateField CombatRatingExpertise = new UpdateField(34, 36); + public UpdateField BlockPercentage = new UpdateField(34, 37); + public UpdateField DodgePercentage = new UpdateField(34, 38); + public UpdateField DodgePercentageFromAttribute = new UpdateField(34, 39); + public UpdateField ParryPercentage = new UpdateField(34, 40); + public UpdateField ParryPercentageFromAttribute = new UpdateField(34, 41); + public UpdateField CritPercentage = new UpdateField(34, 42); + public UpdateField RangedCritPercentage = new UpdateField(34, 43); + public UpdateField OffhandCritPercentage = new UpdateField(34, 44); + public UpdateField SpellCritPercentage = new UpdateField(34, 45); + public UpdateField ShieldBlock = new UpdateField(34, 46); + public UpdateField ShieldBlockCritPercentage = new UpdateField(34, 47); + public UpdateField Mastery = new UpdateField(34, 48); + public UpdateField Speed = new UpdateField(34, 49); + public UpdateField Avoidance = new UpdateField(34, 50); + public UpdateField Sturdiness = new UpdateField(34, 51); + public UpdateField Versatility = new UpdateField(34, 52); + public UpdateField VersatilityBonus = new UpdateField(34, 53); + public UpdateField PvpPowerDamage = new UpdateField(34, 54); + public UpdateField PvpPowerHealing = new UpdateField(34, 55); + public UpdateField ModHealingDonePos = new UpdateField(34, 56); + public UpdateField ModHealingPercent = new UpdateField(34, 57); + public UpdateField ModHealingDonePercent = new UpdateField(34, 58); + public UpdateField ModPeriodicHealingDonePercent = new UpdateField(34, 59); + public UpdateField ModSpellPowerPercent = new UpdateField(34, 60); + public UpdateField ModResiliencePercent = new UpdateField(34, 61); + public UpdateField OverrideSpellPowerByAPPercent = new UpdateField(34, 62); + public UpdateField OverrideAPBySpellPowerPercent = new UpdateField(34, 63); + public UpdateField ModTargetResistance = new UpdateField(34, 64); + public UpdateField ModTargetPhysicalResistance = new UpdateField(34, 65); + public UpdateField LocalFlags = new UpdateField(66, 67); + public UpdateField GrantableLevels = new UpdateField(66, 68); + public UpdateField MultiActionBars = new UpdateField(66, 69); + public UpdateField LifetimeMaxRank = new UpdateField(66, 70); + public UpdateField NumRespecs = new UpdateField(66, 71); + public UpdateField PvpMedals = new UpdateField(66, 72); + public UpdateField TodayHonorableKills = new UpdateField(66, 73); + public UpdateField YesterdayHonorableKills = new UpdateField(66, 74); + public UpdateField LifetimeHonorableKills = new UpdateField(66, 75); + public UpdateField WatchedFactionIndex = new UpdateField(66, 76); + public UpdateField MaxLevel = new UpdateField(66, 77); + public UpdateField ScalingPlayerLevelDelta = new UpdateField(66, 78); + public UpdateField MaxCreatureScalingLevel = new UpdateField(66, 79); + public UpdateField PetSpellPower = new UpdateField(66, 80); + public UpdateField UiHitModifier = new UpdateField(66, 81); + public UpdateField UiSpellHitModifier = new UpdateField(66, 82); + public UpdateField HomeRealmTimeOffset = new UpdateField(66, 83); + public UpdateField ModPetHaste = new UpdateField(66, 84); + public UpdateField LocalRegenFlags = new UpdateField(66, 85); + public UpdateField AuraVision = new UpdateField(66, 86); + public UpdateField NumBackpackSlots = new UpdateField(66, 87); + public UpdateField OverrideSpellsID = new UpdateField(66, 88); + public UpdateField LfgBonusFactionID = new UpdateField(66, 89); + public UpdateField LootSpecID = new UpdateField(66, 90); + public UpdateField OverrideZonePVPType = new UpdateField(66, 91); + public UpdateField Honor = new UpdateField(66, 92); + public UpdateField HonorNextLevel = new UpdateField(66, 93); + public UpdateField PvpRewardAchieved = new UpdateField(66, 94); + public UpdateField PvpTierMaxFromWins = new UpdateField(66, 95); + public UpdateField PvpLastWeeksRewardAchieved = new UpdateField(66, 96); + public UpdateField PvpLastWeeksTierMaxFromWins = new UpdateField(66, 97); + public UpdateField PvpLastWeeksRewardClaimed = new UpdateField(98, 99); + public UpdateField NumBankSlots = new UpdateField(98, 100); + public UpdateFieldArray InvSlots = new UpdateFieldArray(195, 101, 102); + public UpdateFieldArray TrackResourceMask = new UpdateFieldArray(2, 297, 298); + public UpdateFieldArray ExploredZones = new UpdateFieldArray(192, 300, 301); + public UpdateFieldArray RestInfo = new UpdateFieldArray(2, 493, 494); + public UpdateFieldArray ModDamageDonePos = new UpdateFieldArray(7, 496, 497); + public UpdateFieldArray ModDamageDoneNeg = new UpdateFieldArray(7, 496, 504); + public UpdateFieldArray ModDamageDonePercent = new UpdateFieldArray(7, 496, 511); + public UpdateFieldArray WeaponDmgMultipliers = new UpdateFieldArray(3, 518, 519); + public UpdateFieldArray WeaponAtkSpeedMultipliers = new UpdateFieldArray(3, 518, 522); + public UpdateFieldArray BuybackPrice = new UpdateFieldArray(12, 525, 526); + public UpdateFieldArray BuybackTimestamp = new UpdateFieldArray(12, 525, 538); + public UpdateFieldArray CombatRatings = new UpdateFieldArray(32, 550, 551); + public UpdateFieldArray PvpInfo = new UpdateFieldArray(6, 583, 584); + public UpdateFieldArray NoReagentCostMask = new UpdateFieldArray(4, 590, 591); + public UpdateFieldArray ProfessionSkillLine = new UpdateFieldArray(2, 595, 596); + public UpdateFieldArray BagSlotFlags = new UpdateFieldArray(4, 598, 599); + public UpdateFieldArray BankBagSlotFlags = new UpdateFieldArray(7, 603, 604); + public UpdateFieldArray QuestCompleted = new UpdateFieldArray(875, 611, 612); + + public ActivePlayerData() : base(1487) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + for (int i = 0; i < 195; ++i) + { + data.WritePackedGuid(InvSlots[i]); + } + data.WritePackedGuid(FarsightObject); + data.WritePackedGuid(SummonedBattlePetGUID); + data.WriteInt32(KnownTitles.Size()); + data.WriteUInt64(Coinage); + data.WriteUInt32(XP); + data.WriteUInt32(NextLevelXP); + data.WriteInt32(TrialXP); + ((SkillInfo)Skill).WriteCreate(data, fieldVisibilityFlags, owner, receiver); + data.WriteUInt32(CharacterPoints); + data.WriteUInt32(MaxTalentTiers); + data.WriteUInt32(TrackCreatureMask); + for (int i = 0; i < 2; ++i) + { + data.WriteUInt32(TrackResourceMask[i]); + } + data.WriteFloat(MainhandExpertise); + data.WriteFloat(OffhandExpertise); + data.WriteFloat(RangedExpertise); + data.WriteFloat(CombatRatingExpertise); + data.WriteFloat(BlockPercentage); + data.WriteFloat(DodgePercentage); + data.WriteFloat(DodgePercentageFromAttribute); + data.WriteFloat(ParryPercentage); + data.WriteFloat(ParryPercentageFromAttribute); + data.WriteFloat(CritPercentage); + data.WriteFloat(RangedCritPercentage); + data.WriteFloat(OffhandCritPercentage); + data.WriteFloat(SpellCritPercentage); + data.WriteUInt32(ShieldBlock); + data.WriteFloat(ShieldBlockCritPercentage); + data.WriteFloat(Mastery); + data.WriteFloat(Speed); + data.WriteFloat(Avoidance); + data.WriteFloat(Sturdiness); + data.WriteInt32(Versatility); + data.WriteFloat(VersatilityBonus); + data.WriteFloat(PvpPowerDamage); + data.WriteFloat(PvpPowerHealing); + for (int i = 0; i < 192; ++i) + { + data.WriteUInt64(ExploredZones[i]); + } + for (int i = 0; i < 2; ++i) + { + RestInfo[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + for (int i = 0; i < 7; ++i) + { + data.WriteInt32(ModDamageDonePos[i]); + data.WriteInt32(ModDamageDoneNeg[i]); + data.WriteFloat(ModDamageDonePercent[i]); + } + data.WriteInt32(ModHealingDonePos); + data.WriteFloat(ModHealingPercent); + data.WriteFloat(ModHealingDonePercent); + data.WriteFloat(ModPeriodicHealingDonePercent); + for (int i = 0; i < 3; ++i) + { + data.WriteFloat(WeaponDmgMultipliers[i]); + data.WriteFloat(WeaponAtkSpeedMultipliers[i]); + } + data.WriteFloat(ModSpellPowerPercent); + data.WriteFloat(ModResiliencePercent); + data.WriteFloat(OverrideSpellPowerByAPPercent); + data.WriteFloat(OverrideAPBySpellPowerPercent); + data.WriteInt32(ModTargetResistance); + data.WriteInt32(ModTargetPhysicalResistance); + data.WriteInt32(LocalFlags); + data.WriteUInt8(GrantableLevels); + data.WriteUInt8(MultiActionBars); + data.WriteUInt8(LifetimeMaxRank); + data.WriteUInt8(NumRespecs); + data.WriteUInt32(PvpMedals); + for (int i = 0; i < 12; ++i) + { + data.WriteUInt32(BuybackPrice[i]); + data.WriteUInt32(BuybackTimestamp[i]); + } + data.WriteUInt16(TodayHonorableKills); + data.WriteUInt16(YesterdayHonorableKills); + data.WriteUInt32(LifetimeHonorableKills); + data.WriteInt32(WatchedFactionIndex); + for (int i = 0; i < 32; ++i) + { + data.WriteUInt32(CombatRatings[i]); + } + data.WriteInt32(MaxLevel); + data.WriteInt32(ScalingPlayerLevelDelta); + data.WriteInt32(MaxCreatureScalingLevel); + for (int i = 0; i < 4; ++i) + { + data.WriteUInt32(NoReagentCostMask[i]); + } + data.WriteUInt32(PetSpellPower); + for (int i = 0; i < 2; ++i) + { + data.WriteUInt32(ProfessionSkillLine[i]); + } + data.WriteFloat(UiHitModifier); + data.WriteFloat(UiSpellHitModifier); + data.WriteInt32(HomeRealmTimeOffset); + data.WriteFloat(ModPetHaste); + data.WriteUInt8(LocalRegenFlags); + data.WriteUInt8(AuraVision); + data.WriteUInt8(NumBackpackSlots); + data.WriteUInt32(OverrideSpellsID); + data.WriteInt32(LfgBonusFactionID); + data.WriteUInt16(LootSpecID); + data.WriteUInt32(OverrideZonePVPType); + for (int i = 0; i < 4; ++i) + { + data.WriteUInt32(BagSlotFlags[i]); + } + for (int i = 0; i < 7; ++i) + { + data.WriteUInt32(BankBagSlotFlags[i]); + } + for (int i = 0; i < 875; ++i) + { + data.WriteUInt64(QuestCompleted[i]); + } + data.WriteUInt32(Honor); + data.WriteUInt32(HonorNextLevel); + data.WriteInt32(PvpRewardAchieved); + data.WriteInt32(PvpTierMaxFromWins); + data.WriteInt32(PvpLastWeeksRewardAchieved); + data.WriteInt32(PvpLastWeeksTierMaxFromWins); + data.WriteInt32(PvpLastWeeksRewardClaimed); + data.WriteUInt8(NumBankSlots); + data.WriteInt32(ResearchSites.Size()); + data.WriteInt32(ResearchSiteProgress.Size()); + data.WriteInt32(DailyQuestsCompleted.Size()); + data.WriteInt32(AvailableQuestLineXQuestIDs.Size()); + data.WriteInt32(Heirlooms.Size()); + data.WriteInt32(HeirloomFlags.Size()); + data.WriteInt32(Toys.Size()); + data.WriteInt32(ToyFlags.Size()); + data.WriteInt32(Transmog.Size()); + data.WriteInt32(ConditionalTransmog.Size()); + data.WriteInt32(SelfResSpells.Size()); + data.WriteInt32(CharacterRestrictions.Size()); + data.WriteInt32(SpellPctModByLabel.Size()); + data.WriteInt32(SpellFlatModByLabel.Size()); + for (int i = 0; i < 1; ++i) + { + data.WriteInt32(Research[i].Size()); + for (int j = 0; j < Research[i].Size(); ++j) + { + Research[i][j].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + } + for (int i = 0; i < KnownTitles.Size(); ++i) + { + data.WriteUInt64(KnownTitles[i]); + } + for (int i = 0; i < ResearchSites.Size(); ++i) + { + data.WriteUInt16(ResearchSites[i]); + } + for (int i = 0; i < ResearchSiteProgress.Size(); ++i) + { + data.WriteUInt32(ResearchSiteProgress[i]); + } + for (int i = 0; i < DailyQuestsCompleted.Size(); ++i) + { + data.WriteUInt32(DailyQuestsCompleted[i]); + } + for (int i = 0; i < AvailableQuestLineXQuestIDs.Size(); ++i) + { + data.WriteInt32(AvailableQuestLineXQuestIDs[i]); + } + for (int i = 0; i < Heirlooms.Size(); ++i) + { + data.WriteUInt32(Heirlooms[i]); + } + for (int i = 0; i < HeirloomFlags.Size(); ++i) + { + data.WriteUInt32(HeirloomFlags[i]); + } + for (int i = 0; i < Toys.Size(); ++i) + { + data.WriteUInt32(Toys[i]); + } + for (int i = 0; i < ToyFlags.Size(); ++i) + { + data.WriteUInt32(ToyFlags[i]); + } + for (int i = 0; i < Transmog.Size(); ++i) + { + data.WriteUInt32(Transmog[i]); + } + for (int i = 0; i < ConditionalTransmog.Size(); ++i) + { + data.WriteUInt32(ConditionalTransmog[i]); + } + for (int i = 0; i < SelfResSpells.Size(); ++i) + { + data.WriteUInt32(SelfResSpells[i]); + } + for (int i = 0; i < SpellPctModByLabel.Size(); ++i) + { + SpellPctModByLabel[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + for (int i = 0; i < SpellFlatModByLabel.Size(); ++i) + { + SpellFlatModByLabel[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + for (int i = 0; i < 6; ++i) + { + PvpInfo[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + data.WriteBit((bool)BackpackAutoSortDisabled); + data.WriteBit((bool)BankAutoSortDisabled); + data.WriteBit((bool)SortBagsRightToLeft); + data.WriteBit((bool)InsertItemsLeftToRight); + for (int i = 0; i < CharacterRestrictions.Size(); ++i) + { + CharacterRestrictions[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + data.FlushBits(); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + for (uint i = 0; i < 1; ++i) + data.WriteUInt32(_changesMask.GetBlocksMask(i)); + data.WriteBits(_changesMask.GetBlocksMask(1), 15); + for (uint i = 0; i < 47; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteBit(BackpackAutoSortDisabled); + } + if (_changesMask[2]) + { + data.WriteBit(BankAutoSortDisabled); + } + if (_changesMask[3]) + { + data.WriteBit(SortBagsRightToLeft); + } + if (_changesMask[4]) + { + data.WriteBit(InsertItemsLeftToRight); + } + if (_changesMask[5]) + { + KnownTitles.WriteUpdateMask(data); + } + if (_changesMask[6]) + { + ResearchSites.WriteUpdateMask(data); + } + if (_changesMask[7]) + { + ResearchSiteProgress.WriteUpdateMask(data); + } + if (_changesMask[8]) + { + DailyQuestsCompleted.WriteUpdateMask(data); + } + if (_changesMask[9]) + { + AvailableQuestLineXQuestIDs.WriteUpdateMask(data); + } + if (_changesMask[10]) + { + Heirlooms.WriteUpdateMask(data); + } + if (_changesMask[11]) + { + HeirloomFlags.WriteUpdateMask(data); + } + if (_changesMask[12]) + { + Toys.WriteUpdateMask(data); + } + if (_changesMask[13]) + { + ToyFlags.WriteUpdateMask(data); + } + if (_changesMask[14]) + { + Transmog.WriteUpdateMask(data); + } + if (_changesMask[15]) + { + ConditionalTransmog.WriteUpdateMask(data); + } + if (_changesMask[16]) + { + SelfResSpells.WriteUpdateMask(data); + } + if (_changesMask[17]) + { + SpellPctModByLabel.WriteUpdateMask(data); + } + if (_changesMask[18]) + { + SpellFlatModByLabel.WriteUpdateMask(data); + } + if (_changesMask[19]) + { + CharacterRestrictions.WriteUpdateMask(data); + } + } + if (_changesMask[20]) + { + for (int i = 0; i < 1; ++i) + { + if (_changesMask[21 + i]) + { + Research[i].WriteUpdateMask(data); + } + } + } + data.FlushBits(); + if (_changesMask[20]) + { + for (int i = 0; i < 1; ++i) + { + if (_changesMask[21 + i]) + { + for (int j = 0; j < Research[i].Size(); ++j) + { + if (Research[i].HasChanged(j)) + { + Research[i][j].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + } + } + if (_changesMask[0]) + { + if (_changesMask[5]) + { + for (int i = 0; i < KnownTitles.Size(); ++i) + { + if (KnownTitles.HasChanged(i)) + { + data.WriteUInt64(KnownTitles[i]); + } + } + } + if (_changesMask[6]) + { + for (int i = 0; i < ResearchSites.Size(); ++i) + { + if (ResearchSites.HasChanged(i)) + { + data.WriteUInt16(ResearchSites[i]); + } + } + } + if (_changesMask[7]) + { + for (int i = 0; i < ResearchSiteProgress.Size(); ++i) + { + if (ResearchSiteProgress.HasChanged(i)) + { + data.WriteUInt32(ResearchSiteProgress[i]); + } + } + } + if (_changesMask[8]) + { + for (int i = 0; i < DailyQuestsCompleted.Size(); ++i) + { + if (DailyQuestsCompleted.HasChanged(i)) + { + data.WriteUInt32(DailyQuestsCompleted[i]); + } + } + } + if (_changesMask[9]) + { + for (int i = 0; i < AvailableQuestLineXQuestIDs.Size(); ++i) + { + if (AvailableQuestLineXQuestIDs.HasChanged(i)) + { + data.WriteInt32(AvailableQuestLineXQuestIDs[i]); + } + } + } + if (_changesMask[10]) + { + for (int i = 0; i < Heirlooms.Size(); ++i) + { + if (Heirlooms.HasChanged(i)) + { + data.WriteUInt32(Heirlooms[i]); + } + } + } + if (_changesMask[11]) + { + for (int i = 0; i < HeirloomFlags.Size(); ++i) + { + if (HeirloomFlags.HasChanged(i)) + { + data.WriteUInt32(HeirloomFlags[i]); + } + } + } + if (_changesMask[12]) + { + for (int i = 0; i < Toys.Size(); ++i) + { + if (Toys.HasChanged(i)) + { + data.WriteUInt32(Toys[i]); + } + } + } + if (_changesMask[13]) + { + for (int i = 0; i < ToyFlags.Size(); ++i) + { + if (ToyFlags.HasChanged(i)) + { + data.WriteUInt32(ToyFlags[i]); + } + } + } + if (_changesMask[14]) + { + for (int i = 0; i < Transmog.Size(); ++i) + { + if (Transmog.HasChanged(i)) + { + data.WriteUInt32(Transmog[i]); + } + } + } + if (_changesMask[15]) + { + for (int i = 0; i < ConditionalTransmog.Size(); ++i) + { + if (ConditionalTransmog.HasChanged(i)) + { + data.WriteUInt32(ConditionalTransmog[i]); + } + } + } + if (_changesMask[16]) + { + for (int i = 0; i < SelfResSpells.Size(); ++i) + { + if (SelfResSpells.HasChanged(i)) + { + data.WriteUInt32(SelfResSpells[i]); + } + } + } + if (_changesMask[17]) + { + for (int i = 0; i < SpellPctModByLabel.Size(); ++i) + { + if (SpellPctModByLabel.HasChanged(i)) + { + SpellPctModByLabel[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[18]) + { + for (int i = 0; i < SpellFlatModByLabel.Size(); ++i) + { + if (SpellFlatModByLabel.HasChanged(i)) + { + SpellFlatModByLabel[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[19]) + { + for (int i = 0; i < CharacterRestrictions.Size(); ++i) + { + if (CharacterRestrictions.HasChanged(i)) + { + CharacterRestrictions[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[22]) + { + data.WritePackedGuid(FarsightObject); + } + if (_changesMask[23]) + { + data.WritePackedGuid(SummonedBattlePetGUID); + } + if (_changesMask[24]) + { + data.WriteUInt64(Coinage); + } + if (_changesMask[25]) + { + data.WriteUInt32(XP); + } + if (_changesMask[26]) + { + data.WriteUInt32(NextLevelXP); + } + if (_changesMask[27]) + { + data.WriteInt32(TrialXP); + } + if (_changesMask[28]) + { + ((SkillInfo)Skill).WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + if (_changesMask[29]) + { + data.WriteUInt32(CharacterPoints); + } + if (_changesMask[30]) + { + data.WriteUInt32(MaxTalentTiers); + } + if (_changesMask[31]) + { + data.WriteUInt32(TrackCreatureMask); + } + if (_changesMask[32]) + { + data.WriteFloat(MainhandExpertise); + } + if (_changesMask[33]) + { + data.WriteFloat(OffhandExpertise); + } + } + if (_changesMask[34]) + { + if (_changesMask[35]) + { + data.WriteFloat(RangedExpertise); + } + if (_changesMask[36]) + { + data.WriteFloat(CombatRatingExpertise); + } + if (_changesMask[37]) + { + data.WriteFloat(BlockPercentage); + } + if (_changesMask[38]) + { + data.WriteFloat(DodgePercentage); + } + if (_changesMask[39]) + { + data.WriteFloat(DodgePercentageFromAttribute); + } + if (_changesMask[40]) + { + data.WriteFloat(ParryPercentage); + } + if (_changesMask[41]) + { + data.WriteFloat(ParryPercentageFromAttribute); + } + if (_changesMask[42]) + { + data.WriteFloat(CritPercentage); + } + if (_changesMask[43]) + { + data.WriteFloat(RangedCritPercentage); + } + if (_changesMask[44]) + { + data.WriteFloat(OffhandCritPercentage); + } + if (_changesMask[45]) + { + data.WriteFloat(SpellCritPercentage); + } + if (_changesMask[46]) + { + data.WriteUInt32(ShieldBlock); + } + if (_changesMask[47]) + { + data.WriteFloat(ShieldBlockCritPercentage); + } + if (_changesMask[48]) + { + data.WriteFloat(Mastery); + } + if (_changesMask[49]) + { + data.WriteFloat(Speed); + } + if (_changesMask[50]) + { + data.WriteFloat(Avoidance); + } + if (_changesMask[51]) + { + data.WriteFloat(Sturdiness); + } + if (_changesMask[52]) + { + data.WriteInt32(Versatility); + } + if (_changesMask[53]) + { + data.WriteFloat(VersatilityBonus); + } + if (_changesMask[54]) + { + data.WriteFloat(PvpPowerDamage); + } + if (_changesMask[55]) + { + data.WriteFloat(PvpPowerHealing); + } + if (_changesMask[56]) + { + data.WriteInt32(ModHealingDonePos); + } + if (_changesMask[57]) + { + data.WriteFloat(ModHealingPercent); + } + if (_changesMask[58]) + { + data.WriteFloat(ModHealingDonePercent); + } + if (_changesMask[59]) + { + data.WriteFloat(ModPeriodicHealingDonePercent); + } + if (_changesMask[60]) + { + data.WriteFloat(ModSpellPowerPercent); + } + if (_changesMask[61]) + { + data.WriteFloat(ModResiliencePercent); + } + if (_changesMask[62]) + { + data.WriteFloat(OverrideSpellPowerByAPPercent); + } + if (_changesMask[63]) + { + data.WriteFloat(OverrideAPBySpellPowerPercent); + } + if (_changesMask[64]) + { + data.WriteInt32(ModTargetResistance); + } + if (_changesMask[65]) + { + data.WriteInt32(ModTargetPhysicalResistance); + } + } + if (_changesMask[66]) + { + if (_changesMask[67]) + { + data.WriteInt32(LocalFlags); + } + if (_changesMask[68]) + { + data.WriteUInt8(GrantableLevels); + } + if (_changesMask[69]) + { + data.WriteUInt8(MultiActionBars); + } + if (_changesMask[70]) + { + data.WriteUInt8(LifetimeMaxRank); + } + if (_changesMask[71]) + { + data.WriteUInt8(NumRespecs); + } + if (_changesMask[72]) + { + data.WriteUInt32(PvpMedals); + } + if (_changesMask[73]) + { + data.WriteUInt16(TodayHonorableKills); + } + if (_changesMask[74]) + { + data.WriteUInt16(YesterdayHonorableKills); + } + if (_changesMask[75]) + { + data.WriteUInt32(LifetimeHonorableKills); + } + if (_changesMask[76]) + { + data.WriteInt32(WatchedFactionIndex); + } + if (_changesMask[77]) + { + data.WriteInt32(MaxLevel); + } + if (_changesMask[78]) + { + data.WriteInt32(ScalingPlayerLevelDelta); + } + if (_changesMask[79]) + { + data.WriteInt32(MaxCreatureScalingLevel); + } + if (_changesMask[80]) + { + data.WriteUInt32(PetSpellPower); + } + if (_changesMask[81]) + { + data.WriteFloat(UiHitModifier); + } + if (_changesMask[82]) + { + data.WriteFloat(UiSpellHitModifier); + } + if (_changesMask[83]) + { + data.WriteInt32(HomeRealmTimeOffset); + } + if (_changesMask[84]) + { + data.WriteFloat(ModPetHaste); + } + if (_changesMask[85]) + { + data.WriteUInt8(LocalRegenFlags); + } + if (_changesMask[86]) + { + data.WriteUInt8(AuraVision); + } + if (_changesMask[87]) + { + data.WriteUInt8(NumBackpackSlots); + } + if (_changesMask[88]) + { + data.WriteUInt32(OverrideSpellsID); + } + if (_changesMask[89]) + { + data.WriteInt32(LfgBonusFactionID); + } + if (_changesMask[90]) + { + data.WriteUInt16(LootSpecID); + } + if (_changesMask[91]) + { + data.WriteUInt32(OverrideZonePVPType); + } + if (_changesMask[92]) + { + data.WriteUInt32(Honor); + } + if (_changesMask[93]) + { + data.WriteUInt32(HonorNextLevel); + } + if (_changesMask[94]) + { + data.WriteInt32(PvpRewardAchieved); + } + if (_changesMask[95]) + { + data.WriteInt32(PvpTierMaxFromWins); + } + if (_changesMask[96]) + { + data.WriteInt32(PvpLastWeeksRewardAchieved); + } + if (_changesMask[97]) + { + data.WriteInt32(PvpLastWeeksTierMaxFromWins); + } + } + if (_changesMask[98]) + { + if (_changesMask[99]) + { + data.WriteInt32(PvpLastWeeksRewardClaimed); + } + if (_changesMask[100]) + { + data.WriteUInt8(NumBankSlots); + } + } + if (_changesMask[101]) + { + for (int i = 0; i < 195; ++i) + { + if (_changesMask[102 + i]) + { + data.WritePackedGuid(InvSlots[i]); + } + } + } + if (_changesMask[297]) + { + for (int i = 0; i < 2; ++i) + { + if (_changesMask[298 + i]) + { + data.WriteUInt32(TrackResourceMask[i]); + } + } + } + if (_changesMask[300]) + { + for (int i = 0; i < 192; ++i) + { + if (_changesMask[301 + i]) + { + data.WriteUInt64(ExploredZones[i]); + } + } + } + if (_changesMask[493]) + { + for (int i = 0; i < 2; ++i) + { + if (_changesMask[494 + i]) + { + RestInfo[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[496]) + { + for (int i = 0; i < 7; ++i) + { + if (_changesMask[497 + i]) + { + data.WriteInt32(ModDamageDonePos[i]); + } + if (_changesMask[504 + i]) + { + data.WriteInt32(ModDamageDoneNeg[i]); + } + if (_changesMask[511 + i]) + { + data.WriteFloat(ModDamageDonePercent[i]); + } + } + } + if (_changesMask[518]) + { + for (int i = 0; i < 3; ++i) + { + if (_changesMask[519 + i]) + { + data.WriteFloat(WeaponDmgMultipliers[i]); + } + if (_changesMask[522 + i]) + { + data.WriteFloat(WeaponAtkSpeedMultipliers[i]); + } + } + } + if (_changesMask[525]) + { + for (int i = 0; i < 12; ++i) + { + if (_changesMask[526 + i]) + { + data.WriteUInt32(BuybackPrice[i]); + } + if (_changesMask[538 + i]) + { + data.WriteUInt32(BuybackTimestamp[i]); + } + } + } + if (_changesMask[550]) + { + for (int i = 0; i < 32; ++i) + { + if (_changesMask[551 + i]) + { + data.WriteUInt32(CombatRatings[i]); + } + } + } + if (_changesMask[590]) + { + for (int i = 0; i < 4; ++i) + { + if (_changesMask[591 + i]) + { + data.WriteUInt32(NoReagentCostMask[i]); + } + } + } + if (_changesMask[595]) + { + for (int i = 0; i < 2; ++i) + { + if (_changesMask[596 + i]) + { + data.WriteUInt32(ProfessionSkillLine[i]); + } + } + } + if (_changesMask[598]) + { + for (int i = 0; i < 4; ++i) + { + if (_changesMask[599 + i]) + { + data.WriteUInt32(BagSlotFlags[i]); + } + } + } + if (_changesMask[603]) + { + for (int i = 0; i < 7; ++i) + { + if (_changesMask[604 + i]) + { + data.WriteUInt32(BankBagSlotFlags[i]); + } + } + } + if (_changesMask[611]) + { + for (int i = 0; i < 875; ++i) + { + if (_changesMask[612 + i]) + { + data.WriteUInt64(QuestCompleted[i]); + } + } + } + if (_changesMask[583]) + { + for (int i = 0; i < 6; ++i) + { + if (_changesMask[584 + i]) + { + PvpInfo[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + data.FlushBits(); + } + + public override void ClearChangesMask() + { + ClearChangesMask(BackpackAutoSortDisabled); + ClearChangesMask(BankAutoSortDisabled); + ClearChangesMask(SortBagsRightToLeft); + ClearChangesMask(InsertItemsLeftToRight); + ClearChangesMask(Research); + ClearChangesMask(KnownTitles); + ClearChangesMask(ResearchSites); + ClearChangesMask(ResearchSiteProgress); + ClearChangesMask(DailyQuestsCompleted); + ClearChangesMask(AvailableQuestLineXQuestIDs); + ClearChangesMask(Heirlooms); + ClearChangesMask(HeirloomFlags); + ClearChangesMask(Toys); + ClearChangesMask(ToyFlags); + ClearChangesMask(Transmog); + ClearChangesMask(ConditionalTransmog); + ClearChangesMask(SelfResSpells); + ClearChangesMask(SpellPctModByLabel); + ClearChangesMask(SpellFlatModByLabel); + ClearChangesMask(CharacterRestrictions); + ClearChangesMask(FarsightObject); + ClearChangesMask(SummonedBattlePetGUID); + ClearChangesMask(Coinage); + ClearChangesMask(XP); + ClearChangesMask(NextLevelXP); + ClearChangesMask(TrialXP); + ClearChangesMask(Skill); + ClearChangesMask(CharacterPoints); + ClearChangesMask(MaxTalentTiers); + ClearChangesMask(TrackCreatureMask); + ClearChangesMask(MainhandExpertise); + ClearChangesMask(OffhandExpertise); + ClearChangesMask(RangedExpertise); + ClearChangesMask(CombatRatingExpertise); + ClearChangesMask(BlockPercentage); + ClearChangesMask(DodgePercentage); + ClearChangesMask(DodgePercentageFromAttribute); + ClearChangesMask(ParryPercentage); + ClearChangesMask(ParryPercentageFromAttribute); + ClearChangesMask(CritPercentage); + ClearChangesMask(RangedCritPercentage); + ClearChangesMask(OffhandCritPercentage); + ClearChangesMask(SpellCritPercentage); + ClearChangesMask(ShieldBlock); + ClearChangesMask(ShieldBlockCritPercentage); + ClearChangesMask(Mastery); + ClearChangesMask(Speed); + ClearChangesMask(Avoidance); + ClearChangesMask(Sturdiness); + ClearChangesMask(Versatility); + ClearChangesMask(VersatilityBonus); + ClearChangesMask(PvpPowerDamage); + ClearChangesMask(PvpPowerHealing); + ClearChangesMask(ModHealingDonePos); + ClearChangesMask(ModHealingPercent); + ClearChangesMask(ModHealingDonePercent); + ClearChangesMask(ModPeriodicHealingDonePercent); + ClearChangesMask(ModSpellPowerPercent); + ClearChangesMask(ModResiliencePercent); + ClearChangesMask(OverrideSpellPowerByAPPercent); + ClearChangesMask(OverrideAPBySpellPowerPercent); + ClearChangesMask(ModTargetResistance); + ClearChangesMask(ModTargetPhysicalResistance); + ClearChangesMask(LocalFlags); + ClearChangesMask(GrantableLevels); + ClearChangesMask(MultiActionBars); + ClearChangesMask(LifetimeMaxRank); + ClearChangesMask(NumRespecs); + ClearChangesMask(PvpMedals); + ClearChangesMask(TodayHonorableKills); + ClearChangesMask(YesterdayHonorableKills); + ClearChangesMask(LifetimeHonorableKills); + ClearChangesMask(WatchedFactionIndex); + ClearChangesMask(MaxLevel); + ClearChangesMask(ScalingPlayerLevelDelta); + ClearChangesMask(MaxCreatureScalingLevel); + ClearChangesMask(PetSpellPower); + ClearChangesMask(UiHitModifier); + ClearChangesMask(UiSpellHitModifier); + ClearChangesMask(HomeRealmTimeOffset); + ClearChangesMask(ModPetHaste); + ClearChangesMask(LocalRegenFlags); + ClearChangesMask(AuraVision); + ClearChangesMask(NumBackpackSlots); + ClearChangesMask(OverrideSpellsID); + ClearChangesMask(LfgBonusFactionID); + ClearChangesMask(LootSpecID); + ClearChangesMask(OverrideZonePVPType); + ClearChangesMask(Honor); + ClearChangesMask(HonorNextLevel); + ClearChangesMask(PvpRewardAchieved); + ClearChangesMask(PvpTierMaxFromWins); + ClearChangesMask(PvpLastWeeksRewardAchieved); + ClearChangesMask(PvpLastWeeksTierMaxFromWins); + ClearChangesMask(PvpLastWeeksRewardClaimed); + ClearChangesMask(NumBankSlots); + ClearChangesMask(InvSlots); + ClearChangesMask(TrackResourceMask); + ClearChangesMask(ExploredZones); + ClearChangesMask(RestInfo); + ClearChangesMask(ModDamageDonePos); + ClearChangesMask(ModDamageDoneNeg); + ClearChangesMask(ModDamageDonePercent); + ClearChangesMask(WeaponDmgMultipliers); + ClearChangesMask(WeaponAtkSpeedMultipliers); + ClearChangesMask(BuybackPrice); + ClearChangesMask(BuybackTimestamp); + ClearChangesMask(CombatRatings); + ClearChangesMask(PvpInfo); + ClearChangesMask(NoReagentCostMask); + ClearChangesMask(ProfessionSkillLine); + ClearChangesMask(BagSlotFlags); + ClearChangesMask(BankBagSlotFlags); + ClearChangesMask(QuestCompleted); + _changesMask.ResetAll(); + } + } + + public class GameObjectFieldData : BaseUpdateData + { + public UpdateField> StateWorldEffectIDs = new UpdateField>(0, 1); + public DynamicUpdateField EnableDoodadSets = new DynamicUpdateField(0, 2); + public UpdateField DisplayID = new UpdateField(0, 3); + public UpdateField SpellVisualID = new UpdateField(0, 4); + public UpdateField StateSpellVisualID = new UpdateField(0, 5); + public UpdateField SpawnTrackingStateAnimID = new UpdateField(0, 6); + public UpdateField SpawnTrackingStateAnimKitID = new UpdateField(0, 7); + public UpdateField StateWorldEffectsQuestObjectiveID = new UpdateField(0, 8); + public UpdateField CreatedBy = new UpdateField(0, 9); + public UpdateField GuildGUID = new UpdateField(0, 10); + public UpdateField Flags = new UpdateField(0, 11); + public UpdateField ParentRotation = new UpdateField(0, 12); + public UpdateField FactionTemplate = new UpdateField(0, 13); + public UpdateField Level = new UpdateField(0, 14); + public UpdateField State = new UpdateField(0, 15); + public UpdateField TypeID = new UpdateField(0, 16); + public UpdateField PercentHealth = new UpdateField(0, 17); + public UpdateField ArtKit = new UpdateField(0, 18); + public UpdateField CustomParam = new UpdateField(0, 19); + + public GameObjectFieldData() : base(20) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, GameObject owner, Player receiver) + { + data.WriteUInt32(DisplayID); + data.WriteUInt32(SpellVisualID); + data.WriteUInt32(StateSpellVisualID); + data.WriteUInt32(SpawnTrackingStateAnimID); + data.WriteUInt32(SpawnTrackingStateAnimKitID); + data.WriteInt32(((List)StateWorldEffectIDs).Count); + data.WriteUInt32(StateWorldEffectsQuestObjectiveID); + for (int i = 0; i < ((List)StateWorldEffectIDs).Count; ++i) + { + data.WriteUInt32(((List)StateWorldEffectIDs)[i]); + } + data.WritePackedGuid(CreatedBy); + data.WritePackedGuid(GuildGUID); + data.WriteUInt32(GetViewerGameObjectFlags(Flags, owner, receiver)); + Quaternion rotation = ParentRotation; + data.WriteFloat(rotation.X); + data.WriteFloat(rotation.Y); + data.WriteFloat(rotation.Z); + data.WriteFloat(rotation.W); + data.WriteUInt32(FactionTemplate); + data.WriteUInt32(GetViewerGameObjectLevel(Level, owner, receiver)); + data.WriteInt8((sbyte)GetViewerGameObjectState(State, owner, receiver)); + data.WriteInt8((sbyte)TypeID); + data.WriteUInt8(PercentHealth); + data.WriteUInt32(ArtKit); + data.WriteInt32(EnableDoodadSets.Size()); + data.WriteUInt32(CustomParam); + for (int i = 0; i < EnableDoodadSets.Size(); ++i) + { + data.WriteInt32(EnableDoodadSets[i]); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, GameObject owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 20); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + List list = StateWorldEffectIDs; + data.WriteBits(list.Count, 32); + for (int i = 0; i < list.Count; ++i) + { + data.WriteUInt32(list[i]); + } + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + EnableDoodadSets.WriteUpdateMask(data); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + for (int i = 0; i < EnableDoodadSets.Size(); ++i) + { + if (EnableDoodadSets.HasChanged(i)) + { + data.WriteInt32(EnableDoodadSets[i]); + } + } + } + if (_changesMask[3]) + { + data.WriteUInt32(DisplayID); + } + if (_changesMask[4]) + { + data.WriteUInt32(SpellVisualID); + } + if (_changesMask[5]) + { + data.WriteUInt32(StateSpellVisualID); + } + if (_changesMask[6]) + { + data.WriteUInt32(SpawnTrackingStateAnimID); + } + if (_changesMask[7]) + { + data.WriteUInt32(SpawnTrackingStateAnimKitID); + } + if (_changesMask[8]) + { + data.WriteUInt32(StateWorldEffectsQuestObjectiveID); + } + if (_changesMask[9]) + { + data.WritePackedGuid(CreatedBy); + } + if (_changesMask[10]) + { + data.WritePackedGuid(GuildGUID); + } + if (_changesMask[11]) + { + data.WriteUInt32(GetViewerGameObjectFlags(Flags, owner, receiver)); + } + if (_changesMask[12]) + { + Quaternion rotation = ParentRotation; + data.WriteFloat(rotation.X); + data.WriteFloat(rotation.Y); + data.WriteFloat(rotation.Z); + data.WriteFloat(rotation.W); + } + if (_changesMask[13]) + { + data.WriteUInt32(FactionTemplate); + } + if (_changesMask[14]) + { + data.WriteUInt32(GetViewerGameObjectLevel(Level, owner, receiver)); + } + if (_changesMask[15]) + { + data.WriteInt8((sbyte)GetViewerGameObjectState(State, owner, receiver)); + } + if (_changesMask[16]) + { + data.WriteInt8((sbyte)TypeID); + } + if (_changesMask[17]) + { + data.WriteUInt8(PercentHealth); + } + if (_changesMask[18]) + { + data.WriteUInt32(ArtKit); + } + if (_changesMask[19]) + { + data.WriteUInt32(CustomParam); + } + } + } + public override void ClearChangesMask() + { + ClearChangesMask(StateWorldEffectIDs); + ClearChangesMask(EnableDoodadSets); + ClearChangesMask(DisplayID); + ClearChangesMask(SpellVisualID); + ClearChangesMask(StateSpellVisualID); + ClearChangesMask(SpawnTrackingStateAnimID); + ClearChangesMask(SpawnTrackingStateAnimKitID); + ClearChangesMask(StateWorldEffectsQuestObjectiveID); + ClearChangesMask(CreatedBy); + ClearChangesMask(GuildGUID); + ClearChangesMask(Flags); + ClearChangesMask(ParentRotation); + ClearChangesMask(FactionTemplate); + ClearChangesMask(Level); + ClearChangesMask(State); + ClearChangesMask(TypeID); + ClearChangesMask(PercentHealth); + ClearChangesMask(ArtKit); + ClearChangesMask(CustomParam); + _changesMask.ResetAll(); + } + + uint GetViewerGameObjectFlags(uint flags, GameObject gameObject, Player receiver) + { + if (gameObject.GetGoType() == GameObjectTypes.Chest) + if (gameObject.GetGoInfo().Chest.usegrouplootrules != 0 && !gameObject.IsLootAllowedFor(receiver)) + flags |= (uint)(GameObjectFlags.Locked | GameObjectFlags.NotSelectable); + + return (uint)flags; + } + + uint GetViewerGameObjectLevel(uint level, GameObject gameObject, Player receiver) + { + bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty(); + return isStoppableTransport ? gameObject.GetGoValue().Transport.PathProgress : level; + } + + sbyte GetViewerGameObjectState(sbyte state, GameObject gameObject, Player receiver) + { + bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty(); + if (isStoppableTransport && gameObject.GetGoState() == GameObjectState.TransportActive) + if (((gameObject.GetGoValue().Transport.StateUpdateTimer / 20000) & 1) != 0) + state = (sbyte)GameObjectState.TransportStopped; + + return state; + } + } + + public class DynamicObjectData : BaseUpdateData + { + public UpdateField Caster = new UpdateField(0, 1); + public UpdateField SpellXSpellVisualID = new UpdateField(0, 2); + public UpdateField SpellID = new UpdateField(0, 3); + public UpdateField Radius = new UpdateField(0, 4); + public UpdateField CastTime = new UpdateField(0, 5); + public UpdateField Type = new UpdateField(0, 6); + + public DynamicObjectData() : base(7) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver) + { + data.WritePackedGuid(Caster); + data.WriteUInt32(SpellXSpellVisualID); + data.WriteUInt32(SpellID); + data.WriteFloat(Radius); + data.WriteUInt32(CastTime); + data.WriteUInt8(Type); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver) { + data.WriteBits(_changesMask.GetBlock(0), 7); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WritePackedGuid(Caster); + } + if (_changesMask[2]) + { + data.WriteUInt32(SpellXSpellVisualID); + } + if (_changesMask[3]) + { + data.WriteUInt32(SpellID); + } + if (_changesMask[4]) + { + data.WriteFloat(Radius); + } + if (_changesMask[5]) + { + data.WriteUInt32(CastTime); + } + if (_changesMask[6]) + { + data.WriteUInt8(Type); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Caster); + ClearChangesMask(SpellXSpellVisualID); + ClearChangesMask(SpellID); + ClearChangesMask(Radius); + ClearChangesMask(CastTime); + ClearChangesMask(Type); + _changesMask.ResetAll(); + } + } + + public class CorpseData : BaseUpdateData + { + public UpdateField DynamicFlags = new UpdateField(0, 1); + public UpdateField Owner = new UpdateField(0, 2); + public UpdateField PartyGUID = new UpdateField(0, 3); + public UpdateField GuildGUID = new UpdateField(0, 4); + public UpdateField DisplayID = new UpdateField(0, 5); + public UpdateField Unused = new UpdateField(0, 6); + public UpdateField RaceID = new UpdateField(0, 7); + public UpdateField Sex = new UpdateField(0, 8); + public UpdateField SkinID = new UpdateField(0, 9); + public UpdateField FaceID = new UpdateField(0, 10); + public UpdateField HairStyleID = new UpdateField(0, 11); + public UpdateField HairColorID = new UpdateField(0, 12); + public UpdateField FacialHairStyleID = new UpdateField(0, 13); + public UpdateField Flags = new UpdateField(0, 14); + public UpdateField FactionTemplate = new UpdateField(0, 15); + public UpdateFieldArray Items = new UpdateFieldArray(19, 16, 17); + public UpdateFieldArray CustomDisplayOption = new UpdateFieldArray(3, 36, 37); + + public CorpseData() : base(40) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Corpse owner, Player receiver) + { + data.WriteUInt32(DynamicFlags); + data.WritePackedGuid(Owner); + data.WritePackedGuid(PartyGUID); + data.WritePackedGuid(GuildGUID); + data.WriteUInt32(DisplayID); + for (int i = 0; i < 19; ++i) + { + data.WriteUInt32(Items[i]); + } + data.WriteUInt8(Unused); + data.WriteUInt8(RaceID); + data.WriteUInt8(Sex); + data.WriteUInt8(SkinID); + data.WriteUInt8(FaceID); + data.WriteUInt8(HairStyleID); + data.WriteUInt8(HairColorID); + data.WriteUInt8(FacialHairStyleID); + data.WriteUInt32(Flags); + data.WriteInt32(FactionTemplate); + for (int i = 0; i < 3; ++i) + { + data.WriteUInt8(CustomDisplayOption[i]); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Corpse owner, Player receiver) { + data.WriteBits(_changesMask.GetBlocksMask(0), 2); + for (uint i = 0; i < 2; ++i) + if (_changesMask.GetBlock(i) != 0) + data.WriteBits(_changesMask.GetBlock(i), 32); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteUInt32(DynamicFlags); + } + if (_changesMask[2]) + { + data.WritePackedGuid(Owner); + } + if (_changesMask[3]) + { + data.WritePackedGuid(PartyGUID); + } + if (_changesMask[4]) + { + data.WritePackedGuid(GuildGUID); + } + if (_changesMask[5]) + { + data.WriteUInt32(DisplayID); + } + if (_changesMask[6]) + { + data.WriteUInt8(Unused); + } + if (_changesMask[7]) + { + data.WriteUInt8(RaceID); + } + if (_changesMask[8]) + { + data.WriteUInt8(Sex); + } + if (_changesMask[9]) + { + data.WriteUInt8(SkinID); + } + if (_changesMask[10]) + { + data.WriteUInt8(FaceID); + } + if (_changesMask[11]) + { + data.WriteUInt8(HairStyleID); + } + if (_changesMask[12]) + { + data.WriteUInt8(HairColorID); + } + if (_changesMask[13]) + { + data.WriteUInt8(FacialHairStyleID); + } + if (_changesMask[14]) + { + data.WriteUInt32(Flags); + } + if (_changesMask[15]) + { + data.WriteInt32(FactionTemplate); + } + } + if (_changesMask[16]) + { + for (int i = 0; i < 19; ++i) + { + if (_changesMask[17 + i]) + { + data.WriteUInt32(Items[i]); + } + } + } + if (_changesMask[36]) + { + for (int i = 0; i < 3; ++i) + { + if (_changesMask[37 + i]) + { + data.WriteUInt8(CustomDisplayOption[i]); + } + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(DynamicFlags); + ClearChangesMask(Owner); + ClearChangesMask(PartyGUID); + ClearChangesMask(GuildGUID); + ClearChangesMask(DisplayID); + ClearChangesMask(Unused); + ClearChangesMask(RaceID); + ClearChangesMask(Sex); + ClearChangesMask(SkinID); + ClearChangesMask(FaceID); + ClearChangesMask(HairStyleID); + ClearChangesMask(HairColorID); + ClearChangesMask(FacialHairStyleID); + ClearChangesMask(Flags); + ClearChangesMask(FactionTemplate); + ClearChangesMask(Items); + ClearChangesMask(CustomDisplayOption); + _changesMask.ResetAll(); + } + } + + public class ScaleCurve + { + public bool OverrideActive; + public uint StartTimeOffset; + public uint ParameterCurve; + public Vector2[] Points = new Vector2[2]; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) + { + data.WriteUInt32(StartTimeOffset); + for (int i = 0; i < 2; ++i) + { + data.WriteVector2(Points[i]); + } + data.WriteUInt32(ParameterCurve); + data.WriteBit(OverrideActive); + data.FlushBits(); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) + { + data.WriteBit(OverrideActive); + data.FlushBits(); + data.WriteUInt32(StartTimeOffset); + data.WriteUInt32(ParameterCurve); + for (int i = 0; i < 2; ++i) + { + data.WriteVector2(Points[i]); + } + data.FlushBits(); + } + } + + public class AreaTriggerFieldData : BaseUpdateData + { + public UpdateField OverrideScaleCurve = new UpdateField(0, 1); + public UpdateField ExtraScaleCurve = new UpdateField(0, 2); + public UpdateField Caster = new UpdateField(0, 3); + public UpdateField Duration = new UpdateField(0, 4); + public UpdateField TimeToTarget = new UpdateField(0, 5); + public UpdateField TimeToTargetScale = new UpdateField(0, 6); + public UpdateField TimeToTargetExtraScale = new UpdateField(0, 7); + public UpdateField SpellID = new UpdateField(0, 8); + public UpdateField SpellForVisuals = new UpdateField(0, 9); + public UpdateField SpellXSpellVisualID = new UpdateField(0, 10); + public UpdateField BoundsRadius2D = new UpdateField(0, 11); + public UpdateField DecalPropertiesID = new UpdateField(0, 12); + public UpdateField CreatingEffectGUID = new UpdateField(0, 13); + + public AreaTriggerFieldData() : base(14) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) + { + ((ScaleCurve)OverrideScaleCurve).WriteCreate(data, fieldVisibilityFlags, owner, receiver); + data.WritePackedGuid(Caster); + data.WriteUInt32(Duration); + data.WriteUInt32(TimeToTarget); + data.WriteUInt32(TimeToTargetScale); + data.WriteUInt32(TimeToTargetExtraScale); + data.WriteUInt32(SpellID); + data.WriteUInt32(SpellForVisuals); + data.WriteUInt32(SpellXSpellVisualID); + data.WriteFloat(BoundsRadius2D); + data.WriteUInt32(DecalPropertiesID); + data.WritePackedGuid(CreatingEffectGUID); + ((ScaleCurve)ExtraScaleCurve).WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) { + data.WriteBits(_changesMask.GetBlock(0), 14); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + ((ScaleCurve)OverrideScaleCurve).WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + if (_changesMask[3]) + { + data.WritePackedGuid(Caster); + } + if (_changesMask[4]) + { + data.WriteUInt32(Duration); + } + if (_changesMask[5]) + { + data.WriteUInt32(TimeToTarget); + } + if (_changesMask[6]) + { + data.WriteUInt32(TimeToTargetScale); + } + if (_changesMask[7]) + { + data.WriteUInt32(TimeToTargetExtraScale); + } + if (_changesMask[8]) + { + data.WriteUInt32(SpellID); + } + if (_changesMask[9]) + { + data.WriteUInt32(SpellForVisuals); + } + if (_changesMask[10]) + { + data.WriteUInt32(SpellXSpellVisualID); + } + if (_changesMask[11]) + { + data.WriteFloat(BoundsRadius2D); + } + if (_changesMask[12]) + { + data.WriteUInt32(DecalPropertiesID); + } + if (_changesMask[13]) + { + data.WritePackedGuid(CreatingEffectGUID); + } + if (_changesMask[2]) + { + ((ScaleCurve)ExtraScaleCurve).WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(OverrideScaleCurve); + ClearChangesMask(ExtraScaleCurve); + ClearChangesMask(Caster); + ClearChangesMask(Duration); + ClearChangesMask(TimeToTarget); + ClearChangesMask(TimeToTargetScale); + ClearChangesMask(TimeToTargetExtraScale); + ClearChangesMask(SpellID); + ClearChangesMask(SpellForVisuals); + ClearChangesMask(SpellXSpellVisualID); + ClearChangesMask(BoundsRadius2D); + ClearChangesMask(DecalPropertiesID); + ClearChangesMask(CreatingEffectGUID); + _changesMask.ResetAll(); + } + } + + public class SceneObjectData : BaseUpdateData + { + public UpdateField ScriptPackageID = new UpdateField(0, 1); + public UpdateField RndSeedVal = new UpdateField(0, 2); + public UpdateField CreatedBy = new UpdateField(0, 3); + public UpdateField SceneType = new UpdateField(0, 4); + + public SceneObjectData() : base(5) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) + { + data.WriteInt32(ScriptPackageID); + data.WriteUInt32(RndSeedVal); + data.WritePackedGuid(CreatedBy); + data.WriteUInt32(SceneType); + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) { + data.WriteBits(_changesMask.GetBlock(0), 5); + + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[1]) + { + data.WriteInt32(ScriptPackageID); + } + if (_changesMask[2]) + { + data.WriteUInt32(RndSeedVal); + } + if (_changesMask[3]) + { + data.WritePackedGuid(CreatedBy); + } + if (_changesMask[4]) + { + data.WriteUInt32(SceneType); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(ScriptPackageID); + ClearChangesMask(RndSeedVal); + ClearChangesMask(CreatedBy); + ClearChangesMask(SceneType); + _changesMask.ResetAll(); + } + } + + public class ConversationLine + { + public uint ConversationLineID; + public uint StartTime; + public uint UiCameraID; + public byte ActorIndex; + public byte Flags; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) + { + data.WriteUInt32(ConversationLineID); + data.WriteUInt32(StartTime); + data.WriteUInt32(UiCameraID); + data.WriteUInt8(ActorIndex); + data.WriteUInt8(Flags); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) + { + data.FlushBits(); + data.WriteUInt32(ConversationLineID); + data.WriteUInt32(StartTime); + data.WriteUInt32(UiCameraID); + data.WriteUInt8(ActorIndex); + data.WriteUInt8(Flags); + } + } + + public class ConversationActor + { + public uint CreatureID; + public uint CreatureDisplayInfoID; + public ObjectGuid ActorGUID; + public int Field_18; + public ConversationActorType Type; + + public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) + { + data.WriteUInt32(CreatureID); + data.WriteUInt32(CreatureDisplayInfoID); + data.WritePackedGuid(ActorGUID); + data.WriteInt32(Field_18); + data.WriteBits(Type, 1); + data.FlushBits(); + } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) + { + data.FlushBits(); + data.WriteUInt32(CreatureID); + data.WriteUInt32(CreatureDisplayInfoID); + data.WritePackedGuid(ActorGUID); + data.WriteInt32(Field_18); + data.WriteBits(Type, 1); + data.FlushBits(); + } + } + + public class ConversationData : BaseUpdateData + { + public UpdateField> Lines = new UpdateField>(0, 1); + public DynamicUpdateField Actors = new DynamicUpdateField(0, 2); + public UpdateField LastLineEndTime = new UpdateField(0, 3); + public UpdateField Field_1C = new UpdateField(0, 4); + + public ConversationData() : base(5) { } + + public override void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) + { + data.WriteInt32(((List)Lines).Count); + data.WriteUInt32(LastLineEndTime); + data.WriteUInt32(Field_1C); + for (int i = 0; i < ((List)Lines).Count; ++i) + { + ((List)Lines)[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + data.WriteInt32(Actors.Size()); + for (int i = 0; i < Actors.Size(); ++i) + { + Actors[i].WriteCreate(data, fieldVisibilityFlags, owner, receiver); + } + } + public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) + { + data.WriteBits(_changesMask.GetBlock(0), 5); + + if (_changesMask[0]) + { + if (_changesMask[1]) + { + List list = Lines; + data.WriteBits(list.Count, 32); + for (int i = 0; i < list.Count; ++i) + { + list[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + Actors.WriteUpdateMask(data); + } + } + data.FlushBits(); + if (_changesMask[0]) + { + if (_changesMask[2]) + { + for (int i = 0; i < Actors.Size(); ++i) + { + if (Actors.HasChanged(i)) + { + Actors[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); + } + } + } + if (_changesMask[3]) + { + data.WriteUInt32(LastLineEndTime); + } + if (_changesMask[4]) + { + data.WriteUInt32(Field_1C); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Lines); + ClearChangesMask(Actors); + ClearChangesMask(LastLineEndTime); + ClearChangesMask(Field_1C); + _changesMask.ResetAll(); + } + } +} diff --git a/Source/Game/Entities/Object/Update/UpdateMask.cs b/Source/Game/Entities/Object/Update/UpdateMask.cs index 08a787ac1..14c2b802b 100644 --- a/Source/Game/Entities/Object/Update/UpdateMask.cs +++ b/Source/Game/Entities/Object/Update/UpdateMask.cs @@ -24,88 +24,127 @@ namespace Game.Entities { public class UpdateMask { - public UpdateMask(uint valuesCount = 0) - { - _fieldCount = valuesCount; - _blockCount = (valuesCount + 32 - 1) / 32; + int _blockCount; + int _blocksMaskCount; + uint[] _blocks; + uint[] _blocksMask; - _mask = new BitArray((int)valuesCount, false); + public UpdateMask(int bits, uint[] input = null) + { + _blockCount = (bits + 31) / 32; + _blocksMaskCount = (_blockCount + 31) / 32; + + + _blocks = new uint[_blockCount]; + _blocksMask = new uint[_blocksMaskCount]; + + if (input != null) + { + int block = 0; + for (; block < input.Length; ++block) + if ((_blocks[block] = input[block]) != 0) + _blocksMask[GetBlockIndex(block)] |= (uint)GetBlockFlag(block); + + for (; block < _blockCount; ++block) + _blocks[block] = 0; + } } - public void SetCount(int valuesCount) + public uint GetBlocksMask(uint index) { - _fieldCount = (uint)valuesCount; - _blockCount = (uint)(valuesCount + 32 - 1) / 32; - - _mask = new BitArray((int)valuesCount, false); + return _blocksMask[index]; } - public uint GetCount() { return _fieldCount; } - - public virtual void AppendToPacket(ByteBuffer data) + public uint GetBlock(uint index) { - data.WriteUInt8(_blockCount); - var maskArray = new byte[_blockCount << 2]; - - _mask.CopyTo(maskArray, 0); - data.WriteBytes(maskArray); + return _blocks[index]; } - public bool GetBit(int index) + public bool this[int index] { - return _mask.Get(index); + get + { + return (_blocks[index / 32] & (1 << (index % 32))) != 0; + } } - public void SetBit(int index) + public void Reset(int index) { - _mask.Set(index, true); + int blockIndex = GetBlockIndex(index); + if ((_blocks[blockIndex] &= ~(uint)GetBlockFlag(index)) == 0) + _blocksMask[GetBlockIndex(blockIndex)] &= ~(uint)GetBlockFlag(blockIndex); } - void UnsetBit(int index) + public void ResetAll() { - _mask.Set(index, false); + Array.Clear(_blocks, 0, _blocks.Length); + Array.Clear(_blocksMask, 0, _blocksMask.Length); } - public void Clear() + public void Set(int index) { - _mask.SetAll(false); + int blockIndex = GetBlockIndex(index); + _blocks[blockIndex] |= (uint)GetBlockFlag(index); + _blocksMask[GetBlockIndex(blockIndex)] |= (uint)GetBlockFlag(blockIndex); } - protected uint _fieldCount; - protected uint _blockCount; - protected BitArray _mask; - } - - public class DynamicUpdateMask : UpdateMask - { - public DynamicUpdateMask(uint valuesCount) : base(valuesCount) { } - - public void EncodeDynamicFieldChangeType(DynamicFieldChangeType changeType, UpdateType updateType) + public void SetAll() { - _updateType = updateType; - DynamicFieldChangeType = (uint)(_blockCount | ((uint)(changeType & Entities.DynamicFieldChangeType.ValueAndSizeChanged) * ((3 - (int)updateType /*this part evaluates to 0 if update type is not VALUES*/) / 3))); + for (int i = 0; i < _blocksMaskCount; ++i) + _blocksMask[i] = 0xFFFFFFFF; + for (int i = 0; i < _blockCount; ++i) + _blocks[i] = 0xFFFFFFFF; + + if ((_blocksMaskCount % 32) != 0) + { + int unused = 32 - (_blocksMaskCount % 32); + _blocksMask[_blocksMaskCount - 1] &= (0xFFFFFFFF >> unused); + } + + if ((_blockCount % 32) != 0) + { + int unused = 32 - (_blockCount % 32); + _blocks[_blockCount - 1] &= (0xFFFFFFFF >> unused); + } } - public override void AppendToPacket(ByteBuffer data) + public void AND(UpdateMask right) { - data.WriteUInt16(DynamicFieldChangeType); - if (DynamicFieldChangeType.HasAnyFlag((uint)Entities.DynamicFieldChangeType.ValueAndSizeChanged) && _updateType == UpdateType.Values) - data.WriteUInt32(_fieldCount); + for (int i = 0; i < _blocksMaskCount; ++i) + _blocksMask[i] &= right._blocksMask[i]; - var maskArray = new byte[_blockCount << 2]; - - _mask.CopyTo(maskArray, 0); - data.WriteBytes(maskArray); + for (int i = 0; i < _blockCount; ++i) + { + if (!Convert.ToBoolean(_blocks[i] &= right._blocks[i])) + _blocksMask[GetBlockIndex(i)] &= ~(uint)GetBlockFlag(i); + } } - public uint DynamicFieldChangeType; - public UpdateType _updateType; - } + public void OR(UpdateMask right) + { + for (int i = 0; i < _blocksMaskCount; ++i) + _blocksMask[i] |= right._blocksMask[i]; - public enum DynamicFieldChangeType - { - Unchanged = 0, - ValueChanged = 0x7FFF, - ValueAndSizeChanged = 0x8000 + for (int i = 0; i < _blockCount; ++i) + _blocks[i] |= right._blocks[i]; + } + + public static UpdateMask operator &(UpdateMask left, UpdateMask right) + { + UpdateMask result = left; + result.AND(right); + return result; + } + + public static UpdateMask operator |(UpdateMask left, UpdateMask right) + { + UpdateMask result = left; + result.OR(right); + return result; + } + + //helpers + public static int GetBlockIndex(int bit) { return bit / 32; } + public static int GetBlockFlag(int bit) { return 1 << (bit % 32); } } } diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 3b6e3e4e7..88c052b81 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -33,10 +33,12 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; +using System.Linq.Expressions; +using System.Reflection; namespace Game.Entities { - public class WorldObject : WorldLocation, IDisposable + public abstract class WorldObject : WorldLocation, IDisposable { public WorldObject(bool isWorldObject) { @@ -49,10 +51,12 @@ namespace Game.Entities objectTypeId = TypeId.Object; objectTypeMask = TypeMask.Object; - _fieldNotifyFlags = UpdateFieldFlags.Dynamic; + m_values = new UpdateFieldHolder(this); m_movementInfo = new MovementInfo(); m_updateFlag.Clear(); + + m_objectData = new ObjectFieldData(); } public virtual void Dispose() @@ -83,41 +87,10 @@ namespace Game.Entities } } - void InitValues() - { - updateValues = new UpdateValues[valuesCount]; - _changesMask = new BitArray((int)valuesCount); - - if (_dynamicValuesCount != 0) - { - _dynamicValues = new uint[_dynamicValuesCount][]; - _dynamicChangesArrayMask = new BitArray[_dynamicValuesCount]; - - for (var i = 0; i < _dynamicValuesCount; ++i) - { - _dynamicValues[i] = new uint[0]; - _dynamicChangesArrayMask[i] = new BitArray(0); - _dynamicChangesMask[i] = DynamicFieldChangeType.Unchanged; - } - } - - m_objectUpdated = false; - } - public void _Create(ObjectGuid guid) { - if (updateValues == null) - InitValues(); - - SetGuidValue(ObjectFields.Guid, guid); - } - - public string _ConcatFields(object startIndex, uint size) - { - StringBuilder sb = new StringBuilder(); - for (int index = 0; index < size; ++index) - sb.AppendFormat("{0} ", GetUInt32Value(index + (int)startIndex)); - return sb.ToString(); + m_objectUpdated = false; + m_guid = guid; } public virtual void AddToWorld() @@ -212,14 +185,12 @@ namespace Game.Entities flags.CombatVictim = true; WorldPacket buffer = new WorldPacket(); - buffer.WriteUInt8(updateType); + buffer.WriteUInt8((byte)updateType); buffer.WritePackedGuid(GetGUID()); - buffer.WriteUInt8(tempObjectType); - buffer.WriteUInt32(tempObjectTypeMask); + buffer.WriteUInt8((byte)tempObjectType); BuildMovementUpdate(buffer, flags); - BuildValuesUpdate(updateType, buffer, target); - BuildDynamicValuesUpdate(updateType, buffer, target); + BuildValuesCreate(buffer, target); data.AddUpdateBlock(buffer); } @@ -242,11 +213,22 @@ namespace Game.Entities { WorldPacket buffer = new WorldPacket(); - buffer.WriteUInt8(UpdateType.Values); + buffer.WriteUInt8((byte)UpdateType.Values); buffer.WritePackedGuid(GetGUID()); - BuildValuesUpdate(UpdateType.Values, buffer, target); - BuildDynamicValuesUpdate(UpdateType.Values, buffer, target); + BuildValuesUpdate(buffer, target); + + data.AddUpdateBlock(buffer); + } + + public void BuildValuesUpdateBlockForPlayerWithFlag(UpdateData data, UpdateFieldFlag flags, Player target) + { + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt8((byte)UpdateType.Values); + buffer.WritePackedGuid(GetGUID()); + + BuildValuesUpdateWithFlag(buffer, flags, target); data.AddUpdateBlock(buffer); } @@ -265,50 +247,6 @@ namespace Game.Entities target.SendPacket(packet); } - public int GetInt32Value(object index) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - return updateValues[(int)index].SignedValue; - } - - public uint GetUInt32Value(object index) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - return updateValues[(int)index].UnsignedValue; - } - - public ulong GetUInt64Value(object index) - { - Cypher.Assert((int)index + 1 < valuesCount || PrintIndexError(index, false)); - return ((ulong)updateValues[(int)index + 1].UnsignedValue << 32 | updateValues[(int)index].UnsignedValue); - } - - public float GetFloatValue(object index) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - return updateValues[(int)index].FloatValue; - } - - public byte GetByteValue(object index, byte offset) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - Cypher.Assert(offset < 4); - return (byte)((updateValues[(int)index].UnsignedValue >> (offset * 8)) & 0xFF); - } - - public ushort GetUInt16Value(object index, byte offset) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - Cypher.Assert(offset < 2); - return (ushort)((updateValues[(int)index].UnsignedValue >> (offset * 16)) & 0xFFFF); - } - - public ObjectGuid GetGuidValue(object index) - { - Cypher.Assert((int)index + 3 < valuesCount || PrintIndexError(index, false)); - return new ObjectGuid(GetUInt64Value((int)index + 2), GetUInt64Value(index)); - } - public void BuildMovementUpdate(WorldPacket data, CreateObjectBits flags) { int PauseTimesCount = 0; @@ -317,7 +255,7 @@ namespace Game.Entities if (go) { if (go.GetGoType() == GameObjectTypes.Transport) - PauseTimesCount = go.m_goValue.Transport.StopFrames.Count; + PauseTimesCount = go.GetGoValue().Transport.StopFrames.Count; } data.WriteBit(flags.NoBirthAnim); @@ -419,7 +357,7 @@ namespace Game.Entities MovementExtensions.WriteCreateObjectSplineDataBlock(unit.moveSpline, data); } - data.WriteUInt32(PauseTimesCount); + data.WriteInt32(PauseTimesCount); if (flags.Stationary) { @@ -442,7 +380,7 @@ namespace Game.Entities resulting in players seeing the object in a different position */ if (go1 && go1.ToTransport()) // ServerTime - data.WriteUInt32(go1.m_goValue.Transport.PathProgress); + data.WriteUInt32(go1.GetGoValue().Transport.PathProgress); else data.WriteUInt32(Time.GetMSTime()); } @@ -467,7 +405,7 @@ namespace Game.Entities if (go) { for (int i = 0; i < PauseTimesCount; ++i) - data.WriteUInt32(go.m_goValue.Transport.StopFrames[i]); + data.WriteUInt32(go.GetGoValue().Transport.StopFrames[i]); } if (flags.MovementTransport) @@ -559,7 +497,7 @@ namespace Game.Entities data.WriteUInt32(areaTriggerMiscTemplate.MoveCurveId); if (hasAnimation) - data.WriteInt32(areaTriggerMiscTemplate.AnimId); + data.WriteUInt32(areaTriggerMiscTemplate.AnimId); if (hasAnimKitID) data.WriteUInt32(areaTriggerMiscTemplate.AnimKitId); @@ -775,11 +713,11 @@ namespace Game.Entities float baseCd = player.GetRuneBaseCooldown(); uint maxRunes = (uint)player.GetMaxPower(PowerType.Runes); - data.WriteUInt8((1 << (int)maxRunes) - 1u); + data.WriteUInt8((byte)((1 << (int)maxRunes) - 1u)); data.WriteUInt8(player.GetRunesState()); data.WriteUInt32(maxRunes); for (byte i = 0; i < maxRunes; ++i) - data.WriteUInt8((baseCd - (float)player.GetRuneCooldown(i)) / baseCd * 255); + data.WriteUInt8((byte)((baseCd - (float)player.GetRuneCooldown(i)) / baseCd * 255)); } } @@ -792,75 +730,15 @@ namespace Game.Entities } } - public virtual void BuildValuesUpdate(UpdateType updatetype, ByteBuffer data, Player target) + public virtual UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) { - if (!target) - return; - - ByteBuffer fieldBuffer = new ByteBuffer(); - UpdateMask updateMask = new UpdateMask(valuesCount); - - uint[] flags; - uint visibleFlag = GetUpdateFieldData(target, out flags); - for (int index = 0; index < valuesCount; ++index) - { - if (Convert.ToBoolean(_fieldNotifyFlags & flags[index]) || - ((updatetype == UpdateType.Values ? _changesMask.Get(index) : updateValues[index].UnsignedValue != 0) && Convert.ToBoolean(flags[index] & visibleFlag))) - { - updateMask.SetBit(index); - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue); - } - } - - updateMask.AppendToPacket(data); - data.WriteBytes(fieldBuffer); + return UpdateFieldFlag.None; } - public virtual void BuildDynamicValuesUpdate(UpdateType updateType, WorldPacket data, Player target) + void BuildValuesUpdateWithFlag(ByteBuffer data, UpdateFieldFlag flags, Player target) { - if (!target) - return; - - uint valueCount = _dynamicValuesCount; - if (target != this && GetTypeId() == TypeId.Player) - valueCount = (uint)PlayerDynamicFields.End; - - ByteBuffer fieldBuffer = new ByteBuffer(); - UpdateMask fieldMask = new UpdateMask(valueCount); - - uint[] flags; - uint visibleFlag = GetDynamicUpdateFieldData(target, out flags); - - for (var index = 0; index < valueCount; ++index) - { - ByteBuffer valueBuffer = new ByteBuffer(); - var values = _dynamicValues[index]; - if (_fieldNotifyFlags.HasAnyFlag(flags[index]) || - ((updateType == UpdateType.Values ? _dynamicChangesMask[index] != DynamicFieldChangeType.Unchanged : !values.Empty()) && flags[index].HasAnyFlag(visibleFlag))) - { - fieldMask.SetBit(index); - - DynamicUpdateMask arrayMask = new DynamicUpdateMask((uint)values.Length); - arrayMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType); - if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged) - arrayMask.SetCount(values.Length); - - for (var v = 0; v < values.Length; ++v) - { - if (updateType != UpdateType.Values || _dynamicChangesArrayMask[index].Get(v)) - { - arrayMask.SetBit(v); - valueBuffer.WriteUInt32(values[v]); - } - } - - arrayMask.AppendToPacket(fieldBuffer); - fieldBuffer.WriteBytes(valueBuffer); - } - } - - fieldMask.AppendToPacket(data); - data.WriteBytes(fieldBuffer); + data.WriteUInt32(0); + data.WriteUInt32(0); } public void AddToObjectUpdateIfNeeded() @@ -872,14 +750,9 @@ namespace Game.Entities } } - public void ClearUpdateMask(bool remove) + public virtual void ClearUpdateMask(bool remove) { - _changesMask.SetAll(false); - for (int i = 0; i < _dynamicValuesCount; ++i) - { - _dynamicChangesMask[i] = DynamicFieldChangeType.Unchanged; - _dynamicChangesArrayMask[i].SetAll(false); - } + m_values.ClearChangesMask(m_objectData); if (m_objectUpdated) { @@ -903,612 +776,157 @@ namespace Game.Entities BuildValuesUpdateBlockForPlayer(data, player); } - uint GetUpdateFieldData(Player target, out uint[] flags) + public abstract void BuildValuesCreate(WorldPacket data, Player target); + public abstract void BuildValuesUpdate(WorldPacket data, Player target); + + public void SetUpdateFieldValue(IUpdateField updateField, T newValue) where T : new() { - var visibleFlag = UpdateFieldFlags.Public; - flags = null; - - if (target == this) - visibleFlag |= UpdateFieldFlags.Private; - - switch (GetTypeId()) + Type type = typeof(T); + if (type.IsGenericType || (dynamic)newValue != updateField.GetValue()) { - case TypeId.Item: - case TypeId.Container: - flags = UpdateFieldFlags.ContainerUpdateFieldFlags; - if (((Item)this).GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner | UpdateFieldFlags.ItemOwner; - break; - case TypeId.AzeriteEmpoweredItem: - flags = UpdateFieldFlags.AzeriteEmpoweredItemUpdateFieldFlags; - if (((Item)this).GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner | UpdateFieldFlags.ItemOwner; - break; - case TypeId.AzeriteItem: - flags = UpdateFieldFlags.AzeriteItemUpdateFieldFlags; - if (((Item)this).GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner | UpdateFieldFlags.ItemOwner; - break; - case TypeId.Unit: - case TypeId.Player: - { - Player plr = ToUnit().GetCharmerOrOwnerPlayerOrPlayerItself(); - flags = UpdateFieldFlags.UnitUpdateFieldFlags; - if (ToUnit().GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; - - if (HasFlag(ObjectFields.DynamicFlags, UnitDynFlags.SpecialInfo)) - if (ToUnit().HasAuraTypeWithCaster(AuraType.Empathy, target.GetGUID())) - visibleFlag |= UpdateFieldFlags.SpecialInfo; - - if (plr != null && plr.IsInSameGroupWith(target)) - visibleFlag |= UpdateFieldFlags.PartyMember; - break; - } - case TypeId.GameObject: - flags = UpdateFieldFlags.GameObjectUpdateFieldFlags; - if (ToGameObject().GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; - break; - case TypeId.DynamicObject: - flags = UpdateFieldFlags.DynamicObjectUpdateFieldFlags; - if (ToDynamicObject().GetCasterGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; - break; - case TypeId.Corpse: - flags = UpdateFieldFlags.CorpseUpdateFieldFlags; - if (ToCorpse().GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; - break; - case TypeId.AreaTrigger: - flags = UpdateFieldFlags.AreaTriggerUpdateFieldFlags; - break; - case TypeId.SceneObject: - flags = UpdateFieldFlags.SceneObjectUpdateFieldFlags; - break; - case TypeId.Conversation: - flags = UpdateFieldFlags.ConversationUpdateFieldFlags; - break; - case TypeId.Object: - case TypeId.ActivePlayer: - Cypher.Assert(false); - break; - } - return visibleFlag; - } - - public uint GetDynamicUpdateFieldData(Player target, out uint[] flags) - { - uint visibleFlag = UpdateFieldFlags.Public; - - if (target == this) - visibleFlag |= UpdateFieldFlags.Private; - - switch (GetTypeId()) - { - case TypeId.Item: - case TypeId.Container: - case TypeId.AzeriteEmpoweredItem: - case TypeId.AzeriteItem: - flags = UpdateFieldFlags.ItemDynamicUpdateFieldFlags; - if (((Item)this).GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner | UpdateFieldFlags.ItemOwner; - break; - case TypeId.Unit: - case TypeId.Player: - { - Player plr = ToUnit().GetCharmerOrOwnerPlayerOrPlayerItself(); - flags = UpdateFieldFlags.UnitDynamicUpdateFieldFlags; - if (ToUnit().GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; - - if (HasFlag(ObjectFields.DynamicFlags, UnitDynFlags.SpecialInfo)) - if (ToUnit().HasAuraTypeWithCaster(AuraType.Empathy, target.GetGUID())) - visibleFlag |= UpdateFieldFlags.SpecialInfo; - - if (plr && plr.IsInSameRaidWith(target)) - visibleFlag |= UpdateFieldFlags.PartyMember; - break; - } - case TypeId.GameObject: - flags = UpdateFieldFlags.GameObjectDynamicUpdateFieldFlags; - break; - case TypeId.Conversation: - flags = UpdateFieldFlags.ConversationDynamicUpdateFieldFlags; - - if (ToConversation().GetCreatorGuid() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Unknownx100; - break; - default: - flags = null; - break; - } - - return visibleFlag; - } - - public void _LoadIntoDataField(string data, uint startOffset, uint count) - { - if (string.IsNullOrEmpty(data)) - return; - - var lines = new StringArray(data, ' '); - if (lines.Length != count) - return; - - for (var index = 0; index < count; ++index) - { - if (uint.TryParse(lines[index], out uint value)) - { - updateValues[(int)startOffset + index].UnsignedValue = value; - _changesMask.Set((int)(startOffset + index), true); - } - } - } - - public void SetInt32Value(object index, int value) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - - if (updateValues[(int)index].SignedValue != value) - { - updateValues[(int)index].SignedValue = value; - _changesMask.Set((int)index, true); - + updateField.SetValue(newValue); AddToObjectUpdateIfNeeded(); } } - public void SetUInt32Value(object index, uint value) + public void SetUpdateFieldValue(ref T value, T newValue) where T : new() { - int _index = Convert.ToInt32(index); - Cypher.Assert(_index < valuesCount || PrintIndexError(index, true)); - - if (updateValues[_index].UnsignedValue != value) + Type type = typeof(T); + if (type.IsGenericType || (dynamic)newValue != value) { - updateValues[_index].UnsignedValue = value; - _changesMask.Set(_index, true); - + value = newValue; AddToObjectUpdateIfNeeded(); } } - public void UpdateUInt32Value(object index, uint value) + public void SetUpdateFieldValue(DynamicUpdateField updateField, int index, T newValue) where T : new() { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - - updateValues[(int)index].UnsignedValue = value; - _changesMask.Set((int)index, true); - } - - public void SetUInt64Value(object index, ulong value) - { - Cypher.Assert((int)index + 1 < valuesCount || PrintIndexError(index, true)); - if (GetUInt64Value(index) != value) + if ((dynamic)newValue != updateField[index]) { - updateValues[(int)index].UnsignedValue = MathFunctions.Pair64_LoPart(value); - updateValues[(int)index + 1].UnsignedValue = MathFunctions.Pair64_HiPart(value); - _changesMask.Set((int)index, true); - _changesMask.Set((int)index + 1, true); - + updateField[index] = newValue; AddToObjectUpdateIfNeeded(); } } - public bool AddGuidValue(object index, ObjectGuid value) + public void SetUpdateFieldFlagValue(IUpdateField updateField, T flag) where T : new() { - Cypher.Assert((int)index + 3 < valuesCount || PrintIndexError(index, true)); - if (!value.IsEmpty() && GetGuidValue(index).IsEmpty()) - { - SetGuidValue(index, value); - return true; - } - - return false; + //static_assert(std::is_integral < T >::value, "SetUpdateFieldFlagValue must be used with integral types"); + SetUpdateFieldValue(updateField, (T)(updateField.GetValue() | (dynamic)flag)); } - public bool RemoveGuidValue(object index, ObjectGuid value) + public void SetUpdateFieldFlagValue(ref T value, T flag) where T : new() { - Cypher.Assert((int)index + 3 < valuesCount || PrintIndexError(index, true)); - if (!value.IsEmpty() && GetGuidValue(index) == value) - { - SetGuidValue(index, ObjectGuid.Empty); - return true; - } - - return false; + //static_assert(std::is_integral < T >::value, "SetUpdateFieldFlagValue must be used with integral types"); + SetUpdateFieldValue(ref value, (T)(value | (dynamic)flag)); } - public void SetFloatValue(object index, float value) + public void RemoveUpdateFieldFlagValue(IUpdateField updateField, T flag) where T : new() { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - - if (updateValues[(int)index].FloatValue != value) - { - updateValues[(int)index].FloatValue = value; - _changesMask.Set((int)index, true); - - AddToObjectUpdateIfNeeded(); - } + //static_assert(std::is_integral < T >::value, "SetUpdateFieldFlagValue must be used with integral types"); + SetUpdateFieldValue(updateField, (T)(updateField.GetValue() & ~(dynamic)flag)); } - public void SetByteValue(object index, byte offset, byte value) + public void RemoveUpdateFieldFlagValue(ref T value, T flag) where T : new() { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - - if (offset > 3) - { - Log.outError(LogFilter.Server, "Object.SetByteValue: wrong offset {0}", offset); - return; - } - - if ((byte)(updateValues[(int)index].UnsignedValue >> (offset * 8)) != value) - { - updateValues[(int)index].UnsignedValue &= ~(uint)(0xFF << (offset * 8)); - updateValues[(int)index].UnsignedValue |= (uint)value << (offset * 8); - _changesMask.Set((int)index, true); - - AddToObjectUpdateIfNeeded(); - } + //static_assert(std::is_integral < T >::value, "RemoveUpdateFieldFlagValue must be used with integral types"); + SetUpdateFieldValue(ref value, (T)(value & ~(dynamic)flag)); } - public void SetUInt16Value(object index, byte offset, ushort value) + public void AddDynamicUpdateFieldValue(DynamicUpdateField updateField, T value) where T : new() { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - - if (offset > 2) - { - Log.outError(LogFilter.Server, "WorldObject.SetUInt16Value: wrong offset {0}", offset); - return; - } - - if ((ushort)(GetUInt32Value(index) >> (offset * 16)) != value) - { - updateValues[(int)index].UnsignedValue &= ~((uint)0xFFFF << (offset * 16)); - updateValues[(int)index].UnsignedValue |= (uint)value << (offset * 16); - _changesMask.Set((int)index, true); - - AddToObjectUpdateIfNeeded(); - } + AddToObjectUpdateIfNeeded(); + updateField.AddValue(value); } - public void SetGuidValue(object index, ObjectGuid value) + public void InsertDynamicUpdateFieldValue(DynamicUpdateField updateField, int index, T value) where T : new() { - Cypher.Assert((int)index + 3 < valuesCount || PrintIndexError(index, true)); - if (GetGuidValue(index) != value) - { - SetUInt64Value(index, value.GetLowValue()); - SetUInt64Value((int)index + 2, value.GetHighValue()); - - AddToObjectUpdateIfNeeded(); - } + AddToObjectUpdateIfNeeded(); + updateField.InsertValue(index, value); } - public void SetStatFloatValue(object index, float value) + public void RemoveDynamicUpdateFieldValue(DynamicUpdateField updateField, int index) where T : new() { - if (value < 0) - value = 0.0f; - - SetFloatValue(index, value); + AddToObjectUpdateIfNeeded(); + updateField.RemoveValue(index); } - public void SetStatInt32Value(object index, int value) + public void ClearDynamicUpdateFieldValues(DynamicUpdateField updateField) where T : new() { - if (value < 0) - value = 0; - - SetUInt32Value(index, (uint)value); + AddToObjectUpdateIfNeeded(); + updateField.Clear(); } - public void ApplyModInt32Value(object index, int val, bool apply) + // stat system helpers + public void SetUpdateFieldStatValue(IUpdateField updateField, T value) where T : new() { - int cur = GetInt32Value(index); - cur += (apply ? val : -val); - if (cur < 0) - cur = 0; - SetInt32Value(index, cur); + //static_assert(std::is_arithmetic < T >::value, "SetUpdateFieldStatValue must be used with arithmetic types"); + SetUpdateFieldValue(updateField, Math.Max((dynamic)value, 0)); } - public void ApplyModUInt32Value(object index, int val, bool apply) - { - int cur = (int)GetUInt32Value(index); - cur += (apply ? val : -val); - if (cur < 0) - cur = 0; - SetUInt32Value(index, (uint)cur); + public void SetUpdateFieldStatValue(ref T oldValue, T value) + { + //static_assert(std::is_arithmetic < T >::value, "SetUpdateFieldStatValue must be used with arithmetic types"); + SetUpdateFieldValue(ref oldValue, Math.Max((dynamic)value, 0)); } - public void ApplyModUInt16Value(object index, byte offset, short val, bool apply) - { - short cur = (short)GetUInt16Value(index, offset); - cur += (short)(apply ? val : -val); - if (cur < 0) - cur = 0; - SetUInt16Value(index, offset, (ushort)cur); - } - - public void ApplyModSignedFloatValue(object index, float val, bool apply) - { - float cur = GetFloatValue(index); - cur += (apply ? val : -val); - SetFloatValue(index, cur); - } - - public void ApplyPercentModFloatValue(object index, float val, bool apply) - { - float value = GetFloatValue(index); - MathFunctions.ApplyPercentModFloatVar(ref value, val, apply); - SetFloatValue(index, value); - } - - public void SetFlag(object index, object newflag) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - uint oldval = updateValues[(int)index].UnsignedValue; - uint newval = oldval | Convert.ToUInt32(newflag); - - if (oldval != newval) - { - updateValues[(int)index].UnsignedValue = newval; - _changesMask.Set((int)index, true); - - AddToObjectUpdateIfNeeded(); - } - } - - public void RemoveFlag(object index, object oldFlag) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - Cypher.Assert(updateValues != null); - - uint oldval = updateValues[(int)index].UnsignedValue; - uint newval = (oldval & ~Convert.ToUInt32(oldFlag)); - - if (oldval != newval) - { - updateValues[(int)index].UnsignedValue = newval; - _changesMask.Set((int)index, true); - AddToObjectUpdateIfNeeded(); - } - } - - public void ToggleFlag(object index, object flag) - { - if (HasFlag(index, flag)) - RemoveFlag(index, flag); - else - SetFlag(index, flag); - } - - public bool HasFlag(object index, object flag) - { - if ((int)index >= valuesCount && !PrintIndexError(index, false)) - return false; - - return (GetUInt32Value(index) & Convert.ToUInt32(flag)) != 0; - } - - public void ApplyModFlag(object index, T flag, bool apply) + public void ApplyModUpdateFieldValue(IUpdateField updateField, T mod, bool apply) where T : new() { + //static_assert(std::is_arithmetic < T >::value, "SetUpdateFieldStatValue must be used with arithmetic types"); + dynamic value = updateField.GetValue(); if (apply) - SetFlag(index, flag); + value += mod; else - RemoveFlag(index, flag); + value -= mod; + + SetUpdateFieldValue(updateField, value); } - public void SetByteFlag(object index, byte offset, object newFlag) + public void ApplyModUpdateFieldValue(ref T oldvalue, T mod, bool apply) where T : new() { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); + //static_assert(std::is_arithmetic < T >::value, "SetUpdateFieldStatValue must be used with arithmetic types"); - if (offset > 4) - { - Log.outError(LogFilter.Server, "Object.SetByteFlag: wrong offset {0}", offset); - return; - } - - if (!Convert.ToBoolean(updateValues[(int)index].UnsignedValue >> (offset * 8) & Convert.ToUInt32(newFlag))) - { - updateValues[(int)index].UnsignedValue |= Convert.ToUInt32(newFlag) << (offset * 8); - _changesMask.Set((int)index, true); - - AddToObjectUpdateIfNeeded(); - } - } - - public void RemoveByteFlag(object index, byte offset, object oldFlag) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, true)); - - if (offset > 4) - { - Log.outError(LogFilter.Server, "Object.RemoveByteFlag: wrong offset {0}", offset); - return; - } - - if (Convert.ToBoolean(updateValues[(int)index].UnsignedValue >> (offset * 8) & Convert.ToUInt32(oldFlag))) - { - updateValues[(int)index].UnsignedValue &= ~(Convert.ToUInt32(oldFlag) << (offset * 8)); - _changesMask.Set((int)index, true); - - AddToObjectUpdateIfNeeded(); - } - } - - public void ToggleByteFlag(object index, byte offset, byte flag) - { - if (HasByteFlag(index, offset, flag)) - RemoveByteFlag(index, offset, flag); - else - SetByteFlag(index, offset, flag); - } - - public bool HasByteFlag(object index, byte offset, object flag) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - Cypher.Assert(offset < 4); - return Convert.ToBoolean(updateValues[(int)index].UnsignedValue >> (offset * 8) & Convert.ToUInt32(flag)); - } - - public void SetFlag64(object index, object newFlag) - { - ulong oldval = GetUInt64Value(index); - ulong newval = oldval | Convert.ToUInt64(newFlag); - SetUInt64Value(index, newval); - } - - public void RemoveFlag64(object index, object oldFlag) - { - ulong oldval = GetUInt64Value(index); - ulong newval = oldval & ~Convert.ToUInt64(oldFlag); - SetUInt64Value(index, newval); - } - - public void ToggleFlag64(object index, object flag) - { - if (HasFlag64(index, flag)) - RemoveFlag64(index, flag); - else - SetFlag64(index, flag); - } - - public bool HasFlag64(object index, object flag) - { - Cypher.Assert((int)index < valuesCount || PrintIndexError(index, false)); - return (GetUInt64Value(index) & Convert.ToUInt64(flag)) != 0; - } - - void ApplyModFlag64(object index, ulong flag, bool apply) - { + dynamic value = oldvalue; if (apply) - SetFlag64(index, flag); + value += mod; else - RemoveFlag64(index, flag); + value -= mod; + + SetUpdateFieldValue(ref oldvalue, value); } - public uint[] GetDynamicValues(object index) + public void ApplyPercentModUpdateFieldValue(IUpdateField updateField, float percent, bool apply) where T : new() { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); - return _dynamicValues[(int)index]; + //static_assert(std::is_arithmetic < T >::value, "SetUpdateFieldStatValue must be used with arithmetic types"); + + dynamic value = updateField.GetValue(); + + // don't want to include Util.h here + //ApplyPercentModFloatVar(value, percent, apply); + if (percent == -100.0f) + percent = -99.99f; + value *= (apply ? (100.0f + percent) / 100.0f : 100.0f / (100.0f + percent)); + + SetUpdateFieldValue(updateField, value); } - public uint GetDynamicValue(object index, ushort offset) + public void ApplyPercentModUpdateFieldValue(ref T oldValue, float percent, bool apply) where T : new() { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); - if (offset >= _dynamicValues[(int)index].Length) - return 0; + //static_assert(std::is_arithmetic < T >::value, "SetUpdateFieldStatValue must be used with arithmetic types"); - return _dynamicValues[(int)index][offset]; + dynamic value = oldValue; + + // don't want to include Util.h here + //ApplyPercentModFloatVar(value, percent, apply); + if (percent == -100.0f) + percent = -99.99f; + value *= (apply ? (100.0f + percent) / 100.0f : 100.0f / (100.0f + percent)); + + SetUpdateFieldValue(ref oldValue, value); } - public bool HasDynamicValue(object index, uint value) + public void ForceUpdateFieldChange() { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); - uint[] values = _dynamicValues[(int)index]; - for (var i = 0; i < values.Length; ++i) - if (values[i] == value) - return true; - - return false; - } - - public void AddDynamicValue(object index, uint value) - { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true)); - - SetDynamicValue(index, (byte)_dynamicValues[(int)index].Length, value); - } - - public void RemoveDynamicValue(object index, uint value) - { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); - - // TODO: Research if this is blizzlike to just set value to 0 - for (var i = 0; i < _dynamicValues[(int)index].Length; ++i) - { - if (_dynamicValues[(int)index][i] == value) - { - _dynamicValues[(int)index][i] = 0; - _dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueChanged; - _dynamicChangesArrayMask[(int)index].Set(i, true); - - AddToObjectUpdateIfNeeded(); - } - } - } - - public void ClearDynamicValue(object index) - { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); - - if (!_dynamicValues[(int)index].Empty()) - { - _dynamicValues[(int)index] = new uint[0]; - _dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueAndSizeChanged; - _dynamicChangesArrayMask[(int)index].SetAll(false); - - AddToObjectUpdateIfNeeded(); - } - } - - public void SetDynamicValue(object index, ushort offset, uint value) - { - Cypher.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true)); - - DynamicFieldChangeType changeType = DynamicFieldChangeType.ValueChanged; - if (_dynamicValues[(int)index].Length <= offset) - { - Array.Resize(ref _dynamicValues[(int)index], offset + 1); - changeType = DynamicFieldChangeType.ValueAndSizeChanged; - } - - if (_dynamicChangesArrayMask[(int)index].Count <= offset) - _dynamicChangesArrayMask[(int)index].Length = offset + 1; - - if (_dynamicValues[(int)index][offset] != value || changeType == DynamicFieldChangeType.ValueAndSizeChanged) - { - _dynamicValues[(int)index][offset] = value; - _dynamicChangesMask[(int)index] = changeType; - _dynamicChangesArrayMask[(int)index].Set(offset, true); - - AddToObjectUpdateIfNeeded(); - } - } - - public List GetDynamicStructuredValues(object index) - { - var values = _dynamicValues[(int)index]; - return values.DeserializeObjects(); - } - - public T GetDynamicStructuredValue(object index, ushort offset) - { - return GetDynamicStructuredValues(index)[offset]; - } - - public void SetDynamicStructuredValue(object index, ushort offset, T value) - { - int BlockCount = Marshal.SizeOf() / sizeof(uint); - SetDynamicValue(index, (ushort)((offset + 1) * BlockCount - 1), 0); // reserve space - - for (ushort i = 0; i < BlockCount; ++i) - SetDynamicValue(index, (ushort)(offset * BlockCount + i), value.SerializeObject()[i]); - } - - public void AddDynamicStructuredValue(object index, T value) - { - int BlockCount = Marshal.SizeOf() / sizeof(uint); - ushort offset = (ushort)(_dynamicValues[(int)index].Length / BlockCount); - SetDynamicValue(index, (ushort)((offset + 1) * BlockCount - 1), 0); // reserve space - for (ushort i = 0; i < BlockCount; ++i) - SetDynamicValue(index, (ushort)(offset * BlockCount + i), value.SerializeObject()[i]); - } - - bool PrintIndexError(object index, bool set) - { - Log.outError(LogFilter.Server, "Attempt {0} non-existed value field: {1} (count: {2}) for object typeid: {3} type mask: {4}", (set ? "set value to" : "get value from"), index, valuesCount, GetTypeId(), objectTypeId); - - // ASSERT must fail after function call - return false; + AddToObjectUpdateIfNeeded(); } public bool IsWorldObject() @@ -1897,14 +1315,6 @@ namespace Game.Entities return true; } - public void ForceValuesUpdateAtIndex(object _index) - { - int index = (int)_index; - _changesMask.Set(index, true); - - AddToObjectUpdateIfNeeded(); - } - public virtual void SendMessageToSet(ServerPacket packet, bool self) { if (IsInWorld) @@ -2072,7 +1482,7 @@ namespace Game.Entities if (IsTypeId(TypeId.Player) || IsTypeId(TypeId.Unit)) { - summon.SetFaction(ToUnit().getFaction()); + summon.SetFaction(ToUnit().GetFaction()); summon.SetLevel(ToUnit().getLevel()); } @@ -2155,7 +1565,11 @@ namespace Game.Entities public float GetObjectSize() { - return (valuesCount > (uint)UnitFields.CombatReach) ? GetFloatValue(UnitFields.CombatReach) : SharedConst.DefaultWorldObjectSize; + Unit thisUnit = ToUnit(); + if (thisUnit != null) + return thisUnit.m_unitData.CombatReach; + + return SharedConst.DefaultWorldObjectSize; } public bool IsInPhase(WorldObject obj) @@ -2262,12 +1676,18 @@ namespace Game.Entities public virtual string GetName(LocaleConstant locale_idx = LocaleConstant.enUS) { return _name; } public void SetName(string name) { _name = name; } - public ObjectGuid GetGUID() { return GetGuidValue(ObjectFields.Guid); } - public uint GetEntry() { return GetUInt32Value(ObjectFields.Entry); } - public void SetEntry(uint entry) { SetUInt32Value(ObjectFields.Entry, entry); } + public ObjectGuid GetGUID() { return m_guid; } + public uint GetEntry() { return m_objectData.EntryId; } + public void SetEntry(uint entry) { SetUpdateFieldValue(m_values.ModifyValue(m_objectData).ModifyValue(m_objectData.EntryId), entry); } - public float GetObjectScale() { return GetFloatValue(ObjectFields.ScaleX); } - public virtual void SetObjectScale(float scale) { SetFloatValue(ObjectFields.ScaleX, scale); } + public float GetObjectScale() { return m_objectData.Scale; } + public virtual void SetObjectScale(float scale) { SetUpdateFieldValue(m_values.ModifyValue(m_objectData).ModifyValue(m_objectData.Scale), scale); } + + public UnitDynFlags GetDynamicFlags() { return (UnitDynFlags)(uint)m_objectData.DynamicFlags; } + public bool HasDynamicFlag(UnitDynFlags flag) { return (m_objectData.DynamicFlags & (uint)flag) != 0; } + public void AddDynamicFlag(UnitDynFlags flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_objectData).ModifyValue(m_objectData.DynamicFlags), (uint)flag); } + public void RemoveDynamicFlag(UnitDynFlags flag) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_objectData).ModifyValue(m_objectData.DynamicFlags), (uint)flag); } + public void SetDynamicFlags(UnitDynFlags flag) { SetUpdateFieldValue(m_values.ModifyValue(m_objectData).ModifyValue(m_objectData.DynamicFlags), (uint)flag); } public TypeId GetTypeId() { return objectTypeId; } public bool IsTypeId(TypeId typeId) { return GetTypeId() == typeId; } @@ -2276,9 +1696,6 @@ namespace Game.Entities public virtual bool hasQuest(uint questId) { return false; } public virtual bool hasInvolvedQuest(uint questId) { return false; } - public void SetFieldNotifyFlag(uint flag) { _fieldNotifyFlags |= flag; } - public void RemoveFieldNotifyFlag(uint flag) { _fieldNotifyFlags &= ~flag; } - public bool IsCreature() { return GetTypeId() == TypeId.Unit; } public bool IsPlayer() { return GetTypeId() == TypeId.Player; } public bool IsGameObject() { return GetTypeId() == TypeId.GameObject; } @@ -2901,18 +2318,13 @@ namespace Game.Entities public TypeMask objectTypeMask { get; set; } protected TypeId objectTypeId { get; set; } protected CreateObjectBits m_updateFlag; + ObjectGuid m_guid; - protected UpdateValues[] updateValues; - protected uint[][] _dynamicValues; - protected BitArray _changesMask { get; set; } - protected Dictionary _dynamicChangesMask = new Dictionary(); - protected BitArray[] _dynamicChangesArrayMask; + public UpdateFieldHolder m_values; + public ObjectFieldData m_objectData; - public uint valuesCount; - protected uint _dynamicValuesCount; public uint LastUsedScriptID; - protected uint _fieldNotifyFlags { get; set; } bool m_objectUpdated; public MovementInfo m_movementInfo; @@ -2949,19 +2361,6 @@ namespace Game.Entities } } - [StructLayout(LayoutKind.Explicit)] - public struct UpdateValues - { - [FieldOffset(0)] - public uint UnsignedValue; - - [FieldOffset(0)] - public int SignedValue; - - [FieldOffset(0)] - public float FloatValue; - } - public class MovementInfo { public MovementInfo() diff --git a/Source/Game/Entities/Pet.cs b/Source/Game/Entities/Pet.cs index 3747b9c8a..23eab8a64 100644 --- a/Source/Game/Entities/Pet.cs +++ b/Source/Game/Entities/Pet.cs @@ -174,8 +174,8 @@ namespace Game.Entities PhasingHandler.InheritPhaseShift(this, owner); setPetType(petType); - SetFaction(owner.getFaction()); - SetUInt32Value(UnitFields.CreatedBySpell, summonSpellId); + SetFaction(owner.GetFaction()); + SetCreatedBySpell(summonSpellId); float px, py, pz; if (IsCritter()) @@ -199,7 +199,8 @@ namespace Game.Entities SetDisplayId(result.Read(3)); SetNativeDisplayId(result.Read(3)); uint petlevel = result.Read(4); - SetUInt64Value(UnitFields.NpcFlags, (ulong)NPCFlags.None); + SetNpcFlags(NPCFlags.None); + SetNpcFlags2(NPCFlags2.None); SetName(result.Read(8)); switch (getPetType()) @@ -207,16 +208,15 @@ namespace Game.Entities case PetType.Summon: petlevel = owner.getLevel(); - SetByteValue(UnitFields.Bytes0, 1, (byte)Class.Mage); - SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); // this enables popup window (pet dismiss, cancel) + SetClass(Class.Mage); + SetUnitFlags(UnitFlags.PvpAttackable); // this enables popup window (pet dismiss, cancel) break; case PetType.Hunter: - SetByteValue(UnitFields.Bytes0, 1, (byte)Class.Warrior); - SetByteValue(UnitFields.Bytes0, 3, (byte)Gender.None); + SetClass(Class.Warrior); + SetGender(Gender.None); SetSheath(SheathState.Melee); - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, (result.Read(9) ? UnitPetFlags.CanBeAbandoned : UnitPetFlags.CanBeRenamed | UnitPetFlags.CanBeAbandoned)); - - SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); // this enables popup window (pet abandon, cancel) + SetPetFlags(result.Read(9) ? UnitPetFlags.CanBeAbandoned : UnitPetFlags.CanBeRenamed | UnitPetFlags.CanBeAbandoned); + SetUnitFlags(UnitFlags.PvpAttackable); // this enables popup window (pet abandon, cancel) break; default: if (!IsPetGhoul()) @@ -224,11 +224,11 @@ namespace Game.Entities break; } - SetUInt32Value(UnitFields.PetNameTimestamp, (uint)Time.UnixTime); // cast can't be helped here + SetPetNameTimestamp((uint)Time.UnixTime); // cast can't be helped here SetCreatorGUID(owner.GetGUID()); InitStatsForLevel(petlevel); - SetUInt32Value(UnitFields.PetExperience, result.Read(5)); + SetPetExperience(result.Read(5)); SynchronizeLevelWithOwner(); @@ -443,16 +443,16 @@ namespace Game.Entities stmt.AddValue(2, ownerLowGUID); stmt.AddValue(3, GetNativeDisplayId()); stmt.AddValue(4, getLevel()); - stmt.AddValue(5, GetUInt32Value(UnitFields.PetExperience)); + stmt.AddValue(5, (uint)m_unitData.PetExperience); stmt.AddValue(6, GetReactState()); stmt.AddValue(7, mode); stmt.AddValue(8, GetName()); - stmt.AddValue(9, HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, UnitPetFlags.CanBeRenamed) ? 0 : 1); + stmt.AddValue(9, HasPetFlag(UnitPetFlags.CanBeRenamed) ? 0 : 1); stmt.AddValue(10, curhealth); stmt.AddValue(11, curmana); stmt.AddValue(12, GenerateActionBarData()); stmt.AddValue(13, Time.UnixTime); - stmt.AddValue(14, GetUInt32Value(UnitFields.CreatedBySpell)); + stmt.AddValue(14, (uint)m_unitData.CreatedBySpell); stmt.AddValue(15, getPetType()); stmt.AddValue(16, m_petSpecialization); trans.Append(stmt); @@ -510,8 +510,8 @@ namespace Game.Entities if (getPetType() == PetType.Hunter) { // pet corpse non lootable and non skinnable - SetUInt32Value(ObjectFields.DynamicFlags, (uint)UnitDynFlags.None); - RemoveFlag(UnitFields.Flags, UnitFlags.Skinnable); + SetDynamicFlags(UnitDynFlags.None); + RemoveUnitFlag(UnitFlags.Skinnable); } } else if (getDeathState() == DeathState.Alive) @@ -626,8 +626,8 @@ namespace Game.Entities if (petlevel >= maxlevel) return; - uint nextLvlXP = GetUInt32Value(UnitFields.PetNextLevelExp); - uint curXP = GetUInt32Value(UnitFields.PetExperience); + uint nextLvlXP = m_unitData.PetNextLevelExperience; + uint curXP = m_unitData.PetExperience; uint newXP = curXP + xp; // Check how much XP the pet should receive, and hand off have any left from previous levelups @@ -639,10 +639,10 @@ namespace Game.Entities GivePetLevel((int)petlevel); - nextLvlXP = GetUInt32Value(UnitFields.PetNextLevelExp); + nextLvlXP = m_unitData.PetNextLevelExperience; } // Not affected by special conditions - give it new XP - SetUInt32Value(UnitFields.PetExperience, petlevel < maxlevel ? newXP : 0); + SetPetExperience(petlevel < maxlevel ? newXP : 0); } public void GivePetLevel(int level) @@ -652,8 +652,8 @@ namespace Game.Entities if (getPetType() == PetType.Hunter) { - SetUInt32Value(UnitFields.PetExperience, 0); - SetUInt32Value(UnitFields.PetNextLevelExp, (uint)(Global.ObjectMgr.GetXPForLevel((uint)level) * PetXPFactor)); + SetPetExperience(0); + SetPetNextLevelExperience((uint)(Global.ObjectMgr.GetXPForLevel((uint)level) * PetXPFactor)); } InitStatsForLevel((uint)level); @@ -712,18 +712,19 @@ namespace Game.Entities if (!Create(map.GenerateLowGuid(HighGuid.Pet), map, cinfo.Entry)) return false; - SetUInt32Value(UnitFields.PetNameTimestamp, 0); - SetUInt32Value(UnitFields.PetExperience, 0); - SetUInt32Value(UnitFields.PetNextLevelExp, (uint)(Global.ObjectMgr.GetXPForLevel(getLevel() + 1) * PetXPFactor)); - SetUInt64Value(UnitFields.NpcFlags, (ulong)NPCFlags.None); + SetPetNameTimestamp(0); + SetPetExperience(0); + SetPetNextLevelExperience((uint)(Global.ObjectMgr.GetXPForLevel(getLevel() + 1) * PetXPFactor)); + SetNpcFlags(NPCFlags.None); + SetNpcFlags2(NPCFlags2.None); if (cinfo.CreatureType == CreatureType.Beast) { - SetByteValue(UnitFields.Bytes0, 1, (byte)Class.Warrior); - SetByteValue(UnitFields.Bytes0, 3, (byte)Gender.None); - SetUInt32Value(UnitFields.DisplayPower, (uint)PowerType.Focus); + SetClass(Class.Warrior); + SetGender(Gender.None); + SetPowerType(PowerType.Focus); SetSheath(SheathState.Melee); - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, (UnitPetFlags.CanBeRenamed | UnitPetFlags.CanBeAbandoned)); + SetPetFlags(UnitPetFlags.CanBeRenamed | UnitPetFlags.CanBeAbandoned); } return true; @@ -1347,7 +1348,7 @@ namespace Game.Entities return false; // Force regen flag for player pets, just like we do for players themselves - SetFlag(UnitFields.Flags2, UnitFlags2.RegeneratePower); + AddUnitFlag2(UnitFlags2.RegeneratePower); SetSheath(SheathState.Melee); return true; @@ -1472,7 +1473,7 @@ namespace Game.Entities } public PetType getPetType() { return m_petType; } - void setPetType(PetType type) { m_petType = type; } + public void setPetType(PetType type) { m_petType = type; } public bool isControlled() { return getPetType() == PetType.Summon || getPetType() == PetType.Hunter; } public bool isTemporarySummoned() { return m_duration > 0; } @@ -1490,6 +1491,9 @@ namespace Game.Entities public void SetDuration(uint dur) { m_duration = (int)dur; } public int GetDuration() { return m_duration; } + public void SetPetExperience(uint xp) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetExperience), xp); } + public void SetPetNextLevelExperience(uint xp) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetNextLevelExperience), xp); } + public ushort GetSpecialization() { return m_petSpecialization; } public GroupUpdatePetFlags GetGroupUpdateFlag() { return m_groupUpdateMask; } diff --git a/Source/Game/Entities/Player/CollectionManager.cs b/Source/Game/Entities/Player/CollectionManager.cs index 64101c74f..6ada6fc9b 100644 --- a/Source/Game/Entities/Player/CollectionManager.cs +++ b/Source/Game/Entities/Player/CollectionManager.cs @@ -69,15 +69,15 @@ namespace Game.Entities public void LoadToys() { - foreach (var value in _toys.Keys) - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, value); + foreach (var pair in _toys) + _owner.GetPlayer().AddToy(pair.Key, (uint)pair.Value); } public bool AddToy(uint itemId, bool isFavourite, bool hasFanfare) { if (UpdateAccountToys(itemId, isFavourite, hasFanfare)) { - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, itemId); + _owner.GetPlayer().AddToy(itemId, (uint)GetToyFlags(isFavourite, hasFanfare)); return true; } @@ -92,8 +92,7 @@ namespace Game.Entities do { uint itemId = result.Read(0); - - _toys[itemId] = GetToyFlags(result.Read(1), result.Read(2)); + _toys.Add(itemId, GetToyFlags(result.Read(1), result.Read(2))); } while (result.NextRow()); } @@ -175,7 +174,9 @@ namespace Game.Entities uint bonusId = 0; - if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel110)) + if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel120)) + bonusId = heirloom.UpgradeItemBonusListID[3]; + else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel110)) bonusId = heirloom.UpgradeItemBonusListID[2]; else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel100)) bonusId = heirloom.UpgradeItemBonusListID[1]; @@ -220,19 +221,13 @@ namespace Game.Entities public void LoadHeirlooms() { foreach (var item in _heirlooms) - { - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Heirlooms, item.Key); - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.HeirloomFlags, (uint)item.Value.flags); - } + _owner.GetPlayer().AddHeirloom(item.Key, (uint)item.Value.flags); } public void AddHeirloom(uint itemId, HeirloomPlayerFlags flags) { if (UpdateAccountHeirlooms(itemId, flags)) - { - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Heirlooms, itemId); - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.HeirloomFlags, (uint)flags); - } + _owner.GetPlayer().AddHeirloom(itemId, (uint)flags); } public void UpgradeHeirloom(uint itemId, uint castItem) @@ -267,15 +262,20 @@ namespace Game.Entities flags |= HeirloomPlayerFlags.BonusLevel110; bonusId = heirloom.UpgradeItemBonusListID[2]; } + if (heirloom.UpgradeItemID[3] == castItem) + { + flags |= HeirloomPlayerFlags.BonusLevel120; + bonusId = heirloom.UpgradeItemBonusListID[3]; + } foreach (Item item in player.GetItemListByEntry(itemId, true)) item.AddBonuses(bonusId); // Get heirloom offset to update only one part of dynamic field - var fields = player.GetDynamicValues(ActivePlayerDynamicFields.Heirlooms); - ushort offset = (ushort)Array.IndexOf(fields, itemId); + List heirlooms = player.m_activePlayerData.Heirlooms; + int offset = heirlooms.IndexOf(itemId); - player.SetDynamicValue(ActivePlayerDynamicFields.HeirloomFlags, offset, (uint)flags); + player.SetHeirloomFlags(offset, (uint)flags); data.flags = flags; data.bonusId = bonusId; } @@ -315,11 +315,11 @@ namespace Game.Entities if (newItemId != 0) { - var heirloomFields = player.GetDynamicValues(ActivePlayerDynamicFields.Heirlooms); - ushort offset = (ushort)Array.IndexOf(heirloomFields, item.GetEntry()); + List heirlooms = player.m_activePlayerData.Heirlooms; + int offset = heirlooms.IndexOf(item.GetEntry()); - player.SetDynamicValue(ActivePlayerDynamicFields.Heirlooms, offset, newItemId); - player.SetDynamicValue(ActivePlayerDynamicFields.HeirloomFlags, offset, 0); + player.SetHeirloom(offset, newItemId); + player.SetHeirloomFlags(offset, 0); _heirlooms.Remove(item.GetEntry()); _heirlooms[newItemId] = null; @@ -327,12 +327,17 @@ namespace Game.Entities return; } - var fields = item.GetDynamicValues(ItemDynamicFields.BonusListIds); - foreach (uint bonusId in fields) + List bonusListIDs = item.m_itemData.BonusListIDs; + foreach (uint bonusId in bonusListIDs) + { if (bonusId != data.bonusId) - item.ClearDynamicValue(ItemDynamicFields.BonusListIds); + { + item.ClearBonuses(); + break; + } + } - if (!fields.Contains(data.bonusId)) + if (!bonusListIDs.Contains(data.bonusId)) item.AddBonuses(data.bonusId); } } @@ -346,6 +351,8 @@ namespace Game.Entities if (data == null) return false; + if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel120)) + return level <= 120; if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel110)) return level <= 110; if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel100)) @@ -453,13 +460,12 @@ namespace Game.Entities public void LoadItemAppearances() { + Player owner = _owner.GetPlayer(); foreach (uint blockValue in _appearances.ToBlockRange()) - { - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Transmog, blockValue); - } + owner.AddTransmogBlock(blockValue); foreach (var value in _temporaryAppearances.Keys) - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.ConditionalTransmog, value); + owner.AddConditionalTransmog(value); } public void LoadAccountItemAppearances(SQLResult knownAppearances, SQLResult favoriteAppearances) @@ -578,7 +584,7 @@ namespace Game.Entities if (!CanAddAppearance(itemModifiedAppearance)) return; - if (Convert.ToBoolean(item.GetUInt32Value(ItemFields.Flags) & (uint)(ItemFieldFlags.BopTradeable | ItemFieldFlags.Refundable))) + if (item.HasItemFlag(ItemFieldFlags.BopTradeable | ItemFieldFlags.Refundable)) { AddTemporaryAppearance(item.GetGUID(), itemModifiedAppearance); return; @@ -678,24 +684,24 @@ namespace Game.Entities //todo check this void AddItemAppearance(ItemModifiedAppearanceRecord itemModifiedAppearance) { + Player owner = _owner.GetPlayer(); if (_appearances.Count <= itemModifiedAppearance.Id) { uint numBlocks = (uint)(_appearances.Count << 2); _appearances.Length = (int)itemModifiedAppearance.Id + 1; numBlocks = (uint)(_appearances.Count << 2) - numBlocks; while (numBlocks-- != 0) - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Transmog, 0); + owner.AddTransmogBlock(0); } _appearances.Set((int)itemModifiedAppearance.Id, true); uint blockIndex = itemModifiedAppearance.Id / 32; uint bitIndex = itemModifiedAppearance.Id % 32; - uint currentMask = _owner.GetPlayer().GetDynamicValue(ActivePlayerDynamicFields.Transmog, (ushort)blockIndex); - _owner.GetPlayer().SetDynamicValue(ActivePlayerDynamicFields.Transmog, (ushort)blockIndex, (uint)((int)currentMask | (1 << (int)bitIndex))); + owner.AddTransmogFlag((int)blockIndex, 1u << (int)bitIndex); var temporaryAppearance = _temporaryAppearances.LookupByKey(itemModifiedAppearance.Id); if (!temporaryAppearance.Empty()) { - _owner.GetPlayer().RemoveDynamicValue(ActivePlayerDynamicFields.ConditionalTransmog, itemModifiedAppearance.Id); + owner.RemoveConditionalTransmog(itemModifiedAppearance.Id); _temporaryAppearances.Remove(itemModifiedAppearance.Id); } @@ -717,7 +723,7 @@ namespace Game.Entities { var itemsWithAppearance = _temporaryAppearances[itemModifiedAppearance.Id]; if (itemsWithAppearance.Empty()) - _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.ConditionalTransmog, itemModifiedAppearance.Id); + _owner.GetPlayer().AddConditionalTransmog(itemModifiedAppearance.Id); itemsWithAppearance.Add(itemGuid); } @@ -735,7 +741,7 @@ namespace Game.Entities guid.Remove(item.GetGUID()); if (guid.Empty()) { - _owner.GetPlayer().RemoveDynamicValue(ActivePlayerDynamicFields.ConditionalTransmog, itemModifiedAppearance.Id); + _owner.GetPlayer().RemoveConditionalTransmog(itemModifiedAppearance.Id); _temporaryAppearances.Remove(itemModifiedAppearance.Id); } } diff --git a/Source/Game/Entities/Player/Player.Combat.cs b/Source/Game/Entities/Player/Player.Combat.cs index 043877b12..9de1f5a9a 100644 --- a/Source/Game/Entities/Player/Player.Combat.cs +++ b/Source/Game/Entities/Player/Player.Combat.cs @@ -88,21 +88,9 @@ namespace Game.Entities SendPacket(packet); } - bool CanTitanGrip() { return m_canTitanGrip; } + public override uint GetBlockPercent() { return m_activePlayerData.ShieldBlock; } - public override bool CanUseAttackType(WeaponAttackType attacktype) - { - switch (attacktype) - { - case WeaponAttackType.BaseAttack: - return !HasFlag(UnitFields.Flags, UnitFlags.Disarmed); - case WeaponAttackType.OffAttack: - return !HasFlag(UnitFields.Flags2, UnitFlags2.DisarmOffhand); - case WeaponAttackType.RangedAttack: - return !HasFlag(UnitFields.Flags2, UnitFlags2.DisarmRanged); - } - return true; - } + bool CanTitanGrip() { return m_canTitanGrip; } float GetRatingMultiplier(CombatRating cr) { @@ -118,7 +106,7 @@ namespace Game.Entities } public float GetRatingBonusValue(CombatRating cr) { - float baseResult = GetFloatValue(ActivePlayerFields.CombatRating + (int)cr) * GetRatingMultiplier(cr); + float baseResult = m_activePlayerData.CombatRatings[(int)cr] * GetRatingMultiplier(cr); if (cr != CombatRating.ResiliencePlayerDamage) return baseResult; return (float)(1.0f - Math.Pow(0.99f, baseResult)) * 100.0f; @@ -189,9 +177,9 @@ namespace Game.Entities switch (attType) { case WeaponAttackType.BaseAttack: - return baseExpertise + GetUInt32Value(ActivePlayerFields.Expertise) / 4.0f; + return baseExpertise + m_activePlayerData.MainhandExpertise / 4.0f; case WeaponAttackType.OffAttack: - return baseExpertise + GetUInt32Value(ActivePlayerFields.OffhandExpertise) / 4.0f; + return baseExpertise + m_activePlayerData.OffhandExpertise / 4.0f; default: break; } @@ -201,7 +189,7 @@ namespace Game.Entities public bool IsUseEquipedWeapon(bool mainhand) { // disarm applied only to mainhand weapon - return !IsInFeralForm() && (!mainhand || !HasFlag(UnitFields.Flags, UnitFlags.Disarmed)); + return !IsInFeralForm() && (!mainhand || !HasUnitFlag(UnitFlags.Disarmed)); } public void SetCanTitanGrip(bool value, uint penaltySpellId = 0) @@ -321,8 +309,8 @@ namespace Game.Entities Global.ScriptMgr.OnPlayerDuelStart(this, duel.opponent); - SetUInt32Value(PlayerFields.DuelTeam, 1); - duel.opponent.SetUInt32Value(PlayerFields.DuelTeam, 2); + SetDuelTeam(1); + duel.opponent.SetDuelTeam(2); duel.startTimer = 0; duel.startTime = currTime; @@ -335,7 +323,7 @@ namespace Game.Entities if (duel == null) return; - ObjectGuid duelFlagGUID = GetGuidValue(PlayerFields.DuelArbiter); + ObjectGuid duelFlagGUID = m_playerData.DuelArbiter; GameObject obj = GetMap().GetGameObject(duelFlagGUID); if (!obj) return; @@ -439,7 +427,7 @@ namespace Game.Entities duel.opponent.CastSpell(duel.opponent, 52852, true); //Remove Duel Flag object - GameObject obj = GetMap().GetGameObject(GetGuidValue(PlayerFields.DuelArbiter)); + GameObject obj = GetMap().GetGameObject(m_playerData.DuelArbiter); if (obj) duel.initiator.RemoveGameObject(obj, true); @@ -465,14 +453,16 @@ namespace Game.Entities duel.opponent.ClearComboPoints(); //cleanups - SetGuidValue(PlayerFields.DuelArbiter, ObjectGuid.Empty); - SetUInt32Value(PlayerFields.DuelTeam, 0); - duel.opponent.SetGuidValue(PlayerFields.DuelArbiter, ObjectGuid.Empty); - duel.opponent.SetUInt32Value(PlayerFields.DuelTeam, 0); + SetDuelArbiter(ObjectGuid.Empty); + SetDuelTeam(0); + duel.opponent.SetDuelArbiter(ObjectGuid.Empty); + duel.opponent.SetDuelTeam(0); duel.opponent.duel = null; duel = null; } + public void SetDuelArbiter(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.DuelArbiter), guid); } + void SetDuelTeam(uint duelTeam) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.DuelTeam), duelTeam); } //PVP public void SetPvPDeath(bool on) @@ -488,7 +478,7 @@ namespace Game.Entities public void ResetContestedPvP() { ClearUnitState(UnitState.AttackPlayer); - RemoveFlag(PlayerFields.Flags, PlayerFlags.ContestedPVP); + RemovePlayerFlag(PlayerFlags.ContestedPVP); m_contestedPvPTimer = 0; } void UpdateAfkReport(long currTime) @@ -547,16 +537,16 @@ namespace Game.Entities { if (!IsFFAPvP()) { - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + AddPvpFlag(UnitPVPStateFlags.FFAPvp); foreach (var unit in m_Controlled) - unit.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (byte)UnitBytes2Flags.FFAPvp); + unit.AddPvpFlag(UnitPVPStateFlags.FFAPvp); } } else if (IsFFAPvP()) { - RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + RemovePvpFlag(UnitPVPStateFlags.FFAPvp); foreach (var unit in m_Controlled) - unit.RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + unit.RemovePvpFlag(UnitPVPStateFlags.FFAPvp); } if (onlyFFA) @@ -569,7 +559,7 @@ namespace Game.Entities } else // in friendly area { - if (IsPvP() && !HasFlag(PlayerFields.Flags, PlayerFlags.InPVP) && pvpInfo.EndTimer == 0) + if (IsPvP() && !HasPlayerFlag(PlayerFlags.InPVP) && pvpInfo.EndTimer == 0) pvpInfo.EndTimer = Time.UnixTime; // start toggle-off } } diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 31adfd876..7d52a4ff1 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -41,13 +41,13 @@ namespace Game.Entities { // 0 1 2 3 4 5 // SELECT a.itemGuid, a.xp, a.artifactAppearanceId, a.artifactTierId, ap.artifactPowerId, ap.purchasedRank FROM item_instance_artifact_powers ap LEFT JOIN item_instance_artifact a ON ap.itemGuid = a.itemGuid INNER JOIN character_inventory ci ON ci.item = ap.guid WHERE ci.guid = ? - var artifactData = new Dictionary>>(); + var artifactData = new Dictionary>>(); if (!artifactsResult.IsEmpty()) { do { - var artifactDataEntry = Tuple.Create(artifactsResult.Read(1), artifactsResult.Read(2), artifactsResult.Read(3), new List()); - ItemDynamicFieldArtifactPowers artifactPowerData = new ItemDynamicFieldArtifactPowers(); + var artifactDataEntry = Tuple.Create(artifactsResult.Read(1), artifactsResult.Read(2), artifactsResult.Read(3), new List()); + ArtifactPowerLoadInfo artifactPowerData = new ArtifactPowerLoadInfo(); artifactPowerData.ArtifactPowerId = artifactsResult.Read(4); artifactPowerData.PurchasedRank = artifactsResult.Read(5); @@ -91,17 +91,17 @@ namespace Game.Entities if (item.GetTemplate().GetArtifactID() != 0 && artifactDataPair != null) item.LoadArtifactData(this, artifactDataPair.Item1, artifactDataPair.Item2, artifactDataPair.Item3, artifactDataPair.Item4); - ulong counter = result.Read(45); + ulong counter = result.Read(44); ObjectGuid bagGuid = counter != 0 ? ObjectGuid.Create(HighGuid.Item, counter) : ObjectGuid.Empty; - byte slot = result.Read(46); + byte slot = result.Read(45); GetSession().GetCollectionMgr().CheckHeirloomUpgrades(item); GetSession().GetCollectionMgr().AddItemAppearance(item); InventoryResult err = InventoryResult.Ok; - if (item.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + if (item.HasItemFlag(ItemFieldFlags.Child)) { - Item parent = GetItemByGuid(item.GetGuidValue(ItemFields.Creator)); + Item parent = GetItemByGuid(item.GetCreator()); if (parent) { parent.SetChildItem(item.GetGUID()); @@ -242,7 +242,7 @@ namespace Game.Entities GetGUID().ToString(), GetName(), timeDiff, item.GetGUID().ToString(), item.GetEntry()); remove = true; } - if (item.HasFlag((int)ItemFields.Flags, ItemFieldFlags.Refundable)) + if (item.HasItemFlag(ItemFieldFlags.Refundable)) { if (item.GetPlayedTime() > (2 * Time.Hour)) { @@ -253,7 +253,7 @@ namespace Game.Entities stmt.AddValue(0, item.GetGUID().ToString()); trans.Append(stmt); - item.RemoveFlag(ItemFields.Flags, ItemFieldFlags.Refundable); + item.RemoveItemFlag(ItemFieldFlags.Refundable); } else { @@ -272,11 +272,11 @@ namespace Game.Entities { Log.outDebug(LogFilter.Player, "LoadInventory: player (GUID: {0}, name: {1}) has item (GUID: {2}, entry: {3}) with refundable flags, but without data in item_refund_instance. Removing flag.", GetGUID().ToString(), GetName(), item.GetGUID().ToString(), item.GetEntry()); - item.RemoveFlag(ItemFields.Flags, ItemFieldFlags.Refundable); + item.RemoveItemFlag(ItemFieldFlags.Refundable); } } } - else if (item.HasFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable)) + else if (item.HasItemFlag(ItemFieldFlags.BopTradeable)) { stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_ITEM_BOP_TRADE); stmt.AddValue(0, item.GetGUID().ToString()); @@ -304,7 +304,7 @@ namespace Game.Entities { Log.outDebug(LogFilter.ServerLoading, "LoadInventory: player ({0}, name: {1}) has item ({2}, entry: {3}) with ITEM_FLAG_BOP_TRADEABLE flag, " + "but without data in item_soulbound_trade_data. Removing flag.", GetGUID().ToString(), GetName(), item.GetGUID().ToString(), item.GetEntry()); - item.RemoveFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable); + item.RemoveItemFlag(ItemFieldFlags.BopTradeable); } } else if (proto.GetHolidayID() != 0) @@ -348,12 +348,18 @@ namespace Game.Entities } void _LoadSkills(SQLResult result) { - var count = 0; + uint count = 0; Dictionary loadedSkillValues = new Dictionary(); if (!result.IsEmpty()) { do { + if (mSkillStatus.Count >= SkillConst.MaxPlayerSkills) // client limit + { + Log.outError(LogFilter.Player, $"Player::_LoadSkills: Player '{GetName()}' ({GetGUID().ToString()}) has more than {SkillConst.MaxPlayerSkills} skills."); + break; + } + var skill = result.Read(0); var value = result.Read(1); var max = result.Read(2); @@ -382,20 +388,11 @@ namespace Game.Entities default: break; } - if (value == 0) - { - Log.outError(LogFilter.Player, "Character {0} has skill {1} with value 0. Will be deleted.", GetGUID().ToString(), skill); - PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHARACTER_SKILL); - stmt.AddValue(0, GetGUID().GetCounter()); - stmt.AddValue(1, skill); - DB.Characters.Execute(stmt); - continue; - } - var field = (ushort)(count / 2); - var offset = (byte)(count & 1); + if (!mSkillStatus.ContainsKey(skill)) + mSkillStatus.Add(skill, new SkillStatusData((uint)mSkillStatus.Count, SkillState.Unchanged)); - SetUInt16Value(ActivePlayerFields.SkillLineId + field, offset, skill); + var skillStatusData = mSkillStatus[skill]; ushort step = 0; SkillLineRecord skillLine = CliDB.SkillLineStorage.LookupByKey(rcEntry.SkillID); @@ -412,49 +409,48 @@ namespace Game.Entities { int professionSlot = FindProfessionSlotFor(skill); if (professionSlot != -1) - SetUInt32Value(ActivePlayerFields.ProfessionSkillLine + professionSlot, skill); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ProfessionSkillLine, (int)professionSlot), skill); } } } - SetUInt16Value(ActivePlayerFields.SkillLineStep + field, offset, step); - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, value); - SetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset, max); - SetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset, 0); - mSkillStatus.Add(skill, new SkillStatusData((uint)count, SkillState.Unchanged)); + SetSkillLineId(skillStatusData.Pos, skill); + SetSkillStep(skillStatusData.Pos, step); + SetSkillRank(skillStatusData.Pos, value); + SetSkillStartingRank(skillStatusData.Pos, 1); + SetSkillMaxRank(skillStatusData.Pos, max); + SetSkillTempBonus(skillStatusData.Pos, 0); + SetSkillPermBonus(skillStatusData.Pos, 0); loadedSkillValues[skill] = value; - count++; - - if (count >= SkillConst.MaxPlayerSkills) // client limit - { - Log.outError(LogFilter.Player, "Character {0} has more than {1} skills.", GetGUID().ToString(), SkillConst.MaxPlayerSkills); - break; - } } while (result.NextRow()); } // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB foreach (var skill in loadedSkillValues) + { LearnSkillRewardedSpells(skill.Key, skill.Value); + List childSkillLines = Global.DB2Mgr.GetSkillLinesForParentSkill(skill.Key); + if (childSkillLines != null) + { + foreach (var childItr in childSkillLines) + { + if (mSkillStatus.Count >= SkillConst.MaxPlayerSkills) + break; + + if (!mSkillStatus.ContainsKey(childItr.Id)) + { + SetSkillLineId(count, (ushort)childItr.Id); + SetSkillStartingRank(count, 1); + mSkillStatus.Add(childItr.Id, new SkillStatusData(count, SkillState.Unchanged)); + } + } + } + } if (HasSkill(SkillType.FistWeapons)) SetSkill(SkillType.FistWeapons, 0, GetSkillValue(SkillType.Unarmed), GetMaxSkillValueForLevel()); - - for (; count < SkillConst.MaxPlayerSkills; count++) - { - var field = (ushort)(count / 2); - var offset = (byte)(count & 1); - - SetUInt16Value(ActivePlayerFields.SkillLineId + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineStep + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset, 0); - } } void _LoadSpells(SQLResult result) { @@ -715,7 +711,7 @@ namespace Game.Entities int maxStorageIndex = 0; foreach (QuestObjective obj in quest.Objectives) if (obj.StorageIndex > maxStorageIndex) - maxStorageIndex = obj.StorageIndex; + maxStorageIndex = obj.StorageIndex; questStatusData.ObjectiveData = new int[maxStorageIndex + 1]; @@ -849,7 +845,7 @@ namespace Game.Entities if (quest == null) continue; - AddDynamicValue(ActivePlayerDynamicFields.DailyQuests, quest_id); + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DailyQuestsCompleted), quest_id); uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(quest_id); if (questBit != 0) SetQuestCompletedBit(questBit, true); @@ -1006,7 +1002,10 @@ namespace Game.Entities if (!result.IsEmpty() && !HasAtLoginFlag(AtLoginFlags.Resurrect)) { _corpseLocation = new WorldLocation(result.Read(0), result.Read(1), result.Read(2), result.Read(3), result.Read(4)); - ApplyModFlag(ActivePlayerFields.LocalFlags, PlayerLocalFlags.ReleaseTimer, !CliDB.MapStorage.LookupByKey(_corpseLocation.GetMapId()).Instanceable()); + if (!CliDB.MapStorage.LookupByKey(_corpseLocation.GetMapId()).Instanceable()) + AddPlayerLocalFlag(PlayerLocalFlags.ReleaseTimer); + else + RemovePlayerLocalFlag(PlayerLocalFlags.ReleaseTimer); } else ResurrectPlayer(0.5f); @@ -1093,19 +1092,18 @@ namespace Game.Entities do { - // SELECT itemId, itemEntry, slot, creatorGuid, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? + // SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? ulong itemId = result.Read(0); uint itemEntry = result.Read(1); byte slot = result.Read(2); ObjectGuid creatorGuid = result.Read(3) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read(3)) : ObjectGuid.Empty; - ItemRandomEnchantmentId randomProperty = new ItemRandomEnchantmentId((ItemRandomEnchantmentType)result.Read(4), result.Read(5)); - uint suffixFactor = result.Read(6); - uint upgradeId = result.Read(7); - uint fixedScalingLevel = result.Read(8); - uint artifactKnowledgeLevel = result.Read(9); - byte context = result.Read(10); + uint randomBonusListId = result.Read(4); + uint upgradeId = result.Read(5); + uint fixedScalingLevel = result.Read(6); + uint artifactKnowledgeLevel = result.Read(7); + byte context = result.Read(8); List bonusListIDs = new List(); - var bonusListIdTokens = new StringArray(result.Read(11), ' '); + var bonusListIdTokens = new StringArray(result.Read(9), ' '); for (var i = 0; i < bonusListIdTokens.Length; ++i) { if (uint.TryParse(bonusListIdTokens[i], out uint id)) @@ -1130,7 +1128,7 @@ namespace Game.Entities continue; } - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs); + _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs); BonusData bonus = new BonusData(new ItemInstance(_voidStorageItems[slot])); @@ -1224,7 +1222,7 @@ namespace Game.Entities } Item item = Bag.NewItemOrBag(proto); - ObjectGuid ownerGuid = result.Read(45) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read(45)) : ObjectGuid.Empty; + ObjectGuid ownerGuid = result.Read(44) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read(44)) : ObjectGuid.Empty; if (!item.LoadFromDB(itemGuid, ownerGuid, result.GetFields(), itemEntry)) { Log.outError(LogFilter.Player, "Player:_LoadMailedItems - Item in mail ({0}) doesn't exist !!!! - item guid: {1}, deleted from mail", mail.messageID, itemGuid); @@ -1297,7 +1295,7 @@ namespace Game.Entities if (group) { if (group.IsLeader(GetGUID())) - SetFlag(PlayerFields.Flags, PlayerFlags.GroupLeader); + AddPlayerFlag(PlayerFlags.GroupLeader); byte subgroup = group.GetMemberGroup(GetGUID()); SetGroup(group, subgroup); @@ -1312,7 +1310,7 @@ namespace Game.Entities } if (!GetGroup() || !GetGroup().IsLeader(GetGUID())) - RemoveFlag(PlayerFields.Flags, PlayerFlags.GroupLeader); + RemovePlayerFlag(PlayerFlags.GroupLeader); } void _LoadInstanceTimeRestrictions(SQLResult result) { @@ -1375,10 +1373,10 @@ namespace Game.Entities eqSet.Data.Guid = result.Read(0); eqSet.Data.Type = EquipmentSetInfo.EquipmentSetType.Transmog; - eqSet.Data.SetID = result.Read (1); - eqSet.Data.SetName = result.Read (2); - eqSet.Data.SetIcon = result.Read (3); - eqSet.Data.IgnoreMask = result.Read (4); + eqSet.Data.SetID = result.Read(1); + eqSet.Data.SetName = result.Read(2); + eqSet.Data.SetIcon = result.Read(3); + eqSet.Data.IgnoreMask = result.Read(4); eqSet.state = EquipmentSetUpdateState.Unchanged; eqSet.Data.Pieces.Fill(ObjectGuid.Empty); @@ -1563,34 +1561,22 @@ namespace Game.Entities { PreparedStatement stmt;// = null; - foreach (var skill in mSkillStatus.ToList()) + SkillInfo skillInfoField = m_activePlayerData.Skill; + + foreach (var pair in mSkillStatus.ToList()) { - if (skill.Value.State == SkillState.Unchanged) + if (pair.Value.State == SkillState.Unchanged) continue; - if (skill.Value.State == SkillState.Deleted) - { - stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHAR_SKILL_BY_SKILL); - stmt.AddValue(0, GetGUID().GetCounter()); - stmt.AddValue(1, skill.Key); - trans.Append(stmt); + ushort value = skillInfoField.SkillRank[pair.Value.Pos]; + ushort max = skillInfoField.SkillMaxRank[pair.Value.Pos]; - mSkillStatus.Remove(skill.Key); - continue; - } - - var field = (ushort)(skill.Value.Pos / 2); - var offset = (byte)(skill.Value.Pos & 1); - - var value = GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset); - var max = GetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset); - - switch (skill.Value.State) + switch (pair.Value.State) { case SkillState.New: stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CHAR_SKILLS); stmt.AddValue(0, GetGUID().GetCounter()); - stmt.AddValue(1, (ushort)skill.Key); + stmt.AddValue(1, (ushort)pair.Key); stmt.AddValue(2, value); stmt.AddValue(3, max); trans.Append(stmt); @@ -1600,13 +1586,19 @@ namespace Game.Entities stmt.AddValue(0, value); stmt.AddValue(1, max); stmt.AddValue(2, GetGUID().GetCounter()); - stmt.AddValue(3, (ushort)skill.Key); + stmt.AddValue(3, (ushort)pair.Key); + trans.Append(stmt); + break; + case SkillState.Deleted: + stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHAR_SKILL_BY_SKILL); + stmt.AddValue(0, GetGUID().GetCounter()); + stmt.AddValue(1, pair.Key); trans.Append(stmt); break; default: break; } - skill.Value.State = SkillState.Unchanged; + pair.Value.State = SkillState.Unchanged; } } void _SaveSpells(SQLTransaction trans) @@ -1888,10 +1880,8 @@ namespace Game.Entities // we don't need transactions here. PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHARACTER_QUESTSTATUS_DAILY); stmt.AddValue(0, GetGUID().GetCounter()); - trans.Append(stmt); - var dailies = GetDynamicValues(ActivePlayerDynamicFields.DailyQuests); - foreach (var questId in dailies) + foreach (int questId in m_activePlayerData.DailyQuestsCompleted) { stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CHARACTER_QUESTSTATUS_DAILY); stmt.AddValue(0, GetGUID().GetCounter()); @@ -2104,16 +2094,16 @@ namespace Game.Entities for (int i = 0; i < (int)SpellSchools.Max; ++i) stmt.AddValue(index++, GetResistance((SpellSchools)i) + GetBonusResistanceMod((SpellSchools)i)); - stmt.AddValue(index++, GetFloatValue(ActivePlayerFields.BlockPercentage)); - stmt.AddValue(index++, GetFloatValue(ActivePlayerFields.DodgePercentage)); - stmt.AddValue(index++, GetFloatValue(ActivePlayerFields.ParryPercentage)); - stmt.AddValue(index++, GetFloatValue(ActivePlayerFields.CritPercentage)); - stmt.AddValue(index++, GetFloatValue(ActivePlayerFields.RangedCritPercentage)); - stmt.AddValue(index++, GetFloatValue(ActivePlayerFields.SpellCritPercentage1)); - stmt.AddValue(index++, GetUInt32Value(UnitFields.AttackPower)); - stmt.AddValue(index++, GetUInt32Value(UnitFields.RangedAttackPower)); + stmt.AddValue(index++, (float)m_activePlayerData.BlockPercentage); + stmt.AddValue(index++, (float)m_activePlayerData.DodgePercentage); + stmt.AddValue(index++, (float)m_activePlayerData.ParryPercentage); + stmt.AddValue(index++, (float)m_activePlayerData.CritPercentage); + stmt.AddValue(index++, (float)m_activePlayerData.RangedCritPercentage); + stmt.AddValue(index++, (float)m_activePlayerData.SpellCritPercentage); + stmt.AddValue(index++, (int)m_unitData.AttackPower); + stmt.AddValue(index++, (int)m_unitData.RangedAttackPower); stmt.AddValue(index++, GetBaseSpellPowerBonus()); - stmt.AddValue(index, GetUInt32Value(ActivePlayerFields.CombatRating + (int)CombatRating.ResiliencePlayerDamage)); + stmt.AddValue(index, m_activePlayerData.CombatRatings[(int)CombatRating.ResiliencePlayerDamage]); trans.Append(stmt); } @@ -2239,25 +2229,23 @@ namespace Game.Entities else { - // REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + // REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) stmt = DB.Characters.GetPreparedStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM); stmt.AddValue(0, _voidStorageItems[i].ItemId); stmt.AddValue(1, GetGUID().GetCounter()); stmt.AddValue(2, _voidStorageItems[i].ItemEntry); stmt.AddValue(3, i); stmt.AddValue(4, _voidStorageItems[i].CreatorGuid.GetCounter()); - stmt.AddValue(5, (byte)_voidStorageItems[i].ItemRandomPropertyId.Type); - stmt.AddValue(6, _voidStorageItems[i].ItemRandomPropertyId.Id); - stmt.AddValue(7, _voidStorageItems[i].ItemSuffixFactor); - stmt.AddValue(8, _voidStorageItems[i].ItemUpgradeId); - stmt.AddValue(9, _voidStorageItems[i].FixedScalingLevel); - stmt.AddValue(10, _voidStorageItems[i].ArtifactKnowledgeLevel); - stmt.AddValue(11, _voidStorageItems[i].Context); + stmt.AddValue(5, (byte)_voidStorageItems[i].RandomBonusListId); + stmt.AddValue(6, _voidStorageItems[i].ItemUpgradeId); + stmt.AddValue(7, _voidStorageItems[i].FixedScalingLevel); + stmt.AddValue(8, _voidStorageItems[i].ArtifactKnowledgeLevel); + stmt.AddValue(9, _voidStorageItems[i].Context); StringBuilder bonusListIDs = new StringBuilder(); foreach (uint bonusListID in _voidStorageItems[i].BonusListIDs) bonusListIDs.AppendFormat("{0} ", bonusListID); - stmt.AddValue(12, bonusListIDs.ToString()); + stmt.AddValue(10, bonusListIDs.ToString()); } trans.Append(stmt); @@ -2383,19 +2371,18 @@ namespace Game.Entities } // overwrite possible wrong/corrupted guid - SetGuidValue(ObjectFields.Guid, guid); - SetGuidValue(PlayerFields.WowAccount, GetSession().GetAccountGUID()); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.WowAccount), GetSession().GetAccountGUID()); - uint gender = result.Read(5); - if (gender >= (uint)Gender.None) + Gender gender = (Gender)result.Read(5); + if (gender >= Gender.None) { Log.outError(LogFilter.Player, "Player {0} has wrong gender ({1}), can't be loaded.", guid.ToString(), gender); return false; } - SetByteValue(UnitFields.Bytes0, 0, result.Read(3)); - SetByteValue(UnitFields.Bytes0, 1, result.Read(4)); - SetByteValue(UnitFields.Bytes0, 3, (byte)gender); + SetRace((Race)result.Read(3)); + SetClass((Class)result.Read(4)); + SetGender(gender); // check if race/class combination is valid PlayerInfo info = Global.ObjectMgr.GetPlayerInfo(GetRace(), GetClass()); @@ -2405,14 +2392,23 @@ namespace Game.Entities return false; } - SetUInt32Value(UnitFields.Level, result.Read(6)); + SetLevel(result.Read(6)); SetXP(result.Read(7)); - _LoadIntoDataField(result.Read(66), (int)ActivePlayerFields.ExploredZones, PlayerConst.ExploredZonesSize); - _LoadIntoDataField(result.Read(67), (int)ActivePlayerFields.KnownTitles, PlayerConst.KnowTitlesSize * 2); + StringArray exploredZones = new StringArray(result.Read(66), ' '); + if (exploredZones.Length == PlayerConst.ExploredZonesSize * 2) + for (int i = 0; i < exploredZones.Length; ++i) + SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, i / 2), (ulong)((long.Parse(exploredZones[i])) << (32 * (i % 2)))); + + StringArray knownTitles = new StringArray(result.Read(67), ' '); + if ((knownTitles.Length % 2) == 0) + { + for (int i = 0; i < knownTitles.Length; ++i) + SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.KnownTitles, i / 2), (ulong)((long.Parse(knownTitles[i])) << (32 * (i % 2)))); + } SetObjectScale(1.0f); - SetFloatValue(UnitFields.HoverHeight, 1.0f); + SetHoverHeight(1.0f); // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria) m_achievementSys.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.Achievements), holder.GetResult(PlayerLoginQueryLoad.CriteriaProgress)); @@ -2428,34 +2424,30 @@ namespace Game.Entities customDisplay[1] = result.Read(15); customDisplay[2] = result.Read(16); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId, result.Read(9)); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId, result.Read(10)); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId, result.Read(11)); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId, result.Read(12)); - SetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle, result.Read(13)); + SetSkinId(result.Read(9)); + SetFaceId(result.Read(10)); + SetHairStyleId(result.Read(11)); + SetHairColorId(result.Read(12)); + SetFacialHairStyleId(result.Read(13)); for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i) - SetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i), customDisplay[i]); + SetCustomDisplayOption(i, customDisplay[i]); SetInventorySlotCount(result.Read(17)); SetBankBagSlotCount(result.Read(18)); - SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)gender); - SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation, result.Read(55)); - SetUInt32Value(PlayerFields.Flags, result.Read(20)); - SetUInt32Value(PlayerFields.FlagsEx, result.Read(21)); - SetInt32Value(ActivePlayerFields.WatchedFactionIndex, (int)result.Read(54)); + SetNativeSex(gender); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Inebriation), result.Read(55)); + SetPlayerFlags((PlayerFlags)result.Read(20)); + SetPlayerFlagsEx((PlayerFlagsEx)result.Read(21)); + SetWatchedFactionIndex(result.Read(54)); - if (!ValidateAppearance((Race)result.Read(3), (Class)result.Read(4), (Gender)gender, - GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId), - GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId), - GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId), - GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle), - GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId), customDisplay)) + if (!ValidateAppearance((Race)result.Read(3), (Class)result.Read(4), (Gender)gender, + m_playerData.HairStyleID, m_playerData.HairColorID, m_playerData.FaceID, m_playerData.FacialHairStyleID, m_playerData.SkinID, customDisplay)) { Log.outError(LogFilter.Player, "Player {0} has wrong Appearance values (Hair/Skin/Color), can't be loaded.", guid.ToString()); return false; } // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles, result.Read(68)); + SetMultiActionBars(result.Read(68)); m_fishingSteps = result.Read(72); @@ -2464,7 +2456,7 @@ namespace Game.Entities // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory) for (byte slot = EquipmentSlot.Start; slot < EquipmentSlot.End; ++slot) { - SetGuidValue(ActivePlayerFields.InvSlotHead + (slot * 4), ObjectGuid.Empty); + SetInvSlot(slot, ObjectGuid.Empty); SetVisibleItemSlot(slot, null); m_items[slot] = null; @@ -2478,6 +2470,7 @@ namespace Game.Entities if (!_LoadHomeBind(holder.GetResult(PlayerLoginQueryLoad.HomeBind))) return false; + InitializeSkillFields(); InitPrimaryProfessions(); // to max set before any spell loaded // init saved position, and fix it later if problematic @@ -2498,29 +2491,10 @@ namespace Game.Entities _LoadGroup(holder.GetResult(PlayerLoginQueryLoad.Group)); - _LoadArenaTeamInfo(holder.GetResult(PlayerLoginQueryLoad.ArenaInfo)); - - // check arena teams integrity - for (byte arena_slot = 0; arena_slot < SharedConst.MaxArenaSlot; ++arena_slot) - { - uint arena_team_id = GetArenaTeamId(arena_slot); - if (arena_team_id == 0) - continue; - - ArenaTeam at = Global.ArenaTeamMgr.GetArenaTeamById(arena_team_id); - if (at != null) - if (at.IsMember(GetGUID())) - continue; - - // arena team not exist or not member, cleanup fields - for (int j = 0; j < 6; ++j) - SetArenaTeamInfoField(arena_slot, (ArenaTeamInfoType)j, 0); - } - _LoadCurrency(holder.GetResult(PlayerLoginQueryLoad.Currency)); - SetUInt32Value(ActivePlayerFields.LifetimeHonorableKills, result.Read(50)); - SetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetTodayKills, result.Read(51)); - SetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetYesterdayKills, result.Read(52)); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LifetimeHonorableKills), result.Read(50)); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TodayHonorableKills), result.Read(51)); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.YesterdayHonorableKills), result.Read(52)); _LoadBoundInstances(holder.GetResult(PlayerLoginQueryLoad.BoundInstances)); _LoadInstanceTimeRestrictions(holder.GetResult(PlayerLoginQueryLoad.InstanceLockTimes)); @@ -2838,27 +2812,11 @@ namespace Game.Entities if (m_deathExpireTime > now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep) m_deathExpireTime = now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep - 1; - // clear charm/summon related fields - SetOwnerGUID(ObjectGuid.Empty); - SetGuidValue(UnitFields.CharmedBy, ObjectGuid.Empty); - SetGuidValue(UnitFields.Charm, ObjectGuid.Empty); - SetGuidValue(UnitFields.Summon, ObjectGuid.Empty); - SetGuidValue(ActivePlayerFields.Farsight, ObjectGuid.Empty); - SetCreatorGUID(ObjectGuid.Empty); - - RemoveFlag(UnitFields.Flags2, UnitFlags2.ForceMove); - - // reset some aura modifiers before aura apply - SetUInt32Value(ActivePlayerFields.TrackCreatures, 0); - SetUInt32Value(ActivePlayerFields.TrackResources, 0); + RemoveUnitFlag2(UnitFlags2.ForceMove); // make sure the unit is considered out of combat for proper loading ClearInCombat(); - // make sure the unit is considered not in duel for proper loading - SetGuidValue(PlayerFields.DuelArbiter, ObjectGuid.Empty); - SetUInt32Value(PlayerFields.DuelTeam, 0); - // reset stats before loading any modifiers InitStatsForLevel(); InitTaxiNodesForLevel(); @@ -2885,10 +2843,7 @@ namespace Game.Entities SetLootSpecId(lootSpecId); } - ChrSpecializationRecord spec = Global.DB2Mgr.GetChrSpecializationByIndex(GetClass(), GetActiveTalentGroup()); - if (spec != null) - SetUInt32Value(PlayerFields.CurrentSpecId, spec.Id); - + UpdateDisplayPower(); _LoadTalents(holder.GetResult(PlayerLoginQueryLoad.Talents)); _LoadPvpTalents(holder.GetResult(PlayerLoginQueryLoad.PvpTalents)); _LoadSpells(holder.GetResult(PlayerLoginQueryLoad.Spells)); @@ -2903,7 +2858,7 @@ namespace Game.Entities _LoadAuras(holder.GetResult(PlayerLoginQueryLoad.Auras), holder.GetResult(PlayerLoginQueryLoad.AuraEffects), time_diff); _LoadGlyphAuras(); // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura) - if (HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) + if (HasPlayerFlag(PlayerFlags.Ghost)) m_deathState = DeathState.Dead; // after spell load, learn rewarded spell if need also @@ -2946,7 +2901,7 @@ namespace Game.Entities if (curTitle != 0 && !HasTitle(curTitle)) curTitle = 0; - SetUInt32Value(PlayerFields.ChosenTitle, curTitle); + SetChosenTitle(curTitle); // has to be called after last Relocate() in Player.LoadFromDB SetFallInformation(0, GetPositionZ()); @@ -2973,7 +2928,7 @@ namespace Game.Entities if (Global.DB2Mgr.GetPowerIndexByClass(i, GetClass()) != (int)PowerType.Max) { uint savedPower = result.Read(56 + loadedPowers); - uint maxPower = GetUInt32Value(UnitFields.MaxPower + loadedPowers); + uint maxPower = m_unitData.MaxPower[loadedPowers]; SetPower(i, (int)(savedPower > maxPower ? maxPower : savedPower)); if (++loadedPowers >= (int)PowerType.MaxPerClass) break; @@ -2981,7 +2936,7 @@ namespace Game.Entities } for (; loadedPowers < (int)PowerType.MaxPerClass; ++loadedPowers) - SetUInt32Value(UnitFields.Power + loadedPowers, 0); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)loadedPowers), 0); SetPower(PowerType.LunarPower, 0); // Init rune recharge @@ -3058,10 +3013,10 @@ namespace Game.Entities // RaF stuff. m_grantableLevels = result.Read(69); if (GetSession().IsARecruiter() || (GetSession().GetRecruiterId() != 0)) - SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.ReferAFriend); + AddDynamicFlag(UnitDynFlags.ReferAFriend); if (m_grantableLevels > 0) - SetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetRafGrantableLevel, 0x01); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.GrantableLevels), (byte)1); _LoadDeclinedNames(holder.GetResult(PlayerLoginQueryLoad.DeclinedNames)); @@ -3071,7 +3026,7 @@ namespace Game.Entities _LoadCUFProfiles(holder.GetResult(PlayerLoginQueryLoad.CufProfiles)); var garrison = new Garrison(this); - if (garrison.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.Garrison), + if (garrison.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.Garrison), holder.GetResult(PlayerLoginQueryLoad.GarrisonBlueprints), holder.GetResult(PlayerLoginQueryLoad.GarrisonBuildings), holder.GetResult(PlayerLoginQueryLoad.GarrisonFollowers), @@ -3098,6 +3053,7 @@ namespace Game.Entities m_questObjectiveCriteriaMgr.CheckAllQuestObjectiveCriteria(this); return true; } + public void SaveToDB(bool create = false) { // delay auto save at any saves (manual, in code, or autosave) @@ -3113,52 +3069,60 @@ namespace Game.Entities // first save/honor gain after midnight will also update the player's honor fields UpdateHonorFields(); - SQLTransaction trans = new SQLTransaction(); - var index = 0; + Log.outDebug(LogFilter.Player, $"Player::SaveToDB: The value of player {GetName()}%s at save: "); - PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHAR_FISHINGSTEPS); + if (!create) + Global.ScriptMgr.OnPlayerSave(this); + + SQLTransaction trans = new SQLTransaction(); + PreparedStatement stmt; + byte index = 0; + + stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHAR_FISHINGSTEPS); stmt.AddValue(0, GetGUID().GetCounter()); trans.Append(stmt); + float finiteAlways(float f) { return float.IsInfinity(f) ? f : 0.0f; }; + if (create) { + //! Insert query + /// @todo: Filter out more redundant fields that can take their default value at player create stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CHARACTER); - //! Insert Select - //! TO DO: Filter out more redundant fields that can take their default value at player create stmt.AddValue(index++, GetGUID().GetCounter()); stmt.AddValue(index++, GetSession().GetAccountId()); stmt.AddValue(index++, GetName()); stmt.AddValue(index++, (byte)GetRace()); stmt.AddValue(index++, (byte)GetClass()); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender)); + stmt.AddValue(index++, (byte)m_playerData.NativeSex); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect stmt.AddValue(index++, getLevel()); - stmt.AddValue(index++, GetUInt32Value(ActivePlayerFields.Xp)); + stmt.AddValue(index++, (uint)m_activePlayerData.XP); stmt.AddValue(index++, GetMoney()); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle)); + stmt.AddValue(index++, (byte)m_playerData.SkinID); + stmt.AddValue(index++, (byte)m_playerData.FaceID); + stmt.AddValue(index++, (byte)m_playerData.HairStyleID); + stmt.AddValue(index++, (byte)m_playerData.HairColorID); + stmt.AddValue(index++, (byte)m_playerData.FacialHairStyleID); for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i))); + stmt.AddValue(index++, m_playerData.CustomDisplayOption[i]); stmt.AddValue(index++, GetInventorySlotCount()); stmt.AddValue(index++, GetBankBagSlotCount()); - stmt.AddValue(index++, (byte)GetUInt32Value(ActivePlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp)); - stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags)); - stmt.AddValue(index++, GetUInt32Value(PlayerFields.FlagsEx)); + stmt.AddValue(index++, (byte)m_activePlayerData.RestInfo[(int)RestTypes.XP].StateID); + stmt.AddValue(index++, (uint)m_playerData.PlayerFlags); + stmt.AddValue(index++, (uint)m_playerData.PlayerFlagsEx); stmt.AddValue(index++, (ushort)GetMapId()); stmt.AddValue(index++, GetInstanceId()); stmt.AddValue(index++, (byte)GetDungeonDifficultyID()); stmt.AddValue(index++, (byte)GetRaidDifficultyID()); stmt.AddValue(index++, (byte)GetLegacyRaidDifficultyID()); - stmt.AddValue(index++, GetPositionX()); - stmt.AddValue(index++, GetPositionY()); - stmt.AddValue(index++, GetPositionZ()); - stmt.AddValue(index++, GetOrientation()); - stmt.AddValue(index++, GetTransOffsetX()); - stmt.AddValue(index++, GetTransOffsetY()); - stmt.AddValue(index++, GetTransOffsetZ()); - stmt.AddValue(index++, GetTransOffsetO()); + stmt.AddValue(index++, finiteAlways(GetPositionX())); + stmt.AddValue(index++, finiteAlways(GetPositionY())); + stmt.AddValue(index++, finiteAlways(GetPositionZ())); + stmt.AddValue(index++, finiteAlways(GetOrientation())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetX())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetY())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetZ())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetO())); ulong transLowGUID = 0; if (GetTransport()) transLowGUID = GetTransport().GetGUID().GetCounter(); @@ -3172,41 +3136,39 @@ namespace Game.Entities stmt.AddValue(index++, m_cinematic); stmt.AddValue(index++, m_PlayedTimeTotal); stmt.AddValue(index++, m_PlayedTimeLevel); - stmt.AddValue(index++, _restMgr.GetRestBonus(RestTypes.XP)); + stmt.AddValue(index++, finiteAlways(_restMgr.GetRestBonus(RestTypes.XP))); stmt.AddValue(index++, (uint)Time.UnixTime); - stmt.AddValue(index++, HasFlag(PlayerFields.Flags, PlayerFlags.Resting) ? 1 : 0); + stmt.AddValue(index++, (HasPlayerFlag(PlayerFlags.Resting) ? 1 : 0)); //save, far from tavern/city //save, but in tavern/city stmt.AddValue(index++, GetTalentResetCost()); stmt.AddValue(index++, GetTalentResetTime()); - stmt.AddValue(index++, GetPrimarySpecialization()); stmt.AddValue(index++, (ushort)m_ExtraFlags); stmt.AddValue(index++, m_stableSlots); stmt.AddValue(index++, (ushort)atLoginFlags); stmt.AddValue(index++, GetZoneId()); - stmt.AddValue(index++, m_deathExpireTime); + stmt.AddValue(index++, (uint)m_deathExpireTime); ss.Clear(); ss.Append(m_taxi.SaveTaxiDestinationsToString()); stmt.AddValue(index++, ss.ToString()); - stmt.AddValue(index++, GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills)); - stmt.AddValue(index++, GetUInt16Value(ActivePlayerFields.Kills, 0)); - stmt.AddValue(index++, GetUInt16Value(ActivePlayerFields.Kills, 1)); - stmt.AddValue(index++, (uint)GetInt32Value(PlayerFields.ChosenTitle)); - stmt.AddValue(index++, GetUInt32Value(ActivePlayerFields.WatchedFactionIndex)); + stmt.AddValue(index++, (uint)m_activePlayerData.LifetimeHonorableKills); + stmt.AddValue(index++, (ushort)m_activePlayerData.TodayHonorableKills); + stmt.AddValue(index++, (ushort)m_activePlayerData.YesterdayHonorableKills); + stmt.AddValue(index++, (uint)m_playerData.PlayerTitle); + stmt.AddValue(index++, (int)m_activePlayerData.WatchedFactionIndex); stmt.AddValue(index++, GetDrunkValue()); stmt.AddValue(index++, GetHealth()); int storedPowers = 0; - for (PowerType i = 0; i < PowerType.Max; ++i) + for (PowerType powerType = 0; powerType < PowerType.Max; ++powerType) { - if (Global.DB2Mgr.GetPowerIndexByClass(i, GetClass()) != (int)PowerType.Max) + if (GetPowerIndex(powerType) != (int)PowerType.Max) { - stmt.AddValue(index++, GetUInt32Value(UnitFields.Power + storedPowers)); - storedPowers++; - if (storedPowers >= (int)PowerType.MaxPerClass) + stmt.AddValue(index++, m_unitData.Power[storedPowers]); + if (++storedPowers >= (int)PowerType.MaxPerClass) break; } } @@ -3215,14 +3177,13 @@ namespace Game.Entities stmt.AddValue(index++, 0); stmt.AddValue(index++, GetSession().GetLatency()); - stmt.AddValue(index++, GetActiveTalentGroup()); - stmt.AddValue(index++, GetLootSpecId()); ss.Clear(); - for (var i = 0; i < PlayerConst.ExploredZonesSize; ++i) - ss.AppendFormat("{0} ", GetUInt32Value(ActivePlayerFields.ExploredZones + i)); + for (int i = 0; i < PlayerConst.ExploredZonesSize; ++i) + ss.Append($"{(uint)(m_activePlayerData.ExploredZones[i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.ExploredZones[i] >> 32) & 0xFFFFFFFF)} "); + stmt.AddValue(index++, ss.ToString()); ss.Clear(); @@ -3232,26 +3193,28 @@ namespace Game.Entities Item item = GetItemByPos(InventorySlots.Bag0, i); if (item != null) { - ss.AppendFormat("{0} {1} ", (uint)item.GetTemplate().GetInventoryType(), item.GetDisplayId(this)); + ss.Append($"{item.GetTemplate().GetInventoryType()} {item.GetDisplayId(this)} "); SpellItemEnchantmentRecord enchant = CliDB.SpellItemEnchantmentStorage.LookupByKey(item.GetVisibleEnchantmentId(this)); if (enchant != null) ss.Append(enchant.ItemVisual); else - ss.Append(0); + ss.Append('0'); ss.Append(' '); } else ss.Append("0 0 0 "); } + stmt.AddValue(index++, ss.ToString()); ss.Clear(); - for (var i = 0; i < PlayerConst.KnowTitlesSize * 2; ++i) - ss.AppendFormat("{0} ", GetUInt32Value(ActivePlayerFields.KnownTitles + i)); + for (int i = 0; i < m_activePlayerData.KnownTitles.Size(); ++i) + ss.Append($"{(uint)(m_activePlayerData.KnownTitles[i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.KnownTitles[i] >> 32) & 0xFFFFFFFF)} "); + stmt.AddValue(index++, ss.ToString()); - stmt.AddValue(index++, GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles)); + stmt.AddValue(index++, (byte)m_activePlayerData.MultiActionBars); stmt.AddValue(index++, m_grantableLevels); stmt.AddValue(index++, Global.RealmMgr.GetMinorMajorBugfixVersionForBuild(Global.WorldMgr.GetRealm().Build)); } @@ -3262,52 +3225,54 @@ namespace Game.Entities stmt.AddValue(index++, GetName()); stmt.AddValue(index++, (byte)GetRace()); stmt.AddValue(index++, (byte)GetClass()); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender)); + stmt.AddValue(index++, (byte)m_playerData.NativeSex); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect stmt.AddValue(index++, getLevel()); - stmt.AddValue(index++, GetUInt32Value(ActivePlayerFields.Xp)); + stmt.AddValue(index++, (uint)m_activePlayerData.XP); stmt.AddValue(index++, GetMoney()); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId)); - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle)); + stmt.AddValue(index++, (byte)m_playerData.SkinID); + stmt.AddValue(index++, (byte)m_playerData.FaceID); + stmt.AddValue(index++, (byte)m_playerData.HairStyleID); + stmt.AddValue(index++, (byte)m_playerData.HairColorID); + stmt.AddValue(index++, (byte)m_playerData.FacialHairStyleID); + for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) - stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)( - PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i))); + stmt.AddValue(index++, m_playerData.CustomDisplayOption[i]); + stmt.AddValue(index++, GetInventorySlotCount()); stmt.AddValue(index++, GetBankBagSlotCount()); - stmt.AddValue(index++, (byte)GetUInt32Value(ActivePlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp)); - stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags)); - stmt.AddValue(index++, GetUInt32Value(PlayerFields.FlagsEx)); + stmt.AddValue(index++, (byte)m_activePlayerData.RestInfo[(int)RestTypes.XP].StateID); + stmt.AddValue(index++, (uint)m_playerData.PlayerFlags); + stmt.AddValue(index++, (uint)m_playerData.PlayerFlagsEx); if (!IsBeingTeleported()) { - stmt.AddValue(index++, GetMapId()); + stmt.AddValue(index++, (ushort)GetMapId()); stmt.AddValue(index++, GetInstanceId()); stmt.AddValue(index++, (byte)GetDungeonDifficultyID()); stmt.AddValue(index++, (byte)GetRaidDifficultyID()); stmt.AddValue(index++, (byte)GetLegacyRaidDifficultyID()); - stmt.AddValue(index++, GetPositionX()); - stmt.AddValue(index++, GetPositionY()); - stmt.AddValue(index++, GetPositionZ()); - stmt.AddValue(index++, GetOrientation()); + stmt.AddValue(index++, finiteAlways(GetPositionX())); + stmt.AddValue(index++, finiteAlways(GetPositionY())); + stmt.AddValue(index++, finiteAlways(GetPositionZ())); + stmt.AddValue(index++, finiteAlways(GetOrientation())); } else { - stmt.AddValue(index++, GetTeleportDest().GetMapId()); + stmt.AddValue(index++, (ushort)GetTeleportDest().GetMapId()); stmt.AddValue(index++, 0); stmt.AddValue(index++, (byte)GetDungeonDifficultyID()); stmt.AddValue(index++, (byte)GetRaidDifficultyID()); stmt.AddValue(index++, (byte)GetLegacyRaidDifficultyID()); - stmt.AddValue(index++, GetTeleportDest().GetPositionX()); - stmt.AddValue(index++, GetTeleportDest().GetPositionY()); - stmt.AddValue(index++, GetTeleportDest().GetPositionZ()); - stmt.AddValue(index++, GetTeleportDest().GetOrientation()); + stmt.AddValue(index++, finiteAlways(GetTeleportDest().GetPositionX())); + stmt.AddValue(index++, finiteAlways(GetTeleportDest().GetPositionY())); + stmt.AddValue(index++, finiteAlways(GetTeleportDest().GetPositionZ())); + stmt.AddValue(index++, finiteAlways(GetTeleportDest().GetOrientation())); } - stmt.AddValue(index++, GetTransOffsetX()); - stmt.AddValue(index++, GetTransOffsetY()); - stmt.AddValue(index++, GetTransOffsetZ()); - stmt.AddValue(index++, GetTransOffsetO()); + + stmt.AddValue(index++, finiteAlways(GetTransOffsetX())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetY())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetZ())); + stmt.AddValue(index++, finiteAlways(GetTransOffsetO())); ulong transLowGUID = 0; if (GetTransport()) transLowGUID = GetTransport().GetGUID().GetCounter(); @@ -3321,14 +3286,13 @@ namespace Game.Entities stmt.AddValue(index++, m_cinematic); stmt.AddValue(index++, m_PlayedTimeTotal); stmt.AddValue(index++, m_PlayedTimeLevel); - stmt.AddValue(index++, _restMgr.GetRestBonus(RestTypes.XP)); - stmt.AddValue(index++, Time.UnixTime); - stmt.AddValue(index++, HasFlag(PlayerFields.Flags, PlayerFlags.Resting) ? 1 : 0); + stmt.AddValue(index++, finiteAlways(_restMgr.GetRestBonus(RestTypes.XP))); + stmt.AddValue(index++, (uint)Time.UnixTime); + stmt.AddValue(index++, (HasPlayerFlag(PlayerFlags.Resting) ? 1 : 0)); //save, far from tavern/city //save, but in tavern/city stmt.AddValue(index++, GetTalentResetCost()); stmt.AddValue(index++, GetTalentResetTime()); - stmt.AddValue(index++, GetPrimarySpecialization()); stmt.AddValue(index++, (ushort)m_ExtraFlags); stmt.AddValue(index++, m_stableSlots); @@ -3340,22 +3304,21 @@ namespace Game.Entities ss.Append(m_taxi.SaveTaxiDestinationsToString()); stmt.AddValue(index++, ss.ToString()); - stmt.AddValue(index++, GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills)); - stmt.AddValue(index++, GetUInt16Value(ActivePlayerFields.Kills, 0)); - stmt.AddValue(index++, GetUInt16Value(ActivePlayerFields.Kills, 1)); - stmt.AddValue(index++, GetUInt32Value(PlayerFields.ChosenTitle)); - stmt.AddValue(index++, (uint)GetInt32Value(ActivePlayerFields.WatchedFactionIndex)); + stmt.AddValue(index++, (uint)m_activePlayerData.LifetimeHonorableKills); + stmt.AddValue(index++, (ushort)m_activePlayerData.TodayHonorableKills); + stmt.AddValue(index++, (ushort)m_activePlayerData.YesterdayHonorableKills); + stmt.AddValue(index++, (uint)m_playerData.PlayerTitle); + stmt.AddValue(index++, (int)m_activePlayerData.WatchedFactionIndex); stmt.AddValue(index++, GetDrunkValue()); stmt.AddValue(index++, GetHealth()); int storedPowers = 0; - for (PowerType i = 0; i < PowerType.Max; ++i) + for (PowerType powerType = 0; powerType < PowerType.Max; ++powerType) { - if (Global.DB2Mgr.GetPowerIndexByClass(i, GetClass()) != (int)PowerType.Max) + if (GetPowerIndex(powerType) != (int)PowerType.Max) { - stmt.AddValue(index++, GetUInt32Value(UnitFields.Power + storedPowers)); - storedPowers++; - if (storedPowers >= (int)PowerType.MaxPerClass) + stmt.AddValue(index++, m_unitData.Power[storedPowers]); + if (++storedPowers >= (int)PowerType.MaxPerClass) break; } } @@ -3364,14 +3327,13 @@ namespace Game.Entities stmt.AddValue(index++, 0); stmt.AddValue(index++, GetSession().GetLatency()); - stmt.AddValue(index++, GetActiveTalentGroup()); - stmt.AddValue(index++, GetLootSpecId()); ss.Clear(); - for (var i = 0; i < PlayerConst.ExploredZonesSize; ++i) - ss.AppendFormat("{0} ", GetUInt32Value(ActivePlayerFields.ExploredZones + i)); + for (int i = 0; i < PlayerConst.ExploredZonesSize; ++i) + ss.Append($"{(uint)(m_activePlayerData.ExploredZones[i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.ExploredZones[i] >> 32) & 0xFFFFFFFF)} "); + stmt.AddValue(index++, ss.ToString()); ss.Clear(); @@ -3381,33 +3343,34 @@ namespace Game.Entities Item item = GetItemByPos(InventorySlots.Bag0, i); if (item != null) { - ss.AppendFormat("{0} {1} ", (uint)item.GetTemplate().GetInventoryType(), item.GetDisplayId(this)); + ss.Append($"{(uint)item.GetTemplate().GetInventoryType()} {item.GetDisplayId(this)} "); SpellItemEnchantmentRecord enchant = CliDB.SpellItemEnchantmentStorage.LookupByKey(item.GetVisibleEnchantmentId(this)); if (enchant != null) ss.Append(enchant.ItemVisual); else - ss.Append(0); + ss.Append('0'); ss.Append(' '); } else ss.Append("0 0 0 "); } + stmt.AddValue(index++, ss.ToString()); ss.Clear(); - for (var i = 0; i < PlayerConst.KnowTitlesSize * 2; ++i) - ss.AppendFormat("{0} ", GetUInt32Value(ActivePlayerFields.KnownTitles + i)); + for (int i = 0; i < m_activePlayerData.KnownTitles.Size(); ++i) + ss.Append($"{(uint)(m_activePlayerData.KnownTitles[i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.KnownTitles[i] >> 32) & 0xFFFFFFFF)} "); stmt.AddValue(index++, ss.ToString()); - stmt.AddValue(index++, GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles)); + stmt.AddValue(index++, (byte)m_activePlayerData.MultiActionBars); stmt.AddValue(index++, m_grantableLevels); stmt.AddValue(index++, IsInWorld && !GetSession().PlayerLogout() ? 1 : 0); - stmt.AddValue(index++, GetUInt32Value(ActivePlayerFields.Honor)); + stmt.AddValue(index++, (uint)m_activePlayerData.Honor); stmt.AddValue(index++, GetHonorLevel()); - stmt.AddValue(index++, (byte)GetUInt32Value(ActivePlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor)); - stmt.AddValue(index++, _restMgr.GetRestBonus(RestTypes.Honor)); + stmt.AddValue(index++, (byte)m_activePlayerData.RestInfo[(int)RestTypes.Honor].StateID); + stmt.AddValue(index++, finiteAlways(_restMgr.GetRestBonus(RestTypes.Honor))); stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build); // Index @@ -3489,7 +3452,7 @@ namespace Game.Entities // save pet (hunter pet level and experience and all type pets health/mana). Pet pet = GetPet(); - if (pet != null) + if (pet) pet.SavePetToDB(PetSaveMode.AsCurrent); } void DeleteSpellFromAllPlayers(uint spellId) diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 4ece1fb16..8c2df6cd4 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -184,6 +184,10 @@ namespace Game.Entities //Core WorldSession Session; + + public PlayerData m_playerData; + public ActivePlayerData m_activePlayerData; + uint m_nextSave; byte m_cinematic; @@ -330,7 +334,6 @@ namespace Game.Entities public List[] Glyphs = new List[PlayerConst.MaxSpecializations]; public uint ResetTalentsCost; public long ResetTalentsTime; - public uint PrimarySpecialization; public byte ActiveGroup; } @@ -442,13 +445,12 @@ namespace Game.Entities public class VoidStorageItem { - public VoidStorageItem(ulong id, uint entry, ObjectGuid creator, ItemRandomEnchantmentId randomPropertyId, uint suffixFactor, uint upgradeId, uint fixedScalingLevel, uint artifactKnowledgeLevel, byte context, ICollection bonuses) + public VoidStorageItem(ulong id, uint entry, ObjectGuid creator, uint randomBonusListId, uint upgradeId, uint fixedScalingLevel, uint artifactKnowledgeLevel, byte context, List bonuses) { ItemId = id; ItemEntry = entry; CreatorGuid = creator; - ItemRandomPropertyId = randomPropertyId; - ItemSuffixFactor = suffixFactor; + RandomBonusListId = randomBonusListId; ItemUpgradeId = upgradeId; FixedScalingLevel = fixedScalingLevel; ArtifactKnowledgeLevel = artifactKnowledgeLevel; @@ -461,8 +463,7 @@ namespace Game.Entities public ulong ItemId; public uint ItemEntry; public ObjectGuid CreatorGuid; - public ItemRandomEnchantmentId ItemRandomPropertyId; - public uint ItemSuffixFactor; + public uint RandomBonusListId; public uint ItemUpgradeId; public uint FixedScalingLevel; public uint ArtifactKnowledgeLevel; diff --git a/Source/Game/Entities/Player/Player.Groups.cs b/Source/Game/Entities/Player/Player.Groups.cs index 73af9573b..e6bd42253 100644 --- a/Source/Game/Entities/Player/Player.Groups.cs +++ b/Source/Game/Entities/Player/Player.Groups.cs @@ -165,10 +165,10 @@ namespace Game.Entities public void SetPartyType(GroupCategory category, GroupType type) { Cypher.Assert(category < GroupCategory.Max); - byte value = GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetPartyType); + byte value = m_playerData.PartyType; value &= (byte)~((byte)0xFF << ((byte)category * 4)); value |= (byte)((byte)type << ((byte)category * 4)); - SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetPartyType, value); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PartyType), value); } public void ResetGroupUpdateSequenceIfNeeded(Group group) diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index cf3765842..93ed35616 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -47,7 +47,7 @@ namespace Game.Entities } public void RefundItem(Item item) { - if (!item.HasFlag(ItemFields.Flags, ItemFieldFlags.Refundable)) + if (!item.HasItemFlag(ItemFieldFlags.Refundable)) { Log.outDebug(LogFilter.Player, "Item refund: item not refundable!"); return; @@ -152,7 +152,7 @@ namespace Game.Entities // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours. item.UpdatePlayedTime(this); - if (!item.HasFlag(ItemFields.Flags, ItemFieldFlags.Refundable)) + if (!item.HasItemFlag(ItemFieldFlags.Refundable)) { Log.outDebug(LogFilter.Player, "Item refund: item not refundable!"); return; @@ -301,7 +301,7 @@ namespace Game.Entities if (item == null) return; - uint pMaxDurability = item.GetUInt32Value(ItemFields.MaxDurability); + uint pMaxDurability = item.m_itemData.MaxDurability; if (pMaxDurability == 0) return; @@ -352,14 +352,14 @@ namespace Game.Entities if (HasAuraType(AuraType.PreventDurabilityLoss)) return; - int pMaxDurability = item.GetInt32Value(ItemFields.MaxDurability); - int pOldDurability = item.GetInt32Value(ItemFields.Durability); - int pNewDurability = pOldDurability - points; + uint pMaxDurability = item.m_itemData.MaxDurability; + uint pOldDurability = item.m_itemData.Durability; + int pNewDurability = (int)(pOldDurability - points); if (pNewDurability < 0) pNewDurability = 0; else if (pNewDurability > pMaxDurability) - pNewDurability = pMaxDurability; + pNewDurability = (int)pMaxDurability; if (pOldDurability != pNewDurability) { @@ -367,7 +367,7 @@ namespace Game.Entities if (pNewDurability == 0 && pOldDurability > 0 && item.IsEquipped()) _ApplyItemMods(item, item.GetSlot(), false); - item.SetInt32Value(ItemFields.Durability, pNewDurability); + item.SetDurability((uint)pNewDurability); // modify item stats _after_ restore durability to pass _ApplyItemMods internal check if (pNewDurability > 0 && pOldDurability == 0 && item.IsEquipped()) @@ -407,11 +407,11 @@ namespace Game.Entities if (item == null) return TotalCost; - uint maxDurability = item.GetUInt32Value(ItemFields.MaxDurability); + uint maxDurability = item.m_itemData.MaxDurability; if (maxDurability == 0) return TotalCost; - uint curDurability = item.GetUInt32Value(ItemFields.Durability); + uint curDurability = item.m_itemData.Durability; if (cost) { @@ -474,7 +474,7 @@ namespace Game.Entities } } - item.SetUInt32Value(ItemFields.Durability, maxDurability); + item.SetDurability(maxDurability); item.SetState(ItemUpdateState.Changed, this); // reapply mods for total broken and repaired item if equipped @@ -644,7 +644,7 @@ namespace Game.Entities // search free slot in bag for place to if (bag == InventorySlots.Bag0) // inventory { - if (pItem && pItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + if (pItem && pItem.HasItemFlag(ItemFieldFlags.Child)) { res = CanStoreItem_InInventorySlots(InventorySlots.ChildEquipmentStart, InventorySlots.ChildEquipmentEnd, dest, pProto, ref count, false, pItem, bag, slot); if (res != InventoryResult.Ok) @@ -662,7 +662,7 @@ namespace Game.Entities return InventoryResult.ItemMaxCount; } } - else if (pProto.IsCraftingReagent() && HasFlag(PlayerFields.FlagsEx, PlayerFlagsEx.ReagentBankUnlocked)) + else if (pProto.IsCraftingReagent() && HasPlayerFlagEx(PlayerFlagsEx.ReagentBankUnlocked)) { res = CanStoreItem_InInventorySlots(InventorySlots.ReagentStart, InventorySlots.ReagentEnd, dest, pProto, ref count, false, pItem, bag, slot); if (res != InventoryResult.Ok) @@ -832,7 +832,7 @@ namespace Game.Entities if (pItem != null && pItem.IsNotEmptyBag()) return InventoryResult.BagInBag; - if (pItem && pItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + if (pItem && pItem.HasItemFlag(ItemFieldFlags.Child)) { res = CanStoreItem_InInventorySlots(InventorySlots.ChildEquipmentStart, InventorySlots.ChildEquipmentEnd, dest, pProto, ref count, false, pItem, bag, slot); if (res != InventoryResult.Ok) @@ -850,7 +850,7 @@ namespace Game.Entities return InventoryResult.ItemMaxCount; } } - else if (pProto.IsCraftingReagent() && HasFlag(PlayerFields.FlagsEx, PlayerFlagsEx.ReagentBankUnlocked)) + else if (pProto.IsCraftingReagent() && HasPlayerFlagEx(PlayerFlagsEx.ReagentBankUnlocked)) { res = CanStoreItem_InInventorySlots(InventorySlots.ReagentStart, InventorySlots.ReagentEnd, dest, pProto, ref count, false, pItem, bag, slot); if (res != InventoryResult.Ok) @@ -1132,9 +1132,9 @@ namespace Game.Entities if (pBag == null) { m_items[slot] = pItem; - SetGuidValue(ActivePlayerFields.InvSlotHead + (slot * 4), pItem.GetGUID()); - pItem.SetGuidValue(ItemFields.Contained, GetGUID()); - pItem.SetGuidValue(ItemFields.Owner, GetGUID()); + SetInvSlot(slot, pItem.GetGUID()); + pItem.SetContainedIn(GetGUID()); + pItem.SetOwnerGUID(GetGUID()); pItem.SetSlot(slot); pItem.SetContainer(null); @@ -1251,7 +1251,7 @@ namespace Game.Entities msg = CanStoreNewItem(InventorySlots.Bag0, ItemConst.NullSlot, sDest, titem_id, titem_amount); if (msg == InventoryResult.Ok) { - StoreNewItem(sDest, titem_id, true, ItemEnchantment.GenerateItemRandomPropertyId(titem_id)); + StoreNewItem(sDest, titem_id, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(titem_id)); return true; // stored } @@ -1259,7 +1259,7 @@ namespace Game.Entities Log.outError(LogFilter.Player, "STORAGE: Can't equip or store initial item {0} for race {1} class {2}, error msg = {3}", titem_id, GetRace(), GetClass(), msg); return false; } - public Item StoreNewItem(List pos, uint itemId, bool update, ItemRandomEnchantmentId randomPropertyId = default(ItemRandomEnchantmentId), List allowedLooters = null, byte context = 0, List bonusListIDs = null, bool addToCollection = true) + public Item StoreNewItem(List pos, uint itemId, bool update, uint randomPropertyId = 0, List allowedLooters = null, byte context = 0, List bonusListIDs = null, bool addToCollection = true) { uint count = 0; foreach (var itemPosCount in pos) @@ -1272,28 +1272,24 @@ namespace Game.Entities UpdateCriteria(CriteriaTypes.ReceiveEpicItem, itemId, count); UpdateCriteria(CriteriaTypes.OwnItem, itemId, 1); - item.SetFlag(ItemFields.Flags, ItemFieldFlags.NewItem); + item.AddItemFlag(ItemFieldFlags.NewItem); uint upgradeID = Global.DB2Mgr.GetRulesetItemUpgrade(itemId); if (upgradeID != 0) item.SetModifier(ItemModifier.UpgradeId, upgradeID); - item.SetUInt32Value(ItemFields.Context, context); - if (bonusListIDs != null) - { - foreach (uint bonusListID in bonusListIDs) - item.AddBonuses(bonusListID); - } + item.SetContext(context); + item.SetBonuses(bonusListIDs); item = StoreItem(pos, item, update); item.SetFixedLevel(getLevel()); - item.SetItemRandomProperties(randomPropertyId); + item.SetItemRandomBonusList(randomPropertyId); if (allowedLooters != null && allowedLooters.Count > 1 && item.GetTemplate().GetMaxStackSize() == 1 && item.IsSoulBound()) { item.SetSoulboundTradeable(allowedLooters); - item.SetUInt32Value(ItemFields.CreatePlayedTime, GetTotalPlayedTime()); + item.SetCreatePlayedTime(GetTotalPlayedTime()); AddTradeableItem(item); // save data @@ -1318,11 +1314,11 @@ namespace Game.Entities { List childDest = new List(); CanStoreItem_InInventorySlots(InventorySlots.ChildEquipmentStart, InventorySlots.ChildEquipmentEnd, childDest, childTemplate, ref count, false, null, ItemConst.NullBag, ItemConst.NullSlot); - Item childItem = StoreNewItem(childDest, childTemplate.GetId(), update, ItemRandomEnchantmentId.Empty, null, context, null, addToCollection); + Item childItem = StoreNewItem(childDest, childTemplate.GetId(), update, 0, null, context, null, addToCollection); if (childItem) { - childItem.SetGuidValue(ItemFields.Creator, item.GetGUID()); - childItem.SetFlag(ItemFields.Flags, ItemFieldFlags.Child); + childItem.SetCreator(item.GetGUID()); + childItem.AddItemFlag(ItemFieldFlags.Child); item.SetChildItem(childItem.GetGUID()); } } @@ -1505,7 +1501,7 @@ namespace Game.Entities ArtifactRecord artifact = CliDB.ArtifactStorage.LookupByKey(proto.GetArtifactID()); if (artifact != null) - if (artifact.ChrSpecializationID != GetUInt32Value(PlayerFields.CurrentSpecId)) + if (artifact.ChrSpecializationID != GetPrimarySpecialization()) return InventoryResult.CantUseItem; return InventoryResult.Ok; @@ -1907,7 +1903,7 @@ namespace Game.Entities return false; } - Item item = StoreNewItem(dest, itemId, true, ItemEnchantment.GenerateItemRandomPropertyId(itemId)); + Item item = StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId)); if (item != null) SendNewItem(item, count, true, false); else @@ -1947,20 +1943,7 @@ namespace Game.Entities { // remove held enchantments, update expertise if (slot == EquipmentSlot.MainHand) - { - if (pItem.GetItemSuffixFactor() != 0) - { - pItem.ClearEnchantment(EnchantmentSlot.Prop3); - pItem.ClearEnchantment(EnchantmentSlot.Prop4); - } - else - { - pItem.ClearEnchantment(EnchantmentSlot.Prop0); - pItem.ClearEnchantment(EnchantmentSlot.Prop1); - } - UpdateExpertise(WeaponAttackType.BaseAttack); - } else if (slot == EquipmentSlot.OffHand) UpdateExpertise(WeaponAttackType.OffAttack); // update armor penetration - passive auras may need it @@ -1975,7 +1958,7 @@ namespace Game.Entities } m_items[slot] = null; - SetGuidValue(ActivePlayerFields.InvSlotHead + (slot * 4), ObjectGuid.Empty); + SetInvSlot(slot, ObjectGuid.Empty); if (slot < EquipmentSlot.End) { @@ -1988,7 +1971,7 @@ namespace Game.Entities if (pBag != null) pBag.RemoveItem(slot, update); - pItem.SetGuidValue(ItemFields.Contained, ObjectGuid.Empty); + pItem.SetContainedIn(ObjectGuid.Empty); pItem.SetSlot(ItemConst.NullSlot); if (IsInWorld && update) pItem.SendUpdateToPlayer(this); @@ -2122,9 +2105,9 @@ namespace Game.Entities if (pSrcItem == null) return; - if (pSrcItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + if (pSrcItem.HasItemFlag(ItemFieldFlags.Child)) { - Item parentItem = GetItemByGuid(pSrcItem.GetGuidValue(ItemFields.Creator)); + Item parentItem = GetItemByGuid(pSrcItem.m_itemData.Creator); if (parentItem) { if (IsEquipmentPos(src)) @@ -2136,9 +2119,9 @@ namespace Game.Entities } } } - else if (pDstItem && pDstItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + else if (pDstItem && pDstItem.HasItemFlag(ItemFieldFlags.Child)) { - Item parentItem = GetItemByGuid(pDstItem.GetGuidValue(ItemFields.Creator)); + Item parentItem = GetItemByGuid(pDstItem.m_itemData.Creator); if (parentItem) { if (IsEquipmentPos(dst)) @@ -2529,7 +2512,7 @@ namespace Game.Entities } } - Item it = bStore ? StoreNewItem(vDest, item, true, ItemEnchantment.GenerateItemRandomPropertyId(item), null, 0, crItem.BonusListIDs, false) : EquipNewItem(uiDest, item, true); + Item it = bStore ? StoreNewItem(vDest, item, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(item), null, 0, crItem.BonusListIDs, false) : EquipNewItem(uiDest, item, true); if (it != null) { uint new_count = pVendor.UpdateVendorItemCurrentCount(crItem, count); @@ -2548,7 +2531,7 @@ namespace Game.Entities if (pProto.GetFlags().HasAnyFlag(ItemFlags.ItemPurchaseRecord) && crItem.ExtendedCost != 0 && pProto.GetMaxStackSize() == 1) { - it.SetFlag(ItemFields.Flags, ItemFieldFlags.Refundable); + it.AddItemFlag(ItemFieldFlags.Refundable); it.SetRefundRecipient(GetGUID()); it.SetPaidMoney((uint)price); it.SetPaidExtendedCost(crItem.ExtendedCost); @@ -2604,7 +2587,7 @@ namespace Game.Entities } void AddItemDurations(Item item) { - if (item.GetUInt32Value(ItemFields.Duration) != 0) + if (item.m_itemData.Expiration != 0) { m_itemDuration.Add(item); item.SendTimeUpdate(this); @@ -3399,7 +3382,7 @@ namespace Game.Entities // if current back slot non-empty search oldest or free if (m_items[slot] != null) { - uint oldest_time = GetUInt32Value(ActivePlayerFields.BuyBackTimestamp); + uint oldest_time = m_activePlayerData.BuybackTimestamp[0]; uint oldest_slot = InventorySlots.BuyBackStart; for (byte i = InventorySlots.BuyBackStart + 1; i < InventorySlots.BuyBackEnd; ++i) @@ -3411,7 +3394,7 @@ namespace Game.Entities break; } - uint i_time = GetUInt32Value(ActivePlayerFields.BuyBackTimestamp + i - InventorySlots.BuyBackStart); + uint i_time = m_activePlayerData.BuybackTimestamp[i - InventorySlots.BuyBackStart]; if (oldest_time > i_time) { @@ -3430,15 +3413,16 @@ namespace Game.Entities m_items[slot] = pItem; var time = Time.UnixTime; uint etime = (uint)(time - m_logintime + (30 * 3600)); - int eslot = (int)slot - InventorySlots.BuyBackStart; + uint eslot = slot - InventorySlots.BuyBackStart; - SetGuidValue(ActivePlayerFields.InvSlotHead + ((int)slot * 4), pItem.GetGUID()); + SetInvSlot(slot, pItem.GetGUID()); ItemTemplate proto = pItem.GetTemplate(); if (proto != null) - SetUInt32Value(ActivePlayerFields.BuyBackPrice + eslot, proto.GetSellPrice() * pItem.GetCount()); + SetBuybackPrice(eslot, proto.GetSellPrice() * pItem.GetCount()); else - SetUInt32Value(ActivePlayerFields.BuyBackPrice + eslot, 0); - SetUInt32Value(ActivePlayerFields.BuyBackTimestamp + eslot, etime); + SetBuybackPrice(eslot, 0); + + SetBuybackTimestamp(eslot, etime); // move to next (for non filled list is move most optimized choice) if (m_currentBuybackSlot < InventorySlots.BuyBackEnd - 1) @@ -3462,7 +3446,7 @@ namespace Game.Entities return false; } - Creature creature = GetNPCIfCanInteractWith(vendorGuid, NPCFlags.Vendor); + Creature creature = GetNPCIfCanInteractWith(vendorGuid, NPCFlags.Vendor, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: BuyCurrencyFromVendorSlot - {0} not found or you can't interact with him.", vendorGuid.ToString()); @@ -3629,7 +3613,7 @@ namespace Game.Entities if (!IsGameMaster() && ((pProto.GetFlags2().HasAnyFlag(ItemFlags2.FactionHorde) && GetTeam() == Team.Alliance) || (pProto.GetFlags2().HasAnyFlag(ItemFlags2.FactionAlliance) && GetTeam() == Team.Horde))) return false; - Creature creature = GetNPCIfCanInteractWith(vendorguid, NPCFlags.Vendor); + Creature creature = GetNPCIfCanInteractWith(vendorguid, NPCFlags.Vendor, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: BuyItemFromVendor - {0} not found or you can't interact with him.", vendorguid.ToString()); @@ -3866,6 +3850,8 @@ namespace Game.Entities draft.SendMailTo(trans, new MailReceiver(this, GetGUID().GetCounter()), sender); DB.Characters.CommitTransaction(trans); } + public void SetBuybackPrice(uint slot, uint price) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BuybackPrice, (int)slot), price); } + public void SetBuybackTimestamp(uint slot, uint timestamp) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BuybackTimestamp, (int)slot), timestamp); } public Item GetItemFromBuyBackSlot(uint slot) { @@ -3889,10 +3875,10 @@ namespace Game.Entities m_items[slot] = null; - int eslot = (int)slot - InventorySlots.BuyBackStart; - SetGuidValue(ActivePlayerFields.InvSlotHead + (int)(slot * 4), ObjectGuid.Empty); - SetUInt32Value(ActivePlayerFields.BuyBackPrice + eslot, 0); - SetUInt32Value(ActivePlayerFields.BuyBackTimestamp + eslot, 0); + uint eslot = slot - InventorySlots.BuyBackStart; + SetInvSlot(slot, ObjectGuid.Empty); + SetBuybackPrice(eslot, 0); + SetBuybackTimestamp(eslot, 0); // if current backslot is filled set to now free slot if (m_items[m_currentBuybackSlot]) @@ -4268,7 +4254,7 @@ namespace Game.Entities && Global.DB2Mgr.GetHeirloomByItemId(item.GetEntry()) != null) continue; - if (spellData.ChrSpecializationID != 0 && spellData.ChrSpecializationID != GetUInt32Value(PlayerFields.CurrentSpecId)) + if (spellData.ChrSpecializationID != 0 && spellData.ChrSpecializationID != GetPrimarySpecialization()) continue; ApplyEquipSpell(spellproto, item, apply, formChange); @@ -4559,10 +4545,10 @@ namespace Game.Entities if (pSrcItem.IsNotEmptyBag() && !IsBagPos((ushort)((ushort)bag << 8 | slot))) return InventoryResult.DestroyNonemptyBag; - if (pSrcItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child) && !IsEquipmentPos(bag, slot) && !IsChildEquipmentPos(bag, slot)) + if (pSrcItem.HasItemFlag(ItemFieldFlags.Child) && !IsEquipmentPos(bag, slot) && !IsChildEquipmentPos(bag, slot)) return InventoryResult.WrongBagType3; - if (!pSrcItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child) && IsChildEquipmentPos(bag, slot)) + if (!pSrcItem.HasItemFlag(ItemFieldFlags.Child) && IsChildEquipmentPos(bag, slot)) return InventoryResult.WrongBagType3; } @@ -4655,7 +4641,7 @@ namespace Game.Entities // in case trade we already have item in other player inventory pLastItem.SetState(in_characterInventoryDB ? ItemUpdateState.Changed : ItemUpdateState.New, this); - if (pLastItem.HasFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable)) + if (pLastItem.HasItemFlag(ItemFieldFlags.BopTradeable)) AddTradeableItem(pLastItem); } } @@ -4903,7 +4889,7 @@ namespace Game.Entities if (pSrcItem.IsNotEmptyBag()) return InventoryResult.DestroyNonemptyBag; - if (pSrcItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + if (pSrcItem.HasItemFlag(ItemFieldFlags.Child)) return InventoryResult.WrongBagType3; } @@ -5305,7 +5291,7 @@ namespace Game.Entities return res; // check unique-equipped on gems - foreach (ItemDynamicFieldGems gemData in pItem.GetGems()) + foreach (SocketedGem gemData in pItem.m_itemData.Gems) { ItemTemplate pGem = Global.ObjectMgr.GetItemTemplate(gemData.ItemId); if (pGem == null) @@ -5400,7 +5386,7 @@ namespace Game.Entities //Artifact void ApplyArtifactPowers(Item item, bool apply) { - foreach (ItemDynamicFieldArtifactPowers artifactPower in item.GetArtifactPowers()) + foreach (ArtifactPower artifactPower in item.m_itemData.ArtifactPowers) { byte rank = artifactPower.CurrentRankWithBonus; if (rank == 0) @@ -5573,16 +5559,18 @@ namespace Game.Entities //Visual public void SetVisibleItemSlot(uint slot, Item pItem) { + var itemField = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.VisibleItems, (int)slot); if (pItem != null) { - SetUInt32Value(PlayerFields.VisibleItem + (int)(slot * 2), pItem.GetVisibleEntry(this)); - SetUInt16Value(PlayerFields.VisibleItem + 1 + (int)(slot * 2), 0, pItem.GetVisibleAppearanceModId(this)); - SetUInt16Value(PlayerFields.VisibleItem + 1 + (int)(slot * 2), 1, pItem.GetVisibleItemVisual(this)); + SetUpdateFieldValue(itemField.ModifyValue(itemField.ItemID), pItem.GetVisibleEntry(this)); + SetUpdateFieldValue(itemField.ModifyValue(itemField.ItemAppearanceModID), pItem.GetVisibleAppearanceModId(this)); + SetUpdateFieldValue(itemField.ModifyValue(itemField.ItemVisual), pItem.GetVisibleItemVisual(this)); } else { - SetUInt32Value(PlayerFields.VisibleItem + (int)(slot * 2), 0); - SetUInt32Value(PlayerFields.VisibleItem + 1 + (int)(slot * 2), 0); + SetUpdateFieldValue(itemField.ModifyValue(itemField.ItemID), 0u); + SetUpdateFieldValue(itemField.ModifyValue(itemField.ItemAppearanceModID), (ushort)0); + SetUpdateFieldValue(itemField.ModifyValue(itemField.ItemVisual), (ushort)0); } } void VisualizeItem(uint slot, Item pItem) @@ -5601,9 +5589,9 @@ namespace Game.Entities Log.outDebug(LogFilter.Player, "STORAGE: EquipItem slot = {0}, item = {1}", slot, pItem.GetEntry()); m_items[slot] = pItem; - SetGuidValue(ActivePlayerFields.InvSlotHead + (int)(slot * 4), pItem.GetGUID()); - pItem.SetGuidValue(ItemFields.Contained, GetGUID()); - pItem.SetGuidValue(ItemFields.Owner, GetGUID()); + SetInvSlot(slot, pItem.GetGUID()); + pItem.SetContainedIn(GetGUID()); + pItem.SetOwnerGUID(GetGUID()); pItem.SetSlot((byte)slot); pItem.SetContainer(null); @@ -5625,7 +5613,7 @@ namespace Game.Entities for (byte i = 0; i < ItemConst.MaxBagSize; ++i) DestroyItem(slot, i, update); - if (pItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped)) + if (pItem.HasItemFlag(ItemFieldFlags.Wrapped)) { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GIFT); stmt.AddValue(0, pItem.GetGUID().GetCounter()); @@ -5645,7 +5633,7 @@ namespace Game.Entities Bag pBag; if (bag == InventorySlots.Bag0) { - SetGuidValue(ActivePlayerFields.InvSlotHead + (slot * 4), ObjectGuid.Empty); + SetInvSlot(slot, ObjectGuid.Empty); // equipment and equipped bags can have applied bonuses if (slot < InventorySlots.BagEnd) @@ -5699,7 +5687,7 @@ namespace Game.Entities } //pItem.SetOwnerGUID(ObjectGuid.Empty); - pItem.SetGuidValue(ItemFields.Contained, ObjectGuid.Empty); + pItem.SetContainedIn(ObjectGuid.Empty); pItem.SetSlot(ItemConst.NullSlot); pItem.SetState(ItemUpdateState.Removed, this); } @@ -6010,12 +5998,12 @@ namespace Game.Entities continue; } - Item pItem = StoreNewItem(dest, lootItem.itemid, true, lootItem.randomPropertyId, null, lootItem.context, lootItem.BonusListIDs); + Item pItem = StoreNewItem(dest, lootItem.itemid, true, lootItem.randomBonusListId, null, lootItem.context, lootItem.BonusListIDs); SendNewItem(pItem, lootItem.count, false, false, broadcast); } } - public byte GetInventorySlotCount() { return GetByteValue(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetNumBackpackSlots); } + public byte GetInventorySlotCount() { return m_activePlayerData.NumBackpackSlots; } public void SetInventorySlotCount(byte slots) { //ASSERT(slots <= (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START)); @@ -6058,15 +6046,15 @@ namespace Game.Entities } } - SetByteValue(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetNumBackpackSlots, slots); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NumBackpackSlots), slots); } - public byte GetBankBagSlotCount() { return GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots); } - public void SetBankBagSlotCount(byte count) { SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots, count); } + public byte GetBankBagSlotCount() { return m_activePlayerData.NumBankSlots; } + public void SetBankBagSlotCount(byte count) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NumBankSlots), count); } //Loot - public ObjectGuid GetLootGUID() { return GetGuidValue(PlayerFields.LootTargetGuid); } - public void SetLootGUID(ObjectGuid guid) { SetGuidValue(PlayerFields.LootTargetGuid, guid); } + public ObjectGuid GetLootGUID() { return m_playerData.LootTargetGUID; } + public void SetLootGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.LootTargetGUID), guid); } public void StoreLootItem(byte lootSlot, Loot loot, AELootResult aeResult = null) { NotNormalLootItem qitem = null; @@ -6104,7 +6092,7 @@ namespace Game.Entities InventoryResult msg = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, item.itemid, item.count); if (msg == InventoryResult.Ok) { - Item newitem = StoreNewItem(dest, item.itemid, true, item.randomPropertyId, item.GetAllowedLooters(), item.context, item.BonusListIDs); + Item newitem = StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); if (qitem != null) { qitem.is_looted = true; @@ -6196,7 +6184,7 @@ namespace Game.Entities return; // Now we must make bones lootable, and send player loot - bones.SetFlag(CorpseFields.DynamicFlags, 0x01); + bones.AddCorpseDynamicFlag(CorpseDynFlags.Lootable); // We store the level of our player in the gold field // We retrieve this information at Player.SendLoot() @@ -6571,7 +6559,7 @@ namespace Game.Entities SendLootError(loot.GetGUID(), guid, LootError.DidntKill); if (loot_type == LootType.Corpse && !guid.IsItem()) - SetFlag(UnitFields.Flags, UnitFlags.Looting); + AddUnitFlag(UnitFlags.Looting); } public void SendLootError(ObjectGuid lootObj, ObjectGuid owner, LootError error) @@ -6663,9 +6651,9 @@ namespace Game.Entities } //Void Storage - public bool IsVoidStorageUnlocked() { return HasFlag(PlayerFields.Flags, PlayerFlags.VoidUnlocked); } - public void UnlockVoidStorage() { SetFlag(PlayerFields.Flags, PlayerFlags.VoidUnlocked); } - public void LockVoidStorage() { RemoveFlag(PlayerFields.Flags, PlayerFlags.VoidUnlocked); } + public bool IsVoidStorageUnlocked() { return HasPlayerFlag(PlayerFlags.VoidUnlocked); } + public void UnlockVoidStorage() { AddPlayerFlag(PlayerFlags.VoidUnlocked); } + public void LockVoidStorage() { RemovePlayerFlag(PlayerFlags.VoidUnlocked); } public byte GetNextVoidStorageFreeSlot() { diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index a32345a1b..450404175 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -125,13 +125,13 @@ namespace Game.Entities pvpInfo.IsInNoPvPArea = false; if (area != null && area.IsSanctuary()) // in sanctuary { - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.Sanctuary); + AddPvpFlag(UnitPVPStateFlags.Sanctuary); pvpInfo.IsInNoPvPArea = true; if (duel == null) CombatStopWithPets(); } else - RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.Sanctuary); + RemovePvpFlag(UnitPVPStateFlags.Sanctuary); AreaFlags areaRestFlag = (GetTeam() == Team.Alliance) ? AreaFlags.RestZoneAlliance : AreaFlags.RestZoneHorde; if (area != null && area.Flags[0].HasAnyFlag(areaRestFlag)) diff --git a/Source/Game/Entities/Player/Player.PvP.cs b/Source/Game/Entities/Player/Player.PvP.cs index 20ec3316a..56fdf3ac2 100644 --- a/Source/Game/Entities/Player/Player.PvP.cs +++ b/Source/Game/Entities/Player/Player.PvP.cs @@ -46,16 +46,15 @@ namespace Game.Entities if (m_lastHonorUpdateTime >= yesterday) { // this is the first update today, reset today's contribution - ushort killsToday = GetUInt16Value(ActivePlayerFields.Kills, 0); - SetUInt16Value(ActivePlayerFields.Kills, 0, 0); - SetUInt16Value(ActivePlayerFields.Kills, 1, killsToday); - + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.YesterdayHonorableKills), m_activePlayerData.TodayHonorableKills); } else { // no honor/kills yesterday or today, reset - SetUInt32Value(ActivePlayerFields.Kills, 0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.YesterdayHonorableKills), (ushort)0); } + + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TodayHonorableKills), (ushort)0); } m_lastHonorUpdateTime = now; @@ -116,7 +115,8 @@ namespace Game.Entities // [15..28] Horde honor titles and player name // [29..38] Other title and player name // [39+] Nothing - uint victim_title = victim.GetUInt32Value(PlayerFields.ChosenTitle); + // this is all wrong, should be going off PvpTitle, not PlayerTitle + uint victim_title = plrVictim.m_playerData.PlayerTitle; // Get Killer titles, CharTitlesEntry.bit_index // Ranks: // title[1..14] . rank[5..18] @@ -134,9 +134,9 @@ namespace Game.Entities honor_f = (float)Math.Ceiling(Formulas.hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey)); // count the number of playerkills in one day - ApplyModUInt16Value(ActivePlayerFields.Kills, 0, 1, true); + ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TodayHonorableKills), (ushort)1, true); // and those in a lifetime - ApplyModUInt32Value(ActivePlayerFields.LifetimeHonorableKills, 1, true); + ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LifetimeHonorableKills), 1u, true); UpdateCriteria(CriteriaTypes.EarnHonorableKill); UpdateCriteria(CriteriaTypes.HkClass, (uint)victim.GetClass()); UpdateCriteria(CriteriaTypes.HkRace, (uint)victim.GetRace()); @@ -215,9 +215,16 @@ namespace Game.Entities return true; } + public void ResetHonorStats() + { + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TodayHonorableKills), (ushort)0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.YesterdayHonorableKills), (ushort)0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LifetimeHonorableKills), 0u); + } + void _InitHonorLevelOnLoadFromDB(uint honor, uint honorLevel) { - SetUInt32Value(PlayerFields.HonorLevel, honorLevel); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.HonorLevel), honorLevel); UpdateHonorNextLevel(); AddHonorXP(honor); @@ -250,8 +257,8 @@ namespace Game.Entities public void AddHonorXP(uint xp) { - uint currentHonorXP = GetUInt32Value(ActivePlayerFields.Honor); - uint nextHonorLevelXP = GetUInt32Value(ActivePlayerFields.HonorNextLevel); + uint currentHonorXP = m_activePlayerData.Honor; + uint nextHonorLevelXP = m_activePlayerData.HonorNextLevel; uint newHonorXP = currentHonorXP + xp; uint honorLevel = GetHonorLevel(); @@ -266,10 +273,10 @@ namespace Game.Entities SetHonorLevel((byte)(honorLevel + 1)); honorLevel = GetHonorLevel(); - nextHonorLevelXP = GetUInt32Value(ActivePlayerFields.HonorNextLevel); + nextHonorLevelXP = m_activePlayerData.HonorNextLevel; } - SetUInt32Value(ActivePlayerFields.Honor, IsMaxHonorLevel() ? 0 : newHonorXP); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Honor), IsMaxHonorLevel() ? 0 : newHonorXP); } void SetHonorLevel(byte level) @@ -278,7 +285,7 @@ namespace Game.Entities if (level == oldHonorLevel) return; - SetUInt32Value(PlayerFields.HonorLevel, level); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.HonorLevel), level); UpdateHonorNextLevel(); UpdateCriteria(CriteriaTypes.HonorLevelReached); @@ -289,10 +296,10 @@ namespace Game.Entities // 5500 at honor level 1 // no idea what between here // 8800 at honor level ~14 (never goes above 8800) - SetUInt32Value(ActivePlayerFields.HonorNextLevel, 8800); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.HonorNextLevel), 8800u); } - public uint GetHonorLevel() { return GetUInt32Value(PlayerFields.HonorLevel); } + public uint GetHonorLevel() { return m_playerData.HonorLevel; } public bool IsMaxHonorLevel() { return GetHonorLevel() == PlayerConst.MaxHonorLevel; } public void ActivatePvpItemLevels(bool activate) { _usePvpItemLevels = activate; } @@ -329,7 +336,7 @@ namespace Game.Entities if (talentInfo == null) return TalentLearnResult.FailedUnknown; - if (talentInfo.SpecID != GetInt32Value(PlayerFields.CurrentSpecId)) + if (talentInfo.SpecID != GetPrimarySpecialization()) return TalentLearnResult.FailedUnknown; if (talentInfo.LevelRequired > getLevel()) @@ -350,7 +357,7 @@ namespace Game.Entities PvpTalentRecord talent = CliDB.PvpTalentStorage.LookupByKey(GetPvpTalentMap(GetActiveTalentGroup())[slot]); if (talent != null) { - if (!HasFlag(PlayerFields.Flags, PlayerFlags.Resting) && !HasFlag(UnitFields.Flags2, UnitFlags2.AllowChangingTalents)) + if (!HasPlayerFlag(PlayerFlags.Resting) && !HasUnitFlag2(UnitFlags2.AllowChangingTalents)) return TalentLearnResult.FailedRestArea; if (GetSpellHistory().HasCooldown(talent.SpellID)) @@ -638,7 +645,7 @@ namespace Game.Entities if (gameobject) { FactionTemplateRecord playerFaction = GetFactionTemplateEntry(); - FactionTemplateRecord faction = CliDB.FactionTemplateStorage.LookupByKey(gameobject.GetUInt32Value(GameObjectFields.Faction)); + FactionTemplateRecord faction = CliDB.FactionTemplateStorage.LookupByKey(gameobject.GetFaction()); if (playerFaction != null && faction != null && !playerFaction.IsFriendlyTo(faction)) return false; @@ -705,7 +712,7 @@ namespace Game.Entities public void SetBGTeam(Team team) { m_bgData.bgTeam = (uint)team; - SetByteValue(PlayerFields.Bytes4, PlayerFieldOffsets.Bytes4OffsetArenaFaction, (byte)(team == Team.Alliance ? 1 : 0)); + SetArenaFaction((byte)(team == Team.Alliance ? 1 : 0)); } public Team GetBGTeam() @@ -871,7 +878,7 @@ namespace Game.Entities //Arenas public void SetArenaTeamInfoField(byte slot, ArenaTeamInfoType type, uint value) { - SetUInt32Value(ActivePlayerFields.ArenaTeamInfo + (slot * (int)ArenaTeamInfoType.End) + (int)type, value); + } public void SetInArenaTeam(uint ArenaTeamId, byte slot, byte type) @@ -914,11 +921,11 @@ namespace Game.Entities } while (result.NextRow()); } - public uint GetArenaTeamId(byte slot) { return GetUInt32Value(ActivePlayerFields.ArenaTeamInfo + (slot * (int)ArenaTeamInfoType.End) + (int)ArenaTeamInfoType.Id); } - public uint GetArenaPersonalRating(byte slot) { return GetUInt32Value(ActivePlayerFields.ArenaTeamInfo + (slot * (int)ArenaTeamInfoType.End) + (int)ArenaTeamInfoType.PersonalRating); } + public uint GetArenaTeamId(byte slot) { return 0; } + public uint GetArenaPersonalRating(byte slot) { return m_activePlayerData.PvpInfo[slot].Rating; } public void SetArenaTeamIdInvited(uint ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; } public uint GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; } - public uint GetRBGPersonalRating() { return 0; } + public uint GetRBGPersonalRating() { return m_activePlayerData.PvpInfo[3].Rating; } //OutdoorPVP public bool IsOutdoorPvPActive() diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 958981f2e..02faff1aa 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -145,7 +145,7 @@ namespace Game.Entities public void DailyReset() { - foreach (uint questId in GetDynamicValues(ActivePlayerDynamicFields.DailyQuests)) + foreach (uint questId in m_activePlayerData.DailyQuestsCompleted) { uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(questId); if (questBit != 0) @@ -153,10 +153,10 @@ namespace Game.Entities } DailyQuestsReset dailyQuestsReset = new DailyQuestsReset(); - dailyQuestsReset.Count = GetDynamicValues(ActivePlayerDynamicFields.DailyQuests).Length; + dailyQuestsReset.Count = m_activePlayerData.DailyQuestsCompleted.Size(); SendPacket(dailyQuestsReset); - ClearDynamicValue(ActivePlayerDynamicFields.DailyQuests); + ClearDynamicUpdateFieldValues(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DailyQuestsCompleted)); m_DFQuests.Clear(); // Dungeon Finder Quests. @@ -226,7 +226,7 @@ namespace Game.Entities switch (questGiver.GetTypeId()) { case TypeId.Unit: - return GetNPCIfCanInteractWith(questGiver.GetGUID(), NPCFlags.QuestGiver) != null; + return GetNPCIfCanInteractWith(questGiver.GetGUID(), NPCFlags.QuestGiver, NPCFlags2.None) != null; case TypeId.GameObject: return GetGameObjectIfCanInteractWith(questGiver.GetGUID(), GameObjectTypes.QuestGiver) != null; case TypeId.Player: @@ -331,7 +331,7 @@ namespace Game.Entities return; } - if (!source.IsTypeId(TypeId.Unit) || source.HasFlag64(UnitFields.NpcFlags, NPCFlags.Gossip)) + if (!source.IsTypeId(TypeId.Unit) || source.ToUnit().HasNpcFlag(NPCFlags.Gossip)) { if (quest.IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true)) AddQuestAndCheckCompletion(quest, source); @@ -880,7 +880,7 @@ namespace Game.Entities List dest = new List(); if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity) == InventoryResult.Ok) { - Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantment.GenerateItemRandomPropertyId(questPackageItem.ItemID)); + Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(questPackageItem.ItemID)); SendNewItem(item, questPackageItem.ItemQuantity, true, false); } } @@ -900,7 +900,7 @@ namespace Game.Entities List dest = new List(); if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity) == InventoryResult.Ok) { - Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantment.GenerateItemRandomPropertyId(questPackageItem.ItemID)); + Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(questPackageItem.ItemID)); SendNewItem(item, questPackageItem.ItemQuantity, true, false); } } @@ -954,7 +954,7 @@ namespace Game.Entities List dest = new List(); if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, reward, quest.RewardChoiceItemCount[i]) == InventoryResult.Ok) { - Item item = StoreNewItem(dest, reward, true, ItemEnchantment.GenerateItemRandomPropertyId(reward)); + Item item = StoreNewItem(dest, reward, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(reward)); SendNewItem(item, quest.RewardChoiceItemCount[i], true, false); } } @@ -975,7 +975,7 @@ namespace Game.Entities List dest = new List(); if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemId, quest.RewardItemCount[i]) == InventoryResult.Ok) { - Item item = StoreNewItem(dest, itemId, true, ItemEnchantment.GenerateItemRandomPropertyId(itemId)); + Item item = StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId)); SendNewItem(item, quest.RewardItemCount[i], true, false); } else if (quest.IsDFQuest()) @@ -1609,12 +1609,7 @@ namespace Game.Entities return true; } - var dailies = GetDynamicValues(ActivePlayerDynamicFields.DailyQuests); - foreach (var dailyQuestId in dailies) - if (dailyQuestId == qInfo.Id) - return false; - - return true; + return m_activePlayerData.DailyQuestsCompleted.FindIndex(qInfo.Id) == -1; } public bool SatisfyQuestWeek(Quest qInfo, bool msg) @@ -1977,34 +1972,37 @@ namespace Game.Entities public uint GetQuestSlotQuestId(ushort slot) { - return GetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.Id); + return m_playerData.QuestLog[slot].QuestID; } public uint GetQuestSlotState(ushort slot, byte counter) { - return GetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.State); + return m_playerData.QuestLog[slot].StateFlags; } public ushort GetQuestSlotCounter(ushort slot, byte counter) { if (counter < SharedConst.MaxQuestCounts) - return GetUInt16Value(PlayerFields.QuestLog + slot * QuestSlotOffsets.Max + QuestSlotOffsets.Counts + counter /2, (byte)(counter % 2)); + return m_playerData.QuestLog[slot].ObjectiveProgress[counter]; return 0; } public uint GetQuestSlotTime(ushort slot) { - return GetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.Time); + return m_playerData.QuestLog[slot].EndTime; } public void SetQuestSlot(ushort slot, uint quest_id, uint timer = 0) { - SetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.Id, quest_id); - SetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.State, 0); - for (int i = 0; i < SharedConst.MaxQuestCounts / 2; ++i) - SetUInt32Value(PlayerFields.QuestLog + slot * QuestSlotOffsets.Max + QuestSlotOffsets.Counts + i, 0); - SetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.Time, timer); + var questLogField = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot); + SetUpdateFieldValue(questLogField.ModifyValue(questLogField.QuestID), quest_id); + SetUpdateFieldValue(questLogField.ModifyValue(questLogField.StateFlags), 0u); + + for (int i = 0; i < SharedConst.MaxQuestCounts; ++i) + SetUpdateFieldValue(ref questLogField.ModifyValue(questLogField.ObjectiveProgress, i), (ushort)0); + + SetUpdateFieldValue(questLogField.ModifyValue(questLogField.EndTime), timer); } public void SetQuestSlotCounter(ushort slot, byte counter, ushort count) @@ -2012,22 +2010,24 @@ namespace Game.Entities if (counter >= SharedConst.MaxQuestCounts) return; - SetUInt16Value(PlayerFields.QuestLog + slot * QuestSlotOffsets.Max + QuestSlotOffsets.Counts + counter / 2, (byte)(counter % 2), count); + SetUpdateFieldValue(ref m_playerData.ModifyValue(m_playerData.QuestLog, slot).ModifyValue((QuestLog questLogField) => questLogField.ObjectiveProgress, counter), count); } public void SetQuestSlotState(ushort slot, QuestSlotStateMask state) { - SetFlag(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.State, state); + QuestLog questLogField = m_playerData.ModifyValue(m_playerData.QuestLog, slot); + SetUpdateFieldFlagValue(questLogField.ModifyValue(questLogField.StateFlags), (uint)state); } public void RemoveQuestSlotState(ushort slot, QuestSlotStateMask state) { - RemoveFlag(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.State, state); + QuestLog questLogField = m_playerData.ModifyValue(m_playerData.QuestLog, slot); + RemoveUpdateFieldFlagValue(questLogField.ModifyValue(questLogField.StateFlags), (uint)state); } public void SetQuestSlotTimer(ushort slot, uint timer) { - SetUInt32Value(PlayerFields.QuestLog + (slot * QuestSlotOffsets.Max) + QuestSlotOffsets.Time, timer); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot).ModifyValue((QuestLog questLog) => questLog.EndTime), timer); } void SetQuestCompletedBit(uint questBit, bool completed) @@ -2035,11 +2035,15 @@ namespace Game.Entities if (questBit == 0) return; - int fieldOffset = ((int)questBit - 1) >> 5; + uint fieldOffset = (questBit - 1) >> 6; if (fieldOffset >= PlayerConst.QuestsCompletedBitsSize) return; - ApplyModFlag(ActivePlayerFields.QuestCompleted + fieldOffset, (uint)(1 << (((int)questBit - 1) & 31)), completed); + ulong flag = 1ul << (((int)questBit - 1) & 63); + if (completed) + SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted, (int)fieldOffset), flag); + else + RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted, (int)fieldOffset), flag); } public void AreaExploredOrEventHappens(uint questId) @@ -2885,7 +2889,7 @@ namespace Game.Entities if (!questgiver || questgiver.IsHostileTo(this)) continue; - if (!questgiver.HasFlag64(UnitFields.NpcFlags, NPCFlags.QuestGiver)) + if (!questgiver.HasNpcFlag(NPCFlags.QuestGiver)) continue; response.QuestGiver.Add(new QuestGiverInfo(questgiver.GetGUID(), GetQuestDialogStatus(questgiver))); @@ -2978,7 +2982,7 @@ namespace Game.Entities continue; // check if this unit requires quest specific flags - if (!obj.HasFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick)) + if (!obj.HasNpcFlag(NPCFlags.SpellClick)) continue; var clickPair = Global.ObjectMgr.GetSpellClickInfoMapBounds(obj.GetEntry()); @@ -3014,7 +3018,7 @@ namespace Game.Entities { if (!qQuest.IsDFQuest()) { - AddDynamicValue(ActivePlayerDynamicFields.DailyQuests, quest_id); + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DailyQuestsCompleted), quest_id); m_lastDailyQuestTime = Time.UnixTime; // last daily quest time m_DailyQuestChanged = true; @@ -3030,21 +3034,7 @@ namespace Game.Entities public bool IsDailyQuestDone(uint quest_id) { - bool found = false; - if (Global.ObjectMgr.GetQuestTemplate(quest_id) != null) - { - var dailies = GetDynamicValues(ActivePlayerDynamicFields.DailyQuests); - foreach (uint dailyQuestId in dailies) - { - if (dailyQuestId == quest_id) - { - found = true; - break; - } - } - } - - return found; + return m_activePlayerData.DailyQuestsCompleted.FindIndex(quest_id) >= 0; } void SetWeeklyQuestStatus(uint quest_id) diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 3d8c6dac2..507ee5c16 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -32,10 +32,11 @@ namespace Game.Entities void UpdateSkillsForLevel() { ushort maxSkill = GetMaxSkillValueForLevel(); + SkillInfo skillInfoField = m_activePlayerData.Skill; foreach (var pair in mSkillStatus) { - if (pair.Value.State == SkillState.Deleted) + if (pair.Value.State == SkillState.Deleted || skillInfoField.SkillRank[pair.Value.Pos] == 0) continue; uint pskill = pair.Key; @@ -43,36 +44,35 @@ namespace Game.Entities if (rcEntry == null) continue; - ushort field = (ushort)(pair.Value.Pos / 2); - byte offset = (byte)(pair.Value.Pos & 1); - if (Global.SpellMgr.GetSkillRangeType(rcEntry) == SkillRangeType.Level) { - ushort max = GetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset); + ushort max = skillInfoField.SkillMaxRank[pair.Value.Pos]; // update only level dependent max skill values if (max != 1) { - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, maxSkill); - SetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset, maxSkill); + SetSkillRank(pair.Value.Pos, maxSkill); + SetSkillMaxRank(pair.Value.Pos, maxSkill); if (pair.Value.State != SkillState.New) pair.Value.State = SkillState.Changed; } } // Update level dependent skillline spells - LearnSkillRewardedSpells(rcEntry.SkillID, GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset)); + LearnSkillRewardedSpells(rcEntry.SkillID, skillInfoField.SkillRank[pair.Value.Pos]); } } public void UpdateSkillsToMaxSkillsForLevel() { - foreach (var skill in mSkillStatus) + SkillInfo skillInfoField = m_activePlayerData.Skill; + + foreach (var pair in mSkillStatus) { - if (skill.Value.State == SkillState.Deleted) + if (pair.Value.State == SkillState.Deleted || skillInfoField.SkillRank[pair.Value.Pos] == 0) continue; - uint pskill = skill.Key; + uint pskill = pair.Key; SkillRaceClassInfoRecord rcEntry = Global.DB2Mgr.GetSkillRaceClassInfo(pskill, GetRace(), GetClass()); if (rcEntry == null) continue; @@ -83,16 +83,13 @@ namespace Game.Entities if (Global.SpellMgr.IsWeaponSkill(rcEntry.SkillID)) continue; - ushort field = (ushort)(skill.Value.Pos / 2); - byte offset = (byte)(skill.Value.Pos & 1); - - ushort max = GetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset); + ushort max = skillInfoField.SkillMaxRank[pair.Value.Pos]; if (max > 1) { - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, max); + SetSkillRank(pair.Value.Pos, max); - if (skill.Value.State != SkillState.New) - skill.Value.State = SkillState.Changed; + if (pair.Value.State != SkillState.New) + pair.Value.State = SkillState.Changed; } } } @@ -102,16 +99,15 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - int result = GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset); - result += GetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset); - result += GetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset); + int result = skillInfo.SkillRank[skillStatusData.Pos]; + result += skillInfo.SkillTempBonus[skillStatusData.Pos]; + result += skillInfo.SkillPermBonus[skillStatusData.Pos]; return (ushort)(result < 0 ? 0 : result); } @@ -120,16 +116,15 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - int result = GetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset); - result += GetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset); - result += GetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset); + int result = skillInfo.SkillMaxRank[skillStatusData.Pos]; + result += skillInfo.SkillTempBonus[skillStatusData.Pos]; + result += skillInfo.SkillPermBonus[skillStatusData.Pos]; return (ushort)(result < 0 ? 0 : result); } @@ -138,14 +133,13 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey((uint)skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - return GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset); + return skillInfo.SkillRank[skillStatusData.Pos]; } public ushort GetSkillStep(SkillType skill) @@ -153,14 +147,16 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; var field = (ushort)(skillStatusData.Pos / 2); var offset = (byte)(skillStatusData.Pos & 1); - return GetUInt16Value(ActivePlayerFields.SkillLineStep + field, offset); + return skillInfo.SkillStep[skillStatusData.Pos]; } public ushort GetPureMaxSkillValue(SkillType skill) @@ -168,14 +164,13 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - return GetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset); + return skillInfo.SkillMaxRank[skillStatusData.Pos]; } public ushort GetBaseSkillValue(SkillType skill) @@ -183,15 +178,14 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - var result = (int)GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset); - result += GetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset); + int result = skillInfo.SkillRank[skillStatusData.Pos]; + result += skillInfo.SkillPermBonus[skillStatusData.Pos]; return (ushort)(result < 0 ? 0 : result); } @@ -200,14 +194,13 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - return GetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset); + return skillInfo.SkillPermBonus[skillStatusData.Pos]; } public ushort GetSkillTempBonusValue(uint skill) @@ -215,19 +208,18 @@ namespace Game.Entities if (skill == 0) return 0; + SkillInfo skillInfo = m_activePlayerData.Skill; + var skillStatusData = mSkillStatus.LookupByKey(skill); - if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfo.SkillRank[skillStatusData.Pos] == 0) return 0; - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - - return GetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset); + return skillInfo.SkillTempBonus[skillStatusData.Pos]; } void InitializeSelfResurrectionSpells() { - ClearDynamicValue(ActivePlayerDynamicFields.SelfResSpells); + ClearSelfResSpell(); uint[] spells = new uint[3]; @@ -248,7 +240,7 @@ namespace Game.Entities foreach (uint selfResSpell in spells) if (selfResSpell != 0) - AddDynamicValue(ActivePlayerDynamicFields.SelfResSpells, selfResSpell); + AddSelfResSpell(selfResSpell); } public void PetSpellInitialize() @@ -294,7 +286,7 @@ namespace Game.Entities public bool CanSeeSpellClickOn(Creature creature) { - if (!creature.HasFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick)) + if (!creature.HasNpcFlag(NPCFlags.SpellClick)) return false; var clickPair = Global.ObjectMgr.GetSpellClickInfoMapBounds(creature.GetEntry()); @@ -329,19 +321,21 @@ namespace Game.Entities return base.GetCastSpellInfo(spellInfo); } - void AddOverrideSpell(uint overridenSpellId, uint newSpellId) + public void SetOverrideSpellsId(uint overrideSpellsId) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OverrideSpellsID), overrideSpellsId); } + + public void AddOverrideSpell(uint overridenSpellId, uint newSpellId) { m_overrideSpells.Add(overridenSpellId, newSpellId); } - void RemoveOverrideSpell(uint overridenSpellId, uint newSpellId) + public void RemoveOverrideSpell(uint overridenSpellId, uint newSpellId) { m_overrideSpells.Remove(overridenSpellId, newSpellId); } void LearnSpecializationSpells() { - var specSpells = Global.DB2Mgr.GetSpecializationSpells(GetUInt32Value(PlayerFields.CurrentSpecId)); + var specSpells = Global.DB2Mgr.GetSpecializationSpells(GetPrimarySpecialization()); if (specSpells != null) { for (int j = 0; j < specSpells.Count; ++j) @@ -406,6 +400,23 @@ namespace Game.Entities SendPacket(cooldowns); } + void InitializeSkillFields() + { + uint i = 0; + foreach (SkillLineRecord skillLine in CliDB.SkillLineStorage.Values) + { + SkillRaceClassInfoRecord rcEntry = Global.DB2Mgr.GetSkillRaceClassInfo(skillLine.Id, GetRace(), GetClass()); + if (rcEntry != null) + { + SetSkillLineId(i, (ushort)skillLine.Id); + SetSkillStartingRank(i, 1); + mSkillStatus.Add(skillLine.Id, new SkillStatusData(i, SkillState.Unchanged)); + if (++i >= SkillConst.MaxPlayerSkills) + break; + } + } + } + public bool UpdateSkillPro(SkillType skillId, int chance, uint step) { return UpdateSkillPro((uint)skillId, chance, step); @@ -431,11 +442,10 @@ namespace Game.Entities if (skillStatusData == null || skillStatusData.State == SkillState.Deleted) return false; - ushort field = (ushort)(skillStatusData.Pos / 2); - byte offset = (byte)(skillStatusData.Pos & 1); + SkillInfo skillInfoField = m_activePlayerData.Skill; - ushort value = GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset); - ushort max = GetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset); + ushort value = skillInfoField.SkillRank[skillStatusData.Pos]; + ushort max = skillInfoField.SkillMaxRank[skillStatusData.Pos]; if (max == 0 || value == 0 || value >= max) return false; @@ -450,7 +460,7 @@ namespace Game.Entities if (new_value > max) new_value = max; - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, new_value); + SetSkillRank(skillStatusData.Pos, new_value); if (skillStatusData.State != SkillState.New) skillStatusData.State = SkillState.Changed; @@ -577,7 +587,7 @@ namespace Game.Entities } // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 - ItemDynamicFieldGems gem = item.GetGem((ushort)(slot - EnchantmentSlot.Sock1)); + SocketedGem gem = item.GetGem((ushort)(slot - EnchantmentSlot.Sock1)); if (gem != null) { ItemTemplate gemTemplate = Global.ObjectMgr.GetItemTemplate(gem.ItemId); @@ -617,31 +627,7 @@ namespace Game.Entities if (enchant_spell_id != 0) { if (apply) - { - int basepoints = 0; - // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor) - if (item.GetItemRandomPropertyId() < 0) - { - ItemRandomSuffixRecord item_rand = CliDB.ItemRandomSuffixStorage.LookupByKey(Math.Abs(item.GetItemRandomPropertyId())); - if (item_rand != null) - { - // Search enchant_amount - for (int k = 0; k < ItemConst.MaxItemRandomProperties; ++k) - { - if (item_rand.Enchantment[k] == enchant_id) - { - basepoints = (int)((item_rand.AllocationPct[k] * item.GetItemSuffixFactor()) / 10000); - break; - } - } - } - } - // Cast custom spell vs all equal basepoints got from enchant_amount - if (basepoints != 0) - CastCustomSpell(this, enchant_spell_id, basepoints, basepoints, basepoints, true, item); - else - CastSpell(this, enchant_spell_id, true, item); - } + CastSpell(this, enchant_spell_id, true, item); else RemoveAurasDueToItemSpell(enchant_spell_id, item.GetGUID()); } @@ -650,7 +636,7 @@ namespace Game.Entities if (pEnchant.ScalingClass != 0) { int scalingClass = pEnchant.ScalingClass; - if ((GetUInt32Value(UnitFields.MinItemLevel) != 0 || GetUInt32Value(UnitFields.MaxItemlevel) != 0) && pEnchant.ScalingClassRestricted != 0) + if ((m_unitData.MinItemLevel != 0 || m_unitData.MaxItemLevel != 0) && pEnchant.ScalingClassRestricted != 0) scalingClass = pEnchant.ScalingClassRestricted; uint minLevel = ((uint)(pEnchant.Flags)).HasAnyFlag(0x20u) ? 1 : 60u; @@ -667,22 +653,7 @@ namespace Game.Entities enchant_amount = (uint)(pEnchant.EffectScalingPoints[s] * CliDB.GetSpellScalingColumnForClass(spellScaling, scalingClass)); } - if (enchant_amount == 0) - { - ItemRandomSuffixRecord item_rand = CliDB.ItemRandomSuffixStorage.LookupByKey(Math.Abs(item.GetItemRandomPropertyId())); - if (item_rand != null) - { - for (int k = 0; k < ItemConst.MaxItemRandomProperties; ++k) - { - if (item_rand.Enchantment[k] == enchant_id) - { - enchant_amount = (item_rand.AllocationPct[k] * item.GetItemSuffixFactor()) / 10000; - break; - } - } - } - } - + enchant_amount = Math.Max(enchant_amount, 1u); HandleStatModifier((UnitMods)((uint)UnitMods.ResistanceStart + enchant_spell_id), UnitModifierType.TotalValue, enchant_amount, apply); break; case ItemEnchantmentType.Stat: @@ -690,7 +661,7 @@ namespace Game.Entities if (pEnchant.ScalingClass != 0) { int scalingClass = pEnchant.ScalingClass; - if ((GetUInt32Value(UnitFields.MinItemLevel) != 0 || GetUInt32Value(UnitFields.MaxItemlevel) != 0) && pEnchant.ScalingClassRestricted != 0) + if ((m_unitData.MinItemLevel != 0 || m_unitData.MaxItemLevel != 0) && pEnchant.ScalingClassRestricted != 0) scalingClass = pEnchant.ScalingClassRestricted; uint minLevel = ((uint)(pEnchant.Flags)).HasAnyFlag(0x20u) ? 1 : 60u; @@ -707,21 +678,7 @@ namespace Game.Entities enchant_amount = (uint)(pEnchant.EffectScalingPoints[s] * CliDB.GetSpellScalingColumnForClass(spellScaling, scalingClass)); } - if (enchant_amount == 0) - { - ItemRandomSuffixRecord item_rand_suffix = CliDB.ItemRandomSuffixStorage.LookupByKey(Math.Abs(item.GetItemRandomPropertyId())); - if (item_rand_suffix != null) - { - for (int k = 0; k < ItemConst.MaxItemRandomProperties; ++k) - { - if (item_rand_suffix.Enchantment[k] == enchant_id) - { - enchant_amount = (item_rand_suffix.AllocationPct[k] * item.GetItemSuffixFactor()) / 10000; - break; - } - } - } - } + enchant_amount = Math.Max(enchant_amount, 1u); Log.outDebug(LogFilter.Player, "Adding {0} to stat nb {1}", enchant_amount, enchant_spell_id); switch ((ItemModType)enchant_spell_id) @@ -914,7 +871,9 @@ namespace Game.Entities // visualize enchantment at player and equipped items if (slot == EnchantmentSlot.Perm) - SetUInt16Value(PlayerFields.VisibleItem + 1 + (item.GetSlot() * 2), 1, item.GetVisibleItemVisual(this)); + { + SetUpdateFieldValue(m_playerData.ModifyValue(m_playerData.VisibleItems, item.GetSlot()).ModifyValue((VisibleItem visibleItemField) => visibleItemField.ItemVisual), item.GetVisibleItemVisual(this)); + } if (apply_dur) { @@ -935,16 +894,16 @@ namespace Game.Entities public void ModifySkillBonus(SkillType skillid, int val, bool talent) { - var skill = mSkillStatus.LookupByKey(skillid); - if (skill == null || skill.State == SkillState.Deleted) + SkillInfo skillInfoField = m_activePlayerData.Skill; + + var skillStatusData = mSkillStatus.LookupByKey(skillid); + if (skillStatusData == null || skillStatusData.State == SkillState.Deleted || skillInfoField.SkillRank[skillStatusData.Pos] == 0) return; - int field = (int)(skill.Pos / 2 + (talent ? ActivePlayerFields.SkillLinePermBonus : ActivePlayerFields.SkillLineTempBonus)); - byte offset = (byte)(skill.Pos & 1); - - ushort bonus = GetUInt16Value(field, offset); - - SetUInt16Value(field, offset, (ushort)(bonus + val)); + if (talent) + SetSkillPermBonus(skillStatusData.Pos, (ushort)(skillInfoField.SkillPermBonus[skillStatusData.Pos] + val)); + else + SetSkillTempBonus(skillStatusData.Pos, (ushort)(skillInfoField.SkillTempBonus[skillStatusData.Pos] + val)); } public void StopCastingBindSight() @@ -1091,7 +1050,7 @@ namespace Game.Entities public bool CanUseMastery() { - ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(GetUInt32Value(PlayerFields.CurrentSpecId)); + ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization()); if (chrSpec != null) return HasSpell(chrSpec.MasterySpellID[0]) || HasSpell(chrSpec.MasterySpellID[1]); @@ -1103,8 +1062,10 @@ namespace Game.Entities if (skill == 0) return false; - var _skill = mSkillStatus.LookupByKey((uint)skill); - return _skill != null && _skill.State != SkillState.Deleted; + SkillInfo skillInfoField = m_activePlayerData.Skill; + + var skillStatusData = mSkillStatus.LookupByKey((uint)skill); + return skillStatusData != null && skillStatusData.State != SkillState.Deleted && skillInfoField.SkillRank[skillStatusData.Pos] != 0; } public void SetSkill(SkillType skill, uint step, uint newVal, uint maxVal) { @@ -1117,13 +1078,12 @@ namespace Game.Entities ushort currVal; var skillStatusData = mSkillStatus.LookupByKey(id); + SkillInfo skillInfoField = m_activePlayerData.Skill; //has skill if (skillStatusData != null && skillStatusData.State != SkillState.Deleted) { - var field = (ushort)(skillStatusData.Pos / 2); - var offset = (byte)(skillStatusData.Pos & 1); - currVal = GetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset); + currVal = skillInfoField.SkillRank[skillStatusData.Pos]; if (newVal != 0) { // if skill value is going down, update enchantments before setting the new value @@ -1131,10 +1091,10 @@ namespace Game.Entities UpdateSkillEnchantments(id, currVal, (ushort)newVal); // update step - SetUInt16Value(ActivePlayerFields.SkillLineStep + field, offset, (ushort)step); + SetSkillStep(skillStatusData.Pos, (ushort)step); // update value - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, (ushort)newVal); - SetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset, (ushort)maxVal); + SetSkillRank(skillStatusData.Pos, (ushort)newVal); + SetSkillMaxRank(skillStatusData.Pos, (ushort)maxVal); if (skillStatusData.State != SkillState.New) skillStatusData.State = SkillState.Changed; @@ -1152,45 +1112,45 @@ namespace Game.Entities //remove enchantments needing this skill UpdateSkillEnchantments(id, currVal, 0); // clear skill fields - SetUInt16Value(ActivePlayerFields.SkillLineId + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineStep + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset, 0); + SetSkillStep(skillStatusData.Pos, 0); + SetSkillRank(skillStatusData.Pos, 0); + SetSkillStartingRank(skillStatusData.Pos, 1); + SetSkillMaxRank(skillStatusData.Pos, 0); + SetSkillTempBonus(skillStatusData.Pos, 0); + SetSkillPermBonus(skillStatusData.Pos, 0); // mark as deleted or simply remove from map if not saved yet if (skillStatusData.State != SkillState.New) skillStatusData.State = SkillState.Deleted; - else - mSkillStatus.Remove(id); // remove all spells that related to this skill List skillLineAbilities = Global.DB2Mgr.GetSkillLineAbilitiesBySkill(id); foreach (SkillLineAbilityRecord skillLineAbility in skillLineAbilities) RemoveSpell(Global.SpellMgr.GetFirstSpellInChain(skillLineAbility.Spell)); - foreach (SkillLineRecord childSkillLine in CliDB.SkillLineStorage.Values) + List childSkillLines = Global.DB2Mgr.GetSkillLinesForParentSkill(id); + if (childSkillLines != null) { - if (childSkillLine.ParentSkillLineID == id) - SetSkill(childSkillLine.Id, 0, 0, 0); + foreach (SkillLineRecord childSkillLine in childSkillLines) + { + if (childSkillLine.ParentSkillLineID == id) + SetSkill(childSkillLine.Id, 0, 0, 0); + } } // Clear profession lines - if (GetUInt32Value(ActivePlayerFields.ProfessionSkillLine) == id) - SetUInt32Value(ActivePlayerFields.ProfessionSkillLine, 0); - else if (GetUInt32Value(ActivePlayerFields.ProfessionSkillLine + 1) == id) - SetUInt32Value(ActivePlayerFields.ProfessionSkillLine + 1, 0); + if (m_activePlayerData.ProfessionSkillLine[0] == id) + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ProfessionSkillLine, 0), 0u); + else if (m_activePlayerData.ProfessionSkillLine[1] == id) + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ProfessionSkillLine, 1), 0u); } } - else if (newVal != 0) //add + else //add { currVal = 0; - for (int i = 0; i < SkillConst.MaxPlayerSkills; ++i) + for (uint i = 0; i < SkillConst.MaxPlayerSkills; ++i) { - var field = (ushort)(i / 2); - var offset = (byte)(i & 1); - if (GetUInt16Value(ActivePlayerFields.SkillLineId + field, offset) == 0) + if (skillInfoField.SkillLineID[(int)i] == 0) { var skillEntry = CliDB.SkillLineStorage.LookupByKey(id); if (skillEntry == null) @@ -1200,7 +1160,7 @@ namespace Game.Entities } - if (skillEntry.ParentSkillLineID != 0 && skillEntry.ParentTierIndex > 0) + if (skillEntry.ParentSkillLineID != 0) { SkillRaceClassInfoRecord rcEntry = Global.DB2Mgr.GetSkillRaceClassInfo(skillEntry.ParentSkillLineID, GetRace(), GetClass()); if (rcEntry != null) @@ -1209,25 +1169,38 @@ namespace Game.Entities if (tier != null) { ushort skillval = GetPureSkillValue((SkillType)skillEntry.ParentSkillLineID); - SetSkill((SkillType)skillEntry.ParentSkillLineID, (uint)skillEntry.ParentTierIndex, Math.Max(skillval, (ushort)1), tier.Value[skillEntry.ParentTierIndex - 1]); + SetSkill(skillEntry.ParentSkillLineID, (uint)skillEntry.ParentTierIndex, Math.Max(skillval, (ushort)1), tier.Value[skillEntry.ParentTierIndex - 1]); } } + } + else + { // also learn missing child skills at 0 value + List childSkillLines = Global.DB2Mgr.GetSkillLinesForParentSkill(id); + if (childSkillLines != null) + foreach (SkillLineRecord childSkillLine in childSkillLines) + if (!HasSkill((SkillType)childSkillLine.Id)) + SetSkill(childSkillLine.Id, 0, 0, 0); + if (skillEntry.CategoryID == SkillCategory.Profession) { int freeProfessionSlot = FindProfessionSlotFor(id); if (freeProfessionSlot != -1) - SetUInt32Value(ActivePlayerFields.ProfessionSkillLine + freeProfessionSlot, id); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ProfessionSkillLine, freeProfessionSlot), id); } } - SetUInt16Value(ActivePlayerFields.SkillLineId + field, offset, (ushort)id); - SetUInt16Value(ActivePlayerFields.SkillLineStep + field, offset, (ushort)step); - SetUInt16Value(ActivePlayerFields.SkillLineRank + field, offset, (ushort)newVal); - SetUInt16Value(ActivePlayerFields.SkillLineMaxRank + field, offset, (ushort)maxVal); + SetSkillLineId(i, (ushort)id); + + SetSkillStep(i, (ushort)step); + SetSkillRank(i, (ushort)newVal); + SetSkillStartingRank(i, 1); + SetSkillMaxRank(i, (ushort)maxVal); + + // apply skill bonuses + SetSkillTempBonus(i, 0); + SetSkillPermBonus(i, 0); UpdateSkillEnchantments(id, currVal, (ushort)newVal); - UpdateCriteria(CriteriaTypes.ReachSkillLevel, id); - UpdateCriteria(CriteriaTypes.LearnSkillLevel, id); // insert new entry or update if not deleted old entry yet if (skillStatusData != null) @@ -1238,35 +1211,31 @@ namespace Game.Entities else mSkillStatus.Add(id, new SkillStatusData((uint)i, SkillState.New)); - // apply skill bonuses - SetUInt16Value(ActivePlayerFields.SkillLineTempBonus + field, offset, 0); - SetUInt16Value(ActivePlayerFields.SkillLinePermBonus + field, offset, 0); - - // temporary bonuses - var mModSkill = GetAuraEffectsByType(AuraType.ModSkill); - foreach (var j in mModSkill) + if (newVal != 0) { - if (j.GetMiscValue() == id) - j.HandleEffect(this, AuraEffectHandleModes.Skill, true); - } + UpdateCriteria(CriteriaTypes.ReachSkillLevel, id); + UpdateCriteria(CriteriaTypes.LearnSkillLevel, id); - var mModSkill2 = GetAuraEffectsByType(AuraType.ModSkill2); - foreach (var j in mModSkill2) - { - if (j.GetMiscValue() == id) - j.HandleEffect(this, AuraEffectHandleModes.Skill, true); - } + // temporary bonuses + var mModSkill = GetAuraEffectsByType(AuraType.ModSkill); + foreach (var auraEffect in mModSkill) + if (auraEffect.GetMiscValue() == id) + auraEffect.HandleEffect(this, AuraEffectHandleModes.Skill, true); - // permanent bonuses - var mModSkillTalent = GetAuraEffectsByType(AuraType.ModSkillTalent); - foreach (var eff in mModSkillTalent) - { - if (eff.GetMiscValue() == id) - eff.HandleEffect(this, AuraEffectHandleModes.Skill, true); - } + var mModSkill2 = GetAuraEffectsByType(AuraType.ModSkill2); + foreach (var auraEffect in mModSkill2) + if (auraEffect.GetMiscValue() == id) + auraEffect.HandleEffect(this, AuraEffectHandleModes.Skill, true); - // Learn all spells for skill - LearnSkillRewardedSpells(id, newVal); + // permanent bonuses + var mModSkillTalent = GetAuraEffectsByType(AuraType.ModSkillTalent); + foreach (var auraEffect in mModSkillTalent) + if (auraEffect.GetMiscValue() == id) + auraEffect.HandleEffect(this, AuraEffectHandleModes.Skill, true); + + // Learn all spells for skill + LearnSkillRewardedSpells(id, newVal); + } return; } } @@ -1424,7 +1393,7 @@ namespace Game.Entities Item pItem2 = GetItemByPos(InventorySlots.Bag0, i); if (pItem2 != null && !pItem2.IsBroken()) { - foreach (ItemDynamicFieldGems gemData in pItem2.GetGems()) + foreach (SocketedGem gemData in pItem2.m_itemData.Gems) { ItemTemplate gemProto = Global.ObjectMgr.GetItemTemplate(gemData.ItemId); if (gemProto == null) @@ -1642,7 +1611,7 @@ namespace Game.Entities if (ability.AcquireMethod != AbilityLearnType.OnSkillValue && ability.AcquireMethod != AbilityLearnType.OnSkillLearn) continue; - // AcquireMethod == 2 && NumSkillUps == 1 --> automatically learn riding skill spell, else we skip it (client shows riding in spellbook as trainable). + // AcquireMethod == 2 && NumSkillUps == 1 -. automatically learn riding skill spell, else we skip it (client shows riding in spellbook as trainable). if (skillId == (uint)SkillType.Riding && (ability.AcquireMethod != AbilityLearnType.OnSkillLearn || ability.NumSkillUps != 1)) continue; @@ -1676,39 +1645,15 @@ namespace Game.Entities if (skillEntry == null) return -1; - // both free, return first slot - if (GetUInt32Value(ActivePlayerFields.ProfessionSkillLine) == 0 && GetUInt32Value(ActivePlayerFields.ProfessionSkillLine + 1) == 0) - return 0; - - ActivePlayerFields professionsBegin = ActivePlayerFields.ProfessionSkillLine; - ActivePlayerFields professionsEnd = professionsBegin + 2; - - // when any slot is filled we need to check both - one of them might be earlier step of the same profession - ActivePlayerFields sameProfessionSlot = professionsEnd; - for (var slot = professionsBegin; slot < professionsEnd; ++slot) - { - SkillLineRecord slotProfession = CliDB.SkillLineStorage.LookupByKey(GetUInt32Value(slot)); - if (slotProfession != null) - { - if (slotProfession.ParentSkillLineID == skillEntry.ParentSkillLineID) - { - sameProfessionSlot = slot; - break; - } - } - } - - if (sameProfessionSlot != professionsEnd) - { - if (CliDB.SkillLineStorage.LookupByKey(sameProfessionSlot).ParentTierIndex < skillEntry.ParentTierIndex) - return sameProfessionSlot - professionsBegin; - return -1; - } - + int index = 0; // if there is no same profession, find any free slot - for (var slot = professionsBegin; slot < professionsEnd; ++slot) - if (GetUInt32Value(slot) == 0) - return slot - professionsBegin; + foreach (var b in m_activePlayerData.ProfessionSkillLine) + { + if (b == 0) + return index; + + index++; + } return -1; } @@ -2288,7 +2233,7 @@ namespace Game.Entities public bool IsCurrentSpecMasterySpell(SpellInfo spellInfo) { - ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(GetUInt32Value(PlayerFields.CurrentSpecId)); + ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization()); if (chrSpec != null) return spellInfo.Id == chrSpec.MasterySpellID[0] || spellInfo.Id == chrSpec.MasterySpellID[1]; @@ -3107,7 +3052,7 @@ namespace Game.Entities { SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(itemSetSpell.SpellID); - if (itemSetSpell.ChrSpecID != 0 && itemSetSpell.ChrSpecID != GetUInt32Value(PlayerFields.CurrentSpecId)) + if (itemSetSpell.ChrSpecID != 0 && itemSetSpell.ChrSpecID != GetPrimarySpecialization()) ApplyEquipSpell(spellInfo, null, false, false); // item set aura is not for current spec else { @@ -3197,7 +3142,7 @@ namespace Game.Entities if (GetClass() != Class.Deathknight) return; - int runeIndex = (int)GetPowerIndex(PowerType.Runes); + uint runeIndex = GetPowerIndex(PowerType.Runes); if (runeIndex == (int)PowerType.Max) return; @@ -3208,8 +3153,8 @@ namespace Game.Entities SetRuneCooldown(i, 0); // reset cooldowns // set a base regen timer equal to 10 sec - SetStatFloatValue(UnitFields.PowerRegenFlatModifier + runeIndex, 0.0f); - SetStatFloatValue(UnitFields.PowerRegenInterruptedFlatModifier + runeIndex, 0.0f); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerRegenFlatModifier, (int)runeIndex), 0.0f); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerRegenInterruptedFlatModifier, (int)runeIndex), 0.0f); } public void UpdateAllRunesRegen() @@ -3217,15 +3162,15 @@ namespace Game.Entities if (GetClass() != Class.Deathknight) return; - int runeIndex = (int)GetPowerIndex(PowerType.Runes); + uint runeIndex = GetPowerIndex(PowerType.Runes); if (runeIndex == (int)PowerType.Max) return; PowerTypeRecord runeEntry = Global.DB2Mgr.GetPowerTypeEntry(PowerType.Runes); uint cooldown = GetRuneBaseCooldown(); - SetStatFloatValue(UnitFields.PowerRegenFlatModifier + runeIndex, (float)(1 * Time.InMilliseconds) / (float)cooldown - runeEntry.RegenPeace); - SetStatFloatValue(UnitFields.PowerRegenInterruptedFlatModifier + runeIndex, (float)(1 * Time.InMilliseconds) / (float)cooldown - runeEntry.RegenCombat); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerRegenFlatModifier, (int)runeIndex), (float)(1 * Time.InMilliseconds) / cooldown - runeEntry.RegenPeace); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerRegenInterruptedFlatModifier, (int)runeIndex), (float)(1 * Time.InMilliseconds) / cooldown - runeEntry.RegenCombat); } public uint GetRuneCooldown(byte index) { return m_runes.Cooldown[index]; } @@ -3234,20 +3179,25 @@ namespace Game.Entities { // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_WHILE_PREP if (spellInfo.HasAttribute(SpellAttr5.NoReagentWhilePrep) && - HasFlag(UnitFields.Flags, UnitFlags.Preparation)) + HasUnitFlag(UnitFlags.Preparation)) return true; // Check no reagent use mask FlagArray128 noReagentMask = new FlagArray128(); - noReagentMask[0] = GetUInt32Value(ActivePlayerFields.NoReagentCost); - noReagentMask[1] = GetUInt32Value(ActivePlayerFields.NoReagentCost + 1); - noReagentMask[2] = GetUInt32Value(ActivePlayerFields.NoReagentCost + 2); - noReagentMask[3] = GetUInt32Value(ActivePlayerFields.NoReagentCost + 3); + noReagentMask[0] = m_activePlayerData.NoReagentCostMask[0]; + noReagentMask[1] = m_activePlayerData.NoReagentCostMask[1]; + noReagentMask[2] = m_activePlayerData.NoReagentCostMask[2]; + noReagentMask[3] = m_activePlayerData.NoReagentCostMask[3]; if (spellInfo.SpellFamilyFlags & noReagentMask) return true; return false; } + public void SetNoRegentCostMask(FlagArray128 mask) + { + for (byte i = 0; i < 4; ++i) + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NoReagentCostMask, i), mask[i]); + } public void CastItemCombatSpell(DamageInfo damageInfo) { @@ -3469,6 +3419,16 @@ namespace Game.Entities LearnCustomSpells(); LearnQuestRewardedSpells(); } + + public void SetPetSpellPower(uint spellPower) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetSpellPower), spellPower); } + + public void SetSkillLineId(uint pos, ushort skillLineId) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillLineID, (int)pos), skillLineId); } + public void SetSkillStep(uint pos, ushort step) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillStep, (int)pos), step); } + public void SetSkillRank(uint pos, ushort rank) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillRank, (int)pos), rank); } + public void SetSkillStartingRank(uint pos, ushort starting) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillStartingRank, (int)pos), starting); } + public void SetSkillMaxRank(uint pos, ushort max) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillMaxRank, (int)pos), max); } + public void SetSkillTempBonus(uint pos, ushort bonus) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillTempBonus, (int)pos), bonus); } + public void SetSkillPermBonus(uint pos, ushort bonus) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Skill)._value.ModifyValue((SkillInfo skillInfo) => skillInfo.SkillPermBonus, (int)pos), bonus); } } public class PlayerSpell diff --git a/Source/Game/Entities/Player/Player.Talents.cs b/Source/Game/Entities/Player/Player.Talents.cs index f53db70e9..0c360f533 100644 --- a/Source/Game/Entities/Player/Player.Talents.cs +++ b/Source/Game/Entities/Player/Player.Talents.cs @@ -33,7 +33,7 @@ namespace Game.Entities if (level < PlayerConst.MinSpecializationLevel) ResetTalentSpecialization(); - uint talentTiers = (uint)Global.DB2Mgr.GetNumTalentsAtLevel(level, GetClass()); + uint talentTiers = Global.DB2Mgr.GetNumTalentsAtLevel(level, GetClass()); if (level < 15) { // Remove all talent points @@ -50,7 +50,7 @@ namespace Game.Entities } } - SetUInt32Value(ActivePlayerFields.MaxTalentTiers, talentTiers); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MaxTalentTiers), talentTiers); if (!GetSession().PlayerLoading()) SendTalentsInfoData(); // update at client @@ -112,14 +112,14 @@ namespace Game.Entities if (IsDead()) return TalentLearnResult.FailedCantDoThatRightNow; - if (GetUInt32Value(PlayerFields.CurrentSpecId) == 0) + if (GetPrimarySpecialization() == 0) return TalentLearnResult.FailedNoPrimaryTreeSelected; TalentRecord talentInfo = CliDB.TalentStorage.LookupByKey(talentId); if (talentInfo == null) return TalentLearnResult.FailedUnknown; - if (talentInfo.SpecID != 0 && talentInfo.SpecID != GetUInt32Value(PlayerFields.CurrentSpecId)) + if (talentInfo.SpecID != 0 && talentInfo.SpecID != GetPrimarySpecialization()) return TalentLearnResult.FailedUnknown; // prevent learn talent for different class (cheating) @@ -127,7 +127,7 @@ namespace Game.Entities return TalentLearnResult.FailedUnknown; // check if we have enough talent points - if (talentInfo.TierID >= GetUInt32Value(ActivePlayerFields.MaxTalentTiers)) + if (talentInfo.TierID >= m_activePlayerData.MaxTalentTiers) return TalentLearnResult.FailedUnknown; // TODO: prevent changing talents that are on cooldown @@ -144,7 +144,7 @@ namespace Game.Entities if (talent.SpecID == 0) bestSlotMatch = talent; - else if (talent.SpecID == GetUInt32Value(PlayerFields.CurrentSpecId)) + else if (talent.SpecID == GetPrimarySpecialization()) { bestSlotMatch = talent; break; @@ -159,13 +159,13 @@ namespace Game.Entities { foreach (TalentRecord talent in Global.DB2Mgr.GetTalentsByPosition(GetClass(), talentInfo.TierID, c)) { - if (talent.SpecID != 0 && talent.SpecID != GetUInt32Value(PlayerFields.CurrentSpecId)) + if (talent.SpecID != 0 && talent.SpecID != GetPrimarySpecialization()) continue; if (!HasTalent(talent.Id, GetActiveTalentGroup())) continue; - if (!HasFlag(PlayerFields.Flags, PlayerFlags.Resting) && HasFlag(UnitFields.Flags2, UnitFlags2.AllowChangingTalents)) + if (!HasPlayerFlag(PlayerFlags.Resting) && HasUnitFlag2(UnitFlags2.AllowChangingTalents)) return TalentLearnResult.FailedRestArea; if (GetSpellHistory().HasCooldown(talent.SpellID)) @@ -221,7 +221,6 @@ namespace Game.Entities ChrSpecializationRecord defaultSpec = Global.DB2Mgr.GetDefaultChrSpecializationForClass(GetClass()); SetPrimarySpecialization(defaultSpec.Id); SetActiveTalentGroup(defaultSpec.OrderIndex); - SetUInt32Value(PlayerFields.CurrentSpecId, defaultSpec.Id); LearnSpecializationSpells(); @@ -238,14 +237,14 @@ namespace Game.Entities void SetTalentResetCost(uint cost) { _specializationInfo.ResetTalentsCost = cost; } long GetTalentResetTime() { return _specializationInfo.ResetTalentsTime; } void SetTalentResetTime(long time_) { _specializationInfo.ResetTalentsTime = time_; } - uint GetPrimarySpecialization() { return _specializationInfo.PrimarySpecialization; } - void SetPrimarySpecialization(uint spec) { _specializationInfo.PrimarySpecialization = spec; } + public uint GetPrimarySpecialization() { return m_playerData.CurrentSpecID; } + void SetPrimarySpecialization(uint spec) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.CurrentSpecID), spec); } public byte GetActiveTalentGroup() { return _specializationInfo.ActiveGroup; } void SetActiveTalentGroup(byte group) { _specializationInfo.ActiveGroup = group; } // Loot Spec - public void SetLootSpecId(uint id) { SetUInt32Value(ActivePlayerFields.LootSpecId, id); } - uint GetLootSpecId() { return GetUInt32Value(ActivePlayerFields.LootSpecId); } + public void SetLootSpecId(uint id) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LootSpecID), (ushort)id); } + public uint GetLootSpecId() { return m_activePlayerData.LootSpecID; } public uint GetDefaultSpecId() { @@ -334,9 +333,7 @@ namespace Game.Entities RemoveAurasDueToSpell(CliDB.GlyphPropertiesStorage.LookupByKey(glyphId).SpellID); SetActiveTalentGroup(spec.OrderIndex); - SetUInt32Value(PlayerFields.CurrentSpecId, spec.Id); - if (GetPrimarySpecialization() == 0) - SetPrimarySpecialization(spec.Id); + SetPrimarySpecialization(spec.Id); foreach (var talentInfo in CliDB.TalentStorage.Values) { diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 4e1895f57..28df9a26e 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -48,8 +48,9 @@ namespace Game.Entities objectTypeMask |= TypeMask.Player; objectTypeId = TypeId.Player; - valuesCount = (int)ActivePlayerFields.End; - _dynamicValuesCount = (int)ActivePlayerDynamicFields.End; + m_playerData = new PlayerData(); + m_activePlayerData = new ActivePlayerData(); + Session = session; // players always accept @@ -187,7 +188,7 @@ namespace Game.Entities SetMap(Global.MapMgr.CreateMap(info.MapId, this)); - int powertype = (int)cEntry.DisplayPower; + PowerType powertype = cEntry.DisplayPower; SetObjectScale(1.0f); @@ -200,51 +201,39 @@ namespace Game.Entities return false; } - SetByteValue(UnitFields.Bytes0, 0, (byte)createInfo.RaceId); - SetByteValue(UnitFields.Bytes0, 1, (byte)createInfo.ClassId); - SetByteValue(UnitFields.Bytes0, 3, (byte)createInfo.Sex); - SetUInt32Value(UnitFields.DisplayPower, (uint)powertype); + SetRace(createInfo.RaceId); + SetClass(createInfo.ClassId); + SetGender(createInfo.Sex); + SetPowerType(powertype); InitDisplayIds(); if ((RealmType)WorldConfig.GetIntValue(WorldCfg.GameType) == RealmType.PVP || (RealmType)WorldConfig.GetIntValue(WorldCfg.GameType) == RealmType.RPPVP) { - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.PvP); - SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + AddPvpFlag(UnitPVPStateFlags.PvP); + AddUnitFlag(UnitFlags.PvpAttackable); } - SetFlag(UnitFields.Flags2, UnitFlags2.RegeneratePower); - SetFloatValue(UnitFields.HoverHeight, 1.0f); // default for players in 3.0.3 + AddUnitFlag2(UnitFlags2.RegeneratePower); + SetHoverHeight(1.0f); // default for players in 3.0.3 - SetUInt32Value(ActivePlayerFields.WatchedFactionIndex, 0xFFFFFFFF); // -1 is default value + SetWatchedFactionIndex(0xFFFFFFFF); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId, createInfo.Skin); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId, createInfo.Face); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId, createInfo.HairStyle); - SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId, createInfo.HairColor); - SetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle, createInfo.FacialHairStyle); + SetSkinId(createInfo.Skin); + SetFaceId(createInfo.Face); + SetHairStyleId(createInfo.HairStyle); + SetHairColorId(createInfo.HairColor); + SetFacialHairStyleId(createInfo.FacialHairStyle); for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i) - SetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i), createInfo.CustomDisplay[i]); - SetUInt32Value(ActivePlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp, (uint)((GetSession().IsARecruiter() || GetSession().GetRecruiterId() != 0) ? PlayerRestState.RAFLinked : PlayerRestState.NotRAFLinked)); - SetUInt32Value(ActivePlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor, (uint)PlayerRestState.NotRAFLinked); - SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)createInfo.Sex); - SetByteValue(PlayerFields.Bytes4, PlayerFieldOffsets.Bytes4OffsetArenaFaction, 0); + SetCustomDisplayOption(i, createInfo.CustomDisplay[i]); + + SetRestState(RestTypes.XP, ((GetSession().IsARecruiter() || GetSession().GetRecruiterId() != 0) ? PlayerRestState.RAFLinked : PlayerRestState.NotRAFLinked)); + SetRestState(RestTypes.Honor, PlayerRestState.NotRAFLinked); + SetNativeSex(createInfo.Sex); SetInventorySlotCount(InventorySlots.DefaultSize); - SetGuidValue(UnitFields.GuildGuid, ObjectGuid.Empty); - SetUInt32Value(PlayerFields.GuildRank, 0); - SetGuildLevel(0); - SetUInt32Value(PlayerFields.GuildTimestamp, 0); - - for (int i = 0; i < PlayerConst.KnowTitlesSize; ++i) - SetUInt64Value(ActivePlayerFields.KnownTitles + i, 0); // 0=disabled - SetUInt32Value(PlayerFields.ChosenTitle, 0); - - SetUInt32Value(ActivePlayerFields.Kills, 0); - SetUInt32Value(ActivePlayerFields.LifetimeHonorableKills, 0); - // set starting level uint start_level = WorldConfig.GetUIntValue(WorldCfg.StartPlayerLevel); if (GetClass() == Class.Deathknight) - start_level= WorldConfig.GetUIntValue(WorldCfg.StartDeathKnightPlayerLevel); + start_level = WorldConfig.GetUIntValue(WorldCfg.StartDeathKnightPlayerLevel); else if (GetClass() == Class.DemonHunter) start_level = WorldConfig.GetUIntValue(WorldCfg.StartDemonHunterPlayerLevel); @@ -254,7 +243,7 @@ namespace Game.Entities { CharacterTemplate charTemplate = Global.CharacterTemplateDataStorage.GetCharacterTemplate(createInfo.TemplateSet.Value); if (charTemplate != null) - { + { if (charTemplate.Level > start_level) start_level = charTemplate.Level; } @@ -270,11 +259,11 @@ namespace Game.Entities start_level = gm_level; } - SetUInt32Value(UnitFields.Level, start_level); + SetLevel(start_level); InitRunes(); - SetUInt64Value(ActivePlayerFields.Coinage, WorldConfig.GetUIntValue(WorldCfg.StartPlayerMoney)); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Coinage), (ulong)WorldConfig.GetIntValue(WorldCfg.StartPlayerMoney)); SetCurrency(CurrencyTypes.ApexisCrystals, WorldConfig.GetUIntValue(WorldCfg.CurrencyStartApexisCrystals)); SetCurrency(CurrencyTypes.JusticePoints, WorldConfig.GetUIntValue(WorldCfg.CurrencyStartJusticePoints)); @@ -282,7 +271,7 @@ namespace Game.Entities if (WorldConfig.GetBoolValue(WorldCfg.StartAllExplored)) { for (ushort i = 0; i < PlayerConst.ExploredZonesSize; i++) - SetFlag(ActivePlayerFields.ExploredZones + i, 0xFFFFFFFF); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, i), 0xFFFFFFFFFFFFFFFF); } //Reputations if "StartAllReputation" is enabled, -- TODO: Fix this in a better way @@ -608,7 +597,7 @@ namespace Game.Entities } } - if (HasFlag(PlayerFields.Flags, PlayerFlags.Resting)) + if (HasPlayerFlag(PlayerFlags.Resting)) _restMgr.Update(diff); if (m_weaponChangeTimer > 0) @@ -795,7 +784,7 @@ namespace Game.Entities if (IsAlive() && !oldIsAlive) //clear aura case after resurrection by another way (spells will be applied before next death) - ClearDynamicValue(ActivePlayerDynamicFields.SelfResSpells); + ClearSelfResSpell(); } public override void DestroyForPlayer(Player target) @@ -1007,9 +996,11 @@ namespace Game.Entities public RestMgr GetRestMgr() { return _restMgr; } - public bool IsAdvancedCombatLoggingEnabled() { return _advancedCombatLoggingEnabled; } + public bool IsAdvancedCombatLoggingEnabled() { return _advancedCombatLoggingEnabled; } public void SetAdvancedCombatLogging(bool enabled) { _advancedCombatLoggingEnabled = enabled; } + public void SetInvSlot(uint slot, ObjectGuid guid) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.InvSlots, (int)slot), guid); } + //Taxi public void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(GetRace(), GetClass(), getLevel()); } @@ -1044,7 +1035,7 @@ namespace Game.Entities if (m_temporaryUnsummonedPetNumber == 0 && pet.isControlled() && !pet.isTemporarySummoned()) { m_temporaryUnsummonedPetNumber = pet.GetCharmInfo().GetPetNumber(); - m_oldpetspell = pet.GetUInt32Value(UnitFields.CreatedBySpell); + m_oldpetspell = pet.m_unitData.CreatedBySpell; } RemovePet(pet, PetSaveMode.AsCurrent); @@ -1209,7 +1200,7 @@ namespace Game.Entities SendPacket(petSpells); } - + //Currency - Money void SetCurrency(CurrencyTypes id, uint count, bool printLog = true) { @@ -1452,6 +1443,7 @@ namespace Game.Entities return true; } + public void SetMultiActionBars(byte mask) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MultiActionBars), mask); } public ActionButton AddActionButton(byte button, uint action, uint type) { if (!IsActionButtonDataValid(button, action, type)) @@ -1761,7 +1753,7 @@ namespace Game.Entities // The player was ported to another map and loses the duel immediately. // We have to perform this check before the teleport, otherwise the // ObjectAccessor won't find the flag. - if (duel != null && GetMapId() != mapid && GetMap().GetGameObject(GetGuidValue(PlayerFields.DuelArbiter))) + if (duel != null && GetMapId() != mapid && GetMap().GetGameObject(m_playerData.DuelArbiter)) DuelComplete(DuelCompleteType.Fled); if (GetMapId() == mapid) @@ -2203,8 +2195,8 @@ namespace Game.Entities { m_ExtraFlags |= PlayerExtraFlags.GMOn; SetFaction(35); - SetFlag(PlayerFields.Flags, PlayerFlags.GM); - SetFlag(UnitFields.Flags2, UnitFlags2.AllowCheatSpells); + AddPlayerFlag(PlayerFlags.GM); + AddUnitFlag2(UnitFlags2.AllowCheatSpells); Pet pet = GetPet(); if (pet != null) @@ -2213,7 +2205,7 @@ namespace Game.Entities pet.getHostileRefManager().setOnlineOfflineState(false); } - RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + RemovePvpFlag(UnitPVPStateFlags.FFAPvp); ResetContestedPvP(); getHostileRefManager().setOnlineOfflineState(false); @@ -2228,19 +2220,19 @@ namespace Game.Entities m_ExtraFlags &= ~PlayerExtraFlags.GMOn; SetFactionForRace(GetRace()); - RemoveFlag(PlayerFields.Flags, PlayerFlags.GM); - RemoveFlag(UnitFields.Flags2, UnitFlags2.AllowCheatSpells); + RemovePlayerFlag(PlayerFlags.GM); + RemoveUnitFlag2(UnitFlags2.AllowCheatSpells); Pet pet = GetPet(); if (pet != null) { - pet.SetFaction(getFaction()); + pet.SetFaction(GetFaction()); pet.getHostileRefManager().setOnlineOfflineState(true); } // restore FFA PvP Server state if (Global.WorldMgr.IsFFAPvPRealm()) - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + AddPvpFlag(UnitPVPStateFlags.FFAPvp); // restore FFA PvP area state, remove not allowed for GM mounts UpdateArea(m_areaUpdateId); @@ -2307,7 +2299,7 @@ namespace Game.Entities if (source.IsTypeId(TypeId.Unit)) { - npcflags = (NPCFlags)source.GetUInt64Value(UnitFields.NpcFlags); + npcflags = (NPCFlags)(((ulong)(source.ToUnit().m_unitData.NpcFlags[1]) << 32) | source.ToUnit().m_unitData.NpcFlags[0]); if (Convert.ToBoolean(npcflags & NPCFlags.QuestGiver) && showQuests) PrepareQuestMenu(source.GetGUID()); } @@ -2346,7 +2338,7 @@ namespace Game.Entities } break; case GossipOption.Learndualspec: - canTalk = false; + canTalk = false; break; case GossipOption.Unlearntalents: if (!creature.CanResetTalents(this)) @@ -2917,7 +2909,7 @@ namespace Game.Entities packet.AddState(2259, 0); // 6 packet.AddState(3191, WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) : 0); // 7 Current Season - Arena season in progress - // 0 - End of season + // 0 - End of season packet.AddState(3901, WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1 : 0)); // 8 PreviousSeason if (mapid == 530) // Outland @@ -3130,7 +3122,7 @@ namespace Game.Entities packet.AddState(0xa9f, 0x0); // 36 2719 Capturing progress-bar (0 - left, 100 - right) packet.AddState(0xa9e, 0x0); // 37 2718 Capturing progress-bar (1 - show, 0 - hide) packet.AddState(0xc0d, 0x17b); // 38 3085 unk - // and some more ... unknown + // and some more ... unknown } break; // any of these needs change! the client remembers the prev setting! @@ -3322,7 +3314,7 @@ namespace Game.Entities packet.AddState(0xdf3, 0x0); // 13 3571 bonus timer (1 - on, 0 - off) packet.AddState(0xded, 0x0); // 14 3565 Horde Attacker packet.AddState(0xdec, 0x0); // 15 3564 Alliance Attacker - // End Round (timer), better explain this by example, eg. ends in 19:59 . A:BC + // End Round (timer), better explain this by example, eg. ends in 19:59 . A:BC packet.AddState(0xde9, 0x0); // 16 3561 C packet.AddState(0xde8, 0x0); // 17 3560 B packet.AddState(0xde7, 0x0); // 18 3559 A @@ -3338,7 +3330,7 @@ namespace Game.Entities packet.AddState(0xe2c, 0x0); // 28 3628 Beach2 - Horde control packet.AddState(0xe2b, 0x0); // 29 3627 Beach1 - Alliance control packet.AddState(0xe2a, 0x0); // 30 3626 Beach2 - Alliance control - // and many unks... + // and many unks... } break; case 4406: // Ring of Valor @@ -3496,15 +3488,15 @@ namespace Game.Entities public uint GetBarberShopCost(BarberShopStyleRecord newHairStyle, uint newHairColor, BarberShopStyleRecord newFacialHair, BarberShopStyleRecord newSkin, BarberShopStyleRecord newFace, Array newCustomDisplay) { - byte hairstyle = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId); - byte haircolor = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId); - byte facialhair = GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle); - byte skincolor = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId); - byte face = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId); + byte hairstyle = m_playerData.HairStyleID; + byte haircolor = m_playerData.HairColorID; + byte facialhair = m_playerData.FacialHairStyleID; + byte skincolor = m_playerData.SkinID; + byte face = m_playerData.FaceID; Array customDisplay = new Array(PlayerConst.CustomDisplaySize); for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) - customDisplay[i] = GetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i)); + customDisplay[i] = m_playerData.CustomDisplayOption[i]; if ((hairstyle == newHairStyle.Data) && (haircolor == newHairColor) && @@ -3625,12 +3617,13 @@ namespace Game.Entities { Creature creature = GetMap().GetCreature(guid); // Update fields of triggers, transformed units or unselectable units (values dependent on GM state) - if (creature == null || (!creature.IsTrigger() && !creature.HasAuraType(AuraType.Transform) && !creature.HasFlag(UnitFields.Flags, UnitFlags.NotSelectable))) + if (creature == null || (!creature.IsTrigger() && !creature.HasAuraType(AuraType.Transform) && !creature.HasUnitFlag(UnitFlags.NotSelectable))) continue; - creature.SetFieldNotifyFlag(UpdateFieldFlags.Public); + creature.m_unitData.ModifyValue(m_unitData.DisplayID); + creature.m_unitData.ModifyValue(m_unitData.Flags); + creature.ForceUpdateFieldChange(); creature.BuildValuesUpdateBlockForPlayer(udata, this); - creature.RemoveFieldNotifyFlag(UpdateFieldFlags.Public); } else if (guid.IsAnyTypeGameObject()) { @@ -3638,9 +3631,9 @@ namespace Game.Entities if (go == null) continue; - go.SetFieldNotifyFlag(UpdateFieldFlags.Public); + go.m_values.ModifyValue(m_objectData).ModifyValue(m_objectData.DynamicFlags); + go.ForceUpdateFieldChange(); go.BuildValuesUpdateBlockForPlayer(udata, this); - go.RemoveFieldNotifyFlag(UpdateFieldFlags.Public); } } @@ -3778,10 +3771,10 @@ namespace Game.Entities if (powerType.RegenInterruptTimeMS != 0 && Time.GetMSTimeDiffToNow(m_combatExitTime) < powerType.RegenInterruptTimeMS) return; - addvalue = (powerType.RegenPeace + GetFloatValue(UnitFields.PowerRegenFlatModifier + (int)powerIndex)) * 0.001f * m_regenTimer; + addvalue = (powerType.RegenPeace + m_unitData.PowerRegenFlatModifier[(int)powerIndex]) * 0.001f * m_regenTimer; } else - addvalue = (powerType.RegenCombat + GetFloatValue(UnitFields.PowerRegenInterruptedFlatModifier + (int)powerIndex)) * 0.001f * m_regenTimer; + addvalue = (powerType.RegenCombat + m_unitData.PowerRegenInterruptedFlatModifier[(int)powerIndex]) * 0.001f * m_regenTimer; WorldCfg[] RatesForPower = { @@ -3881,7 +3874,11 @@ namespace Game.Entities if (m_regenTimerCount >= 2000) SetPower(power, curValue); else - UpdateUInt32Value(UnitFields.Power + (int)powerIndex, (uint)curValue); + { + // throttle packet sending + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)powerIndex), curValue); + m_unitData.ClearChanged(m_unitData.Power, (int)powerIndex); + } } void RegenerateHealth() { @@ -4193,7 +4190,7 @@ namespace Game.Entities if (m_unitMovedByMe == obj) return true; - ObjectGuid guid = GetGuidValue(ActivePlayerFields.Farsight); + ObjectGuid guid = m_activePlayerData.FarsightObject; if (!guid.IsEmpty()) if (obj.GetGUID() == guid) return true; @@ -4249,7 +4246,7 @@ namespace Game.Entities SetRooted(false); // BG - remove insignia related - RemoveFlag(UnitFields.Flags, UnitFlags.Skinnable); + RemoveUnitFlag(UnitFlags.Skinnable); int corpseReclaimDelay = CalculateCorpseReclaimDelay(); @@ -4262,7 +4259,7 @@ namespace Game.Entities StopMirrorTimers(); //disable timers(bars) // set and clear other - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier, (byte)UnitBytes1Flags.AlwaysStand); + SetAnimTier(UnitBytes1Flags.AlwaysStand, false); } public void StopMirrorTimers() @@ -4343,7 +4340,7 @@ namespace Game.Entities uint damage = (uint)(GetMaxHealth() / 5 + RandomHelper.URand(0, getLevel() - 1)); EnvironmentalDamage(EnviromentalDamage.Exhausted, damage); } - else if (HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) // Teleport ghost to graveyard + else if (HasPlayerFlag(PlayerFlags.Ghost)) // Teleport ghost to graveyard RepopAtGraveyard(); } else if (!m_MirrorTimerFlagsLast.HasAnyFlag(PlayerUnderwaterState.InDarkWater)) @@ -4467,15 +4464,15 @@ namespace Game.Entities // speed change, land walk // remove death flag + set aura - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier, 0); - RemoveFlag(PlayerFields.Flags, PlayerFlags.IsOutOfBounds); + SetAnimTier(UnitBytes1Flags.None, false); + RemovePlayerFlag(PlayerFlags.IsOutOfBounds); // This must be called always even on Players with race != RACE_NIGHTELF in case of faction change RemoveAurasDueToSpell(20584); // speed bonuses RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST if (GetSession().IsARecruiter() || (GetSession().GetRecruiterId() != 0)) - SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.ReferAFriend); + AddDynamicFlag(UnitDynFlags.ReferAFriend); setDeathState(DeathState.Alive); @@ -4554,8 +4551,11 @@ namespace Game.Entities setDeathState(DeathState.Corpse); - SetUInt32Value(ObjectFields.DynamicFlags, 0); - ApplyModFlag(ActivePlayerFields.LocalFlags, PlayerLocalFlags.ReleaseTimer, !CliDB.MapStorage.LookupByKey(GetMapId()).Instanceable() && !HasAuraType(AuraType.PreventResurrection)); + SetDynamicFlags(UnitDynFlags.None); + if (!CliDB.MapStorage.LookupByKey(GetMapId()).Instanceable() && !HasAuraType(AuraType.PreventResurrection)) + AddPlayerLocalFlag(PlayerLocalFlags.ReleaseTimer); + else + RemovePlayerLocalFlag(PlayerLocalFlags.ReleaseTimer); // 6 minutes until repop at graveyard m_deathTimer = 6 * Time.Minute * Time.InMilliseconds; @@ -4595,29 +4595,24 @@ namespace Game.Entities _corpseLocation = new WorldLocation(this); - byte skin = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId); - byte face = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId); - byte hairstyle = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId); - byte haircolor = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId); - byte facialhair = GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle); - - uint _cfb1 = (uint)((0x00) | ((int)GetRace() << 8) | (GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender) << 16) | (skin << 24)); - uint _cfb2 = (uint)((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24)); - - corpse.SetUInt32Value(CorpseFields.Bytes1, _cfb1); - corpse.SetUInt32Value(CorpseFields.Bytes2, _cfb2); - CorpseFlags flags = 0; - if (HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.PvP)) + if (HasPvpFlag(UnitPVPStateFlags.PvP)) flags |= CorpseFlags.PvP; if (InBattleground() && !InArena()) flags |= CorpseFlags.Skinnable; // to be able to remove insignia - if (HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp)) + if (HasPvpFlag(UnitPVPStateFlags.FFAPvp)) flags |= CorpseFlags.FFAPvP; - corpse.SetUInt32Value(CorpseFields.Flags, (uint)flags); - corpse.SetUInt32Value(CorpseFields.DisplayId, GetNativeDisplayId()); - corpse.SetUInt32Value(CorpseFields.FactionTemplate, CliDB.ChrRacesStorage.LookupByKey(GetRace()).FactionID); + corpse.SetRace(GetRace()); + corpse.SetSex((Gender)(byte)m_playerData.NativeSex); + corpse.SetSkin(m_playerData.SkinID); + corpse.SetFace(m_playerData.FaceID); + corpse.SetHairStyle(m_playerData.HairStyleID); + corpse.SetHairColor(m_playerData.HairColorID); + corpse.SetFacialHairStyle(m_playerData.FacialHairStyleID); + corpse.SetFlags(flags); + corpse.SetDisplayId(GetNativeDisplayId()); + corpse.SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(GetRace()).FactionID); for (byte i = 0; i < EquipmentSlot.End; i++) { @@ -4631,7 +4626,7 @@ namespace Game.Entities else itemInventoryType = (uint)m_items[i].GetTemplate().GetInventoryType(); - corpse.SetUInt32Value(CorpseFields.Item + i, itemDisplayId | (itemInventoryType << 24)); + corpse.SetItem(i, itemDisplayId | (itemInventoryType << 24)); } } @@ -4703,7 +4698,7 @@ namespace Game.Entities else if (GetPositionZ() < GetMap().GetMinHeight(GetPositionX(), GetPositionY())) TeleportTo(homebind); - RemoveFlag(PlayerFields.Flags, PlayerFlags.IsOutOfBounds); + RemovePlayerFlag(PlayerFlags.IsOutOfBounds); } public bool HasCorpse() @@ -4847,9 +4842,9 @@ namespace Game.Entities PhasingHandler.InheritPhaseShift(pet, this); pet.SetCreatorGUID(GetGUID()); - pet.SetUInt32Value(UnitFields.FactionTemplate, getFaction()); - pet.SetUInt64Value(UnitFields.NpcFlags, (uint)NPCFlags.None); - pet.SetUInt32Value(UnitFields.Bytes1, 0); + pet.SetFaction(GetFaction()); + pet.SetNpcFlags(NPCFlags.None); + pet.SetNpcFlags2(NPCFlags2.None); pet.InitStatsForLevel(getLevel()); SetMinion(pet, true); @@ -4859,12 +4854,12 @@ namespace Game.Entities case PetType.Summon: // this enables pet details window (Shift+P) pet.GetCharmInfo().SetPetNumber(pet_number, true); - pet.SetByteValue(UnitFields.Bytes0, 1, (byte)Class.Mage); - pet.SetUInt32Value(UnitFields.PetExperience, 0); - pet.SetUInt32Value(UnitFields.PetNextLevelExp, 1000); + pet.SetClass(Class.Mage); + pet.SetPetExperience(0); + pet.SetPetNextLevelExperience(1000); pet.SetFullHealth(); pet.SetFullPower(PowerType.Mana); - pet.SetUInt32Value(UnitFields.PetNameTimestamp, (uint)Time.UnixTime); // cast can't be helped in this case + pet.SetPetNameTimestamp((uint)Time.UnixTime); break; default: break; @@ -4907,7 +4902,7 @@ namespace Game.Entities if (returnreagent && (pet || m_temporaryUnsummonedPetNumber != 0) && !InBattleground()) { //returning of reagents only for players, so best done here - uint spellId = pet ? pet.GetUInt32Value(UnitFields.CreatedBySpell) : m_oldpetspell; + uint spellId = pet ? pet.m_unitData.CreatedBySpell : m_oldpetspell; SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId); if (spellInfo != null) @@ -4987,8 +4982,8 @@ namespace Game.Entities setCollisionHeight.SequenceIndex = m_movementCounter++; setCollisionHeight.Height = height; setCollisionHeight.Scale = GetObjectScale(); - setCollisionHeight.MountDisplayID = GetUInt32Value(UnitFields.MountDisplayId); - setCollisionHeight.ScaleDuration = (int)GetUInt32Value(UnitFields.ScaleDuration); + setCollisionHeight.MountDisplayID = GetMountDisplayId(); + setCollisionHeight.ScaleDuration = m_unitData.ScaleDuration; setCollisionHeight.Reason = UpdateCollisionHeightReason.Mount; SendPacket(setCollisionHeight); @@ -5122,7 +5117,7 @@ namespace Game.Entities { if (mounted) { - var mountDisplayInfo = CliDB.CreatureDisplayInfoStorage.LookupByKey(GetUInt32Value(UnitFields.MountDisplayId)); + var mountDisplayInfo = CliDB.CreatureDisplayInfoStorage.LookupByKey(GetMountDisplayId()); if (mountDisplayInfo == null) return GetCollisionHeight(false); @@ -5199,7 +5194,7 @@ namespace Game.Entities public int GetTeamId() { return m_team == Team.Alliance ? TeamId.Alliance : TeamId.Horde; } //Money - public ulong GetMoney() { return GetUInt64Value(ActivePlayerFields.Coinage); } + public ulong GetMoney() { return m_activePlayerData.Coinage; } public bool HasEnoughMoney(ulong amount) { return GetMoney() >= amount; } public bool HasEnoughMoney(long amount) { @@ -5231,7 +5226,7 @@ namespace Game.Entities } public void SetMoney(ulong value) { - SetUInt64Value(ActivePlayerFields.Coinage, value); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Coinage), value); MoneyChanged((uint)value); UpdateCriteria(CriteriaTypes.HighestGoldValueOwned); } @@ -5242,7 +5237,7 @@ namespace Game.Entities public void SetSelection(ObjectGuid guid) { - SetGuidValue(UnitFields.Target, guid); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), guid); } //LoginFlag @@ -5272,21 +5267,25 @@ namespace Game.Entities public void SetInGuild(ulong guildId) { if (guildId != 0) - SetGuidValue(UnitFields.GuildGuid, ObjectGuid.Create(HighGuid.Guild, guildId)); + { + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.GuildGUID), ObjectGuid.Create(HighGuid.Guild, guildId)); + AddPlayerFlag(PlayerFlags.GuildLevelEnabled); + } else - SetGuidValue(UnitFields.GuildGuid, ObjectGuid.Empty); - - ApplyModFlag(PlayerFields.Flags, PlayerFlags.GuildLevelEnabled, guildId != 0); + { + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.GuildGUID), ObjectGuid.Empty); + RemovePlayerFlag(PlayerFlags.GuildLevelEnabled); + } } - public void SetGuildRank(uint rankId) { SetUInt32Value(PlayerFields.GuildRank, rankId); } - byte GetGuildRank() { return (byte)GetUInt32Value(PlayerFields.GuildRank); } - public void SetGuildLevel(uint level) { SetUInt32Value(PlayerFields.GuildLevel, level); } - uint GetGuildLevel() { return GetUInt32Value(PlayerFields.GuildLevel); } + public void SetGuildRank(byte rankId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.GuildRankID), rankId); } + public uint GetGuildRank() { return m_playerData.GuildRankID; } + public void SetGuildLevel(uint level) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.GuildLevel), level); } + public uint GetGuildLevel() { return m_playerData.GuildLevel; } public void SetGuildIdInvited(ulong GuildId) { m_GuildIdInvited = GuildId; } - public uint GetGuildId() { return GetUInt32Value(UnitFields.GuildGuid); } + public ulong GetGuildId() { return ((ObjectGuid)m_unitData.GuildGUID).GetCounter(); } public Guild GetGuild() { - uint guildId = GetGuildId(); + ulong guildId = GetGuildId(); return guildId != 0 ? Global.GuildMgr.GetGuildById(guildId) : null; } public ulong GetGuildIdInvited() { return m_GuildIdInvited; } @@ -5295,7 +5294,7 @@ namespace Game.Entities return GetGuildId() != 0 ? Global.GuildMgr.GetGuildById(GetGuildId()).GetName() : ""; } - public void SetFreePrimaryProfessions(uint profs) { SetUInt32Value(ActivePlayerFields.CharacterPoints, profs); } + public void SetFreePrimaryProfessions(uint profs) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CharacterPoints), profs); } public void GiveLevel(uint level) { var oldLevel = getLevel(); @@ -5331,7 +5330,7 @@ namespace Game.Entities SendPacket(packet); - SetUInt32Value(ActivePlayerFields.NextLevelXp, Global.ObjectMgr.GetXPForLevel(level)); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NextLevelXP), Global.ObjectMgr.GetXPForLevel(level)); //update level, max level of skills m_PlayedTimeLevel = 0; // Level Played Time reset @@ -5401,8 +5400,7 @@ namespace Game.Entities { ++m_grantableLevels; - if (!HasByteFlag(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetRafGrantableLevel, 0x01)) - SetByteFlag(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetRafGrantableLevel, 0x01); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.GrantableLevels), (byte)1); } } } @@ -5421,7 +5419,10 @@ namespace Game.Entities public void ToggleAFK() { - ToggleFlag(PlayerFields.Flags, PlayerFlags.AFK); + if (isAFK()) + RemovePlayerFlag(PlayerFlags.AFK); + else + AddPlayerFlag(PlayerFlags.AFK); // afk player not allowed in Battleground if (!IsGameMaster() && isAFK() && InBattleground() && !InArena()) @@ -5429,10 +5430,13 @@ namespace Game.Entities } public void ToggleDND() { - ToggleFlag(PlayerFields.Flags, PlayerFlags.DND); + if (isDND()) + RemovePlayerFlag(PlayerFlags.DND); + else + AddPlayerFlag(PlayerFlags.DND); } - public bool isAFK() { return HasFlag(PlayerFields.Flags, PlayerFlags.AFK); } - public bool isDND() { return HasFlag(PlayerFields.Flags, PlayerFlags.DND); } + public bool isAFK() { return HasPlayerFlag(PlayerFlags.AFK); } + public bool isDND() { return HasPlayerFlag(PlayerFlags.DND); } public ChatFlags GetChatFlags() { ChatFlags tag = ChatFlags.None; @@ -5443,7 +5447,7 @@ namespace Game.Entities tag |= ChatFlags.DND; if (isAFK()) tag |= ChatFlags.AFK; - if (HasFlag(PlayerFields.Flags, PlayerFlags.Developer)) + if (HasPlayerFlag(PlayerFlags.Developer)) tag |= ChatFlags.Dev; return tag; @@ -5458,7 +5462,7 @@ namespace Game.Entities return; } - byte gender = GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender); + byte gender = m_playerData.NativeSex; switch ((Gender)gender) { case Gender.Female: @@ -5470,15 +5474,15 @@ namespace Game.Entities SetNativeDisplayId(info.DisplayId_m); break; default: - Log.outError(LogFilter.Player, "Player {0} ({1}) has invalid gender {2}", GetName(), GetGUID().ToString(), gender); + Log.outError(LogFilter.Player, "Player {0} ({1}) has invalid gender {2}", GetName(), GetGUID().ToString(), (Gender)gender); return; } - SetUInt32Value(UnitFields.StateAnimId, (uint)CliDB.AnimationDataStorage.Count); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StateAnimID), (uint)CliDB.AnimationDataStorage.Count); } //Creature - public Creature GetNPCIfCanInteractWith(ObjectGuid guid, NPCFlags npcflagmask) + public Creature GetNPCIfCanInteractWith(ObjectGuid guid, NPCFlags npcFlags, NPCFlags2 npcFlags2) { // unit checks if (guid.IsEmpty()) @@ -5504,7 +5508,18 @@ namespace Game.Entities return null; // appropriate npc type - if (npcflagmask != 0 && !creature.HasFlag64(UnitFields.NpcFlags, npcflagmask)) + bool hasNpcFlags() + { + if (npcFlags == 0 && npcFlags2 == 0) + return true; + if (creature.HasNpcFlag(npcFlags)) + return true; + if (creature.HasNpcFlag2(npcFlags2)) + return true; + return false; + }; + + if (!hasNpcFlags()) return null; // not allow interaction under control, but allow with own pets @@ -5808,21 +5823,21 @@ namespace Game.Entities PlayerLevelInfo info = Global.ObjectMgr.GetPlayerLevelInfo(GetRace(), GetClass(), getLevel()); - SetUInt32Value(ActivePlayerFields.MaxLevel, WorldConfig.GetUIntValue(WorldCfg.MaxPlayerLevel)); - SetUInt32Value(ActivePlayerFields.NextLevelXp, Global.ObjectMgr.GetXPForLevel(getLevel())); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MaxLevel), WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel)); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NextLevelXP), Global.ObjectMgr.GetXPForLevel(getLevel())); // reset before any aura state sources (health set/aura apply) - SetUInt32Value(UnitFields.AuraState, 0); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AuraState), 0u); UpdateSkillsForLevel(); // set default cast time multiplier - SetFloatValue(UnitFields.ModCastSpeed, 1.0f); - SetFloatValue(UnitFields.ModCastHaste, 1.0f); - SetFloatValue(UnitFields.ModHaste, 1.0f); - SetFloatValue(UnitFields.ModRangedHaste, 1.0f); - SetFloatValue(UnitFields.ModHasteRegen, 1.0f); - SetFloatValue(UnitFields.ModTimeRate, 1.0f); + SetModCastingSpeed(1.0f); + SetModSpellHaste(1.0f); + SetModHaste(1.0f); + SetModRangedHaste(1.0f); + SetModHasteRegen(1.0f); + SetModTimeRate(1.0f); // reset size before reapply auras SetObjectScale(1.0f); @@ -5844,59 +5859,59 @@ namespace Game.Entities InitStatBuffMods(); //reset rating fields values - for (var index = 0; index < (int)CombatRating.Max; ++index) - SetUInt32Value(ActivePlayerFields.CombatRating + index, 0); + for (int index = 0; index < (int)CombatRating.Max; ++index) + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CombatRatings, index), 0u); - SetUInt32Value(ActivePlayerFields.ModHealingDonePos, 0); - SetFloatValue(ActivePlayerFields.ModHealingPct, 1.0f); - SetFloatValue(ActivePlayerFields.ModHealingDonePct, 1.0f); - SetFloatValue(ActivePlayerFields.ModPeriodicHealingDonePercent, 1.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePos), 0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingPercent), 1.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePercent), 1.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModPeriodicHealingDonePercent), 1.0f); for (byte i = 0; i < 7; ++i) { - SetInt32Value(ActivePlayerFields.ModDamageDoneNeg + i, 0); - SetInt32Value(ActivePlayerFields.ModDamageDonePos + i, 0); - SetFloatValue(ActivePlayerFields.ModDamageDonePct + i, 1.0f); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDoneNeg, i), 0); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePos, i), 0); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePercent, i), 1.0f); } - SetFloatValue(ActivePlayerFields.ModSpellPowerPct, 1.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModSpellPowerPercent), 1.0f); //reset attack power, damage and attack speed fields - for (byte i = 0; i < (int)WeaponAttackType.Max; ++i) - SetFloatValue(UnitFields.BaseAttackTime + i, SharedConst.BaseAttackTime); + for (WeaponAttackType attackType = 0; attackType < WeaponAttackType.Max; ++attackType) + SetBaseAttackTime(attackType, SharedConst.BaseAttackTime); - SetFloatValue(UnitFields.MinDamage, 0.0f); - SetFloatValue(UnitFields.MaxDamage, 0.0f); - SetFloatValue(UnitFields.MinOffHandDamage, 0.0f); - SetFloatValue(UnitFields.MaxOffHandDamage, 0.0f); - SetFloatValue(UnitFields.MinRangedDamage, 0.0f); - SetFloatValue(UnitFields.MaxRangedDamage, 0.0f); - for (var i = 0; i < 3; ++i) + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinDamage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxDamage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinOffHandDamage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxOffHandDamage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinRangedDamage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxRangedDamage), 0.0f); + for (int i = 0; i < 3; ++i) { - SetFloatValue(ActivePlayerFields.WeaponDmgMultipliers + i, 1.0f); - SetFloatValue(ActivePlayerFields.WeaponAtkSpeedMultipliers + i, 1.0f); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.WeaponDmgMultipliers, i), 1.0f); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.WeaponAtkSpeedMultipliers, i), 1.0f); } - SetInt32Value(UnitFields.AttackPower, 0); - SetFloatValue(UnitFields.AttackPowerMultiplier, 0.0f); - SetInt32Value(UnitFields.RangedAttackPower, 0); - SetFloatValue(UnitFields.RangedAttackPowerMultiplier, 0.0f); + SetAttackPower(0); + SetAttackPowerMultiplier(0.0f); + SetRangedAttackPower(0); + SetRangedAttackPowerMultiplier(0.0f); // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset - SetFloatValue(ActivePlayerFields.CritPercentage, 0.0f); - SetFloatValue(ActivePlayerFields.OffhandCritPercentage, 0.0f); - SetFloatValue(ActivePlayerFields.RangedCritPercentage, 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CritPercentage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OffhandCritPercentage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RangedCritPercentage), 0.0f); // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset - SetFloatValue(ActivePlayerFields.SpellCritPercentage1, 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.SpellCritPercentage), 0.0f); - SetFloatValue(ActivePlayerFields.ParryPercentage, 0.0f); - SetFloatValue(ActivePlayerFields.BlockPercentage, 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ParryPercentage), 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BlockPercentage), 0.0f); // Static 30% damage blocked - SetUInt32Value(ActivePlayerFields.ShieldBlock, 30); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ShieldBlock), 30u); // Dodge percentage - SetFloatValue(ActivePlayerFields.DodgePercentage, 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DodgePercentage), 0.0f); // set armor (resistance 0) to original value (create_agility*2) SetArmor((int)(GetCreateStat(Stats.Agility) * 2), 0); @@ -5908,16 +5923,16 @@ namespace Game.Entities SetBonusResistanceMod(spellSchool, 0); } - SetUInt32Value(ActivePlayerFields.ModTargetResistance, 0); - SetUInt32Value(ActivePlayerFields.ModTargetPhysicalResistance, 0); - for (var i = 0; i < (int)SpellSchools.Max; ++i) + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModTargetResistance), 0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModTargetPhysicalResistance), 0); + for (int i = 0; i < (int)SpellSchools.Max; ++i) { - SetUInt32Value(UnitFields.PowerCostModifier + i, 0); - SetFloatValue(UnitFields.PowerCostMultiplier + i, 0.0f); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerCostModifier, i), 0); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerCostMultiplier, i), 0.0f); } // Reset no reagent cost field - for (byte i = 0; i < 4; ++i) - SetUInt32Value(ActivePlayerFields.NoReagentCost + i, 0); + SetNoRegentCostMask(new Framework.Dynamic.FlagArray128()); + // Init data for form but skip reapply item mods for form InitDataForForm(reapplyMods); @@ -5928,30 +5943,28 @@ namespace Game.Entities SetMaxHealth(0); // stamina bonus will applied later // cleanup mounted state (it will set correctly at aura loading if player saved at mount. - SetUInt32Value(UnitFields.MountDisplayId, 0); + SetMountDisplayId(0); // cleanup unit flags (will be re-applied if need at aura load). - RemoveFlag(UnitFields.Flags, - UnitFlags.NonAttackable | UnitFlags.RemoveClientControl | UnitFlags.NotAttackable1 | + RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.RemoveClientControl | UnitFlags.NotAttackable1 | UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc | UnitFlags.Looting | UnitFlags.PetInCombat | UnitFlags.Silenced | UnitFlags.Pacified | UnitFlags.Stunned | UnitFlags.InCombat | UnitFlags.Disarmed | UnitFlags.Confused | UnitFlags.Fleeing | UnitFlags.NotSelectable | UnitFlags.Skinnable | UnitFlags.Mount | UnitFlags.TaxiFlight); - SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); // must be set + AddUnitFlag(UnitFlags.PvpAttackable); // must be set - SetFlag(UnitFields.Flags2, UnitFlags2.RegeneratePower);// must be set + AddUnitFlag2(UnitFlags2.RegeneratePower);// must be set // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example. - RemoveFlag(PlayerFields.Flags, PlayerFlags.AFK | PlayerFlags.DND | PlayerFlags.GM | PlayerFlags.Ghost | PlayerFlags.AllowOnlyAbility); + RemovePlayerFlag(PlayerFlags.AFK | PlayerFlags.DND | PlayerFlags.GM | PlayerFlags.Ghost | PlayerFlags.AllowOnlyAbility); - RemoveStandFlags(UnitBytes1Flags.All); // one form stealth modified bytes - RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (UnitBytes2Flags.FFAPvp | UnitBytes2Flags.Sanctuary)); + RemoveVisFlags(UnitVisFlags.All); // one form stealth modified bytes + RemovePvpFlag(UnitPVPStateFlags.FFAPvp | UnitPVPStateFlags.Sanctuary); // restore if need some important flags - SetByteValue(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetIgnorePowerRegenPredictionMask, 0); - SetByteValue(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, 0); - SetByteValue(ActivePlayerFields.Bytes2, 3, 0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalRegenFlags), (byte)0); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)0); if (reapplyMods) // reapply stats values only on .reset stats (level) command _ApplyAllStatBonuses(); @@ -6061,7 +6074,7 @@ namespace Game.Entities } } } - void UpdateVisibilityOf_helper(List s64, T target, List v) where T : WorldObject + void UpdateVisibilityOf_helper(List s64, T target, List v) where T : WorldObject { switch (target.GetTypeId()) { @@ -6248,6 +6261,8 @@ namespace Game.Entities SendPacket(new ResetWeeklyCurrency()); } + public void AddExploredZones(uint pos, ulong mask) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, (int)pos), mask); } + public void RemoveExploredZones(uint pos, ulong mask) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, (int)pos), mask); } void CheckAreaExploreAndOutdoor() { if (!IsAlive()) @@ -6273,7 +6288,7 @@ namespace Game.Entities return; } - int offset = areaEntry.AreaBit / 32; + int offset = areaEntry.AreaBit / 64; if (offset >= PlayerConst.ExploredZonesSize) { Log.outError(LogFilter.Player, "Wrong area flag {0} in map data for (X: {1} Y: {2}) point to field PLAYER_EXPLORED_ZONES_1 + {3} ( {4} must be < {5} ).", @@ -6281,12 +6296,12 @@ namespace Game.Entities return; } - uint val = 1u << (areaEntry.AreaBit % 32); - uint currFields = GetUInt32Value(ActivePlayerFields.ExploredZones + offset); + ulong val = 1ul << (areaEntry.AreaBit % 64); + ulong currFields = m_activePlayerData.ExploredZones[offset]; if (!Convert.ToBoolean(currFields & val)) { - SetUInt32Value(ActivePlayerFields.ExploredZones + offset, currFields | val); + SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, (int)offset), val); UpdateCriteria(CriteriaTypes.ExploreArea); @@ -6504,23 +6519,23 @@ namespace Game.Entities public override void SetObjectScale(float scale) { base.SetObjectScale(scale); - SetFloatValue(UnitFields.BoundingRadius, scale * SharedConst.DefaultWorldObjectSize); - SetFloatValue(UnitFields.CombatReach, scale * SharedConst.DefaultCombatReach); + SetBoundingRadius(scale * SharedConst.DefaultWorldObjectSize); + SetCombatReach(scale * SharedConst.DefaultCombatReach); if (IsInWorld) SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted())); } - void SetXP(uint xp) + public void SetXP(uint xp) { - SetUInt32Value(ActivePlayerFields.Xp, xp); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.XP), xp); int playerLevelDelta = 0; // If XP < 50%, player should see scaling creature with -1 level except for level max - if (getLevel() < SharedConst.MaxLevel && xp < (GetUInt32Value(ActivePlayerFields.NextLevelXp) / 2)) + if (getLevel() < SharedConst.MaxLevel && xp < (m_activePlayerData.NextLevelXP / 2)) playerLevelDelta = -1; - SetInt32Value(UnitFields.ScalingLevelDelta, playerLevelDelta); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ScalingPlayerLevelDelta), playerLevelDelta); } public void GiveXP(uint xp, Unit victim, float group_rate = 1.0f) @@ -6531,7 +6546,7 @@ namespace Game.Entities if (!IsAlive() && GetBattlegroundId() == 0) return; - if (HasFlag(PlayerFields.Flags, PlayerFlags.NoXPGain)) + if (HasPlayerFlag(PlayerFlags.NoXPGain)) return; if (victim != null && victim.IsTypeId(TypeId.Unit) && !victim.ToCreature().hasLootRecipient()) @@ -6563,8 +6578,8 @@ namespace Game.Entities packet.ReferAFriendBonusType = (byte)(recruitAFriend ? 1 : 0); SendPacket(packet); - uint curXP = GetUInt32Value(ActivePlayerFields.Xp); - uint nextLvlXP = GetUInt32Value(ActivePlayerFields.NextLevelXp); + uint curXP = m_activePlayerData.XP; + uint nextLvlXP = m_activePlayerData.NextLevelXP; uint newXP = curXP + xp + bonus_xp; while (newXP >= nextLvlXP && level < WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel)) @@ -6575,7 +6590,7 @@ namespace Game.Entities GiveLevel(level + 1); level = getLevel(); - nextLvlXP = GetUInt32Value(ActivePlayerFields.NextLevelXp); + nextLvlXP = m_activePlayerData.NextLevelXP; } SetXP(newXP); @@ -6664,7 +6679,7 @@ namespace Game.Entities } public byte GetComboPoints() { return (byte)GetPower(PowerType.ComboPoints); } - public byte GetDrunkValue() { return GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation); } + public byte GetDrunkValue() { return m_playerData.Inebriation; } public void SetDrunkValue(byte newDrunkValue, uint itemId = 0) { bool isSobering = newDrunkValue < GetDrunkValue(); @@ -6683,7 +6698,7 @@ namespace Game.Entities m_invisibilityDetect.DelFlag(InvisibilityType.Drunk); DrunkenState newDrunkenState = GetDrunkenstateByValue(newDrunkValue); - SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation, newDrunkValue); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Inebriation), newDrunkValue); UpdateObjectVisibility(); if (!isSobering) @@ -6726,7 +6741,7 @@ namespace Game.Entities return false; } - if (HasFlag(UnitFields.Flags, UnitFlags.RemoveClientControl)) + if (HasUnitFlag(UnitFlags.RemoveClientControl)) return false; // taximaster case @@ -6859,7 +6874,7 @@ namespace Game.Entities float discount = GetReputationPriceDiscount(npc); totalcost = (uint)Math.Ceiling(totalcost * discount); firstcost = (uint)Math.Ceiling(firstcost * discount); - m_taxi.SetFlightMasterFactionTemplateId(npc.getFaction()); + m_taxi.SetFlightMasterFactionTemplateId(npc.GetFaction()); } else m_taxi.SetFlightMasterFactionTemplateId(0); @@ -6911,7 +6926,7 @@ namespace Game.Entities { m_taxi.ClearTaxiDestinations(); // not destinations, clear source node Dismount(); - RemoveFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.TaxiFlight); + RemoveUnitFlag(UnitFlags.RemoveClientControl | UnitFlags.TaxiFlight); getHostileRefManager().setOnlineOfflineState(true); } @@ -7121,8 +7136,8 @@ namespace Game.Entities { SetFreePrimaryProfessions(WorldConfig.GetUIntValue(WorldCfg.MaxPrimaryTradeSkill)); } - public uint GetFreePrimaryProfessionPoints() { return GetUInt32Value(ActivePlayerFields.CharacterPoints); } - void SetFreePrimaryProfessions(ushort profs) { SetUInt32Value(ActivePlayerFields.CharacterPoints, profs); } + public uint GetFreePrimaryProfessionPoints() { return m_activePlayerData.CharacterPoints; } + void SetFreePrimaryProfessions(ushort profs) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CharacterPoints), profs); } public bool HaveAtClient(WorldObject u) { bool one = u.GetGUID() == GetGUID(); @@ -7133,37 +7148,39 @@ namespace Game.Entities public bool HasTitle(CharTitlesRecord title) { return HasTitle(title.MaskID); } public bool HasTitle(uint bitIndex) { - if (bitIndex > PlayerConst.MaxTitleIndex) + uint fieldIndexOffset = bitIndex / 64; + if (fieldIndexOffset >= m_activePlayerData.KnownTitles.Size()) return false; - int fieldIndexOffset = (int)bitIndex / 32; - uint flag = (uint)(1 << ((int)bitIndex % 32)); - return HasFlag(ActivePlayerFields.KnownTitles + fieldIndexOffset, flag); + ulong flag = 1ul << ((int)bitIndex % 64); + return (m_activePlayerData.KnownTitles[(int)fieldIndexOffset] & flag) != 0; } public void SetTitle(CharTitlesRecord title, bool lost = false) { - int fieldIndexOffset = (int)title.MaskID / 32; - uint flag = (uint)(1 << (int)(title.MaskID % 32)); + int fieldIndexOffset = (title.MaskID / 64); + ulong flag = 1ul << (title.MaskID % 64); if (lost) { - if (!HasFlag(ActivePlayerFields.KnownTitles + fieldIndexOffset, flag)) + if (!HasTitle(title)) return; - RemoveFlag(ActivePlayerFields.KnownTitles + fieldIndexOffset, flag); + RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.KnownTitles, fieldIndexOffset), flag); } else { - if (HasFlag(ActivePlayerFields.KnownTitles + fieldIndexOffset, flag)) + if (HasTitle(title)) return; - SetFlag(ActivePlayerFields.KnownTitles + fieldIndexOffset, flag); + SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.KnownTitles, fieldIndexOffset), flag); } TitleEarned packet = new TitleEarned(lost ? ServerOpcodes.TitleLost : ServerOpcodes.TitleEarned); packet.Index = title.MaskID; SendPacket(packet); } + public void SetChosenTitle(uint title) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerTitle), title); } + public void SetKnownTitles(int index, ulong mask) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.KnownTitles, index), mask); } public void SetViewpoint(WorldObject target, bool apply) { @@ -7171,13 +7188,15 @@ namespace Game.Entities { Log.outDebug(LogFilter.Maps, "Player.CreateViewpoint: Player {0} create seer {1} (TypeId: {2}).", GetName(), target.GetEntry(), target.GetTypeId()); - if (!AddGuidValue(ActivePlayerFields.Farsight, target.GetGUID())) + if (m_activePlayerData.FarsightObject != ObjectGuid.Empty) { Log.outFatal(LogFilter.Player, "Player.CreateViewpoint: Player {0} cannot add new viewpoint!", GetName()); return; } + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.FarsightObject), target.GetGUID()); + // farsight dynobj or puppet may be very far away UpdateVisibilityOf(target); @@ -7189,12 +7208,14 @@ namespace Game.Entities { Log.outDebug(LogFilter.Maps, "Player.CreateViewpoint: Player {0} remove seer", GetName()); - if (!RemoveGuidValue(ActivePlayerFields.Farsight, target.GetGUID())) + if (target.GetGUID() != m_activePlayerData.FarsightObject) { Log.outFatal(LogFilter.Player, "Player.CreateViewpoint: Player {0} cannot remove current viewpoint!", GetName()); return; } + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.FarsightObject), ObjectGuid.Empty); + if (target.isTypeMask(TypeMask.Unit) && target != GetVehicleBase()) target.ToUnit().RemovePlayerFromVision(this); @@ -7204,9 +7225,10 @@ namespace Game.Entities } public WorldObject GetViewpoint() { - ObjectGuid guid = GetGuidValue(ActivePlayerFields.Farsight); + ObjectGuid guid = m_activePlayerData.FarsightObject; if (!guid.IsEmpty()) return Global.ObjAccessor.GetObjectByTypeMask(this, guid, TypeMask.Seer); + return null; } @@ -7331,6 +7353,95 @@ namespace Game.Entities return m_recall_location; } + public void SetRestState(RestTypes type, PlayerRestState state) + { + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RestInfo, (int)type).ModifyValue((RestInfo restInfo) => restInfo.StateID), (byte)state); + } + public void SetRestThreshold(RestTypes type, uint threshold) + { + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RestInfo, (int)type).ModifyValue((RestInfo restInfo) => restInfo.Threshold), threshold); + } + + public bool HasPlayerFlag(PlayerFlags flags) { return (m_playerData.PlayerFlags & (uint)flags) != 0; } + public void AddPlayerFlag(PlayerFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlags), (uint)flags); } + public void RemovePlayerFlag(PlayerFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlags), (uint)flags); } + public void SetPlayerFlags(PlayerFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlags), (uint)flags); } + + public bool HasPlayerFlagEx(PlayerFlagsEx flags) { return (m_playerData.PlayerFlagsEx & (uint)flags) != 0; } + public void AddPlayerFlagEx(PlayerFlagsEx flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); } + public void RemovePlayerFlagEx(PlayerFlagsEx flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); } + public void SetPlayerFlagsEx(PlayerFlagsEx flags) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); } + + public void SetSkinId(byte skinId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.SkinID), skinId); } + public void SetFaceId(byte faceId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.FaceID), faceId); } + public void SetHairStyleId(byte hairStyleId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.HairStyleID), hairStyleId); } + public void SetHairColorId(byte hairColorId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.HairColorID), hairColorId); } + public void SetFacialHairStyleId(byte facialHairStyleId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.FacialHairStyleID), facialHairStyleId); } + public void SetNativeSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.NativeSex), (byte)sex); } + public void SetPvpTitle(byte pvpTitle) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PvpTitle), pvpTitle); } + public void SetArenaFaction(byte arenaFaction) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.ArenaFaction), arenaFaction); } + public void ApplyModFakeInebriation(int mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.FakeInebriation), mod, apply); } + public void SetVirtualPlayerRealm(uint virtualRealmAddress) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.VirtualPlayerRealm), virtualRealmAddress); } + public void SetCustomDisplayOption(int slot, byte customDisplayOption) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.CustomDisplayOption, slot), customDisplayOption); } + + public void AddHeirloom(uint itemId, uint flags) + { + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Heirlooms), itemId); + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.HeirloomFlags), flags); + } + public void SetHeirloom(int slot, uint itemId) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Heirlooms, slot), itemId); } + public void SetHeirloomFlags(int slot, uint flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.HeirloomFlags, slot), flags); } + + public void AddToy(uint itemId, uint flags) + { + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Toys), itemId); + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ToyFlags), flags); + } + + public void AddTransmogBlock(uint blockValue) { AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Transmog), blockValue); } + public void AddTransmogFlag(int slot, uint flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Transmog, slot), flag); } + + public void AddConditionalTransmog(uint itemModifiedAppearanceId) { AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ConditionalTransmog), itemModifiedAppearanceId); } + public void RemoveConditionalTransmog(uint itemModifiedAppearanceId) + { + int index = m_activePlayerData.ConditionalTransmog.FindIndex(itemModifiedAppearanceId); + if (index >= 0) + RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ConditionalTransmog), index); + } + public void AddSelfResSpell(uint spellId) { AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.SelfResSpells), spellId); } + public void RemoveSelfResSpell(uint spellId) + { + int index = m_activePlayerData.SelfResSpells.FindIndex(spellId); + if (index >= 0) + RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.SelfResSpells), index); + } + public void ClearSelfResSpell() { ClearDynamicUpdateFieldValues(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.SelfResSpells)); } + + public void SetSummonedBattlePetGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.SummonedBattlePetGUID), guid); } + + public void AddTrackCreatureFlag(uint flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackCreatureMask), flags); } + public void RemoveTrackCreatureFlag(uint flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackCreatureMask), flags); } + + public void AddTrackResourceFlag(uint index, uint flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackResourceMask, (int)index), flags); } + public void RemoveTrackResourceFlag(uint index, uint flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackResourceMask, (int)index), flags); } + + public void SetVersatilityBonus(float value) { SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.VersatilityBonus), value); } + + public void ApplyModOverrideSpellPowerByAPPercent(float mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OverrideSpellPowerByAPPercent), mod, apply); } + + public void ApplyModOverrideAPBySpellPowerPercent(float mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OverrideAPBySpellPowerPercent), mod, apply); } + + public bool HasPlayerLocalFlag(PlayerLocalFlags flags) { return (m_activePlayerData.LocalFlags & (int)flags) != 0; } + public void AddPlayerLocalFlag(PlayerLocalFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (int)flags); } + public void RemovePlayerLocalFlag(PlayerLocalFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (int)flags); } + public void SetPlayerLocalFlags(PlayerLocalFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (int)flags); } + + public void SetWatchedFactionIndex(uint index) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.WatchedFactionIndex), unchecked((int)index)); } + + public void AddAuraVision(PlayerFieldByte2Flags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); } + public void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); } + + public bool CanTameExoticPets() { return IsGameMaster() || HasAuraType(AuraType.AllowTamePetType); } void SendAttackSwingDeadTarget() { SendPacket(new AttackSwingError(AttackSwingErr.DeadTarget)); } @@ -7385,6 +7496,81 @@ namespace Game.Entities base.BuildCreateUpdateBlockForPlayer(data, target); } + public override UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) + { + UpdateFieldFlag flags = base.GetUpdateFieldFlagsFor(target); + if (IsInSameRaidWith(target)) + flags |= UpdateFieldFlag.PartyMember; + + return flags; + } + + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt8((byte)flags); + m_objectData.WriteCreate(buffer, flags, this, target); + m_unitData.WriteCreate(buffer, flags, this, target); + m_playerData.WriteCreate(buffer, flags, this, target); + if (target == this) + m_activePlayerData.WriteCreate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); + + buffer.WriteUInt32((uint)(m_values.GetChangedObjectTypeMask() & ~((target != this) ? 1 : 0 << (int)TypeId.ActivePlayer))); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.Unit)) + m_unitData.WriteUpdate(buffer, flags, this, target); + + if (m_values.HasChanged(TypeId.Player)) + m_playerData.WriteUpdate(buffer, flags, this, target); + + if (target == this && m_values.HasChanged(TypeId.ActivePlayer)) + m_activePlayerData.WriteUpdate(buffer, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } + + void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) + { + UpdateMask valuesMask = new UpdateMask((int)TypeId.Max); + valuesMask.Set((int)TypeId.Unit); + valuesMask.Set((int)TypeId.Player); + + WorldPacket buffer = new WorldPacket(); + + UpdateMask mask = new UpdateMask(191); + m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags); + m_unitData.WriteUpdate(buffer, mask, flags, this, target); + + UpdateMask mask2 = new UpdateMask(161); + m_playerData.AppendAllowedFieldsMaskForFlag(mask2, flags); + m_playerData.WriteUpdate(buffer, mask2, flags, this, target); + + data.WriteUInt32(buffer.GetSize()); + data.WriteUInt32(valuesMask.GetBlock(0)); + data.WriteBytes(buffer); + } + + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_playerData); + m_values.ClearChangesMask(m_activePlayerData); + base.ClearUpdateMask(remove); + } + //Helpers public void ADD_GOSSIP_ITEM(GossipOptionIcon icon, string message, uint sender, uint action) { PlayerTalkClass.GetGossipMenu().AddMenuItem(-1, icon, message, sender, action, "", 0); } public void ADD_GOSSIP_ITEM_DB(uint menuId, uint menuItemId, uint sender, uint action) { PlayerTalkClass.GetGossipMenu().AddMenuItem(menuId, menuItemId, sender, action); } diff --git a/Source/Game/Entities/Player/RestMgr.cs b/Source/Game/Entities/Player/RestMgr.cs index 879654e50..67dcdd116 100644 --- a/Source/Game/Entities/Player/RestMgr.cs +++ b/Source/Game/Entities/Player/RestMgr.cs @@ -11,9 +11,7 @@ namespace Game.Entities public void SetRestBonus(RestTypes restType, float restBonus) { - byte rest_rested_offset; - byte rest_state_offset; - ActivePlayerFields next_level_xp_field; + uint next_level_xp; bool affectedByRaF = false; switch (restType) @@ -23,9 +21,7 @@ namespace Game.Entities if (_player.getLevel() >= WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel)) restBonus = 0; - rest_rested_offset = PlayerFieldOffsets.RestRestedXp; - rest_state_offset = PlayerFieldOffsets.RestStateXp; - next_level_xp_field = ActivePlayerFields.NextLevelXp; + next_level_xp = _player.m_activePlayerData.NextLevelXP; affectedByRaF = true; break; case RestTypes.Honor: @@ -33,37 +29,39 @@ namespace Game.Entities if (_player.IsMaxHonorLevel()) restBonus = 0; - rest_rested_offset = PlayerFieldOffsets.RestRestedHonor; - rest_state_offset = PlayerFieldOffsets.RestStateHonor; - next_level_xp_field = ActivePlayerFields.HonorNextLevel; + next_level_xp = _player.m_activePlayerData.HonorNextLevel; break; default: return; } + float rest_bonus_max = next_level_xp * 1.5f / 2; + if (restBonus < 0) restBonus = 0; - float rest_bonus_max = (float)(_player.GetUInt32Value(next_level_xp_field)) * 1.5f / 2; - if (restBonus > rest_bonus_max) - _restBonus[(int)restType] = rest_bonus_max; - else - _restBonus[(int)restType] = restBonus; + restBonus = rest_bonus_max; + + _restBonus[(int)restType] = restBonus; + + uint oldBonus = (uint)_restBonus[(int)restType]; + if (oldBonus == restBonus) + return; // update data for client if (affectedByRaF && _player.GetsRecruitAFriendBonus(true) && (_player.GetSession().IsARecruiter() || _player.GetSession().GetRecruiterId() != 0)) - _player.SetUInt32Value(ActivePlayerFields.RestInfo + rest_state_offset, (uint)PlayerRestState.RAFLinked); + _player.SetRestState(restType, PlayerRestState.RAFLinked); else { if (_restBonus[(int)restType] > 10) - _player.SetUInt32Value(ActivePlayerFields.RestInfo + rest_state_offset, (uint)PlayerRestState.Rested); + _player.SetRestState(restType, PlayerRestState.Rested); else if (_restBonus[(int)restType] <= 1) - _player.SetUInt32Value(ActivePlayerFields.RestInfo + rest_state_offset, (uint)PlayerRestState.NotRAFLinked); + _player.SetRestState(restType, PlayerRestState.NotRAFLinked); } // RestTickUpdate - _player.SetUInt32Value(ActivePlayerFields.RestInfo + rest_rested_offset, (uint)_restBonus[(int)restType]); + _player.SetRestThreshold(restType, (uint)_restBonus[(int)restType]); } public void AddRestBonus(RestTypes restType, float restBonus) @@ -84,7 +82,7 @@ namespace Game.Entities if (oldRestMask == 0 && _restFlagMask != 0) // only set flag/time on the first rest state { _restTime = Time.UnixTime; - _player.SetFlag(PlayerFields.Flags, PlayerFlags.Resting); + _player.AddPlayerFlag(PlayerFlags.Resting); } if (triggerId != 0) @@ -99,7 +97,7 @@ namespace Game.Entities if (oldRestMask != 0 && _restFlagMask == 0) // only remove flag/time on the last rest state remove { _restTime = 0; - _player.RemoveFlag(PlayerFields.Flags, PlayerFlags.Resting); + _player.RemovePlayerFlag(PlayerFlags.Resting); } } @@ -135,8 +133,8 @@ namespace Game.Entities public void LoadRestBonus(RestTypes restType, PlayerRestState state, float restBonus) { _restBonus[(int)restType] = restBonus; - _player.SetUInt32Value(ActivePlayerFields.RestInfo + (int)restType * 2, (uint)state); - _player.SetUInt32Value(ActivePlayerFields.RestInfo + (int)restType * 2 + 1, (uint)restBonus); + _player.SetRestState(restType, state); + _player.SetRestThreshold(restType, (uint)restBonus); } public float CalcExtraPerSec(RestTypes restType, float bubble) @@ -144,9 +142,9 @@ namespace Game.Entities switch (restType) { case RestTypes.Honor: - return (_player.GetUInt32Value(ActivePlayerFields.HonorNextLevel)) / 72000.0f * bubble; + return _player.m_activePlayerData.HonorNextLevel / 72000.0f * bubble; case RestTypes.XP: - return (_player.GetUInt32Value(ActivePlayerFields.NextLevelXp)) / 72000.0f * bubble; + return _player.m_activePlayerData.NextLevelXP / 72000.0f * bubble; default: return 0.0f; } diff --git a/Source/Game/Entities/StatSystem.cs b/Source/Game/Entities/StatSystem.cs index d22f4d382..dc643e51f 100644 --- a/Source/Game/Entities/StatSystem.cs +++ b/Source/Game/Entities/StatSystem.cs @@ -183,12 +183,18 @@ namespace Game.Entities public void ApplyStatBuffMod(Stats stat, float val, bool apply) { - ApplyModSignedFloatValue((val > 0 ? UnitFields.PosStat + (int)stat : UnitFields.NegStat + (int)stat), val, apply); + MathFunctions.ApplyPercentModFloatVar(ref (val > 0 ? ref m_floatStatPosBuff[(int)stat] : ref m_floatStatNegBuff[(int)stat]), val, apply); + UpdateStatBuffModForClient(stat); } public void ApplyStatPercentBuffMod(Stats stat, float val, bool apply) { - ApplyPercentModFloatValue(UnitFields.PosStat + (int)stat, val, apply); - ApplyPercentModFloatValue(UnitFields.NegStat + (int)stat, val, apply); + MathFunctions.ApplyPercentModFloatVar(ref m_floatStatPosBuff[(int)stat], val, apply); + MathFunctions.ApplyPercentModFloatVar(ref m_floatStatNegBuff[(int)stat], val, apply); + } + void UpdateStatBuffModForClient(Stats stat) + { + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StatPosBuff, (int)stat), (int)m_floatStatPosBuff[(int)stat]); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StatNegBuff, (int)stat), (int)m_floatStatNegBuff[(int)stat]); } public virtual bool UpdateStats(Stats stat) { return false; } @@ -219,16 +225,16 @@ namespace Game.Entities { case WeaponAttackType.BaseAttack: default: - SetStatFloatValue(UnitFields.MinDamage, minDamage); - SetStatFloatValue(UnitFields.MaxDamage, maxDamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinDamage), minDamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxDamage), maxDamage); break; case WeaponAttackType.OffAttack: - SetStatFloatValue(UnitFields.MinOffHandDamage, minDamage); - SetStatFloatValue(UnitFields.MaxOffHandDamage, maxDamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinOffHandDamage), minDamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxOffHandDamage), maxDamage); break; case WeaponAttackType.RangedAttack: - SetStatFloatValue(UnitFields.MinRangedDamage, minDamage); - SetStatFloatValue(UnitFields.MaxRangedDamage, maxDamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinRangedDamage), minDamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxRangedDamage), maxDamage); break; } } @@ -245,26 +251,10 @@ namespace Game.Entities } //Stats - public float GetStat(Stats stat) - { - return GetUInt32Value(UnitFields.Stat + (int)stat); - } - public void SetCreateStat(Stats stat, float val) - { - CreateStats[(int)stat] = val; - } - public void SetStat(Stats stat, int val) - { - SetStatInt32Value(UnitFields.Stat + (int)stat, val); - } - public void SetCreateMana(uint val) - { - SetUInt32Value(UnitFields.BaseMana, val); - } - public uint GetCreateMana() - { - return GetUInt32Value(UnitFields.BaseMana); - } + public float GetStat(Stats stat) { return m_unitData.Stats[(int)stat]; } + public void SetStat(Stats stat, int val) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Stats, (int)stat), val); } + public uint GetCreateMana() { return m_unitData.BaseMana; } + public void SetCreateMana(uint val) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BaseMana), val); } public uint GetArmor() { return (uint)(GetResistance(SpellSchools.Normal) + GetBonusResistanceMod(SpellSchools.Normal)); @@ -274,13 +264,23 @@ namespace Game.Entities SetResistance(SpellSchools.Normal, val); SetBonusResistanceMod(SpellSchools.Normal, bonusVal); } + public float GetCreateStat(Stats stat) + { + return CreateStats[(int)stat]; + } + public void SetCreateStat(Stats stat, float val) + { + CreateStats[(int)stat] = val; + } + public float GetPosStat(Stats stat) { return m_unitData.StatPosBuff[(int)stat]; } + public float GetNegStat(Stats stat) { return m_unitData.StatNegBuff[(int)stat]; } public int GetResistance(SpellSchools school) { - return GetInt32Value(UnitFields.Resistances + (int)school); + return m_unitData.Resistances[(int)school]; } public int GetBonusResistanceMod(SpellSchools school) { - return GetInt32Value(UnitFields.BonusResistanceMods + (int)school); + return m_unitData.BonusResistanceMods[(int)school]; } public int GetResistance(SpellSchoolMask mask) { @@ -295,25 +295,22 @@ namespace Game.Entities // resist value will never be negative here return resist.HasValue ? resist.Value : 0; } - public void SetResistance(SpellSchools school, int val) - { - SetStatInt32Value(UnitFields.Resistances + (int)school, val); - } - public void SetBonusResistanceMod(SpellSchools school, int val) - { - SetStatInt32Value(UnitFields.BonusResistanceMods + (int)school, val); - } + public void SetResistance(SpellSchools school, int val) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Resistances, (int)school), val); } + public void SetBonusResistanceMod(SpellSchools school, int val) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BonusResistanceMods, (int)school), val); } + public void SetModCastingSpeed(float castingSpeed) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModCastingSpeed), castingSpeed); } + public void SetModSpellHaste(float spellHaste) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModSpellHaste), spellHaste); } + public void SetModHaste(float haste) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModHaste), haste); } + public void SetModRangedHaste(float rangedHaste) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModRangedHaste), rangedHaste); } + public void SetModHasteRegen(float hasteRegen) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModHasteRegen), hasteRegen); } + public void SetModTimeRate(float timeRate) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModTimeRate), timeRate); } - public float GetCreateStat(Stats stat) - { - return CreateStats[(int)stat]; - } public void InitStatBuffMods() { - for (var i = Stats.Strength; i < Stats.Max; ++i) + for (var stat = Stats.Strength; stat < Stats.Max; ++stat) { - SetFloatValue(UnitFields.PosStat + (int)i, 0); - SetFloatValue(UnitFields.NegStat + (int)i, 0); + m_floatStatPosBuff[(int)stat] = 0.0f; + m_floatStatNegBuff[(int)stat] = 0.0f; + UpdateStatBuffModForClient(stat); } } @@ -341,16 +338,10 @@ namespace Game.Entities return value; } - //Health - public uint GetCreateHealth() { return GetUInt32Value(UnitFields.BaseHealth); } - public ulong GetHealth() { return GetUInt64Value(UnitFields.Health); } - public ulong GetMaxHealth() { return GetUInt64Value(UnitFields.MaxHealth); } - public float GetHealthPct() { return GetMaxHealth() != 0 ? 100.0f * GetHealth() / GetMaxHealth() : 0.0f; } - - public void SetCreateHealth(uint val) - { - SetUInt32Value(UnitFields.BaseHealth, val); - } + //Health + public uint GetCreateHealth() { return m_unitData.BaseHealth; } + public void SetCreateHealth(uint val) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BaseHealth), val); } + public ulong GetHealth() { return m_unitData.Health; } public void SetHealth(ulong val) { if (getDeathState() == DeathState.JustDied) @@ -364,7 +355,7 @@ namespace Game.Entities val = maxHealth; } - SetUInt64Value(UnitFields.Health, val); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Health), val); // group update Player player = ToPlayer(); @@ -380,13 +371,14 @@ namespace Game.Entities pet.SetGroupUpdateFlag(GroupUpdatePetFlags.CurHp); } } + public ulong GetMaxHealth() { return m_unitData.MaxHealth; } public void SetMaxHealth(ulong val) { if (val == 0) val = 1; ulong health = GetHealth(); - SetUInt64Value(UnitFields.MaxHealth, val); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxHealth), val); // group update if (IsTypeId(TypeId.Player)) @@ -404,6 +396,7 @@ namespace Game.Entities if (val < health) SetHealth(val); } + public float GetHealthPct() { return GetMaxHealth() != 0 ? 100.0f * GetHealth() / GetMaxHealth() : 0.0f; } public void SetFullHealth() { SetHealth(GetMaxHealth()); } public bool IsFullHealth() { return GetHealth() == GetMaxHealth(); } @@ -419,21 +412,19 @@ namespace Game.Entities public virtual float GetArmorMultiplierForTarget(WorldObject target) { return 1.0f; } //Powers - public PowerType GetPowerType() - { - return (PowerType)GetUInt32Value(UnitFields.DisplayPower); - } + public PowerType GetPowerType() { return (PowerType)(byte)m_unitData.DisplayPower; } public void SetPowerType(PowerType powerType) { if (GetPowerType() == powerType) return; - SetUInt32Value(UnitFields.DisplayPower, (uint)powerType); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.DisplayPower), (byte)powerType); - if (IsTypeId(TypeId.Player)) + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) { - if (ToPlayer().GetGroup()) - ToPlayer().SetGroupUpdateFlag(GroupUpdateFlags.PowerType); + if (thisPlayer.GetGroup()) + thisPlayer.SetGroupUpdateFlag(GroupUpdateFlags.PowerType); } /*else if (IsPet()) TODO 6.x { @@ -461,6 +452,8 @@ namespace Game.Entities break; } } + public void SetOverrideDisplayPowerId(uint powerDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.OverrideDisplayPowerID), powerDisplayId); } + public void SetMaxPower(PowerType powerType, int val) { uint powerIndex = GetPowerIndex(powerType); @@ -468,7 +461,7 @@ namespace Game.Entities return; int cur_power = GetPower(powerType); - SetInt32Value(UnitFields.MaxPower + (int)powerIndex, val); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxPower, (int)powerIndex), (uint)val); // group update if (IsTypeId(TypeId.Player)) @@ -496,7 +489,7 @@ namespace Game.Entities if (maxPower < val) val = maxPower; - SetInt32Value(UnitFields.Power + (int)powerIndex, val); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)powerIndex), val); if (IsInWorld) { @@ -527,7 +520,7 @@ namespace Game.Entities if (powerIndex == (int)PowerType.Max || powerIndex >= (int)PowerType.MaxPerClass) return 0; - return GetInt32Value(UnitFields.Power + (int)powerIndex); + return m_unitData.Power[(int)powerIndex]; } public int GetMaxPower(PowerType powerType) { @@ -535,7 +528,7 @@ namespace Game.Entities if (powerIndex == (int)PowerType.Max || powerIndex >= (int)PowerType.MaxPerClass) return 0; - return GetInt32Value(UnitFields.MaxPower + (int)powerIndex); + return (int)(uint)m_unitData.MaxPower[(int)powerIndex]; } public int GetCreatePowers(PowerType powerType) { @@ -597,6 +590,15 @@ namespace Game.Entities return MathFunctions.CalculatePct(damage, percent); } + public void SetAttackPower(int attackPower) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AttackPower), attackPower); } + public void SetAttackPowerModPos(int attackPowerMod) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AttackPowerModPos), attackPowerMod); } + public void SetAttackPowerModNeg(int attackPowerMod) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AttackPowerModNeg), attackPowerMod); } + public void SetAttackPowerMultiplier(float attackPowerMult) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AttackPowerMultiplier), attackPowerMult); } + public void SetRangedAttackPower(int attackPower) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.RangedAttackPower), attackPower); } + public void SetRangedAttackPowerModPos(int attackPowerMod) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.RangedAttackPowerModPos), attackPowerMod); } + public void SetRangedAttackPowerModNeg(int attackPowerMod) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.RangedAttackPowerModNeg), attackPowerMod); } + public void SetRangedAttackPowerMultiplier(float attackPowerMult) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.RangedAttackPowerMultiplier), attackPowerMult); } + //Chances float MeleeSpellMissChance(Unit victim, WeaponAttackType attType, uint spellId) { @@ -635,18 +637,19 @@ namespace Game.Entities float GetUnitCriticalChance(WeaponAttackType attackType, Unit victim) { float chance = 0.0f; - if (IsTypeId(TypeId.Player)) + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) { switch (attackType) { case WeaponAttackType.BaseAttack: - chance = GetFloatValue(ActivePlayerFields.CritPercentage); + chance = thisPlayer.m_activePlayerData.CritPercentage; break; case WeaponAttackType.OffAttack: - chance = GetFloatValue(ActivePlayerFields.OffhandCritPercentage); + chance = thisPlayer.m_activePlayerData.OffhandCritPercentage; break; case WeaponAttackType.RangedAttack: - chance = GetFloatValue(ActivePlayerFields.RangedCritPercentage); + chance = thisPlayer.m_activePlayerData.RangedCritPercentage; break; } } @@ -684,8 +687,9 @@ namespace Game.Entities float chance = 0.0f; float levelBonus = 0.0f; - if (victim.IsTypeId(TypeId.Player)) - chance = victim.GetFloatValue(ActivePlayerFields.DodgePercentage); + Player playerVictim = victim.ToPlayer(); + if (playerVictim) + chance = playerVictim.m_activePlayerData.DodgePercentage; else { if (!victim.IsTotem()) @@ -729,7 +733,7 @@ namespace Game.Entities tmpitem = playerVictim.GetWeaponForAttack(WeaponAttackType.OffAttack, true); if (tmpitem) - chance = playerVictim.GetFloatValue(ActivePlayerFields.ParryPercentage); + chance = playerVictim.m_activePlayerData.ParryPercentage; } } else @@ -777,7 +781,7 @@ namespace Game.Entities { Item tmpitem = playerVictim.GetUseableItemByPos(InventorySlots.Bag0, EquipmentSlot.OffHand); if (tmpitem && !tmpitem.IsBroken() && tmpitem.GetTemplate().GetInventoryType() == InventoryType.Shield) - chance = playerVictim.GetFloatValue(ActivePlayerFields.BlockPercentage); + chance = playerVictim.m_activePlayerData.BlockPercentage; } } else @@ -796,7 +800,7 @@ namespace Game.Entities return Math.Max(chance, 0.0f); } - int GetMechanicResistChance(SpellInfo spellInfo) + public int GetMechanicResistChance(SpellInfo spellInfo) { if (spellInfo == null) return 0; @@ -817,6 +821,9 @@ namespace Game.Entities } return Math.Max(resistMech, 0); } + + public void ApplyModPowerCostModifier(SpellSchools school, int mod, bool apply) { ApplyModUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerCostModifier, (int)school), mod, apply); } + public void ApplyModPowerCostMultiplier(SpellSchools school, float pct, bool apply) { ApplyModUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerCostMultiplier, (int)school), pct, apply); } } public partial class Player @@ -925,7 +932,14 @@ namespace Game.Entities UpdateArmor(); } - void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true); } + public void ApplyModTargetResistance(int mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModTargetResistance), mod, apply); } + public void ApplyModTargetPhysicalResistance(int mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModTargetPhysicalResistance), mod, apply); } + + public void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true); } + + public void ApplyModDamageDonePos(SpellSchools school, int mod, bool apply) { ApplyModUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePos, (int)school), mod, apply); } + public void ApplyModDamageDoneNeg(SpellSchools school, int mod, bool apply) { ApplyModUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDoneNeg, (int)school), mod, apply); } + public void ApplyModDamageDonePercent(SpellSchools school, float pct, bool apply) { ApplyPercentModUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePercent, (int)school), pct, apply); } public void ApplyRatingMod(CombatRating combatRating, int value, bool apply) { @@ -989,7 +1003,7 @@ namespace Game.Entities max_damage = ((baseValue + weaponMaxDamage) * basePct + totalValue) * totalPct * versaDmgMod; } - void UpdateAllCritPercentages() + public void UpdateAllCritPercentages() { float value = 5.0f; @@ -1004,7 +1018,7 @@ namespace Game.Entities public void UpdateManaRegen() { - int manaIndex = (int)GetPowerIndex(PowerType.Mana); + uint manaIndex = GetPowerIndex(PowerType.Mana); if (manaIndex == (int)PowerType.Max) return; @@ -1021,8 +1035,8 @@ namespace Game.Entities // Apply PCT bonus from SPELL_AURA_MOD_MANA_REGEN_PCT base_regen *= GetTotalAuraMultiplierByMiscValue(AuraType.ModManaRegenPct, (int)PowerType.Mana); - SetFloatValue(UnitFields.PowerRegenInterruptedFlatModifier + manaIndex, base_regen); - SetFloatValue(UnitFields.PowerRegenFlatModifier + manaIndex, base_regen); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerRegenFlatModifier, (int)manaIndex), base_regen); + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PowerRegenInterruptedFlatModifier, (int)manaIndex), base_regen); } public void UpdateSpellDamageAndHealingBonus() @@ -1030,18 +1044,19 @@ namespace Game.Entities // Magic damage modifiers implemented in Unit.SpellDamageBonusDone // This information for client side use only // Get healing bonus for all schools - SetStatInt32Value(ActivePlayerFields.ModHealingDonePos, (int)SpellBaseHealingBonusDone(SpellSchoolMask.All)); + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePos), (int)SpellBaseHealingBonusDone(SpellSchoolMask.All)); // Get damage bonus for all schools var modDamageAuras = GetAuraEffectsByType(AuraType.ModDamageDone); - for (var i = SpellSchools.Holy; i < SpellSchools.Max; ++i) + for (int i = (int)SpellSchools.Holy; i < (int)SpellSchools.Max; ++i) { - SetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)i, modDamageAuras.Aggregate(0, (negativeMod, aurEff) => + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDoneNeg, i), modDamageAuras.Aggregate(0, (negativeMod, aurEff) => { - if (aurEff.GetAmount() < 0 && Convert.ToBoolean(aurEff.GetMiscValue() & (1 << (int)i))) + if (aurEff.GetAmount() < 0 && Convert.ToBoolean(aurEff.GetMiscValue() & (1 << i))) negativeMod += aurEff.GetAmount(); return negativeMod; })); - SetStatInt32Value(ActivePlayerFields.ModDamageDonePos + (int)i, SpellBaseDamageBonusDone((SpellSchoolMask)(1 << (int)i)) - GetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)i)); + SetUpdateFieldStatValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePos, i), + (SpellBaseDamageBonusDone((SpellSchoolMask)(1 << i)) - m_activePlayerData.ModDamageDoneNeg[i])); } if (HasAuraType(AuraType.OverrideAttackPowerBySpPct)) @@ -1060,17 +1075,6 @@ namespace Game.Entities var entry = CliDB.ChrClassesStorage.LookupByKey(GetClass()); UnitMods unitMod = ranged ? UnitMods.AttackPowerRanged : UnitMods.AttackPower; - UnitFields index = UnitFields.AttackPower; - UnitFields index_mod = UnitFields.AttackPowerModPos; - UnitFields index_mult = UnitFields.AttackPowerMultiplier; - - if (ranged) - { - index = UnitFields.RangedAttackPower; - index_mod = UnitFields.RangedAttackPowerModPos; - index_mult = UnitFields.RangedAttackPowerMultiplier; - } - if (!HasAuraType(AuraType.OverrideAttackPowerBySpPct)) { if (!ranged) @@ -1090,11 +1094,11 @@ namespace Game.Entities } else { - int minSpellPower = GetInt32Value(ActivePlayerFields.ModHealingDonePos); + int minSpellPower = m_activePlayerData.ModHealingDonePos; for (var i = SpellSchools.Holy; i < SpellSchools.Max; ++i) - minSpellPower = Math.Min(minSpellPower, GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)i)); + minSpellPower = Math.Min(minSpellPower, m_activePlayerData.ModDamageDonePos[(int)i]); - val2 = MathFunctions.CalculatePct(minSpellPower, GetFloatValue(ActivePlayerFields.OverrideApBySpellPowerPercent)); + val2 = MathFunctions.CalculatePct(minSpellPower, m_activePlayerData.OverrideAPBySpellPowerPercent); } SetModifierValue(unitMod, UnitModifierType.BaseValue, val2); @@ -1112,9 +1116,18 @@ namespace Game.Entities attPowerMod += (int)(GetArmor() / iter.GetAmount()); } - SetUInt32Value(index, (uint)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetUInt32Value(index_mod, (uint)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MOD_POS field - SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field + if (ranged) + { + SetRangedAttackPower((int)base_attPower); + SetRangedAttackPowerModPos((int)attPowerMod); + SetRangedAttackPowerMultiplier(attPowerMultiplier); + } + else + { + SetAttackPower((int)base_attPower); + SetAttackPowerModPos((int)attPowerMod); + SetAttackPowerMultiplier(attPowerMultiplier); + } Pet pet = GetPet(); //update pet's AP Guardian guardian = GetGuardianPet(); @@ -1220,8 +1233,8 @@ namespace Game.Entities if (amount < 0) amount = 0; - uint oldRating = GetUInt32Value(ActivePlayerFields.CombatRating + (int)cr); - SetUInt32Value(ActivePlayerFields.CombatRating + (int)cr, (uint)amount); + uint oldRating = m_activePlayerData.CombatRatings[(int)cr]; + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CombatRatings, (int)cr), (uint)amount); bool affectStats = CanModifyStats(); @@ -1320,15 +1333,15 @@ namespace Game.Entities { if (!CanUseMastery()) { - SetFloatValue(ActivePlayerFields.Mastery, 0.0f); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Mastery), 0.0f); return; } float value = GetTotalAuraModifier(AuraType.Mastery); value += GetRatingBonusValue(CombatRating.Mastery); - SetFloatValue(ActivePlayerFields.Mastery, value); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Mastery), value); - ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(GetUInt32Value(PlayerFields.CurrentSpecId)); + ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization()); if (chrSpec == null) return; @@ -1354,8 +1367,8 @@ namespace Game.Entities public void UpdateVersatilityDamageDone() { - // No proof that CR_VERSATILITY_DAMAGE_DONE is allways = PLAYER_VERSATILITY - SetUInt32Value(ActivePlayerFields.Versatility, GetUInt32Value(ActivePlayerFields.CombatRating + (int)CombatRating.VersatilityDamageDone)); + // No proof that CR_VERSATILITY_DAMAGE_DONE is allways = ActivePlayerData::Versatility + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Versatility), (int)m_activePlayerData.CombatRatings[(int)CombatRating.VersatilityDamageDone]); if (GetClass() == Class.Hunter) UpdateDamagePhysical(WeaponAttackType.RangedAttack); @@ -1372,13 +1385,13 @@ namespace Game.Entities foreach (AuraEffect auraEffect in GetAuraEffectsByType(AuraType.ModHealingDonePercent)) MathFunctions.AddPct(ref value, auraEffect.GetAmount()); - SetStatFloatValue(ActivePlayerFields.ModHealingDonePct, value); + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePercent), value); } void UpdateArmorPenetration(int amount) { // Store Rating Value - SetInt32Value(ActivePlayerFields.CombatRating + (int)CombatRating.ArmorPenetration, amount); + SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CombatRatings, (int)CombatRating.ArmorPenetration), (uint)amount); } public void UpdateParryPercentage() { @@ -1413,10 +1426,8 @@ namespace Game.Entities if (WorldConfig.GetBoolValue(WorldCfg.StatsLimitsEnable)) value = value > WorldConfig.GetFloatValue(WorldCfg.StatsLimitsParry) ? WorldConfig.GetFloatValue(WorldCfg.StatsLimitsParry) : value; - - value = value < 0.0f ? 0.0f : value; } - SetFloatValue(ActivePlayerFields.ParryPercentage, value); + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ParryPercentage), value); } public void UpdateDodgePercentage() @@ -1450,8 +1461,7 @@ namespace Game.Entities if (WorldConfig.GetBoolValue(WorldCfg.StatsLimitsEnable)) value = value > WorldConfig.GetFloatValue(WorldCfg.StatsLimitsDodge) ? WorldConfig.GetFloatValue(WorldCfg.StatsLimitsDodge) : value; - value = value < 0.0f ? 0.0f : value; - SetStatFloatValue(ActivePlayerFields.DodgePercentage, value); + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DodgePercentage), value); } public void UpdateBlockPercentage() { @@ -1468,47 +1478,35 @@ namespace Game.Entities if (WorldConfig.GetBoolValue(WorldCfg.StatsLimitsEnable)) value = value > WorldConfig.GetFloatValue(WorldCfg.StatsLimitsBlock) ? WorldConfig.GetFloatValue(WorldCfg.StatsLimitsBlock) : value; - - value = value < 0.0f ? 0.0f : value; } - SetFloatValue(ActivePlayerFields.BlockPercentage, value); + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BlockPercentage), value); } public void UpdateCritPercentage(WeaponAttackType attType) { - BaseModGroup modGroup; - ActivePlayerFields index; - CombatRating cr; + float applyCritLimit(float value) + { + if (WorldConfig.GetBoolValue(WorldCfg.StatsLimitsEnable)) + value = value > WorldConfig.GetFloatValue(WorldCfg.StatsLimitsCrit) ? WorldConfig.GetFloatValue(WorldCfg.StatsLimitsCrit) : value; + return value; + } switch (attType) { case WeaponAttackType.OffAttack: - modGroup = BaseModGroup.OffhandCritPercentage; - index = ActivePlayerFields.OffhandCritPercentage; - cr = CombatRating.CritMelee; + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OffhandCritPercentage), + applyCritLimit(GetTotalPercentageModValue(BaseModGroup.OffhandCritPercentage) + GetRatingBonusValue(CombatRating.CritMelee))); break; case WeaponAttackType.RangedAttack: - modGroup = BaseModGroup.RangedCritPercentage; - index = ActivePlayerFields.RangedCritPercentage; - cr = CombatRating.CritRanged; + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RangedCritPercentage), + applyCritLimit(GetTotalPercentageModValue(BaseModGroup.RangedCritPercentage) + GetRatingBonusValue(CombatRating.CritRanged))); break; case WeaponAttackType.BaseAttack: default: - modGroup = BaseModGroup.CritPercentage; - index = ActivePlayerFields.CritPercentage; - cr = CombatRating.CritMelee; + SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CritPercentage), + applyCritLimit(GetTotalPercentageModValue(BaseModGroup.CritPercentage) + GetRatingBonusValue(CombatRating.CritMelee))); break; } - - float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr); - // Modify crit from weapon skill and maximized defense skill of same level victim difference - value += (GetMaxSkillValueForLevel() - GetMaxSkillValueForLevel()) * 0.04f; - - if (WorldConfig.GetBoolValue(WorldCfg.StatsLimitsEnable)) - value = value > WorldConfig.GetFloatValue(WorldCfg.StatsLimitsCrit) ? WorldConfig.GetFloatValue(WorldCfg.StatsLimitsCrit) : value; - - value = value < 0.0f ? 0.0f : value; - SetFloatValue(index, value); } public void UpdateExpertise(WeaponAttackType attack) @@ -1528,10 +1526,10 @@ namespace Game.Entities switch (attack) { case WeaponAttackType.BaseAttack: - SetInt32Value(ActivePlayerFields.Expertise, expertise); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MainhandExpertise), expertise); break; case WeaponAttackType.OffAttack: - SetInt32Value(ActivePlayerFields.OffhandExpertise, expertise); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OffhandExpertise), expertise); break; default: break; } @@ -1623,7 +1621,7 @@ namespace Game.Entities crit += GetRatingBonusValue(CombatRating.CritSpell); // Store crit value - SetFloatValue(ActivePlayerFields.SpellCritPercentage1, crit); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.SpellCritPercentage), crit); } public void UpdateMeleeHitChances() @@ -1688,7 +1686,7 @@ namespace Game.Entities public void ApplySpellPenetrationBonus(int amount, bool apply) { - ApplyModInt32Value(ActivePlayerFields.ModTargetResistance, -amount, apply); + ApplyModTargetResistance(-amount, apply); m_spellPenetrationItemMod += apply ? amount : -amount; } @@ -1711,9 +1709,9 @@ namespace Game.Entities apply = _ModifyUInt32(apply, ref m_baseSpellPower, ref amount); // For speed just update for client - ApplyModUInt32Value(ActivePlayerFields.ModHealingDonePos, amount, apply); - for (int i = (int)SpellSchools.Holy; i < (int)SpellSchools.Max; ++i) - ApplyModUInt32Value(ActivePlayerFields.ModDamageDonePos + i, amount, apply); + ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePos), amount, apply); + for (SpellSchools spellSchool = SpellSchools.Holy; spellSchool < SpellSchools.Max; ++spellSchool) + ApplyModDamageDonePos(spellSchool, amount, apply); if (HasAuraType(AuraType.OverrideAttackPowerBySpPct)) { @@ -1826,20 +1824,19 @@ namespace Game.Entities { UnitMods unitMod = ranged ? UnitMods.AttackPowerRanged : UnitMods.AttackPower; - UnitFields index = UnitFields.AttackPower; - UnitFields index_mult = UnitFields.AttackPowerMultiplier; + float baseAttackPower = GetModifierValue(unitMod, UnitModifierType.BaseValue) * GetModifierValue(unitMod, UnitModifierType.BasePCT); + float attackPowerMultiplier = GetModifierValue(unitMod, UnitModifierType.TotalPCT) - 1.0f; if (ranged) { - index = UnitFields.RangedAttackPower; - index_mult = UnitFields.RangedAttackPowerMultiplier; + SetRangedAttackPower((int)baseAttackPower); + SetRangedAttackPowerMultiplier(attackPowerMultiplier); + } + else + { + SetAttackPower((int)baseAttackPower); + SetAttackPowerMultiplier(attackPowerMultiplier); } - - float base_attPower = GetModifierValue(unitMod, UnitModifierType.BaseValue) * GetModifierValue(unitMod, UnitModifierType.BasePCT); - float attPowerMultiplier = GetModifierValue(unitMod, UnitModifierType.TotalPCT) - 1.0f; - - SetInt32Value(index, (int)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field //automatically update weapon damage after attack power modification if (ranged) diff --git a/Source/Game/Entities/TemporarySummon.cs b/Source/Game/Entities/TemporarySummon.cs index 560497982..686342d77 100644 --- a/Source/Game/Entities/TemporarySummon.cs +++ b/Source/Game/Entities/TemporarySummon.cs @@ -187,7 +187,7 @@ namespace Game.Entities if (owner != null && IsTrigger() && m_spells[0] != 0) { - SetFaction(owner.getFaction()); + SetFaction(owner.GetFaction()); SetLevel(owner.getLevel()); if (owner.IsTypeId(TypeId.Player)) m_ControlledByPlayer = true; @@ -215,7 +215,7 @@ namespace Game.Entities if (m_Properties.Faction != 0) SetFaction(m_Properties.Faction); else if (IsVehicle() && owner != null) // properties should be vehicle - SetFaction(owner.getFaction()); + SetFaction(owner.GetFaction()); } public virtual void InitSummon() @@ -327,7 +327,7 @@ namespace Game.Entities SetReactState(ReactStates.Passive); SetCreatorGUID(GetOwner().GetGUID()); - SetFaction(GetOwner().getFaction()); + SetFaction(GetOwner().GetFaction()); GetOwner().SetMinion(this, true); } @@ -448,9 +448,6 @@ namespace Game.Entities SetBaseAttackTime(WeaponAttackType.OffAttack, SharedConst.BaseAttackTime); SetBaseAttackTime(WeaponAttackType.RangedAttack, SharedConst.BaseAttackTime); - SetFloatValue(UnitFields.ModCastSpeed, 1.0f); - SetFloatValue(UnitFields.ModCastHaste, 1.0f); - //scale var cFamily = CliDB.CreatureFamilyStorage.LookupByKey(cinfo.Family); if (cFamily != null && cFamily.MinScale > 0.0f && petType == PetType.Hunter) @@ -517,8 +514,8 @@ namespace Game.Entities case PetType.Summon: { // the damage bonus used for pets is either fire or shadow damage, whatever is higher - int fire = GetOwner().GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Fire); - int shadow = GetOwner().GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Shadow); + int fire = GetOwner().ToPlayer().m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire]; + int shadow = GetOwner().ToPlayer().m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Shadow]; int val = (fire > shadow) ? fire : shadow; if (val < 0) val = 0; @@ -531,7 +528,7 @@ namespace Game.Entities } case PetType.Hunter: { - SetUInt32Value(UnitFields.PetNextLevelExp, (uint)(Global.ObjectMgr.GetXPForLevel(petlevel) * 0.05f)); + ToPet().SetPetNextLevelExperience((uint)(Global.ObjectMgr.GetXPForLevel(petlevel) * 0.05f)); //these formula may not be correct; however, it is designed to be close to what it should be //this makes dps 0.5 of pets level SetBaseWeaponDamage(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage, petlevel - (petlevel / 4)); @@ -865,8 +862,8 @@ namespace Game.Entities else val = 2 * GetStat(Stats.Strength) - 20.0f; - Unit owner = GetOwner(); - if (owner != null && owner.IsTypeId(TypeId.Player)) + Player owner = GetOwner() ? GetOwner().ToPlayer() : null; + if (owner != null) { if (IsHunterPet()) //hunter pets benefit from owner's attack power { @@ -888,8 +885,8 @@ namespace Game.Entities //demons benefit from warlocks shadow or fire damage else if (IsPet()) { - int fire = owner.GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Fire) - owner.GetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire); - int shadow = owner.GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Shadow) - owner.GetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)SpellSchools.Shadow); + int fire = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Fire]; + int shadow = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Shadow] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Shadow]; int maximum = (fire > shadow) ? fire : shadow; if (maximum < 0) maximum = 0; @@ -899,7 +896,7 @@ namespace Game.Entities //water elementals benefit from mage's frost damage else if (GetEntry() == ENTRY_WATER_ELEMENTAL) { - int frost = owner.GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Frost) - owner.GetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)SpellSchools.Frost); + int frost = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Frost] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Frost]; if (frost < 0) frost = 0; SetBonusDamage((int)(frost * 0.4f)); @@ -912,10 +909,8 @@ namespace Game.Entities float base_attPower = GetModifierValue(unitMod, UnitModifierType.BaseValue) * GetModifierValue(unitMod, UnitModifierType.BasePCT); float attPowerMultiplier = GetModifierValue(unitMod, UnitModifierType.TotalPCT) - 1.0f; - //UNIT_FIELD_(RANGED)_ATTACK_POWER field - SetInt32Value(UnitFields.AttackPower, (int)base_attPower); - //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field - SetFloatValue(UnitFields.AttackPowerMultiplier, attPowerMultiplier); + SetAttackPower((int)base_attPower); + SetAttackPowerMultiplier(attPowerMultiplier); //automatically update weapon damage after attack power modification UpdateDamagePhysical(WeaponAttackType.BaseAttack); @@ -927,19 +922,20 @@ namespace Game.Entities return; float bonusDamage = 0.0f; - if (GetOwner().IsTypeId(TypeId.Player)) + Player playerOwner = m_owner.ToPlayer(); + if (playerOwner != null) { //force of nature if (GetEntry() == ENTRY_TREANT) { - int spellDmg = GetOwner().GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Nature) - GetOwner().GetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)SpellSchools.Nature); + int spellDmg = playerOwner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Nature] - playerOwner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Nature]; if (spellDmg > 0) bonusDamage = spellDmg * 0.09f; } //greater fire elemental else if (GetEntry() == ENTRY_FIRE_ELEMENTAL) { - int spellDmg = GetOwner().GetInt32Value(ActivePlayerFields.ModDamageDonePos + (int)SpellSchools.Fire) - GetOwner().GetInt32Value(ActivePlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire); + int spellDmg = playerOwner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire] - playerOwner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Fire]; if (spellDmg > 0) bonusDamage = spellDmg * 0.4f; } @@ -960,15 +956,16 @@ namespace Game.Entities float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct; float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct; - SetStatFloatValue(UnitFields.MinDamage, mindamage); - SetStatFloatValue(UnitFields.MaxDamage, maxdamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinDamage), mindamage); + SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxDamage), maxdamage); } void SetBonusDamage(int damage) { m_bonusSpellDamage = damage; - if (GetOwner().IsTypeId(TypeId.Player)) - GetOwner().SetUInt32Value(ActivePlayerFields.PetSpellPower, (uint)damage); + Player playerOwner = GetOwner().ToPlayer(); + if (playerOwner != null) + playerOwner.SetPetSpellPower((uint)damage); } public int GetBonusDamage() { return m_bonusSpellDamage; } diff --git a/Source/Game/Entities/Totem.cs b/Source/Game/Entities/Totem.cs index 61234e90f..1b5f59758 100644 --- a/Source/Game/Entities/Totem.cs +++ b/Source/Game/Entities/Totem.cs @@ -63,15 +63,13 @@ namespace Game.Entities packet.Totem = GetGUID(); packet.Slot = (byte)(m_Properties.Slot - (int)SummonSlot.Totem); packet.Duration = duration; - packet.SpellID = GetUInt32Value(UnitFields.CreatedBySpell); + packet.SpellID = m_unitData.CreatedBySpell; owner.ToPlayer().SendPacket(packet); } // set display id depending on caster's race - uint totemDisplayId = Global.SpellMgr.GetModelForTotem(GetUInt32Value(UnitFields.CreatedBySpell), owner.GetRace()); - if (totemDisplayId == 0) - Log.outError(LogFilter.Spells, $"Spell {GetUInt32Value(UnitFields.CreatedBySpell)} with RaceID ({owner.GetRace()}) have no totem model data defined, set to default model."); - else + uint totemDisplayId = Global.SpellMgr.GetModelForTotem(m_unitData.CreatedBySpell, owner.GetRace()); + if (totemDisplayId != 0) SetDisplayId(totemDisplayId); } @@ -127,7 +125,7 @@ namespace Game.Entities { owner.SendAutoRepeatCancel(this); - SpellInfo spell = Global.SpellMgr.GetSpellInfo(GetUInt32Value(UnitFields.CreatedBySpell)); + SpellInfo spell = Global.SpellMgr.GetSpellInfo(m_unitData.CreatedBySpell); if (spell != null) GetSpellHistory().SendCooldownEvent(spell, 0, null, false); diff --git a/Source/Game/Entities/Transport.cs b/Source/Game/Entities/Transport.cs index 031aab4d6..c6f5106ff 100644 --- a/Source/Game/Entities/Transport.cs +++ b/Source/Game/Entities/Transport.cs @@ -118,11 +118,11 @@ namespace Game.Entities if (m_goTemplateAddon != null) { SetFaction(m_goTemplateAddon.faction); - SetUInt32Value(GameObjectFields.Flags, m_goTemplateAddon.flags); + SetFlags((GameObjectFlags)m_goTemplateAddon.flags); } m_goValue.Transport.PathProgress = 0; - SetFloatValue(ObjectFields.ScaleX, goinfo.size); + SetObjectScale(goinfo.size); SetPeriod(tInfo.pathTime); SetEntry(goinfo.entry); SetDisplayId(goinfo.displayId); @@ -473,7 +473,7 @@ namespace Game.Entities PhasingHandler.InheritPhaseShift(summon, summoner ? (WorldObject)summoner : this); - summon.SetUInt32Value(UnitFields.CreatedBySpell, spellId); + summon.SetCreatedBySpell(spellId); summon.SetTransport(this); summon.m_movementInfo.transport.guid = GetGUID(); @@ -778,8 +778,8 @@ namespace Game.Entities public HashSet GetPassengers() { return _passengers; } - public override uint GetTransportPeriod() { return GetUInt32Value(GameObjectFields.Level); } - public void SetPeriod(uint period) { SetUInt32Value(GameObjectFields.Level, period); } + public override uint GetTransportPeriod() { return m_gameObjectData.Level; } + public void SetPeriod(uint period) { SetLevel(period); } uint GetTimer() { return m_goValue.Transport.PathProgress; } public List GetKeyFrames() { return _transportInfo.keyFrames; } diff --git a/Source/Game/Entities/Unit/CharmInfo.cs b/Source/Game/Entities/Unit/CharmInfo.cs index 3c33f4829..bb8c4f1aa 100644 --- a/Source/Game/Entities/Unit/CharmInfo.cs +++ b/Source/Game/Entities/Unit/CharmInfo.cs @@ -236,9 +236,9 @@ namespace Game.Entities { _petnumber = petnumber; if (statwindow) - _unit.SetUInt32Value(UnitFields.PetNumber, _petnumber); + _unit.SetPetNumberForClient(_petnumber); else - _unit.SetUInt32Value(UnitFields.PetNumber, 0); + _unit.SetPetNumberForClient(0); } public void LoadPetActionBar(string data) diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index c84421369..47670be27 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -246,15 +246,15 @@ namespace Game.Entities public void ClearInCombat() { m_CombatTimer = 0; - RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); + RemoveUnitFlag(UnitFlags.InCombat); // Player's state will be cleared in Player.UpdateContestedPvP Creature creature = ToCreature(); if (creature != null) { ClearUnitState(UnitState.AttackPlayer); - if (HasFlag(ObjectFields.DynamicFlags, UnitDynFlags.Tapped)) - SetUInt32Value(ObjectFields.DynamicFlags, creature.GetCreatureTemplate().DynamicFlags); + if (HasDynamicFlag(UnitDynFlags.Tapped)) + SetDynamicFlags((UnitDynFlags)creature.GetCreatureTemplate().DynamicFlags); if (creature.IsPet() || creature.IsGuardian()) { @@ -270,7 +270,7 @@ namespace Game.Entities else ToPlayer().OnCombatExit(); - RemoveFlag(UnitFields.Flags, UnitFlags.PetInCombat); + RemoveUnitFlag(UnitFlags.PetInCombat); RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.LeaveCombat); } @@ -314,7 +314,7 @@ namespace Game.Entities if (!IsAlive()) return false; - if (HasFlag(UnitFields.Flags, (UnitFlags.NonAttackable | UnitFlags.NotSelectable))) + if (HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable)) return false; if (IsTypeId(TypeId.Player) && ToPlayer().IsGameMaster()) @@ -329,7 +329,7 @@ namespace Game.Entities } public bool IsInCombat() { - return HasFlag(UnitFields.Flags, UnitFlags.InCombat); + return HasUnitFlag(UnitFlags.InCombat); } public bool Attack(Unit victim, bool meleeAttack) { @@ -344,7 +344,7 @@ namespace Game.Entities if (IsTypeId(TypeId.Player) && IsMounted()) return false; - if (HasFlag(UnitFields.Flags, UnitFlags.Pacified)) + if (HasUnitFlag(UnitFlags.Pacified)) return false; // nobody can attack GM in GM-mode @@ -417,7 +417,7 @@ namespace Game.Entities ToCreature().CallAssistance(); // Remove emote state - will be restored on creature reset - SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); + SetEmoteState(Emote.OneshotNone); } // delay offhand weapon attack to next attack time @@ -455,7 +455,7 @@ namespace Game.Entities else Log.outInfo(LogFilter.Unit, "{0} {1} stopped attacking", (IsTypeId(TypeId.Player) ? "Player" : "Creature"), GetGUID().ToString()); } - public ObjectGuid GetTarget() { return GetGuidValue(UnitFields.Target); } + public ObjectGuid GetTarget() { return m_unitData.Target; } public virtual void SetTarget(ObjectGuid guid) { } public bool AttackStop() { @@ -517,8 +517,10 @@ namespace Game.Entities return attackerList; } - public float GetCombatReach() { return GetFloatValue(UnitFields.CombatReach); } - float GetBoundaryRadius() { return GetFloatValue(UnitFields.BoundingRadius); } + public float GetCombatReach() { return m_unitData.CombatReach; } + public void SetCombatReach(float combatReach) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CombatReach), combatReach); } + public float GetBoundingRadius() { return m_unitData.BoundingRadius; } + public void SetBoundingRadius(float boundingRadius) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BoundingRadius), boundingRadius); } public bool haveOffhandWeapon() { @@ -549,7 +551,7 @@ namespace Game.Entities } public void AttackerStateUpdate(Unit victim, WeaponAttackType attType = WeaponAttackType.BaseAttack, bool extra = false) { - if (HasUnitState(UnitState.CannotAutoattack) || HasFlag(UnitFields.Flags, UnitFlags.Pacified)) + if (HasUnitState(UnitState.CannotAutoattack) || HasUnitFlag(UnitFlags.Pacified)) return; if (!victim.IsAlive()) @@ -565,7 +567,7 @@ namespace Game.Entities if (attType != WeaponAttackType.BaseAttack && attType != WeaponAttackType.OffAttack) return; - if (IsTypeId(TypeId.Unit) && !HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled)) + if (IsTypeId(TypeId.Unit) && !HasUnitFlag(UnitFlags.PlayerControlled)) SetFacingToObject(victim); // update client side facing to face the target (prevents visual glitches when casting untargeted spells) // melee attack spell casted at main hand attack only - no normal melee dmg dealt @@ -598,7 +600,7 @@ namespace Game.Entities public void FakeAttackerStateUpdate(Unit victim, WeaponAttackType attType = WeaponAttackType.BaseAttack) { - if (HasUnitState(UnitState.CannotAutoattack) || HasFlag(UnitFields.Flags, UnitFlags.Pacified)) + if (HasUnitState(UnitState.CannotAutoattack) || HasUnitFlag(UnitFlags.Pacified)) return; if (!victim.IsAlive()) @@ -613,7 +615,7 @@ namespace Game.Entities if (attType != WeaponAttackType.BaseAttack && attType != WeaponAttackType.OffAttack) return; // ignore ranged case - if (IsTypeId(TypeId.Unit) && !HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled)) + if (IsTypeId(TypeId.Unit) && !HasUnitFlag(UnitFlags.PlayerControlled)) SetFacingToObject(victim); // update client side facing to face the target (prevents visual glitches when casting untargeted spells) CalcDamageInfo damageInfo = new CalcDamageInfo(); @@ -1290,7 +1292,7 @@ namespace Game.Entities if (IsInCombat() || HasUnitState(UnitState.Evade)) return; - SetFlag(UnitFields.Flags, UnitFlags.InCombat); + AddUnitFlag(UnitFlags.InCombat); Creature creature = ToCreature(); if (creature != null) @@ -1323,7 +1325,7 @@ namespace Game.Entities foreach (var unit in m_Controlled) { unit.SetInCombatState(PvP, enemy); - unit.SetFlag(UnitFields.Flags, UnitFlags.PetInCombat); + unit.AddUnitFlag(UnitFlags.PetInCombat); } ProcSkillsAndAuras(enemy, ProcFlags.EnterCombat, ProcFlags.None, ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null); @@ -1504,7 +1506,7 @@ namespace Game.Entities // must be after setDeathState which resets dynamic flags if (!creature.loot.isLooted()) - creature.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); + creature.AddDynamicFlag(UnitDynFlags.Lootable); else creature.AllLootRemovedFromCorpse(); } @@ -1625,7 +1627,7 @@ namespace Game.Entities if (!player.HasUnitState(UnitState.AttackPlayer)) { player.AddUnitState(UnitState.AttackPlayer); - player.SetFlag(PlayerFields.Flags, PlayerFlags.ContestedPVP); + player.AddPlayerFlag(PlayerFlags.ContestedPVP); // call MoveInLineOfSight for nearby contested guards UpdateObjectVisibility(); } @@ -1766,6 +1768,21 @@ namespace Game.Entities ToPlayer().ClearComboPoints(); } + public virtual bool CanUseAttackType(WeaponAttackType attacktype) + { + switch (attacktype) + { + case WeaponAttackType.BaseAttack: + return !HasUnitFlag(UnitFlags.Disarmed); + case WeaponAttackType.OffAttack: + return !HasUnitFlag2(UnitFlags2.DisarmOffhand); + case WeaponAttackType.RangedAttack: + return !HasUnitFlag2(UnitFlags2.DisarmRanged); + default: + return true; + } + } + // TODO for melee need create structure as in void CalculateMeleeDamage(Unit victim, uint damage, out CalcDamageInfo damageInfo, WeaponAttackType attackType) { @@ -2082,21 +2099,21 @@ namespace Game.Entities switch (attType) { case WeaponAttackType.RangedAttack: - minDamage = GetFloatValue(UnitFields.MinRangedDamage); - maxDamage = GetFloatValue(UnitFields.MaxRangedDamage); + minDamage = m_unitData.MinRangedDamage; + maxDamage = m_unitData.MaxRangedDamage; break; case WeaponAttackType.BaseAttack: - minDamage = GetFloatValue(UnitFields.MinDamage); - maxDamage = GetFloatValue(UnitFields.MaxDamage); + minDamage = m_unitData.MinDamage; + maxDamage = m_unitData.MaxDamage; if (IsInFeralForm()) { - minDamage += GetFloatValue(UnitFields.MinOffHandDamage); - maxDamage += GetFloatValue(UnitFields.MaxOffHandDamage); + minDamage += m_unitData.MinOffHandDamage; + maxDamage += m_unitData.MaxOffHandDamage; } break; case WeaponAttackType.OffAttack: - minDamage = GetFloatValue(UnitFields.MinOffHandDamage); - maxDamage = GetFloatValue(UnitFields.MaxOffHandDamage); + minDamage = m_unitData.MinOffHandDamage; + maxDamage = m_unitData.MaxOffHandDamage; break; // Just for good manner default: @@ -2169,17 +2186,17 @@ namespace Game.Entities { if (attType == WeaponAttackType.RangedAttack) { - int ap = GetInt32Value(UnitFields.RangedAttackPower); + int ap = m_unitData.RangedAttackPower; if (ap < 0) return 0.0f; - return ap * (1.0f + GetFloatValue(UnitFields.RangedAttackPowerMultiplier)); + return ap * (1.0f + m_unitData.RangedAttackPowerMultiplier); } else { - int ap = GetInt32Value(UnitFields.AttackPower); + int ap = m_unitData.AttackPower; if (ap < 0) return 0.0f; - return ap * (1.0f + GetFloatValue(UnitFields.AttackPowerMultiplier)); + return ap * (1.0f + m_unitData.AttackPowerMultiplier); } } public float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) @@ -2223,14 +2240,25 @@ namespace Game.Entities } void UpdateAttackTimeField(WeaponAttackType att) { - SetUInt32Value(UnitFields.BaseAttackTime + (int)att, (uint)(m_baseAttackSpeed[(int)att] * m_modAttackSpeedPct[(int)att])); + switch (att) + { + case WeaponAttackType.BaseAttack: + case WeaponAttackType.OffAttack: + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AttackRoundBaseTime, (int)att), (uint)(m_baseAttackSpeed[(int)att] * m_modAttackSpeedPct[(int)att])); + break; + case WeaponAttackType.RangedAttack: + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.RangedAttackRoundBaseTime), (uint)(m_baseAttackSpeed[(int)att] * m_modAttackSpeedPct[(int)att])); + break; + default: + break; ; + } } public virtual void SetPvP(bool state) { if (state) - SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.PvP); + AddPvpFlag(UnitPVPStateFlags.PvP); else - RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.PvP); + RemovePvpFlag(UnitPVPStateFlags.PvP); } public bool CanHaveThreatList(bool skipAliveCheck = false) @@ -2697,11 +2725,17 @@ namespace Game.Entities if (!spellProto.GetSchoolMask().HasAnyFlag(SpellSchoolMask.Normal)) { float maxModDamagePercentSchool = 0.0f; - for (var i = SpellSchools.Holy; i < SpellSchools.Max; ++i) + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) { - if (Convert.ToBoolean((int)spellProto.GetSchoolMask() & (1 << (int)i))) - maxModDamagePercentSchool = Math.Max(maxModDamagePercentSchool, GetFloatValue(ActivePlayerFields.ModDamageDonePct + (int)i)); + for (var i = SpellSchools.Holy; i < SpellSchools.Max; ++i) + { + if (Convert.ToBoolean((int)spellProto.GetSchoolMask() & (1 << (int)i))) + maxModDamagePercentSchool = Math.Max(maxModDamagePercentSchool, thisPlayer.m_activePlayerData.ModDamageDonePercent[(int)i]); + } } + else + maxModDamagePercentSchool = GetTotalAuraMultiplierByMiscMask(AuraType.ModDamagePercentDone, (uint)spellProto.GetSchoolMask()); DoneTotalMod *= maxModDamagePercentSchool; } @@ -2878,18 +2912,18 @@ namespace Game.Entities MathFunctions.ApplyPercentModFloatVar(ref m_modAttackSpeedPct[(int)att], val, !apply); if (att == WeaponAttackType.BaseAttack) - ApplyPercentModFloatValue(UnitFields.ModHaste, val, !apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModHaste), val, !apply); else if (att == WeaponAttackType.RangedAttack) - ApplyPercentModFloatValue(UnitFields.ModRangedHaste, val, !apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModRangedHaste), val, !apply); } else { MathFunctions.ApplyPercentModFloatVar(ref m_modAttackSpeedPct[(int)att], -val, apply); if (att == WeaponAttackType.BaseAttack) - ApplyPercentModFloatValue(UnitFields.ModHaste, -val, apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModHaste), -val, apply); else if (att == WeaponAttackType.RangedAttack) - ApplyPercentModFloatValue(UnitFields.ModRangedHaste, -val, apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModRangedHaste), -val, apply); } UpdateAttackTimeField(att); @@ -2937,30 +2971,30 @@ namespace Game.Entities // can't attack untargetable if ((bySpell == null || !bySpell.HasAttribute(SpellAttr6.CanTargetUntargetable)) - && target.HasFlag(UnitFields.Flags, UnitFlags.NotSelectable)) + && target.HasUnitFlag(UnitFlags.NotSelectable)) return false; Player playerAttacker = ToPlayer(); if (playerAttacker != null) { - if (playerAttacker.HasFlag(PlayerFields.Flags, PlayerFlags.Commentator2)) + if (playerAttacker.HasPlayerFlag(PlayerFlags.Commentator2)) return false; } // check flags - if (target.HasFlag(UnitFields.Flags, (UnitFlags.NonAttackable | UnitFlags.TaxiFlight | UnitFlags.NotAttackable1 | UnitFlags.Unk16)) - || (!HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) && target.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc)) - || (!target.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) && HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc))) + if (target.HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.TaxiFlight | UnitFlags.NotAttackable1 | UnitFlags.Unk16) + || (!HasUnitFlag(UnitFlags.PvpAttackable) && target.HasUnitFlag(UnitFlags.ImmuneToNpc)) + || (!target.HasUnitFlag(UnitFlags.PvpAttackable) && HasUnitFlag(UnitFlags.ImmuneToNpc))) return false; if ((bySpell == null || !bySpell.HasAttribute(SpellAttr8.AttackIgnoreImmuneToPCFlag)) - && (HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) && target.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc)) + && (HasUnitFlag(UnitFlags.PvpAttackable) && target.HasUnitFlag(UnitFlags.ImmuneToPc)) // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly && GetEntry() != SharedConst.WorldTrigger) return false; // CvC case - can attack each other only when one of them is hostile - if (!HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) && !target.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) + if (!HasUnitFlag(UnitFlags.PvpAttackable) && !target.HasUnitFlag(UnitFlags.PvpAttackable)) return GetReactionTo(target) <= ReputationRank.Hostile || target.GetReactionTo(this) <= ReputationRank.Hostile; // PvP, PvC, CvP case @@ -2968,8 +3002,8 @@ namespace Game.Entities if (GetReactionTo(target) > ReputationRank.Neutral || target.GetReactionTo(this) > ReputationRank.Neutral) return false; - Player playerAffectingAttacker = HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) ? GetAffectingPlayer() : null; - Player playerAffectingTarget = target.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) ? target.GetAffectingPlayer() : null; + Player playerAffectingAttacker = HasUnitFlag(UnitFlags.PvpAttackable) ? GetAffectingPlayer() : null; + Player playerAffectingTarget = target.HasUnitFlag(UnitFlags.PvpAttackable) ? target.GetAffectingPlayer() : null; // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar) if ((playerAffectingAttacker && !playerAffectingTarget) || (!playerAffectingAttacker && playerAffectingTarget)) @@ -3010,9 +3044,8 @@ namespace Game.Entities // PvP case - can't attack when attacker or target are in sanctuary // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp - if (target.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) && HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) - && (Convert.ToBoolean(target.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.Sanctuary) - || Convert.ToBoolean(GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.Sanctuary))) + if (target.HasUnitFlag(UnitFlags.PvpAttackable) && HasUnitFlag(UnitFlags.PvpAttackable) + && (target.HasPvpFlag(UnitPVPStateFlags.Sanctuary) || HasPvpFlag(UnitPVPStateFlags.Sanctuary))) return false; // additional checks - only PvP case @@ -3024,7 +3057,7 @@ namespace Game.Entities if (IsFFAPvP() && target.IsFFAPvP()) return true; - return HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.Unk1) || target.HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.Unk1); + return HasPvpFlag(UnitPVPStateFlags.Unk1) || target.HasPvpFlag(UnitPVPStateFlags.Unk1); } return true; } @@ -3062,19 +3095,19 @@ namespace Game.Entities // can't assist untargetable if ((bySpell == null || !bySpell.HasAttribute(SpellAttr6.CanTargetUntargetable)) - && target.HasFlag(UnitFields.Flags, UnitFlags.NotSelectable)) + && target.HasUnitFlag(UnitFlags.NotSelectable)) return false; if (bySpell == null || !bySpell.HasAttribute(SpellAttr6.AssistIgnoreImmuneFlag)) { - if (HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) + if (HasUnitFlag(UnitFlags.PvpAttackable)) { - if (target.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc)) + if (target.HasUnitFlag(UnitFlags.ImmuneToPc)) return false; } else { - if (target.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc)) + if (target.HasUnitFlag(UnitFlags.ImmuneToNpc)) return false; } } @@ -3090,10 +3123,10 @@ namespace Game.Entities return true; // PvP case - else if (target.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) + else if (target.HasUnitFlag(UnitFlags.PvpAttackable)) { Player targetPlayerOwner = target.GetAffectingPlayer(); - if (HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) + if (HasUnitFlag(UnitFlags.PvpAttackable)) { Player selfPlayerOwner = GetAffectingPlayer(); if (selfPlayerOwner != null && targetPlayerOwner != null) @@ -3103,20 +3136,18 @@ namespace Game.Entities return false; } // can't assist player in ffa_pvp zone from outside - if (Convert.ToBoolean(target.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.FFAPvp) - && !Convert.ToBoolean(GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.FFAPvp)) + if (target.HasPvpFlag(UnitPVPStateFlags.FFAPvp) && !HasPvpFlag(UnitPVPStateFlags.FFAPvp)) return false; // can't assist player out of sanctuary from sanctuary if has pvp enabled - if (Convert.ToBoolean(target.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.PvP)) - if (Convert.ToBoolean(GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.Sanctuary) - && !Convert.ToBoolean(target.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.Sanctuary)) + if (target.HasPvpFlag(UnitPVPStateFlags.PvP)) + if (HasPvpFlag(UnitPVPStateFlags.Sanctuary) && !target.HasPvpFlag(UnitPVPStateFlags.Sanctuary)) return false; } } // PvC case - player can assist creature only if has specific type flags - else if (HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable) + else if (HasUnitFlag(UnitFlags.PvpAttackable) && (bySpell == null || !bySpell.HasAttribute(SpellAttr6.AssistIgnoreImmuneFlag)) - && !Convert.ToBoolean(target.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag) & (byte)UnitBytes2Flags.PvP)) + && !target.HasPvpFlag(UnitPVPStateFlags.PvP)) { Creature creatureTarget = target.ToCreature(); if (creatureTarget != null) diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 74a69ab9c..33b179897 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -107,11 +107,15 @@ namespace Game.Entities uint m_removedAurasCount; //General + public UnitData m_unitData; + DiminishingReturn[] m_Diminishing = new DiminishingReturn[(int)DiminishingGroup.Max]; protected List m_gameObj = new List(); List m_areaTrigger = new List(); protected List m_dynObj = new List(); protected float[] CreateStats = new float[(int)Stats.Max]; + float[] m_floatStatPosBuff = new float[(int)Stats.Max]; + float[] m_floatStatNegBuff = new float[(int)Stats.Max]; public ObjectGuid[] m_SummonSlot = new ObjectGuid[7]; public ObjectGuid[] m_ObjectSlot = new ObjectGuid[4]; public EventSystem m_Events = new EventSystem(); diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index da550b30d..7d96190e4 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -54,13 +54,13 @@ namespace Game.Entities public virtual bool CanSwim() { // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water - if (HasFlag(UnitFields.Flags, UnitFlags.CannotSwim)) + if (HasUnitFlag(UnitFlags.CannotSwim)) return false; - if (HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) // is player + if (HasUnitFlag(UnitFlags.PvpAttackable)) // is player return true; - if (HasFlag(UnitFields.Flags2, 0x1000000)) + if (HasUnitFlag2((UnitFlags2)0x1000000)) return false; - return HasFlag(UnitFields.Flags, UnitFlags.PetInCombat | UnitFlags.Rename | UnitFlags.Unk15); + return HasUnitFlag(UnitFlags.PetInCombat | UnitFlags.Rename | UnitFlags.Unk15); } public virtual bool IsInWater() { @@ -593,7 +593,7 @@ namespace Game.Entities if (!obj || !IsInMap(obj) || !IsInPhase(obj)) return false; - float objBoundaryRadius = Math.Max(obj.GetBoundaryRadius(), SharedConst.MinMeleeReach); + float objBoundaryRadius = Math.Max(obj.GetBoundingRadius(), SharedConst.MinMeleeReach); return IsInDist(obj, objBoundaryRadius); } @@ -737,6 +737,15 @@ namespace Game.Entities if (mountCapability.ReqSpellKnownID != 0 && !HasSpell(mountCapability.ReqSpellKnownID)) continue; + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) + { + PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(mountCapability.PlayerConditionID); + if (playerCondition != null) + if (!ConditionManager.IsPlayerMeetingCondition(thisPlayer, playerCondition)) + continue; + } + return mountCapability; } @@ -944,7 +953,7 @@ namespace Game.Entities if (enable == HasUnitMovementFlag(MovementFlag.Hover)) return false; - float hoverHeight = GetFloatValue(UnitFields.HoverHeight); + float hoverHeight = m_unitData.HoverHeight; if (enable) { @@ -1133,7 +1142,7 @@ namespace Game.Entities if (apply) { SetTarget(ObjectGuid.Empty); - SetFlag(UnitFields.Flags, UnitFlags.Stunned); + AddUnitFlag(UnitFlags.Stunned); StopMoving(); @@ -1152,7 +1161,7 @@ namespace Game.Entities // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface) Unit owner = GetCharmerOrOwner(); if (owner == null || !owner.IsTypeId(TypeId.Player) || !owner.ToPlayer().IsMounted()) - RemoveFlag(UnitFields.Flags, UnitFlags.Stunned); + RemoveUnitFlag(UnitFlags.Stunned); if (!HasUnitState(UnitState.Root)) // prevent moving if it also has root effect SetRooted(false); @@ -1260,9 +1269,9 @@ namespace Game.Entities public void Mount(uint mount, uint VehicleId = 0, uint creatureEntry = 0) { if (mount != 0) - SetUInt32Value(UnitFields.MountDisplayId, mount); + SetMountDisplayId(mount); - SetFlag(UnitFields.Flags, UnitFlags.Mount); + AddUnitFlag(UnitFlags.Mount); Player player = ToPlayer(); if (player != null) @@ -1286,7 +1295,7 @@ namespace Game.Entities Battleground bg = ToPlayer().GetBattleground(); // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface if (bg && bg.isArena()) - pet.SetFlag(UnitFields.Flags, UnitFlags.Stunned); + pet.AddUnitFlag(UnitFlags.Stunned); else player.UnsummonPetTemporaryIfAny(); } @@ -1295,7 +1304,7 @@ namespace Game.Entities Unit charm = player.GetCharm(); if (charm) if (charm.GetTypeId() == TypeId.Unit) - charm.SetFlag(UnitFields.Flags, UnitFlags.Stunned); + charm.AddUnitFlag(UnitFlags.Stunned); player.SendMovementSetCollisionHeight(player.GetCollisionHeight(true)); } @@ -1308,8 +1317,8 @@ namespace Game.Entities if (!IsMounted()) return; - SetUInt32Value(UnitFields.MountDisplayId, 0); - RemoveFlag(UnitFields.Flags, UnitFlags.Mount); + SetMountDisplayId(0); + RemoveUnitFlag(UnitFlags.Mount); Player thisPlayer = ToPlayer(); if (thisPlayer != null) @@ -1337,8 +1346,8 @@ namespace Game.Entities Pet pPet = player.GetPet(); if (pPet != null) { - if (pPet.HasFlag(UnitFields.Flags, UnitFlags.Stunned) && !pPet.HasUnitState(UnitState.Stunned)) - pPet.RemoveFlag(UnitFields.Flags, UnitFlags.Stunned); + if (pPet.HasUnitFlag(UnitFlags.Stunned) && !pPet.HasUnitState(UnitState.Stunned)) + pPet.RemoveUnitFlag(UnitFlags.Stunned); } else player.ResummonPetTemporaryUnSummonedIfAny(); @@ -1346,8 +1355,8 @@ namespace Game.Entities // if we have charmed npc, remove stun also Unit charm = player.GetCharm(); if (charm) - if (charm.GetTypeId() == TypeId.Unit && charm.HasFlag(UnitFields.Flags, UnitFlags.Stunned) && !charm.HasUnitState(UnitState.Stunned)) - charm.RemoveFlag(UnitFields.Flags, UnitFlags.Stunned); + if (charm.GetTypeId() == TypeId.Unit && charm.HasUnitFlag(UnitFlags.Stunned) && !charm.HasUnitState(UnitState.Stunned)) + charm.RemoveUnitFlag(UnitFlags.Stunned); } } @@ -1381,7 +1390,7 @@ namespace Game.Entities m_updateFlag.Vehicle = false; m_unitTypeMask &= ~UnitTypeMask.Vehicle; - RemoveFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick | NPCFlags.PlayerVehicle); + RemoveNpcFlag(NPCFlags.SpellClick | NPCFlags.PlayerVehicle); } void SendSetVehicleRecId(uint vehicleId) @@ -1415,7 +1424,7 @@ namespace Game.Entities { float offset = 0.0f; if (HasUnitMovementFlag(MovementFlag.Hover)) - offset = GetFloatValue(UnitFields.HoverHeight); + offset = m_unitData.HoverHeight; return GetPositionZ() - offset; } diff --git a/Source/Game/Entities/Unit/Unit.Pets.cs b/Source/Game/Entities/Unit/Unit.Pets.cs index 67b53a519..0cbc46ff5 100644 --- a/Source/Game/Entities/Unit/Unit.Pets.cs +++ b/Source/Game/Entities/Unit/Unit.Pets.cs @@ -168,7 +168,7 @@ namespace Game.Entities if (IsTypeId(TypeId.Player)) { minion.m_ControlledByPlayer = true; - minion.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + minion.AddUnitFlag(UnitFlags.PvpAttackable); } // Can only have one pet. If a new one is summoned, dismiss the old one. @@ -196,17 +196,19 @@ namespace Game.Entities } if (minion.HasUnitTypeMask(UnitTypeMask.Guardian)) - AddGuidValue(UnitFields.Summon, minion.GetGUID()); + if (GetMinionGUID().IsEmpty()) + SetMinionGUID(minion.GetGUID()); if (minion.m_Properties != null && minion.m_Properties.Title == SummonType.Minipet) { SetCritterGUID(minion.GetGUID()); - if (GetTypeId() == TypeId.Player) - minion.SetGuidValue(UnitFields.BattlePetCompanionGuid, GetGuidValue(ActivePlayerFields.SummonedBattlePetId)); + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) + minion.SetBattlePetCompanionGUID(thisPlayer.m_activePlayerData.SummonedBattlePetGUID); } // PvP, FFAPvP - minion.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag)); + minion.SetPvpFlags(GetPvpFlags()); // FIXME: hack, speed must be set only at follow if (IsTypeId(TypeId.Player) && minion.IsPet()) @@ -214,7 +216,7 @@ namespace Game.Entities minion.SetSpeedRate(i, m_speed_rate[(int)i]); // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(minion.GetUInt32Value(UnitFields.CreatedBySpell)); + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(minion.m_unitData.CreatedBySpell); if (spellInfo != null && spellInfo.IsCooldownStartedOnEvent()) GetSpellHistory().StartCooldown(spellInfo, 0, null, true); } @@ -255,13 +257,14 @@ namespace Game.Entities } } - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(minion.GetUInt32Value(UnitFields.CreatedBySpell)); + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(minion.m_unitData.CreatedBySpell); // Remove infinity cooldown if (spellInfo != null && spellInfo.IsCooldownStartedOnEvent()) GetSpellHistory().SendCooldownEvent(spellInfo); - if (RemoveGuidValue(UnitFields.Summon, minion.GetGUID())) + if (GetMinionGUID() == minion.GetGUID()) { + SetMinionGUID(ObjectGuid.Empty); // Check if there is another minion foreach (var unit in m_Controlled) { @@ -279,16 +282,14 @@ namespace Game.Entities if (!unit.HasUnitTypeMask(UnitTypeMask.Guardian)) continue; - if (AddGuidValue(UnitFields.Summon, unit.GetGUID())) + SetMinionGUID(unit.GetGUID()); + // show another pet bar if there is no charm bar + if (GetTypeId() == TypeId.Player && GetCharmGUID().IsEmpty()) { - // show another pet bar if there is no charm bar - if (IsTypeId(TypeId.Player) && GetCharmGUID().IsEmpty()) - { - if (unit.IsPet()) - ToPlayer().PetSpellInitialize(); - else - ToPlayer().CharmSpellInitialize(); - } + if (unit.IsPet()) + ToPlayer().PetSpellInitialize(); + else + ToPlayer().CharmSpellInitialize(); } break; } @@ -364,8 +365,8 @@ namespace Game.Entities if (aurApp != null && aurApp.GetRemoveMode() != 0) return false; - _oldFactionId = getFaction(); - SetFaction(charmer.getFaction()); + _oldFactionId = GetFaction(); + SetFaction(charmer.GetFaction()); // Set charmed charmer.SetCharm(this, true); @@ -418,14 +419,14 @@ namespace Game.Entities switch (type) { case CharmType.Vehicle: - SetFlag(UnitFields.Flags, UnitFlags.PlayerControlled); + AddUnitFlag(UnitFlags.PlayerControlled); playerCharmer.SetClientControl(this, true); playerCharmer.VehicleSpellInitialize(); break; case CharmType.Possess: AddUnitState(UnitState.Possessed); - SetFlag(UnitFields.Flags, UnitFlags.PlayerControlled); - charmer.SetFlag(UnitFields.Flags, UnitFlags.RemoveClientControl); + AddUnitFlag(UnitFlags.PlayerControlled); + charmer.AddUnitFlag(UnitFlags.RemoveClientControl); playerCharmer.SetClientControl(this, true); playerCharmer.PossessSpellInitialize(); break; @@ -436,14 +437,14 @@ namespace Game.Entities if (cinfo != null && cinfo.CreatureType == CreatureType.Demon) { // to prevent client crash - SetByteValue(UnitFields.Bytes0, 1, (byte)Class.Mage); + SetClass(Class.Mage); // just to enable stat window if (GetCharmInfo() != null) GetCharmInfo().SetPetNumber(Global.ObjectMgr.GeneratePetNumber(), true); // if charmed two demons the same session, the 2nd gets the 1st one's name - SetUInt32Value(UnitFields.PetNameTimestamp, (uint)Time.UnixTime); // cast can't be helped + SetPetNameTimestamp((uint)Time.UnixTime); // cast can't be helped } } playerCharmer.CharmSpellInitialize(); @@ -518,13 +519,13 @@ namespace Game.Entities case CharmType.Vehicle: playerCharmer.SetClientControl(this, false); playerCharmer.SetClientControl(charmer, true); - RemoveFlag(UnitFields.Flags, UnitFlags.PlayerControlled); + RemoveUnitFlag(UnitFlags.PlayerControlled); break; case CharmType.Possess: playerCharmer.SetClientControl(this, false); playerCharmer.SetClientControl(charmer, true); - charmer.RemoveFlag(UnitFields.Flags, UnitFlags.RemoveClientControl); - RemoveFlag(UnitFields.Flags, UnitFlags.PlayerControlled); + charmer.RemoveUnitFlag(UnitFlags.RemoveClientControl); + RemoveUnitFlag(UnitFlags.PlayerControlled); ClearUnitState(UnitState.Possessed); break; case CharmType.Charm: @@ -533,7 +534,7 @@ namespace Game.Entities CreatureTemplate cinfo = ToCreature().GetCreatureTemplate(); if (cinfo != null && cinfo.CreatureType == CreatureType.Demon) { - SetByteValue(UnitFields.Bytes0, 1, (byte)cinfo.UnitClass); + SetClass((Class)cinfo.UnitClass); if (GetCharmInfo() != null) GetCharmInfo().SetPetNumber(0, true); else @@ -592,20 +593,24 @@ namespace Game.Entities { if (IsTypeId(TypeId.Player)) { - if (!AddGuidValue(UnitFields.Charm, charm.GetGUID())) + if (GetCharmGUID().IsEmpty()) + SetCharmGUID(charm.GetGUID()); + else Log.outFatal(LogFilter.Unit, "Player {0} is trying to charm unit {1}, but it already has a charmed unit {2}", GetName(), charm.GetEntry(), GetCharmGUID()); charm.m_ControlledByPlayer = true; // @todo maybe we can use this flag to check if controlled by player - charm.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + charm.AddUnitFlag(UnitFlags.PvpAttackable); } else charm.m_ControlledByPlayer = false; // PvP, FFAPvP - charm.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag)); + charm.SetPvpFlags(GetPvpFlags()); - if (!charm.AddGuidValue(UnitFields.CharmedBy, GetGUID())) + if (charm.GetCharmGUID().IsEmpty()) + charm.SetCharmerGUID(GetGUID()); + else Log.outFatal(LogFilter.Unit, "Unit {0} is being charmed, but it already has a charmer {1}", charm.GetEntry(), charm.GetCharmerGUID()); _isWalkingBeforeCharm = charm.IsWalking(); @@ -619,30 +624,35 @@ namespace Game.Entities { if (IsTypeId(TypeId.Player)) { - if (!RemoveGuidValue(UnitFields.Charm, charm.GetGUID())) + if (GetCharmGUID() == charm.GetGUID()) + SetCharmGUID(ObjectGuid.Empty); + else Log.outFatal(LogFilter.Unit, "Player {0} is trying to uncharm unit {1}, but it has another charmed unit {2}", GetName(), charm.GetEntry(), GetCharmGUID()); } - if (!charm.RemoveGuidValue(UnitFields.CharmedBy, GetGUID())) + if (charm.GetCharmerGUID() == GetGUID()) + charm.SetCharmerGUID(ObjectGuid.Empty); + else Log.outFatal(LogFilter.Unit, "Unit {0} is being uncharmed, but it has another charmer {1}", charm.GetEntry(), charm.GetCharmerGUID()); + Player player = charm.GetCharmerOrOwnerPlayerOrPlayerItself(); if (charm.IsTypeId(TypeId.Player)) { charm.m_ControlledByPlayer = true; - charm.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + charm.AddUnitFlag(UnitFlags.PvpAttackable); charm.ToPlayer().UpdatePvPState(); } else if (player) { charm.m_ControlledByPlayer = true; - charm.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); - charm.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, player.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag)); + charm.AddUnitFlag(UnitFlags.PvpAttackable); + charm.SetPvpFlags(player.GetPvpFlags()); } else { charm.m_ControlledByPlayer = false; - charm.RemoveFlag(UnitFields.Flags, UnitFlags.PvpAttackable); - charm.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, 0); + charm.RemoveUnitFlag(UnitFlags.PvpAttackable); + charm.SetPvpFlags(UnitPVPStateFlags.None); } if (charm.IsWalking() != _isWalkingBeforeCharm) @@ -777,11 +787,11 @@ namespace Game.Entities bool InitTamedPet(Pet pet, uint level, uint spell_id) { pet.SetCreatorGUID(GetGUID()); - pet.SetFaction(getFaction()); - pet.SetUInt32Value(UnitFields.CreatedBySpell, spell_id); + pet.SetFaction(GetFaction()); + pet.SetCreatedBySpell(spell_id); if (IsTypeId(TypeId.Player)) - pet.SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); + pet.AddUnitFlag(UnitFlags.PvpAttackable); if (!pet.InitStatsForLevel(level)) { diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index 5d74327a5..19f165e91 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -30,6 +30,8 @@ namespace Game.Entities { public virtual bool HasSpell(uint spellId) { return false; } + + // function uses real base points (typically value - 1) public int CalculateSpellDamage(Unit target, SpellInfo spellProto, uint effect_index, int? basePoints = null, int itemLevel = -1) { @@ -45,9 +47,10 @@ namespace Game.Entities public int SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) { - if (IsTypeId(TypeId.Player)) + Player thisPlayer = ToPlayer(); + if (thisPlayer) { - float overrideSP = GetFloatValue(ActivePlayerFields.OverrideSpellPowerByApPct); + float overrideSP = thisPlayer.m_activePlayerData.OverrideSpellPowerByAPPercent; if (overrideSP > 0.0f) return (int)(MathFunctions.CalculatePct(GetTotalAttackPowerValue(WeaponAttackType.BaseAttack), overrideSP) + 0.5f); } @@ -185,12 +188,13 @@ namespace Game.Entities MathFunctions.AddPct(ref DoneTotalMod, modOwner.GetRatingBonusValue(CombatRating.VersatilityDamageDone) + modOwner.GetTotalAuraModifier(AuraType.ModVersatility)); float maxModDamagePercentSchool = 0.0f; - if (IsTypeId(TypeId.Player)) + Player thisPlayer = ToPlayer(); + if (thisPlayer) { for (int i = 0; i < (int)SpellSchools.Max; ++i) { if (Convert.ToBoolean((int)spellProto.GetSchoolMask() & (1 << i))) - maxModDamagePercentSchool = Math.Max(maxModDamagePercentSchool, GetFloatValue(ActivePlayerFields.ModDamageDonePct + i)); + maxModDamagePercentSchool = Math.Max(maxModDamagePercentSchool, thisPlayer.m_activePlayerData.ModDamageDonePercent[i]); } } else @@ -336,9 +340,10 @@ namespace Game.Entities public uint SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) { - if (IsTypeId(TypeId.Player)) + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) { - float overrideSP = GetFloatValue(ActivePlayerFields.OverrideSpellPowerByApPct); + float overrideSP = thisPlayer.m_activePlayerData.OverrideSpellPowerByAPPercent; if (overrideSP > 0.0f) return (uint)(MathFunctions.CalculatePct(GetTotalAttackPowerValue(WeaponAttackType.BaseAttack), overrideSP) + 0.5f); } @@ -502,8 +507,9 @@ namespace Game.Entities if (spellProto.SpellFamilyName == SpellFamilyNames.Potion) return 1.0f; - if (IsPlayer()) - return GetFloatValue(ActivePlayerFields.ModHealingDonePct); + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) + return thisPlayer.m_activePlayerData.ModHealingDonePercent; float DoneTotalMod = 1.0f; @@ -640,7 +646,7 @@ namespace Game.Entities crit_chance = 0.0f; // For other schools else if (IsTypeId(TypeId.Player)) - crit_chance = GetFloatValue(ActivePlayerFields.CritPercentage); + crit_chance = ToPlayer().m_activePlayerData.SpellCritPercentage; else crit_chance = m_baseSpellCritChance; @@ -1914,7 +1920,7 @@ namespace Game.Entities if (!(spellInfo.HasAttribute(SpellAttr0.Ability | SpellAttr0.Tradespell) || spellInfo.HasAttribute(SpellAttr3.NoDoneBonus)) && (IsTypeId(TypeId.Player) && spellInfo.SpellFamilyName != 0) || IsTypeId(TypeId.Unit)) - castTime = (int)(castTime * GetFloatValue(UnitFields.ModCastSpeed)); + castTime = (int)(castTime * m_unitData.ModCastingSpeed); else if (spellInfo.HasAttribute(SpellAttr0.ReqAmmo) && !spellInfo.HasAttribute(SpellAttr2.AutorepeatFlag)) castTime = (int)(castTime * m_modAttackSpeedPct[(int)WeaponAttackType.RangedAttack]); else if (Global.SpellMgr.IsPartOfSkillLine(SkillType.Cooking, spellInfo.Id) && HasAura(67556)) // cooking with Chef Hat. @@ -1935,7 +1941,7 @@ namespace Game.Entities if (!(spellInfo.HasAttribute(SpellAttr0.Ability) || spellInfo.HasAttribute(SpellAttr0.Tradespell) || spellInfo.HasAttribute(SpellAttr3.NoDoneBonus)) && (IsTypeId(TypeId.Player) && spellInfo.SpellFamilyName != 0) || IsTypeId(TypeId.Unit)) - duration = (int)(duration * GetFloatValue(UnitFields.ModCastSpeed)); + duration = (int)(duration * m_unitData.ModCastingSpeed); else if (spellInfo.HasAttribute(SpellAttr0.ReqAmmo) && !spellInfo.HasAttribute(SpellAttr2.AutorepeatFlag)) duration = (int)(duration * m_modAttackSpeedPct[(int)WeaponAttackType.RangedAttack]); } @@ -2261,15 +2267,15 @@ namespace Game.Entities { if (val > 0) { - ApplyPercentModFloatValue(UnitFields.ModCastSpeed, val, !apply); - ApplyPercentModFloatValue(UnitFields.ModCastHaste, val, !apply); - ApplyPercentModFloatValue(UnitFields.ModHasteRegen, val, !apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModCastingSpeed), val, !apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModSpellHaste), val, !apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModHasteRegen), val, !apply); } else { - ApplyPercentModFloatValue(UnitFields.ModCastSpeed, -val, apply); - ApplyPercentModFloatValue(UnitFields.ModCastHaste, -val, apply); - ApplyPercentModFloatValue(UnitFields.ModHasteRegen, -val, apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModCastingSpeed), -val, apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModSpellHaste), -val, apply); + ApplyPercentModUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ModHasteRegen), -val, apply); } } @@ -3145,8 +3151,8 @@ namespace Game.Entities continue; // The charges / stack amounts don't count towards the total number of auras that can be dispelled. - // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell - // Polymorph instead of 1 / (5 + 1) -> 16%. + // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) . 50% chance to dispell + // Polymorph instead of 1 / (5 + 1) . 16%. bool dispelCharges = aura.GetSpellInfo().HasAttribute(SpellAttr7.DispelCharges); byte charges = dispelCharges ? aura.GetCharges() : aura.GetStackAmount(); if (charges > 0) @@ -3696,11 +3702,12 @@ namespace Game.Entities public void ModifyAuraState(AuraStateType flag, bool apply) { + uint mask = 1u << ((int)flag - 1); if (apply) { - if (!HasFlag(UnitFields.AuraState, (1u << ((int)flag - 1)))) + if ((m_unitData.AuraState & mask) == 0) { - SetFlag(UnitFields.AuraState, (1u << (int)flag - 1)); + SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AuraState), mask); if (IsTypeId(TypeId.Player)) { var sp_list = ToPlayer().GetSpellMap(); @@ -3735,9 +3742,9 @@ namespace Game.Entities } else { - if (HasFlag(UnitFields.AuraState, (1u << (int)flag - 1))) + if ((m_unitData.AuraState & mask) != 0) { - RemoveFlag(UnitFields.AuraState, (1u << (int)flag - 1)); + RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AuraState), mask); foreach (var app in GetAppliedAuras()) { @@ -3773,7 +3780,7 @@ namespace Game.Entities } } - return HasFlag(UnitFields.AuraState, (uint)(1 << (int)flag - 1)); + return (m_unitData.AuraState & (1 << ((int)flag - 1))) != 0; } SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) @@ -3981,9 +3988,9 @@ namespace Game.Entities return aurApp?.GetBase(); } - uint BuildAuraStateUpdateForTarget(Unit target) + public uint BuildAuraStateUpdateForTarget(Unit target) { - uint auraStates = GetUInt32Value(UnitFields.AuraState) & ~(uint)AuraStateType.PerCasterAuraStateMask; + uint auraStates = m_unitData.AuraState & ~(uint)AuraStateType.PerCasterAuraStateMask; foreach (var state in m_auraStateAuras) if (Convert.ToBoolean((1 << (int)state.Key - 1) & (uint)AuraStateType.PerCasterAuraStateMask)) if (state.Value.GetBase().GetCasterGUID() == target.GetGUID()) @@ -4465,7 +4472,6 @@ namespace Game.Entities }); } - public void _RegisterAuraEffect(AuraEffect aurEff, bool apply) { if (apply) diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 9bd808710..9bb9cf803 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -31,6 +31,7 @@ using Game.Spells; using System; using System.Collections.Generic; using System.Linq; +using Game.Network; namespace Game.Entities { @@ -85,6 +86,8 @@ namespace Game.Entities m_serverSideVisibility.SetValue(ServerSideVisibilityType.Ghost, GhostVisibilityType.Alive); movesplineTimer = new TimeTrackerSmall(); + + m_unitData = new UnitData(); } public override void Dispose() @@ -734,32 +737,42 @@ namespace Game.Entities m_areaTrigger[0].Remove(); } - public bool IsVendor() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Vendor); } - public bool IsTrainer() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Trainer); } - public bool IsQuestGiver() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.QuestGiver); } - public bool IsGossip() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Gossip); } - public bool IsTaxi() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.FlightMaster); } - public bool IsGuildMaster() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Petitioner); } - public bool IsBattleMaster() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.BattleMaster); } - public bool IsBanker() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Banker); } - public bool IsInnkeeper() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Innkeeper); } - public bool IsSpiritHealer() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.SpiritHealer); } - public bool IsSpiritGuide() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.SpiritGuide); } - public bool IsTabardDesigner() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.TabardDesigner); } - public bool IsAuctioner() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Auctioneer); } - public bool IsArmorer() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.Repair); } + public bool HasNpcFlag(NPCFlags flags) { return (m_unitData.NpcFlags[0] & (uint)flags) != 0; } + public void AddNpcFlag(NPCFlags flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 0), (uint)flags); } + public void RemoveNpcFlag(NPCFlags flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 0), (uint)flags); } + public void SetNpcFlags(NPCFlags flags) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 0), (uint)flags); } + public bool HasNpcFlag2(NPCFlags2 flags) { return (m_unitData.NpcFlags[1] & (uint)flags) != 0; } + public void AddNpcFlag2(NPCFlags2 flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 1), (uint)flags); } + public void RemoveNpcFlag2(NPCFlags2 flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 1), (uint)flags); } + public void SetNpcFlags2(NPCFlags2 flags) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 1), (uint)flags); } + + public bool IsVendor() { return HasNpcFlag(NPCFlags.Vendor); } + public bool IsTrainer() { return HasNpcFlag(NPCFlags.Trainer); } + public bool IsQuestGiver() { return HasNpcFlag(NPCFlags.QuestGiver); } + public bool IsGossip() { return HasNpcFlag(NPCFlags.Gossip); } + public bool IsTaxi() { return HasNpcFlag(NPCFlags.FlightMaster); } + public bool IsGuildMaster() { return HasNpcFlag(NPCFlags.Petitioner); } + public bool IsBattleMaster() { return HasNpcFlag(NPCFlags.BattleMaster); } + public bool IsBanker() { return HasNpcFlag(NPCFlags.Banker); } + public bool IsInnkeeper() { return HasNpcFlag(NPCFlags.Innkeeper); } + public bool IsSpiritHealer() { return HasNpcFlag(NPCFlags.SpiritHealer); } + public bool IsSpiritGuide() { return HasNpcFlag(NPCFlags.SpiritGuide); } + public bool IsTabardDesigner() { return HasNpcFlag(NPCFlags.TabardDesigner); } + public bool IsAuctioner() { return HasNpcFlag(NPCFlags.Auctioneer); } + public bool IsArmorer() { return HasNpcFlag(NPCFlags.Repair); } public bool IsServiceProvider() { - return HasFlag64(UnitFields.NpcFlags, - NPCFlags.Vendor | NPCFlags.Trainer | NPCFlags.FlightMaster | + return HasNpcFlag(NPCFlags.Vendor | NPCFlags.Trainer | NPCFlags.FlightMaster | NPCFlags.Petitioner | NPCFlags.BattleMaster | NPCFlags.Banker | NPCFlags.Innkeeper | NPCFlags.SpiritHealer | NPCFlags.SpiritGuide | NPCFlags.TabardDesigner | NPCFlags.Auctioneer); } - public bool IsSpiritService() { return HasFlag64(UnitFields.NpcFlags, NPCFlags.SpiritHealer | NPCFlags.SpiritGuide); } + public bool IsSpiritService() { return HasNpcFlag(NPCFlags.SpiritHealer | NPCFlags.SpiritGuide); } public bool IsCritter() { return GetCreatureType() == CreatureType.Critter; } public bool IsInFlight() { return HasUnitState(UnitState.InFlight); } + public void SetHoverHeight(float hoverHeight) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.HoverHeight), hoverHeight); } + public Guardian GetGuardianPet() { ObjectGuid pet_guid = GetPetGUID(); @@ -1088,7 +1101,7 @@ namespace Game.Entities return pet; Log.outError(LogFilter.Unit, "Unit.GetCharm: Charmed creature {0} not exist.", charm_guid); - SetGuidValue(UnitFields.Charm, ObjectGuid.Empty); + SetCharmGUID(ObjectGuid.Empty); } return null; @@ -1144,7 +1157,8 @@ namespace Game.Entities public uint GetModelForForm(ShapeShiftForm form) { - if (IsTypeId(TypeId.Player)) + Player thisPlayer = ToPlayer(); + if (thisPlayer != null) { Aura artifactAura = GetAura(PlayerConst.ArtifactsAllWeaponsGeneralWeaponEquippedPassive); if (artifactAura != null) @@ -1159,8 +1173,8 @@ namespace Game.Entities } } - byte hairColor = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId); - byte skinColor = GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId); + byte hairColor = thisPlayer.m_playerData.HairColorID; + byte skinColor = thisPlayer.m_playerData.SkinID; switch (form) { @@ -1568,21 +1582,6 @@ namespace Game.Entities return modelid; } - public virtual bool CanUseAttackType(WeaponAttackType attacktype) - { - switch (attacktype) - { - case WeaponAttackType.BaseAttack: - return !HasFlag(UnitFields.Flags, UnitFlags.Disarmed); - case WeaponAttackType.OffAttack: - return !HasFlag(UnitFields.Flags2, UnitFlags2.DisarmOffhand); - case WeaponAttackType.RangedAttack: - return !HasFlag(UnitFields.Flags2, UnitFlags2.DisarmRanged); - default: - return true; - } - } - public Totem ToTotem() { return IsTotem() ? (this as Totem) : null; } public TempSummon ToTempSummon() { return IsSummon() ? (this as TempSummon) : null; } public virtual void setDeathState(DeathState s) @@ -1630,7 +1629,7 @@ namespace Game.Entities // do not why since in IncreaseMaxHealth currenthealth is checked SetHealth(0); SetPower(GetPowerType(), 0); - SetUInt32Value(UnitFields.NpcEmotestate, 0); + SetEmoteState(Emote.OneshotNone); // players in instance don't have ZoneScript, but they have InstanceScript ZoneScript zoneScript = GetZoneScript() != null ? GetZoneScript() : GetInstanceScript(); @@ -1638,7 +1637,7 @@ namespace Game.Entities zoneScript.OnUnitDeath(this); } else if (s == DeathState.JustRespawned) - RemoveFlag(UnitFields.Flags, UnitFlags.Skinnable); // clear skinnable for creature and player (at Battleground) + RemoveUnitFlag(UnitFlags.Skinnable); // clear skinnable for creature and player (at Battleground) } public bool IsVisible() @@ -1655,12 +1654,19 @@ namespace Game.Entities UpdateObjectVisibility(); } - public bool IsMounted() { return HasFlag(UnitFields.Flags, UnitFlags.Mount); } - public uint GetMountID() { return GetUInt32Value(UnitFields.MountDisplayId); } + + public bool IsMagnet() + { + // Grounding Totem + if (m_unitData.CreatedBySpell == 8177) /// @todo: find a more generic solution + return true; + + return false; + } public void SetShapeshiftForm(ShapeShiftForm form) { - SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.ShapeshiftForm, (byte)form); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ShapeshiftForm), (byte)form); } public void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value) @@ -1906,7 +1912,7 @@ namespace Game.Entities public FactionTemplateRecord GetFactionTemplateEntry() { - FactionTemplateRecord entry = CliDB.FactionTemplateStorage.LookupByKey(getFaction()); + FactionTemplateRecord entry = CliDB.FactionTemplateStorage.LookupByKey(GetFaction()); if (entry == null) { ObjectGuid guid = ObjectGuid.Empty; // prevent repeating spam same faction problem @@ -1916,11 +1922,11 @@ namespace Game.Entities Player player = ToPlayer(); Creature creature = ToCreature(); if (player != null) - Log.outError(LogFilter.Unit, "Player {0} has invalid faction (faction template id) #{1}", player.GetName(), getFaction()); + Log.outError(LogFilter.Unit, "Player {0} has invalid faction (faction template id) #{1}", player.GetName(), GetFaction()); else if (creature != null) - Log.outError(LogFilter.Unit, "Creature (template id: {0}) has invalid faction (faction template id) #{1}", creature.GetCreatureTemplate().Entry, getFaction()); + Log.outError(LogFilter.Unit, "Creature (template id: {0}) has invalid faction (faction template id) #{1}", creature.GetCreatureTemplate().Entry, GetFaction()); else - Log.outError(LogFilter.Unit, "Unit (name={0}, type={1}) has invalid faction (faction template id) #{2}", GetName(), GetTypeId(), getFaction()); + Log.outError(LogFilter.Unit, "Unit (name={0}, type={1}) has invalid faction (faction template id) #{2}", GetName(), GetTypeId(), GetFaction()); guid = GetGUID(); } @@ -2028,7 +2034,7 @@ namespace Game.Entities if (slot >= SharedConst.MaxEquipmentItems) return 0; - return GetUInt32Value(UnitFields.VirtualItemSlotId + slot * 2); + return m_unitData.VirtualItems[slot].ItemID; } public ushort GetVirtualItemAppearanceMod(uint slot) @@ -2036,85 +2042,121 @@ namespace Game.Entities if (slot >= SharedConst.MaxEquipmentItems) return 0; - return GetUInt16Value(UnitFields.VirtualItemSlotId + (int)slot * 2 + 1, 0); + return m_unitData.VirtualItems[(int)slot].ItemAppearanceModID; } - public void SetVirtualItem(int slot, uint itemId, ushort appearanceModId = 0, ushort itemVisual = 0) + public void SetVirtualItem(uint slot, uint itemId, ushort appearanceModId = 0, ushort itemVisual = 0) { if (slot >= SharedConst.MaxEquipmentItems) return; - SetUInt32Value(UnitFields.VirtualItemSlotId + slot * 2, itemId); - SetUInt16Value(UnitFields.VirtualItemSlotId + slot * 2 + 1, 0, appearanceModId); - SetUInt16Value(UnitFields.VirtualItemSlotId + slot * 2 + 1, 1, itemVisual); + var virtualItemField = m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.VirtualItems, (int)slot); + SetUpdateFieldValue(virtualItemField.ModifyValue((VisibleItem visibleItem) => visibleItem.ItemID), itemId); + SetUpdateFieldValue(virtualItemField.ModifyValue((VisibleItem visibleItem) => visibleItem.ItemAppearanceModID), appearanceModId); + SetUpdateFieldValue(virtualItemField.ModifyValue((VisibleItem visibleItem) => visibleItem.ItemVisual), itemVisual); } //Unit public void SetLevel(uint lvl) { - SetUInt32Value(UnitFields.Level, lvl); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Level), lvl); - if (IsTypeId(TypeId.Player)) + Player player = ToPlayer(); + if (player != null) { - Player player = ToPlayer(); if (player.GetGroup()) player.SetGroupUpdateFlag(GroupUpdateFlags.Level); Global.WorldMgr.UpdateCharacterInfoLevel(ToPlayer().GetGUID(), (byte)lvl); } } - public uint getLevel() - { - return GetUInt32Value(UnitFields.Level); - } + public uint getLevel() { return m_unitData.Level; } + public override uint GetLevelForTarget(WorldObject target) { return getLevel(); } - public override uint GetLevelForTarget(WorldObject target) - { - return getLevel(); - } + public Race GetRace() { return (Race)(byte)m_unitData.Race; } + public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Race), (byte)race); } + public ulong getRaceMask() { return 1ul << ((int)GetRace() - 1); } + public Class GetClass() { return (Class)(byte)m_unitData.ClassId; } + public void SetClass(Class classId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ClassId), (byte)classId); } + public uint getClassMask() { return (uint)(1 << ((int)GetClass() - 1)); } + public Gender GetGender() { return (Gender)(byte)m_unitData.Sex; } + public void SetGender(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Sex), (byte)sex); } - public Race GetRace() - { - return (Race)GetByteValue(UnitFields.Bytes0, 0); - } - public ulong getRaceMask() - { - return (1ul << ((int)GetRace() - 1)); - } - public Class GetClass() - { - return (Class)GetByteValue(UnitFields.Bytes0, 1); - } - public uint getClassMask() - { - return (uint)(1 << ((int)GetClass() - 1)); - } - public Gender GetGender() - { - return (Gender)GetByteValue(UnitFields.Bytes0, 3); - } - - public void SetNativeDisplayId(uint displayId, float displayScale = 1f) - { - SetUInt32Value(UnitFields.NativeDisplayId, displayId); - SetFloatValue(UnitFields.NativeXDisplayScale, displayScale); - } + public uint GetDisplayId() { return m_unitData.DisplayID; } public virtual void SetDisplayId(uint modelId, float displayScale = 1f) { - SetUInt32Value(UnitFields.DisplayId, modelId); - SetFloatValue(UnitFields.DisplayScale, displayScale); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.DisplayID), modelId); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.DisplayScale), displayScale); // Set Gender by modelId CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(modelId); if (minfo != null) - SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); + SetGender((Gender)minfo.gender); } - public uint GetNativeDisplayId() + public void RestoreDisplayId(bool ignorePositiveAurasPreventingMounting = false) { - return GetUInt32Value(UnitFields.NativeDisplayId); + AuraEffect handledAura = null; + // try to receive model from transform auras + var transforms = GetAuraEffectsByType(AuraType.Transform); + if (!transforms.Empty()) + { + // iterate over already applied transform auras - from newest to oldest + foreach (var eff in transforms) + { + AuraApplication aurApp = eff.GetBase().GetApplicationOfTarget(GetGUID()); + if (aurApp != null) + { + if (handledAura == null) + { + if (!ignorePositiveAurasPreventingMounting) + handledAura = eff; + else + { + CreatureTemplate ci = Global.ObjectMgr.GetCreatureTemplate((uint)eff.GetMiscValue()); + if (ci != null) + if (!IsDisallowedMountForm(eff.GetId(), ShapeShiftForm.None, ObjectManager.ChooseDisplayId(ci).CreatureDisplayID)) + handledAura = eff; + } + } + + // prefer negative auras + if (!aurApp.IsPositive()) + { + handledAura = eff; + break; + } + } + } + } + uint modelId; + // transform aura was found + if (handledAura != null) + handledAura.HandleEffect(this, AuraEffectHandleModes.SendForClient, true); + // we've found shapeshift + else if ((modelId = GetModelForForm(GetShapeshiftForm())) != 0) + { + if (!ignorePositiveAurasPreventingMounting || !IsDisallowedMountForm(0, GetShapeshiftForm(), modelId)) + SetDisplayId(modelId); + else + SetDisplayId(GetNativeDisplayId()); + } + // no auras found - set modelid to default + else + SetDisplayId(GetNativeDisplayId()); } - public float GetNativeDisplayScale() + public uint GetNativeDisplayId() { return m_unitData.NativeDisplayID; } + public void SetNativeDisplayId(uint displayId, float displayScale = 1f) { - return GetFloatValue(UnitFields.NativeXDisplayScale); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NativeDisplayID), displayId); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NativeXDisplayScale), displayScale); } + public float GetNativeDisplayScale() { return m_unitData.NativeXDisplayScale; } + + public bool IsMounted() + { + return HasUnitFlag(UnitFlags.Mount); + } + public uint GetMountDisplayId() { return m_unitData.MountDisplayID; } + public void SetMountDisplayId(uint mountDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MountDisplayID), mountDisplayId); } + public virtual Unit GetOwner() { ObjectGuid ownerid = GetOwnerGUID(); @@ -2125,18 +2167,46 @@ namespace Game.Entities } public virtual float GetFollowAngle() { return MathFunctions.PiOver2; } - public ObjectGuid GetOwnerGUID() { return GetGuidValue(UnitFields.SummonedBy); } - public ObjectGuid GetCreatorGUID() { return GetGuidValue(UnitFields.CreatedBy); } - public ObjectGuid GetMinionGUID() { return GetGuidValue(UnitFields.Summon); } - public ObjectGuid GetCharmerGUID() { return GetGuidValue(UnitFields.CharmedBy); } - public ObjectGuid GetCharmGUID() { return GetGuidValue(UnitFields.Charm); } + public ObjectGuid GetOwnerGUID() { return m_unitData.SummonedBy; } + public void SetOwnerGUID(ObjectGuid owner) + { + if (GetOwnerGUID() == owner) + return; + + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.SummonedBy), owner); + if (owner.IsEmpty()) + return; + + // Update owner dependent fields + Player player = Global.ObjAccessor.GetPlayer(this, owner); + if (player == null || !player.HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object + return; + + UpdateData udata = new UpdateData(GetMapId()); + UpdateObject packet; + BuildValuesUpdateBlockForPlayerWithFlag(udata, UpdateFieldFlag.Owner, player); + udata.BuildPacket(out packet); + player.SendPacket(packet); + } + public ObjectGuid GetCreatorGUID() { return m_unitData.CreatedBy; } + public void SetCreatorGUID(ObjectGuid creator) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CreatedBy), creator); } + public ObjectGuid GetMinionGUID() { return m_unitData.Summon; } + public void SetMinionGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Summon), guid); } + public ObjectGuid GetCharmerGUID() { return m_unitData.CharmedBy; } + public void SetCharmerGUID(ObjectGuid owner) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CharmedBy), owner); } + public ObjectGuid GetCharmGUID() { return m_unitData.Charm; } + public void SetCharmGUID(ObjectGuid charm) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Charm), charm); } public ObjectGuid GetPetGUID() { return m_SummonSlot[0]; } - public ObjectGuid GetCritterGUID() { return GetGuidValue(UnitFields.Critter); } + public void SetPetGUID(ObjectGuid guid) { m_SummonSlot[0] = guid; } + public ObjectGuid GetCritterGUID() { return m_unitData.Critter; } + public void SetCritterGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Critter), guid); } + public ObjectGuid GetBattlePetCompanionGUID() { return m_unitData.BattlePetCompanionGUID; } + public void SetBattlePetCompanionGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BattlePetCompanionGUID), guid); } public ObjectGuid GetCharmerOrOwnerGUID() { return !GetCharmerGUID().IsEmpty() ? GetCharmerGUID() : GetOwnerGUID(); } - ObjectGuid GetCharmerOrOwnerOrOwnGUID() + public ObjectGuid GetCharmerOrOwnerOrOwnGUID() { ObjectGuid guid = GetCharmerOrOwnerGUID(); if (!guid.IsEmpty()) @@ -2172,52 +2242,49 @@ namespace Game.Entities return !GetCharmerGUID().IsEmpty() ? GetCharmer() : GetOwner(); } - public uint GetChannelSpellId() { return GetUInt32Value(UnitFields.ChannelData); } - public void SetChannelSpellId(uint channelSpellId) { SetUInt32Value(UnitFields.ChannelData, channelSpellId); } - public uint GetChannelSpellXSpellVisualId() { return GetUInt32Value(UnitFields.ChannelData + 1);} - public void SetChannelSpellXSpellVisualId(uint channelSpellXSpellVisualId) { SetUInt32Value(UnitFields.ChannelData + 1, channelSpellXSpellVisualId); } + public bool HasUnitFlag(UnitFlags flags) { return (m_unitData.Flags & (uint)flags) != 0; } + public void AddUnitFlag(UnitFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags), (uint)flags); } + public void RemoveUnitFlag(UnitFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags), (uint)flags); } + public void SetUnitFlags(UnitFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags), (uint)flags); } + public bool HasUnitFlag2(UnitFlags2 flags) { return (m_unitData.Flags2 & (uint)flags) != 0; } + public void AddUnitFlag2(UnitFlags2 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags2), (uint)flags); } + public void RemoveUnitFlag2(UnitFlags2 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags2), (uint)flags); } + public void SetUnitFlags2(UnitFlags2 flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags2), (uint)flags); } + public bool HasUnitFlag3(UnitFlags3 flags) { return (m_unitData.Flags3 & (uint)flags) != 0; } + public void AddUnitFlag3(UnitFlags3 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags3), (uint)flags); } + public void RemoveUnitFlag3(UnitFlags3 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags3), (uint)flags); } + public void SetUnitFlags3(UnitFlags3 flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Flags3), (uint)flags); } - public List GetChannelObjects() { return GetDynamicStructuredValues(UnitDynamicFields.ChannelObjects); } - public void AddChannelObject(ObjectGuid guid) { AddDynamicStructuredValue(UnitDynamicFields.ChannelObjects, guid); } + public void SetCreatedBySpell(uint spellId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CreatedBySpell), spellId); } - public void SetOwnerGUID(ObjectGuid owner) - { - if (GetOwnerGUID() == owner) - return; + public Emote GetEmoteState() { return (Emote)(int)m_unitData.EmoteState; } + public void SetEmoteState(Emote emote) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.EmoteState), (int)emote); } - SetGuidValue(UnitFields.SummonedBy, owner); - if (owner.IsEmpty()) - return; - - // Update owner dependent fields - Player player = Global.ObjAccessor.GetPlayer(this, owner); - if (player == null || !player.HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object - return; - - SetFieldNotifyFlag(UpdateFieldFlags.Owner); - - UpdateData udata = new UpdateData(GetMapId()); - UpdateObject packet; - BuildValuesUpdateBlockForPlayer(udata, player); - udata.BuildPacket(out packet); - player.SendPacket(packet); - - RemoveFieldNotifyFlag(UpdateFieldFlags.Owner); - } - public void SetCreatorGUID(ObjectGuid creator) { SetGuidValue(UnitFields.CreatedBy, creator); } - void SetMinionGUID(ObjectGuid guid) { SetGuidValue(UnitFields.Summon, guid); } - void SetCharmerGUID(ObjectGuid owner) { SetGuidValue(UnitFields.CharmedBy, owner); } - public void SetPetGUID(ObjectGuid guid) { m_SummonSlot[0] = guid; } - void SetCritterGUID(ObjectGuid guid) { SetGuidValue(UnitFields.Critter, guid); } + public SheathState GetSheath() { return (SheathState)(byte)m_unitData.SheatheState; } + public void SetSheath(SheathState sheathed) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.SheatheState), (byte)sheathed); } public uint GetCombatTimer() { return m_CombatTimer; } - public bool IsPvP() { return HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.PvP); } - public bool IsFFAPvP() { return HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); } + public UnitPVPStateFlags GetPvpFlags() { return (UnitPVPStateFlags)(byte)m_unitData.PvpFlags; } + public bool HasPvpFlag(UnitPVPStateFlags flags) { return (m_unitData.PvpFlags & (uint)flags) != 0; } + public void AddPvpFlag(UnitPVPStateFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PvpFlags), (byte)flags); } + public void RemovePvpFlag(UnitPVPStateFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PvpFlags), (byte)flags); } + public void SetPvpFlags(UnitPVPStateFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PvpFlags), (byte)flags); } + public bool IsPvP() { return HasPvpFlag(UnitPVPStateFlags.PvP); } + public bool IsFFAPvP() { return HasPvpFlag(UnitPVPStateFlags.FFAPvp); } - public ShapeShiftForm GetShapeshiftForm() + public UnitPetFlags GetPetFlags() { - return (ShapeShiftForm)GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.ShapeshiftForm); + return (UnitPetFlags)(byte)m_unitData.PetFlags; } + public bool HasPetFlag(UnitPetFlags flags) { return (m_unitData.PetFlags & (byte)flags) != 0; } + public void AddPetFlag(UnitPetFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetFlags), (byte)flags); } + public void RemovePetFlag(UnitPetFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetFlags), (byte)flags); } + public void SetPetFlags(UnitPetFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetFlags), (byte)flags); } + + public void SetPetNumberForClient(uint petNumber) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetNumber), petNumber); } + public void SetPetNameTimestamp(uint timestamp) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.PetNameTimestamp), timestamp); } + + public ShapeShiftForm GetShapeshiftForm() { return (ShapeShiftForm)(byte)m_unitData.ShapeshiftForm; } public CreatureType GetCreatureType() { if (IsTypeId(TypeId.Player)) @@ -2275,14 +2342,6 @@ namespace Game.Entities { m_state &= ~f; } - public void SetStandFlags(object flags) - { - SetByteFlag(UnitFields.Bytes1, UnitBytes1Offsets.VisFlag, flags); - } - public void RemoveStandFlags(object flags) - { - RemoveByteFlag(UnitFields.Bytes1, UnitBytes1Offsets.VisFlag, flags); - } public override bool IsAlwaysVisibleFor(WorldObject seer) { @@ -2342,9 +2401,9 @@ namespace Game.Entities if (GetCharmerOrOwnerOrSelf() == target.GetCharmerOrOwnerOrSelf()) return ReputationRank.Friendly; - if (HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) + if (HasUnitFlag(UnitFlags.PvpAttackable)) { - if (target.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) + if (target.HasUnitFlag(UnitFlags.PvpAttackable)) { Player selfPlayerOwner = GetAffectingPlayer(); Player targetPlayerOwner = target.GetAffectingPlayer(); @@ -2373,7 +2432,7 @@ namespace Game.Entities var targetFactionTemplateEntry = target.GetFactionTemplateEntry(); if (targetFactionTemplateEntry != null) { - if (!selfPlayerOwner.HasFlag(UnitFields.Flags2, UnitFlags2.IgnoreReputation)) + if (!selfPlayerOwner.HasUnitFlag2(UnitFlags2.IgnoreReputation)) { var targetFactionEntry = CliDB.FactionStorage.LookupByKey(targetFactionTemplateEntry.Faction); if (targetFactionEntry != null) @@ -2382,7 +2441,7 @@ namespace Game.Entities { // check contested flags if (Convert.ToBoolean(targetFactionTemplateEntry.Flags & (uint)FactionTemplateFlags.ContestedGuard) - && selfPlayerOwner.HasFlag(PlayerFields.Flags, PlayerFlags.ContestedPVP)) + && selfPlayerOwner.HasPlayerFlag(PlayerFlags.ContestedPVP)) return ReputationRank.Hostile; // if faction has reputation, hostile state depends only from AtWar state @@ -2414,12 +2473,12 @@ namespace Game.Entities { // check contested flags if (Convert.ToBoolean(factionTemplateEntry.Flags & (uint)FactionTemplateFlags.ContestedGuard) - && targetPlayerOwner.HasFlag(PlayerFields.Flags, PlayerFlags.ContestedPVP)) + && targetPlayerOwner.HasPlayerFlag(PlayerFlags.ContestedPVP)) return ReputationRank.Hostile; ReputationRank repRank = targetPlayerOwner.GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry); if (repRank != ReputationRank.None) return repRank; - if (!target.HasFlag(UnitFields.Flags2, UnitFlags2.IgnoreReputation)) + if (!target.HasUnitFlag2(UnitFlags2.IgnoreReputation)) { var factionEntry = CliDB.FactionStorage.LookupByKey(factionTemplateEntry.Faction); if (factionEntry != null) @@ -2449,14 +2508,9 @@ namespace Game.Entities return ReputationRank.Neutral; } - public uint getFaction() - { - return GetUInt32Value(UnitFields.FactionTemplate); - } - public void SetFaction(uint faction) - { - SetUInt32Value(UnitFields.FactionTemplate, faction); - } + public uint GetFaction() { return m_unitData.FactionTemplate; } + public void SetFaction(uint faction) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.FactionTemplate), faction); } + public void RestoreFaction() { if (IsTypeId(TypeId.Player)) @@ -2468,7 +2522,7 @@ namespace Game.Entities Unit owner = GetOwner(); if (owner) { - SetFaction(owner.getFaction()); + SetFaction(owner.GetFaction()); return; } } @@ -2494,8 +2548,8 @@ namespace Game.Entities (u1.IsTypeId(TypeId.Player) && u2.IsTypeId(TypeId.Unit) && u2.ToCreature().GetCreatureTemplate().TypeFlags.HasAnyFlag(CreatureTypeFlags.TreatAsRaidUnit))) return true; - // else u1->GetTypeId() == u2->GetTypeId() == TYPEID_UNIT - return u1.getFaction() == u2.getFaction(); + // else u1.GetTypeId() == u2.GetTypeId() == TYPEID_UNIT + return u1.GetFaction() == u2.GetFaction(); } public bool IsInRaidWith(Unit unit) @@ -2514,14 +2568,14 @@ namespace Game.Entities (u1.IsTypeId(TypeId.Player) && u2.IsTypeId(TypeId.Unit) && u2.ToCreature().GetCreatureTemplate().TypeFlags.HasAnyFlag(CreatureTypeFlags.TreatAsRaidUnit))) return true; - // else u1->GetTypeId() == u2->GetTypeId() == TYPEID_UNIT - return u1.getFaction() == u2.getFaction(); + // else u1.GetTypeId() == u2.GetTypeId() == TYPEID_UNIT + return u1.GetFaction() == u2.GetFaction(); } - public SheathState GetSheath() { return (SheathState)GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.SheathState); } - public void SetSheath(SheathState sheathed) { SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.SheathState, (byte)sheathed); } - - public UnitStandStateType GetStandState() { return (UnitStandStateType)GetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.StandState); } + public UnitStandStateType GetStandState() { return (UnitStandStateType)(byte)m_unitData.StandState; } + public void AddVisFlags(UnitVisFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.VisFlags), (byte)flags); } + public void RemoveVisFlags(UnitVisFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.VisFlags), (byte)flags); } + public void SetVisFlags(UnitVisFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.VisFlags), (byte)flags); } public bool IsSitState() { @@ -2540,7 +2594,7 @@ namespace Game.Entities public void SetStandState(UnitStandStateType state, uint animKitId = 0) { - SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.StandState, (byte)state); + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StandState), (byte)state); if (IsStandState()) RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.NotSeated); @@ -2552,60 +2606,34 @@ namespace Game.Entities } } - public uint GetDisplayId() { return GetUInt32Value(UnitFields.DisplayId); } - - public void RestoreDisplayId(bool ignorePositiveAurasPreventingMounting = false) + public void SetAnimTier(UnitBytes1Flags animTier, bool notifyClient) { - AuraEffect handledAura = null; - // try to receive model from transform auras - var transforms = GetAuraEffectsByType(AuraType.Transform); - if (!transforms.Empty()) - { - // iterate over already applied transform auras - from newest to oldest - foreach (var eff in transforms) - { - AuraApplication aurApp = eff.GetBase().GetApplicationOfTarget(GetGUID()); - if (aurApp != null) - { - if (handledAura == null) - { - if (!ignorePositiveAurasPreventingMounting) - handledAura = eff; - else - { - CreatureTemplate ci = Global.ObjectMgr.GetCreatureTemplate((uint)eff.GetMiscValue()); - if (ci != null) - if (!IsDisallowedMountForm(eff.GetId(), ShapeShiftForm.None, ObjectManager.ChooseDisplayId(ci).CreatureDisplayID)) - handledAura = eff; - } - } + SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.AnimTier), (byte)animTier); - // prefer negative auras - if (!aurApp.IsPositive()) - { - handledAura = eff; - break; - } - } - } - } - uint modelId; - // transform aura was found - if (handledAura != null) - handledAura.HandleEffect(this, AuraEffectHandleModes.SendForClient, true); - // we've found shapeshift - else if ((modelId = GetModelForForm(GetShapeshiftForm())) != 0) + if (notifyClient) { - if (!ignorePositiveAurasPreventingMounting || !IsDisallowedMountForm(0, GetShapeshiftForm(), modelId)) - SetDisplayId(modelId); - else - SetDisplayId(GetNativeDisplayId()); + SetAnimTier setAnimTier = new SetAnimTier(); + setAnimTier.Unit = GetGUID(); + setAnimTier.Tier = (int)animTier; + SendMessageToSet(setAnimTier, true); } - // no auras found - set modelid to default - else - SetDisplayId(GetNativeDisplayId()); } + public uint GetChannelSpellId() { return ((UnitChannel)m_unitData.ChannelData).SpellID; } + public void SetChannelSpellId(uint channelSpellId) + { + SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelData)._value.SpellID, channelSpellId); + } + public uint GetChannelSpellXSpellVisualId() { return ((UnitChannel)m_unitData.ChannelData).SpellXSpellVisualID; } + public void SetChannelSpellXSpellVisualId(uint channelSpellXSpellVisualId) + { + UnitChannel unitChannel = m_unitData.ModifyValue(m_unitData.ChannelData); + SetUpdateFieldValue(ref unitChannel.SpellXSpellVisualID, channelSpellXSpellVisualId); + } + public void AddChannelObject(ObjectGuid guid) { AddDynamicUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects), guid); } + public void SetChannelObject(int slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects, slot), guid); } + public void ClearChannelObjects() { ClearDynamicUpdateFieldValues(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects)); } + public bool IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo spellInfo = null, sbyte effIndex = -1) { // only physical spells damage gets reduced by armor @@ -2632,162 +2660,68 @@ namespace Game.Entities return true; } - public override void BuildValuesUpdate(UpdateType updatetype, ByteBuffer data, Player target) + public override UpdateFieldFlag GetUpdateFieldFlagsFor(Player target) { - if (target == null) - return; + UpdateFieldFlag flags = UpdateFieldFlag.None; + if (target == this || GetOwnerGUID() == target.GetGUID()) + flags |= UpdateFieldFlag.Owner; - ByteBuffer fieldBuffer = new ByteBuffer(); - - uint valCount = valuesCount; - - uint[] flags = UpdateFieldFlags.UnitUpdateFieldFlags; - uint visibleFlag = UpdateFieldFlags.Public; - - if (target == this) - visibleFlag |= UpdateFieldFlags.Private; - else if (IsTypeId(TypeId.Player)) - valCount = (int)PlayerFields.End; - - UpdateMask updateMask = new UpdateMask(valCount); - - Player plr = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (GetOwnerGUID() == target.GetGUID()) - visibleFlag |= UpdateFieldFlags.Owner; - - if (HasFlag(ObjectFields.DynamicFlags, UnitDynFlags.SpecialInfo)) + if (HasDynamicFlag(UnitDynFlags.SpecialInfo)) if (HasAuraTypeWithCaster(AuraType.Empathy, target.GetGUID())) - visibleFlag |= UpdateFieldFlags.SpecialInfo; + flags |= UpdateFieldFlag.Empath; - if (plr != null && plr.IsInSameRaidWith(target)) - visibleFlag |= UpdateFieldFlags.PartyMember; + return flags; + } - Creature creature = ToCreature(); - for (var index = 0; index < valCount; ++index) - { - if (Convert.ToBoolean(_fieldNotifyFlags & flags[index]) || - Convert.ToBoolean((flags[index] & visibleFlag) & UpdateFieldFlags.SpecialInfo) || - ((updatetype == UpdateType.Values ? _changesMask.Get(index) : updateValues[index].UnsignedValue != 0) && flags[index].HasAnyFlag(visibleFlag)) || - (index == (int)UnitFields.AuraState && HasFlag(UnitFields.AuraState, AuraStateType.PerCasterAuraStateMask))) - { - updateMask.SetBit(index); + public override void BuildValuesCreate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); - if (index == (int)UnitFields.NpcFlags) - { - uint appendValue = GetUInt32Value(UnitFields.NpcFlags); + buffer.WriteUInt8((byte)flags); + m_objectData.WriteCreate(buffer, flags, this, target); + m_unitData.WriteCreate(buffer, flags, this, target); - if (creature != null) - if (!target.CanSeeSpellClickOn(creature)) - appendValue &= ~(uint)NPCFlags.SpellClick; + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } - fieldBuffer.WriteUInt32(appendValue); - } - else if (index == (int)UnitFields.AuraState) - { - // Check per caster aura states to not enable using a spell in client if specified aura is not by target - fieldBuffer.WriteUInt32(BuildAuraStateUpdateForTarget(target)); - } - // FIXME: Some values at server stored in float format but must be sent to client in public uint format - else if ((index >= (int)UnitFields.NegStat && index < (int)UnitFields.NegStat + (int)Stats.Max) || - (index >= (int)UnitFields.PosStat && index < (int)UnitFields.PosStat + (int)Stats.Max)) - { - fieldBuffer.WriteUInt32((uint)GetFloatValue(index)); - } - // Gamemasters should be always able to select units - remove not selectable flag - else if (index == (int)UnitFields.Flags) - { - UnitFlags appendValue = (UnitFlags)updateValues[index].UnsignedValue; - if (target.IsGameMaster()) - appendValue &= ~UnitFlags.NotSelectable; + public override void BuildValuesUpdate(WorldPacket data, Player target) + { + UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + WorldPacket buffer = new WorldPacket(); - fieldBuffer.WriteUInt32((uint)appendValue); - } - // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures - else if (index == (int)UnitFields.DisplayId) - { - uint displayId = updateValues[index].UnsignedValue; - if (creature != null) - { - CreatureTemplate cinfo = creature.GetCreatureTemplate(); + buffer.WriteUInt32(m_values.GetChangedObjectTypeMask()); + if (m_values.HasChanged(TypeId.Object)) + m_objectData.WriteUpdate(buffer, flags, this, target); - // this also applies for transform auras - SpellInfo transform = Global.SpellMgr.GetSpellInfo(getTransForm()); - if (transform != null) - { - foreach (SpellEffectInfo effect in transform.GetEffectsForDifficulty(GetMap().GetDifficultyID())) - { - if (effect != null && effect.IsAura(AuraType.Transform)) - { - CreatureTemplate transformInfo = Global.ObjectMgr.GetCreatureTemplate((uint)effect.MiscValue); - if (transformInfo != null) - { - cinfo = transformInfo; - break; - } - } - } - } + if (m_values.HasChanged(TypeId.Unit)) + m_unitData.WriteUpdate(buffer, flags, this, target); - if (cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Trigger)) - if (target.IsGameMaster()) - displayId = cinfo.GetFirstVisibleModel().CreatureDisplayID; - } + data.WriteUInt32(buffer.GetSize()); + data.WriteBytes(buffer); + } - fieldBuffer.WriteUInt32(displayId); - } - // hide lootable animation for unallowed players - else if (index == (int)ObjectFields.DynamicFlags) - { - UnitDynFlags dynamicFlags = (UnitDynFlags)updateValues[index].UnsignedValue & ~UnitDynFlags.Tapped; + void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) + { + UpdateMask valuesMask = new UpdateMask(14); + valuesMask.Set((int)TypeId.Unit); - if (creature != null) - { - if (creature.hasLootRecipient() && !creature.isTappedBy(target)) - dynamicFlags |= UnitDynFlags.Tapped; + WorldPacket buffer = new WorldPacket(); - if (!target.isAllowedToLoot(creature)) - dynamicFlags &= ~UnitDynFlags.Lootable; - } + UpdateMask mask = new UpdateMask(191); + m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags); + m_unitData.WriteUpdate(buffer, mask, flags, this, target); - // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras - if (dynamicFlags.HasAnyFlag(UnitDynFlags.TrackUnit)) - if (!HasAuraTypeWithCaster(AuraType.ModStalked, target.GetGUID())) - dynamicFlags &= ~UnitDynFlags.TrackUnit; + data.WriteUInt32(buffer.GetSize()); + data.WriteUInt32(valuesMask.GetBlock(0)); + data.WriteBytes(buffer); + } - fieldBuffer.WriteUInt32((uint)dynamicFlags); - } - // FG: pretend that OTHER players in own group are friendly ("blue") - else if (index == (int)UnitFields.Bytes2 || index == (int)UnitFields.FactionTemplate) - { - if (IsControlledByPlayer() && target != this && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && IsInRaidWith(target)) - { - FactionTemplateRecord ft1 = GetFactionTemplateEntry(); - FactionTemplateRecord ft2 = target.GetFactionTemplateEntry(); - if (ft1 != null && ft2 != null && !ft1.IsFriendlyTo(ft2)) - { - if (index == (int)UnitFields.Bytes2) - // Allow targetting opposite faction in party when enabled in config - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue & ((int)UnitBytes2Flags.Sanctuary << 8)); // this flag is at public byte offset 1 !! - else - // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work) - fieldBuffer.WriteUInt32(target.getFaction()); - } - else - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue); - } - else - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue); - } - else - { - // send in current format (float as float, public uint as uint32) - fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue); - } - } - } - - updateMask.AppendToPacket(data); - data.WriteBytes(fieldBuffer); + public override void ClearUpdateMask(bool remove) + { + m_values.ClearChangesMask(m_unitData); + base.ClearUpdateMask(remove); } public override void DestroyForPlayer(Player target) diff --git a/Source/Game/Entities/Vehicle.cs b/Source/Game/Entities/Vehicle.cs index d5698570a..0a85c203d 100644 --- a/Source/Game/Entities/Vehicle.cs +++ b/Source/Game/Entities/Vehicle.cs @@ -53,9 +53,9 @@ namespace Game.Entities // Set or remove correct flags based on available seats. Will overwrite db data (if wrong). if (UsableSeatNum != 0) - _me.SetFlag64(UnitFields.NpcFlags, (_me.IsTypeId(TypeId.Player) ? NPCFlags.PlayerVehicle : NPCFlags.SpellClick)); + _me.AddNpcFlag(_me.IsTypeId(TypeId.Player) ? NPCFlags.PlayerVehicle : NPCFlags.SpellClick); else - _me.RemoveFlag64(UnitFields.NpcFlags, (_me.IsTypeId(TypeId.Player) ? NPCFlags.PlayerVehicle : NPCFlags.SpellClick)); + _me.RemoveNpcFlag(_me.IsTypeId(TypeId.Player) ? NPCFlags.PlayerVehicle : NPCFlags.SpellClick); InitMovementInfoForBase(); } @@ -345,7 +345,7 @@ namespace Game.Entities unit.GetName(), _me.GetEntry(), _vehicleInfo.Id, _me.GetGUID().ToString(), seat.Key); if (seat.Value.SeatInfo.CanEnterOrExit() && ++UsableSeatNum != 0) - _me.SetFlag64(UnitFields.NpcFlags, (_me.IsTypeId(TypeId.Player) ? NPCFlags.PlayerVehicle : NPCFlags.SpellClick)); + _me.AddNpcFlag(_me.IsTypeId(TypeId.Player) ? NPCFlags.PlayerVehicle : NPCFlags.SpellClick); // Enable gravity for passenger when he did not have it active before entering the vehicle if (seat.Value.SeatInfo.Flags.HasAnyFlag(VehicleSeatFlags.DisableGravity) && !seat.Value.Passenger.IsGravityDisabled) @@ -353,7 +353,7 @@ namespace Game.Entities // Remove UNIT_FLAG_NOT_SELECTABLE if passenger did not have it before entering vehicle if (seat.Value.SeatInfo.Flags.HasAnyFlag(VehicleSeatFlags.PassengerNotSelectable) && !seat.Value.Passenger.IsUnselectable) - unit.RemoveFlag(UnitFields.Flags, UnitFlags.NotSelectable); + unit.RemoveUnitFlag(UnitFlags.NotSelectable); seat.Value.Passenger.Reset(); @@ -560,7 +560,7 @@ namespace Game.Entities Passenger.SetVehicle(Target); Seat.Value.Passenger.Guid = Passenger.GetGUID(); - Seat.Value.Passenger.IsUnselectable = Passenger.HasFlag(UnitFields.Flags, UnitFlags.NotSelectable); + Seat.Value.Passenger.IsUnselectable = Passenger.HasUnitFlag(UnitFlags.NotSelectable); Seat.Value.Passenger.IsGravityDisabled = Passenger.HasUnitMovementFlag(MovementFlag.DisableGravity); if (Seat.Value.SeatInfo.CanEnterOrExit()) { @@ -569,9 +569,9 @@ namespace Game.Entities if (Target.UsableSeatNum == 0) { if (Target.GetBase().IsTypeId(TypeId.Player)) - Target.GetBase().RemoveFlag64(UnitFields.NpcFlags, NPCFlags.PlayerVehicle); + Target.GetBase().RemoveNpcFlag(NPCFlags.PlayerVehicle); else - Target.GetBase().RemoveFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick); + Target.GetBase().RemoveNpcFlag(NPCFlags.SpellClick); } } @@ -599,7 +599,7 @@ namespace Game.Entities Passenger.SetDisableGravity(true); if (Seat.Value.SeatInfo.Flags.HasAnyFlag(VehicleSeatFlags.PassengerNotSelectable)) - Passenger.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); + Passenger.AddUnitFlag(UnitFlags.NotSelectable); Passenger.m_movementInfo.transport.pos.Relocate(veSeat.AttachmentOffset.X, veSeat.AttachmentOffset.Y, veSeat.AttachmentOffset.Z); Passenger.m_movementInfo.transport.time = 0; diff --git a/Source/Game/Events/GameEventManager.cs b/Source/Game/Events/GameEventManager.cs index 405e2f477..8a3d32c8b 100644 --- a/Source/Game/Events/GameEventManager.cs +++ b/Source/Game/Events/GameEventManager.cs @@ -1119,9 +1119,10 @@ namespace Game if (creatureTemplate != null) npcflag |= (ulong)creatureTemplate.Npcflag; - creature.SetUInt64Value(UnitFields.NpcFlags, npcflag); + creature.SetNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF)); + creature.SetNpcFlags2((NPCFlags2)(npcflag >> 32)); // reset gossip options, since the flag change might have added / removed some - //cr->ResetGossipOptions(); + //cr.ResetGossipOptions(); } } }); diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 0c05e8caf..f17b071ac 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -1440,6 +1440,13 @@ namespace Game } break; } + case ScriptCommands.FieldSetDeprecated: + case ScriptCommands.FlagSetDeprecated: + case ScriptCommands.FlagRemoveDeprecated: + { + Log.outError(LogFilter.Sql, $"Table `{tableName}` uses deprecated direct updatefield modify command {tmp.command} for script id {tmp.id}"); + continue; + } default: break; } @@ -1811,7 +1818,7 @@ namespace Game creature.RequiredExpansion = fields.Read(15); creature.VignetteID = fields.Read(16); creature.Faction = fields.Read(17); - creature.Npcflag = (NPCFlags)fields.Read(18); + creature.Npcflag = fields.Read(18); creature.SpeedWalk = fields.Read(19); creature.SpeedRun = fields.Read(20); creature.Scale = fields.Read(21); @@ -1826,9 +1833,9 @@ namespace Game creature.UnitFlags2 = fields.Read(30); creature.UnitFlags3 = fields.Read(31); creature.DynamicFlags = fields.Read(32); - creature.Family = (CreatureFamily)fields.Read(33); + creature.Family = (CreatureFamily)fields.Read(33); creature.TrainerClass = (Class)fields.Read(34); - creature.CreatureType = (CreatureType)fields.Read(35); + creature.CreatureType = (CreatureType)fields.Read(35); creature.TypeFlags = (CreatureTypeFlags)fields.Read(36); creature.TypeFlags2 = fields.Read(37); creature.LootId = fields.Read(38); @@ -4718,7 +4725,7 @@ namespace Game var time = Time.GetMSTime(); uint count = 0; - SQLResult result = DB.World.Query("SELECT Id, FlagsCu, FoodType, MinMoneyLoot, MaxMoneyLoot, SpellPPMChance FROM item_template_addon"); + SQLResult result = DB.World.Query("SELECT Id, FlagsCu, FoodType, MinMoneyLoot, MaxMoneyLoot, SpellPPMChance, RandomBonusListTemplateId FROM item_template_addon"); if (!result.IsEmpty()) { do @@ -4745,6 +4752,7 @@ namespace Game itemTemplate.MinMoneyLoot = minMoneyLoot; itemTemplate.MaxMoneyLoot = maxMoneyLoot; itemTemplate.SpellPPMRate = result.Read(5); + itemTemplate.RandomBonusListTemplateId = result.Read(6); ++count; } while (result.NextRow()); } @@ -7156,7 +7164,7 @@ namespace Game CreatureTemplate cInfo = GetCreatureTemplate(pair.Key); if (cInfo == null) Log.outError(LogFilter.Sql, "Table `creature_queststarter` have data for not existed creature entry ({0}) and existed quest {1}", pair.Key, pair.Value); - else if (!Convert.ToBoolean(cInfo.Npcflag & NPCFlags.QuestGiver)) + else if (!Convert.ToBoolean(cInfo.Npcflag & (uint)NPCFlags.QuestGiver)) Log.outError(LogFilter.Sql, "Table `creature_queststarter` has creature entry ({0}) for quest {1}, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", pair.Key, pair.Value); } } @@ -7169,7 +7177,7 @@ namespace Game CreatureTemplate cInfo = GetCreatureTemplate(pair.Key); if (cInfo == null) Log.outError(LogFilter.Sql, "Table `creature_questender` have data for not existed creature entry ({0}) and existed quest {1}", pair.Key, pair.Value); - else if (!Convert.ToBoolean(cInfo.Npcflag & NPCFlags.QuestGiver)) + else if (!Convert.ToBoolean(cInfo.Npcflag & (uint)NPCFlags.QuestGiver)) Log.outError(LogFilter.Sql, "Table `creature_questender` has creature entry ({0}) for quest {1}, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", pair.Key, pair.Value); } } @@ -7709,10 +7717,10 @@ namespace Game var ctc = GetCreatureTemplates(); foreach (var creature in ctc.Values) { - if (creature.Npcflag.HasAnyFlag(NPCFlags.SpellClick) && !_spellClickInfoStorage.ContainsKey(creature.Entry)) + if (creature.Npcflag.HasAnyFlag((uint)NPCFlags.SpellClick) && !_spellClickInfoStorage.ContainsKey(creature.Entry)) { Log.outError(LogFilter.Sql, "npc_spellclick_spells: Creature template {0} has UNIT_NPC_FLAG_SPELLCLICK but no data in spellclick table! Removing flag", creature.Entry); - creature.Npcflag &= ~NPCFlags.SpellClick; + creature.Npcflag &= ~(uint)NPCFlags.SpellClick; } } diff --git a/Source/Game/Groups/Group.cs b/Source/Game/Groups/Group.cs index d948968fa..84e46f290 100644 --- a/Source/Game/Groups/Group.cs +++ b/Source/Game/Groups/Group.cs @@ -51,6 +51,7 @@ namespace Game.Groups m_guid = ObjectGuid.Create(HighGuid.Party, Global.GroupMgr.GenerateGroupId()); m_leaderGuid = leaderGuid; m_leaderName = leader.GetName(); + leader.AddPlayerFlag(PlayerFlags.GroupLeader); if (isBGGroup() || isBFGroup()) { @@ -428,8 +429,6 @@ namespace Game.Groups { // Broadcast new player group member fields to rest of the group - player.SetFieldNotifyFlag(UpdateFieldFlags.PartyMember); - UpdateData groupData = new UpdateData(player.GetMapId()); UpdateObject groupDataPacket; @@ -439,25 +438,21 @@ namespace Game.Groups if (refe.GetSource() == player) continue; - Player memberPlayer = refe.GetSource(); - if (memberPlayer != null) + Player existingMember = refe.GetSource(); + if (existingMember != null) { - if (player.HaveAtClient(memberPlayer)) - { - memberPlayer.SetFieldNotifyFlag(UpdateFieldFlags.PartyMember); - memberPlayer.BuildValuesUpdateBlockForPlayer(groupData, player); - memberPlayer.RemoveFieldNotifyFlag(UpdateFieldFlags.PartyMember); - } + if (player.HaveAtClient(existingMember)) + existingMember.BuildValuesUpdateBlockForPlayerWithFlag(groupData, UpdateFieldFlag.PartyMember, player); - if (memberPlayer.HaveAtClient(player)) + if (existingMember.HaveAtClient(player)) { UpdateData newData = new UpdateData(player.GetMapId()); UpdateObject newDataPacket; - player.BuildValuesUpdateBlockForPlayer(newData, memberPlayer); + player.BuildValuesUpdateBlockForPlayerWithFlag(newData, UpdateFieldFlag.PartyMember, existingMember); if (newData.HasData()) { newData.BuildPacket(out newDataPacket); - memberPlayer.SendPacket(newDataPacket); + existingMember.SendPacket(newDataPacket); } } } @@ -468,8 +463,6 @@ namespace Game.Groups groupData.BuildPacket(out groupDataPacket); player.SendPacket(groupDataPacket); } - - player.RemoveFieldNotifyFlag(UpdateFieldFlags.PartyMember); } if (m_maxEnchantingLevel < player.GetSkillValue(SkillType.Enchanting)) @@ -675,6 +668,11 @@ namespace Game.Groups DB.Characters.CommitTransaction(trans); } + Player oldLeader = Global.ObjAccessor.FindConnectedPlayer(m_leaderGuid); + if (oldLeader) + oldLeader.RemovePlayerFlag(PlayerFlags.GroupLeader); + + newLeader.AddPlayerFlag(PlayerFlags.GroupLeader); m_leaderGuid = newLeader.GetGUID(); m_leaderName = newLeader.GetName(); ToggleGroupMemberFlag(slot, GroupMemberFlags.Assistant, false); @@ -1170,7 +1168,7 @@ namespace Game.Groups item.is_looted = true; roll.getLoot().NotifyItemRemoved(roll.itemSlot); roll.getLoot().unlootedCount--; - player.StoreNewItem(dest, roll.itemid, true, item.randomPropertyId, item.GetAllowedLooters(), item.context, item.BonusListIDs); + player.StoreNewItem(dest, roll.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); } else { @@ -1221,7 +1219,7 @@ namespace Game.Groups item.is_looted = true; roll.getLoot().NotifyItemRemoved(roll.itemSlot); roll.getLoot().unlootedCount--; - player.StoreNewItem(dest, roll.itemid, true, item.randomPropertyId, item.GetAllowedLooters(), item.context, item.BonusListIDs); + player.StoreNewItem(dest, roll.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); } else { @@ -2061,8 +2059,9 @@ namespace Game.Groups Player pp = Global.ObjAccessor.FindPlayer(member.guid); if (pp && pp.IsInWorld) { - pp.ForceValuesUpdateAtIndex(UnitFields.Bytes2); - pp.ForceValuesUpdateAtIndex(UnitFields.FactionTemplate); + pp.m_values.ModifyValue(pp.m_unitData).ModifyValue(pp.m_unitData.PvpFlags); + pp.m_values.ModifyValue(pp.m_unitData).ModifyValue(pp.m_unitData.FactionTemplate); + pp.ForceUpdateFieldChange(); Log.outDebug(LogFilter.Server, "-- Forced group value update for '{0}'", pp.GetName()); } } @@ -2602,8 +2601,7 @@ namespace Game.Groups public Roll(LootItem li) { itemid = li.itemid; - itemRandomPropId = li.randomPropertyId; - itemRandomSuffix = li.randomSuffix; + itemRandomBonusListId = li.randomBonusListId; itemCount = li.count; rollTypeMask = RollMask.AllNoDisenchant; } @@ -2655,8 +2653,7 @@ namespace Game.Groups } public uint itemid; - public ItemRandomEnchantmentId itemRandomPropId; - public uint itemRandomSuffix; + public uint itemRandomBonusListId; public byte itemCount; public Dictionary playerVote = new Dictionary(); public byte totalPlayersRolling; diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index 6cc4e1ca6..8689b02fb 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -1313,7 +1313,7 @@ namespace Game.Guilds public bool LoadBankItemFromDB(SQLFields field) { - byte tabId = field.Read(46); + byte tabId = field.Read(45); if (tabId >= _GetPurchasedTabsSize()) { Log.outError(LogFilter.Guild, "Invalid tab for item (GUID: {0}, id: {1}) in guild bank, skipped.", @@ -2137,14 +2137,14 @@ namespace Game.Guilds itemInfo.Item.ItemID = tabItem ? tabItem.GetEntry() : 0; itemInfo.Count = (int)(tabItem ? tabItem.GetCount() : 0); itemInfo.Charges = tabItem ? Math.Abs(tabItem.GetSpellCharges()) : 0; - itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/; + itemInfo.OnUseEnchantmentID = 0/*int32(tabItem.GetItemSuffixFactor())*/; itemInfo.Flags = 0; itemInfo.Locked = false; if (tabItem != null) { byte i = 0; - foreach (ItemDynamicFieldGems gemData in tabItem.GetGems()) + foreach (SocketedGem gemData in tabItem.m_itemData.Gems) { if (gemData.ItemId != 0) { @@ -2218,12 +2218,12 @@ namespace Game.Guilds itemInfo.Item.ItemID = tabItem.GetEntry(); itemInfo.Count = (int)tabItem.GetCount(); itemInfo.Charges = Math.Abs(tabItem.GetSpellCharges()); - itemInfo.EnchantmentID = tabItem.GetItemRandomPropertyId(); // verify that... - itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/; + itemInfo.EnchantmentID = (int)tabItem.GetEnchantmentId(EnchantmentSlot.Perm); + itemInfo.OnUseEnchantmentID = (int)tabItem.GetEnchantmentId(EnchantmentSlot.Use); itemInfo.Flags = 0; byte i = 0; - foreach (ItemDynamicFieldGems gemData in tabItem.GetGems()) + foreach (SocketedGem gemData in tabItem.m_itemData.Gems) { if (gemData.ItemId != 0) { @@ -2477,7 +2477,7 @@ namespace Game.Guilds m_name = player.GetName(); m_level = (byte)player.getLevel(); m_class = player.GetClass(); - _gender = (Gender)player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender); + _gender = (Gender)(byte)player.m_playerData.NativeSex; m_zoneId = player.GetZoneId(); m_accountId = player.GetSession().GetAccountId(); m_achievementPoints = player.GetAchievementPoints(); @@ -3213,7 +3213,7 @@ namespace Game.Guilds public bool LoadItemFromDB(SQLFields field) { - byte slotId = field.Read(47); + byte slotId = field.Read(46); uint itemGuid = field.Read(0); uint itemEntry = field.Read(1); if (slotId >= GuildConst.MaxBankSlots) @@ -3340,8 +3340,8 @@ namespace Game.Guilds stmt.AddValue(3, item.GetGUID().GetCounter()); trans.Append(stmt); - item.SetGuidValue(ItemFields.Contained, ObjectGuid.Empty); - item.SetGuidValue(ItemFields.Owner, ObjectGuid.Empty); + item.SetContainedIn(ObjectGuid.Empty); + item.SetOwnerGUID(ObjectGuid.Empty); item.FSetState(ItemUpdateState.New); item.SaveToDB(trans); // Not in inventory and can be saved standalone } @@ -3349,7 +3349,6 @@ namespace Game.Guilds return true; } - ulong m_guildId; byte m_tabId; Item[] m_items = new Item[GuildConst.MaxBankSlots]; diff --git a/Source/Game/Guilds/GuildManager.cs b/Source/Game/Guilds/GuildManager.cs index 62e4bd446..799529515 100644 --- a/Source/Game/Guilds/GuildManager.cs +++ b/Source/Game/Guilds/GuildManager.cs @@ -383,7 +383,7 @@ namespace Game uint count = 0; do { - ulong guildId = result.Read(45); + ulong guildId = result.Read(44); Guild guild = GetGuildById(guildId); if (guild) guild.LoadBankItemFromDB(result.GetFields()); diff --git a/Source/Game/Handlers/ArtifactHandler.cs b/Source/Game/Handlers/ArtifactHandler.cs index d146fce67..65e1a1160 100644 --- a/Source/Game/Handlers/ArtifactHandler.cs +++ b/Source/Game/Handlers/ArtifactHandler.cs @@ -44,13 +44,13 @@ namespace Game if (cost != null) xpCost = (ulong)(currentArtifactTier == PlayerConst.MaxArtifactTier ? cost.XP2 : cost.XP); - if (xpCost > artifact.GetUInt64Value(ItemFields.ArtifactXp)) + if (xpCost > artifact.m_itemData.ArtifactXP) return; if (artifactAddPower.PowerChoices.Empty()) return; - ItemDynamicFieldArtifactPowers artifactPower = artifact.GetArtifactPower(artifactAddPower.PowerChoices[0].ArtifactPowerID); + ArtifactPower artifactPower = artifact.GetArtifactPower(artifactAddPower.PowerChoices[0].ArtifactPowerID); if (artifactPower == null) return; @@ -85,7 +85,7 @@ namespace Game if (artifactPowerLink == null) continue; - ItemDynamicFieldArtifactPowers artifactPowerLinkLearned = artifact.GetArtifactPower(artifactPowerLinkId); + ArtifactPower artifactPowerLinkLearned = artifact.GetArtifactPower(artifactPowerLinkId); if (artifactPowerLinkLearned == null) continue; @@ -105,16 +105,13 @@ namespace Game if (artifactPowerRank == null) return; - ItemDynamicFieldArtifactPowers newPower = artifactPower; - ++newPower.PurchasedRank; - ++newPower.CurrentRankWithBonus; - artifact.SetArtifactPower(newPower); + artifact.SetArtifactPower(artifactPower.ArtifactPowerId, (byte)(artifactPower.PurchasedRank + 1), (byte)(artifactPower.CurrentRankWithBonus + 1)); if (artifact.IsEquipped()) { _player.ApplyArtifactPowerRank(artifact, artifactPowerRank, true); - foreach (ItemDynamicFieldArtifactPowers power in artifact.GetArtifactPowers()) + foreach (ArtifactPower power in artifact.m_itemData.ArtifactPowers) { ArtifactPowerRecord scaledArtifactPowerEntry = CliDB.ArtifactPowerStorage.LookupByKey(power.ArtifactPowerId); if (!scaledArtifactPowerEntry.Flags.HasAnyFlag(ArtifactPowerFlag.ScalesWithNumPowers)) @@ -124,16 +121,14 @@ namespace Game if (scaledArtifactPowerRank == null) continue; - ItemDynamicFieldArtifactPowers newScaledPower = power; - ++newScaledPower.CurrentRankWithBonus; - artifact.SetArtifactPower(newScaledPower); + artifact.SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, (byte)(power.CurrentRankWithBonus + 1)); _player.ApplyArtifactPowerRank(artifact, scaledArtifactPowerRank, false); _player.ApplyArtifactPowerRank(artifact, scaledArtifactPowerRank, true); } } - artifact.SetUInt64Value(ItemFields.ArtifactXp, artifact.GetUInt64Value(ItemFields.ArtifactXp) - xpCost); + artifact.SetArtifactXP(artifact.m_itemData.ArtifactXP - xpCost); artifact.SetState(ItemUpdateState.Changed, _player); uint totalPurchasedArtifactPower = artifact.GetTotalPurchasedArtifactPowers(); @@ -211,7 +206,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.ConfirmArtifactRespec)] void HandleConfirmArtifactRespec(ConfirmArtifactRespec confirmArtifactRespec) { - if (!_player.GetNPCIfCanInteractWith(confirmArtifactRespec.NpcGUID, NPCFlags.ArtifactPowerRespec)) + if (!_player.GetNPCIfCanInteractWith(confirmArtifactRespec.NpcGUID, NPCFlags.ArtifactPowerRespec, NPCFlags2.None)) return; Item artifact = _player.GetItemByGuid(confirmArtifactRespec.ArtifactGUID); @@ -223,10 +218,10 @@ namespace Game if (cost != null) xpCost = (ulong)(artifact.GetModifier(ItemModifier.ArtifactTier) == 1 ? cost.XP2 : cost.XP); - if (xpCost > artifact.GetUInt64Value(ItemFields.ArtifactXp)) + if (xpCost > artifact.m_itemData.ArtifactXP) return; - ulong newAmount = artifact.GetUInt64Value(ItemFields.ArtifactXp) - xpCost; + ulong newAmount = artifact.m_itemData.ArtifactXP - xpCost; for (uint i = 0; i <= artifact.GetTotalPurchasedArtifactPowers(); ++i) { GtArtifactLevelXPRecord cost1 = CliDB.ArtifactLevelXPGameTable.GetRow(i); @@ -234,16 +229,13 @@ namespace Game newAmount += (ulong)(artifact.GetModifier(ItemModifier.ArtifactTier) == 1 ? cost1.XP2 : cost1.XP); } - foreach (ItemDynamicFieldArtifactPowers artifactPower in artifact.GetArtifactPowers()) + foreach (ArtifactPower artifactPower in artifact.m_itemData.ArtifactPowers) { byte oldPurchasedRank = artifactPower.PurchasedRank; if (oldPurchasedRank == 0) continue; - ItemDynamicFieldArtifactPowers newPower = artifactPower; - newPower.PurchasedRank -= oldPurchasedRank; - newPower.CurrentRankWithBonus -= oldPurchasedRank; - artifact.SetArtifactPower(newPower); + artifact.SetArtifactPower(artifactPower.ArtifactPowerId, (byte)(artifactPower.PurchasedRank - oldPurchasedRank), (byte)(artifactPower.CurrentRankWithBonus - oldPurchasedRank)); if (artifact.IsEquipped()) { @@ -253,7 +245,7 @@ namespace Game } } - foreach (ItemDynamicFieldArtifactPowers power in artifact.GetArtifactPowers()) + foreach (ArtifactPower power in artifact.m_itemData.ArtifactPowers) { ArtifactPowerRecord scaledArtifactPowerEntry = CliDB.ArtifactPowerStorage.LookupByKey(power.ArtifactPowerId); if (!scaledArtifactPowerEntry.Flags.HasAnyFlag(ArtifactPowerFlag.ScalesWithNumPowers)) @@ -263,14 +255,12 @@ namespace Game if (scaledArtifactPowerRank == null) continue; - ItemDynamicFieldArtifactPowers newScaledPower = power; - newScaledPower.CurrentRankWithBonus = 0; - artifact.SetArtifactPower(newScaledPower); + artifact.SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, 0); _player.ApplyArtifactPowerRank(artifact, scaledArtifactPowerRank, false); } - artifact.SetUInt64Value(ItemFields.ArtifactXp, newAmount); + artifact.SetArtifactXP(newAmount); artifact.SetState(ItemUpdateState.Changed, _player); } } diff --git a/Source/Game/Handlers/AuctionHandler.cs b/Source/Game/Handlers/AuctionHandler.cs index a7e7d024e..6710856e2 100644 --- a/Source/Game/Handlers/AuctionHandler.cs +++ b/Source/Game/Handlers/AuctionHandler.cs @@ -31,9 +31,9 @@ namespace Game public partial class WorldSession { [WorldPacketHandler(ClientOpcodes.AuctionHelloRequest)] - void HandleAuctionHelloOpcode(AuctionHelloRequest packet) + void HandleAuctionHello(AuctionHelloRequest packet) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Guid, NPCFlags.Auctioneer); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Guid, NPCFlags.Auctioneer, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionHelloOpcode - {0} not found or you can't interact with him.", packet.Guid.ToString()); @@ -55,7 +55,7 @@ namespace Game return; } - AuctionHouseRecord ahEntry = Global.AuctionMgr.GetAuctionHouseEntry(unit.getFaction()); + AuctionHouseRecord ahEntry = Global.AuctionMgr.GetAuctionHouseEntry(unit.GetFaction()); if (ahEntry == null) return; @@ -125,7 +125,7 @@ namespace Game return; } - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionSellItem - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); @@ -133,7 +133,7 @@ namespace Game } uint houseId = 0; - AuctionHouseRecord auctionHouseEntry = Global.AuctionMgr.GetAuctionHouseEntry(creature.getFaction(), ref houseId); + AuctionHouseRecord auctionHouseEntry = Global.AuctionMgr.GetAuctionHouseEntry(creature.GetFaction(), ref houseId); if (auctionHouseEntry == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionSellItem - {0} has wrong faction.", packet.Auctioneer.ToString()); @@ -166,7 +166,7 @@ namespace Game } if (Global.AuctionMgr.GetAItem(items[i].GetGUID().GetCounter()) || !items[i].CanBeTraded() || items[i].IsNotEmptyBag() || - items[i].GetTemplate().GetFlags().HasAnyFlag(ItemFlags.Conjured) || items[i].GetUInt32Value(ItemFields.Duration) != 0 || + items[i].GetTemplate().GetFlags().HasAnyFlag(ItemFlags.Conjured) || items[i].m_itemData.Expiration != 0 || items[i].GetCount() < packet.Items[i].UseCount) { SendAuctionCommandResult(null, AuctionAction.SellItem, AuctionError.DatabaseError); @@ -218,7 +218,7 @@ namespace Game Item item = items[0]; uint auctionTime = (uint)(packet.RunTime * WorldConfig.GetFloatValue(WorldCfg.RateAuctionTime)); - AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.getFaction()); + AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); ulong deposit = Global.AuctionMgr.GetAuctionDeposit(auctionHouseEntry, packet.RunTime, item, finalCount); if (!GetPlayer().HasEnoughMoney(deposit)) @@ -358,7 +358,7 @@ namespace Game if (packet.AuctionItemID == 0 || packet.BidAmount == 0) return; // check for cheaters - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionPlaceBid - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); @@ -369,7 +369,7 @@ namespace Game if (GetPlayer().HasUnitState(UnitState.Died)) GetPlayer().RemoveAurasByType(AuraType.FeignDeath); - AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.getFaction()); + AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); AuctionEntry auction = auctionHouse.GetAuction(packet.AuctionItemID); Player player = GetPlayer(); @@ -480,7 +480,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.AuctionRemoveItem)] void HandleAuctionRemoveItem(AuctionRemoveItem packet) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionRemoveItem - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); @@ -491,7 +491,7 @@ namespace Game if (GetPlayer().HasUnitState(UnitState.Died)) GetPlayer().RemoveAurasByType(AuraType.FeignDeath); - AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.getFaction()); + AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); AuctionEntry auction = auctionHouse.GetAuction((uint)packet.AuctionItemID); Player player = GetPlayer(); @@ -546,7 +546,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.AuctionListBidderItems)] void HandleAuctionListBidderItems(AuctionListBidderItems packet) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionListBidderItems - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); @@ -557,7 +557,7 @@ namespace Game if (GetPlayer().HasUnitState(UnitState.Died)) GetPlayer().RemoveAurasByType(AuraType.FeignDeath); - AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.getFaction()); + AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); AuctionListBidderItemsResult result = new AuctionListBidderItemsResult(); @@ -570,7 +570,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.AuctionListOwnerItems)] void HandleAuctionListOwnerItems(AuctionListOwnerItems packet) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionListOwnerItems - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); @@ -581,7 +581,7 @@ namespace Game if (GetPlayer().HasUnitState(UnitState.Died)) GetPlayer().RemoveAurasByType(AuraType.FeignDeath); - AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.getFaction()); + AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); AuctionListOwnerItemsResult result = new AuctionListOwnerItemsResult(); @@ -593,7 +593,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.AuctionListItems)] void HandleAuctionListItems(AuctionListItems packet) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionListItems - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); @@ -604,7 +604,7 @@ namespace Game if (GetPlayer().HasUnitState(UnitState.Died)) GetPlayer().RemoveAurasByType(AuraType.FeignDeath); - AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.getFaction()); + AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); Optional filters = new Optional(); @@ -647,7 +647,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.AuctionReplicateItems)] void HandleReplicateItems(AuctionReplicateItems packet) { - /* Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(packet.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER); + /* Creature* creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER); if (!creature) { TC_LOG_DEBUG("network", "WORLD: HandleReplicateItems - {0} not found or you can't interact with him.", packet.Auctioneer.ToString().c_str()); @@ -655,14 +655,14 @@ namespace Game } // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) - GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); + if (GetPlayer().HasUnitState(UNIT_STATE_DIED)) + GetPlayer().RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); - AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); + AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(creature.getFaction()); WorldPackets::AuctionHouse::AuctionReplicateResponse response; - auctionHouse->BuildReplicate(response, GetPlayer(), packet.ChangeNumberGlobal, packet.ChangeNumberCursor, packet.ChangeNumberTombstone, packet.Count); + auctionHouse.BuildReplicate(response, GetPlayer(), packet.ChangeNumberGlobal, packet.ChangeNumberCursor, packet.ChangeNumberTombstone, packet.Count); */ //@todo implement this properly AuctionReplicateResponse response = new AuctionReplicateResponse(); diff --git a/Source/Game/Handlers/BankHandler.cs b/Source/Game/Handlers/BankHandler.cs index 8d6c1ee73..ffdb68465 100644 --- a/Source/Game/Handlers/BankHandler.cs +++ b/Source/Game/Handlers/BankHandler.cs @@ -61,7 +61,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.BankerActivate)] void HandleBankerActivate(Hello packet) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Banker); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Banker, NPCFlags2.None); if (!unit) { Log.outError(LogFilter.Network, "HandleBankerActivate: {0} not found or you can not interact with him.", packet.Unit.ToString()); diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index c704708ba..adbbb2243 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -34,7 +34,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.BattlemasterHello)] void HandleBattlemasterHello(Hello hello) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(hello.Unit, NPCFlags.BattleMaster); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(hello.Unit, NPCFlags.BattleMaster, NPCFlags2.None); if (!unit) return; diff --git a/Source/Game/Handlers/BattlePetHandler.cs b/Source/Game/Handlers/BattlePetHandler.cs index 529dfac8e..d3a54fbac 100644 --- a/Source/Game/Handlers/BattlePetHandler.cs +++ b/Source/Game/Handlers/BattlePetHandler.cs @@ -82,7 +82,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.BattlePetSummon, Processing = PacketProcessing.Inplace)] void HandleBattlePetSummon(BattlePetSummon battlePetSummon) { - if (_player.GetGuidValue(ActivePlayerFields.SummonedBattlePetId) != battlePetSummon.PetGuid) + if (_player.m_activePlayerData.SummonedBattlePetGUID != battlePetSummon.PetGuid) GetBattlePetMgr().SummonPet(battlePetSummon.PetGuid); else GetBattlePetMgr().DismissPet(); diff --git a/Source/Game/Handlers/BlackMarketHandlers.cs b/Source/Game/Handlers/BlackMarketHandlers.cs index de53a67bd..6005de7f9 100644 --- a/Source/Game/Handlers/BlackMarketHandlers.cs +++ b/Source/Game/Handlers/BlackMarketHandlers.cs @@ -29,7 +29,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.BlackMarketOpen)] void HandleBlackMarketOpen(BlackMarketOpen blackMarketOpen) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(blackMarketOpen.Guid, NPCFlags.BlackMarket | NPCFlags.BlackMarketView); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(blackMarketOpen.Guid, NPCFlags.BlackMarket, NPCFlags2.BlackMarketView); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleBlackMarketHello - {0} not found or you can't interact with him.", blackMarketOpen.Guid.ToString()); @@ -57,7 +57,7 @@ namespace Game if (!Global.BlackMarketMgr.IsEnabled()) return; - Creature unit = GetPlayer().GetNPCIfCanInteractWith(blackMarketRequestItems.Guid, NPCFlags.BlackMarket | NPCFlags.BlackMarketView); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(blackMarketRequestItems.Guid, NPCFlags.BlackMarket, NPCFlags2.BlackMarketView); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleBlackMarketRequestItems - {0} not found or you can't interact with him.", blackMarketRequestItems.Guid.ToString()); @@ -76,7 +76,7 @@ namespace Game return; Player player = GetPlayer(); - Creature unit = player.GetNPCIfCanInteractWith(blackMarketBidOnItem.Guid, NPCFlags.BlackMarket); + Creature unit = player.GetNPCIfCanInteractWith(blackMarketBidOnItem.Guid, NPCFlags.BlackMarket, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleBlackMarketBidOnItem - {0} not found or you can't interact with him.", blackMarketBidOnItem.Guid.ToString()); @@ -146,7 +146,6 @@ namespace Game packet.MarketID = entry.GetMarketId(); packet.Item = new ItemInstance(item); - packet.RandomPropertiesID = item.GetItemRandomPropertyId(); SendPacket(packet); } diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index ee0981f6d..b396a158d 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -236,10 +236,10 @@ namespace Game return; } - //if (raceExpansionRequirement->AchievementId && !) + //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); + // GetAccountExpansion(), GetAccountId(), raceExpansionRequirement.AchievementId, charCreate.CreateInfo.Race); // SendCharCreate(CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT); // return; //} @@ -477,7 +477,7 @@ namespace Game Log.outInfo(LogFilter.Player, "Account: {0} (IP: {1}) Create Character: {2} {3}", GetAccountId(), GetRemoteAddress(), createInfo.Name, newChar.GetGUID().ToString()); Global.ScriptMgr.OnPlayerCreate(newChar); - Global.WorldMgr.AddCharacterInfo(newChar.GetGUID(), GetAccountId(), newChar.GetName(), newChar.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender), (byte)newChar.GetRace(), (byte)newChar.GetClass(), (byte)newChar.getLevel(), false); + Global.WorldMgr.AddCharacterInfo(newChar.GetGUID(), GetAccountId(), newChar.GetName(), newChar.m_playerData.NativeSex, (byte)newChar.GetRace(), (byte)newChar.GetClass(), (byte)newChar.getLevel(), false); newChar.CleanupsBeforeDelete(); } @@ -632,7 +632,7 @@ namespace Game return; } - pCurrChar.SetUInt32Value(PlayerFields.VirtualRealm, Global.WorldMgr.GetVirtualRealmAddress()); + pCurrChar.SetVirtualPlayerRealm(Global.WorldMgr.GetVirtualRealmAddress()); SendTutorialsData(); @@ -665,10 +665,10 @@ namespace Game // Send PVPSeason { PVPSeason season = new PVPSeason(); - season.PreviousSeason = (WorldConfig.GetUIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1u : 0u)); + season.PreviousSeason = (WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1 : 0)); if (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress)) - season.CurrentSeason = WorldConfig.GetUIntValue(WorldCfg.ArenaSeasonId); + season.CurrentSeason = WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId); SendPacket(season); } @@ -793,10 +793,10 @@ namespace Game pCurrChar.LoadPet(); // Set FFA PvP for non GM in non-rest mode - if (Global.WorldMgr.IsFFAPvPRealm() && !pCurrChar.IsGameMaster() && !pCurrChar.HasFlag(PlayerFields.Flags, PlayerFlags.Resting)) - pCurrChar.SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + if (Global.WorldMgr.IsFFAPvPRealm() && !pCurrChar.IsGameMaster() && !pCurrChar.HasPlayerFlag(PlayerFlags.Resting)) + pCurrChar.AddPvpFlag(UnitPVPStateFlags.FFAPvp); - if (pCurrChar.HasFlag(PlayerFields.Flags, PlayerFlags.ContestedPVP)) + if (pCurrChar.HasPlayerFlag(PlayerFlags.ContestedPVP)) pCurrChar.SetContestedPvP(); // Apply at_login requests @@ -945,7 +945,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.SetWatchedFaction)] void HandleSetWatchedFaction(SetWatchedFaction packet) { - GetPlayer().SetInt32Value(ActivePlayerFields.WatchedFactionIndex, (int)packet.FactionIndex); + GetPlayer().SetWatchedFactionIndex(packet.FactionIndex); } [WorldPacketHandler(ClientOpcodes.SetFactionInactive)] @@ -1099,19 +1099,19 @@ namespace Game void HandleAlterAppearance(AlterApperance packet) { BarberShopStyleRecord bs_hair = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewHairStyle); - if (bs_hair == null || bs_hair.Type != 0 || bs_hair.Race != (byte)GetPlayer().GetRace() || bs_hair.Sex != GetPlayer().GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender)) + if (bs_hair == null || bs_hair.Type != 0 || bs_hair.Race != (byte)GetPlayer().GetRace() || bs_hair.Sex != GetPlayer().m_playerData.NativeSex) return; BarberShopStyleRecord bs_facialHair = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewFacialHair); - if (bs_facialHair == null || bs_facialHair.Type != 2 || bs_facialHair.Race != (byte)GetPlayer().GetRace() || bs_facialHair.Sex != GetPlayer().GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender)) + if (bs_facialHair == null || bs_facialHair.Type != 2 || bs_facialHair.Race != (byte)GetPlayer().GetRace() || bs_facialHair.Sex != GetPlayer().m_playerData.NativeSex) return; BarberShopStyleRecord bs_skinColor = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewSkinColor); - if (bs_skinColor != null && (bs_skinColor.Type != 3 || bs_skinColor.Race != (byte)GetPlayer().GetRace() || bs_skinColor.Sex != GetPlayer().GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender))) + if (bs_skinColor != null && (bs_skinColor.Type != 3 || bs_skinColor.Race != (byte)GetPlayer().GetRace() || bs_skinColor.Sex != GetPlayer().m_playerData.NativeSex)) return; BarberShopStyleRecord bs_face = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewFace); - if (bs_face != null && (bs_face.Type != 4 || bs_face.Race != (byte)GetPlayer().GetRace() || bs_face.Sex != GetPlayer().GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender))) + if (bs_face != null && (bs_face.Type != 4 || bs_face.Race != (byte)GetPlayer().GetRace() || bs_face.Sex != GetPlayer().m_playerData.NativeSex)) return; Array customDisplayEntries = new Array(PlayerConst.CustomDisplaySize); @@ -1119,16 +1119,16 @@ namespace Game for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) { BarberShopStyleRecord bs_customDisplay = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewCustomDisplay[i]); - if (bs_customDisplay != null && (bs_customDisplay.Type != 5 + i || bs_customDisplay.Race != (byte)_player.GetRace() || bs_customDisplay.Sex != _player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender))) + if (bs_customDisplay != null && (bs_customDisplay.Type != 5 + i || bs_customDisplay.Race != (byte)_player.GetRace() || bs_customDisplay.Sex != _player.m_playerData.NativeSex)) return; customDisplayEntries[i] = bs_customDisplay; customDisplay[i] = (byte)(bs_customDisplay != null ? bs_customDisplay.Data : 0); } - if (!Player.ValidateAppearance(GetPlayer().GetRace(), GetPlayer().GetClass(), (Gender)GetPlayer().GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender), - bs_hair.Data, (byte)packet.NewHairColor, bs_face != null ? bs_face.Data : GetPlayer().GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId), - bs_facialHair.Data, (bs_skinColor != null ? bs_skinColor.Data : GetPlayer().GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId)), customDisplay)) + if (!Player.ValidateAppearance(GetPlayer().GetRace(), GetPlayer().GetClass(), (Gender)(byte)GetPlayer().m_playerData.NativeSex, + bs_hair.Data, (byte)packet.NewHairColor, bs_face != null ? bs_face.Data : GetPlayer().m_playerData.FaceID, + bs_facialHair.Data, bs_skinColor != null ? bs_skinColor.Data : GetPlayer().m_playerData.SkinID, customDisplay)) return; GameObject go = GetPlayer().FindNearestGameObjectOfType(GameObjectTypes.BarberChair, 5.0f); @@ -1156,16 +1156,16 @@ namespace Game _player.ModifyMoney(-cost); _player.UpdateCriteria(CriteriaTypes.GoldSpentAtBarber, cost); - _player.SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId, bs_hair.Data); - _player.SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId, (byte)packet.NewHairColor); - _player.SetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle, bs_facialHair.Data); + _player.SetHairStyleId(bs_hair.Data); + _player.SetHairColorId((byte)packet.NewHairColor); + _player.SetFacialHairStyleId(bs_facialHair.Data); if (bs_skinColor != null) - GetPlayer().SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId, bs_skinColor.Data); + GetPlayer().SetSkinId(bs_skinColor.Data); if (bs_face != null) - _player.SetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId, bs_face.Data); + _player.SetFaceId(bs_face.Data); for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) - _player.SetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i), customDisplay[i]); + _player.SetCustomDisplayOption(i, customDisplay[i]); _player.UpdateCriteria(CriteriaTypes.VisitBarberShop, 1); @@ -1929,20 +1929,13 @@ namespace Game // Title conversion if (!string.IsNullOrEmpty(knownTitlesStr)) { - uint ktcount = PlayerConst.KnowTitlesSize * 2; - uint[] knownTitles = new uint[ktcount]; + List knownTitles = new List(); var tokens = new StringArray(knownTitlesStr, ' '); - if (tokens.Length != ktcount) - { - SendCharFactionChange(ResponseCodes.CharCreateError, factionChangeInfo); - return; - } - - for (int index = 0; index < ktcount; ++index) + for (int index = 0; index < tokens.Length; ++index) { if (uint.TryParse(tokens[index], out uint id)) - knownTitles[index] = id; + knownTitles.Add(id); } foreach (var it in Global.ObjectMgr.FactionChangeTitles) @@ -1956,9 +1949,12 @@ namespace Game if (newTeamId == TeamId.Alliance) { uint maskID = htitleInfo.MaskID; - uint index = maskID / 32; + int index = (int)maskID / 32; + if (index >= knownTitles.Count) + continue; + uint old_flag = (uint)(1 << (int)(maskID % 32)); - uint new_flag = (uint)(1 << (int)(atitleInfo.MaskID % 32)); + uint new_flag = (uint)(1 << (atitleInfo.MaskID % 32)); if (Convert.ToBoolean(knownTitles[index] & old_flag)) { knownTitles[index] &= ~old_flag; @@ -1969,9 +1965,12 @@ namespace Game else { uint maskID = atitleInfo.MaskID; - uint index = maskID / 32; + int index = (int)maskID / 32; + if (index >= knownTitles.Count) + continue; + uint old_flag = (uint)(1 << (int)(maskID % 32)); - uint new_flag = (uint)(1 << (int)(htitleInfo.MaskID % 32)); + uint new_flag = (uint)(1 << (htitleInfo.MaskID % 32)); if (Convert.ToBoolean(knownTitles[index] & old_flag)) { knownTitles[index] &= ~old_flag; @@ -1981,7 +1980,7 @@ namespace Game } string ss = ""; - for (uint index = 0; index < ktcount; ++index) + for (int index = 0; index < knownTitles.Count; ++index) ss += knownTitles[index] + ' '; stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHAR_TITLES_FACTION_CHANGE); @@ -2009,7 +2008,7 @@ namespace Game void HandleOpeningCinematic(OpeningCinematic packet) { // Only players that has not yet gained any experience can use this - if (GetPlayer().GetUInt32Value(ActivePlayerFields.Xp) != 0) + if (GetPlayer().m_activePlayerData.XP != 0) return; ChrClassesRecord classEntry = CliDB.ChrClassesStorage.LookupByKey(GetPlayer().GetClass()); @@ -2142,7 +2141,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.RepopRequest)] void HandleRepopRequest(RepopRequest packet) { - if (GetPlayer().IsAlive() || GetPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) + if (GetPlayer().IsAlive() || GetPlayer().HasPlayerFlag(PlayerFlags.Ghost)) return; if (GetPlayer().HasAuraType(AuraType.PreventResurrection)) @@ -2169,7 +2168,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.ClientPortGraveyard)] void HandlePortGraveyard(PortGraveyard packet) { - if (GetPlayer().IsAlive() || !GetPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) + if (GetPlayer().IsAlive() || !GetPlayer().HasPlayerFlag(PlayerFlags.Ghost)) return; GetPlayer().RepopAtGraveyard(); } @@ -2217,7 +2216,7 @@ namespace Game return; // body not released yet - if (!GetPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) + if (!GetPlayer().HasPlayerFlag(PlayerFlags.Ghost)) return; Corpse corpse = GetPlayer().GetCorpse(); diff --git a/Source/Game/Handlers/ChatHandler.cs b/Source/Game/Handlers/ChatHandler.cs index d8ca3fc14..81a4bf5ff 100644 --- a/Source/Game/Handlers/ChatHandler.cs +++ b/Source/Game/Handlers/ChatHandler.cs @@ -539,8 +539,7 @@ namespace Game return; Global.ScriptMgr.OnPlayerClearEmote(GetPlayer()); - if (GetPlayer().GetUInt32Value(UnitFields.NpcEmotestate) != 0) - GetPlayer().SetUInt32Value(UnitFields.NpcEmotestate, 0); + GetPlayer().SetEmoteState(Emote.OneshotNone); } [WorldPacketHandler(ClientOpcodes.SendTextEmote)] @@ -573,7 +572,7 @@ namespace Game break; case Emote.StateDance: case Emote.StateRead: - GetPlayer().SetUInt32Value(UnitFields.NpcEmotestate, emote_anim); + GetPlayer().SetEmoteState((Emote)emote_anim); break; default: // Only allow text-emotes for "dead" entities (feign death included) diff --git a/Source/Game/Handlers/GarrisonHandler.cs b/Source/Game/Handlers/GarrisonHandler.cs index 009919a4c..778247439 100644 --- a/Source/Game/Handlers/GarrisonHandler.cs +++ b/Source/Game/Handlers/GarrisonHandler.cs @@ -35,7 +35,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.GarrisonPurchaseBuilding)] void HandleGarrisonPurchaseBuilding(GarrisonPurchaseBuilding garrisonPurchaseBuilding) { - if (!_player.GetNPCIfCanInteractWith(garrisonPurchaseBuilding.NpcGUID, NPCFlags.GarrisonArchitect)) + if (!_player.GetNPCIfCanInteractWith(garrisonPurchaseBuilding.NpcGUID, NPCFlags.None, NPCFlags2.GarrisonArchitect)) return; Garrison garrison = _player.GetGarrison(); @@ -46,7 +46,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.GarrisonCancelConstruction)] void HandleGarrisonCancelConstruction(GarrisonCancelConstruction garrisonCancelConstruction) { - if (!_player.GetNPCIfCanInteractWith(garrisonCancelConstruction.NpcGUID, NPCFlags.GarrisonArchitect)) + if (!_player.GetNPCIfCanInteractWith(garrisonCancelConstruction.NpcGUID, NPCFlags.None, NPCFlags2.GarrisonArchitect)) return; Garrison garrison = _player.GetGarrison(); diff --git a/Source/Game/Handlers/GuildHandler.cs b/Source/Game/Handlers/GuildHandler.cs index 75a87e8a8..f197574b7 100644 --- a/Source/Game/Handlers/GuildHandler.cs +++ b/Source/Game/Handlers/GuildHandler.cs @@ -189,7 +189,7 @@ namespace Game Guild.EmblemInfo emblemInfo = new Guild.EmblemInfo(); emblemInfo.ReadPacket(packet); - if (GetPlayer().GetNPCIfCanInteractWith(packet.Vendor, NPCFlags.TabardDesigner)) + if (GetPlayer().GetNPCIfCanInteractWith(packet.Vendor, NPCFlags.TabardDesigner, NPCFlags2.None)) { // Remove fake death if (GetPlayer().HasUnitState(UnitState.Died)) @@ -395,7 +395,10 @@ namespace Game [WorldPacketHandler(ClientOpcodes.DeclineGuildInvites)] void HandleDeclineGuildInvites(DeclineGuildInvites packet) { - GetPlayer().ApplyModFlag(PlayerFields.Flags, PlayerFlags.AutoDeclineGuild, packet.Allow); + if (packet.Allow) + GetPlayer().AddPlayerFlag(PlayerFlags.AutoDeclineGuild); + else + GetPlayer().RemovePlayerFlag(PlayerFlags.AutoDeclineGuild); } [WorldPacketHandler(ClientOpcodes.RequestGuildRewardsList, Processing = PacketProcessing.Inplace)] diff --git a/Source/Game/Handlers/InspectHandler.cs b/Source/Game/Handlers/InspectHandler.cs index 9377c00a8..fc0b3600e 100644 --- a/Source/Game/Handlers/InspectHandler.cs +++ b/Source/Game/Handlers/InspectHandler.cs @@ -1,4 +1,5 @@ -/* + +/* * Copyright (C) 2012-2019 CypherCore * * This program is free software: you can redistribute it and/or modify @@ -42,17 +43,7 @@ namespace Game return; InspectResult inspectResult = new InspectResult(); - inspectResult.InspecteeGUID = inspect.Target; - - for (byte i = 0; i < EquipmentSlot.End; ++i) - { - Item item = player.GetItemByPos(InventorySlots.Bag0, i); - if (item) - inspectResult.Items.Add(new InspectItemData(item, i)); - } - - inspectResult.ClassID = player.GetClass(); - inspectResult.GenderID = (Gender)player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender); + inspectResult.DisplayInfo.Initialize(player); if (GetPlayer().CanBeGameMaster() || WorldConfig.GetIntValue(WorldCfg.TalentsInspecting) + (GetPlayer().GetTeamId() == player.GetTeamId() ? 1 : 0) > 1) { @@ -76,13 +67,11 @@ namespace Game inspectResult.GuildData.Set(guildData); } - inspectResult.InspecteeGUID = inspect.Target; - inspectResult.SpecializationID = (int)player.GetUInt32Value(PlayerFields.CurrentSpecId); - inspectResult.LifetimeMaxRank = player.GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetLifetimeMaxPvpRank); - inspectResult.TodayHK = player.GetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetTodayKills); - inspectResult.YesterdayHK = player.GetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetYesterdayKills); - inspectResult.LifetimeHK = player.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills); - inspectResult.HonorLevel = player.GetUInt32Value(PlayerFields.HonorLevel); + inspectResult.LifetimeMaxRank = player.m_activePlayerData.LifetimeMaxRank; + inspectResult.TodayHK = player.m_activePlayerData.TodayHonorableKills; + inspectResult.YesterdayHK = player.m_activePlayerData.YesterdayHonorableKills; + inspectResult.LifetimeHK = player.m_activePlayerData.LifetimeHonorableKills; + inspectResult.HonorLevel = player.m_playerData.HonorLevel; SendPacket(inspectResult); } diff --git a/Source/Game/Handlers/ItemHandler.cs b/Source/Game/Handlers/ItemHandler.cs index e652d1ba4..3587559ff 100644 --- a/Source/Game/Handlers/ItemHandler.cs +++ b/Source/Game/Handlers/ItemHandler.cs @@ -226,7 +226,7 @@ namespace Game return; } - if (!dstItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Child)) + if (!dstItem.HasItemFlag(ItemFieldFlags.Child)) { // check dest.src move possibility List sSrc = new List(); @@ -283,7 +283,7 @@ namespace Game } else { - Item parentItem = _player.GetItemByGuid(dstItem.GetGuidValue(ItemFields.Creator)); + Item parentItem = _player.GetItemByGuid(dstItem.GetCreator()); if (parentItem) { if (Player.IsEquipmentPos(dest)) @@ -361,7 +361,7 @@ namespace Game { // @todo: 6.x research new values /*WorldPackets.Item.ReadItemResultFailed packet; - packet.Item = item->GetGUID(); + packet.Item = item.GetGUID(); packet.Subcode = ??; packet.Delay = ??; SendPacket(packet);*/ @@ -382,7 +382,7 @@ namespace Game var pl = GetPlayer(); - Creature creature = pl.GetNPCIfCanInteractWith(packet.VendorGUID, NPCFlags.Vendor); + Creature creature = pl.GetNPCIfCanInteractWith(packet.VendorGUID, NPCFlags.Vendor, NPCFlags2.None); if (creature == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleSellItemOpcode - {0} not found or you can not interact with him.", packet.VendorGUID.ToString()); @@ -421,7 +421,7 @@ namespace Game // prevent selling item for sellprice when the item is still refundable // this probably happens when right clicking a refundable item, the client sends both // CMSG_SELL_ITEM and CMSG_REFUND_ITEM (unverified) - if (pItem.HasFlag(ItemFields.Flags, ItemFieldFlags.Refundable)) + if (pItem.HasItemFlag(ItemFieldFlags.Refundable)) return; // Therefore, no feedback to client // special case at auto sell (sell all) @@ -492,7 +492,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.BuyBackItem)] void HandleBuybackItem(BuyBackItem packet) { - Creature creature = _player.GetNPCIfCanInteractWith(packet.VendorGUID, NPCFlags.Vendor); + Creature creature = _player.GetNPCIfCanInteractWith(packet.VendorGUID, NPCFlags.Vendor, NPCFlags2.None); if (creature == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleBuybackItem - {0} not found or you can not interact with him.", packet.VendorGUID.ToString()); @@ -507,7 +507,7 @@ namespace Game Item pItem = _player.GetItemFromBuyBackSlot(packet.Slot); if (pItem != null) { - uint price = _player.GetUInt32Value(ActivePlayerFields.BuyBackPrice + (int)(packet.Slot - InventorySlots.BuyBackStart)); + uint price = _player.m_activePlayerData.BuybackPrice[(int)(packet.Slot - InventorySlots.BuyBackStart)]; if (!_player.HasEnoughMoney(price)) { _player.SendBuyError(BuyResult.NotEnoughtMoney, creature, pItem.GetEntry()); @@ -684,7 +684,7 @@ namespace Game return; } - if (item.GetUInt64Value(ItemFields.GiftCreator) != 0) // HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED); + if (!item.GetGiftCreator().IsEmpty()) // HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED); { GetPlayer().SendEquipError(InventoryResult.CantWrapWrapped, item); return; @@ -721,7 +721,7 @@ namespace Game stmt.AddValue(0, item.GetOwnerGUID().GetCounter()); stmt.AddValue(1, item.GetGUID().GetCounter()); stmt.AddValue(2, item.GetEntry()); - stmt.AddValue(3, item.GetUInt32Value(ItemFields.Flags)); + stmt.AddValue(3, (uint)item.m_itemData.DynamicFlags); trans.Append(stmt); item.SetEntry(gift.GetEntry()); @@ -748,8 +748,8 @@ namespace Game break; } - item.SetGuidValue(ItemFields.GiftCreator, GetPlayer().GetGUID()); - item.SetUInt32Value(ItemFields.Flags, (uint)ItemFieldFlags.Wrapped); + item.SetGiftCreator(GetPlayer().GetGUID()); + item.SetItemFlags(ItemFieldFlags.Wrapped); item.SetState(ItemUpdateState.Changed, GetPlayer()); if (item.GetState() == ItemUpdateState.New) // save new item, to have alway for `character_gifts` record in `item_instance` @@ -789,7 +789,7 @@ namespace Game Item[] gems = new Item[ItemConst.MaxGemSockets]; ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets]; GemPropertiesRecord[] gemProperties = new GemPropertiesRecord[ItemConst.MaxGemSockets]; - ItemDynamicFieldGems[] oldGemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets]; + SocketedGem[] oldGemData = new SocketedGem[ItemConst.MaxGemSockets]; for (int i = 0; i < ItemConst.MaxGemSockets; ++i) @@ -799,9 +799,9 @@ namespace Game { gems[i] = gem; gemData[i].ItemId = gem.GetEntry(); - gemData[i].Context = (byte)gem.GetUInt32Value(ItemFields.Context); - for (ushort b = 0; b < gem.GetDynamicValues(ItemDynamicFields.BonusListIds).Length && b < 16; ++b) - gemData[i].BonusListIDs[b] = (ushort)gem.GetDynamicValue(ItemDynamicFields.BonusListIds, b); + gemData[i].Context = (byte)gem.m_itemData.Context; + for (int b = 0; b < ((List)gem.m_itemData.BonusListIDs).Count && b < 16; ++b) + gemData[i].BonusListIDs[b] = (ushort)((List)gem.m_itemData.BonusListIDs)[b]; gemProperties[i] = CliDB.GemPropertiesStorage.LookupByKey(gem.GetTemplate().GetGemProperties()); } @@ -1037,7 +1037,7 @@ namespace Game if (!isUsingBankCommand) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(bankerGUID, NPCFlags.Banker); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(bankerGUID, NPCFlags.Banker, NPCFlags2.None); if (!creature) return false; } @@ -1069,69 +1069,6 @@ namespace Game GetPlayer().DestroyItem(item.GetBagSlot(), item.GetSlot(), true); } - [WorldPacketHandler(ClientOpcodes.UpgradeItem)] - void HandleUpgradeItem(UpgradeItem upgradeItem) - { - ItemUpgradeResult itemUpgradeResult = new ItemUpgradeResult(); - if (!_player.GetNPCIfCanInteractWith(upgradeItem.ItemMaster, NPCFlags.ItemUpgradeMaster)) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleUpgradeItems - {0} not found or player can't interact with it.", upgradeItem.ItemMaster.ToString()); - itemUpgradeResult.Success = false; - SendPacket(itemUpgradeResult); - return; - } - - Item item = _player.GetItemByGuid(upgradeItem.ItemGUID); - if (!item) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleUpgradeItems: Item {0} not found!", upgradeItem.ItemGUID.ToString()); - itemUpgradeResult.Success = false; - SendPacket(itemUpgradeResult); - return; - } - - ItemUpgradeRecord itemUpgradeEntry = CliDB.ItemUpgradeStorage.LookupByKey(upgradeItem.UpgradeID); - if (itemUpgradeEntry == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleUpgradeItems - ItemUpgradeEntry ({0}) not found.", upgradeItem.UpgradeID); - itemUpgradeResult.Success = false; - SendPacket(itemUpgradeResult); - return; - } - - // Check if player has enough currency - if (!_player.HasCurrency(itemUpgradeEntry.CurrencyType, itemUpgradeEntry.CurrencyAmount)) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleUpgradeItems - Player has not enougth currency (ID: {0}, Cost: {1}) not found.", itemUpgradeEntry.CurrencyType, itemUpgradeEntry.CurrencyAmount); - itemUpgradeResult.Success = false; - SendPacket(itemUpgradeResult); - return; - } - - uint currentUpgradeId = item.GetModifier(ItemModifier.UpgradeId); - if (currentUpgradeId != itemUpgradeEntry.PrerequisiteID) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleUpgradeItems - ItemUpgradeEntry ({0}) is not related to this ItemUpgradePath ({1}).", itemUpgradeEntry.Id, currentUpgradeId); - itemUpgradeResult.Success = false; - SendPacket(itemUpgradeResult); - return; - } - - itemUpgradeResult.Success = true; - SendPacket(itemUpgradeResult); - - if (item.IsEquipped()) - _player._ApplyItemBonuses(item, item.GetSlot(), false); - - item.SetModifier(ItemModifier.UpgradeId, itemUpgradeEntry.Id); - - if (item.IsEquipped()) - _player._ApplyItemBonuses(item, item.GetSlot(), true); - - item.SetState(ItemUpdateState.Changed, _player); - _player.ModifyCurrency((CurrencyTypes)itemUpgradeEntry.CurrencyType, -(int)itemUpgradeEntry.CurrencyAmount); - } - [WorldPacketHandler(ClientOpcodes.SortBags)] void HandleSortBags(SortBags sortBags) { @@ -1166,9 +1103,9 @@ namespace Game return; } - if (item.HasFlag(ItemFields.Flags, ItemFieldFlags.NewItem)) + if (item.HasItemFlag(ItemFieldFlags.NewItem)) { - item.RemoveFlag(ItemFields.Flags, ItemFieldFlags.NewItem); + item.RemoveItemFlag(ItemFieldFlags.NewItem); item.SetState(ItemUpdateState.Changed, _player); } } diff --git a/Source/Game/Handlers/LogoutHandler.cs b/Source/Game/Handlers/LogoutHandler.cs index 955e98902..f3e7d24ed 100644 --- a/Source/Game/Handlers/LogoutHandler.cs +++ b/Source/Game/Handlers/LogoutHandler.cs @@ -31,10 +31,10 @@ namespace Game if (!GetPlayer().GetLootGUID().IsEmpty()) GetPlayer().SendLootReleaseAll(); - bool instantLogout = (pl.HasFlag(PlayerFields.Flags, PlayerFlags.Resting) && !pl.IsInCombat() || + bool instantLogout = (pl.HasPlayerFlag(PlayerFlags.Resting) && !pl.IsInCombat() || pl.IsInFlight() || HasPermission(RBACPermissions.InstantLogout)); - bool canLogoutInCombat = pl.HasFlag(PlayerFields.Flags, PlayerFlags.Resting); + bool canLogoutInCombat = pl.HasPlayerFlag(PlayerFlags.Resting); int reason = 0; if (pl.IsInCombat() && !canLogoutInCombat) @@ -68,7 +68,7 @@ namespace Game if (pl.GetStandState() == UnitStandStateType.Stand) pl.SetStandState(UnitStandStateType.Sit); pl.SetRooted(true); - pl.SetFlag(UnitFields.Flags, UnitFlags.Stunned); + pl.AddUnitFlag(UnitFlags.Stunned); } SetLogoutStartTime(Time.UnixTime); @@ -95,7 +95,7 @@ namespace Game GetPlayer().SetStandState(UnitStandStateType.Stand); //! DISABLE_ROTATE - GetPlayer().RemoveFlag(UnitFields.Flags, UnitFlags.Stunned); + GetPlayer().RemoveUnitFlag(UnitFlags.Stunned); } } } diff --git a/Source/Game/Handlers/LootHandler.cs b/Source/Game/Handlers/LootHandler.cs index b09c501ec..a851204a0 100644 --- a/Source/Game/Handlers/LootHandler.cs +++ b/Source/Game/Handlers/LootHandler.cs @@ -318,7 +318,7 @@ namespace Game player.SetLootGUID(ObjectGuid.Empty); player.SendLootRelease(lguid); - player.RemoveFlag(UnitFields.Flags, UnitFlags.Looting); + player.RemoveUnitFlag(UnitFlags.Looting); if (!player.IsInWorld) return; @@ -343,7 +343,7 @@ namespace Game if (go.GetGoType() == GameObjectTypes.FishingHole) { // The fishing hole used once more go.AddUse(); // if the max usage is reached, will be despawned in next tick - if (go.GetUseCount() >= go.m_goValue.FishingHole.MaxOpens) + if (go.GetUseCount() >= go.GetGoValue().FishingHole.MaxOpens) go.SetLootState(LootState.JustDeactivated); else go.SetLootState(LootState.Ready); @@ -374,7 +374,7 @@ namespace Game if (loot.isLooted()) { loot.clear(); - corpse.RemoveFlag(CorpseFields.DynamicFlags, 0x0001); + corpse.RemoveCorpseDynamicFlag(CorpseDynFlags.Lootable); } } else if (lguid.IsItem()) @@ -417,7 +417,7 @@ namespace Game loot = creature.loot; if (loot.isLooted()) { - creature.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); + creature.RemoveDynamicFlag(UnitDynFlags.Lootable); // skip pickpocketing loot for speed, skinning timer reduction is no-op in fact if (!creature.IsAlive()) @@ -437,11 +437,10 @@ namespace Game { if (group.GetLootMethod() != LootMethod.MasterLoot) group.SendLooter(creature, null); - - } // force dynflag update to update looter and lootable info - creature.ForceValuesUpdateAtIndex(ObjectFields.DynamicFlags); + creature.m_values.ModifyValue(creature.m_objectData).ModifyValue(creature.m_objectData.DynamicFlags); + creature.ForceUpdateFieldChange(); } } } @@ -542,7 +541,7 @@ namespace Game } // not move item from loot to target inventory - Item newitem = target.StoreNewItem(dest, item.itemid, true, item.randomPropertyId, item.GetAllowedLooters(), item.context, item.BonusListIDs); + Item newitem = target.StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); target.SendNewItem(newitem, item.count, false, false, true); target.UpdateCriteria(CriteriaTypes.LootItem, item.itemid, item.count); target.UpdateCriteria(CriteriaTypes.LootType, item.itemid, item.count, (ulong)loot.loot_type); diff --git a/Source/Game/Handlers/MailHandler.cs b/Source/Game/Handlers/MailHandler.cs index f1266438f..e0e439922 100644 --- a/Source/Game/Handlers/MailHandler.cs +++ b/Source/Game/Handlers/MailHandler.cs @@ -48,7 +48,7 @@ namespace Game } else if (guid.IsAnyTypeCreature()) { - if (!GetPlayer().GetNPCIfCanInteractWith(guid, NPCFlags.Mailbox)) + if (!GetPlayer().GetNPCIfCanInteractWith(guid, NPCFlags.Mailbox, NPCFlags2.None)) return false; } else @@ -237,13 +237,13 @@ namespace Game return; } - if (item.GetTemplate().GetFlags().HasAnyFlag(ItemFlags.Conjured) || item.GetUInt32Value(ItemFields.Duration) != 0) + if (item.GetTemplate().GetFlags().HasAnyFlag(ItemFlags.Conjured) || item.m_itemData.Expiration != 0) { player.SendMailResult(0, MailResponseType.Send, MailResponseResult.EquipError, InventoryResult.MailBoundItem); return; } - if (packet.Info.Cod != 0 && item.HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped)) + if (packet.Info.Cod != 0 && item.HasItemFlag(ItemFieldFlags.Wrapped)) { player.SendMailResult(0, MailResponseType.Send, MailResponseResult.CantSendWrappedCod); return; @@ -624,9 +624,9 @@ namespace Game bodyItem.SetText(m.body); if (m.messageType == MailMessageType.Normal) - bodyItem.SetGuidValue(ItemFields.Creator, ObjectGuid.Create(HighGuid.Player, m.sender)); + bodyItem.SetCreator(ObjectGuid.Create(HighGuid.Player, m.sender)); - bodyItem.SetFlag(ItemFields.Flags, ItemFieldFlags.Readable); + bodyItem.AddItemFlag(ItemFieldFlags.Readable); Log.outInfo(LogFilter.Network, "HandleMailCreateTextItem mailid={0}", packet.MailID); diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index af7c0376b..92aad9873 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -130,7 +130,7 @@ namespace Game return; } - GetPlayer().SetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles, packet.Mask); + GetPlayer().SetMultiActionBars(packet.Mask); } [WorldPacketHandler(ClientOpcodes.CompleteCinematic)] @@ -229,7 +229,7 @@ namespace Game player.GetRestMgr().SetRestFlag(RestFlag.Tavern, atEntry.Id); if (Global.WorldMgr.IsFFAPvPRealm()) - player.RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, UnitBytes2Flags.FFAPvp); + player.RemovePvpFlag(UnitPVPStateFlags.FFAPvp); return; } @@ -455,41 +455,38 @@ namespace Game [WorldPacketHandler(ClientOpcodes.TogglePvp)] void HandleTogglePvP(TogglePvP packet) { - Player player = GetPlayer(); - - bool inPvP = player.HasFlag(PlayerFields.Flags, PlayerFlags.InPVP); - player.ApplyModFlag(PlayerFields.Flags, PlayerFlags.InPVP, !inPvP); - player.ApplyModFlag(PlayerFields.Flags, PlayerFlags.PVPTimer, inPvP); - - if (player.HasFlag(PlayerFields.Flags, PlayerFlags.InPVP)) + if (GetPlayer().HasPlayerFlag(PlayerFlags.InPVP)) { - if (!player.IsPvP() || player.pvpInfo.EndTimer != 0) - player.UpdatePvP(true, true); + GetPlayer().RemovePlayerFlag(PlayerFlags.InPVP); + GetPlayer().AddPlayerFlag(PlayerFlags.PVPTimer); + if (!GetPlayer().pvpInfo.IsHostile && GetPlayer().IsPvP()) + GetPlayer().pvpInfo.EndTimer = Time.UnixTime; // start toggle-off } else { - if (!player.pvpInfo.IsHostile && player.IsPvP()) - player.pvpInfo.EndTimer = Time.UnixTime; // start toggle-off + GetPlayer().AddPlayerFlag(PlayerFlags.InPVP); + GetPlayer().RemovePlayerFlag(PlayerFlags.PVPTimer); + if (!GetPlayer().IsPvP() || GetPlayer().pvpInfo.EndTimer != 0) + GetPlayer().UpdatePvP(true, true); } } [WorldPacketHandler(ClientOpcodes.SetPvp)] void HandleSetPvP(SetPvP packet) { - Player player = GetPlayer(); - - player.ApplyModFlag(PlayerFields.Flags, PlayerFlags.InPVP, packet.EnablePVP); - player.ApplyModFlag(PlayerFields.Flags, PlayerFlags.PVPTimer, !packet.EnablePVP); - - if (player.HasFlag(PlayerFields.Flags, PlayerFlags.InPVP)) + if (!packet.EnablePVP) { - if (!player.IsPvP() || player.pvpInfo.EndTimer != 0) - player.UpdatePvP(true, true); + GetPlayer().RemovePlayerFlag(PlayerFlags.InPVP); + GetPlayer().AddPlayerFlag(PlayerFlags.PVPTimer); + if (!GetPlayer().pvpInfo.IsHostile && GetPlayer().IsPvP()) + GetPlayer().pvpInfo.EndTimer = Time.UnixTime; // start toggle-off } else { - if (!player.pvpInfo.IsHostile && player.IsPvP()) - player.pvpInfo.EndTimer = Time.UnixTime; // start set-off + GetPlayer().AddPlayerFlag(PlayerFlags.InPVP); + GetPlayer().RemovePlayerFlag(PlayerFlags.PVPTimer); + if (!GetPlayer().IsPvP() || GetPlayer().pvpInfo.EndTimer != 0) + GetPlayer().UpdatePvP(true, true); } } @@ -498,12 +495,12 @@ namespace Game { if (farSight.Enable) { - Log.outDebug(LogFilter.Network, "Added FarSight {0} to player {1}", GetPlayer().GetUInt64Value(ActivePlayerFields.Farsight), GetPlayer().GetGUID().ToString()); + Log.outDebug(LogFilter.Network, "Added FarSight {0} to player {1}", GetPlayer().m_activePlayerData.FarsightObject.ToString(), GetPlayer().GetGUID().ToString()); WorldObject target = GetPlayer().GetViewpoint(); if (target) GetPlayer().SetSeer(target); else - Log.outDebug(LogFilter.Network, "Player {0} (GUID: {1}) requests non-existing seer {2}", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), GetPlayer().GetUInt64Value(ActivePlayerFields.Farsight)); + Log.outDebug(LogFilter.Network, "Player {0} (GUID: {1}) requests non-existing seer {2}", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), GetPlayer().m_activePlayerData.FarsightObject.ToString()); } else { @@ -518,7 +515,7 @@ namespace Game void HandleSetTitle(SetTitle packet) { // -1 at none - if (packet.TitleID > 0 && packet.TitleID < PlayerConst.MaxTitleIndex) + if (packet.TitleID > 0) { if (!GetPlayer().HasTitle((uint)packet.TitleID)) return; @@ -526,7 +523,7 @@ namespace Game else packet.TitleID = 0; - GetPlayer().SetUInt32Value(PlayerFields.ChosenTitle, (uint)packet.TitleID); + GetPlayer().SetChosenTitle((uint)packet.TitleID); } [WorldPacketHandler(ClientOpcodes.ResetInstances)] @@ -602,7 +599,7 @@ namespace Game } } // the difficulty is set even if the instances can't be reset - //_player->SendDungeonDifficulty(true); + //_player.SendDungeonDifficulty(true); group.ResetInstances(InstanceResetMethod.ChangeDifficulty, false, false, GetPlayer()); group.SetDungeonDifficultyID(difficultyID); } @@ -703,7 +700,10 @@ namespace Game [WorldPacketHandler(ClientOpcodes.SetTaxiBenchmarkMode, Processing = PacketProcessing.Inplace)] void HandleSetTaxiBenchmark(SetTaxiBenchmarkMode packet) { - _player.ApplyModFlag(PlayerFields.Flags, PlayerFlags.TaxiBenchmark, packet.Enable); + if (packet.Enable) + _player.AddPlayerFlag(PlayerFlags.TaxiBenchmark); + else + _player.RemovePlayerFlag(PlayerFlags.TaxiBenchmark); } [WorldPacketHandler(ClientOpcodes.GuildSetFocusedAchievement)] diff --git a/Source/Game/Handlers/MovementHandler.cs b/Source/Game/Handlers/MovementHandler.cs index 5b98a0db4..9292c7267 100644 --- a/Source/Game/Handlers/MovementHandler.cs +++ b/Source/Game/Handlers/MovementHandler.cs @@ -86,8 +86,8 @@ namespace Game } // stop some emotes at player move - if (plrMover && (plrMover.GetUInt32Value(UnitFields.NpcEmotestate) != 0)) - plrMover.SetUInt32Value(UnitFields.NpcEmotestate, (uint)Emote.OneshotNone); + if (plrMover && (plrMover.GetEmoteState() != 0)) + plrMover.SetEmoteState(Emote.OneshotNone); //handle special cases if (!movementInfo.transport.guid.IsEmpty()) @@ -189,7 +189,7 @@ namespace Game // @todo discard movement packets after the player is rooted if (plrMover.IsAlive()) { - plrMover.SetFlag(PlayerFields.Flags, PlayerFlags.IsOutOfBounds); + plrMover.AddPlayerFlag(PlayerFlags.IsOutOfBounds); plrMover.EnvironmentalDamage(EnviromentalDamage.FallToVoid, (uint)GetPlayer().GetMaxHealth()); // player can be alive if GM/etc // change the death state to CORPSE to prevent the death timer from @@ -200,7 +200,7 @@ namespace Game } } else - plrMover.RemoveFlag(PlayerFields.Flags, PlayerFlags.IsOutOfBounds); + plrMover.RemovePlayerFlag(PlayerFlags.IsOutOfBounds); if (opcode == ClientOpcodes.MoveJump) { @@ -264,7 +264,7 @@ namespace Game float z = loc.GetPositionZ(); if (GetPlayer().HasUnitMovementFlag(MovementFlag.Hover)) - z += GetPlayer().GetFloatValue(UnitFields.HoverHeight); + z += GetPlayer().m_unitData.HoverHeight; GetPlayer().Relocate(loc.GetPositionX(), loc.GetPositionY(), z, loc.GetOrientation()); @@ -393,7 +393,7 @@ namespace Game GetPlayer().CastSpell(GetPlayer(), 2479, true); // in friendly area - else if (GetPlayer().IsPvP() && !GetPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.InPVP)) + else if (GetPlayer().IsPvP() && !GetPlayer().HasPlayerFlag(PlayerFlags.InPVP)) GetPlayer().UpdatePvP(false, false); // resummon pet @@ -459,7 +459,7 @@ namespace Game plMover.CastSpell(plMover, 2479, true); // in friendly area - else if (plMover.IsPvP() && !plMover.HasFlag(PlayerFields.Flags, PlayerFlags.InPVP)) + else if (plMover.IsPvP() && !plMover.HasPlayerFlag(PlayerFlags.InPVP)) plMover.UpdatePvP(false, false); } diff --git a/Source/Game/Handlers/NPCHandler.cs b/Source/Game/Handlers/NPCHandler.cs index 295adc577..1479ba434 100644 --- a/Source/Game/Handlers/NPCHandler.cs +++ b/Source/Game/Handlers/NPCHandler.cs @@ -32,7 +32,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.TabardVendorActivate)] void HandleTabardVendorActivate(Hello packet) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.TabardDesigner); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.TabardDesigner, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleTabardVendorActivateOpcode - {0} not found or you can not interact with him.", packet.Unit.ToString()); @@ -56,7 +56,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.TrainerList)] void HandleTrainerList(Hello packet) { - Creature npc = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Trainer); + Creature npc = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Trainer, NPCFlags2.None); if (!npc) { Log.outDebug(LogFilter.Network, $"WorldSession.SendTrainerList - {packet.Unit.ToString()} not found or you can not interact with him."); @@ -92,7 +92,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.TrainerBuySpell)] void HandleTrainerBuySpell(TrainerBuySpell packet) { - Creature npc = _player.GetNPCIfCanInteractWith(packet.TrainerGUID, NPCFlags.Trainer); + Creature npc = _player.GetNPCIfCanInteractWith(packet.TrainerGUID, NPCFlags.Trainer, NPCFlags2.None); if (npc == null) { Log.outDebug(LogFilter.Network, $"WORLD: HandleTrainerBuySpell - {packet.TrainerGUID.ToString()} not found or you can not interact with him."); @@ -129,7 +129,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.TalkToGossip)] void HandleGossipHello(Hello packet) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Gossip); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Gossip, NPCFlags2.None); if (unit == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleGossipHello - {0} not found or you can not interact with him.", packet.Unit.ToString()); @@ -137,7 +137,7 @@ namespace Game } // set faction visible if needed - var factionTemplateEntry = CliDB.FactionTemplateStorage.LookupByKey(unit.getFaction()); + var factionTemplateEntry = CliDB.FactionTemplateStorage.LookupByKey(unit.GetFaction()); if (factionTemplateEntry != null) GetPlayer().GetReputationMgr().SetVisible(factionTemplateEntry); @@ -180,7 +180,7 @@ namespace Game GameObject go = null; if (packet.GossipUnit.IsCreatureOrVehicle()) { - unit = GetPlayer().GetNPCIfCanInteractWith(packet.GossipUnit, NPCFlags.Gossip); + unit = GetPlayer().GetNPCIfCanInteractWith(packet.GossipUnit, NPCFlags.Gossip, NPCFlags2.None); if (unit == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleGossipSelectOption - {0} not found or you can't interact with him.", packet.GossipUnit.ToString()); @@ -251,7 +251,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.SpiritHealerActivate)] void HandleSpiritHealerActivate(SpiritHealerActivate packet) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Healer, NPCFlags.SpiritHealer); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Healer, NPCFlags.SpiritHealer, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleSpiritHealerActivateOpcode - {0} not found or you can not interact with him.", packet.Healer.ToString()); @@ -304,7 +304,7 @@ namespace Game if (!GetPlayer().IsInWorld || !GetPlayer().IsAlive()) return; - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Innkeeper); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Innkeeper, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleBinderActivate - {0} not found or you can not interact with him.", packet.Unit.ToString()); @@ -417,7 +417,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.RepairItem)] void HandleRepairItem(RepairItem packet) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.NpcGUID, NPCFlags.Repair); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.NpcGUID, NPCFlags.Repair, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleRepairItemOpcode - {0} not found or you can not interact with him.", packet.NpcGUID.ToString()); @@ -457,7 +457,7 @@ namespace Game public void SendListInventory(ObjectGuid vendorGuid) { - Creature vendor = GetPlayer().GetNPCIfCanInteractWith(vendorGuid, NPCFlags.Vendor); + Creature vendor = GetPlayer().GetNPCIfCanInteractWith(vendorGuid, NPCFlags.Vendor, NPCFlags2.None); if (vendor == null) { Log.outDebug(LogFilter.Network, "WORLD: SendListInventory - {0} not found or you can not interact with him.", vendorGuid.ToString()); diff --git a/Source/Game/Handlers/PetHandler.cs b/Source/Game/Handlers/PetHandler.cs index f811c1bc9..119f4f0c2 100644 --- a/Source/Game/Handlers/PetHandler.cs +++ b/Source/Game/Handlers/PetHandler.cs @@ -413,7 +413,7 @@ namespace Game if (unit) { response.Allow = true; - response.Timestamp = unit.GetUInt32Value(UnitFields.PetNameTimestamp); + response.Timestamp = unit.m_unitData.PetNameTimestamp; response.Name = unit.GetName(); Pet pet = unit.ToPet(); @@ -445,7 +445,7 @@ namespace Game // stable master case else { - if (!GetPlayer().GetNPCIfCanInteractWith(guid, NPCFlags.StableMaster)) + if (!GetPlayer().GetNPCIfCanInteractWith(guid, NPCFlags.StableMaster, NPCFlags2.None)) { Log.outDebug(LogFilter.Network, "Stablemaster {0} not found or you can't interact with him.", guid.ToString()); return false; @@ -526,7 +526,7 @@ namespace Game Pet pet = ObjectAccessor.GetPet(GetPlayer(), petguid); // check it! - if (!pet || !pet.IsPet() || pet.ToPet().getPetType() != PetType.Hunter || !pet.HasByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, UnitPetFlags.CanBeRenamed) || + if (!pet || !pet.IsPet() || pet.ToPet().getPetType() != PetType.Hunter || !pet.HasPetFlag(UnitPetFlags.CanBeRenamed) || pet.GetOwnerGUID() != GetPlayer().GetGUID() || pet.GetCharmInfo() == null) return; @@ -545,7 +545,7 @@ namespace Game pet.SetName(name); pet.SetGroupUpdateFlag(GroupUpdatePetFlags.Name); - pet.RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, UnitPetFlags.CanBeRenamed); + pet.RemovePetFlag(UnitPetFlags.CanBeRenamed); PreparedStatement stmt; SQLTransaction trans = new SQLTransaction(); @@ -573,7 +573,7 @@ namespace Game DB.Characters.CommitTransaction(trans); - pet.SetUInt32Value(UnitFields.PetNameTimestamp, (uint)Time.UnixTime); // cast can't be helped + pet.SetPetNameTimestamp((uint)Time.UnixTime); // cast can't be helped } [WorldPacketHandler(ClientOpcodes.PetAbandon)] diff --git a/Source/Game/Handlers/PetitionsHandler.cs b/Source/Game/Handlers/PetitionsHandler.cs index cabe9a00f..d8eaa72c2 100644 --- a/Source/Game/Handlers/PetitionsHandler.cs +++ b/Source/Game/Handlers/PetitionsHandler.cs @@ -32,7 +32,7 @@ namespace Game void HandlePetitionBuy(PetitionBuy packet) { // prevent cheating - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Petitioner); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Petitioner, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandlePetitionBuyOpcode - {0} not found or you can't interact with him.", packet.Unit.ToString()); @@ -88,9 +88,7 @@ namespace Game if (!charter) return; - charter.SetUInt32Value(ItemFields.Enchantment, (uint)charter.GetGUID().GetCounter()); - // ITEM_FIELD_ENCHANTMENT_1_1 is guild/arenateam id - // ITEM_FIELD_ENCHANTMENT_1_1+1 is current signatures count (showed on item) + charter.SetPetitionId((uint)charter.GetGUID().GetCounter()); charter.SetState(ItemUpdateState.Changed, GetPlayer()); GetPlayer().SendNewItem(charter, 1, true, false); @@ -249,7 +247,7 @@ namespace Game } ObjectGuid ownerGuid = ObjectGuid.Create(HighGuid.Player, result.Read(0)); - //ulong signs = result.Read(1); + ulong signs = result.Read(1); if (ownerGuid == GetPlayer().GetGUID()) return; @@ -306,6 +304,13 @@ namespace Game // close at signer side SendPacket(signResult); + Item item = _player.GetItemByGuid(packet.PetitionGUID); + if (item != null) + { + item.SetPetitionNumSignatures((uint)signs); + item.SetState(ItemUpdateState.Changed, _player); + } + // update for owner if online Player owner = Global.ObjAccessor.FindPlayer(ownerGuid); if (owner) @@ -503,7 +508,7 @@ namespace Game public void SendPetitionShowList(ObjectGuid guid) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(guid, NPCFlags.Petitioner); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(guid, NPCFlags.Petitioner, NPCFlags2.None); if (!creature) { Log.outDebug(LogFilter.Network, "WORLD: HandlePetitionShowListOpcode - {0} not found or you can't interact with him.", guid.ToString()); diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index 58e3d2988..2ab2d0dd1 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -62,7 +62,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.QuestGiverHello)] void HandleQuestgiverHello(QuestGiverHello packet) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.QuestGiverGUID, NPCFlags.QuestGiver); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.QuestGiverGUID, NPCFlags.QuestGiver, NPCFlags2.None); if (creature == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleQuestgiverHello - {0} not found or you can't interact with him.", packet.QuestGiverGUID.ToString()); @@ -700,7 +700,7 @@ namespace Game List dest = new List(); if (_player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, item.Id, (uint)item.Quantity) == InventoryResult.Ok) { - Item newItem = _player.StoreNewItem(dest, item.Id, true, ItemEnchantment.GenerateItemRandomPropertyId(item.Id), null, 0, item.BonusListIDs); + Item newItem = _player.StoreNewItem(dest, item.Id, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(item.Id), null, 0, item.BonusListIDs); _player.SendNewItem(newItem, (uint)item.Quantity, true, false); } } diff --git a/Source/Game/Handlers/SkillHandler.cs b/Source/Game/Handlers/SkillHandler.cs index 64fc62410..5b69028da 100644 --- a/Source/Game/Handlers/SkillHandler.cs +++ b/Source/Game/Handlers/SkillHandler.cs @@ -81,7 +81,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.ConfirmRespecWipe)] void HandleConfirmRespecWipe(ConfirmRespecWipe confirmRespecWipe) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(confirmRespecWipe.RespecMaster, NPCFlags.Trainer); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(confirmRespecWipe.RespecMaster, NPCFlags.Trainer, NPCFlags2.None); if (unit == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleTalentWipeConfirm - {0} not found or you can't interact with him.", confirmRespecWipe.RespecMaster.ToString()); diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index 850ec4bd5..77f74e22a 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -149,7 +149,7 @@ namespace Game } // Verify that the bag is an actual bag or wrapped item that can be used "normally" - if (!proto.GetFlags().HasAnyFlag(ItemFlags.HasLoot) && !item.HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped)) + if (!proto.GetFlags().HasAnyFlag(ItemFlags.HasLoot) && !item.HasItemFlag(ItemFieldFlags.Wrapped)) { player.SendEquipError(InventoryResult.ClientLockedOut, item); Log.outError(LogFilter.Network, "Possible hacking attempt: Player {0} [guid: {1}] tried to open item [guid: {2}, entry: {3}] which is not openable!", @@ -177,7 +177,7 @@ namespace Game } } - if (item.HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped))// wrapped? + if (item.HasItemFlag(ItemFieldFlags.Wrapped))// wrapped? { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHARACTER_GIFT_BY_ITEM); stmt.AddValue(0, item.GetGUID().GetCounter()); @@ -188,9 +188,9 @@ namespace Game uint entry = result.Read(0); uint flags = result.Read(1); - item.SetUInt64Value(ItemFields.GiftCreator, 0); + item.SetGiftCreator(ObjectGuid.Empty); item.SetEntry(entry); - item.SetUInt32Value(ItemFields.Flags, flags); + item.SetItemFlags((ItemFieldFlags)flags); item.SetState(ItemUpdateState.Changed, player); } else @@ -450,7 +450,7 @@ namespace Game if (_player.HasAuraType(AuraType.PreventResurrection)) return; // silent return, client should display error by itself and not send this opcode - var selfResSpells = _player.GetDynamicValues(ActivePlayerDynamicFields.SelfResSpells); + List selfResSpells = _player.m_activePlayerData.SelfResSpells; if (!selfResSpells.Contains(selfRes.SpellId)) return; @@ -458,7 +458,7 @@ namespace Game if (spellInfo != null) _player.CastSpell(_player, spellInfo, false, null); - _player.RemoveDynamicValue(ActivePlayerDynamicFields.SelfResSpells, selfRes.SpellId); + _player.RemoveSelfResSpell(selfRes.SpellId); } [WorldPacketHandler(ClientOpcodes.SpellClick)] @@ -497,23 +497,23 @@ namespace Game Player player = creator.ToPlayer(); if (player) { - MirrorImageComponentedData data = new MirrorImageComponentedData(); - data.UnitGUID = guid; - data.DisplayID = (int)creator.GetDisplayId(); - data.RaceID = (byte)creator.GetRace(); - data.Gender = (byte)creator.GetGender(); - data.ClassID = (byte)creator.GetClass(); + MirrorImageComponentedData mirrorImageComponentedData = new MirrorImageComponentedData(); + mirrorImageComponentedData.UnitGUID = guid; + mirrorImageComponentedData.DisplayID = (int)creator.GetDisplayId(); + mirrorImageComponentedData.RaceID = (byte)creator.GetRace(); + mirrorImageComponentedData.Gender = (byte)creator.GetGender(); + mirrorImageComponentedData.ClassID = (byte)creator.GetClass(); Guild guild = player.GetGuild(); - data.SkinColor = player.GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetSkinId); - data.FaceVariation = player.GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetFaceId); - data.HairVariation = player.GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId); - data.HairColor = player.GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairColorId); - data.BeardVariation = player.GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle); + mirrorImageComponentedData.SkinColor = player.m_playerData.SkinID; + mirrorImageComponentedData.FaceVariation = player.m_playerData.FaceID; + mirrorImageComponentedData.HairVariation = player.m_playerData.HairStyleID; + mirrorImageComponentedData.HairColor = player.m_playerData.HairColorID; + mirrorImageComponentedData.BeardVariation = player.m_playerData.FacialHairStyleID; for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) - data.CustomDisplay[i] = player.GetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i)); - data.GuildGUID = (guild ? guild.GetGUID() : ObjectGuid.Empty); + mirrorImageComponentedData.CustomDisplay[i] = player.m_playerData.CustomDisplayOption[i]; + mirrorImageComponentedData.GuildGUID = (guild ? guild.GetGUID() : ObjectGuid.Empty); byte[] itemSlots = { @@ -535,18 +535,15 @@ namespace Game { uint itemDisplayId; Item item = player.GetItemByPos(InventorySlots.Bag0, slot); - if ((slot == EquipmentSlot.Head && player.HasFlag(PlayerFields.Flags, PlayerFlags.HideHelm)) || - (slot == EquipmentSlot.Cloak && player.HasFlag(PlayerFields.Flags, PlayerFlags.HideCloak))) - itemDisplayId = 0; - else if (item) + if (item != null) itemDisplayId = item.GetDisplayId(player); else itemDisplayId = 0; - data.ItemDisplayID.Add((int)itemDisplayId); + mirrorImageComponentedData.ItemDisplayID.Add((int)itemDisplayId); } - SendPacket(data); + SendPacket(mirrorImageComponentedData); } else { diff --git a/Source/Game/Handlers/TaxiHandler.cs b/Source/Game/Handlers/TaxiHandler.cs index 23901c618..59a5805e5 100644 --- a/Source/Game/Handlers/TaxiHandler.cs +++ b/Source/Game/Handlers/TaxiHandler.cs @@ -31,7 +31,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.EnableTaxiNode, Processing = PacketProcessing.ThreadSafe)] void HandleEnableTaxiNodeOpcode(EnableTaxiNode enableTaxiNode) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(enableTaxiNode.Unit, NPCFlags.FlightMaster); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(enableTaxiNode.Unit, NPCFlags.FlightMaster, NPCFlags2.None); if (unit) SendLearnNewTaxiNode(unit); } @@ -71,7 +71,7 @@ namespace Game void HandleTaxiQueryAvailableNodes(TaxiQueryAvailableNodes taxiQueryAvailableNodes) { // cheating checks - Creature unit = GetPlayer().GetNPCIfCanInteractWith(taxiQueryAvailableNodes.Unit, NPCFlags.FlightMaster); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(taxiQueryAvailableNodes.Unit, NPCFlags.FlightMaster, NPCFlags2.None); if (unit == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleTaxiQueryAvailableNodes - {0} not found or you can't interact with him.", taxiQueryAvailableNodes.Unit.ToString()); @@ -169,7 +169,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.ActivateTaxi, Processing = PacketProcessing.ThreadSafe)] void HandleActivateTaxi(ActivateTaxi activateTaxi) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(activateTaxi.Vendor, NPCFlags.FlightMaster); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(activateTaxi.Vendor, NPCFlags.FlightMaster, NPCFlags2.None); if (unit == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleActivateTaxiOpcode - {0} not found or you can't interact with it.", activateTaxi.Vendor.ToString()); diff --git a/Source/Game/Handlers/TradeHandler.cs b/Source/Game/Handlers/TradeHandler.cs index b2dce1801..10a8f184e 100644 --- a/Source/Game/Handlers/TradeHandler.cs +++ b/Source/Game/Handlers/TradeHandler.cs @@ -61,21 +61,21 @@ namespace Game tradeItem.Slot = i; tradeItem.Item = new ItemInstance(item); tradeItem.StackCount = (int)item.GetCount(); - tradeItem.GiftCreator = item.GetGuidValue(ItemFields.GiftCreator); - if (!item.HasFlag(ItemFields.Flags, ItemFieldFlags.Wrapped)) + tradeItem.GiftCreator = item.GetGiftCreator(); + if (!item.HasItemFlag(ItemFieldFlags.Wrapped)) { tradeItem.Unwrapped.HasValue = true; TradeUpdated.UnwrappedTradeItem unwrappedItem = tradeItem.Unwrapped.Value; unwrappedItem.EnchantID = (int)item.GetEnchantmentId(EnchantmentSlot.Perm); unwrappedItem.OnUseEnchantmentID = (int)item.GetEnchantmentId(EnchantmentSlot.Use); - unwrappedItem.Creator = item.GetGuidValue(ItemFields.Creator); + unwrappedItem.Creator = item.GetCreator(); unwrappedItem.Charges = item.GetSpellCharges(); - unwrappedItem.Lock = item.GetTemplate().GetLockID() != 0 && !item.HasFlag(ItemFields.Flags, ItemFieldFlags.Unlocked); - unwrappedItem.MaxDurability = item.GetUInt32Value(ItemFields.MaxDurability); - unwrappedItem.Durability = item.GetUInt32Value(ItemFields.Durability); + unwrappedItem.Lock = item.GetTemplate().GetLockID() != 0 && !item.HasItemFlag(ItemFieldFlags.Unlocked); + unwrappedItem.MaxDurability = item.m_itemData.MaxDurability; + unwrappedItem.Durability = item.m_itemData.Durability; byte g = 0; - foreach (ItemDynamicFieldGems gemData in item.GetGems()) + foreach (SocketedGem gemData in item.m_itemData.Gems) { if (gemData.ItemId != 0) { @@ -124,8 +124,8 @@ namespace Game } // adjust time (depends on /played) - if (myItems[i].HasFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable)) - myItems[i].SetUInt32Value(ItemFields.CreatePlayedTime, trader.GetTotalPlayedTime() - (GetPlayer().GetTotalPlayedTime() - myItems[i].GetUInt32Value(ItemFields.CreatePlayedTime))); + if (myItems[i].HasItemFlag(ItemFieldFlags.BopTradeable)) + myItems[i].SetCreatePlayedTime(trader.GetTotalPlayedTime() - (GetPlayer().GetTotalPlayedTime() - myItems[i].m_itemData.CreatePlayedTime)); // store trader.MoveItemToInventory(traderDst, myItems[i], true, true); } @@ -143,8 +143,8 @@ namespace Game // adjust time (depends on /played) - if (hisItems[i].HasFlag(ItemFields.Flags, ItemFieldFlags.BopTradeable)) - hisItems[i].SetUInt32Value(ItemFields.CreatePlayedTime, GetPlayer().GetTotalPlayedTime() - (trader.GetTotalPlayedTime() - hisItems[i].GetUInt32Value(ItemFields.CreatePlayedTime))); + if (hisItems[i].HasItemFlag(ItemFieldFlags.BopTradeable)) + hisItems[i].SetCreatePlayedTime(GetPlayer().GetTotalPlayedTime() - (trader.GetTotalPlayedTime() - hisItems[i].m_itemData.CreatePlayedTime)); // store GetPlayer().MoveItemToInventory(playerDst, hisItems[i], true, true); } @@ -453,12 +453,12 @@ namespace Game { if (myItems[i]) { - myItems[i].SetGuidValue(ItemFields.GiftCreator, GetPlayer().GetGUID()); + myItems[i].SetGiftCreator(GetPlayer().GetGUID()); GetPlayer().MoveItemFromInventory(myItems[i].GetBagSlot(), myItems[i].GetSlot(), true); } if (hisItems[i]) { - hisItems[i].SetGuidValue(ItemFields.GiftCreator, trader.GetGUID()); + hisItems[i].SetGiftCreator(trader.GetGUID()); trader.MoveItemFromInventory(hisItems[i].GetBagSlot(), hisItems[i].GetSlot(), true); } } @@ -650,8 +650,8 @@ namespace Game } if ((pOther.GetTeam() != GetPlayer().GetTeam() || - pOther.HasFlag(PlayerFields.FlagsEx, PlayerFlagsEx.MercenaryMode) || - GetPlayer().HasFlag(PlayerFields.FlagsEx, PlayerFlagsEx.MercenaryMode)) && + pOther.HasPlayerFlagEx(PlayerFlagsEx.MercenaryMode) || + GetPlayer().HasPlayerFlagEx(PlayerFlagsEx.MercenaryMode)) && (!WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideTrade) && !HasPermission(RBACPermissions.AllowTwoSideTrade))) { diff --git a/Source/Game/Handlers/TransmogrificationHandler.cs b/Source/Game/Handlers/TransmogrificationHandler.cs index dfe6aabe1..476a4d1c1 100644 --- a/Source/Game/Handlers/TransmogrificationHandler.cs +++ b/Source/Game/Handlers/TransmogrificationHandler.cs @@ -33,7 +33,7 @@ namespace Game Player player = GetPlayer(); // Validate - if (!player.GetNPCIfCanInteractWith(transmogrifyItems.Npc, NPCFlags.Transmogrifier)) + if (!player.GetNPCIfCanInteractWith(transmogrifyItems.Npc, NPCFlags.Transmogrifier, NPCFlags2.None)) { Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - Unit (GUID: {0}) not found or player can't interact with it.", transmogrifyItems.ToString()); return; diff --git a/Source/Game/Handlers/VoidStorageHandler.cs b/Source/Game/Handlers/VoidStorageHandler.cs index c4f756d32..cc5444745 100644 --- a/Source/Game/Handlers/VoidStorageHandler.cs +++ b/Source/Game/Handlers/VoidStorageHandler.cs @@ -33,7 +33,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.UnlockVoidStorage)] void HandleVoidStorageUnlock(UnlockVoidStorage unlockVoidStorage) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(unlockVoidStorage.Npc, NPCFlags.VaultKeeper); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(unlockVoidStorage.Npc, NPCFlags.VaultKeeper, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageUnlock - {0} not found or player can't interact with it.", unlockVoidStorage.Npc.ToString()); @@ -55,7 +55,7 @@ namespace Game { Player player = GetPlayer(); - Creature unit = player.GetNPCIfCanInteractWith(queryVoidStorage.Npc, NPCFlags.Transmogrifier | NPCFlags.VaultKeeper); + Creature unit = player.GetNPCIfCanInteractWith(queryVoidStorage.Npc, NPCFlags.Transmogrifier | NPCFlags.VaultKeeper, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageQuery - {0} not found or player can't interact with it.", queryVoidStorage.Npc.ToString()); @@ -94,7 +94,7 @@ namespace Game { Player player = GetPlayer(); - Creature unit = player.GetNPCIfCanInteractWith(voidStorageTransfer.Npc, NPCFlags.VaultKeeper); + Creature unit = player.GetNPCIfCanInteractWith(voidStorageTransfer.Npc, NPCFlags.VaultKeeper, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageTransfer - {0} not found or player can't interact with it.", voidStorageTransfer.Npc.ToString()); @@ -155,14 +155,14 @@ namespace Game continue; } - VoidStorageItem itemVS = new VoidStorageItem(Global.ObjectMgr.GenerateVoidStorageItemId(), item.GetEntry(), item.GetGuidValue(ItemFields.Creator), - item.GetItemRandomEnchantmentId(), item.GetItemSuffixFactor(), item.GetModifier(ItemModifier.UpgradeId), + VoidStorageItem itemVS = new VoidStorageItem(Global.ObjectMgr.GenerateVoidStorageItemId(), item.GetEntry(), item.GetCreator(), + item.GetItemRandomBonusListId(), item.GetModifier(ItemModifier.UpgradeId), item.GetModifier(ItemModifier.ScalingStatDistributionFixedLevel), item.GetModifier(ItemModifier.ArtifactKnowledgeLevel), - (byte)item.GetUInt32Value(ItemFields.Context), item.GetDynamicValues(ItemDynamicFields.BonusListIds)); + (byte)item.m_itemData.Context, item.m_itemData.BonusListIDs); VoidItem voidItem; voidItem.Guid = ObjectGuid.Create(HighGuid.Item, itemVS.ItemId); - voidItem.Creator = item.GetGuidValue(ItemFields.Creator); + voidItem.Creator = item.GetCreator(); voidItem.Item = new ItemInstance(itemVS); voidItem.Slot = _player.AddVoidStorageItem(itemVS); @@ -195,9 +195,8 @@ namespace Game return; } - Item item = player.StoreNewItem(dest, itemVS.ItemEntry, true, itemVS.ItemRandomPropertyId, null, itemVS.Context, itemVS.BonusListIDs); - item.SetUInt32Value(ItemFields.PropertySeed, itemVS.ItemSuffixFactor); - item.SetGuidValue(ItemFields.Creator, itemVS.CreatorGuid); + Item item = player.StoreNewItem(dest, itemVS.ItemEntry, true, itemVS.RandomBonusListId, null, itemVS.Context, itemVS.BonusListIDs); + item.SetCreator(itemVS.CreatorGuid); item.SetModifier(ItemModifier.UpgradeId, itemVS.ItemUpgradeId); item.SetBinding(true); GetCollectionMgr().AddItemAppearance(item); @@ -216,7 +215,7 @@ namespace Game { Player player = GetPlayer(); - Creature unit = player.GetNPCIfCanInteractWith(swapVoidItem.Npc, NPCFlags.VaultKeeper); + Creature unit = player.GetNPCIfCanInteractWith(swapVoidItem.Npc, NPCFlags.VaultKeeper, NPCFlags2.None); if (!unit) { Log.outDebug(LogFilter.Network, "WORLD: HandleVoidSwapItem - {0} not found or player can't interact with it.", swapVoidItem.Npc.ToString()); diff --git a/Source/Game/Loot/Loot.cs b/Source/Game/Loot/Loot.cs index 1f4badb8e..acc0390c0 100644 --- a/Source/Game/Loot/Loot.cs +++ b/Source/Game/Loot/Loot.cs @@ -40,8 +40,7 @@ namespace Game.Loots needs_quest = li.needs_quest; - randomSuffix = ItemEnchantment.GenerateEnchSuffixFactor(itemid); - randomPropertyId = ItemEnchantment.GenerateItemRandomPropertyId(itemid); + randomBonusListId = ItemEnchantmentManager.GenerateItemRandomBonusListId(itemid); upgradeId = Global.DB2Mgr.GetRulesetItemUpgrade(itemid); canSave = true; } @@ -88,8 +87,7 @@ namespace Game.Loots public List GetAllowedLooters() { return allowedGUIDs; } public uint itemid; - public uint randomSuffix; - public ItemRandomEnchantmentId randomPropertyId; + public uint randomBonusListId; public uint upgradeId; public List BonusListIDs = new List(); public byte context; @@ -216,7 +214,7 @@ namespace Game.Loots return false; } - _itemContext = lootOwner.GetMap().GetDifficultyLootItemContext(); + _itemContext = (byte)lootOwner.GetMap().GetDifficultyLootItemContext(); tab.Process(this, store.IsRatesAllowed(), (byte)lootMode); // Processing is done there, callback via Loot.AddItem() diff --git a/Source/Game/Maps/GridNotifiers.cs b/Source/Game/Maps/GridNotifiers.cs index 1892682d8..007bb37b9 100644 --- a/Source/Game/Maps/GridNotifiers.cs +++ b/Source/Game/Maps/GridNotifiers.cs @@ -663,7 +663,7 @@ namespace Game.Maps //Caster may be NULL if DynObj is in removelist Player caster = Global.ObjAccessor.FindPlayer(guid); if (caster != null) - if (caster.GetGuidValue(ActivePlayerFields.Farsight) == obj.GetGUID()) + if (caster.m_activePlayerData.FarsightObject == obj.GetGUID()) BuildPacket(caster); } } diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 05c64c164..f5da50fe8 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -901,9 +901,9 @@ namespace Game.Maps //! If hovering, always increase our server-side Z position //! Client automatically projects correct position based on Z coord sent in monster move - //! and UNIT_FIELD_HOVERHEIGHT sent in object updates + //! and HoverHeight sent in object updates if (player.HasUnitMovementFlag(MovementFlag.Hover)) - z += player.GetFloatValue(UnitFields.HoverHeight); + z += player.m_unitData.HoverHeight; player.Relocate(x, y, z, orientation); if (player.IsVehicle()) @@ -937,9 +937,9 @@ namespace Game.Maps //! If hovering, always increase our server-side Z position //! Client automatically projects correct position based on Z coord sent in monster move - //! and UNIT_FIELD_HOVERHEIGHT sent in object updates + //! and HoverHeight sent in object updates if (creature.HasUnitMovementFlag(MovementFlag.Hover)) - z += creature.GetFloatValue(UnitFields.HoverHeight); + z += creature.m_unitData.HoverHeight; // delay creature move for grid/cell to grid/cell moves if (old_cell.DiffCell(new_cell) || old_cell.DiffGrid(new_cell)) @@ -2728,14 +2728,29 @@ namespace Game.Maps bones = new Corpse(); bones.Create(corpse.GetGUID().GetCounter(), this); - for (int i = (int)ObjectFields.Guid + 4; i < (int)CorpseFields.End; ++i) // don't overwrite guid - bones.SetUInt32Value(i, corpse.GetUInt32Value(i)); + bones.SetCorpseDynamicFlags((CorpseDynFlags)(byte)corpse.m_corpseData.DynamicFlags); + bones.SetOwnerGUID(corpse.m_corpseData.Owner); + bones.SetPartyGUID(corpse.m_corpseData.PartyGUID); + bones.SetGuildGUID(corpse.m_corpseData.GuildGUID); + bones.SetDisplayId(corpse.m_corpseData.DisplayID); + bones.SetRace((Race)(byte)corpse.m_corpseData.RaceID); + bones.SetSex((Gender)(byte)corpse.m_corpseData.Sex); + bones.SetSkin(corpse.m_corpseData.SkinID); + bones.SetFace(corpse.m_corpseData.FaceID); + bones.SetHairStyle(corpse.m_corpseData.HairStyleID); + bones.SetHairColor(corpse.m_corpseData.HairColorID); + bones.SetFacialHairStyle(corpse.m_corpseData.FacialHairStyleID); + bones.SetFlags((CorpseFlags)(corpse.m_corpseData.Flags | (uint)CorpseFlags.Bones)); + bones.SetFactionTemplate(corpse.m_corpseData.FactionTemplate); + for (int i = 0; i < EquipmentSlot.End; ++i) + bones.SetItem((uint)i, corpse.m_corpseData.Items[i]); + + for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) + bones.SetCustomDisplayOption((uint)i, corpse.m_corpseData.CustomDisplayOption[i]); bones.SetCellCoord(corpse.GetCellCoord()); bones.Relocate(corpse.GetPositionX(), corpse.GetPositionY(), corpse.GetPositionZ(), corpse.GetOrientation()); - bones.SetUInt32Value(CorpseFields.Flags, corpse.GetUInt32Value(CorpseFields.Flags) | (uint)CorpseFlags.Bones); - PhasingHandler.InheritPhaseShift(bones, corpse); AddCorpse(bones); @@ -2999,7 +3014,7 @@ namespace Game.Maps return Global.DB2Mgr.GetMapDifficultyData(GetId(), GetDifficultyID()); } - public byte GetDifficultyLootItemContext() + public int GetDifficultyLootItemContext() { MapDifficultyRecord mapDifficulty = GetMapDifficulty(); if (mapDifficulty != null && mapDifficulty.ItemContext != 0) @@ -3353,7 +3368,7 @@ namespace Game.Maps if (summoner) PhasingHandler.InheritPhaseShift(summon, summoner); - summon.SetUInt32Value(UnitFields.CreatedBySpell, spellId); + summon.SetCreatedBySpell(spellId); summon.SetHomePosition(pos); summon.InitStats(duration); summon.SetVisibleBySummonerOnly(visibleBySummonerOnly); @@ -3779,30 +3794,12 @@ namespace Game.Maps if (cSource) { if (step.script.Emote.Flags.HasAnyFlag(eScriptFlags.EmoteUseState)) - cSource.SetUInt32Value(UnitFields.NpcEmotestate, step.script.Emote.EmoteID); + cSource.SetEmoteState((Emote)step.script.Emote.EmoteID); else cSource.HandleEmoteCommand((Emote)step.script.Emote.EmoteID); } break; } - case ScriptCommands.FieldSet: - { - // Source or target must be Creature. - Creature cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script); - if (cSource) - { - // Validate field number. - if (step.script.FieldSet.FieldID <= (int)ObjectFields.Entry || - step.script.FieldSet.FieldID >= cSource.valuesCount) - Log.outError(LogFilter.Scripts, - "{0} wrong field {1} (max count: {2}) in object (TypeId: {3}, Entry: {4}, GUID: {5}) specified, skipping.", - step.script.GetDebugInfo(), step.script.FieldSet.FieldID, - cSource.valuesCount, cSource.GetTypeId(), cSource.GetEntry(), cSource.GetGUID().ToString()); - else - cSource.SetUInt32Value(step.script.FieldSet.FieldID, step.script.FieldSet.FieldValue); - } - break; - } case ScriptCommands.MoveTo: { // Source or target must be Creature. @@ -3824,42 +3821,6 @@ namespace Game.Maps } break; } - case ScriptCommands.FlagSet: - { - // Source or target must be Creature. - Creature cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script); - if (cSource) - { - // Validate field number. - if (step.script.FlagToggle.FieldID <= (int)ObjectFields.Entry || - step.script.FlagToggle.FieldID >= cSource.valuesCount) - Log.outError(LogFilter.Scripts, - "{0} wrong field {1} (max count: {2}) in object (TypeId: {3}, Entry: {4}, GUID: {5}) specified, skipping.", - step.script.GetDebugInfo(), step.script.FlagToggle.FieldID, - cSource.valuesCount, cSource.GetTypeId(), cSource.GetEntry(), cSource.GetGUID().ToString()); - else - cSource.SetFlag(step.script.FlagToggle.FieldID, step.script.FlagToggle.FieldValue); - } - break; - } - case ScriptCommands.FlagRemove: - { - // Source or target must be Creature. - Creature cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script); - if (cSource) - { - // Validate field number. - if (step.script.FlagToggle.FieldID <= (int)ObjectFields.Entry || - step.script.FlagToggle.FieldID >= cSource.valuesCount) - Log.outError(LogFilter.Scripts, - "{0} wrong field {1} (max count: {2}) in object (TypeId: {3}, Entry: {4}, GUID: {5}) specified, skipping.", - step.script.GetDebugInfo(), step.script.FlagToggle.FieldID, - cSource.valuesCount, cSource.GetTypeId(), cSource.GetEntry(), cSource.GetGUID().ToString()); - else - cSource.RemoveFlag(step.script.FlagToggle.FieldID, step.script.FlagToggle.FieldValue); - } - break; - } case ScriptCommands.TeleportTo: { if (step.script.TeleportTo.Flags.HasAnyFlag(eScriptFlags.TeleportUseCreature)) diff --git a/Source/Game/Movement/Generators/ConfusedGenerator.cs b/Source/Game/Movement/Generators/ConfusedGenerator.cs index 1a8272fbd..f298b6a11 100644 --- a/Source/Game/Movement/Generators/ConfusedGenerator.cs +++ b/Source/Game/Movement/Generators/ConfusedGenerator.cs @@ -31,7 +31,7 @@ namespace Game.Movement public override void DoInitialize(T owner) { owner.AddUnitState(UnitState.Confused); - owner.SetFlag(UnitFields.Flags, UnitFlags.Confused); + owner.AddUnitFlag(UnitFlags.Confused); owner.GetPosition(out i_x, out i_y, out i_z); if (!owner.IsAlive() || owner.IsStopped()) @@ -45,13 +45,13 @@ namespace Game.Movement { if (owner.IsTypeId(TypeId.Player)) { - owner.RemoveFlag(UnitFields.Flags, UnitFlags.Confused); + owner.RemoveUnitFlag(UnitFlags.Confused); owner.ClearUnitState(UnitState.Confused | UnitState.ConfusedMove); owner.StopMoving(); } else if (owner.IsTypeId(TypeId.Unit)) { - owner.RemoveFlag(UnitFields.Flags, UnitFlags.Confused); + owner.RemoveUnitFlag(UnitFlags.Confused); owner.ClearUnitState(UnitState.Confused | UnitState.ConfusedMove); if (owner.GetVictim()) owner.SetTarget(owner.GetVictim().GetGUID()); diff --git a/Source/Game/Movement/Generators/FleeingGenerator.cs b/Source/Game/Movement/Generators/FleeingGenerator.cs index a6f2177af..4aa1238a5 100644 --- a/Source/Game/Movement/Generators/FleeingGenerator.cs +++ b/Source/Game/Movement/Generators/FleeingGenerator.cs @@ -122,7 +122,7 @@ namespace Game.Movement if (owner == null) return; - owner.SetFlag(UnitFields.Flags, UnitFlags.Fleeing); + owner.AddUnitFlag(UnitFlags.Fleeing); owner.AddUnitState(UnitState.Fleeing | UnitState.FleeingMove); _setTargetLocation(owner); } @@ -131,13 +131,13 @@ namespace Game.Movement { if (owner.IsTypeId(TypeId.Player)) { - owner.RemoveFlag(UnitFields.Flags, UnitFlags.Fleeing); + owner.RemoveUnitFlag(UnitFlags.Fleeing); owner.ClearUnitState(UnitState.Fleeing | UnitState.FleeingMove); owner.StopMoving(); } else { - owner.RemoveFlag(UnitFields.Flags, UnitFlags.Fleeing); + owner.RemoveUnitFlag(UnitFlags.Fleeing); owner.ClearUnitState(UnitState.Fleeing | UnitState.FleeingMove); if (owner.GetVictim() != null) owner.SetTarget(owner.GetVictim().GetGUID()); @@ -185,7 +185,7 @@ namespace Game.Movement public override void Finalize(Unit owner) { - owner.RemoveFlag(UnitFields.Flags, UnitFlags.Fleeing); + owner.RemoveUnitFlag(UnitFlags.Fleeing); owner.ClearUnitState(UnitState.Fleeing | UnitState.FleeingMove); Unit victim = owner.GetVictim(); if (victim != null) diff --git a/Source/Game/Movement/Generators/WaypointMovement.cs b/Source/Game/Movement/Generators/WaypointMovement.cs index 5b0a67e71..bf6f93f5b 100644 --- a/Source/Game/Movement/Generators/WaypointMovement.cs +++ b/Source/Game/Movement/Generators/WaypointMovement.cs @@ -433,7 +433,7 @@ namespace Game.Movement owner.ClearUnitState(UnitState.InFlight); owner.Dismount(); - owner.RemoveFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.TaxiFlight); + owner.RemoveUnitFlag(UnitFlags.RemoveClientControl | UnitFlags.TaxiFlight); if (owner.m_taxi.empty()) { @@ -444,7 +444,7 @@ namespace Game.Movement owner.StopMoving(); } - owner.RemoveFlag(PlayerFields.Flags, PlayerFlags.TaxiBenchmark); + owner.RemovePlayerFlag(PlayerFlags.TaxiBenchmark); owner.RestoreDisplayId(); } @@ -452,7 +452,7 @@ namespace Game.Movement { owner.getHostileRefManager().setOnlineOfflineState(false); owner.AddUnitState(UnitState.InFlight); - owner.SetFlag(UnitFields.Flags, UnitFlags.RemoveClientControl | UnitFlags.TaxiFlight); + owner.AddUnitFlag(UnitFlags.RemoveClientControl | UnitFlags.TaxiFlight); MoveSplineInit init = new MoveSplineInit(owner); uint end = GetPathAtMapEnd(); diff --git a/Source/Game/Movement/MoveSplineFlags.cs b/Source/Game/Movement/MoveSplineFlags.cs index e501cec48..f7b6c82dc 100644 --- a/Source/Game/Movement/MoveSplineFlags.cs +++ b/Source/Game/Movement/MoveSplineFlags.cs @@ -29,7 +29,7 @@ namespace Game.Movement public bool isSmooth() { return Flags.HasAnyFlag(SplineFlag.Catmullrom); } public bool isLinear() { return !isSmooth(); } - public byte getAnimationId() { return animId; } + public byte getAnimTier() { return animTier; } public bool hasAllFlags(SplineFlag f) { return (Flags & f) == f; } public bool hasFlag(SplineFlag f) { return (Flags & f) != 0; } @@ -50,6 +50,6 @@ namespace Game.Movement public void EnableTransportExit() { Flags = (Flags & ~SplineFlag.TransportEnter) | SplineFlag.TransportExit; } public SplineFlag Flags; - public byte animId; + public byte animTier; } } diff --git a/Source/Game/Movement/MoveSplineInit.cs b/Source/Game/Movement/MoveSplineInit.cs index 538bfcd57..5f5db5020 100644 --- a/Source/Game/Movement/MoveSplineInit.cs +++ b/Source/Game/Movement/MoveSplineInit.cs @@ -37,7 +37,7 @@ namespace Game.Movement args.walk = unit.HasUnitMovementFlag(MovementFlag.Walking); args.flags.SetUnsetFlag(SplineFlag.Flying, unit.HasUnitMovementFlag(MovementFlag.CanFly | MovementFlag.DisableGravity)); args.flags.SetUnsetFlag(SplineFlag.SmoothGroundPath, true); // enabled by default, CatmullRom mode or client config "pathSmoothing" will disable this - args.flags.SetUnsetFlag(SplineFlag.Steering, unit.HasFlag64(UnitFields.NpcFlags, NPCFlags.Steering)); + args.flags.SetUnsetFlag(SplineFlag.Steering, unit.HasNpcFlag2(NPCFlags2.Steering)); } UnitMoveType SelectSpeedType(MovementFlag moveFlags) diff --git a/Source/Game/Network/Packet.cs b/Source/Game/Network/Packet.cs index e871af09a..17efeeeca 100644 --- a/Source/Game/Network/Packet.cs +++ b/Source/Game/Network/Packet.cs @@ -108,9 +108,9 @@ namespace Game.Network this.opcode = (uint)opcode; } - public WorldPacket(byte[] data, uint opcode) : base(data) + public WorldPacket(byte[] data) : base(data) { - this.opcode = opcode; + opcode = ReadUInt16(); } public ObjectGuid ReadPackedGuid() @@ -223,18 +223,23 @@ namespace Game.Network uint opcode; } - public class ServerPacketHeader + public class PacketHeader { - public ServerPacketHeader(uint size, ServerOpcodes opcode) + public int Size; + public byte[] Tag = new byte[12]; + + public void Read(byte[] buffer) { - Size = size + 2; - Opcode = opcode; + Size = BitConverter.ToInt32(buffer, 0); + Buffer.BlockCopy(buffer, 4, Tag, 0, 12); + } - data = BitConverter.GetBytes(Size).Combine(BitConverter.GetBytes((ushort)opcode)); - } + public void Write(ByteBuffer byteBuffer) + { + byteBuffer.WriteInt32(Size); + byteBuffer.WriteBytes(Tag, 12); + } - public ServerOpcodes Opcode { get; set; } - public uint Size { get; set; } - public byte[] data { get; set; } + public bool IsValidSize() { return Size < 0x10000; } } } diff --git a/Source/Game/Network/PacketLog.cs b/Source/Game/Network/PacketLog.cs index cbfcb53cf..b2e3f4755 100644 --- a/Source/Game/Network/PacketLog.cs +++ b/Source/Game/Network/PacketLog.cs @@ -69,6 +69,9 @@ public class PacketLog else Buffer.BlockCopy(address.GetAddressBytes(), 0, SocketIPBytes, 0, 16); + if (!isClientPacket) + data.Combine(new byte[2]); + writer.Write(data.Length + 4); writer.Write(SocketIPBytes); writer.Write(port); diff --git a/Source/Game/Network/Packets/AchievementPackets.cs b/Source/Game/Network/Packets/AchievementPackets.cs index 1887f47b6..58b5caf30 100644 --- a/Source/Game/Network/Packets/AchievementPackets.cs +++ b/Source/Game/Network/Packets/AchievementPackets.cs @@ -149,11 +149,11 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Progress.Count); + _worldPacket.WriteInt32(Progress.Count); foreach (GuildCriteriaProgress progress in Progress) { - _worldPacket.WriteInt32(progress.CriteriaID); + _worldPacket.WriteUInt32(progress.CriteriaID); _worldPacket.WriteUInt32(progress.DateCreated); _worldPacket.WriteUInt32(progress.DateStarted); _worldPacket.WritePackedTime(progress.DateUpdated); @@ -230,7 +230,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Earned.Count); + _worldPacket.WriteInt32(Earned.Count); foreach (EarnedAchievement earned in Earned) earned.Write(_worldPacket); @@ -263,7 +263,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(GuildGUID); _worldPacket.WriteUInt32(AchievementID); - _worldPacket.WriteUInt32(Member.Count); + _worldPacket.WriteInt32(Member.Count); foreach (ObjectGuid guid in Member) _worldPacket.WritePackedGuid(guid); } @@ -330,8 +330,8 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteUInt32(Earned.Count); - data.WriteUInt32(Progress.Count); + data.WriteInt32(Earned.Count); + data.WriteInt32(Progress.Count); foreach (EarnedAchievement earned in Earned) earned.Write(data); diff --git a/Source/Game/Network/Packets/AuctionHousePackets.cs b/Source/Game/Network/Packets/AuctionHousePackets.cs index e599e5747..cc4e05047 100644 --- a/Source/Game/Network/Packets/AuctionHousePackets.cs +++ b/Source/Game/Network/Packets/AuctionHousePackets.cs @@ -66,9 +66,9 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt32(AuctionItemID); - _worldPacket.WriteInt32(Command); - _worldPacket.WriteInt32(ErrorCode); - _worldPacket.WriteInt32(BagResult); + _worldPacket.WriteInt32((int)Command); + _worldPacket.WriteInt32((int)ErrorCode); + _worldPacket.WriteInt32((int)BagResult); _worldPacket.WritePackedGuid(Guid); _worldPacket.WriteUInt64(MinIncrement); _worldPacket.WriteUInt64(Money); @@ -206,8 +206,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(Items.Count); - _worldPacket.WriteInt32(TotalCount); - _worldPacket.WriteInt32(DesiredDelay); + _worldPacket.WriteUInt32(TotalCount); + _worldPacket.WriteUInt32(DesiredDelay); _worldPacket.WriteBit(OnlyUsable); _worldPacket.FlushBits(); @@ -358,7 +358,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Mails.Count); + _worldPacket.WriteInt32(Mails.Count); _worldPacket.WriteInt32(TotalNumRecords); foreach (var mail in Mails) @@ -441,7 +441,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(ChangeNumberGlobal); _worldPacket.WriteUInt32(ChangeNumberCursor); _worldPacket.WriteUInt32(ChangeNumberTombstone); - _worldPacket.WriteUInt32(Items.Count); + _worldPacket.WriteInt32(Items.Count); foreach (var item in Items) item.Write(_worldPacket); @@ -486,7 +486,7 @@ namespace Game.Network.Packets { data.WritePackedGuid(ItemGuid); data.WritePackedGuid(OwnerAccountID); - data.WriteInt32(EndTime); + data.WriteUInt32(EndTime); } if (!CensorBidInfo) diff --git a/Source/Game/Network/Packets/AuthenticationPackets.cs b/Source/Game/Network/Packets/AuthenticationPackets.cs index 203403ea9..2fa1a0391 100644 --- a/Source/Game/Network/Packets/AuthenticationPackets.cs +++ b/Source/Game/Network/Packets/AuthenticationPackets.cs @@ -23,6 +23,8 @@ using Game.DataStorage; using System; using System.Collections.Generic; using System.Net; +using System.Security.Cryptography; +using System.Linq; namespace Game.Network.Packets { @@ -113,7 +115,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteBit(SuccessInfo.HasValue); _worldPacket.WriteBit(WaitInfo.HasValue); _worldPacket.FlushBits(); @@ -121,13 +123,13 @@ namespace Game.Network.Packets if (SuccessInfo.HasValue) { _worldPacket.WriteUInt32(SuccessInfo.Value.VirtualRealmAddress); - _worldPacket.WriteUInt32(SuccessInfo.Value.VirtualRealms.Count); + _worldPacket.WriteInt32(SuccessInfo.Value.VirtualRealms.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.TimeRested); _worldPacket.WriteUInt8(SuccessInfo.Value.ActiveExpansionLevel); _worldPacket.WriteUInt8(SuccessInfo.Value.AccountExpansionLevel); _worldPacket.WriteUInt32(SuccessInfo.Value.TimeSecondsUntilPCKick); - _worldPacket.WriteUInt32(SuccessInfo.Value.AvailableClasses.Count); - _worldPacket.WriteUInt32(SuccessInfo.Value.Templates.Count); + _worldPacket.WriteInt32(SuccessInfo.Value.AvailableClasses.Count); + _worldPacket.WriteInt32(SuccessInfo.Value.Templates.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.CurrencyID); _worldPacket.WriteUInt32(SuccessInfo.Value.Time); @@ -170,11 +172,11 @@ namespace Game.Network.Packets foreach (var templat in SuccessInfo.Value.Templates) { _worldPacket.WriteUInt32(templat.TemplateSetId); - _worldPacket.WriteUInt32(templat.Classes.Count); + _worldPacket.WriteInt32(templat.Classes.Count); foreach (var templateClass in templat.Classes) { _worldPacket.WriteUInt8(templateClass.ClassID); - _worldPacket.WriteUInt8(templateClass.FactionGroup); + _worldPacket.WriteUInt8((byte)templateClass.FactionGroup); } _worldPacket.WriteBits(templat.Name.GetByteCount(), 7); @@ -252,53 +254,41 @@ namespace Game.Network.Packets public ConnectTo() : base(ServerOpcodes.ConnectTo) { Payload = new ConnectPayload(); - Payload.PanamaKey = "F41DCB2D728CF3337A4FF338FA89DB01BBBE9C3B65E9DA96268687353E48B94C".ToByteArray(); - Payload.Adler32 = 0xA0A66C10; - - Crypt = new RsaCrypt(); - Crypt.InitializeEncryption(RsaStore.P, RsaStore.Q, RsaStore.DP, RsaStore.DQ, RsaStore.InverseQ); } public override void Write() { - byte[] port = BitConverter.GetBytes((ushort)Payload.Where.Port); - byte[] address = new byte[16]; - byte addressType = 3; - if (Payload.Where.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + ByteBuffer whereBuffer = new ByteBuffer(); + whereBuffer.WriteUInt8((byte)Payload.Where.Type); + + switch (Payload.Where.Type) { - Buffer.BlockCopy(Payload.Where.Address.GetAddressBytes(), 0, address, 0, 4); - addressType = 1; - } - else - { - Buffer.BlockCopy(Payload.Where.Address.GetAddressBytes(), 0, address, 0, 16); - addressType = 2; + case AddressType.IPv4: + whereBuffer.WriteBytes(Payload.Where.IPv4); + break; + case AddressType.IPv6: + whereBuffer.WriteBytes(Payload.Where.IPv6); + break; + case AddressType.NamedSocket: + whereBuffer.WriteString(Payload.Where.NameSocket); + break; + default: + break; } - HmacHash hmacHash = new HmacHash(RsaStore.WherePacketHmac); - hmacHash.Process(address, 16); - hmacHash.Process(BitConverter.GetBytes(addressType), 1); - hmacHash.Process(port, 2); - hmacHash.Process(Haiku); - hmacHash.Process(Payload.PanamaKey, 32); - hmacHash.Process(PiDigits, 108); - hmacHash.Finish(BitConverter.GetBytes(Payload.XorMagic), 1); + Sha256 hash = new Sha256(); + hash.Process(whereBuffer.GetData(), (int)whereBuffer.GetSize()); + hash.Process((uint)Payload.Where.Type); + hash.Finish(BitConverter.GetBytes(Payload.Port)); - ByteBuffer payload = new ByteBuffer(); - payload.WriteUInt32(Payload.Adler32); - payload.WriteUInt8(addressType); - payload.WriteBytes(address, 16); - payload.WriteUInt16(Payload.Where.Port); - payload.WriteString(Haiku); - payload.WriteBytes(Payload.PanamaKey, 32); - payload.WriteBytes(PiDigits, 108); - payload.WriteUInt8(Payload.XorMagic); - payload.WriteBytes(hmacHash.Digest); + Payload.Signature = RsaCrypt.RSA.SignHash(hash.Digest, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1).Reverse().ToArray(); - _worldPacket.WriteUInt64(Key); - _worldPacket.WriteUInt32(Serial); - _worldPacket.WriteBytes(Crypt.Encrypt(payload.GetData()), 256); + _worldPacket.WriteBytes(Payload.Signature, (uint)Payload.Signature.Length); + _worldPacket.WriteBytes(whereBuffer); + _worldPacket.WriteUInt16(Payload.Port); + _worldPacket.WriteUInt32((uint)Serial); _worldPacket.WriteUInt8(Con); + _worldPacket.WriteUInt64(Key); } public ulong Key; @@ -306,24 +296,29 @@ namespace Game.Network.Packets public ConnectPayload Payload; public byte Con; - public string Haiku = "An island of peace\nCorruption is brought ashore\nPandarens will rise\n\0\0\0"; - public byte[] PiDigits = { 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93, 0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95, 0x02, 0x88, 0x41, 0x97, - 0x16, 0x93, 0x99, 0x37, 0x51, 0x05, 0x82, 0x09, 0x74, 0x94, 0x45, 0x92, 0x30, 0x78, 0x16, 0x40, 0x62, 0x86, 0x20, 0x89, - 0x98, 0x62, 0x80, 0x34, 0x82, 0x53, 0x42, 0x11, 0x70, 0x67, 0x98, 0x21, 0x48, 0x08, 0x65, 0x13, 0x28, 0x23, 0x06, 0x64, - 0x70, 0x93, 0x84, 0x46, 0x09, 0x55, 0x05, 0x82, 0x23, 0x17, 0x25, 0x35, 0x94, 0x08, 0x12, 0x84, 0x81, 0x11, 0x74, 0x50, - 0x28, 0x41, 0x02, 0x70, 0x19, 0x38, 0x52, 0x11, 0x05, 0x55, 0x96, 0x44, 0x62, 0x29, 0x48, 0x95, 0x49, 0x30, 0x38, 0x19, - 0x64, 0x42, 0x88, 0x10, 0x97, 0x56, 0x65, 0x93, 0x34, 0x46, 0x12, 0x84, 0x75, 0x64, 0x82, 0x33, 0x78, 0x67, 0x83, 0x16, - 0x52, 0x71, 0x20, 0x19, 0x09, 0x14, 0x56, 0x48, 0x56, 0x69 }; - public class ConnectPayload { - public IPEndPoint Where; - public uint Adler32; - public byte XorMagic = 0x2A; - public byte[] PanamaKey = new byte[32]; + public SocketAddress Where; + public ushort Port; + public byte[] Signature = new byte[256]; } - RsaCrypt Crypt; + public struct SocketAddress + { + public AddressType Type; + + public byte[] IPv4; + public byte[] IPv6; + public string NameSocket; + + } + + public enum AddressType + { + IPv4 = 1, + IPv6 = 2, + NamedSocket = 3 // not supported by windows client + } } class AuthContinuedSession : ClientPacket @@ -367,9 +362,27 @@ namespace Game.Network.Packets class EnableEncryption : ServerPacket { - public EnableEncryption() : base(ServerOpcodes.EnableEncryption) { } + byte[] EncryptionKey; + bool Enabled; - public override void Write() { } + static byte[] EnableEncryptionSeed = { 0x90, 0x9C, 0xD0, 0x50, 0x5A, 0x2C, 0x14, 0xDD, 0x5C, 0x2C, 0xC0, 0x64, 0x14, 0xF3, 0xFE, 0xC9 }; + + public EnableEncryption(byte[] encryptionKey, bool enabled) : base(ServerOpcodes.EnableEncryption) + { + EncryptionKey = encryptionKey; + Enabled = enabled; + } + + public override void Write() + { + HmacSha256 hash = new HmacSha256(EncryptionKey); + hash.Process(BitConverter.GetBytes(Enabled), 1); + hash.Finish(EnableEncryptionSeed, 16); + + _worldPacket.WriteBytes(RsaCrypt.RSA.SignHash(hash.Digest, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1).Reverse().ToArray()); + _worldPacket.WriteBit(Enabled); + _worldPacket.FlushBits(); + } } //Structs diff --git a/Source/Game/Network/Packets/BattleGroundPackets.cs b/Source/Game/Network/Packets/BattleGroundPackets.cs index 825872dea..47d0d118d 100644 --- a/Source/Game/Network/Packets/BattleGroundPackets.cs +++ b/Source/Game/Network/Packets/BattleGroundPackets.cs @@ -30,14 +30,16 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(CurrentSeason); - _worldPacket.WriteUInt32(PreviousSeason); - _worldPacket.WriteUInt32(PvpSeasonID); + _worldPacket.WriteInt32(MythicPlusSeasonID); + _worldPacket.WriteInt32(CurrentSeason); + _worldPacket.WriteInt32(PreviousSeason); + _worldPacket.WriteInt32(PvpSeasonID); } - public uint PreviousSeason; - public uint CurrentSeason; - public uint PvpSeasonID; + public int MythicPlusSeasonID; + public int PreviousSeason; + public int CurrentSeason; + public int PvpSeasonID; } public class AreaSpiritHealerQuery : ClientPacket @@ -85,23 +87,18 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteBit(Ratings.HasValue); - _worldPacket.WriteBit(Winner.HasValue); - _worldPacket.WriteUInt32(Players.Count); + _worldPacket.WriteInt32(Statistics.Count); foreach (var id in PlayerCount) _worldPacket.WriteInt8(id); if (Ratings.HasValue) Ratings.Value.Write(_worldPacket); - if (Winner.HasValue) - _worldPacket.WriteUInt8(Winner.Value); - - foreach (PlayerData player in Players) + foreach (PVPMatchPlayerStatistics player in Statistics) player.Write(_worldPacket); } - public Optional Winner; - public List Players = new List(); + public List Statistics = new List(); public Optional Ratings; public sbyte[] PlayerCount = new sbyte[2]; @@ -138,7 +135,7 @@ namespace Game.Network.Packets public uint ContributionPoints; } - public class PlayerData + public class PVPMatchPlayerStatistics { public void Write(WorldPacket data) { @@ -146,10 +143,10 @@ namespace Game.Network.Packets data.WriteUInt32(Kills); data.WriteUInt32(DamageDone); data.WriteUInt32(HealingDone); - data.WriteUInt32(Stats.Count); + data.WriteInt32(Stats.Count); data.WriteInt32(PrimaryTalentTree); data.WriteInt32(Sex); - data.WriteInt32(PlayerRace); + data.WriteUInt32((uint)PlayerRace); data.WriteInt32(PlayerClass); data.WriteInt32(CreatureID); data.WriteInt32(HonorLevel); @@ -287,7 +284,7 @@ namespace Game.Network.Packets { Ticket.Write(_worldPacket); _worldPacket.WriteUInt64(QueueID); - _worldPacket.WriteUInt32(Reason); + _worldPacket.WriteInt32(Reason); _worldPacket.WritePackedGuid(ClientID); } @@ -374,7 +371,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(BattlemasterListID); _worldPacket.WriteUInt8(MinLevel); _worldPacket.WriteUInt8(MaxLevel); - _worldPacket.WriteUInt32(Battlefields.Count); + _worldPacket.WriteInt32(Battlefields.Count); foreach (var field in Battlefields) _worldPacket.WriteInt32(field); @@ -449,7 +446,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(Offender); - _worldPacket.WriteUInt8(Result); + _worldPacket.WriteUInt8((byte)Result); _worldPacket.WriteUInt8(NumBlackMarksOnOffender); _worldPacket.WriteUInt8(NumPlayersIHaveReported); } @@ -474,7 +471,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(FlagCarriers.Count); + _worldPacket.WriteInt32(FlagCarriers.Count); foreach (var pos in FlagCarriers) pos.Write(_worldPacket); } diff --git a/Source/Game/Network/Packets/BattlefieldPackets.cs b/Source/Game/Network/Packets/BattlefieldPackets.cs index 581664b14..d9f4482fd 100644 --- a/Source/Game/Network/Packets/BattlefieldPackets.cs +++ b/Source/Game/Network/Packets/BattlefieldPackets.cs @@ -27,8 +27,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt64(QueueID); - _worldPacket.WriteUInt32(AreaID); - _worldPacket.WriteUInt32(ExpireTime); + _worldPacket.WriteInt32(AreaID); + _worldPacket.WriteUInt32((uint)ExpireTime); } public ulong QueueID; @@ -57,7 +57,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt64(QueueID); - _worldPacket.WriteInt8(BattleState); + _worldPacket.WriteInt8((sbyte)BattleState); _worldPacket.WriteUInt32(Timeout); _worldPacket.WriteInt32(MinLevel); _worldPacket.WriteInt32(MaxLevel); @@ -101,7 +101,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(AreaID); _worldPacket.WriteInt8(Result); _worldPacket.WritePackedGuid(FailedPlayerGUID); - _worldPacket.WriteInt8(BattleState); + _worldPacket.WriteInt8((sbyte)BattleState); _worldPacket.WriteBit(LoggingIn); _worldPacket.FlushBits(); } @@ -151,8 +151,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt64(QueueID); - _worldPacket.WriteInt8(Reason); - _worldPacket.WriteInt8(BattleState); + _worldPacket.WriteInt8((sbyte)Reason); + _worldPacket.WriteInt8((sbyte)BattleState); _worldPacket.WriteBit(Relocated); _worldPacket.FlushBits(); } diff --git a/Source/Game/Network/Packets/BattlenetPackets.cs b/Source/Game/Network/Packets/BattlenetPackets.cs index 7182a8448..6e942216f 100644 --- a/Source/Game/Network/Packets/BattlenetPackets.cs +++ b/Source/Game/Network/Packets/BattlenetPackets.cs @@ -42,7 +42,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(BnetStatus); + _worldPacket.WriteUInt32((uint)BnetStatus); Method.Write(_worldPacket); _worldPacket.WriteUInt32(Data.GetSize()); _worldPacket.WriteBytes(Data); @@ -60,10 +60,12 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteBits(State, 2); + _worldPacket.WriteBit(SuppressNotification); _worldPacket.FlushBits(); } public byte State; + public bool SuppressNotification; } class RealmListTicket : ServerPacket diff --git a/Source/Game/Network/Packets/BlackMarketPackets.cs b/Source/Game/Network/Packets/BlackMarketPackets.cs index 1a32ae7a9..d35195d3d 100644 --- a/Source/Game/Network/Packets/BlackMarketPackets.cs +++ b/Source/Game/Network/Packets/BlackMarketPackets.cs @@ -69,7 +69,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(LastUpdateID); - _worldPacket.WriteUInt32(Items.Count); + _worldPacket.WriteInt32(Items.Count); foreach (BlackMarketItem item in Items) item.Write(_worldPacket); @@ -104,7 +104,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt32(MarketID); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteUInt32((uint)Result); Item.Write(_worldPacket); } @@ -163,14 +163,14 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { - data.WriteInt32(MarketID); - data.WriteInt32(SellerNPC); - data.WriteInt32(Quantity); + data.WriteUInt32(MarketID); + data.WriteUInt32(SellerNPC); + data.WriteUInt32(Quantity); data.WriteUInt64(MinBid); data.WriteUInt64(MinIncrement); data.WriteUInt64(CurrentBid); - data.WriteInt32(SecondsRemaining); - data.WriteInt32(NumBids); + data.WriteUInt32(SecondsRemaining); + data.WriteUInt32(NumBids); Item.Write(data); data.WriteBit(HighBid); data.FlushBits(); diff --git a/Source/Game/Network/Packets/CalendarPackets.cs b/Source/Game/Network/Packets/CalendarPackets.cs index c5758e875..cb19a1b0f 100644 --- a/Source/Game/Network/Packets/CalendarPackets.cs +++ b/Source/Game/Network/Packets/CalendarPackets.cs @@ -134,7 +134,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt64(EventID); _worldPacket.WriteUInt64(InviteID); _worldPacket.WriteUInt8(Level); - _worldPacket.WriteUInt8(Status); + _worldPacket.WriteUInt8((byte)Status); _worldPacket.WriteUInt8(Type); _worldPacket.WritePackedTime(ResponseTime); @@ -159,9 +159,9 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedTime(ServerTime); - _worldPacket.WriteUInt32(Invites.Count); - _worldPacket.WriteUInt32(Events.Count); - _worldPacket.WriteUInt32(RaidLockouts.Count); + _worldPacket.WriteInt32(Invites.Count); + _worldPacket.WriteInt32(Events.Count); + _worldPacket.WriteInt32(RaidLockouts.Count); foreach (var invite in Invites) invite.Write(_worldPacket); @@ -185,16 +185,16 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(EventType); + _worldPacket.WriteUInt8((byte)EventType); _worldPacket.WritePackedGuid(OwnerGuid); _worldPacket.WriteUInt64(EventID); - _worldPacket.WriteUInt8(GetEventType); + _worldPacket.WriteUInt8((byte)GetEventType); _worldPacket.WriteInt32(TextureID); - _worldPacket.WriteUInt32(Flags); + _worldPacket.WriteUInt32((uint)Flags); _worldPacket.WritePackedTime(Date); - _worldPacket.WriteUInt32(LockDate); + _worldPacket.WriteUInt32((uint)LockDate); _worldPacket.WritePackedGuid(EventGuildID); - _worldPacket.WriteUInt32(Invites.Count); + _worldPacket.WriteInt32(Invites.Count); _worldPacket.WriteBits(EventName.GetByteCount(), 8); _worldPacket.WriteBits(Description.GetByteCount(), 11); @@ -229,13 +229,13 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt64(EventID); _worldPacket.WritePackedTime(Date); - _worldPacket.WriteUInt32(Flags); - _worldPacket.WriteUInt8(EventType); + _worldPacket.WriteUInt32((uint)Flags); + _worldPacket.WriteUInt8((byte)EventType); _worldPacket.WriteInt32(TextureID); _worldPacket.WritePackedGuid(EventGuildID); _worldPacket.WriteUInt64(InviteID); - _worldPacket.WriteUInt8(Status); - _worldPacket.WriteUInt8(ModeratorStatus); + _worldPacket.WriteUInt8((byte)Status); + _worldPacket.WriteUInt8((byte)ModeratorStatus); // Todo: check order _worldPacket.WritePackedGuid(InvitedByGuid); @@ -310,8 +310,8 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(InviteGuid); _worldPacket.WriteUInt64(EventID); _worldPacket.WritePackedTime(Date); - _worldPacket.WriteUInt32(Flags); - _worldPacket.WriteUInt8(Status); + _worldPacket.WriteUInt32((uint)Flags); + _worldPacket.WriteUInt8((byte)Status); _worldPacket.WritePackedTime(ResponseTime); _worldPacket.WriteBit(ClearPending); @@ -355,7 +355,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(InviteGuid); _worldPacket.WriteUInt64(EventID); - _worldPacket.WriteUInt8(Status); + _worldPacket.WriteUInt8((byte)Status); _worldPacket.WriteBit(ClearPending); _worldPacket.FlushBits(); @@ -375,8 +375,8 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt64(EventID); _worldPacket.WritePackedTime(Date); - _worldPacket.WriteUInt32(Flags); - _worldPacket.WriteUInt8(Status); + _worldPacket.WriteUInt32((uint)Flags); + _worldPacket.WriteUInt8((byte)Status); } public ulong EventID; @@ -402,10 +402,10 @@ namespace Game.Network.Packets _worldPacket.WritePackedTime(OriginalDate); _worldPacket.WritePackedTime(Date); - _worldPacket.WriteUInt32(LockDate); - _worldPacket.WriteUInt32(Flags); - _worldPacket.WriteUInt32(TextureID); - _worldPacket.WriteUInt8(EventType); + _worldPacket.WriteUInt32((uint)LockDate); + _worldPacket.WriteUInt32((uint)Flags); + _worldPacket.WriteInt32(TextureID); + _worldPacket.WriteUInt8((byte)EventType); _worldPacket.WriteBits(EventName.GetByteCount(), 8); _worldPacket.WriteBits(Description.GetByteCount(), 11); @@ -571,7 +571,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt8(Command); - _worldPacket.WriteUInt8(Result); + _worldPacket.WriteUInt8((byte)Result); _worldPacket.WriteBits(Name.GetByteCount(), 9); _worldPacket.FlushBits(); @@ -592,7 +592,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt64(InstanceID); _worldPacket.WriteUInt32(ServerTime); _worldPacket.WriteInt32(MapID); - _worldPacket.WriteUInt32(DifficultyID); + _worldPacket.WriteUInt32((uint)DifficultyID); _worldPacket.WriteInt32(TimeRemaining); } @@ -611,7 +611,7 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt64(InstanceID); _worldPacket.WriteInt32(MapID); - _worldPacket.WriteUInt32(DifficultyID); + _worldPacket.WriteUInt32((uint)DifficultyID); } public ulong InstanceID; @@ -625,7 +625,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(ServerTime); + _worldPacket.WriteUInt32((uint)ServerTime); _worldPacket.WriteInt32(MapID); _worldPacket.WriteUInt32(DifficultyID); _worldPacket.WriteInt32(NewTimeRemaining); @@ -645,7 +645,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Invites.Count); + _worldPacket.WriteInt32(Invites.Count); foreach (var invite in Invites) { _worldPacket.WritePackedGuid(invite.InviteGuid); @@ -832,8 +832,8 @@ namespace Game.Network.Packets { data.WriteUInt64(EventID); data.WriteUInt64(InviteID); - data.WriteUInt8(Status); - data.WriteUInt8(Moderator); + data.WriteUInt8((byte)Status); + data.WriteUInt8((byte)Moderator); data.WriteUInt8(InviteType); data.WritePackedGuid(InviterGuid); } @@ -852,7 +852,7 @@ namespace Game.Network.Packets data.WriteUInt64(InstanceID); data.WriteInt32(MapID); data.WriteUInt32(DifficultyID); - data.WriteUInt32(ExpireTime); + data.WriteUInt32((uint)ExpireTime); } public ulong InstanceID; @@ -866,9 +866,9 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt64(EventID); - data.WriteUInt8(EventType); + data.WriteUInt8((byte)EventType); data.WritePackedTime(Date); - data.WriteUInt32(Flags); + data.WriteUInt32((uint)Flags); data.WriteInt32(TextureID); data.WriteUInt64(EventClubID); data.WritePackedGuid(OwnerGuid); @@ -896,8 +896,8 @@ namespace Game.Network.Packets data.WriteUInt64(InviteID); data.WriteUInt8(Level); - data.WriteUInt8(Status); - data.WriteUInt8(Moderator); + data.WriteUInt8((byte)Status); + data.WriteUInt8((byte)Moderator); data.WriteUInt8(InviteType); data.WritePackedTime(ResponseTime); diff --git a/Source/Game/Network/Packets/ChannelPackets.cs b/Source/Game/Network/Packets/ChannelPackets.cs index cbf2343cd..8b8b7e960 100644 --- a/Source/Game/Network/Packets/ChannelPackets.cs +++ b/Source/Game/Network/Packets/ChannelPackets.cs @@ -33,15 +33,15 @@ namespace Game.Network.Packets { _worldPacket.WriteBit(Display); _worldPacket.WriteBits(Channel.GetByteCount(), 7); - _worldPacket.WriteUInt32(ChannelFlags); - _worldPacket.WriteUInt32(Members.Count); + _worldPacket.WriteUInt32((uint)ChannelFlags); + _worldPacket.WriteInt32(Members.Count); _worldPacket.WriteString(Channel); foreach (ChannelPlayer player in Members) { _worldPacket.WritePackedGuid(player.Guid); _worldPacket.WriteUInt32(player.VirtualRealmAddress); - _worldPacket.WriteUInt8(player.Flags); + _worldPacket.WriteUInt8((byte)player.Flags); } } @@ -84,8 +84,8 @@ namespace Game.Network.Packets if (Type == ChatNotify.ModeChangeNotice) { - _worldPacket.WriteUInt8(OldFlags); - _worldPacket.WriteUInt8(NewFlags); + _worldPacket.WriteUInt8((byte)OldFlags); + _worldPacket.WriteUInt8((byte)NewFlags); } _worldPacket.WriteString(Channel); @@ -112,10 +112,10 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteBits(Channel.GetByteCount(), 7); - _worldPacket.WriteBits(ChannelWelcomeMsg.GetByteCount(), 10); - _worldPacket.WriteUInt32(ChannelFlags); + _worldPacket.WriteBits(ChannelWelcomeMsg.GetByteCount(), 11); + _worldPacket.WriteUInt32((uint)ChannelFlags); _worldPacket.WriteInt32(ChatChannelID); - _worldPacket.WriteUInt64(InstanceID); + _worldPacket.WriteUInt64((ulong)InstanceID); _worldPacket.WriteString(Channel); _worldPacket.WriteString(ChannelWelcomeMsg); } @@ -151,8 +151,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(AddedUserGUID); - _worldPacket.WriteUInt8(UserFlags); - _worldPacket.WriteUInt32(ChannelFlags); + _worldPacket.WriteUInt8((byte)UserFlags); + _worldPacket.WriteUInt32((uint)ChannelFlags); _worldPacket.WriteUInt32(ChannelID); _worldPacket.WriteBits(ChannelName.GetByteCount(), 7); @@ -174,7 +174,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(RemovedUserGUID); - _worldPacket.WriteUInt32(ChannelFlags); + _worldPacket.WriteUInt32((uint)ChannelFlags); _worldPacket.WriteUInt32(ChannelID); _worldPacket.WriteBits(ChannelName.GetByteCount(), 7); @@ -195,8 +195,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(UpdatedUserGUID); - _worldPacket.WriteUInt8(UserFlags); - _worldPacket.WriteUInt32(ChannelFlags); + _worldPacket.WriteUInt8((byte)UserFlags); + _worldPacket.WriteUInt32((uint)ChannelFlags); _worldPacket.WriteUInt32(ChannelID); _worldPacket.WriteBits(ChannelName.GetByteCount(), 7); diff --git a/Source/Game/Network/Packets/CharacterPackets.cs b/Source/Game/Network/Packets/CharacterPackets.cs index 1723736d7..3d4536109 100644 --- a/Source/Game/Network/Packets/CharacterPackets.cs +++ b/Source/Game/Network/Packets/CharacterPackets.cs @@ -46,10 +46,10 @@ namespace Game.Network.Packets _worldPacket.WriteBit(IsDemonHunterCreationAllowed); _worldPacket.WriteBit(DisabledClassesMask.HasValue); _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); - _worldPacket.WriteUInt32(Characters.Count); + _worldPacket.WriteInt32(Characters.Count); _worldPacket.WriteInt32(MaxCharacterLevel); - _worldPacket.WriteUInt32(RaceUnlockData.Count); - _worldPacket.WriteUInt32(UnlockedConditionalAppearances.Count); + _worldPacket.WriteInt32(RaceUnlockData.Count); + _worldPacket.WriteInt32(UnlockedConditionalAppearances.Count); if (DisabledClassesMask.HasValue) _worldPacket.WriteUInt32(DisabledClassesMask.Value); @@ -190,7 +190,7 @@ namespace Game.Network.Packets data.WriteUInt64(GuildClubMemberID); data.WriteUInt8(ListPosition); data.WriteUInt8(RaceId); - data.WriteUInt8(ClassId); + data.WriteUInt8((byte)ClassId); data.WriteUInt8(Sex); data.WriteUInt8(Skin); data.WriteUInt8(Face); @@ -206,8 +206,8 @@ namespace Game.Network.Packets data.WriteUInt32(MapId); data.WriteVector3(PreLoadPosition); data.WritePackedGuid(GuildGuid); - data.WriteUInt32(Flags); - data.WriteUInt32(CustomizationFlag); + data.WriteUInt32((uint)Flags); + data.WriteUInt32((uint)CustomizationFlag); data.WriteUInt32(Flags3); data.WriteUInt32(Pet.CreatureDisplayId); data.WriteUInt32(Pet.Level); @@ -356,7 +356,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Code); + _worldPacket.WriteUInt8((byte)Code); _worldPacket.WritePackedGuid(Guid); } @@ -382,7 +382,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Code); + _worldPacket.WriteUInt8((byte)Code); } public ResponseCodes Code; @@ -411,7 +411,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Result); + _worldPacket.WriteUInt8((byte)Result); _worldPacket.WriteBit(Guid.HasValue); _worldPacket.WriteBits(Name.GetByteCount(), 6); _worldPacket.FlushBits(); @@ -493,7 +493,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Result); + _worldPacket.WriteUInt8((byte)Result); _worldPacket.WritePackedGuid(Guid); _worldPacket.WriteBit(Display.HasValue); _worldPacket.FlushBits(); @@ -593,7 +593,7 @@ namespace Game.Network.Packets public override void Read() { UndeleteInfo = new CharacterUndeleteInfo(); - _worldPacket.WriteUInt32(UndeleteInfo.ClientToken); + _worldPacket.WriteInt32(UndeleteInfo.ClientToken); _worldPacket.WritePackedGuid(UndeleteInfo.CharacterGuid); } @@ -608,7 +608,7 @@ namespace Game.Network.Packets { Cypher.Assert(UndeleteInfo != null); _worldPacket.WriteInt32(UndeleteInfo.ClientToken); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WritePackedGuid(UndeleteInfo.CharacterGuid); } @@ -681,7 +681,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Code); + _worldPacket.WriteUInt8((byte)Code); } LoginFailureReason Code; @@ -849,7 +849,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Result); + _worldPacket.WriteInt32((int)Result); } public ResultEnum Result; @@ -871,7 +871,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(Victim); _worldPacket.WriteInt32(Original); - _worldPacket.WriteUInt8(Reason); + _worldPacket.WriteUInt8((byte)Reason); _worldPacket.WriteInt32(Amount); _worldPacket.WriteFloat(GroupBonus); _worldPacket.WriteUInt8(ReferAFriendBonusType); @@ -1044,7 +1044,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(ResultCode); + _worldPacket.WriteInt32((int)ResultCode); _worldPacket.WritePackedGuid(Player); } diff --git a/Source/Game/Network/Packets/ChatPackets.cs b/Source/Game/Network/Packets/ChatPackets.cs index 79d307106..ef00df6e5 100644 --- a/Source/Game/Network/Packets/ChatPackets.cs +++ b/Source/Game/Network/Packets/ChatPackets.cs @@ -208,8 +208,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(SlashCmd); - _worldPacket.WriteUInt32(_Language); + _worldPacket.WriteUInt8((byte)SlashCmd); + _worldPacket.WriteUInt32((uint)_Language); _worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WritePackedGuid(SenderGuildGUID); _worldPacket.WritePackedGuid(SenderAccountGUID); @@ -269,7 +269,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(Guid); - _worldPacket.WriteUInt32(EmoteID); + _worldPacket.WriteInt32(EmoteID); } public ObjectGuid Guid; @@ -300,7 +300,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(SourceGUID); _worldPacket.WritePackedGuid(SourceAccountGUID); - _worldPacket.WriteUInt32(EmoteID); + _worldPacket.WriteInt32(EmoteID); _worldPacket.WriteInt32(SoundIndex); _worldPacket.WritePackedGuid(TargetGUID); } @@ -376,7 +376,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Reason); + _worldPacket.WriteUInt8((byte)Reason); } ChatRestrictionType Reason; diff --git a/Source/Game/Network/Packets/ClientConfigPackets.cs b/Source/Game/Network/Packets/ClientConfigPackets.cs index ef3ec2c8a..632f96074 100644 --- a/Source/Game/Network/Packets/ClientConfigPackets.cs +++ b/Source/Game/Network/Packets/ClientConfigPackets.cs @@ -76,7 +76,7 @@ namespace Game.Network.Packets _worldPacket.WriteBits(DataType, 3); var bytes = CompressedData.GetData(); - _worldPacket.WriteUInt32(bytes.Length); + _worldPacket.WriteInt32(bytes.Length); _worldPacket.WriteBytes(bytes); } diff --git a/Source/Game/Network/Packets/CombatLogPackets.cs b/Source/Game/Network/Packets/CombatLogPackets.cs index d6d8e359c..8c932761c 100644 --- a/Source/Game/Network/Packets/CombatLogPackets.cs +++ b/Source/Game/Network/Packets/CombatLogPackets.cs @@ -111,7 +111,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(Victim); - _worldPacket.WriteUInt8(Type); + _worldPacket.WriteUInt8((byte)Type); _worldPacket.WriteInt32(Amount); _worldPacket.WriteInt32(Resisted); _worldPacket.WriteInt32(Absorbed); @@ -136,18 +136,18 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(Caster); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(Effects.Count); + _worldPacket.WriteInt32(Effects.Count); foreach (SpellLogEffect effect in Effects) { - _worldPacket.WriteUInt32(effect.Effect); + _worldPacket.WriteInt32(effect.Effect); - _worldPacket.WriteUInt32(effect.PowerDrainTargets.Count); - _worldPacket.WriteUInt32(effect.ExtraAttacksTargets.Count); - _worldPacket.WriteUInt32(effect.DurabilityDamageTargets.Count); - _worldPacket.WriteUInt32(effect.GenericVictimTargets.Count); - _worldPacket.WriteUInt32(effect.TradeSkillTargets.Count); - _worldPacket.WriteUInt32(effect.FeedPetTargets.Count); + _worldPacket.WriteInt32(effect.PowerDrainTargets.Count); + _worldPacket.WriteInt32(effect.ExtraAttacksTargets.Count); + _worldPacket.WriteInt32(effect.DurabilityDamageTargets.Count); + _worldPacket.WriteInt32(effect.GenericVictimTargets.Count); + _worldPacket.WriteInt32(effect.TradeSkillTargets.Count); + _worldPacket.WriteInt32(effect.FeedPetTargets.Count); foreach (SpellLogEffectPowerDrainParams powerDrainTarget in effect.PowerDrainTargets) { @@ -260,7 +260,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(TargetGUID); _worldPacket.WritePackedGuid(CasterGUID); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(Effects.Count); + _worldPacket.WriteInt32(Effects.Count); WriteLogDataBit(); FlushBits(); @@ -358,9 +358,9 @@ namespace Game.Network.Packets _worldPacket.WriteBit(data.Rolled.HasValue); _worldPacket.WriteBit(data.Needed.HasValue); if (data.Rolled.HasValue) - _worldPacket.WriteUInt32(data.Rolled.Value); + _worldPacket.WriteInt32(data.Rolled.Value); if (data.Needed.HasValue) - _worldPacket.WriteUInt32(data.Needed.Value); + _worldPacket.WriteInt32(data.Needed.Value); _worldPacket.FlushBits(); } @@ -385,7 +385,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(CasterGUID); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(Type); + _worldPacket.WriteUInt32((uint)Type); _worldPacket.WriteInt32(Amount); _worldPacket.WriteInt32(OverEnergize); @@ -426,7 +426,7 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt32(SpellID); _worldPacket.WritePackedGuid(Caster); - _worldPacket.WriteUInt32(Entries); + _worldPacket.WriteInt32(Entries.Count); foreach (SpellLogMissEntry missEntry in Entries) missEntry.Write(_worldPacket); @@ -523,13 +523,13 @@ namespace Game.Network.Packets public override void Write() { WorldPacket attackRoundInfo = new WorldPacket(); - attackRoundInfo.WriteUInt32(hitInfo); + attackRoundInfo.WriteUInt32((uint)hitInfo); attackRoundInfo.WritePackedGuid(AttackerGUID); attackRoundInfo.WritePackedGuid(VictimGUID); attackRoundInfo.WriteInt32(Damage); attackRoundInfo.WriteInt32(OriginalDamage); attackRoundInfo.WriteInt32(OverDamage); - attackRoundInfo.WriteUInt8(SubDmg.HasValue); + attackRoundInfo.WriteUInt8((byte)(SubDmg.HasValue ? 1 : 0)); if (SubDmg.HasValue) { @@ -543,8 +543,8 @@ namespace Game.Network.Packets } attackRoundInfo.WriteUInt8(VictimState); - attackRoundInfo.WriteInt32(AttackerState); - attackRoundInfo.WriteInt32(MeleeSpellID); + attackRoundInfo.WriteUInt32(AttackerState); + attackRoundInfo.WriteUInt32(MeleeSpellID); if (hitInfo.HasAnyFlag(HitInfo.Block)) attackRoundInfo.WriteInt32(BlockAmount); @@ -571,7 +571,7 @@ namespace Game.Network.Packets if (hitInfo.HasAnyFlag(HitInfo.Block | HitInfo.Unk12)) attackRoundInfo.WriteFloat(Unk); - attackRoundInfo.WriteUInt8(ContentTuning.TuningType); + attackRoundInfo.WriteUInt8((byte)ContentTuning.TuningType); attackRoundInfo.WriteUInt8(ContentTuning.TargetLevel); attackRoundInfo.WriteUInt8(ContentTuning.Expansion); attackRoundInfo.WriteUInt8(ContentTuning.TargetMinScalingLevel); @@ -580,13 +580,13 @@ namespace Game.Network.Packets attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta); attackRoundInfo.WriteUInt16(ContentTuning.PlayerItemLevel); attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID); - attackRoundInfo.WriteUInt8(ContentTuning.ScalesWithItemLevel ? 1 : 0); + attackRoundInfo.WriteUInt8((byte)(ContentTuning.ScalesWithItemLevel ? 1 : 0)); WriteLogDataBit(); FlushBits(); WriteLogData(); - _worldPacket.WriteInt32(attackRoundInfo.GetSize()); + _worldPacket.WriteUInt32(attackRoundInfo.GetSize()); _worldPacket.WriteBytes(attackRoundInfo); } diff --git a/Source/Game/Network/Packets/CombatPackets.cs b/Source/Game/Network/Packets/CombatPackets.cs index 8eed0110b..088885c33 100644 --- a/Source/Game/Network/Packets/CombatPackets.cs +++ b/Source/Game/Network/Packets/CombatPackets.cs @@ -156,7 +156,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(UnitGUID); - _worldPacket.WriteUInt32(Reaction); + _worldPacket.WriteUInt32((uint)Reaction); } public ObjectGuid UnitGUID; @@ -180,7 +180,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(Guid); - _worldPacket.WriteUInt32(Powers.Count); + _worldPacket.WriteInt32(Powers.Count); foreach (var power in Powers) { _worldPacket.WriteInt32(power.Power); diff --git a/Source/Game/Network/Packets/EquipmentPackets.cs b/Source/Game/Network/Packets/EquipmentPackets.cs index 4aad4ec4a..6e6dfb2f6 100644 --- a/Source/Game/Network/Packets/EquipmentPackets.cs +++ b/Source/Game/Network/Packets/EquipmentPackets.cs @@ -44,11 +44,11 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(SetData.Count); + _worldPacket.WriteInt32(SetData.Count); foreach (var equipSet in SetData) { - _worldPacket.WriteInt32(equipSet.Type); + _worldPacket.WriteInt32((int)equipSet.Type); _worldPacket.WriteUInt64(equipSet.Guid); _worldPacket.WriteUInt32(equipSet.SetID); _worldPacket.WriteUInt32(equipSet.IgnoreMask); diff --git a/Source/Game/Network/Packets/GameObjectPackets.cs b/Source/Game/Network/Packets/GameObjectPackets.cs index cd305a443..bd6222a46 100644 --- a/Source/Game/Network/Packets/GameObjectPackets.cs +++ b/Source/Game/Network/Packets/GameObjectPackets.cs @@ -75,7 +75,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(ObjectGUID); - _worldPacket.WriteUInt32(AnimKitID); + _worldPacket.WriteInt32(AnimKitID); _worldPacket.WriteBit(Maintain); _worldPacket.FlushBits(); } diff --git a/Source/Game/Network/Packets/GarrisonPackets.cs b/Source/Game/Network/Packets/GarrisonPackets.cs index e8bba7cbf..1279c60bc 100644 --- a/Source/Game/Network/Packets/GarrisonPackets.cs +++ b/Source/Game/Network/Packets/GarrisonPackets.cs @@ -43,7 +43,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt32(GarrSiteID); } @@ -64,9 +64,9 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(FactionIndex); - _worldPacket.WriteUInt32(Garrisons.Count); - _worldPacket.WriteUInt32(FollowerSoftCaps.Count); + _worldPacket.WriteUInt32(FactionIndex); + _worldPacket.WriteInt32(Garrisons.Count); + _worldPacket.WriteInt32(FollowerSoftCaps.Count); foreach (FollowerSoftCapInfo followerSoftCapInfo in FollowerSoftCaps) followerSoftCapInfo.Write(_worldPacket); @@ -86,7 +86,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Sites.Count); + _worldPacket.WriteInt32(Sites.Count); foreach (GarrisonRemoteSiteInfo site in Sites) site.Write(_worldPacket); } @@ -116,8 +116,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteInt32((int)GarrTypeID); + _worldPacket.WriteUInt32((uint)Result); BuildingInfo.Write(_worldPacket); _worldPacket.WriteBit(PlayActivationCinematic); _worldPacket.FlushBits(); @@ -149,8 +149,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteInt32((int)GarrTypeID); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt32(GarrPlotInstanceID); _worldPacket.WriteUInt32(GarrBuildingID); } @@ -167,8 +167,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteInt32((int)GarrTypeID); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt32(BuildingID); } @@ -183,8 +183,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteInt32((int)GarrTypeID); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt32(BuildingID); } @@ -206,9 +206,9 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); - _worldPacket.WriteUInt32(BlueprintsKnown != null ? BlueprintsKnown.Count : 0); - _worldPacket.WriteUInt32(SpecializationsKnown != null ? SpecializationsKnown.Count : 0); + _worldPacket.WriteUInt32((uint)GarrTypeID); + _worldPacket.WriteInt32(BlueprintsKnown != null ? BlueprintsKnown.Count : 0); + _worldPacket.WriteInt32(SpecializationsKnown != null ? SpecializationsKnown.Count : 0); if (BlueprintsKnown != null) foreach (uint blueprint in BlueprintsKnown) _worldPacket.WriteUInt32(blueprint); @@ -236,7 +236,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Landmarks.Count); + _worldPacket.WriteInt32(Landmarks.Count); foreach (GarrisonBuildingLandmark landmark in Landmarks) landmark.Write(_worldPacket); } @@ -250,7 +250,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); + _worldPacket.WriteInt32((int)GarrTypeID); PlotInfo.Write(_worldPacket); } @@ -276,8 +276,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(GarrTypeID); - _worldPacket .WriteUInt32(Result); + _worldPacket.WriteInt32((int)GarrTypeID); + _worldPacket .WriteUInt32((uint)Result); Follower.Write(_worldPacket); } @@ -337,9 +337,9 @@ namespace Game.Network.Packets { data.WriteUInt32(GarrPlotInstanceID); data.WriteUInt32(GarrBuildingID); - data.WriteUInt32(TimeBuilt); + data.WriteUInt32((uint)TimeBuilt); data.WriteUInt32(CurrentGarSpecID); - data.WriteUInt32(TimeSpecCooldown); + data.WriteUInt32((uint)TimeSpecCooldown); data.WriteBit(Active); data.FlushBits(); } @@ -366,7 +366,7 @@ namespace Game.Network.Packets data.WriteUInt32(Durability); data.WriteUInt32(CurrentBuildingID); data.WriteUInt32(CurrentMissionID); - data.WriteUInt32(AbilityID.Count); + data.WriteInt32(AbilityID.Count); data.WriteUInt32(ZoneSupportSpellID); data.WriteUInt32(FollowerStatus); @@ -399,9 +399,9 @@ namespace Game.Network.Packets { data.WriteUInt64(DbID); data.WriteUInt32(MissionRecID); - data.WriteUInt32(OfferTime); + data.WriteUInt32((uint)OfferTime); data.WriteUInt32(OfferDuration); - data.WriteUInt32(StartTime); + data.WriteUInt32((uint)StartTime); data.WriteUInt32(TravelDuration); data.WriteUInt32(MissionDuration); data.WriteUInt32(MissionState); @@ -448,7 +448,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt32(GarrMssnBonusAbilityID); - data.WriteUInt32(StartTime); + data.WriteUInt32((uint)StartTime); } public uint GarrMssnBonusAbilityID; @@ -460,7 +460,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteInt32(GarrTalentID); - data.WriteInt32(ResearchStartTime); + data.WriteUInt32((uint)ResearchStartTime); data.WriteInt32(Flags); } @@ -473,20 +473,20 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteInt32(GarrTypeID); - data.WriteInt32(GarrSiteID); - data.WriteInt32(GarrSiteLevelID); - data.WriteUInt32(Buildings.Count); - data.WriteUInt32(Plots.Count); - data.WriteUInt32(Followers.Count); - data.WriteUInt32(Missions.Count); - data.WriteUInt32(MissionRewards.Count); - data.WriteUInt32(MissionOvermaxRewards.Count); - data.WriteUInt32(MissionAreaBonuses.Count); - data.WriteUInt32(Talents.Count); - data.WriteUInt32(CanStartMission.Count); - data.WriteUInt32(ArchivedMissions.Count); - data.WriteInt32(NumFollowerActivationsRemaining); + data.WriteUInt32((uint)GarrTypeID); + data.WriteUInt32(GarrSiteID); + data.WriteUInt32(GarrSiteLevelID); + data.WriteInt32(Buildings.Count); + data.WriteInt32(Plots.Count); + data.WriteInt32(Followers.Count); + data.WriteInt32(Missions.Count); + data.WriteInt32(MissionRewards.Count); + data.WriteInt32(MissionOvermaxRewards.Count); + data.WriteInt32(MissionAreaBonuses.Count); + data.WriteInt32(Talents.Count); + data.WriteInt32(CanStartMission.Count); + data.WriteInt32(ArchivedMissions.Count); + data.WriteUInt32(NumFollowerActivationsRemaining); data.WriteUInt32(NumMissionsStartedToday); foreach (GarrisonPlotInfo plot in Plots) @@ -497,14 +497,14 @@ namespace Game.Network.Packets foreach (List missionReward in MissionRewards) { - data.WriteUInt32(missionReward.Count); + data.WriteInt32(missionReward.Count); foreach (GarrisonMissionReward missionRewardItem in missionReward) missionRewardItem.Write(data); } foreach (List missionReward in MissionOvermaxRewards) { - data.WriteUInt32(missionReward.Count); + data.WriteInt32(missionReward.Count); foreach (GarrisonMissionReward missionRewardItem in missionReward) missionRewardItem.Write(data); } @@ -582,7 +582,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt32(GarrSiteLevelID); - data.WriteUInt32(Buildings.Count); + data.WriteInt32(Buildings.Count); foreach (GarrisonRemoteBuildingInfo building in Buildings) building.Write(data); } diff --git a/Source/Game/Network/Packets/GuildFinderPackets.cs b/Source/Game/Network/Packets/GuildFinderPackets.cs index 42cf0f25f..a5ef2d7e3 100644 --- a/Source/Game/Network/Packets/GuildFinderPackets.cs +++ b/Source/Game/Network/Packets/GuildFinderPackets.cs @@ -81,7 +81,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Post.Count); + _worldPacket.WriteInt32(Post.Count); foreach (LFGuildBrowseData guildData in Post) guildData.Write(_worldPacket); } @@ -115,7 +115,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(NumRemaining); - _worldPacket.WriteUInt32(Application.Count); + _worldPacket.WriteInt32(Application.Count); foreach (LFGuildApplicationData application in Application) application.Write(_worldPacket); } @@ -164,8 +164,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Recruits.Count); - _worldPacket.WriteUInt32(UpdateTime); + _worldPacket.WriteInt32(Recruits.Count); + _worldPacket.WriteUInt32((uint)UpdateTime); foreach (LFGuildRecruitData recruit in Recruits) recruit.Write(_worldPacket); } diff --git a/Source/Game/Network/Packets/GuildPackets.cs b/Source/Game/Network/Packets/GuildPackets.cs index c529a441c..e2067e419 100644 --- a/Source/Game/Network/Packets/GuildPackets.cs +++ b/Source/Game/Network/Packets/GuildPackets.cs @@ -52,7 +52,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(Info.GuildGuid); _worldPacket.WriteUInt32(Info.VirtualRealmAddress); - _worldPacket.WriteUInt32(Info.Ranks.Count); + _worldPacket.WriteInt32(Info.Ranks.Count); _worldPacket.WriteUInt32(Info.EmblemStyle); _worldPacket.WriteUInt32(Info.EmblemColor); _worldPacket.WriteUInt32(Info.BorderStyle); @@ -129,8 +129,8 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(NumAccounts); _worldPacket.WritePackedTime(CreateDate); _worldPacket.WriteInt32(GuildFlags); - _worldPacket.WriteUInt32(MemberData.Count); - _worldPacket.WriteBits(WelcomeText.GetByteCount(), 10); + _worldPacket.WriteInt32(MemberData.Count); + _worldPacket.WriteBits(WelcomeText.GetByteCount(), 11); _worldPacket.WriteBits(InfoText.GetByteCount(), 10); _worldPacket.FlushBits(); @@ -157,7 +157,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(MemberData.Count); + _worldPacket.WriteInt32(MemberData.Count); MemberData.ForEach(p => p.Write(_worldPacket)); } @@ -171,7 +171,7 @@ namespace Game.Network.Packets public override void Read() { - uint textLen = _worldPacket.ReadBits(10); + uint textLen = _worldPacket.ReadBits(11); MotdText = _worldPacket.ReadString(textLen); } @@ -184,8 +184,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Result); - _worldPacket.WriteInt32(Command); + _worldPacket.WriteUInt32((uint)Result); + _worldPacket.WriteUInt32((uint)Command); _worldPacket.WriteBits(Name.GetByteCount(), 8); _worldPacket.WriteString(Name); @@ -307,7 +307,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteBits(MotdText.GetByteCount(), 10); + _worldPacket.WriteBits(MotdText.GetByteCount(), 11); _worldPacket.WriteString(MotdText); } @@ -386,7 +386,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Entry.Count); + _worldPacket.WriteInt32(Entry.Count); foreach (GuildEventEntry entry in Entry) { @@ -528,7 +528,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(WithdrawGoldLimit); _worldPacket.WriteInt32(Flags); _worldPacket.WriteInt32(NumTabs); - _worldPacket.WriteUInt32(Tab.Count); + _worldPacket.WriteInt32(Tab.Count); foreach (GuildRankTabPermissions tab in Tab) { @@ -648,7 +648,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Ranks.Count); + _worldPacket.WriteInt32(Ranks.Count); Ranks.ForEach(p => p.Write(_worldPacket)); } @@ -878,7 +878,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt32(Version); - _worldPacket.WriteUInt32(RewardItems.Count); + _worldPacket.WriteInt32(RewardItems.Count); foreach (var item in RewardItems) item.Write(_worldPacket); @@ -1016,14 +1016,14 @@ namespace Game.Network.Packets _worldPacket.WriteUInt64(Money); _worldPacket.WriteInt32(Tab); _worldPacket.WriteInt32(WithdrawalsRemaining); - _worldPacket.WriteUInt32(TabInfo.Count); - _worldPacket.WriteUInt32(ItemInfo.Count); + _worldPacket.WriteInt32(TabInfo.Count); + _worldPacket.WriteInt32(ItemInfo.Count); _worldPacket.WriteBit(FullUpdate); _worldPacket.FlushBits(); foreach (GuildBankTabInfo tab in TabInfo) { - _worldPacket.WriteUInt32(tab.TabIndex); + _worldPacket.WriteInt32(tab.TabIndex); _worldPacket.WriteBits(tab.Name.GetByteCount(), 7); _worldPacket.WriteBits(tab.Icon.GetByteCount(), 9); @@ -1121,7 +1121,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(Tab); - _worldPacket.WriteUInt32(Entry.Count); + _worldPacket.WriteInt32(Entry.Count); _worldPacket.WriteBit(WeeklyBonusMoney.HasValue); _worldPacket.FlushBits(); @@ -1222,7 +1222,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(NewsEvents.Count); + _worldPacket.WriteInt32(NewsEvents.Count); foreach (var newsEvent in NewsEvents) newsEvent.Write(_worldPacket); } @@ -1327,7 +1327,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Error); + _worldPacket.WriteUInt32((uint)Error); } public GuildEmblemError Error; @@ -1475,10 +1475,10 @@ namespace Game.Network.Packets { data.WriteUInt32(ItemID); data.WriteUInt32(Unk4); - data.WriteUInt32(AchievementsRequired.Count); + data.WriteInt32(AchievementsRequired.Count); data.WriteUInt64(RaceMask); - data.WriteUInt32(MinGuildLevel); - data.WriteUInt32(MinGuildRep); + data.WriteInt32(MinGuildLevel); + data.WriteInt32(MinGuildRep); data.WriteUInt64(Cost); foreach (var achievementId in AchievementsRequired) @@ -1538,7 +1538,7 @@ namespace Game.Network.Packets data.WriteInt32(Data[i]); data.WritePackedGuid(MemberGuid); - data.WriteUInt32(MemberList.Count); + data.WriteInt32(MemberList.Count); foreach (ObjectGuid memberGuid in MemberList) data.WritePackedGuid(memberGuid); diff --git a/Source/Game/Network/Packets/HotfixPackets.cs b/Source/Game/Network/Packets/HotfixPackets.cs index e8d6f3aa2..3d996f69b 100644 --- a/Source/Game/Network/Packets/HotfixPackets.cs +++ b/Source/Game/Network/Packets/HotfixPackets.cs @@ -132,7 +132,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Hotfixes.Count); + _worldPacket.WriteInt32(Hotfixes.Count); foreach (HotfixData hotfix in Hotfixes) hotfix.Write(_worldPacket); @@ -150,7 +150,7 @@ namespace Game.Network.Packets Record.Write(data); if (Size.HasValue) { - data.WriteUInt32(Size); + data.WriteUInt32(Size.Value); data.WriteBit(true); } else diff --git a/Source/Game/Network/Packets/InspectPackets.cs b/Source/Game/Network/Packets/InspectPackets.cs index 666c7c6b3..be887fc07 100644 --- a/Source/Game/Network/Packets/InspectPackets.cs +++ b/Source/Game/Network/Packets/InspectPackets.cs @@ -19,6 +19,7 @@ using Framework.Constants; using Framework.Dynamic; using Game.Entities; using System.Collections.Generic; +using System; namespace Game.Network.Packets { @@ -36,23 +37,23 @@ namespace Game.Network.Packets public class InspectResult : ServerPacket { - public InspectResult() : base(ServerOpcodes.InspectResult) { } + public InspectResult() : base(ServerOpcodes.InspectResult) + { + DisplayInfo = new PlayerModelDisplayInfo(); + } public override void Write() { - _worldPacket.WritePackedGuid(InspecteeGUID); - _worldPacket.WriteUInt32(Items.Count); - _worldPacket.WriteUInt32(Glyphs.Count); - _worldPacket.WriteUInt32(Talents.Count); - _worldPacket.WriteUInt32(PvpTalents.Count); - _worldPacket.WriteInt32(ClassID); - _worldPacket.WriteInt32(SpecializationID); - _worldPacket.WriteInt32(GenderID); + DisplayInfo.Write(_worldPacket); + _worldPacket.WriteInt32(Glyphs.Count); + _worldPacket.WriteInt32(Talents.Count); + _worldPacket.WriteInt32(PvpTalents.Count); + _worldPacket.WriteInt32(ItemLevel); _worldPacket.WriteUInt8(LifetimeMaxRank); _worldPacket.WriteUInt16(TodayHK); _worldPacket.WriteUInt16(YesterdayHK); - _worldPacket.WriteInt32(LifetimeHK); - _worldPacket.WriteInt32(HonorLevel); + _worldPacket.WriteUInt32(LifetimeHK); + _worldPacket.WriteUInt32(HonorLevel); for (int i = 0; i < Glyphs.Count; ++i) _worldPacket.WriteUInt16(Glyphs[i]); @@ -75,22 +76,16 @@ namespace Game.Network.Packets if (AzeriteLevel.HasValue) _worldPacket.WriteInt32(AzeriteLevel.Value); - - foreach (InspectItemData item in Items) - item.Write(_worldPacket); } - public ObjectGuid InspecteeGUID; - public List Items = new List(); + public PlayerModelDisplayInfo DisplayInfo; public List Glyphs = new List(); public List Talents = new List(); public List PvpTalents = new List(); - public Class ClassID = Class.None; - public Gender GenderID = Gender.None; public Optional GuildData = new Optional(); public Array Bracket = new Array(6); - public int SpecializationID; public Optional AzeriteLevel; + public int ItemLevel; public uint LifetimeHK; public uint HonorLevel; public ushort TodayHK; @@ -136,7 +131,7 @@ namespace Game.Network.Packets { public InspectItemData(Item item, byte index) { - CreatorGUID = item.GetGuidValue(ItemFields.Creator); + CreatorGUID = item.GetCreator(); Item = new ItemInstance(item); Index = index; @@ -150,7 +145,7 @@ namespace Game.Network.Packets } byte i = 0; - foreach (ItemDynamicFieldGems gemData in item.GetGems()) + foreach (SocketedGem gemData in item.m_itemData.Gems) { if (gemData.ItemId != 0) { @@ -167,7 +162,7 @@ namespace Game.Network.Packets { data.WritePackedGuid(CreatorGUID); data.WriteUInt8(Index); - data.WriteUInt32(AzeritePowers.Count); + data.WriteInt32(AzeritePowers.Count); foreach (var id in AzeritePowers) data.WriteInt32(id); @@ -193,6 +188,67 @@ namespace Game.Network.Packets public List AzeritePowers = new List(); } + public class PlayerModelDisplayInfo + { + public ObjectGuid GUID; + public List Items = new List(); + public string Name; + public uint SpecializationID; + public byte GenderID; + public byte Skin; + public byte HairColor; + public byte HairStyle; + public byte FacialHairStyle; + public byte Face; + public byte Race; + public byte ClassID; + public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + + public void Initialize(Player player) + { + GUID = player.GetGUID(); + SpecializationID = player.GetPrimarySpecialization(); + Name = player.GetName(); + GenderID = player.m_playerData.NativeSex; + Skin = player.m_playerData.SkinID; + HairColor = player.m_playerData.HairColorID; + HairStyle = player.m_playerData.HairStyleID; + FacialHairStyle = player.m_playerData.FacialHairStyleID; + Face = player.m_playerData.FaceID; + Race = (byte)player.GetRace(); + ClassID = (byte)player.GetClass(); + CustomDisplay.AddRange(player.m_playerData.CustomDisplayOption._values); + + for (byte i = 0; i < EquipmentSlot.End; ++i) + { + Item item = player.GetItemByPos(InventorySlots.Bag0, i); + if (item != null) + Items.Add(new InspectItemData(item, i)); + } + } + + public void Write(WorldPacket data) + { + data.WritePackedGuid(GUID); + data.WriteUInt32(SpecializationID); + data.WriteInt32(Items.Count); + data.WriteBits(Name.GetByteCount(), 6); + data.WriteUInt8(GenderID); + data.WriteUInt8(Skin); + data.WriteUInt8(HairColor); + data.WriteUInt8(HairStyle); + data.WriteUInt8(FacialHairStyle); + data.WriteUInt8(Face); + data.WriteUInt8(Race); + data.WriteUInt8(ClassID); + CustomDisplay.ForEach(id => data.WriteUInt8(id)); + + data.WriteString(Name); + + foreach (InspectItemData item in Items) + item.Write(data); + } + } public struct InspectGuildData { public void Write(WorldPacket data) diff --git a/Source/Game/Network/Packets/InstancePackets.cs b/Source/Game/Network/Packets/InstancePackets.cs index 20d97c0ac..9b280efac 100644 --- a/Source/Game/Network/Packets/InstancePackets.cs +++ b/Source/Game/Network/Packets/InstancePackets.cs @@ -121,7 +121,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(Delay); - _worldPacket.WriteUInt32(Reason); + _worldPacket.WriteUInt32((uint)Reason); } public int Delay; @@ -153,9 +153,9 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Type); + _worldPacket.WriteUInt8((byte)Type); _worldPacket.WriteUInt32(MapID); - _worldPacket.WriteUInt32(DifficultyID); + _worldPacket.WriteUInt32((uint)DifficultyID); _worldPacket.WriteBit(Locked); _worldPacket.WriteBit(Extended); _worldPacket.FlushBits(); @@ -277,7 +277,7 @@ namespace Game.Network.Packets data.WriteUInt32(MapID); data.WriteUInt32(DifficultyID); data.WriteUInt64(InstanceID); - data.WriteUInt32(TimeRemaining); + data.WriteInt32(TimeRemaining); data.WriteUInt32(CompletedMask); data.WriteBit(Locked); diff --git a/Source/Game/Network/Packets/ItemPackets.cs b/Source/Game/Network/Packets/ItemPackets.cs index 15daaa828..49e8910dd 100644 --- a/Source/Game/Network/Packets/ItemPackets.cs +++ b/Source/Game/Network/Packets/ItemPackets.cs @@ -90,7 +90,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(VendorGUID); _worldPacket.WriteUInt32(Muid); - _worldPacket.WriteUInt8(Reason); + _worldPacket.WriteUInt8((byte)Reason); } public ObjectGuid VendorGUID; @@ -237,7 +237,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt8(BagResult); + _worldPacket.WriteInt8((sbyte)BagResult); _worldPacket.WritePackedGuid(Item[0]); _worldPacket.WritePackedGuid(Item[1]); _worldPacket.WriteUInt8(ContainerBSlot); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_WRONG_BAG_TYPE_2 @@ -246,7 +246,7 @@ namespace Game.Network.Packets { case InventoryResult.CantEquipLevelI: case InventoryResult.PurchaseLevelTooLow: - _worldPacket.WriteUInt32(Level); + _worldPacket.WriteInt32(Level); break; case InventoryResult.EventAutoequipBindConfirm: _worldPacket.WritePackedGuid(SrcContainer); @@ -403,7 +403,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(VendorGUID); _worldPacket.WritePackedGuid(ItemGUID); - _worldPacket.WriteUInt8(Reason); + _worldPacket.WriteUInt8((byte)Reason); } public ObjectGuid VendorGUID; @@ -423,7 +423,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(QuestLogItemID); _worldPacket.WriteUInt32(Quantity); _worldPacket.WriteUInt32(QuantityInInventory); - _worldPacket.WriteUInt32(DungeonEncounterID); + _worldPacket.WriteInt32(DungeonEncounterID); _worldPacket.WriteInt32(BattlePetSpeciesID); _worldPacket.WriteInt32(BattlePetBreedID); _worldPacket.WriteUInt32(BattlePetBreedQuality); @@ -603,39 +603,6 @@ namespace Game.Network.Packets public ObjectGuid ItemGuid; } - class UpgradeItem : ClientPacket - { - public UpgradeItem(WorldPacket packet) : base(packet) { } - - public override void Read() - { - ItemMaster = _worldPacket.ReadPackedGuid(); - ItemGUID = _worldPacket.ReadPackedGuid(); - UpgradeID = _worldPacket.ReadInt32(); - ContainerSlot = _worldPacket.ReadInt32(); - Slot = _worldPacket.ReadInt32(); - } - - public ObjectGuid ItemMaster; - public ObjectGuid ItemGUID; - public int ContainerSlot; - public int UpgradeID; - public int Slot; - } - - class ItemUpgradeResult : ServerPacket - { - public ItemUpgradeResult() : base(ServerOpcodes.ItemUpgradeResult) { } - - public override void Write() - { - _worldPacket.WriteBit(Success); - _worldPacket.FlushBits(); - } - - public bool Success; - } - class SocketGems : ClientPacket { public SocketGems(WorldPacket packet) : base(packet) { } @@ -716,7 +683,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt8(Context); - data.WriteUInt32(BonusListIDs.Count); + data.WriteInt32(BonusListIDs.Count); foreach (uint bonusID in BonusListIDs) data.WriteUInt32(bonusID); } @@ -774,15 +741,15 @@ namespace Game.Network.Packets public ItemInstance(Item item) { ItemID = item.GetEntry(); - var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds); + List bonusListIds = item.m_itemData.BonusListIDs; if (!bonusListIds.Empty()) { ItemBonus.HasValue = true; ItemBonus.Value.BonusListIDs.AddRange(bonusListIds); - ItemBonus.Value.Context = (byte)item.GetUInt32Value(ItemFields.Context); + ItemBonus.Value.Context = (byte)item.m_itemData.Context; } - uint mask = item.GetUInt32Value(ItemFields.ModifiersMask); + uint mask = item.m_itemData.ModifiersMask; if (mask != 0) { Modifications.HasValue = true; @@ -799,11 +766,13 @@ namespace Game.Network.Packets { ItemID = lootItem.itemid; - if (!lootItem.BonusListIDs.Empty()) + if (!lootItem.BonusListIDs.Empty() || lootItem.randomBonusListId != 0) { ItemBonus.HasValue = true; ItemBonus.Value.BonusListIDs = lootItem.BonusListIDs; ItemBonus.Value.Context = lootItem.context; + if (lootItem.randomBonusListId != 0) + ItemBonus.Value.BonusListIDs.Add(lootItem.randomBonusListId); } if (lootItem.upgradeId != 0) @@ -836,7 +805,7 @@ namespace Game.Network.Packets } } - public ItemInstance(ItemDynamicFieldGems gem) + public ItemInstance(SocketedGem gem) { ItemID = gem.ItemId; diff --git a/Source/Game/Network/Packets/LFGPackets.cs b/Source/Game/Network/Packets/LFGPackets.cs index aae3471e3..d89987228 100644 --- a/Source/Game/Network/Packets/LFGPackets.cs +++ b/Source/Game/Network/Packets/LFGPackets.cs @@ -141,7 +141,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Dungeons.Count); + _worldPacket.WriteInt32(Dungeons.Count); BlackList.Write(_worldPacket); foreach (var dungeonInfo in Dungeons) @@ -158,7 +158,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Player.Count); + _worldPacket.WriteInt32(Player.Count); foreach (var blackList in Player) blackList.Write(_worldPacket); } @@ -176,9 +176,9 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(SubType); _worldPacket.WriteUInt8(Reason); - _worldPacket.WriteUInt32(Slots.Count); + _worldPacket.WriteInt32(Slots.Count); _worldPacket.WriteUInt32(RequestedRoles); - _worldPacket.WriteUInt32(SuspendedPlayers.Count); + _worldPacket.WriteInt32(SuspendedPlayers.Count); foreach (var slot in Slots) _worldPacket.WriteUInt32(slot); @@ -216,7 +216,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(Player); - _worldPacket.WriteUInt32(RoleMask); + _worldPacket.WriteUInt32((uint)RoleMask); _worldPacket.WriteBit(Accepted); _worldPacket.FlushBits(); } @@ -234,10 +234,10 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt8(PartyIndex); _worldPacket.WriteUInt8(RoleCheckStatus); - _worldPacket.WriteUInt32(JoinSlots.Count); - _worldPacket.WriteUInt32(BgQueueIDs.Count); - _worldPacket.WriteUInt32(GroupFinderActivityID); - _worldPacket.WriteUInt32(Members.Count); + _worldPacket.WriteInt32(JoinSlots.Count); + _worldPacket.WriteInt32(BgQueueIDs.Count); + _worldPacket.WriteInt32(GroupFinderActivityID); + _worldPacket.WriteInt32(Members.Count); foreach (var slot in JoinSlots) _worldPacket.WriteUInt32(slot); @@ -273,8 +273,8 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(Result); _worldPacket.WriteUInt8(ResultDetail); - _worldPacket.WriteUInt32(BlackList.Count); - _worldPacket.WriteUInt32(BlackListNames.Count); + _worldPacket.WriteInt32(BlackList.Count); + _worldPacket.WriteInt32(BlackListNames.Count); foreach (LFGJoinBlackList blackList in BlackList) blackList.Write(_worldPacket); @@ -334,7 +334,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(ActualSlot); _worldPacket.WriteUInt32(RewardMoney); _worldPacket.WriteUInt32(AddedXP); - _worldPacket.WriteUInt32(Rewards.Count); + _worldPacket.WriteInt32(Rewards.Count); foreach (var reward in Rewards) reward.Write(_worldPacket); @@ -373,7 +373,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(State); _worldPacket.WriteUInt32(CompletedMask); _worldPacket.WriteUInt32(EncounterMask); - _worldPacket.WriteUInt32(Players.Count); + _worldPacket.WriteInt32(Players.Count); _worldPacket.WriteUInt8(Unused); _worldPacket.WriteBit(ValidCompletedMask); _worldPacket.WriteBit(ProposalSilent); @@ -458,7 +458,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteBit(PlayerGuid.HasValue); - data.WriteUInt32(Slot.Count); + data.WriteInt32(Slot.Count); if (PlayerGuid.HasValue) data.WritePackedGuid(PlayerGuid.Value); @@ -503,7 +503,7 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteInt32(Mask); + data.WriteUInt32(Mask); data.WriteUInt32(RewardMoney); data.WriteUInt32(RewardXP); data.WriteInt32(Item.Count); @@ -566,7 +566,7 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteInt32(Slot); + data.WriteUInt32(Slot); data.WriteInt32(CompletionQuantity); data.WriteInt32(CompletionLimit); data.WriteInt32(CompletionCurrencyID); @@ -579,7 +579,7 @@ namespace Game.Network.Packets data.WriteInt32(PurseQuantity); data.WriteInt32(PurseLimit); data.WriteInt32(Quantity); - data.WriteInt32(CompletedMask); + data.WriteUInt32(CompletedMask); data.WriteUInt32(EncounterMask); data.WriteInt32(ShortageReward.Count); data.WriteBit(FirstReward); @@ -658,7 +658,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WritePackedGuid(PlayerGuid); - data.WriteUInt32(Slots.Count); + data.WriteInt32(Slots.Count); foreach (LFGJoinBlackListSlot lfgBlackListSlot in Slots) { @@ -702,7 +702,7 @@ namespace Game.Network.Packets data.WriteUInt32(Quantity); data.WriteInt32(BonusQuantity); if (RewardCurrency.HasValue) - data.WriteInt32(RewardCurrency.Value); + data.WriteUInt32(RewardCurrency.Value); } public Optional RewardItem; @@ -723,7 +723,7 @@ namespace Game.Network.Packets data.WritePackedGuid(Target); data.WriteUInt32(TotalVotes); data.WriteUInt32(BootVotes); - data.WriteInt32(TimeLeft); + data.WriteUInt32(TimeLeft); data.WriteUInt32(VotesNeeded); data.WriteString(Reason); } @@ -775,7 +775,7 @@ namespace Game.Network.Packets { data.WritePackedGuid(RequesterGuid); data.WriteUInt32(Id); - data.WriteUInt32(Type); + data.WriteUInt32((uint)Type); data.WriteInt32(Time); } diff --git a/Source/Game/Network/Packets/LootPackets.cs b/Source/Game/Network/Packets/LootPackets.cs index 939ec6cba..9c4d138cd 100644 --- a/Source/Game/Network/Packets/LootPackets.cs +++ b/Source/Game/Network/Packets/LootPackets.cs @@ -42,13 +42,13 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(Owner); _worldPacket.WritePackedGuid(LootObj); - _worldPacket.WriteUInt8(FailureReason); + _worldPacket.WriteUInt8((byte)FailureReason); _worldPacket.WriteUInt8(AcquireReason); - _worldPacket.WriteUInt8(LootMethod); + _worldPacket.WriteUInt8((byte)LootMethod); _worldPacket.WriteUInt8(Threshold); _worldPacket.WriteUInt32(Coins); - _worldPacket.WriteUInt32(Items.Count); - _worldPacket.WriteUInt32(Currencies.Count); + _worldPacket.WriteInt32(Items.Count); + _worldPacket.WriteInt32(Currencies.Count); _worldPacket.WriteBit(Acquired); _worldPacket.WriteBit(AELooting); _worldPacket.FlushBits(); @@ -250,8 +250,8 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(LootObj); _worldPacket.WriteInt32(MapID); _worldPacket.WriteUInt32(RollTime); - _worldPacket.WriteUInt8(ValidRolls); - _worldPacket.WriteUInt8(Method); + _worldPacket.WriteUInt8((byte)ValidRolls); + _worldPacket.WriteUInt8((byte)Method); Item.Write(_worldPacket); } @@ -272,7 +272,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(LootObj); _worldPacket.WritePackedGuid(Player); _worldPacket.WriteInt32(Roll); - _worldPacket.WriteUInt8(RollType); + _worldPacket.WriteUInt8((byte)RollType); Item.Write(_worldPacket); _worldPacket.WriteBit(Autopassed); _worldPacket.FlushBits(); @@ -295,7 +295,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(LootObj); _worldPacket.WritePackedGuid(Winner); _worldPacket.WriteInt32(Roll); - _worldPacket.WriteUInt8(RollType); + _worldPacket.WriteUInt8((byte)RollType); Item.Write(_worldPacket); _worldPacket.WriteBit(MainSpec); _worldPacket.FlushBits(); @@ -366,7 +366,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(LootObj); - _worldPacket.WriteUInt32(Players.Count); + _worldPacket.WriteInt32(Players.Count); Players.ForEach(guid => _worldPacket.WritePackedGuid(guid)); } diff --git a/Source/Game/Network/Packets/MailPackets.cs b/Source/Game/Network/Packets/MailPackets.cs index e48a64700..51663a778 100644 --- a/Source/Game/Network/Packets/MailPackets.cs +++ b/Source/Game/Network/Packets/MailPackets.cs @@ -42,7 +42,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Mails.Count); + _worldPacket.WriteInt32(Mails.Count); _worldPacket.WriteInt32(TotalNumRecords); Mails.ForEach(p => p.Write(_worldPacket)); @@ -317,8 +317,8 @@ namespace Game.Network.Packets Item = new ItemInstance(item); Count = item.GetCount(); Charges = item.GetSpellCharges(); - MaxDurability = item.GetUInt32Value(ItemFields.MaxDurability); - Durability = item.GetUInt32Value(ItemFields.Durability); + MaxDurability = item.m_itemData.MaxDurability; + Durability = item.m_itemData.Durability; Unlocked = !item.IsLocked(); for (EnchantmentSlot slot = 0; slot < EnchantmentSlot.MaxInspected; slot++) @@ -330,7 +330,7 @@ namespace Game.Network.Packets } byte i = 0; - foreach (ItemDynamicFieldGems gemData in item.GetGems()) + foreach (SocketedGem gemData in item.m_itemData.Gems) { if (gemData.ItemId != 0) { @@ -346,11 +346,11 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt8(Position); - data.WriteUInt32(AttachID); - data.WriteInt32(Count); + data.WriteInt32(AttachID); + data.WriteUInt32(Count); data.WriteInt32(Charges); - data.WriteInt32(MaxDurability); - data.WriteInt32(Durability); + data.WriteUInt32(MaxDurability); + data.WriteUInt32(Durability); Item.Write(data); data.WriteBits(Enchants.Count, 4); data.WriteBits(Gems.Count, 2); @@ -423,7 +423,7 @@ namespace Game.Network.Packets data.WriteInt32(Flags); data.WriteFloat(DaysLeft); data.WriteInt32(MailTemplateID); - data.WriteUInt32(Attachments.Count); + data.WriteInt32(Attachments.Count); data.WriteBit(SenderCharacter.HasValue); data.WriteBit(AltSenderID.HasValue); @@ -437,7 +437,7 @@ namespace Game.Network.Packets data.WritePackedGuid(SenderCharacter.Value); if (AltSenderID.HasValue) - data.WriteInt32(AltSenderID.Value); + data.WriteUInt32(AltSenderID.Value); data.WriteString(Subject); data.WriteString(Body); diff --git a/Source/Game/Network/Packets/MiscPackets.cs b/Source/Game/Network/Packets/MiscPackets.cs index 3fb6e263d..42e61010b 100644 --- a/Source/Game/Network/Packets/MiscPackets.cs +++ b/Source/Game/Network/Packets/MiscPackets.cs @@ -94,8 +94,8 @@ namespace Game.Network.Packets _worldPacket.WritePackedTime(ServerTime); _worldPacket.WritePackedTime(GameTime); _worldPacket.WriteFloat(NewSpeed); - _worldPacket.WriteUInt32(ServerTimeHolidayOffset); - _worldPacket.WriteUInt32(GameTimeHolidayOffset); + _worldPacket.WriteInt32(ServerTimeHolidayOffset); + _worldPacket.WriteInt32(GameTimeHolidayOffset); } public float NewSpeed; @@ -160,8 +160,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32("Type"); - _worldPacket.WriteUInt32("MaxWeeklyQuantity"); + _worldPacket.WriteUInt32(Type); + _worldPacket.WriteUInt32(MaxWeeklyQuantity); } public uint MaxWeeklyQuantity; @@ -193,7 +193,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Data.Count); + _worldPacket.WriteInt32(Data.Count); foreach (Record data in Data) { @@ -214,7 +214,7 @@ namespace Game.Network.Packets if (data.TrackedQuantity.HasValue) _worldPacket.WriteUInt32(data.TrackedQuantity.Value); if (data.MaxQuantity.HasValue) - _worldPacket.WriteUInt32(data.MaxQuantity.Value); + _worldPacket.WriteInt32(data.MaxQuantity.Value); } } @@ -424,7 +424,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(DifficultyID); - _worldPacket.WriteUInt8(Legacy); + _worldPacket.WriteUInt8((byte)(Legacy ? 1 : 0)); } public int DifficultyID; @@ -516,7 +516,7 @@ namespace Game.Network.Packets _worldPacket.WriteBit(IsGossipTriggered); _worldPacket.FlushBits(); - _worldPacket.WriteUInt32(CemeteryID.Count); + _worldPacket.WriteInt32(CemeteryID.Count); foreach (uint cemetery in CemeteryID) _worldPacket.WriteUInt32(cemetery); } @@ -550,7 +550,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(WeatherID); + _worldPacket.WriteUInt32((uint)WeatherID); _worldPacket.WriteFloat(Intensity); _worldPacket.WriteBit(Abrupt); @@ -585,13 +585,28 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt32(AnimKitID); - _worldPacket.WriteUInt8(State); + _worldPacket.WriteUInt8((byte)State); } uint AnimKitID; UnitStandStateType State; } + public class SetAnimTier : ServerPacket + { + public SetAnimTier() : base(ServerOpcodes.SetAnimTier, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WritePackedGuid(Unit); + _worldPacket.WriteBits(Tier, 3); + _worldPacket.FlushBits(); + } + + public ObjectGuid Unit; + public int Tier; + } + public class StartMirrorTimer : ServerPacket { public StartMirrorTimer(MirrorTimerType timer, int value, int maxValue, int scale, int spellID, bool paused) : base(ServerOpcodes.StartMirrorTimer) @@ -606,7 +621,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Timer); + _worldPacket.WriteInt32((int)Timer); _worldPacket.WriteInt32(Value); _worldPacket.WriteInt32(MaxValue); _worldPacket.WriteInt32(Scale); @@ -633,7 +648,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Timer); + _worldPacket.WriteInt32((int)Timer); _worldPacket.WriteBit(Paused); _worldPacket.FlushBits(); } @@ -651,7 +666,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Timer); + _worldPacket.WriteInt32((int)Timer); } public MirrorTimerType Timer; @@ -769,15 +784,15 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(Client); Phaseshift.Write(_worldPacket); - _worldPacket.WriteUInt32(VisibleMapIDs.Count * 2); // size in bytes + _worldPacket.WriteInt32(VisibleMapIDs.Count * 2); // size in bytes foreach (ushort visibleMapId in VisibleMapIDs) _worldPacket.WriteUInt16(visibleMapId); // Active terrain swap map id - _worldPacket.WriteUInt32(PreloadMapIDs.Count * 2); // size in bytes + _worldPacket.WriteInt32(PreloadMapIDs.Count * 2); // size in bytes foreach (ushort preloadMapId in PreloadMapIDs) _worldPacket.WriteUInt16(preloadMapId); // Inactive terrain swap map id - _worldPacket.WriteUInt32(UiMapPhaseIDs.Count * 2); // size in bytes + _worldPacket.WriteInt32(UiMapPhaseIDs.Count * 2); // size in bytes foreach (ushort uiMapPhaseId in UiMapPhaseIDs) _worldPacket.WriteUInt16(uiMapPhaseId); // UI map id, WorldMapArea.db2, controls map display } @@ -993,7 +1008,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(CUFProfiles.Count); + _worldPacket.WriteInt32(CUFProfiles.Count); foreach (CUFProfile cufProfile in CUFProfiles) { @@ -1134,7 +1149,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(item.Key); foreach (var flags in Heirlooms) - _worldPacket.WriteUInt32(flags.Value.flags); + _worldPacket.WriteUInt32((uint)flags.Value.flags); } public bool IsFullUpdate; @@ -1211,7 +1226,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Type); + _worldPacket.WriteUInt32((uint)Type); _worldPacket.WriteUInt32(TimeRemaining); _worldPacket.WriteUInt32(TotalTime); } @@ -1240,7 +1255,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Error); + _worldPacket.WriteUInt32((uint)Error); _worldPacket.WriteBit(Arg.HasValue); _worldPacket.WriteBit(Arg2.HasValue); _worldPacket.FlushBits(); @@ -1264,7 +1279,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteBit(IsFullUpdate); - _worldPacket.WriteUInt32(Mounts.Count); + _worldPacket.WriteInt32(Mounts.Count); foreach (var spell in Mounts) { @@ -1329,7 +1344,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt32(PhaseShiftFlags); - data.WriteUInt32(Phases.Count); + data.WriteInt32(Phases.Count); data.WritePackedGuid(PersonalGUID); foreach (PhaseShiftDataPhase phaseShiftDataPhase in Phases) phaseShiftDataPhase.Write(data); diff --git a/Source/Game/Network/Packets/MovementPackets.cs b/Source/Game/Network/Packets/MovementPackets.cs index 584e8163c..18d36eb6b 100644 --- a/Source/Game/Network/Packets/MovementPackets.cs +++ b/Source/Game/Network/Packets/MovementPackets.cs @@ -201,7 +201,7 @@ namespace Game.Network.Packets { data.WriteUInt32((uint)moveSpline.splineflags.Flags); // SplineFlags data.WriteInt32(moveSpline.timePassed()); // Elapsed - data.WriteUInt32(moveSpline.Duration()); // Duration + data.WriteInt32(moveSpline.Duration()); // Duration data.WriteFloat(1.0f); // DurationModifier data.WriteFloat(1.0f); // NextDurationModifier data.WriteBits((byte)moveSpline.facing.type, 2); // Face @@ -240,7 +240,7 @@ namespace Game.Network.Packets } if (hasFadeObjectTime) - data.WriteUInt32(moveSpline.effect_start_time); // FadeObjectTime + data.WriteInt32(moveSpline.effect_start_time); // FadeObjectTime foreach (var vec in moveSpline.getPath()) data.WriteVector3(vec); @@ -256,7 +256,7 @@ namespace Game.Network.Packets if (moveSpline.splineflags.hasFlag(SplineFlag.Parabolic)) { data.WriteFloat(moveSpline.vertical_acceleration); - data.WriteUInt32(moveSpline.effect_start_time); + data.WriteInt32(moveSpline.effect_start_time); data.WriteUInt32(0); // Duration (override) } } @@ -316,7 +316,7 @@ namespace Game.Network.Packets if (splineFlags.hasFlag(SplineFlag.Animation)) { - movementSpline.AnimTier = splineFlags.getAnimationId(); + movementSpline.AnimTier = splineFlags.getAnimTier(); movementSpline.TierTransStartTime = (uint)moveSpline.effect_start_time; } @@ -911,7 +911,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(SummonerGUID); _worldPacket.WriteUInt32(SummonerVirtualRealmAddress); _worldPacket.WriteInt32(AreaID); - _worldPacket.WriteUInt8(Reason); + _worldPacket.WriteUInt8((byte)Reason); _worldPacket.WriteBit(SkipStartingArea); _worldPacket.FlushBits(); } @@ -978,7 +978,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(MoverGUID); - _worldPacket.WriteUInt32(StateChanges.Count); + _worldPacket.WriteInt32(StateChanges.Count); foreach (MoveStateChange stateChange in StateChanges) stateChange.Write(_worldPacket); } @@ -1010,7 +1010,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { - data.WriteUInt16(MessageID); + data.WriteUInt16((ushort)MessageID); data.WriteUInt32(SequenceIndex); data.WriteBit(Speed.HasValue); data.WriteBit(KnockBack.HasValue); @@ -1076,7 +1076,7 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteUInt32(FilterKeys.Count); + data.WriteInt32(FilterKeys.Count); data.WriteFloat(BaseSpeed); data.WriteInt16(StartOffset); data.WriteFloat(DistToPrevFilterKey); diff --git a/Source/Game/Network/Packets/NPCPackets.cs b/Source/Game/Network/Packets/NPCPackets.cs index bb2de0624..359be7514 100644 --- a/Source/Game/Network/Packets/NPCPackets.cs +++ b/Source/Game/Network/Packets/NPCPackets.cs @@ -59,8 +59,8 @@ namespace Game.Network.Packets foreach (ClientGossipOptions options in GossipOptions) { _worldPacket.WriteInt32(options.ClientOption); - _worldPacket.WriteInt8(options.OptionNPC); - _worldPacket.WriteInt8(options.OptionFlags); + _worldPacket.WriteUInt8(options.OptionNPC); + _worldPacket.WriteUInt8(options.OptionFlags); _worldPacket.WriteInt32(options.OptionCost); _worldPacket.WriteBits(options.Text.GetByteCount(), 12); @@ -155,16 +155,16 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(Spells.Count); foreach (TrainerListSpell spell in Spells) { - _worldPacket.WriteInt32(spell.SpellID); - _worldPacket.WriteInt32(spell.MoneyCost); - _worldPacket.WriteInt32(spell.ReqSkillLine); - _worldPacket.WriteInt32(spell.ReqSkillRank); + _worldPacket.WriteUInt32(spell.SpellID); + _worldPacket.WriteUInt32(spell.MoneyCost); + _worldPacket.WriteUInt32(spell.ReqSkillLine); + _worldPacket.WriteUInt32(spell.ReqSkillRank); for (uint i = 0; i < SharedConst.MaxTrainerspellAbilityReqs; ++i) - _worldPacket.WriteInt32(spell.ReqAbility[i]); + _worldPacket.WriteUInt32(spell.ReqAbility[i]); - _worldPacket.WriteInt8(spell.Usable); - _worldPacket.WriteInt8(spell.ReqLevel); + _worldPacket.WriteUInt8((byte)spell.Usable); + _worldPacket.WriteUInt8(spell.ReqLevel); } _worldPacket.WriteBits(Greeting.GetByteCount(), 11); @@ -276,7 +276,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(TrainerGUID); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(TrainerFailedReason); + _worldPacket.WriteUInt32((uint)TrainerFailedReason); } public ObjectGuid TrainerGUID; @@ -323,7 +323,7 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteUInt32(MuID); + data.WriteInt32(MuID); data.WriteInt32(Type); data.WriteInt32(Quantity); data.WriteUInt64(Price); diff --git a/Source/Game/Network/Packets/PartyPackets.cs b/Source/Game/Network/Packets/PartyPackets.cs index 5ead7b593..68d636530 100644 --- a/Source/Game/Network/Packets/PartyPackets.cs +++ b/Source/Game/Network/Packets/PartyPackets.cs @@ -110,7 +110,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(InviterGUID); _worldPacket.WritePackedGuid(InviterBNetAccountId); _worldPacket.WriteUInt16(Unk1); - _worldPacket.WriteInt32(ProposedRoles); + _worldPacket.WriteUInt32(ProposedRoles); _worldPacket.WriteInt32(LfgSlots.Count); _worldPacket.WriteInt32(LfgCompletedMask); @@ -249,7 +249,7 @@ namespace Game.Network.Packets if (!player.IsAlive()) { - if (player.HasFlag(PlayerFields.Flags, PlayerFlags.Ghost)) + if (player.HasPlayerFlag(PlayerFlags.Ghost)) MemberStats.Status |= GroupMemberOnlineStatus.Ghost; else MemberStats.Status |= GroupMemberOnlineStatus.Dead; @@ -286,9 +286,9 @@ namespace Game.Network.Packets MemberStats.PositionY = (short)(player.GetPositionY()); MemberStats.PositionZ = (short)(player.GetPositionZ()); - MemberStats.SpecID = (ushort)player.GetUInt32Value(PlayerFields.CurrentSpecId); - MemberStats.PartyType[0] = (sbyte)(player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetPartyType) & 0xF); - MemberStats.PartyType[1] = (sbyte)(player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetPartyType) >> 4); + MemberStats.SpecID = (ushort)player.GetPrimarySpecialization(); + MemberStats.PartyType[0] = (sbyte)(player.m_playerData.PartyType & 0xF); + MemberStats.PartyType[1] = (sbyte)(player.m_playerData.PartyType >> 4); MemberStats.WmoGroupID = 0; MemberStats.WmoDoodadPlacementID = 0; @@ -741,14 +741,14 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt16(PartyFlags); + _worldPacket.WriteUInt16((ushort)PartyFlags); _worldPacket.WriteUInt8(PartyIndex); - _worldPacket.WriteUInt8(PartyType); + _worldPacket.WriteUInt8((byte)PartyType); _worldPacket.WriteInt32(MyIndex); _worldPacket.WritePackedGuid(PartyGUID); _worldPacket.WriteInt32(SequenceNum); _worldPacket.WritePackedGuid(LeaderGUID); - _worldPacket.WriteUInt32(PlayerList.Count); + _worldPacket.WriteInt32(PlayerList.Count); _worldPacket.WriteBit(LfgInfos.HasValue); _worldPacket.WriteBit(LootSettings.HasValue); _worldPacket.WriteBit(DifficultySettings.HasValue); @@ -905,8 +905,8 @@ namespace Game.Network.Packets { public void Write(WorldPacket data) { - data.WriteUInt32(PhaseShiftFlags); - data.WriteUInt32(List.Count); + data.WriteInt32(PhaseShiftFlags); + data.WriteInt32(List.Count); data.WritePackedGuid(PersonalGUID); foreach (PartyMemberPhase phase in List) @@ -944,7 +944,7 @@ namespace Game.Network.Packets data.WriteInt32(ModelId); data.WriteInt32(CurrentHealth); data.WriteInt32(MaxHealth); - data.WriteUInt32(Auras.Count); + data.WriteInt32(Auras.Count); Auras.ForEach(p => p.Write(data)); data.WriteBits(Name.GetByteCount(), 8); @@ -969,9 +969,9 @@ namespace Game.Network.Packets for (byte i = 0; i < 2; i++) data.WriteInt8(PartyType[i]); - data.WriteInt16(Status); + data.WriteInt16((short)Status); data.WriteUInt8(PowerType); - data.WriteInt16(PowerDisplayID); + data.WriteInt16((short)PowerDisplayID); data.WriteInt32(CurrentHealth); data.WriteInt32(MaxHealth); data.WriteUInt16(CurrentPower); @@ -1036,7 +1036,7 @@ namespace Game.Network.Packets data.WriteBit(FromSocialQueue); data.WriteBit(VoiceChatSilenced); data.WritePackedGuid(GUID); - data.WriteUInt8(Status); + data.WriteUInt8((byte)Status); data.WriteUInt8(Subgroup); data.WriteUInt8(Flags); data.WriteUInt8(RolesAssigned); diff --git a/Source/Game/Network/Packets/PetPackets.cs b/Source/Game/Network/Packets/PetPackets.cs index 8d6bac4cf..0456262b9 100644 --- a/Source/Game/Network/Packets/PetPackets.cs +++ b/Source/Game/Network/Packets/PetPackets.cs @@ -93,14 +93,14 @@ namespace Game.Network.Packets _worldPacket.WriteUInt16(Specialization); _worldPacket.WriteUInt32(TimeLimit); _worldPacket.WriteUInt16((ushort)((byte)CommandState | (Flag << 16))); - _worldPacket.WriteUInt8(ReactState); + _worldPacket.WriteUInt8((byte)ReactState); foreach (uint actionButton in ActionButtons) _worldPacket.WriteUInt32(actionButton); - _worldPacket.WriteUInt32(Actions.Count); - _worldPacket.WriteUInt32(Cooldowns.Count); - _worldPacket.WriteUInt32(SpellHistory.Count); + _worldPacket.WriteInt32(Actions.Count); + _worldPacket.WriteInt32(Cooldowns.Count); + _worldPacket.WriteInt32(SpellHistory.Count); foreach (uint action in Actions) _worldPacket.WriteUInt32(action); @@ -116,8 +116,8 @@ namespace Game.Network.Packets foreach (PetSpellHistory history in SpellHistory) { - _worldPacket.WriteInt32(history.CategoryID); - _worldPacket.WriteInt32(history.RecoveryTime); + _worldPacket.WriteUInt32(history.CategoryID); + _worldPacket.WriteUInt32(history.RecoveryTime); _worldPacket.WriteFloat(history.ChargeModRate); _worldPacket.WriteInt8(history.ConsumedCharges); } @@ -146,7 +146,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(StableMaster); - _worldPacket.WriteUInt32(Pets.Count); + _worldPacket.WriteInt32(Pets.Count); foreach (PetStableInfo pet in Pets) { _worldPacket.WriteUInt32(pet.PetSlot); @@ -154,7 +154,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(pet.CreatureID); _worldPacket.WriteUInt32(pet.DisplayID); _worldPacket.WriteUInt32(pet.ExperienceLevel); - _worldPacket.WriteUInt8(pet.PetFlags); + _worldPacket.WriteUInt8((byte)pet.PetFlags); _worldPacket.WriteBits(pet.PetName.GetByteCount(), 8); _worldPacket.WriteString(pet.PetName); } @@ -170,7 +170,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket .WriteUInt32(Spells.Count); + _worldPacket.WriteInt32(Spells.Count); foreach (uint spell in Spells) _worldPacket.WriteUInt32(spell); } @@ -184,7 +184,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Spells); + _worldPacket.WriteInt32(Spells.Count); foreach (uint spell in Spells) _worldPacket.WriteUInt32(spell); } @@ -198,11 +198,11 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(Result); + _worldPacket.WriteUInt8((byte)Result); _worldPacket.WritePackedGuid(RenameData.PetGUID); _worldPacket.WriteInt32(RenameData.PetNumber); - _worldPacket.WriteUInt8(RenameData.NewName.GetByteCount()); + _worldPacket.WriteUInt8((byte)RenameData.NewName.GetByteCount()); _worldPacket.WriteBit(RenameData.HasDeclinedNames); @@ -295,7 +295,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(UnitGUID); - _worldPacket.WriteUInt32(Action); + _worldPacket.WriteUInt32((uint)Action); } public ObjectGuid UnitGUID; @@ -309,7 +309,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt8(Response); + _worldPacket.WriteUInt8((byte)Response); } public uint SpellID; diff --git a/Source/Game/Network/Packets/PetitionPackets.cs b/Source/Game/Network/Packets/PetitionPackets.cs index a9b80127d..8cca2f010 100644 --- a/Source/Game/Network/Packets/PetitionPackets.cs +++ b/Source/Game/Network/Packets/PetitionPackets.cs @@ -124,7 +124,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(OwnerAccountID); _worldPacket.WriteInt32(PetitionID); - _worldPacket.WriteUInt32(Signatures.Count); + _worldPacket.WriteInt32(Signatures.Count); foreach (PetitionSignature signature in Signatures) { _worldPacket.WritePackedGuid(signature.Signer); diff --git a/Source/Game/Network/Packets/QueryPackets.cs b/Source/Game/Network/Packets/QueryPackets.cs index 771ae99ec..5c601ace4 100644 --- a/Source/Game/Network/Packets/QueryPackets.cs +++ b/Source/Game/Network/Packets/QueryPackets.cs @@ -47,7 +47,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt8(Result); + _worldPacket.WriteInt8((sbyte)Result); _worldPacket.WritePackedGuid(Player); if (Result == ResponseCodes.Success) @@ -112,7 +112,7 @@ namespace Game.Network.Packets for (var i = 0; i < SharedConst.MaxCreatureKillCredit; ++i) _worldPacket.WriteUInt32(Stats.ProxyCreatureID[i]); - _worldPacket.WriteUInt32(Stats.Display.CreatureDisplay.Count); + _worldPacket.WriteInt32(Stats.Display.CreatureDisplay.Count); _worldPacket.WriteFloat(Stats.Display.TotalProbability); foreach (CreatureXDisplay display in Stats.Display.CreatureDisplay) @@ -125,11 +125,11 @@ namespace Game.Network.Packets _worldPacket.WriteFloat(Stats.HpMulti); _worldPacket.WriteFloat(Stats.EnergyMulti); - _worldPacket.WriteUInt32(Stats.QuestItems.Count); + _worldPacket.WriteInt32(Stats.QuestItems.Count); _worldPacket.WriteUInt32(Stats.CreatureMovementInfoID); _worldPacket.WriteInt32(Stats.HealthScalingExpansion); _worldPacket.WriteUInt32(Stats.RequiredExpansion); - _worldPacket.WriteInt32(Stats.VignetteID); + _worldPacket.WriteUInt32(Stats.VignetteID); _worldPacket.WriteInt32(Stats.Class); _worldPacket.WriteFloat(Stats.FadeRegionRadius); _worldPacket.WriteInt32(Stats.WidgetSetID); @@ -145,7 +145,7 @@ namespace Game.Network.Packets _worldPacket.WriteCString(Stats.CursorName); foreach (var questItem in Stats.QuestItems) - _worldPacket.WriteInt32(questItem); + _worldPacket.WriteUInt32(questItem); } } @@ -180,7 +180,7 @@ namespace Game.Network.Packets if (Allow) { - _worldPacket.WriteUInt32(Pages.Count); + _worldPacket.WriteInt32(Pages.Count); foreach (PageTextInfo pageText in Pages) pageText.Write(_worldPacket); } @@ -292,7 +292,7 @@ namespace Game.Network.Packets statsData.WriteInt32(Stats.Data[i]); statsData.WriteFloat(Stats.Size); - statsData.WriteUInt8(Stats.QuestItems.Count); + statsData.WriteUInt8((byte)Stats.QuestItems.Count); foreach (uint questItem in Stats.QuestItems) statsData.WriteUInt32(questItem); @@ -389,7 +389,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(CurrentTime); + _worldPacket.WriteUInt32((uint)CurrentTime); } public long CurrentTime; @@ -422,7 +422,7 @@ namespace Game.Network.Packets foreach (QuestPOIData questPOIData in QuestPOIDataStats) { - _worldPacket.WriteInt32(questPOIData.QuestID); + _worldPacket.WriteUInt32(questPOIData.QuestID); _worldPacket.WriteInt32(questPOIData.QuestPOIBlobDataStats.Count); @@ -478,12 +478,12 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(QuestCompletionNPCs.Count); + _worldPacket.WriteInt32(QuestCompletionNPCs.Count); foreach (var quest in QuestCompletionNPCs) { _worldPacket.WriteUInt32(quest.QuestID); - _worldPacket.WriteUInt32(quest.NPCs.Count); + _worldPacket.WriteInt32(quest.NPCs.Count); foreach (var npc in quest.NPCs) _worldPacket.WriteUInt32(npc); } @@ -636,7 +636,7 @@ namespace Game.Network.Packets BnetAccountID = player.GetSession().GetBattlenetAccountGUID(); Name = player.GetName(); RaceID = player.GetRace(); - Sex = (Gender)player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender); + Sex = (Gender)(byte)player.m_playerData.NativeSex; ClassID = player.GetClass(); Level = (byte)player.getLevel(); @@ -682,9 +682,9 @@ namespace Game.Network.Packets data.WritePackedGuid(GuidActual); data.WriteUInt64(GuildClubMemberID); data.WriteUInt32(VirtualRealmAddress); - data.WriteUInt8(RaceID); - data.WriteUInt8(Sex); - data.WriteUInt8(ClassID); + data.WriteUInt8((byte)RaceID); + data.WriteUInt8((byte)Sex); + data.WriteUInt8((byte)ClassID); data.WriteUInt8(Level); data.WriteString(Name); } diff --git a/Source/Game/Network/Packets/QuestPackets.cs b/Source/Game/Network/Packets/QuestPackets.cs index 3c1dfbfbd..8678d173f 100644 --- a/Source/Game/Network/Packets/QuestPackets.cs +++ b/Source/Game/Network/Packets/QuestPackets.cs @@ -52,7 +52,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(QuestGiver.Guid); - _worldPacket.WriteUInt32(QuestGiver.Status); + _worldPacket.WriteUInt32((uint)QuestGiver.Status); } public QuestGiverInfo QuestGiver; @@ -68,7 +68,7 @@ namespace Game.Network.Packets foreach (QuestGiverInfo questGiver in QuestGiver) { _worldPacket.WritePackedGuid(questGiver.Guid); - _worldPacket.WriteUInt32(questGiver.Status); + _worldPacket.WriteUInt32((uint)questGiver.Status); } } @@ -114,90 +114,90 @@ namespace Game.Network.Packets if (Allow) { - _worldPacket.WriteInt32(Info.QuestID); + _worldPacket.WriteUInt32(Info.QuestID); _worldPacket.WriteInt32(Info.QuestType); _worldPacket.WriteInt32(Info.QuestLevel); _worldPacket.WriteInt32(Info.QuestScalingFactionGroup); _worldPacket.WriteInt32(Info.QuestMaxScalingLevel); - _worldPacket.WriteInt32(Info.QuestPackageID); + _worldPacket.WriteUInt32(Info.QuestPackageID); _worldPacket.WriteInt32(Info.QuestMinLevel); _worldPacket.WriteInt32(Info.QuestSortID); - _worldPacket.WriteInt32(Info.QuestInfoID); - _worldPacket.WriteInt32(Info.SuggestedGroupNum); - _worldPacket.WriteInt32(Info.RewardNextQuest); - _worldPacket.WriteInt32(Info.RewardXPDifficulty); + _worldPacket.WriteUInt32(Info.QuestInfoID); + _worldPacket.WriteUInt32(Info.SuggestedGroupNum); + _worldPacket.WriteUInt32(Info.RewardNextQuest); + _worldPacket.WriteUInt32(Info.RewardXPDifficulty); _worldPacket.WriteFloat(Info.RewardXPMultiplier); _worldPacket.WriteInt32(Info.RewardMoney); - _worldPacket.WriteInt32(Info.RewardMoneyDifficulty); + _worldPacket.WriteUInt32(Info.RewardMoneyDifficulty); _worldPacket.WriteFloat(Info.RewardMoneyMultiplier); - _worldPacket.WriteInt32(Info.RewardBonusMoney); + _worldPacket.WriteUInt32(Info.RewardBonusMoney); foreach (uint id in Info.RewardDisplaySpell) - _worldPacket.WriteInt32(id); + _worldPacket.WriteUInt32(id); - _worldPacket.WriteInt32(Info.RewardSpell); - _worldPacket.WriteInt32(Info.RewardHonor); + _worldPacket.WriteUInt32(Info.RewardSpell); + _worldPacket.WriteUInt32(Info.RewardHonor); _worldPacket.WriteFloat(Info.RewardKillHonor); _worldPacket.WriteInt32(Info.RewardArtifactXPDifficulty); _worldPacket.WriteFloat(Info.RewardArtifactXPMultiplier); _worldPacket.WriteInt32(Info.RewardArtifactCategoryID); - _worldPacket.WriteInt32(Info.StartItem); + _worldPacket.WriteUInt32(Info.StartItem); _worldPacket.WriteUInt32(Info.Flags); _worldPacket.WriteUInt32(Info.FlagsEx); _worldPacket.WriteUInt32(Info.FlagsEx2); for (uint i = 0; i < SharedConst.QuestRewardItemCount; ++i) { - _worldPacket.WriteInt32(Info.RewardItems[i]); - _worldPacket.WriteInt32(Info.RewardAmount[i]); + _worldPacket.WriteUInt32(Info.RewardItems[i]); + _worldPacket.WriteUInt32(Info.RewardAmount[i]); _worldPacket.WriteInt32(Info.ItemDrop[i]); _worldPacket.WriteInt32(Info.ItemDropQuantity[i]); } for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) { - _worldPacket.WriteInt32(Info.UnfilteredChoiceItems[i].ItemID); - _worldPacket.WriteInt32(Info.UnfilteredChoiceItems[i].Quantity); - _worldPacket.WriteInt32(Info.UnfilteredChoiceItems[i].DisplayID); + _worldPacket.WriteUInt32(Info.UnfilteredChoiceItems[i].ItemID); + _worldPacket.WriteUInt32(Info.UnfilteredChoiceItems[i].Quantity); + _worldPacket.WriteUInt32(Info.UnfilteredChoiceItems[i].DisplayID); } - _worldPacket.WriteInt32(Info.POIContinent); + _worldPacket.WriteUInt32(Info.POIContinent); _worldPacket.WriteFloat(Info.POIx); _worldPacket.WriteFloat(Info.POIy); - _worldPacket.WriteInt32(Info.POIPriority); + _worldPacket.WriteUInt32(Info.POIPriority); - _worldPacket.WriteInt32(Info.RewardTitle); + _worldPacket.WriteUInt32(Info.RewardTitle); _worldPacket.WriteInt32(Info.RewardArenaPoints); - _worldPacket.WriteInt32(Info.RewardSkillLineID); - _worldPacket.WriteInt32(Info.RewardNumSkillUps); + _worldPacket.WriteUInt32(Info.RewardSkillLineID); + _worldPacket.WriteUInt32(Info.RewardNumSkillUps); - _worldPacket.WriteInt32(Info.PortraitGiver); - _worldPacket.WriteInt32(Info.PortraitGiverMount); - _worldPacket.WriteInt32(Info.PortraitTurnIn); + _worldPacket.WriteUInt32(Info.PortraitGiver); + _worldPacket.WriteUInt32(Info.PortraitGiverMount); + _worldPacket.WriteUInt32(Info.PortraitTurnIn); for (uint i = 0; i < SharedConst.QuestRewardReputationsCount; ++i) { - _worldPacket.WriteInt32(Info.RewardFactionID[i]); + _worldPacket.WriteUInt32(Info.RewardFactionID[i]); _worldPacket.WriteInt32(Info.RewardFactionValue[i]); _worldPacket.WriteInt32(Info.RewardFactionOverride[i]); _worldPacket.WriteInt32(Info.RewardFactionCapIn[i]); } - _worldPacket.WriteInt32(Info.RewardFactionFlags); + _worldPacket.WriteUInt32(Info.RewardFactionFlags); for (uint i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i) { - _worldPacket.WriteInt32(Info.RewardCurrencyID[i]); - _worldPacket.WriteInt32(Info.RewardCurrencyQty[i]); + _worldPacket.WriteUInt32(Info.RewardCurrencyID[i]); + _worldPacket.WriteUInt32(Info.RewardCurrencyQty[i]); } - _worldPacket.WriteInt32(Info.AcceptedSoundKitID); - _worldPacket.WriteInt32(Info.CompleteSoundKitID); + _worldPacket.WriteUInt32(Info.AcceptedSoundKitID); + _worldPacket.WriteUInt32(Info.CompleteSoundKitID); - _worldPacket.WriteInt32(Info.AreaGroupID); - _worldPacket.WriteInt32(Info.TimeAllowed); + _worldPacket.WriteUInt32(Info.AreaGroupID); + _worldPacket.WriteUInt32(Info.TimeAllowed); - _worldPacket.WriteUInt32(Info.Objectives.Count); + _worldPacket.WriteInt32(Info.Objectives.Count); _worldPacket.WriteInt64(Info.AllowableRaces); _worldPacket.WriteInt32(Info.TreasurePickerID); _worldPacket.WriteInt32(Info.Expansion); @@ -217,11 +217,11 @@ namespace Game.Network.Packets foreach (QuestObjective questObjective in Info.Objectives) { _worldPacket.WriteUInt32(questObjective.ID); - _worldPacket.WriteUInt8(questObjective.Type); + _worldPacket.WriteUInt8((byte)questObjective.Type); _worldPacket.WriteInt8(questObjective.StorageIndex); _worldPacket.WriteInt32(questObjective.ObjectID); _worldPacket.WriteInt32(questObjective.Amount); - _worldPacket.WriteUInt32(questObjective.Flags); + _worldPacket.WriteUInt32((uint)questObjective.Flags); _worldPacket.WriteUInt32(questObjective.Flags2); _worldPacket.WriteFloat(questObjective.ProgressBarWeight); @@ -282,7 +282,7 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteInt32(ObjectID); - _worldPacket.WriteUInt8(ObjectiveType); + _worldPacket.WriteUInt8((byte)ObjectiveType); } public uint QuestID; @@ -311,10 +311,10 @@ namespace Game.Network.Packets public override void Write() { QuestData.Write(_worldPacket); - _worldPacket.WriteInt32(QuestPackageID); - _worldPacket.WriteInt32(PortraitGiver); - _worldPacket.WriteInt32(PortraitGiverMount); - _worldPacket.WriteInt32(PortraitTurnIn); + _worldPacket.WriteUInt32(QuestPackageID); + _worldPacket.WriteUInt32(PortraitGiver); + _worldPacket.WriteUInt32(PortraitGiverMount); + _worldPacket.WriteUInt32(PortraitTurnIn); _worldPacket.WriteBits(QuestTitle.GetByteCount(), 9); _worldPacket.WriteBits(RewardText.GetByteCount(), 12); @@ -416,17 +416,17 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(QuestGiverGUID); _worldPacket.WritePackedGuid(InformUnit); - _worldPacket.WriteInt32(QuestID); + _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteInt32(QuestPackageID); - _worldPacket.WriteInt32(PortraitGiver); + _worldPacket.WriteUInt32(PortraitGiver); _worldPacket.WriteUInt32(PortraitGiverMount); - _worldPacket.WriteInt32(PortraitTurnIn); + _worldPacket.WriteUInt32(PortraitTurnIn); _worldPacket.WriteUInt32(QuestFlags[0]); // Flags _worldPacket.WriteUInt32(QuestFlags[1]); // FlagsEx - _worldPacket.WriteInt32(SuggestedPartyMembers); + _worldPacket.WriteUInt32(SuggestedPartyMembers); _worldPacket.WriteInt32(LearnSpells.Count); - _worldPacket.WriteUInt32(DescEmotes.Count); - _worldPacket.WriteUInt32(Objectives.Count); + _worldPacket.WriteInt32(DescEmotes.Count); + _worldPacket.WriteInt32(Objectives.Count); _worldPacket.WriteInt32(QuestStartItemID); foreach (uint spell in LearnSpells) @@ -434,16 +434,16 @@ namespace Game.Network.Packets foreach (QuestDescEmote emote in DescEmotes) { - _worldPacket.WriteInt32(emote.Type); + _worldPacket.WriteUInt32(emote.Type); _worldPacket.WriteUInt32(emote.Delay); } foreach (QuestObjectiveSimple obj in Objectives) { - _worldPacket.WriteInt32(obj.ID); + _worldPacket.WriteUInt32(obj.ID); _worldPacket.WriteInt32(obj.ObjectID); _worldPacket.WriteInt32(obj.Amount); - _worldPacket.WriteInt8(obj.Type); + _worldPacket.WriteUInt8(obj.Type); } _worldPacket.WriteBits(QuestTitle.GetByteCount(), 9); @@ -502,13 +502,13 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(QuestGiverGUID); - _worldPacket.WriteInt32(QuestGiverCreatureID); - _worldPacket.WriteInt32(QuestID); - _worldPacket.WriteInt32(CompEmoteDelay); - _worldPacket.WriteInt32(CompEmoteType); + _worldPacket.WriteUInt32(QuestGiverCreatureID); + _worldPacket.WriteUInt32(QuestID); + _worldPacket.WriteUInt32(CompEmoteDelay); + _worldPacket.WriteUInt32(CompEmoteType); _worldPacket.WriteUInt32(QuestFlags[0]); _worldPacket.WriteUInt32(QuestFlags[1]); - _worldPacket.WriteInt32(SuggestPartyMembers); + _worldPacket.WriteUInt32(SuggestPartyMembers); _worldPacket.WriteInt32(MoneyToGet); _worldPacket.WriteInt32(Collect.Count); _worldPacket.WriteInt32(Currency.Count); @@ -516,13 +516,13 @@ namespace Game.Network.Packets foreach (QuestObjectiveCollect obj in Collect) { - _worldPacket.WriteInt32(obj.ObjectID); + _worldPacket.WriteUInt32(obj.ObjectID); _worldPacket.WriteInt32(obj.Amount); _worldPacket.WriteUInt32(obj.Flags); } foreach (QuestCurrency cur in Currency) { - _worldPacket.WriteInt32(cur.CurrencyID); + _worldPacket.WriteUInt32(cur.CurrencyID); _worldPacket.WriteInt32(cur.Amount); } @@ -619,7 +619,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(QuestGiverGUID); _worldPacket.WriteUInt32(GreetEmoteDelay); _worldPacket.WriteUInt32(GreetEmoteType); - _worldPacket.WriteUInt32(QuestDataText.Count); + _worldPacket.WriteInt32(QuestDataText.Count); _worldPacket.WriteBits(Greeting.GetByteCount(), 11); _worldPacket.FlushBits(); @@ -698,7 +698,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(SenderGUID); - _worldPacket.WriteUInt8(Result); + _worldPacket.WriteUInt8((byte)Result); } public ObjectGuid SenderGUID; @@ -727,7 +727,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Reason); + _worldPacket.WriteUInt32((uint)Reason); _worldPacket.WriteInt32(ContributionRewardID); _worldPacket.WriteBit(SendErrorMessage); @@ -762,7 +762,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteUInt32(QuestID); - _worldPacket.WriteUInt32(Reason); + _worldPacket.WriteUInt32((uint)Reason); } public uint QuestID; @@ -813,7 +813,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(WorldQuestUpdates.Count); + _worldPacket.WriteInt32(WorldQuestUpdates.Count); foreach (WorldQuestUpdateInfo worldQuestUpdate in WorldQuestUpdates) { @@ -835,7 +835,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteInt32(ChoiceID); - _worldPacket.WriteUInt32(Responses.Count); + _worldPacket.WriteInt32(Responses.Count); _worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WriteInt32(UiTextureKitID); _worldPacket.WriteUInt32(SoundKitID); @@ -1031,7 +1031,7 @@ namespace Game.Network.Packets data.WriteUInt32(SkillLineID); data.WriteUInt32(NumSkillUps); - data.WriteInt32(TreasurePickerID); + data.WriteUInt32(TreasurePickerID); for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) { @@ -1095,8 +1095,8 @@ namespace Game.Network.Packets data.WriteInt32(Emotes.Count); foreach (QuestDescEmote emote in Emotes) { - data.WriteInt32(emote.Type); - data.WriteInt32(emote.Delay); + data.WriteUInt32(emote.Type); + data.WriteUInt32(emote.Delay); } data.WriteBit(AutoLaunched); @@ -1218,10 +1218,10 @@ namespace Game.Network.Packets data.WriteUInt64(Money); data.WriteUInt32(Xp); - data.WriteUInt32(Items.Count); - data.WriteUInt32(Currencies.Count); - data.WriteUInt32(Factions.Count); - data.WriteUInt32(ItemChoices.Count); + data.WriteInt32(Items.Count); + data.WriteInt32(Currencies.Count); + data.WriteInt32(Factions.Count); + data.WriteInt32(ItemChoices.Count); foreach (PlayerChoiceResponseRewardEntry item in Items) item.Write(data); diff --git a/Source/Game/Network/Packets/ReferAFriendPackets.cs b/Source/Game/Network/Packets/ReferAFriendPackets.cs index 6f9db8a7d..1dc19bddd 100644 --- a/Source/Game/Network/Packets/ReferAFriendPackets.cs +++ b/Source/Game/Network/Packets/ReferAFriendPackets.cs @@ -63,7 +63,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket .WriteInt32(Reason); + _worldPacket .WriteInt32((int)Reason); // Client uses this string only if Reason == ERR_REFER_A_FRIEND_NOT_IN_GROUP || Reason == ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S // but always reads it from packet _worldPacket.WriteBits(Str.GetByteCount(), 6); diff --git a/Source/Game/Network/Packets/ReputationPackets.cs b/Source/Game/Network/Packets/ReputationPackets.cs index d4cc47d60..a3436859a 100644 --- a/Source/Game/Network/Packets/ReputationPackets.cs +++ b/Source/Game/Network/Packets/ReputationPackets.cs @@ -30,7 +30,7 @@ namespace Game.Network.Packets { for (ushort i = 0; i < FactionCount; ++i) { - _worldPacket.WriteUInt8(FactionFlags[i]); + _worldPacket.WriteUInt8((byte)FactionFlags[i]); _worldPacket.WriteInt32(FactionStandings[i]); } @@ -58,7 +58,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Reactions.Count); + _worldPacket.WriteInt32(Reactions.Count); foreach (ForcedReaction reaction in Reactions) reaction.Write(_worldPacket); } @@ -75,7 +75,7 @@ namespace Game.Network.Packets _worldPacket.WriteFloat(ReferAFriendBonus); _worldPacket.WriteFloat(BonusFromAchievementSystem); - _worldPacket.WriteUInt32(Faction.Count); + _worldPacket.WriteInt32(Faction.Count); foreach (FactionStandingData factionStanding in Faction) factionStanding.Write(_worldPacket); diff --git a/Source/Game/Network/Packets/ScenarioPackets.cs b/Source/Game/Network/Packets/ScenarioPackets.cs index ac549970c..3499f090b 100644 --- a/Source/Game/Network/Packets/ScenarioPackets.cs +++ b/Source/Game/Network/Packets/ScenarioPackets.cs @@ -33,10 +33,10 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(WaveCurrent); _worldPacket.WriteUInt32(WaveMax); _worldPacket.WriteUInt32(TimerDuration); - _worldPacket.WriteUInt32(CriteriaProgress.Count); - _worldPacket.WriteUInt32(BonusObjectives.Count); - _worldPacket.WriteUInt32(PickedSteps.Count); - _worldPacket.WriteUInt32(Spells.Count); + _worldPacket.WriteInt32(CriteriaProgress.Count); + _worldPacket.WriteInt32(BonusObjectives.Count); + _worldPacket.WriteInt32(PickedSteps.Count); + _worldPacket.WriteInt32(Spells.Count); for (int i = 0; i < PickedSteps.Count; ++i) _worldPacket.WriteUInt32(PickedSteps[i]); @@ -131,12 +131,12 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(ScenarioPOIDataStats.Count); + _worldPacket.WriteInt32(ScenarioPOIDataStats.Count); foreach (ScenarioPOIData scenarioPOIData in ScenarioPOIDataStats) { _worldPacket.WriteInt32(scenarioPOIData.CriteriaTreeID); - _worldPacket.WriteUInt32(scenarioPOIData.ScenarioPOIs.Count); + _worldPacket.WriteInt32(scenarioPOIData.ScenarioPOIs.Count); foreach (ScenarioPOI scenarioPOI in scenarioPOIData.ScenarioPOIs) { @@ -147,12 +147,12 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(scenarioPOI.Flags); _worldPacket.WriteInt32(scenarioPOI.WorldEffectID); _worldPacket.WriteInt32(scenarioPOI.PlayerConditionID); - _worldPacket.WriteUInt32(scenarioPOI.Points.Count); + _worldPacket.WriteInt32(scenarioPOI.Points.Count); foreach (var scenarioPOIBlobPoint in scenarioPOI.Points) { - _worldPacket.WriteInt32(scenarioPOIBlobPoint.X); - _worldPacket.WriteInt32(scenarioPOIBlobPoint.Y); + _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.X); + _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Y); } } } diff --git a/Source/Game/Network/Packets/SocialPackets.cs b/Source/Game/Network/Packets/SocialPackets.cs index 0200f083b..606d18173 100644 --- a/Source/Game/Network/Packets/SocialPackets.cs +++ b/Source/Game/Network/Packets/SocialPackets.cs @@ -43,7 +43,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Flags); + _worldPacket.WriteUInt32((uint)Flags); _worldPacket.WriteBits(Contacts.Count, 8); _worldPacket.FlushBits(); @@ -73,15 +73,16 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt8(FriendResult); + _worldPacket.WriteUInt8((byte)FriendResult); _worldPacket.WritePackedGuid(Guid); _worldPacket.WritePackedGuid(WowAccountGuid); _worldPacket.WriteUInt32(VirtualRealmAddress); - _worldPacket.WriteUInt8(Status); + _worldPacket.WriteUInt8((byte)Status); _worldPacket.WriteUInt32(AreaID); _worldPacket.WriteUInt32(Level); - _worldPacket.WriteUInt32(ClassID); + _worldPacket.WriteUInt32((uint)ClassID); _worldPacket.WriteBits(Notes.GetByteCount(), 10); + _worldPacket.WriteBit(Mobile); _worldPacket.FlushBits(); _worldPacket.WriteString(Notes); } @@ -95,6 +96,7 @@ namespace Game.Network.Packets public uint Level; public uint AreaID; public FriendsResult FriendResult; + public bool Mobile; } public class AddFriend : ClientPacket @@ -186,12 +188,13 @@ namespace Game.Network.Packets data.WritePackedGuid(WowAccountGuid); data.WriteUInt32(VirtualRealmAddr); data.WriteUInt32(NativeRealmAddr); - data.WriteUInt32(TypeFlags); - data.WriteUInt8(Status); + data.WriteUInt32((uint)TypeFlags); + data.WriteUInt8((byte)Status); data.WriteUInt32(AreaID); data.WriteUInt32(Level); - data.WriteUInt32(ClassID); + data.WriteUInt32((uint)ClassID); data.WriteBits(Notes.GetByteCount(), 10); + data.WriteBit(Mobile); data.FlushBits(); data.WriteString(Notes); } @@ -205,7 +208,8 @@ namespace Game.Network.Packets FriendStatus Status; uint AreaID; uint Level; - Class ClassID = Class.None; + Class ClassID; + bool Mobile; } public struct QualifiedGUID diff --git a/Source/Game/Network/Packets/SpellPackets.cs b/Source/Game/Network/Packets/SpellPackets.cs index b56bb8656..c573aa6b7 100644 --- a/Source/Game/Network/Packets/SpellPackets.cs +++ b/Source/Game/Network/Packets/SpellPackets.cs @@ -90,7 +90,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(CategoryCooldowns.Count); + _worldPacket.WriteInt32(CategoryCooldowns.Count); foreach (CategoryCooldownInfo cooldown in CategoryCooldowns) { @@ -119,8 +119,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WriteBit(InitialLogin); - _worldPacket.WriteUInt32(KnownSpells.Count); - _worldPacket.WriteUInt32(FavoriteSpells.Count); + _worldPacket.WriteInt32(KnownSpells.Count); + _worldPacket.WriteInt32(FavoriteSpells.Count); foreach (var spellId in KnownSpells) _worldPacket.WriteUInt32(spellId); @@ -175,7 +175,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Spells.Count); + _worldPacket.WriteInt32(Spells.Count); foreach (var spell in Spells) _worldPacket.WriteUInt32(spell); } @@ -305,9 +305,9 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(SpellID.Count); - _worldPacket.WriteUInt32(Superceded.Count); - _worldPacket.WriteUInt32(FavoriteSpellID.Count); + _worldPacket.WriteInt32(SpellID.Count); + _worldPacket.WriteInt32(Superceded.Count); + _worldPacket.WriteInt32(FavoriteSpellID.Count); foreach (var spellId in SpellID) _worldPacket.WriteUInt32(spellId); @@ -330,8 +330,8 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(SpellID.Count); - _worldPacket.WriteUInt32(FavoriteSpellID.Count); + _worldPacket.WriteInt32(SpellID.Count); + _worldPacket.WriteInt32(FavoriteSpellID.Count); foreach (uint spell in SpellID) _worldPacket.WriteUInt32(spell); @@ -356,7 +356,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(CasterUnit); _worldPacket.WritePackedGuid(CastID); - _worldPacket.WriteInt32(SpellID); + _worldPacket.WriteUInt32(SpellID); _worldPacket.WriteUInt32(SpellXSpellVisualID); _worldPacket.WriteUInt16(Reason); } @@ -410,7 +410,7 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(CastID); _worldPacket.WriteInt32(SpellID); _worldPacket.WriteInt32(SpellXSpellVisualID); - _worldPacket.WriteInt32(Reason); + _worldPacket.WriteInt32((int)Reason); _worldPacket.WriteInt32(FailedArg1); _worldPacket.WriteInt32(FailedArg2); } @@ -426,7 +426,7 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(CastID); _worldPacket.WriteInt32(SpellID); - _worldPacket.WriteInt32(Reason); + _worldPacket.WriteInt32((int)Reason); _worldPacket.WriteInt32(FailedArg1); _worldPacket.WriteInt32(FailedArg2); } @@ -438,7 +438,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Modifiers.Count); + _worldPacket.WriteInt32(Modifiers.Count); foreach (SpellModifierInfo spellMod in Modifiers) spellMod.Write(_worldPacket); } @@ -452,7 +452,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(SpellID.Count); + _worldPacket.WriteInt32(SpellID.Count); foreach (uint spellId in SpellID) _worldPacket.WriteUInt32(spellId); @@ -474,7 +474,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(SpellID); + _worldPacket.WriteUInt32(SpellID); _worldPacket.WriteBit(IsPet); _worldPacket.FlushBits(); } @@ -489,7 +489,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(SpellID.Count); + _worldPacket.WriteInt32(SpellID.Count); if (!SpellID.Empty()) SpellID.ForEach(p => _worldPacket.WriteUInt32(p)); @@ -542,8 +542,8 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(Caster); - _worldPacket.WriteUInt8(Flags); - _worldPacket.WriteUInt32(SpellCooldowns.Count); + _worldPacket.WriteUInt8((byte)Flags); + _worldPacket.WriteInt32(SpellCooldowns.Count); SpellCooldowns.ForEach(p => p.Write(_worldPacket)); } @@ -558,7 +558,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Entries.Count); + _worldPacket.WriteInt32(Entries.Count); Entries.ForEach(p => p.Write(_worldPacket)); } @@ -620,7 +620,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Entries.Count); + _worldPacket.WriteInt32(Entries.Count); Entries.ForEach(p => p.Write(_worldPacket)); } @@ -904,7 +904,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(UnitGUID); - _worldPacket.WriteUInt32(DisplayID); + _worldPacket.WriteInt32(DisplayID); _worldPacket.WriteUInt8(RaceID); _worldPacket.WriteUInt8(Gender); _worldPacket.WriteUInt8(ClassID); @@ -917,10 +917,10 @@ namespace Game.Network.Packets CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id)); _worldPacket.WritePackedGuid(GuildGUID); - _worldPacket.WriteUInt32(ItemDisplayID.Count); + _worldPacket.WriteInt32(ItemDisplayID.Count); foreach (var itemDisplayId in ItemDisplayID) - _worldPacket.WriteUInt32(itemDisplayId); + _worldPacket.WriteInt32(itemDisplayId); } public ObjectGuid UnitGUID; @@ -1188,14 +1188,14 @@ namespace Game.Network.Packets CreatureTemplate creatureTemplate = attacker.GetCreatureTemplate(); TuningType = ContentTuningType.CreatureToPlayerDamage; - PlayerLevelDelta = (short)target.GetInt32Value(ActivePlayerFields.ScalingPlayerLevelDelta); + PlayerLevelDelta = (short)target.m_activePlayerData.ScalingPlayerLevelDelta; PlayerItemLevel = (ushort)target.GetAverageItemLevel(); - ScalingHealthItemLevelCurveID = (ushort)target.GetUInt32Value(UnitFields.ScalingHealthItemLevelCurveId); + ScalingHealthItemLevelCurveID = (ushort)target.m_unitData.ScalingHealthItemLevelCurveID; TargetLevel = (byte)target.getLevel(); Expansion = (byte)creatureTemplate.RequiredExpansion; TargetMinScalingLevel = (byte)creatureTemplate.levelScaling.Value.MinLevel; TargetMaxScalingLevel = (byte)creatureTemplate.levelScaling.Value.MaxLevel; - TargetScalingLevelDelta = (sbyte)attacker.GetInt32Value(UnitFields.ScalingLevelDelta); + TargetScalingLevelDelta = (sbyte)attacker.m_unitData.ScalingLevelDelta; return true; } @@ -1204,14 +1204,14 @@ namespace Game.Network.Packets CreatureTemplate creatureTemplate = target.GetCreatureTemplate(); TuningType = ContentTuningType.PlayerToCreatureDamage; - PlayerLevelDelta = (short)attacker.GetInt32Value(ActivePlayerFields.ScalingPlayerLevelDelta); + PlayerLevelDelta = (short)attacker.m_activePlayerData.ScalingPlayerLevelDelta; PlayerItemLevel = (ushort)attacker.GetAverageItemLevel(); - ScalingHealthItemLevelCurveID = (ushort)target.GetUInt32Value(UnitFields.ScalingHealthItemLevelCurveId); + ScalingHealthItemLevelCurveID = (ushort)target.m_unitData.ScalingHealthItemLevelCurveID; TargetLevel = (byte)target.getLevel(); Expansion = (byte)creatureTemplate.RequiredExpansion; TargetMinScalingLevel = (byte)creatureTemplate.levelScaling.Value.MinLevel; TargetMaxScalingLevel = (byte)creatureTemplate.levelScaling.Value.MaxLevel; - TargetScalingLevelDelta = (sbyte)target.GetInt32Value(UnitFields.ScalingLevelDelta); + TargetScalingLevelDelta = (sbyte)target.m_unitData.ScalingLevelDelta; return true; } @@ -1227,7 +1227,7 @@ namespace Game.Network.Packets Expansion = (byte)creatureTemplate.RequiredExpansion; TargetMinScalingLevel = (byte)creatureTemplate.levelScaling.Value.MinLevel; TargetMaxScalingLevel = (byte)creatureTemplate.levelScaling.Value.MaxLevel; - TargetScalingLevelDelta = (sbyte)accessor.GetInt32Value(UnitFields.ScalingLevelDelta); + TargetScalingLevelDelta = (sbyte)accessor.m_unitData.ScalingLevelDelta; return true; } @@ -1310,7 +1310,7 @@ namespace Game.Network.Packets data.WritePackedGuid(CastID); data.WriteInt32(SpellID); data.WriteInt32(SpellXSpellVisualID); - data.WriteUInt8(Flags); + data.WriteUInt8((byte)Flags); data.WriteUInt32(ActiveFlags); data.WriteUInt16(CastLevel); data.WriteUInt8(Applications); @@ -1330,10 +1330,10 @@ namespace Game.Network.Packets data.WritePackedGuid(CastUnit.Value); if (Duration.HasValue) - data.WriteUInt32(Duration.Value); + data.WriteInt32(Duration.Value); if (Remaining.HasValue) - data.WriteUInt32(Remaining.Value); + data.WriteInt32(Remaining.Value); if (TimeMod.HasValue) data.WriteFloat(TimeMod.Value); @@ -1538,7 +1538,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { - data.WriteUInt8(Reason); + data.WriteUInt8((byte)Reason); } public SpellMissInfo Reason; @@ -1573,7 +1573,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteInt32(Cost); - data.WriteInt8(Type); + data.WriteInt8((sbyte)Type); } } @@ -1583,7 +1583,7 @@ namespace Game.Network.Packets { data.WriteUInt8(Start); data.WriteUInt8(Count); - data.WriteUInt32(Cooldowns.Count); + data.WriteInt32(Cooldowns.Count); foreach (byte cd in Cooldowns) data.WriteUInt8(cd); @@ -1654,8 +1654,8 @@ namespace Game.Network.Packets data.WritePackedGuid(OriginalCastID); data.WriteInt32(SpellID); data.WriteUInt32(SpellXSpellVisualID); - data.WriteUInt32(CastFlags); - data.WriteUInt32(CastFlagsEx); + data.WriteUInt32((uint)CastFlags); + data.WriteUInt32((uint)CastFlagsEx); data.WriteUInt32(CastTime); MissileTrajectory.Write(data); @@ -1743,7 +1743,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt8(ModIndex); - data.WriteUInt32(ModifierData.Count); + data.WriteInt32(ModifierData.Count); foreach (SpellModifierData modData in ModifierData) modData.Write(data); } diff --git a/Source/Game/Network/Packets/SystemPackets.cs b/Source/Game/Network/Packets/SystemPackets.cs index b0e5b4dae..57e9449f7 100644 --- a/Source/Game/Network/Packets/SystemPackets.cs +++ b/Source/Game/Network/Packets/SystemPackets.cs @@ -118,7 +118,7 @@ namespace Game.Network.Packets if (RaceClassExpansionLevels.HasValue) { - _worldPacket.WriteUInt32(RaceClassExpansionLevels.Value.Count); + _worldPacket.WriteInt32(RaceClassExpansionLevels.Value.Count); foreach (var level in RaceClassExpansionLevels.Value) _worldPacket.WriteUInt8(level); } diff --git a/Source/Game/Network/Packets/TalentPackets.cs b/Source/Game/Network/Packets/TalentPackets.cs index 988bd9b45..f7976cbb8 100644 --- a/Source/Game/Network/Packets/TalentPackets.cs +++ b/Source/Game/Network/Packets/TalentPackets.cs @@ -31,13 +31,13 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt8(Info.ActiveGroup); _worldPacket.WriteUInt32(Info.PrimarySpecialization); - _worldPacket.WriteUInt32(Info.TalentGroups.Count); + _worldPacket.WriteInt32(Info.TalentGroups.Count); foreach (var talentGroupInfo in Info.TalentGroups) { _worldPacket.WriteUInt32(talentGroupInfo.SpecID); - _worldPacket.WriteUInt32(talentGroupInfo.TalentIDs.Count); - _worldPacket.WriteUInt32(talentGroupInfo.PvPTalentIDs.Count); + _worldPacket.WriteInt32(talentGroupInfo.TalentIDs.Count); + _worldPacket.WriteInt32(talentGroupInfo.PvPTalentIDs.Count); foreach (var talentID in talentGroupInfo.TalentIDs) _worldPacket.WriteUInt16(talentID); @@ -84,7 +84,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt8(RespecType); + _worldPacket.WriteInt8((sbyte)RespecType); _worldPacket.WriteUInt32(Cost); _worldPacket.WritePackedGuid(RespecMaster); } @@ -116,7 +116,7 @@ namespace Game.Network.Packets { _worldPacket.WriteBits(Reason, 4); _worldPacket.WriteInt32(SpellID); - _worldPacket.WriteUInt32(Talents.Count); + _worldPacket.WriteInt32(Talents.Count); foreach (var talent in Talents) _worldPacket.WriteUInt16(talent); @@ -133,7 +133,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Glyphs.Count); + _worldPacket.WriteInt32(Glyphs.Count); foreach (GlyphBinding glyph in Glyphs) glyph.Write(_worldPacket); @@ -167,7 +167,7 @@ namespace Game.Network.Packets { _worldPacket.WriteBits(Reason, 4); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(Talents.Count); + _worldPacket.WriteInt32(Talents.Count); foreach (var pvpTalent in Talents) pvpTalent.Write(_worldPacket); diff --git a/Source/Game/Network/Packets/TaxiPackets.cs b/Source/Game/Network/Packets/TaxiPackets.cs index dabcafdb3..114426d8a 100644 --- a/Source/Game/Network/Packets/TaxiPackets.cs +++ b/Source/Game/Network/Packets/TaxiPackets.cs @@ -57,13 +57,13 @@ namespace Game.Network.Packets _worldPacket.WriteBit(WindowInfo.HasValue); _worldPacket.FlushBits(); - _worldPacket.WriteUInt32(CanLandNodes.Length); - _worldPacket.WriteUInt32(CanUseNodes.Length); + _worldPacket.WriteInt32(CanLandNodes.Length); + _worldPacket.WriteInt32(CanUseNodes.Length); if (WindowInfo.HasValue) { _worldPacket.WritePackedGuid(WindowInfo.Value.UnitGUID); - _worldPacket.WriteUInt32(WindowInfo.Value.CurrentNode); + _worldPacket.WriteInt32(WindowInfo.Value.CurrentNode); } foreach (var node in CanLandNodes) diff --git a/Source/Game/Network/Packets/TicketPackets.cs b/Source/Game/Network/Packets/TicketPackets.cs index bf48d02a2..194fc6732 100644 --- a/Source/Game/Network/Packets/TicketPackets.cs +++ b/Source/Game/Network/Packets/TicketPackets.cs @@ -435,7 +435,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(ComplaintType); + _worldPacket.WriteUInt32((uint)ComplaintType); _worldPacket.WriteUInt8(Result); } diff --git a/Source/Game/Network/Packets/TokenPackets.cs b/Source/Game/Network/Packets/TokenPackets.cs index bcf7213c4..ac03194e3 100644 --- a/Source/Game/Network/Packets/TokenPackets.cs +++ b/Source/Game/Network/Packets/TokenPackets.cs @@ -38,9 +38,9 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket .WriteUInt32( UnkInt); - _worldPacket .WriteUInt32( Result); - _worldPacket .WriteUInt32(AuctionableTokenAuctionableList.Count); + _worldPacket.WriteUInt32(UnkInt); + _worldPacket.WriteUInt32((uint)Result); + _worldPacket.WriteInt32(AuctionableTokenAuctionableList.Count); foreach (AuctionableTokenAuctionable auctionableTokenAuctionable in AuctionableTokenAuctionableList) { @@ -86,7 +86,7 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt64(CurrentMarketPrice); _worldPacket.WriteUInt32(UnkInt); - _worldPacket.WriteUInt32(Result); + _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt32(AuctionDuration); } diff --git a/Source/Game/Network/Packets/ToyPackets.cs b/Source/Game/Network/Packets/ToyPackets.cs index 8d9912901..1b3061200 100644 --- a/Source/Game/Network/Packets/ToyPackets.cs +++ b/Source/Game/Network/Packets/ToyPackets.cs @@ -56,9 +56,9 @@ namespace Game.Network.Packets _worldPacket.FlushBits(); // all lists have to have the same size - _worldPacket.WriteUInt32(Toys.Count); - _worldPacket.WriteUInt32(Toys.Count); - _worldPacket.WriteUInt32(Toys.Count); + _worldPacket.WriteInt32(Toys.Count); + _worldPacket.WriteInt32(Toys.Count); + _worldPacket.WriteInt32(Toys.Count); foreach (var pair in Toys) _worldPacket.WriteUInt32(pair.Key); diff --git a/Source/Game/Network/Packets/TradePackets.cs b/Source/Game/Network/Packets/TradePackets.cs index d8fcc7249..98c327529 100644 --- a/Source/Game/Network/Packets/TradePackets.cs +++ b/Source/Game/Network/Packets/TradePackets.cs @@ -147,8 +147,8 @@ namespace Game.Network.Packets { case TradeStatus.Failed: _worldPacket.WriteBit(FailureForYou); - _worldPacket.WriteInt32(BagResult); - _worldPacket.WriteInt32(ItemID); + _worldPacket.WriteInt32((int)BagResult); + _worldPacket.WriteUInt32(ItemID); break; case TradeStatus.Initiated: _worldPacket.WriteUInt32(ID); @@ -159,7 +159,7 @@ namespace Game.Network.Packets break; case TradeStatus.WrongRealm: case TradeStatus.NotOnTaplist: - _worldPacket.WriteInt8(TradeSlot); + _worldPacket.WriteUInt8(TradeSlot); break; case TradeStatus.NotEnoughCurrency: case TradeStatus.CurrencyNotTradable: @@ -199,7 +199,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(CurrencyType); _worldPacket.WriteInt32(CurrencyQuantity); _worldPacket.WriteInt32(ProposedEnchantment); - _worldPacket.WriteUInt32(Items.Count); + _worldPacket.WriteInt32(Items.Count); Items.ForEach(item => item.Write(_worldPacket)); } @@ -238,7 +238,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt8(Slot); - data.WriteUInt32(StackCount); + data.WriteInt32(StackCount); data.WritePackedGuid(GiftCreator); Item.Write(data); data.WriteBit(Unwrapped.HasValue); diff --git a/Source/Game/Network/Packets/TransmogrificationPackets.cs b/Source/Game/Network/Packets/TransmogrificationPackets.cs index 8aa998c0a..c4ed2e8fb 100644 --- a/Source/Game/Network/Packets/TransmogrificationPackets.cs +++ b/Source/Game/Network/Packets/TransmogrificationPackets.cs @@ -53,7 +53,7 @@ namespace Game.Network.Packets { _worldPacket.WriteBit(IsFullUpdate); _worldPacket.WriteBit(IsSetFavorite); - _worldPacket.WriteUInt32(FavoriteAppearances.Count); + _worldPacket.WriteInt32(FavoriteAppearances.Count); foreach (uint itemModifiedAppearanceId in FavoriteAppearances) _worldPacket.WriteUInt32(itemModifiedAppearanceId); diff --git a/Source/Game/Network/Packets/VoidStoragePackets.cs b/Source/Game/Network/Packets/VoidStoragePackets.cs index c6226d9ee..e5e53929e 100644 --- a/Source/Game/Network/Packets/VoidStoragePackets.cs +++ b/Source/Game/Network/Packets/VoidStoragePackets.cs @@ -30,7 +30,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteInt32(Result); + _worldPacket.WriteInt32((int)Result); } public VoidTransferError Result; diff --git a/Source/Game/Network/Packets/WardenPackets.cs b/Source/Game/Network/Packets/WardenPackets.cs index 4eab1cd42..fcbdff650 100644 --- a/Source/Game/Network/Packets/WardenPackets.cs +++ b/Source/Game/Network/Packets/WardenPackets.cs @@ -22,7 +22,7 @@ namespace Game.Network.Packets { public enum WardenOpcodes { - // Client->Server + // Client.Server CMSG_ModuleMissing = 0, Cmsg_ModuleOk = 1, Cmsg_CheatChecksResult = 2, @@ -30,7 +30,7 @@ namespace Game.Network.Packets Cmsg_HashResult = 4, Cmsg_ModuleFailed = 5, // This Is Sent When Client Failed To Load Uploaded Module Due To Cache Fail - // Server->Client + // Server.Client Smsg_ModuleUse = 0, Smsg_ModuleCache = 1, Smsg_CheatChecksRequest = 2, @@ -70,7 +70,7 @@ namespace Game.Network.Packets { public byte[] Write() { - WriteUInt8(Command); + WriteUInt8((byte)Command); WriteUInt16(DataSize); WriteBytes(Data, 500); @@ -86,7 +86,7 @@ namespace Game.Network.Packets { public byte[] Write() { - WriteUInt8(Command); + WriteUInt8((byte)Command); WriteBytes(ModuleId, 16); WriteBytes(ModuleKey, 16); WriteUInt32(Size); @@ -104,7 +104,7 @@ namespace Game.Network.Packets { public byte[] Write() { - WriteUInt8(Command); + WriteUInt8((byte)Command); WriteBytes(Seed); return GetData(); @@ -118,7 +118,7 @@ namespace Game.Network.Packets { public byte[] Write() { - WriteUInt8(Command1); + WriteUInt8((byte)Command1); WriteUInt16(Size1); WriteUInt32(CheckSumm1); WriteUInt8(Unk1); @@ -128,7 +128,7 @@ namespace Game.Network.Packets foreach (var function in Function1) WriteUInt32(function); - WriteUInt8(Command2); + WriteUInt8((byte)Command2); WriteUInt16(Size2); WriteUInt32(CheckSumm2); WriteUInt8(Unk3); @@ -137,7 +137,7 @@ namespace Game.Network.Packets WriteUInt32(Function2); WriteUInt8(Function2_set); - WriteUInt8(Command3); + WriteUInt8((byte)Command3); WriteUInt16(Size3); WriteUInt32(CheckSumm3); WriteUInt8(Unk5); diff --git a/Source/Game/Network/Packets/WorldStatePackets.cs b/Source/Game/Network/Packets/WorldStatePackets.cs index 32be601ba..67866125b 100644 --- a/Source/Game/Network/Packets/WorldStatePackets.cs +++ b/Source/Game/Network/Packets/WorldStatePackets.cs @@ -30,7 +30,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(AreaID); _worldPacket.WriteUInt32(SubareaID); - _worldPacket.WriteUInt32(Worldstates.Count); + _worldPacket.WriteInt32(Worldstates.Count); foreach (WorldStateInfo wsi in Worldstates) { _worldPacket.WriteUInt32(wsi.VariableID); diff --git a/Source/Game/Network/WorldSocket.cs b/Source/Game/Network/WorldSocket.cs index 39eb2f271..e281f8776 100644 --- a/Source/Game/Network/WorldSocket.cs +++ b/Source/Game/Network/WorldSocket.cs @@ -29,21 +29,24 @@ namespace Game.Network { public class WorldSocket : SocketBase { - static string ClientConnectionInitialize = "WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER"; - static string ServerConnectionInitialize = "WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"; + static string ClientConnectionInitialize = "WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER - V2"; + static string ServerConnectionInitialize = "WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT - V2"; static byte[] AuthCheckSeed = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3F, 0x1D, 0xCD, 0xB6, 0xA1, 0x37, 0x28, 0xB3, 0x12, 0xFF, 0x8A }; 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 byte[] EncryptionKeySeed = { 0xE9, 0x75, 0x3C, 0x50, 0x90, 0x93, 0x61, 0xDA, 0x3B, 0x07, 0xEE, 0xFA, 0xFF, 0x9D, 0x41, 0xB8 }; - static byte[] ClientTypeSeed_Wn64 = { 0xDD, 0x62, 0x65, 0x17, 0xCC, 0x6D, 0x31, 0x93, 0x2B, 0x47, 0x99, 0x34, 0xCC, 0xDC, 0x0A, 0xBF }; + static byte[] ClientTypeSeed_Wn64 = { 0x8A, 0x46, 0xF2, 0x36, 0x70, 0x30, 0x9F, 0x2A, 0xAE, 0x85, 0xC9, 0xA4, 0x72, 0x76, 0x38, 0x2B }; static byte[] ClientTypeSeed_Mc64 = { 0x34, 0x1C, 0xFE, 0xFE, 0x3D, 0x72, 0xAC, 0xA9, 0xA4, 0x40, 0x7D, 0xC5, 0x35, 0xDE, 0xD6, 0x6A }; public WorldSocket(Socket socket) : base(socket) { _connectType = ConnectionType.Realm; _serverChallenge = new byte[0].GenerateRandomKey(16); - worldCrypt = new WorldCrypt(); + _worldCrypt = new WorldCrypt(); + + _encryptKey = new byte[16]; } public override void Dispose() @@ -51,9 +54,6 @@ namespace Game.Network _worldSession = null; _queryProcessor = null; _serverChallenge = null; - worldCrypt = null; - _encryptSeed = null; - _decryptSeed = null; _sessionKey = null; _compressionStream = null; @@ -147,42 +147,51 @@ namespace Game.Network while (transferredBytes > 5) { - if (worldCrypt.IsInitialized) - worldCrypt.Decrypt(GetReceiveBuffer(), 4); - - int size; - uint opcode; - if (!ReadHeader(out opcode, out size)) + PacketHeader header; + if (!ReadHeader(out header)) { CloseSocket(); return; } - var data = new byte[size]; - Buffer.BlockCopy(GetReceiveBuffer(), 6, data, 0, size); + var data = new byte[header.Size]; + Buffer.BlockCopy(GetReceiveBuffer(), 16, data, 0, header.Size); - PacketLog.Write(data, opcode, GetRemoteIpAddress(), GetRemotePort(), _connectType, true); - if (!ProcessPacket(new WorldPacket(data, opcode))) + if (!_worldCrypt.Decrypt(ref data, header.Size, header.Tag)) + { + Log.outError(LogFilter.Network, $"WorldSocket.ReadHandler(): client {GetRemoteIpAddress().ToString()} failed to decrypt packet (size: {header.Size})"); + return; + } + + WorldPacket worldPacket = new WorldPacket(data); + if (worldPacket.GetOpcode() >= (int)ClientOpcodes.Max) + { + Log.outError(LogFilter.Network, $"WorldSocket.ReadHandler(): client {GetRemoteIpAddress().ToString()} sent wrong opcode (opcode: {worldPacket.GetOpcode()})"); + return; + } + + PacketLog.Write(data, worldPacket.GetOpcode(), GetRemoteIpAddress(), GetRemotePort(), _connectType, true); + if (!ProcessPacket(worldPacket)) { CloseSocket(); return; } - transferredBytes -= size + 6; - Buffer.BlockCopy(GetReceiveBuffer(), size + 6, GetReceiveBuffer(), 0, transferredBytes); + transferredBytes -= header.Size + 16; + Buffer.BlockCopy(GetReceiveBuffer(), header.Size + 16, GetReceiveBuffer(), 0, transferredBytes); } AsyncRead(); } - bool ReadHeader(out uint opcode, out int size) + bool ReadHeader(out PacketHeader header) { - size = BitConverter.ToInt32(GetReceiveBuffer(), 0) - 2; - opcode = BitConverter.ToUInt16(GetReceiveBuffer(), 4); + header = new PacketHeader(); + header.Read(GetReceiveBuffer()); - if (size >= 0x10000 || (opcode >= (int)ClientOpcodes.Max + 1)) + if (!header.IsValidSize()) { - Log.outError(LogFilter.Network, "WorldSocket.ReadHeader(): client {0} sent malformed packet (size: {1}, cmd: {2})", GetRemoteIpAddress().ToString(), size, opcode); + Log.outError(LogFilter.Network, "WorldSocket.ReadHeader(): client {0} sent malformed packet (size: {1})", GetRemoteIpAddress().ToString(), header.Size); return false; } @@ -278,16 +287,18 @@ namespace Game.Network ServerOpcodes opcode = packet.GetOpcode(); PacketLog.Write(data, (uint)opcode, GetRemoteIpAddress(), GetRemotePort(), _connectType, false); - uint packetSize = (uint)data.Length; - if (packetSize > 0x400 && worldCrypt.IsInitialized) - { - ByteBuffer buffer = new ByteBuffer(); - buffer.WriteUInt32(packetSize + 2); - buffer.WriteUInt32(ZLib.adler32(ZLib.adler32(0x9827D8F1, BitConverter.GetBytes((ushort)opcode), 2), data, packetSize)); + ByteBuffer buffer = new ByteBuffer(); - uint compressedSize = CompressPacket(data, opcode); - buffer.WriteUInt32(ZLib.adler32(0x9827D8F1, data, compressedSize)); - buffer.WriteBytes(data, compressedSize); + int packetSize = data.Length; + if (packetSize > 0x400 && _worldCrypt.IsInitialized) + { + buffer.WriteInt32(packetSize + 2); + buffer.WriteUInt32(ZLib.adler32(ZLib.adler32(0x9827D8F1, BitConverter.GetBytes((ushort)opcode), 2), data, (uint)packetSize)); + + byte[] compressedData; + uint compressedSize = CompressPacket(data, opcode, out compressedData); + buffer.WriteUInt32(ZLib.adler32(0x9827D8F1, compressedData, compressedSize)); + buffer.WriteBytes(compressedData, compressedSize); packetSize = (ushort)(compressedSize + 12); opcode = ServerOpcodes.CompressedPacket; @@ -295,11 +306,22 @@ namespace Game.Network data = buffer.GetData(); } - ServerPacketHeader header = new ServerPacketHeader(packetSize, opcode); - if (worldCrypt.IsInitialized) - worldCrypt.Encrypt(header.data, 4); + buffer = new ByteBuffer(); + buffer.WriteUInt16((ushort)opcode); + buffer.WriteBytes(data); + packetSize += 2 /*opcode*/; - AsyncWrite(header.data.Combine(data)); + data = buffer.GetData(); + + PacketHeader header = new PacketHeader(); + header.Size = packetSize; + _worldCrypt.Encrypt(ref data, header.Size, ref header.Tag); + + ByteBuffer byteBuffer = new ByteBuffer(); + header.Write(byteBuffer); + byteBuffer.WriteBytes(data); + + AsyncWrite(byteBuffer.GetData()); } public void SetWorldSession(WorldSession session) @@ -307,16 +329,16 @@ namespace Game.Network _worldSession = session; } - public uint CompressPacket(byte[] data, ServerOpcodes opcode) + public uint CompressPacket(byte[] data, ServerOpcodes opcode, out byte[] outData) { byte[] uncompressedData = BitConverter.GetBytes((ushort)opcode).Combine(data); - uint bufferSize = ZLib.deflateBound(_compressionStream, (uint)uncompressedData.Length); - byte[] outPrt = new byte[bufferSize]; + uint bufferSize = ZLib.deflateBound(_compressionStream, (uint)data.Length); + outData = new byte[bufferSize]; _compressionStream.next_out = 0; _compressionStream.avail_out = bufferSize; - _compressionStream.out_buf = outPrt; + _compressionStream.out_buf = outData; _compressionStream.next_in = 0; _compressionStream.avail_in = (uint)uncompressedData.Length; @@ -329,9 +351,7 @@ namespace Game.Network return 0; } - uint compressedSize = bufferSize - _compressionStream.avail_out; - Buffer.BlockCopy(outPrt, 0, data, 0, (int)compressedSize); - return compressedSize; + return bufferSize - _compressionStream.avail_out; } public override bool Update() @@ -346,12 +366,9 @@ namespace Game.Network void HandleSendAuthSession() { - _encryptSeed = new byte[16].GenerateRandomKey(16); - _decryptSeed = new byte[16].GenerateRandomKey(16); - AuthChallenge challenge = new AuthChallenge(); challenge.Challenge = _serverChallenge; - challenge.DosChallenge = _encryptSeed.Combine(_decryptSeed); + challenge.DosChallenge = new byte[32].GenerateRandomKey(32); challenge.DosZeroBits = 1; SendPacket(challenge); @@ -421,6 +438,14 @@ namespace Game.Network var sessionKeyGenerator = new SessionKeyGenerator(sessionKeyHmac.Digest, 32); sessionKeyGenerator.Generate(_sessionKey, 40); + HmacSha256 encryptKeyGen = new HmacSha256(_sessionKey); + encryptKeyGen.Process(authSession.LocalChallenge, authSession.LocalChallenge.Count); + encryptKeyGen.Process(_serverChallenge, 16); + encryptKeyGen.Finish(EncryptionKeySeed, 16); + + // only first 16 bytes of the hmac are used + Buffer.BlockCopy(encryptKeyGen.Digest, 0, _encryptKey, 0, 16); + // As we don't know if attempted login process by ip works, we update last_attempt_ip right away PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_LAST_ATTEMPT_IP); stmt.AddValue(0, address); @@ -537,7 +562,7 @@ namespace Game.Network // RBAC must be loaded before adding session to check for skip queue permission _worldSession.GetRBACData().LoadFromDBCallback(result); - SendPacket(new EnableEncryption()); + SendPacket(new EnableEncryption(_encryptKey, true)); } void HandleAuthContinuedSession(AuthContinuedSession authSession) @@ -589,7 +614,15 @@ namespace Game.Network return; } - SendPacket(new EnableEncryption()); + HmacSha256 encryptKeyGen = new HmacSha256(_sessionKey); + encryptKeyGen.Process(authSession.LocalChallenge, authSession.LocalChallenge.Length); + encryptKeyGen.Process(_serverChallenge, 16); + encryptKeyGen.Finish(EncryptionKeySeed, 16); + + // only first 16 bytes of the hmac are used + Buffer.BlockCopy(encryptKeyGen.Digest, 0, _encryptKey, 0, 16); + + SendPacket(new EnableEncryption(_encryptKey, true)); } void HandleConnectToFailed(ConnectToFailed connectToFailed) @@ -633,16 +666,11 @@ namespace Game.Network void HandleEnableEncryptionAck() { + _worldCrypt.Initialize(_encryptKey); if (_connectType == ConnectionType.Realm) - { - worldCrypt.Initialize(_sessionKey); Global.WorldMgr.AddSession(_worldSession); - } else - { - worldCrypt.Initialize(_sessionKey, _encryptSeed, _decryptSeed); Global.WorldMgr.AddInstanceSocket(this, _key); - } } public void SendAuthResponseError(BattlenetRpcErrorCode code) @@ -701,10 +729,9 @@ namespace Game.Network ulong _key; byte[] _serverChallenge; - WorldCrypt worldCrypt; - byte[] _encryptSeed; - byte[] _decryptSeed; + WorldCrypt _worldCrypt; byte[] _sessionKey; + byte[] _encryptKey; long _LastPingTime; uint _OverSpeedPings; diff --git a/Source/Game/Server/WorldManager.cs b/Source/Game/Server/WorldManager.cs index c6ee1000e..2d1110415 100644 --- a/Source/Game/Server/WorldManager.cs +++ b/Source/Game/Server/WorldManager.cs @@ -470,8 +470,8 @@ namespace Game Log.outInfo(LogFilter.ServerLoading, "Loading Enchant Spells Proc datas..."); Global.SpellMgr.LoadSpellEnchantProcData(); - Log.outInfo(LogFilter.ServerLoading, "Loading Item Random Enchantments Table..."); - ItemEnchantment.LoadRandomEnchantmentsTable(); + Log.outInfo(LogFilter.ServerLoading, "Loading Random item bonus list definitions..."); + ItemEnchantmentManager.LoadItemRandomBonusListTemplates(); Log.outInfo(LogFilter.ServerLoading, "Loading Disables"); // must be before loading quests and items Global.DisableMgr.LoadDisables(); diff --git a/Source/Game/Server/WorldSession.cs b/Source/Game/Server/WorldSession.cs index f2abac20b..0a28e86de 100644 --- a/Source/Game/Server/WorldSession.cs +++ b/Source/Game/Server/WorldSession.cs @@ -161,12 +161,12 @@ namespace Game // some save parts only correctly work in case player present in map/player_lists (pets, etc) if (save) { - for (int j = InventorySlots.BuyBackStart; j < InventorySlots.BuyBackEnd; ++j) + for (uint j = InventorySlots.BuyBackStart; j < InventorySlots.BuyBackEnd; ++j) { - int eslot = j - InventorySlots.BuyBackStart; - _player.SetGuidValue(ActivePlayerFields.InvSlotHead + (j * 4), ObjectGuid.Empty); - _player.SetUInt32Value(ActivePlayerFields.BuyBackPrice + eslot, 0); - _player.SetUInt32Value(ActivePlayerFields.BuyBackTimestamp + eslot, 0); + uint eslot = j - InventorySlots.BuyBackStart; + _player.SetInvSlot(j, ObjectGuid.Empty); + _player.SetBuybackPrice(eslot, 0); + _player.SetBuybackTimestamp(eslot, 0); } _player.SaveToDB(); } @@ -455,7 +455,6 @@ namespace Game public void SendConnectToInstance(ConnectToSerial serial) { var instanceAddress = Global.WorldMgr.GetRealm().GetAddressForClient(System.Net.IPAddress.Parse(GetRemoteAddress())); - instanceAddress.Port = WorldConfig.GetIntValue(WorldCfg.PortInstance); _instanceConnectKey.AccountId = GetAccountId(); _instanceConnectKey.connectionType = ConnectionType.Instance; @@ -464,9 +463,20 @@ namespace Game ConnectTo connectTo = new ConnectTo(); connectTo.Key = _instanceConnectKey.Raw; connectTo.Serial = serial; - connectTo.Payload.Where = instanceAddress; + connectTo.Payload.Port = (ushort)WorldConfig.GetIntValue(WorldCfg.PortInstance); connectTo.Con = (byte)ConnectionType.Instance; + if (instanceAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + { + connectTo.Payload.Where.IPv4 = instanceAddress.Address.GetAddressBytes(); + connectTo.Payload.Where.Type = ConnectTo.AddressType.IPv4; + } + else + { + connectTo.Payload.Where.IPv6 = instanceAddress.Address.GetAddressBytes(); + connectTo.Payload.Where.Type = ConnectTo.AddressType.IPv6; + } + SendPacket(connectTo); } diff --git a/Source/Game/Spells/Auras/Aura.cs b/Source/Game/Spells/Auras/Aura.cs index 95e0d17dd..e0bd487c0 100644 --- a/Source/Game/Spells/Auras/Aura.cs +++ b/Source/Game/Spells/Auras/Aura.cs @@ -730,7 +730,7 @@ namespace Game.Spells int duration = m_spellInfo.GetMaxDuration(); // Calculate duration of periodics affected by haste. if (caster.HasAuraTypeWithAffectMask(AuraType.PeriodicHaste, m_spellInfo) || m_spellInfo.HasAttribute(SpellAttr5.HasteAffectDuration)) - duration = (int)(duration * caster.GetFloatValue(UnitFields.ModCastSpeed)); + duration = (int)(duration * caster.m_unitData.ModCastingSpeed); SetMaxDuration(duration); SetDuration(duration); diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index c9d57fc63..2f3a1fb2c 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -78,49 +78,7 @@ namespace Game.Spells if (!m_spellInfo.HasAttribute(SpellAttr8.MasterySpecialization) || MathFunctions.fuzzyEq(GetSpellEffectInfo().BonusCoefficient, 0.0f)) amount = GetSpellEffectInfo().CalcValue(caster, m_baseAmount, GetBase().GetOwner().ToUnit(), GetBase().GetCastItemLevel()); else if (caster != null && caster.IsTypeId(TypeId.Player)) - amount = (int)(caster.GetFloatValue(ActivePlayerFields.Mastery) * GetSpellEffectInfo().BonusCoefficient); - - // check item enchant aura cast - if (amount == 0 && caster != null) - { - ObjectGuid itemGUID = GetBase().GetCastItemGUID(); - if (!itemGUID.IsEmpty()) - { - Player playerCaster = caster.ToPlayer(); - if (playerCaster != null) - { - Item castItem = playerCaster.GetItemByGuid(itemGUID); - if (castItem != null) - { - if (castItem.GetItemSuffixFactor() != 0) - { - var item_rand_suffix = CliDB.ItemRandomSuffixStorage.LookupByKey((uint)Math.Abs(castItem.GetItemRandomPropertyId())); - if (item_rand_suffix != null) - { - for (int k = 0; k < ItemConst.MaxItemRandomProperties; k++) - { - var pEnchant = CliDB.SpellItemEnchantmentStorage.LookupByKey(item_rand_suffix.Enchantment[k]); - if (pEnchant != null) - { - for (int t = 0; t < ItemConst.MaxItemEnchantmentEffects; t++) - { - if (pEnchant.EffectArg[t] == m_spellInfo.Id) - { - amount = (int)((item_rand_suffix.AllocationPct[k] * castItem.GetItemSuffixFactor()) / 10000); - break; - } - } - } - - if (amount != 0) - break; - } - } - } - } - } - } - } + amount = (int)(caster.ToPlayer().m_activePlayerData.Mastery * GetSpellEffectInfo().BonusCoefficient); // custom amount calculations go here switch (GetAuraType()) @@ -217,7 +175,7 @@ namespace Game.Spells if (m_spellInfo.IsChanneled()) caster.ModSpellDurationTime(m_spellInfo, ref m_period); else if (m_spellInfo.HasAttribute(SpellAttr5.HasteAffectDuration)) - m_period = (int)(m_period * caster.GetFloatValue(UnitFields.ModCastHaste)); + m_period = (int)(m_period * caster.m_unitData.ModCastingSpeed); } } @@ -1088,8 +1046,9 @@ namespace Game.Spells if (apply) { // apply glow vision - if (target.IsTypeId(TypeId.Player)) - target.SetByteFlag(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, PlayerFieldByte2Flags.InvisibilityGlow); + Player playerTarget = target.ToPlayer(); + if (playerTarget != null) + playerTarget.AddAuraVision(PlayerFieldByte2Flags.InvisibilityGlow); target.m_invisibility.AddFlag(type); target.m_invisibility.AddValue(type, GetAmount()); @@ -1100,8 +1059,9 @@ namespace Game.Spells { // if not have different invisibility auras. // remove glow vision - if (target.IsTypeId(TypeId.Player)) - target.RemoveByteFlag(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, PlayerFieldByte2Flags.InvisibilityGlow); + Player playerTarget = target.ToPlayer(); + if (playerTarget != null) + playerTarget.RemoveAuraVision(PlayerFieldByte2Flags.InvisibilityGlow); target.m_invisibility.DelFlag(type); } @@ -1172,9 +1132,10 @@ namespace Game.Spells { target.m_stealth.AddFlag(type); target.m_stealth.AddValue(type, GetAmount()); - target.SetStandFlags(UnitStandFlags.Creep); - if (target.IsTypeId(TypeId.Player)) - target.SetByteFlag(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, PlayerFieldByte2Flags.Stealth); + target.AddVisFlags(UnitVisFlags.Creep); + Player playerTarget = target.ToPlayer(); + if (playerTarget != null) + playerTarget.AddAuraVision(PlayerFieldByte2Flags.Stealth); } else { @@ -1184,9 +1145,10 @@ namespace Game.Spells { target.m_stealth.DelFlag(type); - target.RemoveStandFlags(UnitStandFlags.Creep); - if (target.IsTypeId(TypeId.Player)) - target.RemoveByteFlag(ActivePlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, PlayerFieldByte2Flags.Stealth); + target.RemoveVisFlags(UnitVisFlags.Creep); + Player playerTarget = target.ToPlayer(); + if (playerTarget != null) + playerTarget.RemoveAuraVision(PlayerFieldByte2Flags.Stealth); } } @@ -1253,14 +1215,13 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) return; - Unit target = aurApp.GetTarget(); - - if (!target.IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) return; if (apply) { - target.SetFlag(PlayerFields.Flags, PlayerFlags.Ghost); + target.AddPlayerFlag(PlayerFlags.Ghost); target.m_serverSideVisibility.SetValue(ServerSideVisibilityType.Ghost, GhostVisibilityType.Ghost); target.m_serverSideVisibilityDetect.SetValue(ServerSideVisibilityType.Ghost, GhostVisibilityType.Ghost); } @@ -1269,7 +1230,7 @@ namespace Game.Spells if (target.HasAuraType(AuraType.Ghost)) return; - target.RemoveFlag(PlayerFields.Flags, PlayerFlags.Ghost); + target.RemovePlayerFlag(PlayerFlags.Ghost); target.m_serverSideVisibility.SetValue(ServerSideVisibilityType.Ghost, GhostVisibilityType.Alive); target.m_serverSideVisibilityDetect.SetValue(ServerSideVisibilityType.Ghost, GhostVisibilityType.Alive); } @@ -1631,8 +1592,8 @@ namespace Game.Spells target.SetDisplayId(model_id); // Dragonmaw Illusion (set mount model also) - if (GetId() == 42016 && target.GetMountID() != 0 && !target.GetAuraEffectsByType(AuraType.ModIncreaseMountedFlightSpeed).Empty()) - target.SetUInt32Value(UnitFields.MountDisplayId, 16314); + if (GetId() == 42016 && target.GetMountDisplayId() != 0 && !target.GetAuraEffectsByType(AuraType.ModIncreaseMountedFlightSpeed).Empty()) + target.SetMountDisplayId(16314); } } } @@ -1663,7 +1624,7 @@ namespace Game.Spells target.RestoreDisplayId(target.IsMounted()); // Dragonmaw Illusion (restore mount model) - if (GetId() == 42016 && target.GetMountID() == 16314) + if (GetId() == 42016 && target.GetMountDisplayId() == 16314) { if (!target.GetAuraEffectsByType(AuraType.Mounted).Empty()) { @@ -1674,7 +1635,7 @@ namespace Game.Spells CreatureModel model = ObjectManager.ChooseDisplayId(ci); Global.ObjectMgr.GetCreatureModelRandomGender(ref model, ci); - target.SetUInt32Value(UnitFields.MountDisplayId, model.CreatureDisplayID); + target.SetMountDisplayId(model.CreatureDisplayID); } } } @@ -1690,7 +1651,7 @@ namespace Game.Spells Unit target = aurApp.GetTarget(); - float scale = target.GetFloatValue(ObjectFields.ScaleX); + float scale = target.GetObjectScale(); MathFunctions.ApplyPercentModFloatVar(ref scale, GetAmount(), apply); target.SetObjectScale(scale); } @@ -1712,12 +1673,12 @@ namespace Game.Spells // What must be cloned? at least display and scale target.SetDisplayId(caster.GetDisplayId()); //target.SetObjectScale(caster.GetFloatValue(OBJECT_FIELD_SCALE_X)); // we need retail info about how scaling is handled (aura maybe?) - target.SetFlag(UnitFields.Flags2, UnitFlags2.MirrorImage); + target.AddUnitFlag2(UnitFlags2.MirrorImage); } else { target.SetDisplayId(target.GetNativeDisplayId()); - target.RemoveFlag(UnitFields.Flags2, UnitFlags2.MirrorImage); + target.RemoveUnitFlag2(UnitFlags2.MirrorImage); } } @@ -1765,24 +1726,17 @@ namespace Game.Spells // stop handling the effect if it was removed by linked event if (aurApp.HasRemoveMode()) return; - // blizz like 2.0.x - target.SetFlag(UnitFields.Flags, UnitFlags.Unk29); - // blizz like 2.0.x - target.SetFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); - // blizz like 2.0.x - target.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); + target.AddUnitFlag(UnitFlags.Unk29); + target.AddUnitFlag2(UnitFlags2.FeignDeath); + target.AddDynamicFlag(UnitDynFlags.Dead); target.AddUnitState(UnitState.Died); } else { - // blizz like 2.0.x - target.RemoveFlag(UnitFields.Flags, UnitFlags.Unk29); - // blizz like 2.0.x - target.RemoveFlag(UnitFields.Flags2, UnitFlags2.FeignDeath); - // blizz like 2.0.x - target.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Dead); - + target.RemoveUnitFlag(UnitFlags.Unk29); + target.RemoveUnitFlag2(UnitFlags2.FeignDeath); + target.RemoveDynamicFlag(UnitDynFlags.Dead); target.ClearUnitState(UnitState.Died); } } @@ -1799,7 +1753,10 @@ namespace Game.Spells if (!apply && target.HasAuraType(AuraType.ModUnattackable)) return; - target.ApplyModFlag(UnitFields.Flags, UnitFlags.NonAttackable, apply); + if (apply) + target.AddUnitFlag(UnitFlags.NonAttackable); + else + target.RemoveUnitFlag(UnitFlags.NonAttackable); // call functions which may have additional effects after chainging state of unit if (apply && mode.HasAnyFlag(AuraEffectHandleModes.Real)) @@ -1822,26 +1779,34 @@ namespace Game.Spells //Prevent handling aura twice if ((apply) ? target.GetAuraEffectsByType(type).Count > 1 : target.HasAuraType(type)) return; - UnitFields field; - uint flag, slot; + + Action flagAddFn = null; + Action flagRemoveFn = null; + uint slot; WeaponAttackType attType; switch (type) { case AuraType.ModDisarm: - field = UnitFields.Flags; - flag = (uint)UnitFlags.Disarmed; + if (apply) + flagAddFn = unit => { unit.AddUnitFlag(UnitFlags.Disarmed); }; + else + flagRemoveFn = unit => { unit.RemoveUnitFlag(UnitFlags.Disarmed); }; slot = EquipmentSlot.MainHand; attType = WeaponAttackType.BaseAttack; break; case AuraType.ModDisarmOffhand: - field = UnitFields.Flags2; - flag = (uint)UnitFlags2.DisarmOffhand; + if (apply) + flagAddFn = unit => { unit.AddUnitFlag2(UnitFlags2.DisarmOffhand); }; + else + flagRemoveFn = unit => { unit.RemoveUnitFlag2(UnitFlags2.DisarmOffhand); }; slot = EquipmentSlot.OffHand; attType = WeaponAttackType.OffAttack; break; case AuraType.ModDisarmRanged: - field = UnitFields.Flags2; - flag = (uint)UnitFlags2.DisarmRanged; + if (apply) + flagAddFn = unit => { unit.AddUnitFlag2(UnitFlags2.DisarmRanged); }; + else + flagRemoveFn = unit => { unit.RemoveUnitFlag2(UnitFlags2.DisarmRanged); }; slot = EquipmentSlot.MainHand; attType = WeaponAttackType.RangedAttack; break; @@ -1850,8 +1815,7 @@ namespace Game.Spells } // if disarm aura is to be removed, remove the flag first to reapply damage/aura mods - if (!apply) - target.RemoveFlag(field, flag); + flagRemoveFn?.Invoke(target); // Handle damage modification, shapeshifted druids are not affected if (target.IsTypeId(TypeId.Player) && !target.IsInFeralForm()) @@ -1870,8 +1834,7 @@ namespace Game.Spells } // if disarm effects should be applied, wait to set flag until damage mods are unapplied - if (apply) - target.SetFlag(field, flag); + flagAddFn?.Invoke(target); if (target.IsTypeId(TypeId.Unit) && target.ToCreature().GetCurrentEquipmentId() != 0) target.UpdateDamagePhysical(attType); @@ -1887,7 +1850,7 @@ namespace Game.Spells if (apply) { - target.SetFlag(UnitFields.Flags, UnitFlags.Silenced); + target.AddUnitFlag(UnitFlags.Silenced); // call functions which may have additional effects after chainging state of unit // Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_SILENCE @@ -1906,7 +1869,7 @@ namespace Game.Spells if (target.HasAuraType(AuraType.ModSilence) || target.HasAuraType(AuraType.ModPacifySilence)) return; - target.RemoveFlag(UnitFields.Flags, UnitFlags.Silenced); + target.RemoveUnitFlag(UnitFlags.Silenced); } } @@ -1919,13 +1882,13 @@ namespace Game.Spells Unit target = aurApp.GetTarget(); if (apply) - target.SetFlag(UnitFields.Flags, UnitFlags.Pacified); + target.AddUnitFlag(UnitFlags.Pacified); else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (target.HasAuraType(AuraType.ModPacify) || target.HasAuraType(AuraType.ModPacifySilence)) return; - target.RemoveFlag(UnitFields.Flags, UnitFlags.Pacified); + target.RemoveUnitFlag(UnitFlags.Pacified); } } @@ -1942,9 +1905,9 @@ namespace Game.Spells if (m_spellInfo.Id == 45839) { if (apply) - target.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); + target.AddUnitFlag(UnitFlags.NonAttackable); else - target.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable); + target.RemoveUnitFlag(UnitFlags.NonAttackable); } if (!(apply)) { @@ -1962,18 +1925,17 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) return; - Unit target = aurApp.GetTarget(); - - if (target.IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target != null) { if (apply) - target.SetFlag(PlayerFields.Flags, PlayerFlags.AllowOnlyAbility); + target.AddPlayerFlag(PlayerFlags.AllowOnlyAbility); else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (target.HasAuraType(AuraType.AllowOnlyAbility)) return; - target.RemoveFlag(PlayerFields.Flags, PlayerFlags.AllowOnlyAbility); + target.RemovePlayerFlag(PlayerFlags.AllowOnlyAbility); } } } @@ -1988,7 +1950,7 @@ namespace Game.Spells if (apply) { - target.SetFlag(UnitFields.Flags2, UnitFlags2.NoActions); + target.AddUnitFlag2(UnitFlags2.NoActions); // call functions which may have additional effects after chainging state of unit // Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_SILENCE @@ -2007,7 +1969,7 @@ namespace Game.Spells if (target.HasAuraType(AuraType.ModNoActions)) return; - target.RemoveFlag(UnitFields.Flags2, UnitFlags2.NoActions); + target.RemoveUnitFlag2(UnitFlags2.NoActions); } } @@ -2020,15 +1982,14 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) return; - Unit target = aurApp.GetTarget(); - - if (!target.IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) return; if (apply) - target.SetFlag(ActivePlayerFields.TrackCreatures, 1 << (GetMiscValue() - 1)); + target.AddTrackCreatureFlag(1u << (GetMiscValue() - 1)); else - target.RemoveFlag(ActivePlayerFields.TrackCreatures, 1 << (GetMiscValue() - 1)); + target.RemoveTrackCreatureFlag(1u << (GetMiscValue() - 1)); } [AuraEffectHandler(AuraType.TrackResources)] @@ -2037,15 +1998,17 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) return; - Unit target = aurApp.GetTarget(); - - if (!target.IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) return; + uint bitIndex = (uint)GetMiscValue() - 1; + uint index = bitIndex / 32; + uint flag = 1u << ((int)bitIndex % 32); if (apply) - target.SetFlag(ActivePlayerFields.TrackResources, 1 << (GetMiscValue() - 1)); + target.AddTrackResourceFlag(index, flag); else - target.RemoveFlag(ActivePlayerFields.TrackResources, 1 << (GetMiscValue() - 1)); + target.RemoveTrackResourceFlag(index, flag); } [AuraEffectHandler(AuraType.TrackStealthed)] @@ -2054,9 +2017,8 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) return; - Unit target = aurApp.GetTarget(); - - if (!target.IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) return; if (!(apply)) @@ -2065,7 +2027,10 @@ namespace Game.Spells if (target.HasAuraType(GetAuraType())) return; } - target.ApplyModFlag(ActivePlayerFields.LocalFlags, PlayerLocalFlags.TrackStealthed, apply); + if (apply) + target.AddPlayerLocalFlag(PlayerLocalFlags.TrackStealthed); + else + target.RemovePlayerLocalFlag(PlayerLocalFlags.TrackStealthed); } [AuraEffectHandler(AuraType.ModStalked)] @@ -2078,12 +2043,12 @@ namespace Game.Spells // used by spells: Hunter's Mark, Mind Vision, Syndicate Tracker (MURP) DND if (apply) - target.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.TrackUnit); + target.AddDynamicFlag(UnitDynFlags.TrackUnit); else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (!target.HasAuraType(GetAuraType())) - target.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.TrackUnit); + target.RemoveDynamicFlag(UnitDynFlags.TrackUnit); } // call functions which may have additional effects after chainging state of unit @@ -2096,16 +2061,18 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) return; - Unit target = aurApp.GetTarget(); + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) + return; if (apply) - target.SetByteFlag(UnitFields.Bytes1, UnitBytes1Offsets.VisFlag, UnitStandFlags.Untrackable); + target.AddVisFlags(UnitVisFlags.Untrackable); else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (target.HasAuraType(GetAuraType())) return; - target.RemoveByteFlag(UnitFields.Bytes1, UnitBytes1Offsets.VisFlag, UnitStandFlags.Untrackable); + target.RemoveVisFlags(UnitVisFlags.Untrackable); } } @@ -2179,8 +2146,8 @@ namespace Game.Spells } } // TODO: CREATE TABLE mount_vehicle (mountId, vehicleCreatureId) for future mounts that are vehicles (new mounts no longer have proper data in MiscValue) - //if (MountVehicle const* mountVehicle = sObjectMgr->GetMountVehicle(mountEntry->Id)) - // creatureEntry = mountVehicle->VehicleCreatureId; + //if (MountVehicle const* mountVehicle = sObjectMgr.GetMountVehicle(mountEntry.Id)) + // creatureEntry = mountVehicle.VehicleCreatureId; } CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate(creatureEntry); @@ -2329,13 +2296,13 @@ namespace Game.Spells Unit target = aurApp.GetTarget(); if (apply) - target.SetFlag(UnitFields.Flags2, UnitFlags2.ForceMove); + target.AddUnitFlag2(UnitFlags2.ForceMove); else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (target.HasAuraType(GetAuraType())) return; - target.RemoveFlag(UnitFields.Flags2, UnitFlags2.ForceMove); + target.RemoveUnitFlag2(UnitFlags2.ForceMove); } } @@ -2692,8 +2659,8 @@ namespace Game.Spells target.ApplySpellImmune(GetId(), SpellImmunity.Mechanic, (uint)Mechanics.Polymorph, apply); // Dragonmaw Illusion (overwrite mount model, mounted aura already applied) - if (apply && target.HasAuraEffect(42016, 0) && target.GetMountID() != 0) - target.SetUInt32Value(UnitFields.MountDisplayId, 16314); + if (apply && target.HasAuraEffect(42016, 0) && target.GetMountDisplayId() != 0) + target.SetMountDisplayId(16314); } } } @@ -2963,17 +2930,19 @@ namespace Game.Spells if (!mode.HasAnyFlag((AuraEffectHandleModes.ChangeAmountMask | AuraEffectHandleModes.Stat))) return; - Unit target = aurApp.GetTarget(); + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) + return; // applied to damage as HandleNoImmediateEffect in Unit.CalcAbsorbResist and Unit.CalcArmorReducedDamage // show armor penetration if (target.IsTypeId(TypeId.Player) && Convert.ToBoolean(GetMiscValue() & (int)SpellSchoolMask.Normal)) - target.ApplyModUInt32Value(ActivePlayerFields.ModTargetPhysicalResistance, GetAmount(), apply); + target.ApplyModTargetPhysicalResistance(GetAmount(), apply); // show as spell penetration only full spell penetration bonuses (all resistances except armor and holy if (target.IsTypeId(TypeId.Player) && ((SpellSchoolMask)GetMiscValue() & SpellSchoolMask.Spell) == SpellSchoolMask.Spell) - target.ApplyModUInt32Value(ActivePlayerFields.ModTargetResistance, GetAmount(), apply); + target.ApplyModTargetResistance(GetAmount(), apply); } /********************************/ @@ -3261,7 +3230,7 @@ namespace Game.Spells if (!target) return; - target.ApplyModSignedFloatValue(ActivePlayerFields.OverrideSpellPowerByApPct, m_amount, apply); + target.ApplyModOverrideSpellPowerByAPPercent(m_amount, apply); target.UpdateSpellDamageAndHealingBonus(); } @@ -3275,7 +3244,7 @@ namespace Game.Spells if (!target) return; - target.ApplyModSignedFloatValue(ActivePlayerFields.OverrideApBySpellPowerPercent, m_amount, apply); + target.ApplyModOverrideAPBySpellPowerPercent(m_amount, apply); target.UpdateAttackPowerAndDamage(); target.UpdateAttackPowerAndDamage(true); } @@ -3289,7 +3258,7 @@ namespace Game.Spells Player target = aurApp.GetTarget().ToPlayer(); if (target) { - target.SetStatFloatValue(ActivePlayerFields.VersatilityBonus, target.GetTotalAuraModifier(AuraType.ModVersatility)); + target.SetVersatilityBonus(target.GetTotalAuraModifier(AuraType.ModVersatility)); target.UpdateHealingDonePercentMod(); target.UpdateVersatilityDamageDone(); } @@ -3519,10 +3488,10 @@ namespace Game.Spells if (apply) { target.RemoveAurasByType(GetAuraType(), ObjectGuid.Empty, GetBase()); - target.SetUInt32Value(UnitFields.OverrideDisplayPowerId, powerDisplay.Id); + target.SetOverrideDisplayPowerId(powerDisplay.Id); } else - target.SetUInt32Value(UnitFields.OverrideDisplayPowerId, 0); + target.SetOverrideDisplayPowerId(0); } [AuraEffectHandler(AuraType.ModMaxPowerPct)] @@ -3933,16 +3902,21 @@ namespace Game.Spells // Magic damage modifiers implemented in Unit::SpellBaseDamageBonusDone // This information for client side use only - if (target.IsTypeId(TypeId.Player)) + Player playerTarget = target.ToPlayer(); + if (playerTarget != null) { - ActivePlayerFields baseField = GetAmount() >= 0 ? ActivePlayerFields.ModDamageDonePos : ActivePlayerFields.ModDamageDoneNeg; for (int i = 0; i < (int)SpellSchools.Max; ++i) { if (Convert.ToBoolean(GetMiscValue() & (1 << i))) - target.ApplyModInt32Value(baseField + i, GetAmount(), apply); + { + if (GetAmount() >= 0) + playerTarget.ApplyModDamageDonePos((SpellSchools)i, GetAmount(), apply); + else + playerTarget.ApplyModDamageDoneNeg((SpellSchools)i, GetAmount(), apply); + } } - Guardian pet = target.ToPlayer().GetGuardianPet(); + Guardian pet = playerTarget.GetGuardianPet(); if (pet) pet.UpdateAttackPowerAndDamage(); } @@ -3973,16 +3947,17 @@ namespace Game.Spells target.HandleStatModifier(UnitMods.DamageRanged, UnitModifierType.TotalPCT, GetAmount(), apply); } - if (target.IsTypeId(TypeId.Player)) + Player thisPlayer = target.ToPlayer(); + if (thisPlayer != null) { for (int i = 0; i < (int)SpellSchools.Max; ++i) { if (Convert.ToBoolean(GetMiscValue() & (1 << i))) { if (spellGroupVal != 0) - target.ApplyPercentModFloatValue(ActivePlayerFields.ModDamageDonePct + i, spellGroupVal, !apply); + thisPlayer.ApplyModDamageDonePercent((SpellSchools)i, spellGroupVal, !apply); - target.ApplyPercentModFloatValue(ActivePlayerFields.ModDamageDonePct + i, GetAmount(), apply); + thisPlayer.ApplyModDamageDonePercent((SpellSchools)i, GetAmount(), apply); } } } @@ -4024,7 +3999,7 @@ namespace Game.Spells float amount = MathFunctions.CalculatePct(1.0f, GetAmount()); for (int i = 0; i < (int)SpellSchools.Max; ++i) if (Convert.ToBoolean(GetMiscValue() & (1 << i))) - target.ApplyModSignedFloatValue(UnitFields.PowerCostMultiplier + i, amount, apply); + target.ApplyModPowerCostMultiplier((SpellSchools)i, amount, apply); } [AuraEffectHandler(AuraType.ModPowerCostSchool)] @@ -4037,7 +4012,7 @@ namespace Game.Spells for (int i = 0; i < (int)SpellSchools.Max; ++i) if (Convert.ToBoolean(GetMiscValue() & (1 << i))) - target.ApplyModUInt32Value(UnitFields.PowerCostModifier + i, GetAmount(), apply); + target.ApplyModPowerCostModifier((SpellSchools)i, GetAmount(), apply); } [AuraEffectHandler(AuraType.ArenaPreparation)] @@ -4049,13 +4024,13 @@ namespace Game.Spells Unit target = aurApp.GetTarget(); if (apply) - target.SetFlag(UnitFields.Flags, UnitFlags.Preparation); + target.AddUnitFlag(UnitFlags.Preparation); else { // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (target.HasAuraType(GetAuraType())) return; - target.RemoveFlag(UnitFields.Flags, UnitFlags.Preparation); + target.RemoveUnitFlag(UnitFlags.Preparation); } } @@ -4079,9 +4054,7 @@ namespace Game.Spells mask |= effect.SpellClassMask; } - target.SetUInt32Value(ActivePlayerFields.NoReagentCost, mask[0]); - target.SetUInt32Value(ActivePlayerFields.NoReagentCost + 1, mask[1]); - target.SetUInt32Value(ActivePlayerFields.NoReagentCost + 2, mask[2]); + target.ToPlayer().SetNoRegentCostMask(mask); } [AuraEffectHandler(AuraType.RetainComboPoints)] @@ -4556,7 +4529,12 @@ namespace Game.Spells } if (target.GetCreatureType() == CreatureType.Beast) - target.ApplyModUInt32Value(ObjectFields.DynamicFlags, (int)UnitDynFlags.SpecialInfo, apply); + { + if (apply) + target.AddDynamicFlag(UnitDynFlags.SpecialInfo); + else + target.RemoveDynamicFlag(UnitDynFlags.SpecialInfo); + } } [AuraEffectHandler(AuraType.ModFaction)] @@ -4571,13 +4549,13 @@ namespace Game.Spells { target.SetFaction((uint)GetMiscValue()); if (target.IsTypeId(TypeId.Player)) - target.RemoveFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + target.RemoveUnitFlag(UnitFlags.PvpAttackable); } else { target.RestoreFaction(); if (target.IsTypeId(TypeId.Player)) - target.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); + target.AddUnitFlag(UnitFlags.PvpAttackable); } } @@ -4590,13 +4568,13 @@ namespace Game.Spells Unit target = aurApp.GetTarget(); if (apply) - target.SetFlag(UnitFields.Flags2, UnitFlags2.ComprehendLang); + target.AddUnitFlag2(UnitFlags2.ComprehendLang); else { if (target.HasAuraType(GetAuraType())) return; - target.RemoveFlag(UnitFields.Flags2, UnitFlags2.ComprehendLang); + target.RemoveUnitFlag2(UnitFlags2.ComprehendLang); } } @@ -4670,11 +4648,9 @@ namespace Game.Spells target.m_invisibilityDetect.AddFlag(InvisibilityType.Drunk); target.m_invisibilityDetect.AddValue(InvisibilityType.Drunk, GetAmount()); - if (target.IsTypeId(TypeId.Player)) - { - int oldval = target.ToPlayer().GetInt32Value(PlayerFields.FakeInebriation); - target.ToPlayer().SetInt32Value(PlayerFields.FakeInebriation, oldval + GetAmount()); - } + Player playerTarget = target.ToPlayer(); + if (playerTarget) + playerTarget.ApplyModFakeInebriation(GetAmount(), true); } else { @@ -4682,13 +4658,13 @@ namespace Game.Spells target.m_invisibilityDetect.AddValue(InvisibilityType.Drunk, -GetAmount()); - if (target.IsTypeId(TypeId.Player)) + Player playerTarget = target.ToPlayer(); + if (playerTarget != null) { - int oldval = target.ToPlayer().GetInt32Value(PlayerFields.FakeInebriation); - target.ToPlayer().SetInt32Value(PlayerFields.FakeInebriation, oldval - GetAmount()); + playerTarget.ApplyModFakeInebriation(GetAmount(), false); if (removeDetect) - removeDetect = target.ToPlayer().GetDrunkValue() == 0; + removeDetect = playerTarget.GetDrunkValue() == 0; } if (removeDetect) @@ -4714,7 +4690,7 @@ namespace Game.Spells if (apply) { - target.SetUInt16Value(ActivePlayerFields.Bytes3, PlayerFieldOffsets.FieldBytes3OffsetOverrideSpellsIdUint16Offset, (ushort)overrideId); + target.SetOverrideSpellsId(overrideId); OverrideSpellDataRecord overrideSpells = CliDB.OverrideSpellDataStorage.LookupByKey(overrideId); if (overrideSpells != null) { @@ -4728,7 +4704,7 @@ namespace Game.Spells } else { - target.SetUInt16Value(ActivePlayerFields.Bytes3, PlayerFieldOffsets.FieldBytes3OffsetOverrideSpellsIdUint16Offset, 0); + target.SetOverrideSpellsId(0); OverrideSpellDataRecord overrideSpells = CliDB.OverrideSpellDataStorage.LookupByKey(overrideId); if (overrideSpells != null) { @@ -4776,13 +4752,14 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.Real)) return; - if (!aurApp.GetTarget().IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) return; if (apply) - aurApp.GetTarget().RemoveByteFlag(ActivePlayerFields.LocalFlags, 0, PlayerLocalFlags.ReleaseTimer); - else if (!aurApp.GetTarget().GetMap().Instanceable()) - aurApp.GetTarget().SetByteFlag(ActivePlayerFields.LocalFlags, 0, PlayerLocalFlags.ReleaseTimer); + target.RemovePlayerLocalFlag(PlayerLocalFlags.ReleaseTimer); + else if (!target.GetMap().Instanceable()) + target.AddPlayerLocalFlag(PlayerLocalFlags.ReleaseTimer); } [AuraEffectHandler(AuraType.Mastery)] @@ -4917,7 +4894,7 @@ namespace Game.Spells if (GetId() == 52179) // Astral Shift { // Periodic need for remove visual on stun/fear/silence lost - if (!Convert.ToBoolean(target.GetUInt32Value(UnitFields.Flags) & (uint)(UnitFlags.Stunned | UnitFlags.Fleeing | UnitFlags.Silenced))) + if (!target.HasUnitFlag(UnitFlags.Stunned | UnitFlags.Fleeing | UnitFlags.Silenced)) target.RemoveAurasDueToSpell(52179); break; } @@ -5947,13 +5924,14 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.Real)) return; - if (!aurApp.GetTarget().IsTypeId(TypeId.Player)) + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) return; if (apply) - aurApp.GetTarget().SetFlag(ActivePlayerFields.LocalFlags, PlayerLocalFlags.CanUseObjectsMounted); - else if (!aurApp.GetTarget().HasAuraType(AuraType.AllowUsingGameobjectsWhileMounted)) - aurApp.GetTarget().RemoveFlag(ActivePlayerFields.LocalFlags, PlayerLocalFlags.CanUseObjectsMounted); + target.AddPlayerLocalFlag(PlayerLocalFlags.CanUseObjectsMounted); + else if (!target.HasAuraType(AuraType.AllowUsingGameobjectsWhileMounted)) + target.RemovePlayerLocalFlag(PlayerLocalFlags.CanUseObjectsMounted); } [AuraEffectHandler(AuraType.PlayScene)] diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index d2821b502..c65e4b5bd 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -431,7 +431,7 @@ namespace Game.Spells { case Targets.UnitChannelTarget: { - foreach (ObjectGuid channelTarget in m_originalCaster.GetChannelObjects()) + foreach (ObjectGuid channelTarget in m_originalCaster.m_unitData.ChannelObjects) { WorldObject target = Global.ObjAccessor.GetUnit(m_caster, channelTarget); CallScriptObjectTargetSelectHandlers(ref target, effIndex, targetType); @@ -450,7 +450,7 @@ namespace Game.Spells m_targets.SetDst(channeledSpell.m_targets); else { - var channelObjects = m_originalCaster.GetChannelObjects(); + List channelObjects = m_originalCaster.m_unitData.ChannelObjects; WorldObject target = channelObjects.Count > 0 ? Global.ObjAccessor.GetWorldObject(m_caster, channelObjects[0]) : null; if (target != null) { @@ -2090,7 +2090,7 @@ namespace Game.Spells if (m_caster != unit) { // Recheck UNIT_FLAG_NON_ATTACKABLE for delayed spells - if (m_spellInfo.Speed > 0.0f && unit.HasFlag(UnitFields.Flags, UnitFlags.NonAttackable) && unit.GetCharmerOrOwnerGUID() != m_caster.GetGUID()) + if (m_spellInfo.Speed > 0.0f && unit.HasUnitFlag(UnitFlags.NonAttackable) && unit.GetCharmerOrOwnerGUID() != m_caster.GetGUID()) return SpellMissInfo.Evade; if (m_caster._IsValidAttackTarget(unit, m_spellInfo)) @@ -2214,7 +2214,7 @@ namespace Game.Spells // if there is no periodic effect if (duration == 0) - duration = (int)(origDuration * m_originalCaster.GetFloatValue(UnitFields.ModCastSpeed)); + duration = (int)(origDuration * m_originalCaster.m_unitData.ModCastingSpeed); } } @@ -2504,7 +2504,7 @@ namespace Game.Spells else m_casttime = m_spellInfo.CalcCastTime(m_caster.getLevel(), this); - if (m_caster.IsTypeId(TypeId.Unit) && !m_caster.HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled)) // _UNIT actually means creature. for some reason. + if (m_caster.IsTypeId(TypeId.Unit) && !m_caster.HasUnitFlag(UnitFlags.PlayerControlled)) // _UNIT actually means creature. for some reason. { if (!(m_spellInfo.IsNextMeleeSwingSpell() || IsAutoRepeat() || _triggeredCastFlags.HasAnyFlag(TriggerCastFlags.IgnoreSetFacing))) { @@ -2566,7 +2566,7 @@ namespace Game.Spells TriggerGlobalCooldown(); //item: first cast may destroy item and second cast causes crash - // commented out !m_spellInfo->StartRecoveryTime, it forces instant spells with global cooldown to be processed in spell::update + // commented out !m_spellInfo.StartRecoveryTime, it forces instant spells with global cooldown to be processed in spell::update // as a result a spell that passed CheckCast and should be processed instantly may suffer from this delayed process // the easiest bug to observe is LoS check in AddUnitTarget, even if spell passed the CheckCast LoS check the situation can change in spell::update // because target could be relocated in the meantime, making the spell fly to the air (no targets can be registered, so no effects processed, nothing in combat log) @@ -2731,7 +2731,7 @@ namespace Game.Spells // if the spell allows the creature to turn while casting, then adjust server-side orientation to face the target now // client-side orientation is handled by the client itself, as the cast target is targeted due to Creature::FocusTarget - if (m_caster.IsTypeId(TypeId.Unit) && !m_caster.HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled)) + if (m_caster.IsTypeId(TypeId.Unit) && !m_caster.HasUnitFlag(UnitFlags.PlayerControlled)) { if (!m_spellInfo.HasAttribute(SpellAttr5.DontTurnDuringCast)) { @@ -3203,7 +3203,7 @@ namespace Game.Spells Unit charm = m_caster.GetCharm(); if (charm != null) if (charm.IsTypeId(TypeId.Unit) && charm.ToCreature().HasUnitTypeMask(UnitTypeMask.Puppet) - && charm.GetUInt32Value(UnitFields.CreatedBySpell) == m_spellInfo.Id) + && charm.m_unitData.CreatedBySpell == m_spellInfo.Id) ((Puppet)charm).UnSummon(); } @@ -3216,7 +3216,7 @@ namespace Game.Spells if (m_caster.IsTypeId(TypeId.Unit) && m_caster.ToCreature().IsSummon()) { // Unsummon statue - uint spell = m_caster.GetUInt32Value(UnitFields.CreatedBySpell); + uint spell = m_caster.m_unitData.CreatedBySpell; SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spell); if (spellInfo != null && spellInfo.IconFileDataId == 134230) { @@ -3961,7 +3961,7 @@ namespace Game.Spells { if (time == 0) { - m_caster.ClearDynamicValue(UnitDynamicFields.ChannelObjects); + m_caster.ClearChannelObjects(); m_caster.SetChannelSpellId(0); m_caster.SetChannelSpellXSpellVisualId(0); } @@ -4357,7 +4357,7 @@ namespace Game.Spells if (m_caster.IsTypeId(TypeId.Player)) { //can cast triggered (by aura only?) spells while have this flag - if (!_triggeredCastFlags.HasAnyFlag(TriggerCastFlags.IgnoreCasterAurastate) && m_caster.ToPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.AllowOnlyAbility)) + if (!_triggeredCastFlags.HasAnyFlag(TriggerCastFlags.IgnoreCasterAurastate) && m_caster.ToPlayer().HasPlayerFlag(PlayerFlags.AllowOnlyAbility)) return SpellCastResult.SpellInProgress; // check if we are using a potion in combat for the 2nd+ time. Cooldown is added only after caster gets out of combat @@ -4374,7 +4374,7 @@ namespace Game.Spells } } - if (m_spellInfo.HasAttribute(SpellAttr7.IsCheatSpell) && !m_caster.HasFlag(UnitFields.Flags2, UnitFlags2.AllowCheatSpells)) + if (m_spellInfo.HasAttribute(SpellAttr7.IsCheatSpell) && !m_caster.HasUnitFlag2(UnitFlags2.AllowCheatSpells)) { m_customError = SpellCustomErrors.GmOnly; return SpellCastResult.CustomError; @@ -4785,10 +4785,10 @@ namespace Game.Spells List glyphRequiredSpecs = Global.DB2Mgr.GetGlyphRequiredSpecs(glyphId); if (!glyphRequiredSpecs.Empty()) { - if (caster.GetUInt32Value(PlayerFields.CurrentSpecId) == 0) + if (caster.GetPrimarySpecialization() == 0) return SpellCastResult.GlyphNoSpec; - if (!glyphRequiredSpecs.Contains(caster.GetUInt32Value(PlayerFields.CurrentSpecId))) + if (!glyphRequiredSpecs.Contains(caster.GetPrimarySpecialization())) return SpellCastResult.GlyphInvalidSpec; } @@ -4903,7 +4903,7 @@ namespace Game.Spells if (!m_caster.IsTypeId(TypeId.Player) || m_targets.GetUnitTarget() == null || !m_targets.GetUnitTarget().IsTypeId(TypeId.Unit)) return SpellCastResult.BadTargets; - if (!Convert.ToBoolean(m_targets.GetUnitTarget().GetUInt32Value(UnitFields.Flags) & (uint)UnitFlags.Skinnable)) + if (!m_targets.GetUnitTarget().HasUnitFlag(UnitFlags.Skinnable)) return SpellCastResult.TargetUnskinnable; Creature creature = m_targets.GetUnitTarget().ToCreature(); @@ -5395,7 +5395,7 @@ namespace Game.Spells // Check whether the cast should be prevented by any state you might have. SpellCastResult result = SpellCastResult.SpellCastOk; // Get unit state - UnitFlags unitflag = (UnitFlags)m_caster.GetUInt32Value(UnitFields.Flags); + UnitFlags unitflag = (UnitFlags)(byte)m_caster.m_unitData.Flags; // this check should only be done when player does cast directly // (ie not when it's called from a script) Breaks for example PlayerAI when charmed @@ -5447,7 +5447,7 @@ namespace Game.Spells result = SpellCastResult.Fleeing; else if (unitflag.HasAnyFlag(UnitFlags.Confused) && !usableWhileConfused && !CheckSpellCancelsConfuse(ref param1)) result = SpellCastResult.Confused; - else if (m_caster.HasFlag(UnitFields.Flags2, UnitFlags2.NoActions) && m_spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.NoActions)) + else if (m_caster.HasUnitFlag2(UnitFlags2.NoActions) && m_spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.NoActions)) result = SpellCastResult.NoActions; // Attr must make flag drop spell totally immune from all effects @@ -6993,13 +6993,13 @@ namespace Game.Spells // Apply haste rating if (gcd > 750 && ((m_spellInfo.StartRecoveryCategory == 133 && !isMeleeOrRangedSpell) || m_caster.HasAuraTypeWithAffectMask(AuraType.ModGlobalCooldownByHaste, m_spellInfo))) { - gcd = (int)(gcd * m_caster.GetFloatValue(UnitFields.ModCastHaste)); + gcd = (int)(gcd * m_caster.m_unitData.ModSpellHaste); MathFunctions.RoundToInterval(ref gcd, 750, 1500); } if (gcd > 750 && m_caster.HasAuraTypeWithAffectMask(AuraType.ModGlobalCooldownByHasteRegen, m_spellInfo)) { - gcd = (int)(gcd * m_caster.GetFloatValue(UnitFields.ModHasteRegen)); + gcd = (int)(gcd * m_caster.m_unitData.ModHasteRegen); MathFunctions.RoundToInterval(ref gcd, 750, 1500); } } @@ -7663,8 +7663,8 @@ namespace Game.Spells else { if (!_caster.IsWithinBoundaryRadius(target.ToUnit())) - // ConeAngle > 0 -> select targets in front - // ConeAngle < 0 -> select targets in back + // ConeAngle > 0 . select targets in front + // ConeAngle < 0 . select targets in back if (_caster.HasInArc(_coneAngle, target) != MathFunctions.fuzzyGe(_coneAngle, 0.0f)) return false; } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index d8df947fb..9f5b5a3b7 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -1132,7 +1132,7 @@ namespace Game.Spells if (num_to_add != 0) { // create the new item and store it - Item pItem = player.StoreNewItem(dest, newitemid, true, ItemEnchantment.GenerateItemRandomPropertyId(newitemid), null, context, bonusListIds); + Item pItem = player.StoreNewItem(dest, newitemid, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(newitemid), null, context, bonusListIds); // was it successful? return error if not if (pItem == null) @@ -1143,7 +1143,7 @@ namespace Game.Spells // set the "Crafted by ..." property of the item if (pItem.GetTemplate().GetClass() != ItemClass.Consumable && pItem.GetTemplate().GetClass() != ItemClass.Quest && newitemid != 6265 && newitemid != 6948) - pItem.SetGuidValue(ItemFields.Creator, player.GetGUID()); + pItem.SetCreator(player.GetGUID()); // send info to the client player.SendNewItem(pItem, num_to_add, true, bgType == 0); @@ -1522,7 +1522,7 @@ namespace Game.Spells SendLoot(guid, LootType.Skinning); else if (itemTarget != null) { - itemTarget.SetFlag(ItemFields.Flags, ItemFieldFlags.Unlocked); + itemTarget.AddItemFlag(ItemFieldFlags.Unlocked); itemTarget.SetState(ItemUpdateState.Changed, itemTarget.GetOwner()); } @@ -1581,11 +1581,11 @@ namespace Game.Spells for (var j = EnchantmentSlot.Perm; j <= EnchantmentSlot.Temp; ++j) if (m_CastItem.GetEnchantmentId(j) != 0) - pNewItem.SetEnchantment(j, m_CastItem.GetEnchantmentId(j), m_CastItem.GetEnchantmentDuration(j), m_CastItem.GetEnchantmentCharges(j)); + pNewItem.SetEnchantment(j, m_CastItem.GetEnchantmentId(j), m_CastItem.GetEnchantmentDuration(j), (uint)m_CastItem.GetEnchantmentCharges(j)); - if (m_CastItem.GetUInt32Value(ItemFields.Durability) < m_CastItem.GetUInt32Value(ItemFields.MaxDurability)) + if (m_CastItem.m_itemData.Durability < m_CastItem.m_itemData.MaxDurability) { - double lossPercent = 1 - m_CastItem.GetUInt32Value(ItemFields.Durability) / (double)m_CastItem.GetUInt32Value(ItemFields.MaxDurability); + double lossPercent = 1 - m_CastItem.m_itemData.Durability / m_CastItem.m_itemData.MaxDurability; player.DurabilityLoss(pNewItem, lossPercent); } @@ -1788,9 +1788,10 @@ namespace Game.Spells return; summon.SelectLevel(); // some summoned creaters have different from 1 DB data for level/hp - summon.SetUInt64Value(UnitFields.NpcFlags, (ulong)summon.GetCreatureTemplate().Npcflag); + summon.SetNpcFlags((NPCFlags)((int)summon.GetCreatureTemplate().Npcflag & 0xFFFFFFFF)); + summon.SetNpcFlags2((NPCFlags2)((int)summon.GetCreatureTemplate().Npcflag >> 32)); - summon.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); + summon.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc); summon.GetAI().EnterEvadeMode(); break; @@ -1817,8 +1818,8 @@ namespace Game.Spells if (properties.Control == SummonCategory.Ally) { summon.SetOwnerGUID(m_originalCaster.GetGUID()); - summon.SetFaction(m_originalCaster.getFaction()); - summon.SetUInt32Value(UnitFields.CreatedBySpell, m_spellInfo.Id); + summon.SetFaction(m_originalCaster.GetFaction()); + summon.SetCreatedBySpell(m_spellInfo.Id); } ExecuteLogEffectSummonObject(effIndex, summon); @@ -1851,7 +1852,7 @@ namespace Game.Spells uint faction = properties.Faction; if (faction == 0) - faction = m_originalCaster.getFaction(); + faction = m_originalCaster.GetFaction(); summon.SetFaction(faction); break; @@ -2383,13 +2384,13 @@ namespace Game.Spells uint level = (creatureTarget.GetLevelForTarget(m_caster) < (m_caster.GetLevelForTarget(creatureTarget) - 5)) ? (m_caster.GetLevelForTarget(creatureTarget) - 5) : creatureTarget.GetLevelForTarget(m_caster); // prepare visual effect for levelup - pet.SetUInt32Value(UnitFields.Level, level - 1); + pet.SetLevel(level - 1); // add to world pet.GetMap().AddToMap(pet.ToCreature()); // visual effect for levelup - pet.SetUInt32Value(UnitFields.Level, level); + pet.SetLevel(level); // caster have pet now m_caster.SetMinion(pet, true); @@ -2469,7 +2470,7 @@ namespace Game.Spells pet.SetReactState(ReactStates.Defensive); } - pet.SetUInt32Value(UnitFields.CreatedBySpell, m_spellInfo.Id); + pet.SetCreatedBySpell(m_spellInfo.Id); // generate new name for summon pet string new_name = Global.ObjectMgr.GeneratePetName(petentry); @@ -3515,8 +3516,8 @@ namespace Game.Spells PhasingHandler.InheritPhaseShift(go, m_caster); - go.SetUInt32Value(GameObjectFields.Faction, m_caster.getFaction()); - go.SetUInt32Value(GameObjectFields.Level, m_caster.getLevel() + 1); + go.SetFaction(m_caster.GetFaction()); + go.SetLevel(m_caster.getLevel() + 1); int duration = m_spellInfo.CalcDuration(m_caster); go.SetRespawnTime(duration > 0 ? duration / Time.InMilliseconds : 0); go.SetSpellId(m_spellInfo.Id); @@ -3553,8 +3554,8 @@ namespace Game.Spells duel2.isMounted = (GetSpellInfo().Id == 62875); // Mounted Duel target.duel = duel2; - caster.SetGuidValue(PlayerFields.DuelArbiter, go.GetGUID()); - target.SetGuidValue(PlayerFields.DuelArbiter, go.GetGUID()); + caster.SetDuelArbiter(go.GetGUID()); + target.SetDuelArbiter(go.GetGUID()); Global.ScriptMgr.OnPlayerDuelRequest(target, caster); } @@ -4066,8 +4067,8 @@ namespace Game.Spells SkillType skill = creature.GetCreatureTemplate().GetRequiredLootSkill(); m_caster.ToPlayer().SendLoot(creature.GetGUID(), LootType.Skinning); - creature.RemoveFlag(UnitFields.Flags, UnitFlags.Skinnable); - creature.SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); + creature.RemoveUnitFlag(UnitFlags.Skinnable); + creature.AddDynamicFlag(UnitDynFlags.Lootable); if (skill == SkillType.Skinning) { @@ -4396,8 +4397,8 @@ namespace Game.Spells player.GetMap().CreatureRelocation(pet, x, y, z, player.GetOrientation()); - pet.SetUInt32Value(ObjectFields.DynamicFlags, (uint)UnitDynFlags.HideModel); - pet.RemoveFlag(UnitFields.Flags, UnitFlags.Skinnable); + pet.SetDynamicFlags(UnitDynFlags.HideModel); + pet.RemoveUnitFlag(UnitFlags.Skinnable); pet.setDeathState(DeathState.Alive); pet.ClearUnitState(UnitState.AllState); pet.SetHealth(pet.CountPctFromMaxHealth(damage)); @@ -4422,7 +4423,7 @@ namespace Game.Spells Creature totem = m_caster.GetMap().GetCreature(m_caster.m_SummonSlot[slot]); if (totem != null && totem.IsTotem()) { - uint spell_id = totem.GetUInt32Value(UnitFields.CreatedBySpell); + uint spell_id = totem.m_unitData.CreatedBySpell; SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spell_id); if (spellInfo != null) { @@ -4577,10 +4578,10 @@ namespace Game.Spells { case GameObjectTypes.FishingNode: { - go.SetFaction(m_caster.getFaction()); + go.SetFaction(m_caster.GetFaction()); ObjectGuid bobberGuid = go.GetGUID(); // client requires fishing bobber guid in channel object slot 0 to be usable - m_caster.SetDynamicStructuredValue(UnitDynamicFields.ChannelObjects, 0, bobberGuid); + m_caster.SetChannelObject(0, bobberGuid); m_caster.AddGameObject(go); // will removed at spell cancel // end time of range when possible catch fish (FISHING_BOBBER_READY_TIME..GetDuration(m_spellInfo)) @@ -4759,8 +4760,8 @@ namespace Game.Spells continue; // The charges / stack amounts don't count towards the total number of auras that can be dispelled. - // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell - // Polymorph instead of 1 / (5 + 1) -> 16%. + // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) . 50% chance to dispell + // Polymorph instead of 1 / (5 + 1) . 16%. bool dispelCharges = aura.GetSpellInfo().HasAttribute(SpellAttr7.DispelCharges); byte charges = dispelCharges ? aura.GetCharges() : aura.GetStackAmount(); if (charges > 0) @@ -5017,7 +5018,7 @@ namespace Game.Spells return; FactionTemplateRecord casterFaction = caster.GetFactionTemplateEntry(); - FactionTemplateRecord targetFaction = CliDB.FactionTemplateStorage.LookupByKey(gameObjTarget.GetUInt32Value(GameObjectFields.Faction)); + FactionTemplateRecord targetFaction = CliDB.FactionTemplateStorage.LookupByKey(gameObjTarget.GetFaction()); // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons) if (targetFaction == null || (casterFaction != null && targetFaction != null && !casterFaction.IsFriendlyTo(targetFaction))) gameObjTarget.ModifyHealth(-damage, caster, GetSpellInfo().Id); @@ -5095,18 +5096,18 @@ namespace Game.Spells ((Guardian)summon).InitStatsForLevel(level); if (properties != null && properties.Control == SummonCategory.Ally) - summon.SetFaction(caster.getFaction()); + summon.SetFaction(caster.GetFaction()); if (summon.HasUnitTypeMask(UnitTypeMask.Minion) && m_targets.HasDst()) ((Minion)summon).SetFollowAngle(m_caster.GetAngle(summon.GetPosition())); if (summon.GetEntry() == 27893) { - uint weapon = m_caster.GetUInt32Value(PlayerFields.VisibleItem + (EquipmentSlot.MainHand * 2)); - if (weapon != 0) + VisibleItem weapon = m_caster.ToPlayer().m_playerData.VisibleItems[EquipmentSlot.MainHand]; + if (weapon.ItemID != 0) { summon.SetDisplayId(11686); - summon.SetVirtualItem(0, weapon); + summon.SetVirtualItem(0, weapon.ItemID, weapon.ItemAppearanceModID, weapon.ItemVisual); } else summon.SetDisplayId(1126); @@ -5128,7 +5129,7 @@ namespace Game.Spells !unitTarget.IsPet() || unitTarget.ToPet().getPetType() != PetType.Hunter) return; - unitTarget.SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, UnitPetFlags.CanBeRenamed); + unitTarget.AddPetFlag(UnitPetFlags.CanBeRenamed); } [SpellEffectHandler(SpellEffectName.PlayMusic)] @@ -5557,7 +5558,7 @@ namespace Game.Spells return; Player plr = unitTarget.ToPlayer(); - plr.SetFlag(PlayerFields.Flags, PlayerFlags.PetBattlesUnlocked); + plr.AddPlayerFlag(PlayerFlags.PetBattlesUnlocked); plr.GetSession().GetBattlePetMgr().UnlockSlot(0); } @@ -5658,7 +5659,7 @@ namespace Game.Spells itemTarget.SetState(ItemUpdateState.Changed, player); itemTarget.SetModifier(ItemModifier.EnchantIllusionAllSpecs, (uint)effectInfo.MiscValue); if (itemTarget.IsEquipped()) - player.SetUInt16Value(PlayerFields.VisibleItem + 1 + (itemTarget.GetSlot() * 2), 1, itemTarget.GetVisibleItemVisual(player)); + player.SetVisibleItemSlot(itemTarget.GetSlot(), itemTarget); player.RemoveTradeableItem(itemTarget); itemTarget.ClearSoulboundTradeable(player); diff --git a/Source/Game/Spells/SpellHistory.cs b/Source/Game/Spells/SpellHistory.cs index 813b8b080..a68bb8edc 100644 --- a/Source/Game/Spells/SpellHistory.cs +++ b/Source/Game/Spells/SpellHistory.cs @@ -351,7 +351,7 @@ namespace Game.Spells // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK) // prevent 0 cooldowns set by another way if (cooldown <= 0 && categoryCooldown <= 0 && (categoryId == 76 || (spellInfo.IsAutoRepeatRangedSpell() && spellInfo.Id != 75))) - cooldown = (int)_owner.GetUInt32Value(UnitFields.RangedAttackTime); + cooldown = (int)(uint)_owner.m_unitData.RangedAttackRoundBaseTime; // Now we have cooldown data (if found any), time to apply mods Player modOwner = _owner.GetSpellModOwner(); @@ -366,14 +366,14 @@ namespace Game.Spells if (_owner.HasAuraTypeWithAffectMask(AuraType.ModSpellCooldownByHaste, spellInfo)) { - cooldown = (int)(cooldown * _owner.GetFloatValue(UnitFields.ModCastHaste)); - categoryCooldown = (int)(categoryCooldown * _owner.GetFloatValue(UnitFields.ModCastHaste)); + cooldown = (int)(cooldown * _owner.m_unitData.ModSpellHaste); + categoryCooldown = (int)(categoryCooldown * _owner.m_unitData.ModSpellHaste); } if (_owner.HasAuraTypeWithAffectMask(AuraType.ModCooldownByHasteRegen, spellInfo)) { - cooldown = (int)(cooldown * _owner.GetFloatValue(UnitFields.ModHasteRegen)); - categoryCooldown = (int)(categoryCooldown * _owner.GetFloatValue(UnitFields.ModHasteRegen)); + cooldown = (int)(cooldown * _owner.m_unitData.ModHasteRegen); + categoryCooldown = (int)(categoryCooldown * _owner.m_unitData.ModHasteRegen); } int cooldownMod = _owner.GetTotalAuraModifier(AuraType.ModCooldown); @@ -804,10 +804,10 @@ namespace Game.Spells recoveryTimeF *= _owner.GetTotalAuraMultiplierByMiscValue(AuraType.ChargeRecoveryMultiplier, (int)chargeCategoryId); if (_owner.HasAuraType(AuraType.ChargeRecoveryAffectedByHaste)) - recoveryTimeF *= _owner.GetFloatValue(UnitFields.ModCastHaste); + recoveryTimeF *= _owner.m_unitData.ModSpellHaste; if (_owner.HasAuraType(AuraType.ChargeRecoveryAffectedByHasteRegen)) - recoveryTimeF *= _owner.GetFloatValue(UnitFields.ModHasteRegen); + recoveryTimeF *= _owner.m_unitData.ModHasteRegen; return (int)Math.Floor(recoveryTimeF); } diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index 3e30e6c6d..ab1e18e95 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -83,6 +83,7 @@ namespace Game.Spells IconFileDataId = _misc.SpellIconFileDataID; ActiveIconFileDataId = _misc.ActiveIconFileDataID; + ContentTuningId = _misc.ContentTuningID; } if (visuals != null) @@ -1307,8 +1308,9 @@ namespace Game.Spells } // if target is magnet (i.e Grounding Totem) the check is skipped - //if (target.IsMagnet()) - //return true; + if (target.IsMagnet()) + return true; + uint creatureType = target.GetCreatureTypeMask(); return TargetCreatureType == 0 || creatureType == 0 || Convert.ToBoolean(creatureType & TargetCreatureType); @@ -2900,10 +2902,10 @@ namespace Game.Spells float CalcPPMHasteMod(SpellProcsPerMinuteModRecord mod, Unit caster) { - float haste = caster.GetFloatValue(UnitFields.ModHaste); - float rangedHaste = caster.GetFloatValue(UnitFields.ModRangedHaste); - float spellHaste = caster.GetFloatValue(UnitFields.ModCastHaste); - float regenHaste = caster.GetFloatValue(UnitFields.ModHasteRegen); + float haste = caster.m_unitData.ModHaste; + float rangedHaste = caster.m_unitData.ModRangedHaste; + float spellHaste = caster.m_unitData.ModSpellHaste; + float regenHaste = caster.m_unitData.ModHasteRegen; switch (mod.Param) { @@ -2926,12 +2928,13 @@ namespace Game.Spells float CalcPPMCritMod(SpellProcsPerMinuteModRecord mod, Unit caster) { - if (!caster.IsTypeId(TypeId.Player)) + Player player = caster.ToPlayer(); + if (player == null) return 0.0f; - float crit = caster.GetFloatValue(ActivePlayerFields.CritPercentage); - float rangedCrit = caster.GetFloatValue(ActivePlayerFields.RangedCritPercentage); - float spellCrit = caster.GetFloatValue(ActivePlayerFields.SpellCritPercentage1); + float crit = player.m_activePlayerData.CritPercentage; + float rangedCrit = player.m_activePlayerData.RangedCritPercentage; + float spellCrit = player.m_activePlayerData.SpellCritPercentage; switch (mod.Param) { @@ -2955,8 +2958,8 @@ namespace Game.Spells if (itemLevel == mod.Param) return 0.0f; - float itemLevelPoints = ItemEnchantment.GetRandomPropertyPoints((uint)itemLevel, ItemQuality.Rare, InventoryType.Chest, 0); - float basePoints = ItemEnchantment.GetRandomPropertyPoints(mod.Param, ItemQuality.Rare, InventoryType.Chest, 0); + float itemLevelPoints = ItemEnchantmentManager.GetRandomPropertyPoints((uint)itemLevel, ItemQuality.Rare, InventoryType.Chest, 0); + float basePoints = ItemEnchantmentManager.GetRandomPropertyPoints(mod.Param, ItemQuality.Rare, InventoryType.Chest, 0); if (itemLevelPoints == basePoints) return 0.0f; @@ -2993,7 +2996,7 @@ namespace Game.Spells { Player plrCaster = caster.ToPlayer(); if (plrCaster) - if (plrCaster.GetUInt32Value(PlayerFields.CurrentSpecId) == mod.Param) + if (plrCaster.GetPrimarySpecialization() == mod.Param) ppm *= 1.0f + mod.Coeff; break; } @@ -3705,6 +3708,7 @@ namespace Game.Spells public uint[] TotemCategory = new uint[SpellConst.MaxTotems]; public uint IconFileDataId { get; set; } public uint ActiveIconFileDataId { get; set; } + public uint ContentTuningId { get; set; } public LocalizedString SpellName { get; set; } public float ConeAngle { get; set; } public float Width { get; set; } @@ -3931,16 +3935,16 @@ namespace Game.Spells if (_spellInfo.Scaling.ScalesFromItemLevel != 0) effectiveItemLevel = _spellInfo.Scaling.ScalesFromItemLevel; - if (_spellInfo.Scaling._Class == -8) + if (_spellInfo.Scaling._Class == -8 || _spellInfo.Scaling._Class == -9) { RandPropPointsRecord randPropPoints = CliDB.RandPropPointsStorage.LookupByKey(effectiveItemLevel); if (randPropPoints == null) randPropPoints = CliDB.RandPropPointsStorage.LookupByKey(CliDB.RandPropPointsStorage.Count - 1); - tempValue = randPropPoints.DamageReplaceStat; + tempValue = _spellInfo.Scaling._Class == -8 ? randPropPoints.DamageReplaceStat : randPropPoints.DamageSecondary; } else - tempValue = ItemEnchantment.GetRandomPropertyPoints(effectiveItemLevel, ItemQuality.Rare, InventoryType.Chest, 0); + tempValue = ItemEnchantmentManager.GetRandomPropertyPoints(effectiveItemLevel, ItemQuality.Rare, InventoryType.Chest, 0); } else tempValue = CliDB.GetSpellScalingColumnForClass(CliDB.SpellScalingGameTable.GetRow(level), _spellInfo.Scaling._Class); @@ -3970,8 +3974,14 @@ namespace Game.Spells stat = ExpectedStatType.CreatureAutoAttackDps; // TODO - add expansion and content tuning id args? + uint contentTuningId = _spellInfo.ContentTuningId; // content tuning should be passed as arg, the one stored in SpellInfo is fallback + int expansion = -2; + ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(contentTuningId); + if (contentTuning != null) + expansion = contentTuning.ExpansionID; + uint level = caster ? caster.getLevel() : 1; - tempValue = Global.DB2Mgr.EvaluateExpectedStat(stat, level, -2, 0, Class.None) * BasePoints / 100.0f; + tempValue = Global.DB2Mgr.EvaluateExpectedStat(stat, level, expansion, 0, Class.None) * BasePoints / 100.0f; } return (int)Math.Round(tempValue); @@ -4439,6 +4449,16 @@ namespace Game.Spells new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Item), // 259 SPELL_EFFECT_RESPEC_AZERITE_EMPOWERED_ITEM new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 260 SPELL_EFFECT_SUMMON_STABLED_PET new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Item), // 261 SPELL_EFFECT_SCRAP_ITEM + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 262 SPELL_EFFECT_262 + new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Item), // 263 SPELL_EFFECT_REPAIR_ITEM + new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Item), // 264 SPELL_EFFECT_REMOVE_GEM + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 265 SPELL_EFFECT_LEARN_AZERITE_ESSENCE_POWER + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 266 SPELL_EFFECT_266 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 267 SPELL_EFFECT_267 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 268 SPELL_EFFECT_APPLY_MOUNT_EQUIPMENT + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 269 SPELL_EFFECT_UPGRADE_ITEM + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 270 SPELL_EFFECT_270 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 271 SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM }; #region Fields diff --git a/Source/Game/Warden/WardenWin.cs b/Source/Game/Warden/WardenWin.cs index 79fa8fc55..4336e3a65 100644 --- a/Source/Game/Warden/WardenWin.cs +++ b/Source/Game/Warden/WardenWin.cs @@ -185,7 +185,7 @@ namespace Game } ByteBuffer buffer = new ByteBuffer(); - buffer.WriteUInt8(WardenOpcodes.Smsg_CheatChecksRequest); + buffer.WriteUInt8((byte)WardenOpcodes.Smsg_CheatChecksRequest); for (uint i = 0; i < WorldConfig.GetUIntValue(WorldCfg.WardenNumOtherChecks); ++i) { @@ -207,7 +207,7 @@ namespace Game case WardenCheckType.MPQ: case WardenCheckType.LuaStr: case WardenCheckType.Driver: - buffer.WriteUInt8(wd.Str.GetByteCount()); + buffer.WriteUInt8((byte)wd.Str.GetByteCount()); buffer.WriteString(wd.Str); break; default: @@ -219,7 +219,7 @@ namespace Game // Add TIMING_CHECK buffer.WriteUInt8(0x00); - buffer.WriteUInt8((int)WardenCheckType.Timing ^ xorByte); + buffer.WriteUInt8((byte)((int)WardenCheckType.Timing ^ xorByte)); byte index = 1; @@ -228,7 +228,7 @@ namespace Game wd = Global.WardenCheckMgr.GetWardenDataById(checkId); type = wd.Type; - buffer.WriteUInt8((int)type ^ xorByte); + buffer.WriteUInt8((byte)((int)type ^ xorByte)); switch (type) { case WardenCheckType.Memory: diff --git a/Source/WorldServer/Server.cs b/Source/WorldServer/Server.cs index a3dfd6e9f..87a719f33 100644 --- a/Source/WorldServer/Server.cs +++ b/Source/WorldServer/Server.cs @@ -180,8 +180,8 @@ namespace WorldServer uint executionTimeDiff = Time.GetMSTimeDiffToNow(realCurrTime); // we know exactly how long it took to update the world, if the update took less than WORLD_SLEEP_CONST, sleep for WORLD_SLEEP_CONST - world update time - if (executionTimeDiff < WorldSleep) - Thread.Sleep((int)(WorldSleep - executionTimeDiff)); + if (executionTimeDiff < WorldSleep) + Thread.Sleep((int)(WorldSleep - executionTimeDiff)); } } diff --git a/Source/WorldServer/WorldServer.csproj b/Source/WorldServer/WorldServer.csproj index 3615bb5ec..ddf445154 100644 --- a/Source/WorldServer/WorldServer.csproj +++ b/Source/WorldServer/WorldServer.csproj @@ -2,14 +2,13 @@ Exe - netcoreapp2.1 + netcoreapp2.2 Blue.ico WorldServer.Server -