diff options
Diffstat (limited to 'src')
20 files changed, 1127 insertions, 694 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index f76e6e1cabb..81cba0090b0 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -1755,7 +1755,10 @@ enum class PlayerInteractionType : int32 BarbersChoice = 62, JailersTowerBuffs = 63, MajorFactionRenown = 64, - PersonalTabardVendor = 65 + PersonalTabardVendor = 65, + ForgeMaster = 66, + CharacterBanker = 67, + AccountBanker = 68 }; enum class PowerTypeFlags : int16 diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index cb32cfc0ee9..d75ed789006 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1370,7 +1370,7 @@ void Creature::SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDiffic CreatureData& data = sObjectMgr->NewOrExistCreatureData(m_spawnId); uint32 displayId = GetNativeDisplayId(); - uint64 spawnNpcFlags = (uint64(m_unitData->NpcFlags[1]) << 32) | m_unitData->NpcFlags[0]; + uint64 spawnNpcFlags = (uint64(GetNpcFlags2()) << 32) | GetNpcFlags(); Optional<uint64> npcflag; Optional<uint32> unitFlags; Optional<uint32> unitFlags2; diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index 72aa91aae39..e97c1cca3d9 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -88,6 +88,9 @@ enum class GossipOptionNpc : uint8 BarbersChoice = 52, MajorFactionRenown = 53, PersonalTabardVendor = 54, + ForgeMaster = 55, + CharacterBanker = 56, + AccountBanker = 57, Count }; @@ -108,8 +111,9 @@ enum class GossipOptionRewardType : uint8 enum class GossipOptionFlags : int32 { - None = 0x0, - QuestLabelPrepend = 0x1 + None = 0x0, + QuestLabelPrepend = 0x1, + HideOptionIDFromClient = 0x2 }; struct GossipMenuItem diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index ebf67292ced..a69813ea53e 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -65,7 +65,7 @@ struct GameObjectTemplate uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false uint32 InfiniteAOI; // 10 Infinite AOI, enum { false, true, }; Default: false uint32 NotLOSBlocking; // 11 Not LOS Blocking, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 12 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 12 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Collisionupdatedelayafteropen; // 13 Collision update delay(ms) after open, int, Min value: 0, Max value: 2147483647, Default value: 0 } door; // 1 GAMEOBJECT_TYPE_BUTTON @@ -81,7 +81,7 @@ struct GameObjectTemplate uint32 closeTextID; // 7 closeTextID, References: BroadcastText, NoValue = 0 uint32 requireLOS; // 8 require LOS, enum { false, true, }; Default: false uint32 conditionID1; // 9 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 10 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 10 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } button; // 2 GAMEOBJECT_TYPE_QUESTGIVER struct @@ -98,7 +98,7 @@ struct GameObjectTemplate uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false uint32 conditionID1; // 10 conditionID1, References: PlayerCondition, NoValue = 0 uint32 NeverUsableWhileMounted; // 11 Never Usable While Mounted, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 12 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 12 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } questgiver; // 3 GAMEOBJECT_TYPE_CHEST struct @@ -112,7 +112,7 @@ struct GameObjectTemplate uint32 triggeredEvent; // 6 triggeredEvent, References: GameEvents, NoValue = 0 uint32 linkedTrap; // 7 linkedTrap, References: GameObjects, NoValue = 0 uint32 questID; // 8 questID, References: QuestV2, NoValue = 0 - uint32 InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 requireLOS; // 10 require LOS, enum { false, true, }; Default: false uint32 leaveLoot; // 11 leaveLoot, enum { false, true, }; Default: false uint32 notInCombat; // 12 notInCombat, enum { false, true, }; Default: false @@ -121,9 +121,9 @@ struct GameObjectTemplate uint32 usegrouplootrules; // 15 use group loot rules, enum { false, true, }; Default: false uint32 floatingTooltip; // 16 floatingTooltip, enum { false, true, }; Default: false uint32 conditionID1; // 17 conditionID1, References: PlayerCondition, NoValue = 0 - int32 Unused; // 18 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + int32 xpLevel; // 18 xpLevel, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 uint32 xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp - uint32 Unused2; // 20 Unused, int, Min value: 0, Max value: 123, Default value: 0 + uint32 Unused; // 20 Unused, int, Min value: 0, Max value: 123, Default value: 0 uint32 GroupXP; // 21 Group XP, enum { false, true, }; Default: false uint32 DamageImmuneOK; // 22 Damage Immune OK, enum { false, true, }; Default: false uint32 trivialSkillLow; // 23 trivialSkillLow, int, Min value: 0, Max value: 65535, Default value: 0 @@ -142,7 +142,7 @@ struct GameObjectTemplate // 4 GAMEOBJECT_TYPE_BINDER struct { - uint32 InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } binder; // 5 GAMEOBJECT_TYPE_GENERIC struct @@ -156,7 +156,7 @@ struct GameObjectTemplate uint32 conditionID1; // 6 conditionID1, References: PlayerCondition, NoValue = 0 uint32 LargeAOI; // 7 Large AOI, enum { false, true, }; Default: false uint32 UseGarrisonOwnerGuildColors; // 8 Use Garrison Owner Guild Colors, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } generic; // 6 GAMEOBJECT_TYPE_TRAP struct @@ -182,7 +182,7 @@ struct GameObjectTemplate uint32 requireLOS; // 18 require LOS, enum { false, true, }; Default: false uint32 TriggerCondition; // 19 Trigger Condition, References: PlayerCondition, NoValue = 0 uint32 Checkallunits; // 20 Check all units (spawned traps only check players), enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 21 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 21 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } trap; // 7 GAMEOBJECT_TYPE_CHAIR struct @@ -192,7 +192,7 @@ struct GameObjectTemplate uint32 onlyCreatorUse; // 2 onlyCreatorUse, enum { false, true, }; Default: false uint32 triggeredEvent; // 3 triggeredEvent, References: GameEvents, NoValue = 0 uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } chair; // 8 GAMEOBJECT_TYPE_SPELL_FOCUS struct @@ -206,7 +206,7 @@ struct GameObjectTemplate uint32 floatingTooltip; // 6 floatingTooltip, enum { false, true, }; Default: false uint32 floatOnWater; // 7 floatOnWater, enum { false, true, }; Default: false uint32 conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 gossipID; // 10 gossipID, References: Gossip, NoValue = 0 uint32 spellFocusType2; // 11 spellFocusType 2, References: SpellFocusObject, NoValue = 0 uint32 spellFocusType3; // 12 spellFocusType 3, References: SpellFocusObject, NoValue = 0 @@ -224,7 +224,7 @@ struct GameObjectTemplate uint32 allowMounted; // 3 allowMounted, enum { false, true, }; Default: false uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0 uint32 NeverUsableWhileMounted; // 5 Never Usable While Mounted, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 6 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 6 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } text; // 10 GAMEOBJECT_TYPE_GOOBER struct @@ -262,7 +262,7 @@ struct GameObjectTemplate uint32 SyncAnimationtoObjectLifetime; // 30 Sync Animation to Object Lifetime (global track only), enum { false, true, }; Default: false uint32 NoFuzzyHit; // 31 No Fuzzy Hit, enum { false, true, }; Default: false uint32 LargeAOI; // 32 Large AOI, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 33 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 33 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } goober; // 11 GAMEOBJECT_TYPE_TRANSPORT struct @@ -291,7 +291,7 @@ struct GameObjectTemplate uint32 Reached10thfloor; // 21 Reached 10th floor, References: GameEvents, NoValue = 0 uint32 onlychargeheightcheck; // 22 only charge height check. (yards), int, Min value: 0, Max value: 65535, Default value: 0 uint32 onlychargetimecheck; // 23 only charge time check, int, Min value: 0, Max value: 65535, Default value: 0 - uint32 InteractRadiusOverride; // 24 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 24 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } transport; // 12 GAMEOBJECT_TYPE_AREADAMAGE struct @@ -304,7 +304,7 @@ struct GameObjectTemplate uint32 autoClose; // 5 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 openTextID; // 6 openTextID, References: BroadcastText, NoValue = 0 uint32 closeTextID; // 7 closeTextID, References: BroadcastText, NoValue = 0 - uint32 InteractRadiusOverride; // 8 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 8 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } areaDamage; // 13 GAMEOBJECT_TYPE_CAMERA struct @@ -314,7 +314,7 @@ struct GameObjectTemplate uint32 eventID; // 2 eventID, References: GameEvents, NoValue = 0 uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0 uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } camera; // 14 GAMEOBJECT_TYPE_MAP_OBJECT struct @@ -334,19 +334,19 @@ struct GameObjectTemplate uint32 allowstopping; // 8 allow stopping, enum { false, true, }; Default: false uint32 InitStopped; // 9 Init Stopped, enum { false, true, }; Default: false uint32 TrueInfiniteAOI; // 10 True Infinite AOI (programmer only!), enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 11 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 11 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Allowareaexplorationwhileonthistransport;// 12 Allow area exploration while on this transport, enum { false, true, }; Default: false } moTransport; // 16 GAMEOBJECT_TYPE_DUEL_ARBITER struct { - uint32 InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Willthisduelgountilaplayerdies; // 1 Will this duel go until a player dies?, enum { false, true, }; Default: false } duelFlag; // 17 GAMEOBJECT_TYPE_FISHINGNODE struct { - uint32 InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } fishingNode; // 18 GAMEOBJECT_TYPE_RITUAL struct @@ -360,14 +360,14 @@ struct GameObjectTemplate uint32 castersGrouped; // 6 castersGrouped, enum { false, true, }; Default: true uint32 ritualNoTargetCheck; // 7 ritualNoTargetCheck, enum { false, true, }; Default: true uint32 conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Allowunfriendlycrossfactionpartymemberstocollaborateonaritual;// 10 Allow unfriendly cross faction party members to collaborate on a ritual, enum { false, true, }; Default: false } ritual; // 19 GAMEOBJECT_TYPE_MAILBOX struct { uint32 conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } mailbox; // 20 GAMEOBJECT_TYPE_DO_NOT_USE struct @@ -379,7 +379,7 @@ struct GameObjectTemplate uint32 creatureID; // 0 creatureID, References: Creature, NoValue = 0 uint32 charges; // 1 charges, int, Min value: 0, Max value: 65535, Default value: 1 uint32 Preferonlyifinlineofsight; // 2 Prefer only if in line of sight (expensive), enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } guardPost; // 22 GAMEOBJECT_TYPE_SPELLCASTER struct @@ -392,7 +392,7 @@ struct GameObjectTemplate uint32 conditionID1; // 5 conditionID1, References: PlayerCondition, NoValue = 0 uint32 playerCast; // 6 playerCast, enum { false, true, }; Default: false uint32 NeverUsableWhileMounted; // 7 Never Usable While Mounted, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 8 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 8 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } spellCaster; // 23 GAMEOBJECT_TYPE_MEETINGSTONE struct @@ -400,7 +400,7 @@ struct GameObjectTemplate uint32 Unused; // 0 Unused, int, Min value: 0, Max value: 65535, Default value: 1 uint32 Unused2; // 1 Unused, int, Min value: 1, Max value: 65535, Default value: 60 uint32 areaID; // 2 areaID, References: AreaTable, NoValue = 0 - uint32 InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Preventmeetingstonefromtargetinganunfriendlypartymemberoutsideofinstances;// 4 Prevent meeting stone from targeting an unfriendly party member outside of instances, enum { false, true, }; Default: false } meetingStone; // 24 GAMEOBJECT_TYPE_FLAGSTAND @@ -419,7 +419,7 @@ struct GameObjectTemplate uint32 GiganticAOI; // 10 Gigantic AOI, enum { false, true, }; Default: false uint32 InfiniteAOI; // 11 Infinite AOI, enum { false, true, }; Default: false uint32 cooldown; // 12 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000 - uint32 InteractRadiusOverride; // 13 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 13 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } flagStand; // 25 GAMEOBJECT_TYPE_FISHINGHOLE struct @@ -429,7 +429,7 @@ struct GameObjectTemplate uint32 minRestock; // 2 minRestock, int, Min value: 0, Max value: 65535, Default value: 0 uint32 maxRestock; // 3 maxRestock, int, Min value: 0, Max value: 65535, Default value: 0 uint32 open; // 4 open, References: Lock_, NoValue = 0 - uint32 InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } fishingHole; // 26 GAMEOBJECT_TYPE_FLAGDROP struct @@ -444,7 +444,7 @@ struct GameObjectTemplate uint32 GiganticAOI; // 7 Gigantic AOI, enum { false, true, }; Default: false uint32 InfiniteAOI; // 8 Infinite AOI, enum { false, true, }; Default: false uint32 cooldown; // 9 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000 - uint32 InteractRadiusOverride; // 10 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 10 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } flagDrop; // 27 GAMEOBJECT_TYPE_MINI_GAME struct @@ -485,7 +485,7 @@ struct GameObjectTemplate uint32 UncontestedTime; // 25 Uncontested Time, int, Min value: 0, Max value: 65535, Default value: 0 uint32 FrequentHeartbeat; // 26 Frequent Heartbeat, enum { false, true, }; Default: false uint32 EnablingWorldStateExpression; // 27 Enabling World State Expression, References: WorldStateExpression, NoValue = 0 - uint32 InteractRadiusOverride; // 28 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 28 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } controlZone; // 30 GAMEOBJECT_TYPE_AURA_GENERATOR struct @@ -497,7 +497,7 @@ struct GameObjectTemplate uint32 auraID2; // 4 auraID2, References: Spell, NoValue = 0 uint32 conditionID2; // 5 conditionID2, References: PlayerCondition, NoValue = 0 uint32 serverOnly; // 6 serverOnly, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 7 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 7 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } auraGenerator; // 31 GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY struct @@ -513,7 +513,7 @@ struct GameObjectTemplate uint32 LargeAOI; // 8 Large AOI, enum { false, true, }; Default: false uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false uint32 Legacy; // 10 Legacy, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 11 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 11 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } dungeonDifficulty; // 32 GAMEOBJECT_TYPE_BARBER_CHAIR struct @@ -521,7 +521,7 @@ struct GameObjectTemplate uint32 chairheight; // 0 chairheight, int, Min value: 0, Max value: 2, Default value: 1 int32 HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0 uint32 SitAnimKit; // 2 Sit Anim Kit, References: AnimKit, NoValue = 0 - uint32 InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 CustomizationScope; // 4 Customization Scope, int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Preventteleportingtheplayeroutofthebarbershopchair;// 5 Prevent teleporting the player out of the barbershop chair, enum { false, true, }; Default: false } barberChair; @@ -555,13 +555,13 @@ struct GameObjectTemplate int32 Thexoffsetofthedestructiblenameplateifitisenabled;// 24 The x offset (in hundredths) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 int32 Theyoffsetofthedestructiblenameplateifitisenabled;// 25 The y offset (in hundredths) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 int32 Thezoffsetofthedestructiblenameplateifitisenabled;// 26 The z offset (in hundredths) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 - uint32 InteractRadiusOverride; // 27 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 27 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } destructibleBuilding; // 34 GAMEOBJECT_TYPE_GUILD_BANK struct { uint32 conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } guildbank; // 35 GAMEOBJECT_TYPE_TRAPDOOR struct @@ -574,7 +574,7 @@ struct GameObjectTemplate uint32 GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false uint32 InfiniteAOI; // 6 Infinite AOI, enum { false, true, }; Default: false uint32 DoorisOpaque; // 7 Door is Opaque (Disable portal on close), enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 8 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 8 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } trapdoor; // 36 GAMEOBJECT_TYPE_NEW_FLAG struct @@ -593,27 +593,27 @@ struct GameObjectTemplate uint32 worldState1; // 11 worldState1, References: WorldState, NoValue = 0 uint32 ReturnonDefenderInteract; // 12 Return on Defender Interact, enum { false, true, }; Default: false uint32 SpawnVignette; // 13 Spawn Vignette, References: vignette, NoValue = 0 - uint32 InteractRadiusOverride; // 14 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 14 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } newflag; // 37 GAMEOBJECT_TYPE_NEW_FLAG_DROP struct { uint32 open; // 0 open, References: Lock_, NoValue = 0 uint32 SpawnVignette; // 1 Spawn Vignette, References: vignette, NoValue = 0 - uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } newflagdrop; // 38 GAMEOBJECT_TYPE_GARRISON_BUILDING struct { int32 SpawnMap; // 0 Spawn Map, References: Map, NoValue = -1 - uint32 InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } garrisonBuilding; // 39 GAMEOBJECT_TYPE_GARRISON_PLOT struct { uint32 PlotInstance; // 0 Plot Instance, References: GarrPlotInstance, NoValue = 0 int32 SpawnMap; // 1 Spawn Map, References: Map, NoValue = -1 - uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } garrisonPlot; // 40 GAMEOBJECT_TYPE_CLIENT_CREATURE struct @@ -653,7 +653,7 @@ struct GameObjectTemplate uint32 SpellVisual4; // 20 Spell Visual 4, References: SpellVisual, NoValue = 0 uint32 SpellVisual5; // 21 Spell Visual 5, References: SpellVisual, NoValue = 0 uint32 SpawnVignette; // 22 Spawn Vignette, References: vignette, NoValue = 0 - uint32 InteractRadiusOverride; // 23 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 23 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } capturePoint; // 43 GAMEOBJECT_TYPE_PHASEABLE_MO struct @@ -662,14 +662,14 @@ struct GameObjectTemplate int32 AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0 uint32 DoodadSetA; // 2 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 DoodadSetB; // 3 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0 - uint32 InteractRadiusOverride; // 4 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 4 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } phaseableMO; // 44 GAMEOBJECT_TYPE_GARRISON_MONUMENT struct { uint32 TrophyTypeID; // 0 Trophy Type ID, References: TrophyType, NoValue = 0 uint32 TrophyInstanceID; // 1 Trophy Instance ID, References: TrophyInstance, NoValue = 0 - uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } garrisonMonument; // 45 GAMEOBJECT_TYPE_GARRISON_SHIPMENT struct @@ -677,13 +677,13 @@ struct GameObjectTemplate uint32 ShipmentContainer; // 0 Shipment Container, References: CharShipmentContainer, NoValue = 0 uint32 GiganticAOI; // 1 Gigantic AOI, enum { false, true, }; Default: false uint32 LargeAOI; // 2 Large AOI, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } garrisonShipment; // 46 GAMEOBJECT_TYPE_GARRISON_MONUMENT_PLAQUE struct { uint32 TrophyInstanceID; // 0 Trophy Instance ID, References: TrophyInstance, NoValue = 0 - uint32 InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } garrisonMonumentPlaque; // 47 GAMEOBJECT_TYPE_ITEM_FORGE struct @@ -694,7 +694,7 @@ struct GameObjectTemplate uint32 CameraMode; // 3 Camera Mode, References: CameraMode, NoValue = 0 uint32 FadeRegionRadius; // 4 Fade Region Radius, int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 ForgeType; // 5 Forge Type, enum { Artifact Forge, Relic Forge, Heart Forge, Soulbind Forge, Anima Reservoir, }; Default: Relic Forge - uint32 InteractRadiusOverride; // 6 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 6 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 GarrTalentTreeID; // 7 GarrTalentTree ID, References: GarrTalentTree, NoValue = 0 } itemForge; // 48 GAMEOBJECT_TYPE_UI_LINK @@ -705,13 +705,13 @@ struct GameObjectTemplate uint32 GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false uint32 spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0 uint32 radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10 - uint32 InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0 } UILink; // 49 GAMEOBJECT_TYPE_KEYSTONE_RECEPTACLE struct { - uint32 InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } KeystoneReceptacle; // 50 GAMEOBJECT_TYPE_GATHERING_NODE struct @@ -740,7 +740,7 @@ struct GameObjectTemplate uint32 PlayOpenAnimationonOpening; // 21 Play Open Animation on Opening, enum { false, true, }; Default: false uint32 turnpersonallootsecurityoff; // 22 turn personal loot security off, enum { false, true, }; Default: false uint32 ClearObjectVignetteonOpening; // 23 Clear Object Vignette on Opening, enum { false, true, }; Default: false - uint32 InteractRadiusOverride; // 24 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 24 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Overrideminimaptrackingicon; // 25 Override minimap tracking icon, References: UiTextureAtlasMember, NoValue = 0 } gatheringNode; // 51 GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD @@ -750,7 +750,7 @@ struct GameObjectTemplate uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0 uint32 open; // 2 open, References: Lock_, NoValue = 0 uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0 - uint32 InteractRadiusOverride; // 4 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 4 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } challengeModeReward; // 52 GAMEOBJECT_TYPE_MULTI struct @@ -772,7 +772,7 @@ struct GameObjectTemplate uint32 DoodadSetC; // 3 Doodad Set C, int, Min value: 0, Max value: 2147483647, Default value: 0 int32 SpawnMap; // 4 Spawn Map, References: Map, NoValue = -1 int32 AreaNameSet; // 5 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0 - uint32 InteractRadiusOverride; // 6 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 6 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } siegeableMO; // 55 GAMEOBJECT_TYPE_PVP_REWARD struct @@ -781,7 +781,7 @@ struct GameObjectTemplate uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0 uint32 open; // 2 open, References: Lock_, NoValue = 0 uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0 - uint32 InteractRadiusOverride; // 4 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 4 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } pvpReward; // 56 GAMEOBJECT_TYPE_PLAYER_CHOICE_CHEST struct @@ -793,7 +793,7 @@ struct GameObjectTemplate uint32 MawPowerFilter; // 4 Maw Power Filter, References: MawPowerFilter, NoValue = 0 uint32 Script; // 5 Script, References: SpellScript, NoValue = 0 uint32 SpellVisual1; // 6 Spell Visual 1, References: SpellVisual, NoValue = 0 - uint32 InteractRadiusOverride; // 7 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 7 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Dontupdateplayerinteractability; // 8 Don't update player interactability, enum { false, true, }; Default: false } playerChoiceChest; // 57 GAMEOBJECT_TYPE_LEGENDARY_FORGE @@ -801,21 +801,21 @@ struct GameObjectTemplate { uint32 PlayerChoice; // 0 Player Choice, References: PlayerChoice, NoValue = 0 uint32 CustomItemBonusFilter; // 1 Custom Item Bonus Filter, References: CustomItemBonusFilter, NoValue = 0 - uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } legendaryForge; // 58 GAMEOBJECT_TYPE_GARR_TALENT_TREE struct { uint32 UiMapID; // 0 Ui Map ID, References: UiMap, NoValue = 0 uint32 GarrTalentTreeID; // 1 GarrTalentTree ID, References: GarrTalentTree, NoValue = 0 - uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 } garrTalentTree; // 59 GAMEOBJECT_TYPE_WEEKLY_REWARD_CHEST struct { uint32 WhenAvailable; // 0 When Available, References: GameObjectDisplayInfo, NoValue = 0 uint32 open; // 1 open, References: Lock_, NoValue = 0 - uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 ExpansionLevel; // 3 Expansion Level, int, Min value: 0, Max value: 2147483647, Default value: 0 } weeklyRewardChest; // 60 GAMEOBJECT_TYPE_CLIENT_MODEL diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 406c43a0014..f5ffc7ae230 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1182,8 +1182,7 @@ void Item::ClearEnchantment(EnchantmentSlot slot) SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::ID), 0); SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Duration), 0); SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Charges), 0); - SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Field_A), 0); - SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Field_B), 0); + SetUpdateFieldValue(enchantmentField.ModifyValue(&UF::ItemEnchantment::Inactive), 0); SetState(ITEM_CHANGED, GetOwner()); } diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h index 0632c1e113d..85a7a558e2a 100644 --- a/src/server/game/Entities/Item/ItemDefines.h +++ b/src/server/game/Entities/Item/ItemDefines.h @@ -142,6 +142,7 @@ enum InventoryResult : uint8 EQUIP_ERR_SLOT_ONLY_REAGENTBAG = 116,// Only Reagent Bags can be placed in the reagent bag slot. EQUIP_ERR_REAGENTBAG_ITEM_TYPE = 117,// Only Reagents can be placed in Reagent Bags. EQUIP_ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 118,// Items that can be refunded can't be bulk sold. + EQUIP_ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK = 119,// Soulbound items cannot be stored in the Warband Bank. }; // EnumUtils: DESCRIBE THIS @@ -287,4 +288,11 @@ enum class AzeriteEssenceActivateResult : uint32 NotEquipped = 12 }; +enum class BankType : int8 +{ + Character = 0, + Guild = 1, + Account = 2 +}; + #endif // ItemDefines_h__ diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index f9c6d8d135e..efa7b67cfc0 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -697,7 +697,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe // *data << int32(Players[i].Pets[j].Power); // *data << int32(Players[i].Pets[j].Speed); // *data << int32(Players[i].Pets[j].NpcTeamMemberID); - // *data << uint16(Players[i].Pets[j].BreedQuality); + // *data << uint8(Players[i].Pets[j].BreedQuality); // *data << uint16(Players[i].Pets[j].StatusFlags); // *data << int8(Players[i].Pets[j].Slot); diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index ebf07df9c28..ecdb1c94c55 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -53,7 +53,7 @@ namespace UF template<typename T, std::size_t Size> class UpdateFieldArrayBase; - template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> class UpdateFieldArray; template<typename T> @@ -268,7 +268,7 @@ namespace UF return { (_value.*field)._value }; } - template<typename V, std::size_t Size, uint32 Bit, uint32 FirstElementBit, typename U = T> + template<typename V, std::size_t Size, uint32 Bit, int32 FirstElementBit, typename U = T> std::enable_if_t<std::is_base_of_v<HasChangesMaskTag, U>, std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>, MutableFieldReference<V, PublicSet>, @@ -278,10 +278,13 @@ namespace UF ModifyValue(UpdateFieldArray<V, Size, Bit, FirstElementBit>(T::* field), uint32 index) { _value._changesMask.Set(Bit); - if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, V>) - _value._changesMask.Set(FirstElementBit + index); - else - _value._changesMask.Set(FirstElementBit); + if constexpr (FirstElementBit >= 0) + { + if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, V>) + _value._changesMask.Set(FirstElementBit + index); + else + _value._changesMask.Set(FirstElementBit); + } return { (_value.*field)._values[index] }; } @@ -469,7 +472,7 @@ namespace UF template<typename T, int32 BlockBit, uint32 Bit> friend class UpdateField; - template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> friend class UpdateFieldArray; template<typename T, int32 BlockBit, uint32 Bit> @@ -486,7 +489,7 @@ namespace UF return { (static_cast<Derived*>(this)->*field)._value }; } - template<typename Derived, typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename Derived, typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> MutableFieldReference<T, false> ModifyValue(UpdateFieldArray<T, Size, Bit, FirstElementBit>(Derived::* field), uint32 index) { MarkChanged(field, index); @@ -534,16 +537,19 @@ namespace UF _changesMask.Set(Bit); } - template<typename Derived, typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename Derived, typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> void MarkChanged(UpdateFieldArray<T, Size, Bit, FirstElementBit>(Derived::*), uint32 index) { static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); _changesMask.Set(Bit); - if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>) - _changesMask.Set(FirstElementBit + index); - else - _changesMask.Set(FirstElementBit); + if constexpr (FirstElementBit >= 0) + { + if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>) + _changesMask.Set(FirstElementBit + index); + else + _changesMask.Set(FirstElementBit); + } } template<typename Derived, typename T, int32 BlockBit, uint32 Bit> @@ -576,15 +582,18 @@ namespace UF _changesMask.Reset(Bit); } - template<typename Derived, typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename Derived, typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> void ClearChanged(UpdateFieldArray<T, Size, Bit, FirstElementBit>(Derived::*), uint32 index) { static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); - if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>) - _changesMask.Reset(FirstElementBit + index); - else - _changesMask.Reset(FirstElementBit); + if constexpr (FirstElementBit >= 0) + { + if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>) + _changesMask.Reset(FirstElementBit + index); + else + _changesMask.Reset(FirstElementBit); + } } template<typename Derived, typename T, int32 BlockBit, uint32 Bit> @@ -620,16 +629,16 @@ namespace UF field._value.ClearChangesMask(); } - template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>& field) { ClearChangesMask(field, std::disjunction<std::is_base_of<HasChangesMaskTag, T>, std::is_base_of<IsUpdateFieldHolderTag, T>>{}); } - template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>&, std::false_type) { } - template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>& field, std::true_type) { for (uint32 i = 0; i < Size; ++i) @@ -768,7 +777,7 @@ namespace UF return sizeof(typename T::value_type); } - template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit> + template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> class UpdateFieldArray : public UpdateFieldArrayBase<T, Size> { }; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index db98a205b5c..0fc0d453226 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -82,8 +82,7 @@ void ItemEnchantment::WriteCreate(ByteBuffer& data, Item const* owner, Player co data << int32(ID); data << uint32(Duration); data << int16(Charges); - data << uint8(Field_A); - data << uint8(Field_B); + data << uint16(Inactive); } void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const @@ -92,7 +91,7 @@ void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 6); + data.WriteBits(changesMask.GetBlock(0), 5); data.FlushBits(); if (changesMask[0]) @@ -111,11 +110,7 @@ void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item } if (changesMask[4]) { - data << uint8(Field_A); - } - if (changesMask[5]) - { - data << uint8(Field_B); + data << uint16(Inactive); } } } @@ -125,27 +120,26 @@ void ItemEnchantment::ClearChangesMask() Base::ClearChangesMask(ID); Base::ClearChangesMask(Duration); Base::ClearChangesMask(Charges); - Base::ClearChangesMask(Field_A); - Base::ClearChangesMask(Field_B); + Base::ClearChangesMask(Inactive); _changesMask.ResetAll(); } void ItemMod::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const { - data << int32(Value); data << uint8(Type); + data << int32(Value); } void ItemMod::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const { - data << int32(Value); data << uint8(Type); + data << int32(Value); } bool ItemMod::operator==(ItemMod const& right) const { - return Value == right.Value - && Type == right.Type; + return Type == right.Type + && Value == right.Value; } void ItemModList::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const @@ -294,7 +288,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(MaxDurability); } data << uint32(CreatePlayedTime); - data << int32(Context); + data << uint8(Context); data << int64(CreateTime); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { @@ -440,7 +434,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[15]) { - data << int32(Context); + data << uint8(Context); } if (changesMask[16]) { @@ -652,10 +646,8 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int64(Health); data << int64(MaxHealth); data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver)); - for (uint32 i = 0; i < 2; ++i) - { - data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver)); - } + data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue<NpcFlags2Tag>::GetValue(this, owner, receiver)); data << uint32(StateSpellVisualID); data << uint32(StateAnimID); data << uint32(StateAnimKitID); @@ -707,8 +699,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int32(ScalingLevelMax); data << int32(ScalingLevelDelta); data << int32(ScalingFactionGroup); - data << int32(ScalingHealthItemLevelCurveID); - data << int32(ScalingDamageItemLevelCurveID); data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver)); for (uint32 i = 0; i < 3; ++i) { @@ -773,6 +763,11 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int32(Resistances[i]); } } + for (uint32 i = 0; i < 7; ++i) + { + data << int32(ResistanceBuffModsPositive[i]); + data << int32(ResistanceBuffModsNegative[i]); + } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { for (uint32 i = 0; i < 7; ++i) @@ -781,11 +776,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(PowerCostMultiplier[i]); } } - for (uint32 i = 0; i < 7; ++i) - { - data << int32(ResistanceBuffModsPositive[i]); - data << int32(ResistanceBuffModsNegative[i]); - } data << int32(BaseMana); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { @@ -809,8 +799,8 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(Lifesteal); data << float(MinRangedDamage); data << float(MaxRangedDamage); - data << float(MaxHealthModifier); } + data << float(MaxHealthModifier); data << float(HoverHeight); data << int32(MinItemLevelCutoff); data << int32(MinItemLevel); @@ -830,11 +820,14 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << SkinningOwnerGUID; data << int32(FlightCapabilityID); data << float(GlideEventSpeedDivisor); + data << uint32(SilencedSchoolMask); data << uint32(CurrentAreaID); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { data << ComboTarget; } + data << float(Field_2F0); + data << float(Field_2F4); for (uint32 i = 0; i < PassiveSpells.size(); ++i) { PassiveSpells[i].WriteCreate(data, owner, receiver); @@ -851,7 +844,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xFF0FDFFFu, 0xC001EFFFu, 0x001EFFFFu, 0xFFFFFE00u, 0x00003FFFu, 0xFFF00000u, 0x00000007u }); + Mask allowedMaskForTarget({ 0xFFFF7FFFu, 0xFF0FDFFFu, 0xE001EFFFu, 0x001DFFFFu, 0xFFFFFE00u, 0x40003FFFu, 0x000FFFC0u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -859,7 +852,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= std::array<uint32, 8>{ 0x00002000u, 0x00F02000u, 0x3FFE1000u, 0xFFF10000u, 0x000001FFu, 0xFFFFC000u, 0x000FFFFFu, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 8>{ 0x00008000u, 0x00F02000u, 0x1FFE1000u, 0xFFF20000u, 0x000001FFu, 0xFFFFC000u, 0xFFF0003Fu, 0x00000003u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) allowedMaskForTarget |= std::array<uint32, 8>{ 0x00000000u, 0x00000000u, 0x00000000u, 0xFFF00000u, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) @@ -868,7 +861,7 @@ void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFl void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xFF0FDFFFu, 0xC001EFFFu, 0x001EFFFFu, 0xFFFFFE00u, 0x00003FFFu, 0xFFF00000u, 0x00000007u }); + Mask allowedMaskForTarget({ 0xFFFF7FFFu, 0xFF0FDFFFu, 0xE001EFFFu, 0x001DFFFFu, 0xFFFFFE00u, 0x40003FFFu, 0x000FFFC0u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -963,130 +956,130 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[8]) { - data << uint32(StateSpellVisualID); + data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver)); } if (changesMask[9]) { - data << uint32(StateAnimID); + data << uint32(ViewerDependentValue<NpcFlags2Tag>::GetValue(this, owner, receiver)); } if (changesMask[10]) { - data << uint32(StateAnimKitID); + data << uint32(StateSpellVisualID); } if (changesMask[11]) { - data << Charm; + data << uint32(StateAnimID); } if (changesMask[12]) { - data << Summon; + data << uint32(StateAnimKitID); } if (changesMask[13]) { - data << Critter; + data << Charm; } if (changesMask[14]) { - data << CharmedBy; + data << Summon; } if (changesMask[15]) { - data << SummonedBy; + data << Critter; } if (changesMask[16]) { - data << CreatedBy; + data << CharmedBy; } if (changesMask[17]) { - data << DemonCreator; + data << SummonedBy; } if (changesMask[18]) { - data << LookAtControllerTarget; + data << CreatedBy; } if (changesMask[19]) { - data << Target; + data << DemonCreator; } if (changesMask[20]) { - data << BattlePetCompanionGUID; + data << LookAtControllerTarget; } if (changesMask[21]) { - data << uint64(BattlePetDBID); + data << Target; } if (changesMask[22]) { - ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << BattlePetCompanionGUID; } if (changesMask[23]) { - data << uint32(SummonedByHomeRealm); + data << uint64(BattlePetDBID); } if (changesMask[24]) { - data << uint8(Race); + ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[25]) { - data << uint8(ClassId); + data << uint32(SummonedByHomeRealm); } if (changesMask[26]) { - data << uint8(PlayerClassId); + data << uint8(Race); } if (changesMask[27]) { - data << uint8(Sex); + data << uint8(ClassId); } if (changesMask[28]) { - data << uint8(DisplayPower); + data << uint8(PlayerClassId); } if (changesMask[29]) { - data << uint32(OverrideDisplayPowerID); + data << uint8(Sex); } if (changesMask[30]) { - data << int32(Level); + data << uint8(DisplayPower); } if (changesMask[31]) { - data << int32(EffectiveLevel); + data << uint32(OverrideDisplayPowerID); } } if (changesMask[32]) { if (changesMask[33]) { - data << int32(ContentTuningID); + data << int32(Level); } if (changesMask[34]) { - data << int32(ScalingLevelMin); + data << int32(EffectiveLevel); } if (changesMask[35]) { - data << int32(ScalingLevelMax); + data << int32(ContentTuningID); } if (changesMask[36]) { - data << int32(ScalingLevelDelta); + data << int32(ScalingLevelMin); } if (changesMask[37]) { - data << int32(ScalingFactionGroup); + data << int32(ScalingLevelMax); } if (changesMask[38]) { - data << int32(ScalingHealthItemLevelCurveID); + data << int32(ScalingLevelDelta); } if (changesMask[39]) { - data << int32(ScalingDamageItemLevelCurveID); + data << int32(ScalingFactionGroup); } if (changesMask[40]) { @@ -1372,21 +1365,23 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[111]) { - data << uint32(CurrentAreaID); + data << uint32(SilencedSchoolMask); } if (changesMask[112]) { + data << uint32(CurrentAreaID); + } + if (changesMask[113]) + { data << ComboTarget; } - } - if (changesMask[113]) - { - for (uint32 i = 0; i < 2; ++i) + if (changesMask[114]) { - if (changesMask[114 + i]) - { - data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver)); - } + data << float(Field_2F0); + } + if (changesMask[115]) + { + data << float(Field_2F4); } } if (changesMask[116]) @@ -1463,25 +1458,19 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[198 + i]) { - data << int32(PowerCostModifier[i]); + data << int32(ResistanceBuffModsPositive[i]); } if (changesMask[205 + i]) { - data << float(PowerCostMultiplier[i]); + data << int32(ResistanceBuffModsNegative[i]); } - } - } - if (changesMask[212]) - { - for (uint32 i = 0; i < 7; ++i) - { - if (changesMask[213 + i]) + if (changesMask[212 + i]) { - data << int32(ResistanceBuffModsPositive[i]); + data << int32(PowerCostModifier[i]); } - if (changesMask[220 + i]) + if (changesMask[219 + i]) { - data << int32(ResistanceBuffModsNegative[i]); + data << float(PowerCostMultiplier[i]); } } } @@ -1496,6 +1485,8 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(Health); Base::ClearChangesMask(MaxHealth); Base::ClearChangesMask(DisplayID); + Base::ClearChangesMask(NpcFlags); + Base::ClearChangesMask(NpcFlags2); Base::ClearChangesMask(StateSpellVisualID); Base::ClearChangesMask(StateAnimID); Base::ClearChangesMask(StateAnimKitID); @@ -1525,8 +1516,6 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(ScalingLevelMax); Base::ClearChangesMask(ScalingLevelDelta); Base::ClearChangesMask(ScalingFactionGroup); - Base::ClearChangesMask(ScalingHealthItemLevelCurveID); - Base::ClearChangesMask(ScalingDamageItemLevelCurveID); Base::ClearChangesMask(FactionTemplate); Base::ClearChangesMask(Flags); Base::ClearChangesMask(Flags2); @@ -1596,9 +1585,11 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(SkinningOwnerGUID); Base::ClearChangesMask(FlightCapabilityID); Base::ClearChangesMask(GlideEventSpeedDivisor); + Base::ClearChangesMask(SilencedSchoolMask); Base::ClearChangesMask(CurrentAreaID); Base::ClearChangesMask(ComboTarget); - Base::ClearChangesMask(NpcFlags); + Base::ClearChangesMask(Field_2F0); + Base::ClearChangesMask(Field_2F4); Base::ClearChangesMask(PowerRegenFlatModifier); Base::ClearChangesMask(PowerRegenInterruptedFlatModifier); Base::ClearChangesMask(Power); @@ -1610,10 +1601,10 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(StatPosBuff); Base::ClearChangesMask(StatNegBuff); Base::ClearChangesMask(Resistances); - Base::ClearChangesMask(PowerCostModifier); - Base::ClearChangesMask(PowerCostMultiplier); Base::ClearChangesMask(ResistanceBuffModsPositive); Base::ClearChangesMask(ResistanceBuffModsNegative); + Base::ClearChangesMask(PowerCostModifier); + Base::ClearChangesMask(PowerCostMultiplier); _changesMask.ResetAll(); } @@ -1764,6 +1755,41 @@ void ArenaCooldown::ClearChangesMask() _changesMask.ResetAll(); } +void ZonePlayerForcedReaction::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(FactionID); + data << int32(Reaction); +} + +void ZonePlayerForcedReaction::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << int32(FactionID); + } + if (changesMask[2]) + { + data << int32(Reaction); + } + } +} + +void ZonePlayerForcedReaction::ClearChangesMask() +{ + Base::ClearChangesMask(FactionID); + Base::ClearChangesMask(Reaction); + _changesMask.ResetAll(); +} + void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { for (uint32 i = 0; i < 5; ++i) @@ -1834,31 +1860,28 @@ void CustomTabardInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pla if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 6); + data.WriteBits(changesMask.GetBlock(0), 5); data.FlushBits(); if (changesMask[0]) { - if (changesMask[1]) - { - data << int32(EmblemStyle); - } - if (changesMask[2]) - { - data << int32(EmblemColor); - } - if (changesMask[3]) - { - data << int32(BorderStyle); - } - if (changesMask[4]) - { - data << int32(BorderColor); - } - if (changesMask[5]) - { - data << int32(BackgroundColor); - } + data << int32(EmblemStyle); + } + if (changesMask[1]) + { + data << int32(EmblemColor); + } + if (changesMask[2]) + { + data << int32(BorderStyle); + } + if (changesMask[3]) + { + data << int32(BorderColor); + } + if (changesMask[4]) + { + data << int32(BackgroundColor); } } @@ -1922,6 +1945,10 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << int32(HonorLevel); data << int64(LogoutTime); data << uint32(ArenaCooldowns.size()); + for (uint32 i = 0; i < 32; ++i) + { + ForcedReactions[i].WriteCreate(data, owner, receiver); + } data << int32(Field_13C); data << int32(Field_140); data << int32(CurrentBattlePetSpeciesID); @@ -1956,7 +1983,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFFFu, 0x000003FFu, 0xFFFFFFF0u, 0x0007FFFFu }); + Mask allowedMaskForTarget({ 0xFFFFFFFFu, 0x000003FFu, 0xFFFFFFF0u, 0xFFFFFFFFu, 0x000FFFFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1964,20 +1991,20 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= std::array<uint32, 4>{ 0x00000000u, 0xFFFFFC00u, 0x0000000Fu, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 5>{ 0x00000000u, 0xFFFFFC00u, 0x0000000Fu, 0x00000000u, 0x00000000u }; } void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFFFu, 0x000003FFu, 0xFFFFFFF0u, 0x0007FFFFu }); + Mask allowedMaskForTarget({ 0xFFFFFFFFu, 0x000003FFu, 0xFFFFFFF0u, 0xFFFFFFFFu, 0x000FFFFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 4); - for (uint32 i = 0; i < 4; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 5); + for (uint32 i = 0; i < 5; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -2171,7 +2198,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign { if (changesMask[31]) { - data.WriteBits(Name->size(), 32); + data.WriteBits(Name->size(), 6); } } if (changesMask[32]) @@ -2245,10 +2272,20 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } if (changesMask[95]) { - for (uint32 i = 0; i < 19; ++i) + for (uint32 i = 0; i < 32; ++i) { if (changesMask[96 + i]) { + ForcedReactions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[128]) + { + for (uint32 i = 0; i < 19; ++i) + { + if (changesMask[129 + i]) + { data << uint32(Field_3120[i]); } } @@ -2299,6 +2336,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(QuestLog); Base::ClearChangesMask(VisibleItems); Base::ClearChangesMask(AvgItemLevel); + Base::ClearChangesMask(ForcedReactions); Base::ClearChangesMask(Field_3120); _changesMask.ResetAll(); } @@ -2379,6 +2417,93 @@ void SkillInfo::ClearChangesMask() _changesMask.ResetAll(); } +void BitVectors::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + for (uint32 i = 0; i < 11; ++i) + { + data << uint32(Values[i].size()); + for (uint32 j = 0; j < Values[i].size(); ++j) + { + data << uint64(Values[i][j]); + } + } +} + +void BitVectors::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 1); + + if (changesMask[0]) + { + for (uint32 i = 0; i < 11; ++i) + { + if (!ignoreChangesMask) + Values[i].WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Values[i].size(), data); + } + } + if (changesMask[0]) + { + for (uint32 i = 0; i < 11; ++i) + { + for (uint32 j = 0; j < Values[i].size(); ++j) + { + if (Values[i].HasChanged(j) || ignoreChangesMask) + { + data << uint64(Values[i][j]); + } + } + } + } + data.FlushBits(); +} + +void BitVectors::ClearChangesMask() +{ + Base::ClearChangesMask(Values); + _changesMask.ResetAll(); +} + +void PlayerDataElement::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data.WriteBits(Type, 1); + if (Type == 1) + { + data << float(FloatValue); + } + if (Type == 0) + { + data << int64(Int64Value); + } + data.FlushBits(); +} + +void PlayerDataElement::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data.WriteBits(Type, 1); + if (Type == 1) + { + data << float(FloatValue); + } + if (Type == 0) + { + data << int64(Int64Value); + } + data.FlushBits(); +} + +bool PlayerDataElement::operator==(PlayerDataElement const& right) const +{ + return Type == right.Type + && FloatValue == right.FloatValue + && Int64Value == right.Int64Value; +} + void RestInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << uint32(Threshold); @@ -2747,11 +2872,44 @@ bool TraitEntry::operator==(TraitEntry const& right) const && GrantedRanks == right.GrantedRanks; } +void TraitSubTreeCache::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(TraitSubTreeID); + data << uint32(Entries.size()); + for (uint32 i = 0; i < Entries.size(); ++i) + { + Entries[i].WriteCreate(data, owner, receiver); + } + data.WriteBits(Active, 1); + data.FlushBits(); +} + +void TraitSubTreeCache::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(TraitSubTreeID); + data << uint32(Entries.size()); + for (uint32 i = 0; i < Entries.size(); ++i) + { + Entries[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + data.FlushBits(); + data.WriteBits(Active, 1); + data.FlushBits(); +} + +bool TraitSubTreeCache::operator==(TraitSubTreeCache const& right) const +{ + return Entries == right.Entries + && TraitSubTreeID == right.TraitSubTreeID + && Active == right.Active; +} + void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int32(ID); data << int32(Type); data << uint32(Entries.size()); + data << uint32(SubTrees.size()); if (Type == 2) { data << int32(SkillLineID); @@ -2771,6 +2929,10 @@ void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player cons Entries[i].WriteCreate(data, owner, receiver); } data.WriteBits(Name->size(), 9); + for (uint32 i = 0; i < SubTrees.size(); ++i) + { + SubTrees[i].WriteCreate(data, owner, receiver); + } data.WriteString(Name); data.FlushBits(); } @@ -2781,7 +2943,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 12); + data.WriteBits(changesMask.GetBlock(0), 14); if (changesMask[0]) { @@ -2792,6 +2954,13 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c else WriteCompleteDynamicFieldUpdateMask(Entries.size(), data); } + if (changesMask[2]) + { + if (!ignoreChangesMask) + SubTrees.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(SubTrees.size(), data); + } } data.FlushBits(); if (changesMask[0]) @@ -2808,47 +2977,60 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c } if (changesMask[2]) { + for (uint32 i = 0; i < SubTrees.size(); ++i) + { + if (SubTrees.HasChanged(i) || ignoreChangesMask) + { + SubTrees[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + } + } + if (changesMask[3]) + { data << int32(ID); } } if (changesMask[4]) { - if (changesMask[5]) + if (changesMask[6]) { data << int32(Type); } - if (changesMask[6]) + if (changesMask[7]) { if (Type == 2) { data << int32(SkillLineID); } } - if (changesMask[7]) + } + if (changesMask[8]) + { + if (changesMask[9]) { if (Type == 1) { data << int32(ChrSpecializationID); } } - } - if (changesMask[8]) - { - if (changesMask[9]) + if (changesMask[10]) { if (Type == 1) { data << int32(CombatConfigFlags); } } - if (changesMask[10]) + if (changesMask[11]) { if (Type == 1) { data << int32(LocalIdentifier); } } - if (changesMask[11]) + } + if (changesMask[12]) + { + if (changesMask[13]) { if (Type == 3) { @@ -2856,9 +3038,9 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c } } } - if (changesMask[0]) + if (changesMask[4]) { - if (changesMask[3]) + if (changesMask[5]) { data.WriteBits(Name->size(), 9); data.WriteString(Name); @@ -2870,6 +3052,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c void TraitConfig::ClearChangesMask() { Base::ClearChangesMask(Entries); + Base::ClearChangesMask(SubTrees); Base::ClearChangesMask(ID); Base::ClearChangesMask(Name); Base::ClearChangesMask(Type); @@ -3047,9 +3230,70 @@ void StableInfo::ClearChangesMask() _changesMask.ResetAll(); } +void BankTabSettings::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data.WriteBits(Name->size(), 7); + data.WriteBits(Icon->size(), 9); + data.WriteBits(Description->size(), 14); + data << int32(DepositFlags); + data.WriteString(Name); + data.WriteString(Icon); + data.WriteString(Description); + data.FlushBits(); +} + +void BankTabSettings::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + data.WriteBits(Name->size(), 7); + } + if (changesMask[1]) + { + data.WriteBits(Icon->size(), 9); + } + if (changesMask[2]) + { + data.WriteBits(Description->size(), 14); + } + if (changesMask[3]) + { + data << int32(DepositFlags); + } + if (changesMask[0]) + { + data.WriteString(Name); + } + if (changesMask[1]) + { + data.WriteString(Icon); + } + if (changesMask[2]) + { + data.WriteString(Description); + } + data.FlushBits(); +} + +void BankTabSettings::ClearChangesMask() +{ + Base::ClearChangesMask(Name); + Base::ClearChangesMask(Icon); + Base::ClearChangesMask(Description); + Base::ClearChangesMask(DepositFlags); + _changesMask.ResetAll(); +} + void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 141; ++i) + for (uint32 i = 0; i < 146; ++i) { data << InvSlots[i]; } @@ -3057,6 +3301,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << SummonedBattlePetGUID; data << uint32(KnownTitles.size()); data << uint64(Coinage); + data << uint64(AccountBankCoinage); data << int32(XP); data << int32(NextLevelXP); data << int32(TrialXP); @@ -3097,14 +3342,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << float(VersatilityBonus); data << float(PvpPowerDamage); data << float(PvpPowerHealing); - for (uint32 i = 0; i < 8; ++i) - { - data << uint32(DataFlags[i].size()); - for (uint32 j = 0; j < DataFlags[i].size(); ++j) - { - data << uint64(DataFlags[i][j]); - } - } + BitVectors->WriteCreate(data, owner, receiver); + data << uint32(CharacterDataElements.size()); + data << uint32(AccountDataElements.size()); for (uint32 i = 0; i < 2; ++i) { RestInfo[i].WriteCreate(data, owner, receiver); @@ -3187,13 +3427,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << uint32(BankBagSlotFlags[i]); } - for (uint32 i = 0; i < 950; ++i) + for (uint32 i = 0; i < 960; ++i) { data << uint64(QuestCompleted[i]); } data << int32(Honor); data << int32(HonorNextLevel); data << int32(Field_F74); + data << uint8(Field_1261); data << int32(PvpTierMaxFromWins); data << int32(PvpLastWeeksTierMaxFromWins); data << uint8(PvpRankProgress); @@ -3230,6 +3471,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint32(SpellFlatModByLabel.size()); data << uint32(TaskQuests.size()); data << int32(TransportServerTime); + data << int32(Field_15BC); data << uint32(TraitConfigs.size()); data << uint32(ActiveCombatTraitConfigID); for (uint32 i = 0; i < 9; ++i) @@ -3242,6 +3484,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint32(CategoryCooldownMods.size()); data << uint32(WeeklySpellUses.size()); data << uint8(NumStableSlots); + for (uint32 i = 0; i < 13; ++i) + { + data << uint64(Field_4348[i]); + } for (uint32 i = 0; i < KnownTitles.size(); ++i) { data << uint64(KnownTitles[i]); @@ -3310,9 +3556,17 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data.WriteBit(SortBagsRightToLeft); data.WriteBit(InsertItemsLeftToRight); data.WriteBits(PetStable.has_value(), 1); - data.FlushBits(); + data.WriteBits(AccountBankTabSettings.size(), 3); ResearchHistory->WriteCreate(data, owner, receiver); data << FrozenPerksVendorItem; + for (uint32 i = 0; i < CharacterDataElements.size(); ++i) + { + CharacterDataElements[i].WriteCreate(data, owner, receiver); + } + for (uint32 i = 0; i < AccountDataElements.size(); ++i) + { + AccountDataElements[i].WriteCreate(data, owner, receiver); + } for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { CharacterRestrictions[i].WriteCreate(data, owner, receiver); @@ -3325,6 +3579,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { PetStable->WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) + { + AccountBankTabSettings[i].WriteCreate(data, owner, receiver); + } data.FlushBits(); } @@ -3337,8 +3595,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo { for (uint32 i = 0; i < 1; ++i) data << uint32(changesMask.GetBlocksMask(i)); - data.WriteBits(changesMask.GetBlocksMask(1), 11); - for (uint32 i = 0; i < 43; ++i) + data.WriteBits(changesMask.GetBlocksMask(1), 12); + for (uint32 i = 0; i < 44; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -3359,41 +3617,26 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo else WriteCompleteDynamicFieldUpdateMask(KnownTitles.size(), data); } - } - if (changesMask[20]) - { - for (uint32 i = 0; i < 8; ++i) + if (changesMask[4]) { - if (changesMask[21]) - { - if (!ignoreNestedChangesMask) - DataFlags[i].WriteUpdateMask(data); - else - WriteCompleteDynamicFieldUpdateMask(DataFlags[i].size(), data); - } + if (!ignoreNestedChangesMask) + CharacterDataElements.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(CharacterDataElements.size(), data); } - } - if (changesMask[20]) - { - for (uint32 i = 0; i < 8; ++i) + if (changesMask[5]) { - if (changesMask[21]) - { - for (uint32 j = 0; j < DataFlags[i].size(); ++j) - { - if (DataFlags[i].HasChanged(j) || ignoreNestedChangesMask) - { - data << uint64(DataFlags[i][j]); - } - } - } + if (!ignoreNestedChangesMask) + AccountDataElements.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(AccountDataElements.size(), data); } } - if (changesMask[22]) + if (changesMask[23]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[23]) + if (changesMask[24]) { if (!ignoreNestedChangesMask) ResearchSites[i].WriteUpdateMask(data); @@ -3402,11 +3645,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[24]) + if (changesMask[25]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[25]) + if (changesMask[26]) { if (!ignoreNestedChangesMask) ResearchSiteProgress[i].WriteUpdateMask(data); @@ -3415,11 +3658,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[26]) + if (changesMask[27]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[27]) + if (changesMask[28]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -3428,11 +3671,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[22]) + if (changesMask[23]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[23]) + if (changesMask[24]) { for (uint32 j = 0; j < ResearchSites[i].size(); ++j) { @@ -3444,11 +3687,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[24]) + if (changesMask[25]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[25]) + if (changesMask[26]) { for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j) { @@ -3460,11 +3703,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[26]) + if (changesMask[27]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[27]) + if (changesMask[28]) { for (uint32 j = 0; j < Research[i].size(); ++j) { @@ -3479,112 +3722,112 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.FlushBits(); if (changesMask[0]) { - if (changesMask[4]) + if (changesMask[6]) { if (!ignoreNestedChangesMask) DailyQuestsCompleted.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data); } - if (changesMask[5]) + if (changesMask[7]) { if (!ignoreNestedChangesMask) AvailableQuestLineXQuestIDs.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data); } - if (changesMask[6]) + if (changesMask[8]) { if (!ignoreNestedChangesMask) Field_1000.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Field_1000.size(), data); } - if (changesMask[7]) + if (changesMask[9]) { if (!ignoreNestedChangesMask) Heirlooms.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data); } - if (changesMask[8]) + if (changesMask[10]) { if (!ignoreNestedChangesMask) HeirloomFlags.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data); } - if (changesMask[9]) + if (changesMask[11]) { if (!ignoreNestedChangesMask) Toys.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Toys.size(), data); } - if (changesMask[10]) + if (changesMask[12]) { if (!ignoreNestedChangesMask) Transmog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data); } - if (changesMask[11]) + if (changesMask[13]) { if (!ignoreNestedChangesMask) ConditionalTransmog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data); } - if (changesMask[12]) + if (changesMask[14]) { if (!ignoreNestedChangesMask) SelfResSpells.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data); } - if (changesMask[13]) + if (changesMask[15]) { if (!ignoreNestedChangesMask) CharacterRestrictions.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data); } - if (changesMask[14]) + if (changesMask[16]) { if (!ignoreNestedChangesMask) SpellPctModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data); } - if (changesMask[15]) + if (changesMask[17]) { if (!ignoreNestedChangesMask) SpellFlatModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data); } - if (changesMask[16]) + if (changesMask[18]) { if (!ignoreNestedChangesMask) TaskQuests.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data); } - if (changesMask[17]) + if (changesMask[19]) { if (!ignoreNestedChangesMask) TraitConfigs.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data); } - if (changesMask[18]) + if (changesMask[20]) { if (!ignoreNestedChangesMask) CategoryCooldownMods.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data); } - if (changesMask[19]) + if (changesMask[21]) { if (!ignoreNestedChangesMask) WeeklySpellUses.WriteUpdateMask(data); @@ -3605,7 +3848,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[4]) + if (changesMask[6]) { for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i) { @@ -3615,7 +3858,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[5]) + if (changesMask[7]) { for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i) { @@ -3625,7 +3868,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[6]) + if (changesMask[8]) { for (uint32 i = 0; i < Field_1000.size(); ++i) { @@ -3635,7 +3878,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[7]) + if (changesMask[9]) { for (uint32 i = 0; i < Heirlooms.size(); ++i) { @@ -3645,7 +3888,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[8]) + if (changesMask[10]) { for (uint32 i = 0; i < HeirloomFlags.size(); ++i) { @@ -3655,7 +3898,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[9]) + if (changesMask[11]) { for (uint32 i = 0; i < Toys.size(); ++i) { @@ -3665,7 +3908,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[10]) + if (changesMask[12]) { for (uint32 i = 0; i < Transmog.size(); ++i) { @@ -3675,7 +3918,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[11]) + if (changesMask[13]) { for (uint32 i = 0; i < ConditionalTransmog.size(); ++i) { @@ -3685,7 +3928,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[12]) + if (changesMask[14]) { for (uint32 i = 0; i < SelfResSpells.size(); ++i) { @@ -3695,7 +3938,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[14]) + if (changesMask[16]) { for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i) { @@ -3705,7 +3948,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[15]) + if (changesMask[17]) { for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i) { @@ -3715,7 +3958,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[16]) + if (changesMask[18]) { for (uint32 i = 0; i < TaskQuests.size(); ++i) { @@ -3725,7 +3968,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[18]) + if (changesMask[20]) { for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) { @@ -3735,7 +3978,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[19]) + if (changesMask[21]) { for (uint32 i = 0; i < WeeklySpellUses.size(); ++i) { @@ -3745,7 +3988,34 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[13]) + if (changesMask[22]) + { + if (!ignoreNestedChangesMask) + AccountBankTabSettings.WriteUpdateMask(data, 3); + else + WriteCompleteDynamicFieldUpdateMask(AccountBankTabSettings.size(), data, 3); + } + if (changesMask[4]) + { + for (uint32 i = 0; i < CharacterDataElements.size(); ++i) + { + if (CharacterDataElements.HasChanged(i) || ignoreNestedChangesMask) + { + CharacterDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[5]) + { + for (uint32 i = 0; i < AccountDataElements.size(); ++i) + { + if (AccountDataElements.HasChanged(i) || ignoreNestedChangesMask) + { + AccountDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[15]) { for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { @@ -3755,7 +4025,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[17]) + if (changesMask[19]) { for (uint32 i = 0; i < TraitConfigs.size(); ++i) { @@ -3765,397 +4035,420 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[28]) + if (changesMask[22]) { - data << FarsightObject; + for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) + { + if (AccountBankTabSettings.HasChanged(i) || ignoreNestedChangesMask) + { + AccountBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } if (changesMask[29]) { - data << SummonedBattlePetGUID; + data << FarsightObject; } if (changesMask[30]) { - data << uint64(Coinage); + data << SummonedBattlePetGUID; } if (changesMask[31]) { - data << int32(XP); + data << uint64(Coinage); } if (changesMask[32]) { - data << int32(NextLevelXP); + data << uint64(AccountBankCoinage); } if (changesMask[33]) { - data << int32(TrialXP); + data << int32(XP); } if (changesMask[34]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(NextLevelXP); } if (changesMask[35]) { - data << int32(CharacterPoints); + data << int32(TrialXP); } if (changesMask[36]) { - data << int32(MaxTalentTiers); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[37]) { + data << int32(CharacterPoints); + } + } + if (changesMask[38]) + { + if (changesMask[39]) + { + data << int32(MaxTalentTiers); + } + if (changesMask[40]) + { data << uint32(TrackCreatureMask); } - if (changesMask[38]) + if (changesMask[41]) { data << float(MainhandExpertise); } - if (changesMask[39]) + if (changesMask[42]) { data << float(OffhandExpertise); } - } - if (changesMask[40]) - { - if (changesMask[41]) + if (changesMask[43]) { data << float(RangedExpertise); } - if (changesMask[42]) + if (changesMask[44]) { data << float(CombatRatingExpertise); } - if (changesMask[43]) + if (changesMask[45]) { data << float(BlockPercentage); } - if (changesMask[44]) + if (changesMask[46]) { data << float(DodgePercentage); } - if (changesMask[45]) + if (changesMask[47]) { data << float(DodgePercentageFromAttribute); } - if (changesMask[46]) + if (changesMask[48]) { data << float(ParryPercentage); } - if (changesMask[47]) + if (changesMask[49]) { data << float(ParryPercentageFromAttribute); } - if (changesMask[48]) + if (changesMask[50]) { data << float(CritPercentage); } - if (changesMask[49]) + if (changesMask[51]) { data << float(RangedCritPercentage); } - if (changesMask[50]) + if (changesMask[52]) { data << float(OffhandCritPercentage); } - if (changesMask[51]) + if (changesMask[53]) { data << int32(ShieldBlock); } - if (changesMask[52]) + if (changesMask[54]) { data << float(ShieldBlockCritPercentage); } - if (changesMask[53]) + if (changesMask[55]) { data << float(Mastery); } - if (changesMask[54]) + if (changesMask[56]) { data << float(Speed); } - if (changesMask[55]) + if (changesMask[57]) { data << float(Avoidance); } - if (changesMask[56]) + if (changesMask[58]) { data << float(Sturdiness); } - if (changesMask[57]) + if (changesMask[59]) { data << int32(Versatility); } - if (changesMask[58]) + if (changesMask[60]) { data << float(VersatilityBonus); } - if (changesMask[59]) + if (changesMask[61]) { data << float(PvpPowerDamage); } - if (changesMask[60]) + if (changesMask[62]) { data << float(PvpPowerHealing); } - if (changesMask[61]) + if (changesMask[63]) + { + BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[64]) { data << int32(ModHealingDonePos); } - if (changesMask[62]) + if (changesMask[65]) { data << float(ModHealingPercent); } - if (changesMask[63]) + if (changesMask[66]) { data << float(ModHealingDonePercent); } - if (changesMask[64]) + if (changesMask[67]) { data << float(ModPeriodicHealingDonePercent); } - if (changesMask[65]) + if (changesMask[68]) { data << float(ModSpellPowerPercent); } - if (changesMask[66]) + if (changesMask[69]) { data << float(ModResiliencePercent); } - if (changesMask[67]) + } + if (changesMask[70]) + { + if (changesMask[71]) { data << float(OverrideSpellPowerByAPPercent); } - if (changesMask[68]) + if (changesMask[72]) { data << float(OverrideAPBySpellPowerPercent); } - if (changesMask[69]) + if (changesMask[73]) { data << int32(ModTargetResistance); } - if (changesMask[70]) + if (changesMask[74]) { data << int32(ModTargetPhysicalResistance); } - if (changesMask[71]) + if (changesMask[75]) { data << uint32(LocalFlags); } - } - if (changesMask[72]) - { - if (changesMask[73]) + if (changesMask[76]) { data << uint8(GrantableLevels); } - if (changesMask[74]) + if (changesMask[77]) { data << uint8(MultiActionBars); } - if (changesMask[75]) + if (changesMask[78]) { data << uint8(LifetimeMaxRank); } - if (changesMask[76]) + if (changesMask[79]) { data << uint8(NumRespecs); } - if (changesMask[77]) + if (changesMask[80]) { data << int32(AmmoID); } - if (changesMask[78]) + if (changesMask[81]) { data << uint32(PvpMedals); } - if (changesMask[79]) + if (changesMask[82]) { data << uint16(TodayHonorableKills); } - if (changesMask[80]) + if (changesMask[83]) { data << uint16(TodayDishonorableKills); } - if (changesMask[81]) + if (changesMask[84]) { data << uint16(YesterdayHonorableKills); } - if (changesMask[82]) + if (changesMask[85]) { data << uint16(YesterdayDishonorableKills); } - if (changesMask[83]) + if (changesMask[86]) { data << uint16(LastWeekHonorableKills); } - if (changesMask[84]) + if (changesMask[87]) { data << uint16(LastWeekDishonorableKills); } - if (changesMask[85]) + if (changesMask[88]) { data << uint16(ThisWeekHonorableKills); } - if (changesMask[86]) + if (changesMask[89]) { data << uint16(ThisWeekDishonorableKills); } - if (changesMask[87]) + if (changesMask[90]) { data << uint32(ThisWeekContribution); } - if (changesMask[88]) + if (changesMask[91]) { data << uint32(LifetimeHonorableKills); } - if (changesMask[89]) + if (changesMask[92]) { data << uint32(LifetimeDishonorableKills); } - if (changesMask[90]) + if (changesMask[93]) { data << uint32(Field_F24); } - if (changesMask[91]) + if (changesMask[94]) { data << uint32(YesterdayContribution); } - if (changesMask[92]) + if (changesMask[95]) { data << uint32(LastWeekContribution); } - if (changesMask[93]) + if (changesMask[96]) { data << uint32(LastWeekRank); } - if (changesMask[94]) + if (changesMask[97]) { data << int32(WatchedFactionIndex); } - if (changesMask[95]) + if (changesMask[98]) { data << int32(MaxLevel); } - if (changesMask[96]) + if (changesMask[99]) { data << int32(ScalingPlayerLevelDelta); } - if (changesMask[97]) + if (changesMask[100]) { data << int32(MaxCreatureScalingLevel); } - if (changesMask[98]) + if (changesMask[101]) { data << int32(PetSpellPower); } - if (changesMask[99]) + } + if (changesMask[102]) + { + if (changesMask[103]) { data << float(UiHitModifier); } - if (changesMask[100]) + if (changesMask[104]) { data << float(UiSpellHitModifier); } - if (changesMask[101]) + if (changesMask[105]) { data << int32(HomeRealmTimeOffset); } - if (changesMask[102]) + if (changesMask[106]) { data << float(ModPetHaste); } - if (changesMask[103]) + if (changesMask[107]) { data << uint8(LocalRegenFlags); } - } - if (changesMask[104]) - { - if (changesMask[105]) + if (changesMask[108]) { data << uint8(AuraVision); } - if (changesMask[106]) + if (changesMask[109]) { data << uint8(NumBackpackSlots); } - if (changesMask[107]) + if (changesMask[110]) { data << int32(OverrideSpellsID); } - if (changesMask[108]) + if (changesMask[111]) { data << int32(LfgBonusFactionID); } - if (changesMask[109]) + if (changesMask[112]) { data << uint16(LootSpecID); } - if (changesMask[110]) + if (changesMask[113]) { data << uint32(OverrideZonePVPType); } - if (changesMask[111]) + if (changesMask[114]) { data << int32(Honor); } - if (changesMask[112]) + if (changesMask[115]) { data << int32(HonorNextLevel); } - if (changesMask[113]) + if (changesMask[116]) { data << int32(Field_F74); } - if (changesMask[114]) + if (changesMask[117]) + { + data << uint8(Field_1261); + } + if (changesMask[118]) { data << int32(PvpTierMaxFromWins); } - if (changesMask[115]) + if (changesMask[119]) { data << int32(PvpLastWeeksTierMaxFromWins); } - if (changesMask[116]) + if (changesMask[120]) { data << uint8(PvpRankProgress); } - if (changesMask[117]) + if (changesMask[121]) { data << int32(PerksProgramCurrency); } - if (changesMask[120]) + if (changesMask[124]) { data << int32(TransportServerTime); } - if (changesMask[121]) + if (changesMask[125]) + { + data << int32(Field_15BC); + } + if (changesMask[126]) { data << uint32(ActiveCombatTraitConfigID); } - if (changesMask[122]) + if (changesMask[127]) { data << uint16(GlyphsEnabled); } - if (changesMask[123]) + if (changesMask[128]) { data << uint8(LfgRoles); } - if (changesMask[125]) + if (changesMask[130]) { data << uint8(NumStableSlots); } - } - data.FlushBits(); - if (changesMask[104]) - { + data.FlushBits(); data.WriteBits(PetStable.has_value(), 1); - if (changesMask[118]) + if (changesMask[122]) { ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[119]) + if (changesMask[123]) { data << FrozenPerksVendorItem; } - if (changesMask[124]) + if (changesMask[129]) { if (PetStable.has_value()) { @@ -4163,165 +4456,175 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[126]) + if (changesMask[131]) { - for (uint32 i = 0; i < 141; ++i) + for (uint32 i = 0; i < 146; ++i) { - if (changesMask[127 + i]) + if (changesMask[132 + i]) { data << InvSlots[i]; } } } - if (changesMask[268]) + if (changesMask[278]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[269 + i]) + if (changesMask[279 + i]) { data << uint32(TrackResourceMask[i]); } } } - if (changesMask[271]) + if (changesMask[281]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[272 + i]) + if (changesMask[282 + i]) { data << float(SpellCritPercentage[i]); } - if (changesMask[279 + i]) + if (changesMask[289 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[286 + i]) + if (changesMask[296 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[293 + i]) + if (changesMask[303 + i]) { data << float(ModDamageDonePercent[i]); } } } - if (changesMask[300]) + if (changesMask[310]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[301 + i]) + if (changesMask[311 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[303]) + if (changesMask[313]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[304 + i]) + if (changesMask[314 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[307 + i]) + if (changesMask[317 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[310]) + if (changesMask[320]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[311 + i]) + if (changesMask[321 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[323 + i]) + if (changesMask[333 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[335]) + if (changesMask[345]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[336 + i]) + if (changesMask[346 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[378]) + if (changesMask[388]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[379 + i]) + if (changesMask[389 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[383]) + if (changesMask[393]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[384 + i]) + if (changesMask[394 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[386]) + if (changesMask[396]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[387 + i]) + if (changesMask[397 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[391]) + if (changesMask[401]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[392 + i]) + if (changesMask[402 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[399]) + if (changesMask[409]) { - for (uint32 i = 0; i < 950; ++i) + for (uint32 i = 0; i < 960; ++i) { - if (changesMask[400 + i]) + if (changesMask[410 + i]) { data << uint64(QuestCompleted[i]); } } } - if (changesMask[1350]) + if (changesMask[1370]) { for (uint32 i = 0; i < 9; ++i) { - if (changesMask[1351 + i]) + if (changesMask[1371 + i]) { data << uint32(GlyphSlots[i]); } - if (changesMask[1360 + i]) + if (changesMask[1380 + i]) { data << uint32(Glyphs[i]); } } } - if (changesMask[368]) + if (changesMask[1389]) + { + for (uint32 i = 0; i < 13; ++i) + { + if (changesMask[1390 + i]) + { + data << uint64(Field_4348[i]); + } + } + } + if (changesMask[378]) { for (uint32 i = 0; i < 9; ++i) { - if (changesMask[369 + i]) + if (changesMask[379 + i]) { PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -4334,7 +4637,6 @@ void ActivePlayerData::ClearChangesMask() { Base::ClearChangesMask(SortBagsRightToLeft); Base::ClearChangesMask(InsertItemsLeftToRight); - Base::ClearChangesMask(DataFlags); Base::ClearChangesMask(ResearchSites); Base::ClearChangesMask(ResearchSiteProgress); Base::ClearChangesMask(Research); @@ -4353,11 +4655,15 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(TaskQuests); Base::ClearChangesMask(CategoryCooldownMods); Base::ClearChangesMask(WeeklySpellUses); + Base::ClearChangesMask(CharacterDataElements); + Base::ClearChangesMask(AccountDataElements); Base::ClearChangesMask(CharacterRestrictions); Base::ClearChangesMask(TraitConfigs); + Base::ClearChangesMask(AccountBankTabSettings); Base::ClearChangesMask(FarsightObject); Base::ClearChangesMask(SummonedBattlePetGUID); Base::ClearChangesMask(Coinage); + Base::ClearChangesMask(AccountBankCoinage); Base::ClearChangesMask(XP); Base::ClearChangesMask(NextLevelXP); Base::ClearChangesMask(TrialXP); @@ -4387,6 +4693,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(VersatilityBonus); Base::ClearChangesMask(PvpPowerDamage); Base::ClearChangesMask(PvpPowerHealing); + Base::ClearChangesMask(BitVectors); Base::ClearChangesMask(ModHealingDonePos); Base::ClearChangesMask(ModHealingPercent); Base::ClearChangesMask(ModHealingDonePercent); @@ -4438,6 +4745,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(Honor); Base::ClearChangesMask(HonorNextLevel); Base::ClearChangesMask(Field_F74); + Base::ClearChangesMask(Field_1261); Base::ClearChangesMask(PvpTierMaxFromWins); Base::ClearChangesMask(PvpLastWeeksTierMaxFromWins); Base::ClearChangesMask(PvpRankProgress); @@ -4445,6 +4753,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(ResearchHistory); Base::ClearChangesMask(FrozenPerksVendorItem); Base::ClearChangesMask(TransportServerTime); + Base::ClearChangesMask(Field_15BC); Base::ClearChangesMask(ActiveCombatTraitConfigID); Base::ClearChangesMask(GlyphsEnabled); Base::ClearChangesMask(LfgRoles); @@ -4470,6 +4779,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(QuestCompleted); Base::ClearChangesMask(GlyphSlots); Base::ClearChangesMask(Glyphs); + Base::ClearChangesMask(Field_4348); _changesMask.ResetAll(); } @@ -5155,6 +5465,7 @@ void SceneObjectData::ClearChangesMask() void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const { data << int32(ConversationLineID); + data << int32(BroadcastTextID); data << uint32(ViewerDependentValue<StartTimeTag>::GetValue(this, owner, receiver)); data << int32(UiCameraID); data << uint8(ActorIndex); @@ -5164,6 +5475,7 @@ void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const { data << int32(ConversationLineID); + data << int32(BroadcastTextID); data << uint32(ViewerDependentValue<StartTimeTag>::GetValue(this, owner, receiver)); data << int32(UiCameraID); data << uint8(ActorIndex); @@ -5173,6 +5485,7 @@ void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Con bool ConversationLine::operator==(ConversationLine const& right) const { return ConversationLineID == right.ConversationLineID + && BroadcastTextID == right.BroadcastTextID && StartTime == right.StartTime && UiCameraID == right.UiCameraID && ActorIndex == right.ActorIndex diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 941aad27d07..ccc35773f4a 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -60,13 +60,12 @@ struct ObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<4> void ClearChangesMask(); }; -struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask<6> +struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask<5> { UpdateField<int32, 0, 1> ID; UpdateField<uint32, 0, 2> Duration; UpdateField<int16, 0, 3> Charges; - UpdateField<uint8, 0, 4> Field_A; - UpdateField<uint8, 0, 5> Field_B; + UpdateField<uint16, 0, 4> Inactive; void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const; @@ -75,8 +74,8 @@ struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask struct ItemMod : public IsUpdateFieldStructureTag { - int32 Value; uint8 Type; + int32 Value; void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const; @@ -132,7 +131,7 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<43> UpdateField<uint32, 0, 12> Durability; UpdateField<uint32, 0, 13> MaxDurability; UpdateField<uint32, 0, 14> CreatePlayedTime; - UpdateField<int32, 0, 15> Context; + UpdateField<uint8, 0, 15> Context; UpdateField<int64, 0, 16> CreateTime; UpdateField<uint64, 0, 17> ArtifactXP; UpdateField<uint8, 0, 18> ItemAppearanceModID; @@ -195,7 +194,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<227> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<226> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells; @@ -205,37 +204,39 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<227> UpdateField<int64, 0, 6> MaxHealth; UpdateField<int32, 0, 7> DisplayID; struct DisplayIDTag : ViewerDependentValueTag<int32> {}; - UpdateField<uint32, 0, 8> StateSpellVisualID; - UpdateField<uint32, 0, 9> StateAnimID; - UpdateField<uint32, 0, 10> StateAnimKitID; - UpdateField<ObjectGuid, 0, 11> Charm; - UpdateField<ObjectGuid, 0, 12> Summon; - UpdateField<ObjectGuid, 0, 13> Critter; - UpdateField<ObjectGuid, 0, 14> CharmedBy; - UpdateField<ObjectGuid, 0, 15> SummonedBy; - UpdateField<ObjectGuid, 0, 16> CreatedBy; - UpdateField<ObjectGuid, 0, 17> DemonCreator; - UpdateField<ObjectGuid, 0, 18> LookAtControllerTarget; - UpdateField<ObjectGuid, 0, 19> Target; - UpdateField<ObjectGuid, 0, 20> BattlePetCompanionGUID; - UpdateField<uint64, 0, 21> BattlePetDBID; - UpdateField<UF::UnitChannel, 0, 22> ChannelData; - UpdateField<uint32, 0, 23> SummonedByHomeRealm; - UpdateField<uint8, 0, 24> Race; - UpdateField<uint8, 0, 25> ClassId; - UpdateField<uint8, 0, 26> PlayerClassId; - UpdateField<uint8, 0, 27> Sex; - UpdateField<uint8, 0, 28> DisplayPower; - UpdateField<uint32, 0, 29> OverrideDisplayPowerID; - UpdateField<int32, 0, 30> Level; - UpdateField<int32, 0, 31> EffectiveLevel; - UpdateField<int32, 32, 33> ContentTuningID; - UpdateField<int32, 32, 34> ScalingLevelMin; - UpdateField<int32, 32, 35> ScalingLevelMax; - UpdateField<int32, 32, 36> ScalingLevelDelta; - UpdateField<int32, 32, 37> ScalingFactionGroup; - UpdateField<int32, 32, 38> ScalingHealthItemLevelCurveID; - UpdateField<int32, 32, 39> ScalingDamageItemLevelCurveID; + UpdateField<uint32, 0, 8> NpcFlags; + struct NpcFlagsTag : ViewerDependentValueTag<uint32> {}; + UpdateField<uint32, 0, 9> NpcFlags2; + struct NpcFlags2Tag : ViewerDependentValueTag<uint32> {}; + UpdateField<uint32, 0, 10> StateSpellVisualID; + UpdateField<uint32, 0, 11> StateAnimID; + UpdateField<uint32, 0, 12> StateAnimKitID; + UpdateField<ObjectGuid, 0, 13> Charm; + UpdateField<ObjectGuid, 0, 14> Summon; + UpdateField<ObjectGuid, 0, 15> Critter; + UpdateField<ObjectGuid, 0, 16> CharmedBy; + UpdateField<ObjectGuid, 0, 17> SummonedBy; + UpdateField<ObjectGuid, 0, 18> CreatedBy; + UpdateField<ObjectGuid, 0, 19> DemonCreator; + UpdateField<ObjectGuid, 0, 20> LookAtControllerTarget; + UpdateField<ObjectGuid, 0, 21> Target; + UpdateField<ObjectGuid, 0, 22> BattlePetCompanionGUID; + UpdateField<uint64, 0, 23> BattlePetDBID; + UpdateField<UF::UnitChannel, 0, 24> ChannelData; + UpdateField<uint32, 0, 25> SummonedByHomeRealm; + UpdateField<uint8, 0, 26> Race; + UpdateField<uint8, 0, 27> ClassId; + UpdateField<uint8, 0, 28> PlayerClassId; + UpdateField<uint8, 0, 29> Sex; + UpdateField<uint8, 0, 30> DisplayPower; + UpdateField<uint32, 0, 31> OverrideDisplayPowerID; + UpdateField<int32, 32, 33> Level; + UpdateField<int32, 32, 34> EffectiveLevel; + UpdateField<int32, 32, 35> ContentTuningID; + UpdateField<int32, 32, 36> ScalingLevelMin; + UpdateField<int32, 32, 37> ScalingLevelMax; + UpdateField<int32, 32, 38> ScalingLevelDelta; + UpdateField<int32, 32, 39> ScalingFactionGroup; UpdateField<int32, 32, 40> FactionTemplate; struct FactionTemplateTag : ViewerDependentValueTag<int32> {}; UpdateField<uint32, 32, 41> Flags; @@ -312,10 +313,11 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<227> UpdateField<ObjectGuid, 96, 108> SkinningOwnerGUID; UpdateField<int32, 96, 109> FlightCapabilityID; UpdateField<float, 96, 110> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use - UpdateField<uint32, 96, 111> CurrentAreaID; - UpdateField<ObjectGuid, 96, 112> ComboTarget; - UpdateFieldArray<uint32, 2, 113, 114> NpcFlags; - struct NpcFlagsTag : ViewerDependentValueTag<uint32> {}; + UpdateField<uint32, 96, 111> SilencedSchoolMask; + UpdateField<uint32, 96, 112> CurrentAreaID; + UpdateField<ObjectGuid, 96, 113> ComboTarget; + UpdateField<float, 96, 114> Field_2F0; + UpdateField<float, 96, 115> Field_2F4; UpdateFieldArray<float, 10, 116, 117> PowerRegenFlatModifier; UpdateFieldArray<float, 10, 116, 127> PowerRegenInterruptedFlatModifier; UpdateFieldArray<int32, 10, 116, 137> Power; @@ -327,10 +329,10 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<227> UpdateFieldArray<int32, 5, 174, 180> StatPosBuff; UpdateFieldArray<int32, 5, 174, 185> StatNegBuff; UpdateFieldArray<int32, 7, 190, 191> Resistances; - UpdateFieldArray<int32, 7, 190, 198> PowerCostModifier; - UpdateFieldArray<float, 7, 190, 205> PowerCostMultiplier; - UpdateFieldArray<int32, 7, 212, 213> ResistanceBuffModsPositive; - UpdateFieldArray<int32, 7, 212, 220> ResistanceBuffModsNegative; + UpdateFieldArray<int32, 7, 190, 198> ResistanceBuffModsPositive; + UpdateFieldArray<int32, 7, 190, 205> ResistanceBuffModsNegative; + UpdateFieldArray<int32, 7, 190, 212> PowerCostModifier; + UpdateFieldArray<float, 7, 190, 219> PowerCostMultiplier; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; @@ -379,6 +381,16 @@ struct ArenaCooldown : public IsUpdateFieldStructureTag, public HasChangesMask<9 void ClearChangesMask(); }; +struct ZonePlayerForcedReaction : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<int32, 0, 1> FactionID; + UpdateField<int32, 0, 2> Reaction; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + struct DeclinedNames : public IsUpdateFieldStructureTag, public HasChangesMask<6> { UpdateFieldArray<std::string, 5, 0, 1> Name; @@ -388,20 +400,20 @@ struct DeclinedNames : public IsUpdateFieldStructureTag, public HasChangesMask<6 void ClearChangesMask(); }; -struct CustomTabardInfo : public IsUpdateFieldStructureTag, public HasChangesMask<6> +struct CustomTabardInfo : public IsUpdateFieldStructureTag, public HasChangesMask<5> { - UpdateField<int32, 0, 1> EmblemStyle; - UpdateField<int32, 0, 2> EmblemColor; - UpdateField<int32, 0, 3> BorderStyle; - UpdateField<int32, 0, 4> BorderColor; - UpdateField<int32, 0, 5> BackgroundColor; + UpdateField<int32, -1, 0> EmblemStyle; + UpdateField<int32, -1, 1> EmblemColor; + UpdateField<int32, -1, 2> BorderStyle; + UpdateField<int32, -1, 3> BorderColor; + UpdateField<int32, -1, 4> BackgroundColor; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; void ClearChangesMask(); }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<115> +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<148> { DynamicUpdateField<UF::ChrCustomizationChoice, 0, 1> Customizations; DynamicUpdateField<UF::ArenaCooldown, 0, 2> ArenaCooldowns; @@ -444,7 +456,8 @@ struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<115> UpdateFieldArray<UF::QuestLog, 25, 42, 43> QuestLog; UpdateFieldArray<UF::VisibleItem, 19, 68, 69> VisibleItems; UpdateFieldArray<float, 6, 88, 89> AvgItemLevel; - UpdateFieldArray<uint32, 19, 95, 96> Field_3120; + UpdateFieldArray<UF::ZonePlayerForcedReaction, 32, 95, 96> ForcedReactions; + UpdateFieldArray<uint32, 19, 128, 129> Field_3120; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -470,6 +483,27 @@ struct SkillInfo : public IsUpdateFieldStructureTag, public HasChangesMask<1793> void ClearChangesMask(); }; +struct BitVectors : public IsUpdateFieldStructureTag, public HasChangesMask<1> +{ + UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 11, 0, -1> Values; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct PlayerDataElement : public IsUpdateFieldStructureTag +{ + uint32 Type; + float FloatValue; + int64 Int64Value; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(PlayerDataElement const& right) const; + bool operator!=(PlayerDataElement const& right) const { return !(*this == right); } +}; + struct RestInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3> { UpdateField<uint32, 0, 1> Threshold; @@ -586,17 +620,30 @@ struct TraitEntry : public IsUpdateFieldStructureTag bool operator!=(TraitEntry const& right) const { return !(*this == right); } }; -struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<12> +struct TraitSubTreeCache : public IsUpdateFieldStructureTag +{ + std::vector<UF::TraitEntry> Entries; + int32 TraitSubTreeID; + uint32 Active; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(TraitSubTreeCache const& right) const; + bool operator!=(TraitSubTreeCache const& right) const { return !(*this == right); } +}; + +struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<14> { DynamicUpdateField<UF::TraitEntry, 0, 1> Entries; - UpdateField<int32, 0, 2> ID; - UpdateField<std::string, 0, 3> Name; - UpdateField<int32, 4, 5> Type; - UpdateField<int32, 4, 6> SkillLineID; - UpdateField<int32, 4, 7> ChrSpecializationID; - UpdateField<int32, 8, 9> CombatConfigFlags; - UpdateField<int32, 8, 10> LocalIdentifier; - UpdateField<int32, 8, 11> TraitSystemID; + DynamicUpdateField<UF::TraitSubTreeCache, 0, 2> SubTrees; + UpdateField<int32, 0, 3> ID; + UpdateField<std::string, 4, 5> Name; + UpdateField<int32, 4, 6> Type; + UpdateField<int32, 4, 7> SkillLineID; + UpdateField<int32, 8, 9> ChrSpecializationID; + UpdateField<int32, 8, 10> CombatConfigFlags; + UpdateField<int32, 8, 11> LocalIdentifier; + UpdateField<int32, 12, 13> TraitSystemID; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -651,146 +698,165 @@ struct StableInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3> void ClearChangesMask(); }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1369> +struct BankTabSettings : public IsUpdateFieldStructureTag, public HasChangesMask<4> +{ + UpdateField<std::string, -1, 0> Name; + UpdateField<std::string, -1, 1> Icon; + UpdateField<std::string, -1, 2> Description; + UpdateField<int32, -1, 3> DepositFlags; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1403> { UpdateField<bool, 0, 1> SortBagsRightToLeft; UpdateField<bool, 0, 2> InsertItemsLeftToRight; - UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 8, 20, 21> DataFlags; - UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 22, 23> ResearchSites; - UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 24, 25> ResearchSiteProgress; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 26, 27> Research; + UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 23, 24> ResearchSites; + UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 25, 26> ResearchSiteProgress; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 27, 28> Research; DynamicUpdateField<uint64, 0, 3> KnownTitles; - DynamicUpdateField<int32, 0, 4> DailyQuestsCompleted; - DynamicUpdateField<int32, 0, 5> AvailableQuestLineXQuestIDs; - DynamicUpdateField<int32, 0, 6> Field_1000; - DynamicUpdateField<int32, 0, 7> Heirlooms; - DynamicUpdateField<uint32, 0, 8> HeirloomFlags; - DynamicUpdateField<int32, 0, 9> Toys; - DynamicUpdateField<uint32, 0, 10> Transmog; - DynamicUpdateField<int32, 0, 11> ConditionalTransmog; - DynamicUpdateField<int32, 0, 12> SelfResSpells; - DynamicUpdateField<UF::SpellPctModByLabel, 0, 14> SpellPctModByLabel; - DynamicUpdateField<UF::SpellFlatModByLabel, 0, 15> SpellFlatModByLabel; - DynamicUpdateField<UF::QuestLog, 0, 16> TaskQuests; - DynamicUpdateField<UF::CategoryCooldownMod, 0, 18> CategoryCooldownMods; - DynamicUpdateField<UF::WeeklySpellUse, 0, 19> WeeklySpellUses; - DynamicUpdateField<UF::CharacterRestriction, 0, 13> CharacterRestrictions; - DynamicUpdateField<UF::TraitConfig, 0, 17> TraitConfigs; - UpdateField<ObjectGuid, 0, 28> FarsightObject; - UpdateField<ObjectGuid, 0, 29> SummonedBattlePetGUID; - UpdateField<uint64, 0, 30> Coinage; - UpdateField<int32, 0, 31> XP; - UpdateField<int32, 0, 32> NextLevelXP; - UpdateField<int32, 0, 33> TrialXP; - UpdateField<UF::SkillInfo, 0, 34> Skill; - UpdateField<int32, 0, 35> CharacterPoints; - UpdateField<int32, 0, 36> MaxTalentTiers; - UpdateField<uint32, 0, 37> TrackCreatureMask; - UpdateField<float, 0, 38> MainhandExpertise; - UpdateField<float, 0, 39> OffhandExpertise; - UpdateField<float, 40, 41> RangedExpertise; - UpdateField<float, 40, 42> CombatRatingExpertise; - UpdateField<float, 40, 43> BlockPercentage; - UpdateField<float, 40, 44> DodgePercentage; - UpdateField<float, 40, 45> DodgePercentageFromAttribute; - UpdateField<float, 40, 46> ParryPercentage; - UpdateField<float, 40, 47> ParryPercentageFromAttribute; - UpdateField<float, 40, 48> CritPercentage; - UpdateField<float, 40, 49> RangedCritPercentage; - UpdateField<float, 40, 50> OffhandCritPercentage; - UpdateField<int32, 40, 51> ShieldBlock; - UpdateField<float, 40, 52> ShieldBlockCritPercentage; - UpdateField<float, 40, 53> Mastery; - UpdateField<float, 40, 54> Speed; - UpdateField<float, 40, 55> Avoidance; - UpdateField<float, 40, 56> Sturdiness; - UpdateField<int32, 40, 57> Versatility; - UpdateField<float, 40, 58> VersatilityBonus; - UpdateField<float, 40, 59> PvpPowerDamage; - UpdateField<float, 40, 60> PvpPowerHealing; - UpdateField<int32, 40, 61> ModHealingDonePos; - UpdateField<float, 40, 62> ModHealingPercent; - UpdateField<float, 40, 63> ModHealingDonePercent; - UpdateField<float, 40, 64> ModPeriodicHealingDonePercent; - UpdateField<float, 40, 65> ModSpellPowerPercent; - UpdateField<float, 40, 66> ModResiliencePercent; - UpdateField<float, 40, 67> OverrideSpellPowerByAPPercent; - UpdateField<float, 40, 68> OverrideAPBySpellPowerPercent; - UpdateField<int32, 40, 69> ModTargetResistance; - UpdateField<int32, 40, 70> ModTargetPhysicalResistance; - UpdateField<uint32, 40, 71> LocalFlags; - UpdateField<uint8, 72, 73> GrantableLevels; - UpdateField<uint8, 72, 74> MultiActionBars; - UpdateField<uint8, 72, 75> LifetimeMaxRank; - UpdateField<uint8, 72, 76> NumRespecs; - UpdateField<int32, 72, 77> AmmoID; - UpdateField<uint32, 72, 78> PvpMedals; - UpdateField<uint16, 72, 79> TodayHonorableKills; - UpdateField<uint16, 72, 80> TodayDishonorableKills; - UpdateField<uint16, 72, 81> YesterdayHonorableKills; - UpdateField<uint16, 72, 82> YesterdayDishonorableKills; - UpdateField<uint16, 72, 83> LastWeekHonorableKills; - UpdateField<uint16, 72, 84> LastWeekDishonorableKills; - UpdateField<uint16, 72, 85> ThisWeekHonorableKills; - UpdateField<uint16, 72, 86> ThisWeekDishonorableKills; - UpdateField<uint32, 72, 87> ThisWeekContribution; - UpdateField<uint32, 72, 88> LifetimeHonorableKills; - UpdateField<uint32, 72, 89> LifetimeDishonorableKills; - UpdateField<uint32, 72, 90> Field_F24; - UpdateField<uint32, 72, 91> YesterdayContribution; - UpdateField<uint32, 72, 92> LastWeekContribution; - UpdateField<uint32, 72, 93> LastWeekRank; - UpdateField<int32, 72, 94> WatchedFactionIndex; - UpdateField<int32, 72, 95> MaxLevel; - UpdateField<int32, 72, 96> ScalingPlayerLevelDelta; - UpdateField<int32, 72, 97> MaxCreatureScalingLevel; - UpdateField<int32, 72, 98> PetSpellPower; - UpdateField<float, 72, 99> UiHitModifier; - UpdateField<float, 72, 100> UiSpellHitModifier; - UpdateField<int32, 72, 101> HomeRealmTimeOffset; - UpdateField<float, 72, 102> ModPetHaste; - UpdateField<uint8, 72, 103> LocalRegenFlags; - UpdateField<uint8, 104, 105> AuraVision; - UpdateField<uint8, 104, 106> NumBackpackSlots; - UpdateField<int32, 104, 107> OverrideSpellsID; - UpdateField<int32, 104, 108> LfgBonusFactionID; - UpdateField<uint16, 104, 109> LootSpecID; - UpdateField<uint32, 104, 110> OverrideZonePVPType; - UpdateField<int32, 104, 111> Honor; - UpdateField<int32, 104, 112> HonorNextLevel; - UpdateField<int32, 104, 113> Field_F74; - UpdateField<int32, 104, 114> PvpTierMaxFromWins; - UpdateField<int32, 104, 115> PvpLastWeeksTierMaxFromWins; - UpdateField<uint8, 104, 116> PvpRankProgress; - UpdateField<int32, 104, 117> PerksProgramCurrency; - UpdateField<UF::ResearchHistory, 104, 118> ResearchHistory; - UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 104, 119> FrozenPerksVendorItem; - UpdateField<int32, 104, 120> TransportServerTime; - UpdateField<uint32, 104, 121> ActiveCombatTraitConfigID; - UpdateField<uint16, 104, 122> GlyphsEnabled; - UpdateField<uint8, 104, 123> LfgRoles; - OptionalUpdateField<UF::StableInfo, 104, 124> PetStable; - UpdateField<uint8, 104, 125> NumStableSlots; - UpdateFieldArray<ObjectGuid, 141, 126, 127> InvSlots; - UpdateFieldArray<uint32, 2, 268, 269> TrackResourceMask; - UpdateFieldArray<float, 7, 271, 272> SpellCritPercentage; - UpdateFieldArray<int32, 7, 271, 279> ModDamageDonePos; - UpdateFieldArray<int32, 7, 271, 286> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 271, 293> ModDamageDonePercent; - UpdateFieldArray<UF::RestInfo, 2, 300, 301> RestInfo; - UpdateFieldArray<float, 3, 303, 304> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 303, 307> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 310, 311> BuybackPrice; - UpdateFieldArray<int64, 12, 310, 323> BuybackTimestamp; - UpdateFieldArray<int32, 32, 335, 336> CombatRatings; - UpdateFieldArray<UF::PVPInfo, 9, 368, 369> PvpInfo; - UpdateFieldArray<uint32, 4, 378, 379> NoReagentCostMask; - UpdateFieldArray<int32, 2, 383, 384> ProfessionSkillLine; - UpdateFieldArray<uint32, 4, 386, 387> BagSlotFlags; - UpdateFieldArray<uint32, 7, 391, 392> BankBagSlotFlags; - UpdateFieldArray<uint64, 950, 399, 400> QuestCompleted; - UpdateFieldArray<uint32, 9, 1350, 1351> GlyphSlots; - UpdateFieldArray<uint32, 9, 1350, 1360> Glyphs; + DynamicUpdateField<int32, 0, 6> DailyQuestsCompleted; + DynamicUpdateField<int32, 0, 7> AvailableQuestLineXQuestIDs; + DynamicUpdateField<int32, 0, 8> Field_1000; + DynamicUpdateField<int32, 0, 9> Heirlooms; + DynamicUpdateField<uint32, 0, 10> HeirloomFlags; + DynamicUpdateField<int32, 0, 11> Toys; + DynamicUpdateField<uint32, 0, 12> Transmog; + DynamicUpdateField<int32, 0, 13> ConditionalTransmog; + DynamicUpdateField<int32, 0, 14> SelfResSpells; + DynamicUpdateField<UF::SpellPctModByLabel, 0, 16> SpellPctModByLabel; + DynamicUpdateField<UF::SpellFlatModByLabel, 0, 17> SpellFlatModByLabel; + DynamicUpdateField<UF::QuestLog, 0, 18> TaskQuests; + DynamicUpdateField<UF::CategoryCooldownMod, 0, 20> CategoryCooldownMods; + DynamicUpdateField<UF::WeeklySpellUse, 0, 21> WeeklySpellUses; + DynamicUpdateField<UF::PlayerDataElement, 0, 4> CharacterDataElements; + DynamicUpdateField<UF::PlayerDataElement, 0, 5> AccountDataElements; + DynamicUpdateField<UF::CharacterRestriction, 0, 15> CharacterRestrictions; + DynamicUpdateField<UF::TraitConfig, 0, 19> TraitConfigs; + DynamicUpdateField<UF::BankTabSettings, 0, 22> AccountBankTabSettings; + UpdateField<ObjectGuid, 0, 29> FarsightObject; + UpdateField<ObjectGuid, 0, 30> SummonedBattlePetGUID; + UpdateField<uint64, 0, 31> Coinage; + UpdateField<uint64, 0, 32> AccountBankCoinage; + UpdateField<int32, 0, 33> XP; + UpdateField<int32, 0, 34> NextLevelXP; + UpdateField<int32, 0, 35> TrialXP; + UpdateField<UF::SkillInfo, 0, 36> Skill; + UpdateField<int32, 0, 37> CharacterPoints; + UpdateField<int32, 38, 39> MaxTalentTiers; + UpdateField<uint32, 38, 40> TrackCreatureMask; + UpdateField<float, 38, 41> MainhandExpertise; + UpdateField<float, 38, 42> OffhandExpertise; + UpdateField<float, 38, 43> RangedExpertise; + UpdateField<float, 38, 44> CombatRatingExpertise; + UpdateField<float, 38, 45> BlockPercentage; + UpdateField<float, 38, 46> DodgePercentage; + UpdateField<float, 38, 47> DodgePercentageFromAttribute; + UpdateField<float, 38, 48> ParryPercentage; + UpdateField<float, 38, 49> ParryPercentageFromAttribute; + UpdateField<float, 38, 50> CritPercentage; + UpdateField<float, 38, 51> RangedCritPercentage; + UpdateField<float, 38, 52> OffhandCritPercentage; + UpdateField<int32, 38, 53> ShieldBlock; + UpdateField<float, 38, 54> ShieldBlockCritPercentage; + UpdateField<float, 38, 55> Mastery; + UpdateField<float, 38, 56> Speed; + UpdateField<float, 38, 57> Avoidance; + UpdateField<float, 38, 58> Sturdiness; + UpdateField<int32, 38, 59> Versatility; + UpdateField<float, 38, 60> VersatilityBonus; + UpdateField<float, 38, 61> PvpPowerDamage; + UpdateField<float, 38, 62> PvpPowerHealing; + UpdateField<UF::BitVectors, 38, 63> BitVectors; + UpdateField<int32, 38, 64> ModHealingDonePos; + UpdateField<float, 38, 65> ModHealingPercent; + UpdateField<float, 38, 66> ModHealingDonePercent; + UpdateField<float, 38, 67> ModPeriodicHealingDonePercent; + UpdateField<float, 38, 68> ModSpellPowerPercent; + UpdateField<float, 38, 69> ModResiliencePercent; + UpdateField<float, 70, 71> OverrideSpellPowerByAPPercent; + UpdateField<float, 70, 72> OverrideAPBySpellPowerPercent; + UpdateField<int32, 70, 73> ModTargetResistance; + UpdateField<int32, 70, 74> ModTargetPhysicalResistance; + UpdateField<uint32, 70, 75> LocalFlags; + UpdateField<uint8, 70, 76> GrantableLevels; + UpdateField<uint8, 70, 77> MultiActionBars; + UpdateField<uint8, 70, 78> LifetimeMaxRank; + UpdateField<uint8, 70, 79> NumRespecs; + UpdateField<int32, 70, 80> AmmoID; + UpdateField<uint32, 70, 81> PvpMedals; + UpdateField<uint16, 70, 82> TodayHonorableKills; + UpdateField<uint16, 70, 83> TodayDishonorableKills; + UpdateField<uint16, 70, 84> YesterdayHonorableKills; + UpdateField<uint16, 70, 85> YesterdayDishonorableKills; + UpdateField<uint16, 70, 86> LastWeekHonorableKills; + UpdateField<uint16, 70, 87> LastWeekDishonorableKills; + UpdateField<uint16, 70, 88> ThisWeekHonorableKills; + UpdateField<uint16, 70, 89> ThisWeekDishonorableKills; + UpdateField<uint32, 70, 90> ThisWeekContribution; + UpdateField<uint32, 70, 91> LifetimeHonorableKills; + UpdateField<uint32, 70, 92> LifetimeDishonorableKills; + UpdateField<uint32, 70, 93> Field_F24; + UpdateField<uint32, 70, 94> YesterdayContribution; + UpdateField<uint32, 70, 95> LastWeekContribution; + UpdateField<uint32, 70, 96> LastWeekRank; + UpdateField<int32, 70, 97> WatchedFactionIndex; + UpdateField<int32, 70, 98> MaxLevel; + UpdateField<int32, 70, 99> ScalingPlayerLevelDelta; + UpdateField<int32, 70, 100> MaxCreatureScalingLevel; + UpdateField<int32, 70, 101> PetSpellPower; + UpdateField<float, 102, 103> UiHitModifier; + UpdateField<float, 102, 104> UiSpellHitModifier; + UpdateField<int32, 102, 105> HomeRealmTimeOffset; + UpdateField<float, 102, 106> ModPetHaste; + UpdateField<uint8, 102, 107> LocalRegenFlags; + UpdateField<uint8, 102, 108> AuraVision; + UpdateField<uint8, 102, 109> NumBackpackSlots; + UpdateField<int32, 102, 110> OverrideSpellsID; + UpdateField<int32, 102, 111> LfgBonusFactionID; + UpdateField<uint16, 102, 112> LootSpecID; + UpdateField<uint32, 102, 113> OverrideZonePVPType; + UpdateField<int32, 102, 114> Honor; + UpdateField<int32, 102, 115> HonorNextLevel; + UpdateField<int32, 102, 116> Field_F74; + UpdateField<uint8, 102, 117> Field_1261; + UpdateField<int32, 102, 118> PvpTierMaxFromWins; + UpdateField<int32, 102, 119> PvpLastWeeksTierMaxFromWins; + UpdateField<uint8, 102, 120> PvpRankProgress; + UpdateField<int32, 102, 121> PerksProgramCurrency; + UpdateField<UF::ResearchHistory, 102, 122> ResearchHistory; + UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 123> FrozenPerksVendorItem; + UpdateField<int32, 102, 124> TransportServerTime; + UpdateField<int32, 102, 125> Field_15BC; + UpdateField<uint32, 102, 126> ActiveCombatTraitConfigID; + UpdateField<uint16, 102, 127> GlyphsEnabled; + UpdateField<uint8, 102, 128> LfgRoles; + OptionalUpdateField<UF::StableInfo, 102, 129> PetStable; + UpdateField<uint8, 102, 130> NumStableSlots; + UpdateFieldArray<ObjectGuid, 146, 131, 132> InvSlots; + UpdateFieldArray<uint32, 2, 278, 279> TrackResourceMask; + UpdateFieldArray<float, 7, 281, 282> SpellCritPercentage; + UpdateFieldArray<int32, 7, 281, 289> ModDamageDonePos; + UpdateFieldArray<int32, 7, 281, 296> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 281, 303> ModDamageDonePercent; + UpdateFieldArray<UF::RestInfo, 2, 310, 311> RestInfo; + UpdateFieldArray<float, 3, 313, 314> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 313, 317> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 320, 321> BuybackPrice; + UpdateFieldArray<int64, 12, 320, 333> BuybackTimestamp; + UpdateFieldArray<int32, 32, 345, 346> CombatRatings; + UpdateFieldArray<UF::PVPInfo, 9, 378, 379> PvpInfo; + UpdateFieldArray<uint32, 4, 388, 389> NoReagentCostMask; + UpdateFieldArray<int32, 2, 393, 394> ProfessionSkillLine; + UpdateFieldArray<uint32, 4, 396, 397> BagSlotFlags; + UpdateFieldArray<uint32, 7, 401, 402> BankBagSlotFlags; + UpdateFieldArray<uint64, 960, 409, 410> QuestCompleted; + UpdateFieldArray<uint32, 9, 1370, 1371> GlyphSlots; + UpdateFieldArray<uint32, 9, 1370, 1380> Glyphs; + UpdateFieldArray<uint64, 13, 1389, 1390> Field_4348; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -932,6 +998,7 @@ struct SceneObjectData : public IsUpdateFieldStructureTag, public HasChangesMask struct ConversationLine : public IsUpdateFieldStructureTag { int32 ConversationLineID; + int32 BroadcastTextID; uint32 StartTime; struct StartTimeTag : ViewerDependentValueTag<uint32> {}; int32 UiCameraID; diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h index 6f3fa8ba1ae..7aa0b13cfaf 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -322,7 +322,7 @@ public: static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver) { value_type interactSpellId = unitData->InteractSpellID; - if (unitData->NpcFlags[0] & UNIT_NPC_FLAG_SPELLCLICK && !interactSpellId) + if (unitData->NpcFlags & UNIT_NPC_FLAG_SPELLCLICK && !interactSpellId) { // this field is not set if there are multiple available spellclick spells auto clickBounds = sObjectMgr->GetSpellClickInfoMapBounds(unit->GetEntry()); @@ -349,9 +349,9 @@ class ViewerDependentValue<UF::UnitData::NpcFlagsTag> public: using value_type = UF::UnitData::NpcFlagsTag::value_type; - static value_type GetValue(UF::UnitData const* unitData, uint32 i, Unit const* unit, Player const* receiver) + static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver) { - value_type npcFlag = unitData->NpcFlags[i]; + value_type npcFlag = unitData->NpcFlags; if (npcFlag) { if ((!unit->IsInteractionAllowedInCombat() && unit->IsInCombat()) @@ -359,14 +359,11 @@ public: npcFlag = 0; else if (Creature const* creature = unit->ToCreature()) { - if (i == 0) - { - if (!receiver->CanSeeGossipOn(creature)) - npcFlag &= ~(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + if (!receiver->CanSeeGossipOn(creature)) + npcFlag &= ~(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - if (!receiver->CanSeeSpellClickOn(creature)) - npcFlag &= ~UNIT_NPC_FLAG_SPELLCLICK; - } + if (!receiver->CanSeeSpellClickOn(creature)) + npcFlag &= ~UNIT_NPC_FLAG_SPELLCLICK; } } return npcFlag; @@ -374,6 +371,25 @@ public: }; template<> +class ViewerDependentValue<UF::UnitData::NpcFlags2Tag> +{ +public: + using value_type = UF::UnitData::NpcFlags2Tag::value_type; + + static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver) + { + value_type npcFlag = unitData->NpcFlags2; + if (npcFlag) + { + if ((!unit->IsInteractionAllowedInCombat() && unit->IsInCombat()) + || (!unit->IsInteractionAllowedWhileHostile() && unit->IsHostileTo(receiver))) + npcFlag = 0; + } + return npcFlag; + } +}; + +template<> class ViewerDependentValue<UF::GameObjectData::FlagsTag> { public: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bde9efe99e3..a8291c568ed 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -201,6 +201,7 @@ Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) m_bCanDelayTeleport = false; m_bHasDelayedTeleport = false; m_teleport_options = TELE_TO_NONE; + m_newWorldCounter = 0; m_trade = nullptr; @@ -1437,6 +1438,8 @@ bool Player::TeleportTo(TeleportLocation const& teleportLocation, TeleportToOpti if (!GetSession()->PlayerLogout()) { + ++m_newWorldCounter; + WorldPackets::Movement::SuspendToken suspendToken; suspendToken.SequenceIndex = m_movementCounter; // not incrementing suspendToken.Reason = options & TELE_TO_SEAMLESS ? 2 : 1; @@ -5847,8 +5850,8 @@ void Player::CheckAreaExplore() uint32 offset = areaEntry->AreaBit / PLAYER_EXPLORED_ZONES_BITS; uint64 val = UI64LIT(1) << (areaEntry->AreaBit % PLAYER_EXPLORED_ZONES_BITS); - if (offset >= m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size() - || !(m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][offset] & val)) + if (offset >= m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size() + || !(m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][offset] & val)) { AddExploredZones(offset, val); @@ -5893,7 +5896,8 @@ void Player::AddExploredZones(uint32 pos, uint64 mask) { SetUpdateFieldFlagValue(m_values .ModifyValue(&Player::m_activePlayerData) - .ModifyValue(&UF::ActivePlayerData::DataFlags, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) + .ModifyValue(&UF::ActivePlayerData::BitVectors) + .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) .ModifyValue(pos), mask); } @@ -5901,7 +5905,8 @@ void Player::RemoveExploredZones(uint32 pos, uint64 mask) { RemoveUpdateFieldFlagValue(m_values .ModifyValue(&Player::m_activePlayerData) - .ModifyValue(&UF::ActivePlayerData::DataFlags, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) + .ModifyValue(&UF::ActivePlayerData::BitVectors) + .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX) .ModifyValue(pos), mask); } @@ -5915,11 +5920,11 @@ bool Player::HasExploredZone(uint32 areaId) const return false; size_t playerIndexOffset = size_t(area->AreaBit) / PLAYER_EXPLORED_ZONES_BITS; - if (playerIndexOffset >= m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size()) + if (playerIndexOffset >= m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size()) return false; uint64 mask = uint64(1) << (area->AreaBit % PLAYER_EXPLORED_ZONES_BITS); - return (m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][playerIndexOffset] & mask) != 0; + return (m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][playerIndexOffset] & mask) != 0; } void Player::UpdateZoneAndAreaId() @@ -13312,7 +13317,8 @@ void Player::OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 me PlayerInteractionType::Renown, PlayerInteractionType::BlackMarketAuctioneer, PlayerInteractionType::PerksProgramVendor, PlayerInteractionType::ProfessionsCraftingOrder, PlayerInteractionType::Professions, PlayerInteractionType::ProfessionsCustomerOrder, PlayerInteractionType::TraitSystem, PlayerInteractionType::BarbersChoice, PlayerInteractionType::MajorFactionRenown, - PlayerInteractionType::PersonalTabardVendor + PlayerInteractionType::PersonalTabardVendor, PlayerInteractionType::ForgeMaster, PlayerInteractionType::CharacterBanker, + PlayerInteractionType::AccountBanker }; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[AsUnderlyingType(gossipOptionNpc)]; @@ -18931,10 +18937,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetLootSpecId()); ss.str(""); - for (size_t i = 0; i < m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) + for (size_t i = 0; i < m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) { - ss << uint32(m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; - ss << uint32((m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; + ss << uint32(m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; + ss << uint32((m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; } stmt->setString(index++, ss.str()); @@ -19071,10 +19077,10 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetLootSpecId()); ss.str(""); - for (size_t i = 0; i < m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) + for (size_t i = 0; i < m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX].size(); ++i) { - ss << uint32(m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; - ss << uint32((m_activePlayerData->DataFlags[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; + ss << uint32(m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] & 0xFFFFFFFF) << ' '; + ss << uint32((m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX][i] >> 32) & 0xFFFFFFFF) << ' '; } stmt->setString(index++, ss.str()); @@ -24129,9 +24135,10 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks { UF::ObjectData::Base objMask; UF::UnitData::Base unitMask; - for (uint32 i = 0; i < creature->m_unitData->NpcFlags.size(); ++i) - if (creature->m_unitData->NpcFlags[i]) - unitMask.MarkChanged(&UF::UnitData::NpcFlags, i); + if (creature->m_unitData->NpcFlags) + unitMask.MarkChanged(&UF::UnitData::NpcFlags); + if (creature->m_unitData->NpcFlags2) + unitMask.MarkChanged(&UF::UnitData::NpcFlags2); if (objMask.GetChangesMask().IsAnySet() || unitMask.GetChangesMask().IsAnySet()) creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this); @@ -24152,7 +24159,7 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks { UF::ObjectData::Base objMask; UF::UnitData::Base unitMask; - unitMask.MarkChanged(&UF::UnitData::NpcFlags, 0); // NpcFlags[0] has UNIT_NPC_FLAG_SPELLCLICK + unitMask.MarkChanged(&UF::UnitData::NpcFlags); // NpcFlags has UNIT_NPC_FLAG_SPELLCLICK creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this); break; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 12b642dc159..ebbe8672933 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -133,7 +133,7 @@ enum PlayerSkillsConstants enum PlayerDataFlagConstants { - PLAYER_EXPLORED_ZONES_BITS = UF::size_of_value_type<decltype(UF::ActivePlayerData::DataFlags)::value_type>() * 8, + PLAYER_EXPLORED_ZONES_BITS = UF::size_of_value_type<decltype(UF::BitVectors::Values)::value_type>() * 8, PLAYER_DATA_FLAG_EXPLORED_ZONES_INDEX = 1, PLAYER_DATA_FLAG_CHARACTER_DATA_INDEX = 2, @@ -641,7 +641,7 @@ enum PlayerSlots // first slot for item stored (in any way in player m_items data) PLAYER_SLOT_START = 0, // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 141, + PLAYER_SLOT_END = 146, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -764,6 +764,12 @@ enum EquipableSpellSlots EQUIPABLE_SPELL_WEAPON_SLOT4 = 226, }; +enum AccountBankBagSlots +{ + ACCOUNT_BANK_SLOT_BAG_START = 141, + ACCOUNT_BANK_SLOT_BAG_END = 146 +}; + struct ItemPosCount { ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) { } @@ -800,11 +806,10 @@ enum NewWorldReason enum InstanceResetWarningType { - RAID_INSTANCE_WARNING_HOURS = 1, // WARNING! %s is scheduled to reset in %d hour(s). - RAID_INSTANCE_WARNING_MIN = 2, // WARNING! %s is scheduled to reset in %d minute(s)! - RAID_INSTANCE_WARNING_MIN_SOON = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location! - RAID_INSTANCE_WELCOME = 4, // Welcome to %s. This raid instance is scheduled to reset in %s. - RAID_INSTANCE_EXPIRED = 5 + RAID_INSTANCE_WELCOME = 1, // Welcome to %s. Instance locks are scheduled to expire in %s. + RAID_INSTANCE_EXPIRED = 2, // Your instance lock for %s has expired. + RAID_INSTANCE_WELCOME_DAILY = 3, // Welcome to %s. The daily reset is scheduled to occur in %s and will reset this instance. + RAID_INSTANCE_WARNING_TIME = 4, // any GlobalStrings tag that has 1 formattable argument, like DELVES_INSTANCE_RESET_WARNING }; // PLAYER_FIELD_ARENA_TEAM_INFO_1_1 offsets @@ -2170,6 +2175,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> TeleportLocation& GetTeleportDest() { return m_teleport_dest; } uint32 GetTeleportOptions() const { return m_teleport_options; } + int32 GetNewWorldCounter() const { return m_newWorldCounter; } bool IsBeingTeleported() const { return IsBeingTeleportedNear() || IsBeingTeleportedFar(); } bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near; } bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far; } @@ -3111,6 +3117,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> // Current teleport data TeleportLocation m_teleport_dest; TeleportToOptions m_teleport_options; + int32 m_newWorldCounter; bool mSemaphoreTeleport_Near; bool mSemaphoreTeleport_Far; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 283c2976af6..1778983f002 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8935,9 +8935,10 @@ void Unit::SetInteractionAllowedInCombat(bool interactionAllowed) void Unit::UpdateNearbyPlayersInteractions() { - for (uint32 i = 0; i < m_unitData->NpcFlags.size(); ++i) - if (m_unitData->NpcFlags[i]) - ForceUpdateFieldChange(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, i)); + if (m_unitData->NpcFlags) + ForceUpdateFieldChange(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags)); + if (m_unitData->NpcFlags2) + ForceUpdateFieldChange(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags2)); } //====================================================================== diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 70f93726f13..333f81a5bc3 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -984,17 +984,17 @@ class TC_GAME_API Unit : public WorldObject MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackType attType) const; - NPCFlags GetNpcFlags() const { return NPCFlags(m_unitData->NpcFlags[0]); } - bool HasNpcFlag(NPCFlags flags) const { return (m_unitData->NpcFlags[0] & flags) != 0; } - void SetNpcFlag(NPCFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 0), flags); } - void RemoveNpcFlag(NPCFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 0), flags); } - void ReplaceAllNpcFlags(NPCFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 0), flags); } - - NPCFlags2 GetNpcFlags2() const { return NPCFlags2(m_unitData->NpcFlags[1]); } - bool HasNpcFlag2(NPCFlags2 flags) const { return (m_unitData->NpcFlags[1] & flags) != 0; } - void SetNpcFlag2(NPCFlags2 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 1), flags); } - void RemoveNpcFlag2(NPCFlags2 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 1), flags); } - void ReplaceAllNpcFlags2(NPCFlags2 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 1), flags); } + NPCFlags GetNpcFlags() const { return NPCFlags(*m_unitData->NpcFlags); } + bool HasNpcFlag(NPCFlags flags) const { return (m_unitData->NpcFlags & flags) != 0; } + void SetNpcFlag(NPCFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags), flags); } + void RemoveNpcFlag(NPCFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags), flags); } + void ReplaceAllNpcFlags(NPCFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags), flags); } + + NPCFlags2 GetNpcFlags2() const { return NPCFlags2(*m_unitData->NpcFlags2); } + bool HasNpcFlag2(NPCFlags2 flags) const { return (m_unitData->NpcFlags2 & flags) != 0; } + void SetNpcFlag2(NPCFlags2 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags2), flags); } + void RemoveNpcFlag2(NPCFlags2 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags2), flags); } + void ReplaceAllNpcFlags2(NPCFlags2 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags2), flags); } bool IsVendor() const { return HasNpcFlag(UNIT_NPC_FLAG_VENDOR); } bool IsTrainer() const { return HasNpcFlag(UNIT_NPC_FLAG_TRAINER); } diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index fddafa9cbc5..dd557a841d9 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -296,7 +296,7 @@ enum NPCFlags : uint32 UNIT_NPC_FLAG_NONE = 0x00000000, UNIT_NPC_FLAG_GOSSIP = 0x00000001, // TITLE has gossip menu DESCRIPTION 100% UNIT_NPC_FLAG_QUESTGIVER = 0x00000002, // TITLE is quest giver DESCRIPTION 100% - UNIT_NPC_FLAG_UNK1 = 0x00000004, + UNIT_NPC_FLAG_ACCOUNT_BANKER = 0x00000004, // TITLE is account banker UNIT_NPC_FLAG_UNK2 = 0x00000008, UNIT_NPC_FLAG_TRAINER = 0x00000010, // TITLE is trainer DESCRIPTION 100% UNIT_NPC_FLAG_TRAINER_CLASS = 0x00000020, // TITLE is class trainer DESCRIPTION 100% diff --git a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp index db67d97fc35..ba419d8a6b2 100644 --- a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp +++ b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp @@ -421,7 +421,7 @@ TC_API_EXPORT EnumText EnumUtils<NPCFlags>::ToString(NPCFlags value) case UNIT_NPC_FLAG_NONE: return { "UNIT_NPC_FLAG_NONE", "UNIT_NPC_FLAG_NONE", "" }; case UNIT_NPC_FLAG_GOSSIP: return { "UNIT_NPC_FLAG_GOSSIP", "has gossip menu", "100%" }; case UNIT_NPC_FLAG_QUESTGIVER: return { "UNIT_NPC_FLAG_QUESTGIVER", "is quest giver", "100%" }; - case UNIT_NPC_FLAG_UNK1: return { "UNIT_NPC_FLAG_UNK1", "UNIT_NPC_FLAG_UNK1", "" }; + case UNIT_NPC_FLAG_ACCOUNT_BANKER: return { "UNIT_NPC_FLAG_ACCOUNT_BANKER", "UNIT_NPC_FLAG_ACCOUNT_BANKER", "" }; case UNIT_NPC_FLAG_UNK2: return { "UNIT_NPC_FLAG_UNK2", "UNIT_NPC_FLAG_UNK2", "" }; case UNIT_NPC_FLAG_TRAINER: return { "UNIT_NPC_FLAG_TRAINER", "is trainer", "100%" }; case UNIT_NPC_FLAG_TRAINER_CLASS: return { "UNIT_NPC_FLAG_TRAINER_CLASS", "is class trainer", "100%" }; @@ -466,7 +466,7 @@ TC_API_EXPORT NPCFlags EnumUtils<NPCFlags>::FromIndex(size_t index) case 0: return UNIT_NPC_FLAG_NONE; case 1: return UNIT_NPC_FLAG_GOSSIP; case 2: return UNIT_NPC_FLAG_QUESTGIVER; - case 3: return UNIT_NPC_FLAG_UNK1; + case 3: return UNIT_NPC_FLAG_ACCOUNT_BANKER; case 4: return UNIT_NPC_FLAG_UNK2; case 5: return UNIT_NPC_FLAG_TRAINER; case 6: return UNIT_NPC_FLAG_TRAINER_CLASS; @@ -508,7 +508,7 @@ TC_API_EXPORT size_t EnumUtils<NPCFlags>::ToIndex(NPCFlags value) case UNIT_NPC_FLAG_NONE: return 0; case UNIT_NPC_FLAG_GOSSIP: return 1; case UNIT_NPC_FLAG_QUESTGIVER: return 2; - case UNIT_NPC_FLAG_UNK1: return 3; + case UNIT_NPC_FLAG_ACCOUNT_BANKER: return 3; case UNIT_NPC_FLAG_UNK2: return 4; case UNIT_NPC_FLAG_TRAINER: return 5; case UNIT_NPC_FLAG_TRAINER_CLASS: return 6; diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 9e848565193..0ac7591c034 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -74,7 +74,7 @@ bool ContentTuningParams::GenerateDataForUnits<Creature, Player>(Creature* attac PlayerLevelDelta = target->m_activePlayerData->ScalingPlayerLevelDelta; PlayerItemLevel = target->GetAverageItemLevel(); TargetItemLevel = 0; - ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; + ScalingHealthItemLevelCurveID = 0; // target->m_unitData->ScalingHealthItemLevelCurveID; TargetLevel = target->GetLevel(); Expansion = creatureDifficulty->HealthScalingExpansion; TargetScalingLevelDelta = int8(attacker->m_unitData->ScalingLevelDelta); @@ -91,7 +91,7 @@ bool ContentTuningParams::GenerateDataForUnits<Player, Creature>(Player* attacke PlayerLevelDelta = attacker->m_activePlayerData->ScalingPlayerLevelDelta; PlayerItemLevel = attacker->GetAverageItemLevel(); TargetItemLevel = 0; - ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; + ScalingHealthItemLevelCurveID = 0; // target->m_unitData->ScalingHealthItemLevelCurveID; TargetLevel = target->GetLevel(); Expansion = creatureDifficulty->HealthScalingExpansion; TargetScalingLevelDelta = int8(target->m_unitData->ScalingLevelDelta); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 7f570f938b6..f505ee0a8af 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -227,7 +227,7 @@ public: flag = target->m_unitData->Flags; if (!npcflag) - memcpy(&npcflag.emplace(), target->m_unitData->NpcFlags.begin(), sizeof(uint64)); + npcflag = (uint64(target->GetNpcFlags2()) << 32) | target->GetNpcFlags(); if (!dyflag) dyflag = target->m_objectData->DynamicFlags; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index d572ce44765..376fd0da969 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -481,8 +481,7 @@ public: CreatureTemplate const* cInfo = target->GetCreatureTemplate(); uint32 faction = target->GetFaction(); - uint64 npcflags; - memcpy(&npcflags, target->m_unitData->NpcFlags.begin(), sizeof(npcflags)); + uint64 npcflags = (uint64(target->GetNpcFlags2()) << 32) | target->GetNpcFlags(); uint64 mechanicImmuneMask = 0; if (CreatureImmunities const* immunities = SpellMgr::GetCreatureImmunities(cInfo->CreatureImmunitiesId)) mechanicImmuneMask = immunities->Mechanic.to_ullong(); @@ -551,7 +550,7 @@ public: if (cInfo->flags_extra & flag) handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag); - handler->PSendSysMessage(LANG_NPCINFO_NPC_FLAGS, target->m_unitData->NpcFlags[0]); + handler->PSendSysMessage(LANG_NPCINFO_NPC_FLAGS, uint32(target->GetNpcFlags())); for (NPCFlags flag : EnumUtils::Iterate<NPCFlags>()) if (target->HasNpcFlag(flag)) handler->PSendSysMessage("* %s (0x%X)", EnumUtils::ToTitle(flag), flag); |
