aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DBCEnums.h5
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h8
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h108
-rw-r--r--src/server/game/Entities/Item/Item.cpp3
-rw-r--r--src/server/game/Entities/Item/ItemDefines.h8
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateField.h53
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp1023
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h463
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h36
-rw-r--r--src/server/game/Entities/Player/Player.cpp41
-rw-r--r--src/server/game/Entities/Player/Player.h21
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp7
-rw-r--r--src/server/game/Entities/Unit/Unit.h22
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h2
-rw-r--r--src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp6
-rw-r--r--src/server/game/Server/Packets/CombatLogPacketsCommon.cpp4
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp5
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);