aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-08-02 13:25:41 +0200
committerShauren <shauren.trinity@gmail.com>2024-08-02 13:25:41 +0200
commite59eef5432c7b70679d33f4911c88d0f7d75fd39 (patch)
treefe9bce9c82496589facec3719b3f2943d8295e76 /src/server/game/Entities
parent7fb9168d57f378075b0f6692ea7ad822c1d8e43d (diff)
Core/PacketIO: Updated to 11.0.0
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp14
-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/Container/Bag.h4
-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.cpp1472
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h737
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h36
-rw-r--r--src/server/game/Entities/Player/Player.cpp71
-rw-r--r--src/server/game/Entities/Player/Player.h21
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp41
-rw-r--r--src/server/game/Entities/Unit/Unit.h23
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h2
-rw-r--r--src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp6
17 files changed, 1693 insertions, 915 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 9b3a159e2f7..205b4440041 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1450,7 +1450,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.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 142b379770c..818bff310e0 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -246,7 +246,10 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
packet.GossipGUID = objectGUID;
packet.GossipID = _gossipMenu.GetMenuId();
if (GossipMenuAddon const* addon = sObjectMgr->GetGossipMenuAddon(packet.GossipID))
+ {
packet.FriendshipFactionID = addon->FriendshipFactionID;
+ packet.LfgDungeonsID = addon->LfgDungeonsID;
+ }
if (NpcText const* text = sObjectMgr->GetNpcText(titleTextId))
packet.BroadcastTextID = Trinity::Containers::SelectRandomWeightedContainerElement(text->Data, [](NpcTextData const& data) { return data.Probability; })->BroadcastTextID;
@@ -283,8 +286,11 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
text.QuestType = item.QuestIcon;
text.QuestFlags[0] = quest->GetFlags();
text.QuestFlags[1] = quest->GetFlagsEx();
+ text.QuestFlags[2] = quest->GetFlagsEx2();
text.Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
+ text.ResetByScheduler = quest->IsResetByScheduler();
text.Important = quest->IsImportant();
+ text.Meta = quest->IsMeta();
text.QuestTitle = quest->GetLogTitle();
LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex();
@@ -411,8 +417,11 @@ void PlayerMenu::SendQuestGiverQuestListMessage(Object* questgiver)
text.QuestType = questMenuItem.QuestIcon;
text.QuestFlags[0] = quest->GetFlags();
text.QuestFlags[1] = quest->GetFlagsEx();
+ text.QuestFlags[2] = quest->GetFlagsEx2();
text.Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
+ text.ResetByScheduler = quest->IsResetByScheduler();
text.Important = quest->IsImportant();
+ text.Meta = quest->IsMeta();
text.QuestTitle = quest->GetLogTitle();
LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex();
@@ -478,6 +487,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
+ packet.QuestInfoID = quest->GetQuestInfoID();
packet.QuestSessionBonus = 0; //quest->GetQuestSessionBonus(); // this is only sent while quest session is active
packet.AutoLaunched = autoLaunched;
packet.DisplayPopup = displayPopup;
@@ -510,9 +520,9 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
for (uint32 i = 0; i < objs.size(); ++i)
{
packet.Objectives[i].ID = objs[i].ID;
+ packet.Objectives[i].Type = objs[i].Type;
packet.Objectives[i].ObjectID = objs[i].ObjectID;
packet.Objectives[i].Amount = objs[i].Amount;
- packet.Objectives[i].Type = objs[i].Type;
}
_session->SendPacket(packet.Write());
@@ -582,6 +592,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
offer.QuestID = quest->GetQuestId();
offer.AutoLaunched = autoLaunched;
offer.SuggestedPartyMembers = quest->GetSuggestedPlayers();
+ offer.QuestInfoID = quest->GetQuestInfoID();
for (uint32 i = 0; i < QUEST_EMOTE_COUNT && quest->OfferRewardEmote[i]; ++i)
offer.Emotes.emplace_back(quest->OfferRewardEmote[i], quest->OfferRewardEmoteDelay[i]);
@@ -656,6 +667,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
packet.QuestFlags[1] = quest->GetFlagsEx();
packet.QuestFlags[2] = quest->GetFlagsEx2();
packet.SuggestPartyMembers = quest->GetSuggestedPlayers();
+ packet.QuestInfoID = quest->GetQuestInfoID();
// incomplete: FD
// incomplete quest with item objective but item objective is complete DD
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/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h
index 6ade3bdf974..acd69e9a265 100644
--- a/src/server/game/Entities/Item/Container/Bag.h
+++ b/src/server/game/Entities/Item/Container/Bag.h
@@ -18,8 +18,8 @@
#ifndef TRINITY_BAG_H
#define TRINITY_BAG_H
-// Maximum 36 Slots ((CONTAINER_END - CONTAINER_FIELD_SLOT_1)/2
-#define MAX_BAG_SIZE 36 // 2.0.12
+// Maximum 98 Slots ((CONTAINER_END - CONTAINER_FIELD_SLOT_1)/2
+#define MAX_BAG_SIZE 98 // 11.0.0
#include "Item.h"
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 fd868cfc649..03d1948444c 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -663,7 +663,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 fdad7e0d18e..a845123c3ee 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)
@@ -804,7 +813,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 fa0453e412d..8b54351c6c3 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -126,20 +126,20 @@ void ItemEnchantment::ClearChangesMask()
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
@@ -286,7 +286,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))
{
@@ -424,7 +424,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[13])
{
- data << int32(Context);
+ data << uint8(Context);
}
if (changesMask[14])
{
@@ -506,7 +506,7 @@ void ItemData::ClearChangesMask()
void ContainerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Bag const* owner, Player const* receiver) const
{
- for (uint32 i = 0; i < 36; ++i)
+ for (uint32 i = 0; i < 98; ++i)
{
data << Slots[i];
}
@@ -520,8 +520,8 @@ void ContainerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fiel
void ContainerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Bag const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlocksMask(0), 2);
- for (uint32 i = 0; i < 2; ++i)
+ data.WriteBits(changesMask.GetBlocksMask(0), 4);
+ for (uint32 i = 0; i < 4; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -535,7 +535,7 @@ void ContainerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool
}
if (changesMask[2])
{
- for (uint32 i = 0; i < 36; ++i)
+ for (uint32 i = 0; i < 98; ++i)
{
if (changesMask[3 + i])
{
@@ -930,10 +930,8 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const
void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
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);
@@ -1093,8 +1091,8 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << float(MinRangedDamage);
data << float(MaxRangedDamage);
data << float(ManaCostMultiplier);
- data << float(MaxHealthModifier);
}
+ data << float(MaxHealthModifier);
data << float(HoverHeight);
data << int32(MinItemLevelCutoff);
data << int32(MinItemLevel);
@@ -1116,10 +1114,12 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint32(ChannelObjects.size());
data << int32(FlightCapabilityID);
data << float(GlideEventSpeedDivisor);
- data << uint32(Field_308);
- data << uint32(Field_30C);
+ data << uint32(MaxHealthModifierFlatNeg);
+ data << uint32(MaxHealthModifierFlatPos);
data << uint32(SilencedSchoolMask);
data << uint32(CurrentAreaID);
+ data << float(Field_31C);
+ data << float(Field_320);
data << NameplateAttachToGUID;
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
{
@@ -1133,11 +1133,13 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
{
data << ChannelObjects[i];
}
+ data.WriteBit(Field_314);
+ data.FlushBits();
}
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xF0FFBFFFu, 0x000F7FFFu, 0xFFFFFF01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1145,16 +1147,16 @@ 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, 7>{ 0x00002000u, 0x0F004000u, 0xFFF08000u, 0x000000FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu };
+ allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0x78020000u, 0xFF840000u, 0x000003FEu, 0xFC000020u, 0xFFE03FFFu, 0x0FFFFFFFu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u };
+ allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFC000020u, 0x00003FFFu, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x0F000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u };
+ allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x78000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00003FC0u };
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xF0FFBFFFu, 0x000F7FFFu, 0xFFFFFF01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -1170,6 +1172,10 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
{
if (changesMask[1])
{
+ data.WriteBit(Field_314);
+ }
+ if (changesMask[2])
+ {
data.WriteBits(StateWorldEffectIDs->size(), 32);
for (uint32 i = 0; i < StateWorldEffectIDs->size(); ++i)
{
@@ -1180,21 +1186,21 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[2])
+ if (changesMask[3])
{
if (!ignoreNestedChangesMask)
PassiveSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PassiveSpells.size(), data);
}
- if (changesMask[3])
+ if (changesMask[4])
{
if (!ignoreNestedChangesMask)
WorldEffects.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WorldEffects.size(), data);
}
- if (changesMask[4])
+ if (changesMask[5])
{
if (!ignoreNestedChangesMask)
ChannelObjects.WriteUpdateMask(data);
@@ -1205,7 +1211,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[2])
+ if (changesMask[3])
{
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
{
@@ -1215,7 +1221,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[3])
+ if (changesMask[4])
{
for (uint32 i = 0; i < WorldEffects.size(); ++i)
{
@@ -1225,7 +1231,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[4])
+ if (changesMask[5])
{
for (uint32 i = 0; i < ChannelObjects.size(); ++i)
{
@@ -1235,593 +1241,606 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[5])
- {
- data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver));
- }
if (changesMask[6])
{
- data << uint32(StateSpellVisualID);
+ data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[7])
{
- data << uint32(StateAnimID);
+ data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[8])
{
- data << uint32(StateAnimKitID);
+ data << uint32(ViewerDependentValue<NpcFlags2Tag>::GetValue(this, owner, receiver));
}
if (changesMask[9])
{
- data << uint32(StateWorldEffectsQuestObjectiveID);
+ data << uint32(StateSpellVisualID);
}
if (changesMask[10])
{
- data << int32(SpellOverrideNameID);
+ data << uint32(StateAnimID);
}
if (changesMask[11])
{
- data << Charm;
+ data << uint32(StateAnimKitID);
}
if (changesMask[12])
{
- data << Summon;
+ data << uint32(StateWorldEffectsQuestObjectiveID);
}
if (changesMask[13])
{
- data << Critter;
+ data << int32(SpellOverrideNameID);
}
if (changesMask[14])
{
- data << CharmedBy;
+ data << Charm;
}
if (changesMask[15])
{
- data << SummonedBy;
+ data << Summon;
}
if (changesMask[16])
{
- data << CreatedBy;
+ data << Critter;
}
if (changesMask[17])
{
- data << DemonCreator;
+ data << CharmedBy;
}
if (changesMask[18])
{
- data << LookAtControllerTarget;
+ data << SummonedBy;
}
if (changesMask[19])
{
- data << Target;
+ data << CreatedBy;
}
if (changesMask[20])
{
- data << BattlePetCompanionGUID;
+ data << DemonCreator;
}
if (changesMask[21])
{
- data << uint64(BattlePetDBID);
+ data << LookAtControllerTarget;
}
if (changesMask[22])
{
- ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << Target;
}
if (changesMask[23])
{
- data << int8(SpellEmpowerStage);
+ data << BattlePetCompanionGUID;
}
if (changesMask[24])
{
- data << uint32(SummonedByHomeRealm);
+ data << uint64(BattlePetDBID);
}
if (changesMask[25])
{
- data << uint8(Race);
+ ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[26])
{
- data << uint8(ClassId);
+ data << int8(SpellEmpowerStage);
}
if (changesMask[27])
{
- data << uint8(PlayerClassId);
+ data << uint32(SummonedByHomeRealm);
}
if (changesMask[28])
{
- data << uint8(Sex);
+ data << uint8(Race);
}
if (changesMask[29])
{
- data << uint8(DisplayPower);
+ data << uint8(ClassId);
}
if (changesMask[30])
{
- data << uint32(OverrideDisplayPowerID);
+ data << uint8(PlayerClassId);
}
if (changesMask[31])
{
- data << int64(Health);
+ data << uint8(Sex);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
- data << int64(MaxHealth);
+ data << uint8(DisplayPower);
}
if (changesMask[34])
{
- data << int32(Level);
+ data << uint32(OverrideDisplayPowerID);
}
if (changesMask[35])
{
- data << int32(EffectiveLevel);
+ data << int64(Health);
}
if (changesMask[36])
{
- data << int32(ContentTuningID);
+ data << int64(MaxHealth);
}
if (changesMask[37])
{
- data << int32(ScalingLevelMin);
+ data << int32(Level);
}
if (changesMask[38])
{
- data << int32(ScalingLevelMax);
+ data << int32(EffectiveLevel);
}
if (changesMask[39])
{
- data << int32(ScalingLevelDelta);
+ data << int32(ContentTuningID);
}
if (changesMask[40])
{
- data << int32(ScalingFactionGroup);
+ data << int32(ScalingLevelMin);
}
if (changesMask[41])
{
- data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver));
+ data << int32(ScalingLevelMax);
}
if (changesMask[42])
{
- data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
+ data << int32(ScalingLevelDelta);
}
if (changesMask[43])
{
- data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver));
+ data << int32(ScalingFactionGroup);
}
if (changesMask[44])
{
- data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
+ data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver));
}
if (changesMask[45])
{
- data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
+ data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[46])
{
- data << uint32(RangedAttackRoundBaseTime);
+ data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver));
}
if (changesMask[47])
{
- data << float(BoundingRadius);
+ data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
}
if (changesMask[48])
{
- data << float(CombatReach);
+ data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
}
if (changesMask[49])
{
- data << float(DisplayScale);
+ data << uint32(RangedAttackRoundBaseTime);
}
if (changesMask[50])
{
- data << int32(CreatureFamily);
+ data << float(BoundingRadius);
}
if (changesMask[51])
{
- data << int32(CreatureType);
+ data << float(CombatReach);
}
if (changesMask[52])
{
- data << int32(NativeDisplayID);
+ data << float(DisplayScale);
}
if (changesMask[53])
{
- data << float(NativeXDisplayScale);
+ data << int32(CreatureFamily);
}
if (changesMask[54])
{
- data << int32(MountDisplayID);
+ data << int32(CreatureType);
}
if (changesMask[55])
{
- data << int32(CosmeticMountDisplayID);
+ data << int32(NativeDisplayID);
}
if (changesMask[56])
{
- data << float(MinDamage);
+ data << float(NativeXDisplayScale);
}
if (changesMask[57])
{
- data << float(MaxDamage);
+ data << int32(MountDisplayID);
}
if (changesMask[58])
{
- data << float(MinOffHandDamage);
+ data << int32(CosmeticMountDisplayID);
}
if (changesMask[59])
{
- data << float(MaxOffHandDamage);
+ data << float(MinDamage);
}
if (changesMask[60])
{
- data << uint8(StandState);
+ data << float(MaxDamage);
}
if (changesMask[61])
{
- data << uint8(PetTalentPoints);
+ data << float(MinOffHandDamage);
}
if (changesMask[62])
{
- data << uint8(VisFlags);
+ data << float(MaxOffHandDamage);
}
if (changesMask[63])
{
- data << uint8(AnimTier);
+ data << uint8(StandState);
}
}
if (changesMask[64])
{
if (changesMask[65])
{
- data << uint32(PetNumber);
+ data << uint8(PetTalentPoints);
}
if (changesMask[66])
{
- data << uint32(PetNameTimestamp);
+ data << uint8(VisFlags);
}
if (changesMask[67])
{
- data << uint32(PetExperience);
+ data << uint8(AnimTier);
}
if (changesMask[68])
{
- data << uint32(PetNextLevelExperience);
+ data << uint32(PetNumber);
}
if (changesMask[69])
{
- data << float(ModCastingSpeed);
+ data << uint32(PetNameTimestamp);
}
if (changesMask[70])
{
- data << float(ModCastingSpeedNeg);
+ data << uint32(PetExperience);
}
if (changesMask[71])
{
- data << float(ModSpellHaste);
+ data << uint32(PetNextLevelExperience);
}
if (changesMask[72])
{
- data << float(ModHaste);
+ data << float(ModCastingSpeed);
}
if (changesMask[73])
{
- data << float(ModRangedHaste);
+ data << float(ModCastingSpeedNeg);
}
if (changesMask[74])
{
- data << float(ModHasteRegen);
+ data << float(ModSpellHaste);
}
if (changesMask[75])
{
- data << float(ModTimeRate);
+ data << float(ModHaste);
}
if (changesMask[76])
{
- data << int32(CreatedBySpell);
+ data << float(ModRangedHaste);
}
if (changesMask[77])
{
- data << int32(EmoteState);
+ data << float(ModHasteRegen);
}
if (changesMask[78])
{
- data << int32(BaseMana);
+ data << float(ModTimeRate);
}
if (changesMask[79])
{
- data << int32(BaseHealth);
+ data << int32(CreatedBySpell);
}
if (changesMask[80])
{
- data << uint8(SheatheState);
+ data << int32(EmoteState);
}
if (changesMask[81])
{
- data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver));
+ data << int32(BaseMana);
}
if (changesMask[82])
{
- data << uint8(PetFlags);
+ data << int32(BaseHealth);
}
if (changesMask[83])
{
- data << uint8(ShapeshiftForm);
+ data << uint8(SheatheState);
}
if (changesMask[84])
{
- data << int32(AttackPower);
+ data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[85])
{
- data << int32(AttackPowerModPos);
+ data << uint8(PetFlags);
}
if (changesMask[86])
{
- data << int32(AttackPowerModNeg);
+ data << uint8(ShapeshiftForm);
}
if (changesMask[87])
{
- data << float(AttackPowerMultiplier);
+ data << int32(AttackPower);
}
if (changesMask[88])
{
- data << int32(AttackPowerModSupport);
+ data << int32(AttackPowerModPos);
}
if (changesMask[89])
{
- data << int32(RangedAttackPower);
+ data << int32(AttackPowerModNeg);
}
if (changesMask[90])
{
- data << int32(RangedAttackPowerModPos);
+ data << float(AttackPowerMultiplier);
}
if (changesMask[91])
{
- data << int32(RangedAttackPowerModNeg);
+ data << int32(AttackPowerModSupport);
}
if (changesMask[92])
{
- data << float(RangedAttackPowerMultiplier);
+ data << int32(RangedAttackPower);
}
if (changesMask[93])
{
- data << int32(RangedAttackPowerModSupport);
+ data << int32(RangedAttackPowerModPos);
}
if (changesMask[94])
{
- data << int32(MainHandWeaponAttackPower);
+ data << int32(RangedAttackPowerModNeg);
}
if (changesMask[95])
{
- data << int32(OffHandWeaponAttackPower);
+ data << float(RangedAttackPowerMultiplier);
}
}
if (changesMask[96])
{
if (changesMask[97])
{
- data << int32(RangedWeaponAttackPower);
+ data << int32(RangedAttackPowerModSupport);
}
if (changesMask[98])
{
- data << int32(SetAttackSpeedAura);
+ data << int32(MainHandWeaponAttackPower);
}
if (changesMask[99])
{
- data << float(Lifesteal);
+ data << int32(OffHandWeaponAttackPower);
}
if (changesMask[100])
{
- data << float(MinRangedDamage);
+ data << int32(RangedWeaponAttackPower);
}
if (changesMask[101])
{
- data << float(MaxRangedDamage);
+ data << int32(SetAttackSpeedAura);
}
if (changesMask[102])
{
- data << float(ManaCostMultiplier);
+ data << float(Lifesteal);
}
if (changesMask[103])
{
- data << float(MaxHealthModifier);
+ data << float(MinRangedDamage);
}
if (changesMask[104])
{
- data << float(HoverHeight);
+ data << float(MaxRangedDamage);
}
if (changesMask[105])
{
- data << int32(MinItemLevelCutoff);
+ data << float(ManaCostMultiplier);
}
if (changesMask[106])
{
- data << int32(MinItemLevel);
+ data << float(MaxHealthModifier);
}
if (changesMask[107])
{
- data << int32(MaxItemLevel);
+ data << float(HoverHeight);
}
if (changesMask[108])
{
- data << int32(AzeriteItemLevel);
+ data << int32(MinItemLevelCutoff);
}
if (changesMask[109])
{
- data << int32(WildBattlePetLevel);
+ data << int32(MinItemLevel);
}
if (changesMask[110])
{
- data << int32(BattlePetCompanionExperience);
+ data << int32(MaxItemLevel);
}
if (changesMask[111])
{
- data << uint32(BattlePetCompanionNameTimestamp);
+ data << int32(AzeriteItemLevel);
}
if (changesMask[112])
{
- data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver));
+ data << int32(WildBattlePetLevel);
}
if (changesMask[113])
{
- data << int32(ScaleDuration);
+ data << int32(BattlePetCompanionExperience);
}
if (changesMask[114])
{
- data << int32(LooksLikeMountID);
+ data << uint32(BattlePetCompanionNameTimestamp);
}
if (changesMask[115])
{
- data << int32(LooksLikeCreatureID);
+ data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[116])
{
- data << int32(LookAtControllerID);
+ data << int32(ScaleDuration);
}
if (changesMask[117])
{
- data << int32(PerksVendorItemID);
+ data << int32(LooksLikeMountID);
}
if (changesMask[118])
{
- data << int32(TaxiNodesID);
+ data << int32(LooksLikeCreatureID);
}
if (changesMask[119])
{
- data << GuildGUID;
+ data << int32(LookAtControllerID);
}
if (changesMask[120])
{
- data << int32(FlightCapabilityID);
+ data << int32(PerksVendorItemID);
}
if (changesMask[121])
{
- data << float(GlideEventSpeedDivisor);
+ data << int32(TaxiNodesID);
}
if (changesMask[122])
{
- data << uint32(Field_308);
+ data << GuildGUID;
}
if (changesMask[123])
{
- data << uint32(Field_30C);
+ data << int32(FlightCapabilityID);
}
if (changesMask[124])
{
- data << uint32(SilencedSchoolMask);
+ data << float(GlideEventSpeedDivisor);
}
if (changesMask[125])
{
- data << uint32(CurrentAreaID);
+ data << uint32(MaxHealthModifierFlatNeg);
}
if (changesMask[126])
{
- data << NameplateAttachToGUID;
+ data << uint32(MaxHealthModifierFlatPos);
+ }
+ if (changesMask[127])
+ {
+ data << uint32(SilencedSchoolMask);
}
}
- if (changesMask[127])
+ if (changesMask[128])
{
- for (uint32 i = 0; i < 2; ++i)
+ if (changesMask[129])
{
- if (changesMask[128 + i])
- {
- data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
- }
+ data << uint32(CurrentAreaID);
+ }
+ if (changesMask[130])
+ {
+ data << float(Field_31C);
+ }
+ if (changesMask[131])
+ {
+ data << float(Field_320);
+ }
+ if (changesMask[132])
+ {
+ data << NameplateAttachToGUID;
}
}
- if (changesMask[130])
+ if (changesMask[133])
{
for (uint32 i = 0; i < 10; ++i)
{
- if (changesMask[131 + i])
+ if (changesMask[134 + i])
{
data << int32(Power[i]);
}
- if (changesMask[141 + i])
+ if (changesMask[144 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[151 + i])
+ if (changesMask[154 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[161 + i])
+ if (changesMask[164 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[171])
+ if (changesMask[174])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[172 + i])
+ if (changesMask[175 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[175])
+ if (changesMask[178])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[176 + i])
+ if (changesMask[179 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[178])
+ if (changesMask[181])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[179 + i])
+ if (changesMask[182 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[183 + i])
+ if (changesMask[186 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[187 + i])
+ if (changesMask[190 + i])
{
data << int32(StatNegBuff[i]);
}
- if (changesMask[191 + i])
+ if (changesMask[194 + i])
{
data << int32(StatSupportBuff[i]);
}
}
}
- if (changesMask[195])
+ if (changesMask[198])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[196 + i])
+ if (changesMask[199 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[203 + i])
+ if (changesMask[206 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[210 + i])
+ if (changesMask[213 + i])
{
data << int32(ManaCostModifier[i]);
}
}
}
+ data.FlushBits();
}
void UnitData::ClearChangesMask()
{
+ Base::ClearChangesMask(Field_314);
Base::ClearChangesMask(StateWorldEffectIDs);
Base::ClearChangesMask(PassiveSpells);
Base::ClearChangesMask(WorldEffects);
Base::ClearChangesMask(ChannelObjects);
Base::ClearChangesMask(DisplayID);
+ Base::ClearChangesMask(NpcFlags);
+ Base::ClearChangesMask(NpcFlags2);
Base::ClearChangesMask(StateSpellVisualID);
Base::ClearChangesMask(StateAnimID);
Base::ClearChangesMask(StateAnimKitID);
@@ -1935,12 +1954,13 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(FlightCapabilityID);
Base::ClearChangesMask(GlideEventSpeedDivisor);
- Base::ClearChangesMask(Field_308);
- Base::ClearChangesMask(Field_30C);
+ Base::ClearChangesMask(MaxHealthModifierFlatNeg);
+ Base::ClearChangesMask(MaxHealthModifierFlatPos);
Base::ClearChangesMask(SilencedSchoolMask);
Base::ClearChangesMask(CurrentAreaID);
+ Base::ClearChangesMask(Field_31C);
+ Base::ClearChangesMask(Field_320);
Base::ClearChangesMask(NameplateAttachToGUID);
- Base::ClearChangesMask(NpcFlags);
Base::ClearChangesMask(Power);
Base::ClearChangesMask(MaxPower);
Base::ClearChangesMask(PowerRegenFlatModifier);
@@ -2885,6 +2905,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);
@@ -3418,11 +3525,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);
@@ -3442,6 +3582,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();
}
@@ -3452,7 +3596,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])
{
@@ -3463,6 +3607,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])
@@ -3479,47 +3630,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)
{
@@ -3527,9 +3691,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);
@@ -3541,6 +3705,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);
@@ -3624,6 +3789,70 @@ void CraftingOrderItem::ClearChangesMask()
_changesMask.ResetAll();
}
+void CraftingOrderCustomer::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << CustomerGUID;
+ data << CustomerAccountGUID;
+}
+
+void CraftingOrderCustomer::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 2);
+
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ data << CustomerGUID;
+ }
+ if (changesMask[1])
+ {
+ data << CustomerAccountGUID;
+ }
+}
+
+void CraftingOrderCustomer::ClearChangesMask()
+{
+ Base::ClearChangesMask(CustomerGUID);
+ Base::ClearChangesMask(CustomerAccountGUID);
+ _changesMask.ResetAll();
+}
+
+void CraftingOrderNpcCustomer::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int64(NpcCraftingOrderCustomerID);
+ data << int32(Field_8);
+}
+
+void CraftingOrderNpcCustomer::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 2);
+
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ data << int64(NpcCraftingOrderCustomerID);
+ }
+ if (changesMask[1])
+ {
+ data << int32(Field_8);
+ }
+}
+
+void CraftingOrderNpcCustomer::ClearChangesMask()
+{
+ Base::ClearChangesMask(NpcCraftingOrderCustomerID);
+ Base::ClearChangesMask(Field_8);
+ _changesMask.ResetAll();
+}
+
void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(Field_0);
@@ -3637,12 +3866,14 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe
data << int64(TipAmount);
data << int64(ConsortiumCut);
data << uint32(Flags);
- data << CustomerGUID;
- data << CustomerAccountGUID;
data << CrafterGUID;
data << PersonalCrafterGUID;
+ data << int32(NpcCraftingOrderSetID);
+ data << int32(NpcTreasureID);
data << uint32(Reagents.size());
data.WriteBits(CustomerNotes->size(), 10);
+ data.WriteBits(Customer.has_value(), 1);
+ data.WriteBits(NpcCustomer.has_value(), 1);
data.WriteBits(OutputItem.has_value(), 1);
data.WriteBits(OutputItemData.has_value(), 1);
data.FlushBits();
@@ -3651,6 +3882,14 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe
Reagents[i].WriteCreate(data, owner, receiver);
}
data.WriteString(CustomerNotes);
+ if (Customer.has_value())
+ {
+ Customer->WriteCreate(data, owner, receiver);
+ }
+ if (NpcCustomer.has_value())
+ {
+ NpcCustomer->WriteCreate(data, owner, receiver);
+ }
if (OutputItem.has_value())
{
OutputItem->WriteCreate(data, owner, receiver);
@@ -3668,7 +3907,7 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
if (ignoreChangesMask)
changesMask.SetAll();
- data.WriteBits(changesMask.GetBlock(0), 24);
+ data.WriteBits(changesMask.GetBlock(0), 26);
if (changesMask[0])
{
@@ -3705,13 +3944,13 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
{
data << int32(SkillLineAbilityID);
}
- }
- if (changesMask[5])
- {
- if (changesMask[6])
+ if (changesMask[5])
{
data << uint8(OrderState);
}
+ }
+ if (changesMask[6])
+ {
if (changesMask[7])
{
data << uint8(OrderType);
@@ -3724,17 +3963,17 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
{
data << int64(ExpirationTime);
}
- }
- if (changesMask[10])
- {
- if (changesMask[11])
+ if (changesMask[10])
{
data << int64(ClaimEndTime);
}
- if (changesMask[12])
+ if (changesMask[11])
{
data << int64(TipAmount);
}
+ }
+ if (changesMask[12])
+ {
if (changesMask[13])
{
data << int64(ConsortiumCut);
@@ -3743,44 +3982,68 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
{
data << uint32(Flags);
}
- }
- if (changesMask[15])
- {
+ if (changesMask[15])
+ {
+ data << CrafterGUID;
+ }
if (changesMask[16])
{
- data << CustomerGUID;
+ data << PersonalCrafterGUID;
}
if (changesMask[17])
{
- data << CustomerAccountGUID;
+ data << int32(NpcCraftingOrderSetID);
}
- if (changesMask[18])
+ }
+ if (changesMask[18])
+ {
+ if (changesMask[19])
{
- data << CrafterGUID;
+ data << int32(NpcTreasureID);
}
- if (changesMask[19])
+ if (changesMask[20])
{
- data << PersonalCrafterGUID;
+ data.WriteBits(CustomerNotes->size(), 10);
}
+ data.WriteBits(Customer.has_value(), 1);
+ data.WriteBits(NpcCustomer.has_value(), 1);
+ data.WriteBits(OutputItem.has_value(), 1);
}
- if (changesMask[20])
+ if (changesMask[24])
{
- if (changesMask[21])
+ data.WriteBits(OutputItemData.has_value(), 1);
+ }
+ if (changesMask[18])
+ {
+ if (changesMask[20])
{
- data.WriteBits(CustomerNotes->size(), 10);
data.WriteString(CustomerNotes);
}
- data.WriteBits(OutputItem.has_value(), 1);
- data.WriteBits(OutputItemData.has_value(), 1);
- data.FlushBits();
+ if (changesMask[21])
+ {
+ if (Customer.has_value())
+ {
+ Customer->WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
if (changesMask[22])
{
+ if (NpcCustomer.has_value())
+ {
+ NpcCustomer->WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ if (changesMask[23])
+ {
if (OutputItem.has_value())
{
OutputItem->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
- if (changesMask[23])
+ }
+ if (changesMask[24])
+ {
+ if (changesMask[25])
{
if (OutputItemData.has_value())
{
@@ -3805,11 +4068,13 @@ void CraftingOrderData::ClearChangesMask()
Base::ClearChangesMask(TipAmount);
Base::ClearChangesMask(ConsortiumCut);
Base::ClearChangesMask(Flags);
- Base::ClearChangesMask(CustomerGUID);
- Base::ClearChangesMask(CustomerAccountGUID);
Base::ClearChangesMask(CrafterGUID);
Base::ClearChangesMask(PersonalCrafterGUID);
+ Base::ClearChangesMask(NpcCraftingOrderSetID);
+ Base::ClearChangesMask(NpcTreasureID);
Base::ClearChangesMask(CustomerNotes);
+ Base::ClearChangesMask(Customer);
+ Base::ClearChangesMask(NpcCustomer);
Base::ClearChangesMask(OutputItem);
Base::ClearChangesMask(OutputItemData);
_changesMask.ResetAll();
@@ -3937,6 +4202,50 @@ void PersonalCraftingOrderCount::ClearChangesMask()
_changesMask.ResetAll();
}
+void NPCCraftingOrderInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << uint64(Field_0);
+ data << int32(Field_8);
+ data << int32(Field_C);
+ data << int32(Field_10);
+}
+
+void NPCCraftingOrderInfo::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 << uint64(Field_0);
+ }
+ if (changesMask[1])
+ {
+ data << int32(Field_8);
+ }
+ if (changesMask[2])
+ {
+ data << int32(Field_C);
+ }
+ if (changesMask[3])
+ {
+ data << int32(Field_10);
+ }
+}
+
+void NPCCraftingOrderInfo::ClearChangesMask()
+{
+ Base::ClearChangesMask(Field_0);
+ Base::ClearChangesMask(Field_8);
+ Base::ClearChangesMask(Field_C);
+ Base::ClearChangesMask(Field_10);
+ _changesMask.ResetAll();
+}
+
void CategoryCooldownMod::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(SpellCategoryID);
@@ -4138,6 +4447,134 @@ void CollectableSourceTrackedData::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 WalkInData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int32(MapID);
+ data << int64(Field_8);
+ data << Field_18;
+ data.WriteBits(Type, 1);
+ data.FlushBits();
+}
+
+void WalkInData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ data << int32(MapID);
+ data << int64(Field_8);
+ data << Field_18;
+ data.WriteBits(Type, 1);
+ data.FlushBits();
+}
+
+bool WalkInData::operator==(WalkInData const& right) const
+{
+ return MapID == right.MapID
+ && Field_8 == right.Field_8
+ && Type == right.Type
+ && Field_18 == right.Field_18;
+}
+
+void DelveData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int32(Field_0);
+ data << int64(Field_8);
+ data << int32(Field_10);
+ data << int32(SpellID);
+ data << uint32(Owners.size());
+ for (uint32 i = 0; i < Owners.size(); ++i)
+ {
+ data << Owners[i];
+ }
+ data.WriteBits(Started, 1);
+ data.FlushBits();
+}
+
+void DelveData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ data.FlushBits();
+ data << int32(Field_0);
+ data << int64(Field_8);
+ data << int32(Field_10);
+ data << int32(SpellID);
+ data << uint32(Owners.size());
+ for (uint32 i = 0; i < Owners.size(); ++i)
+ {
+ data << Owners[i];
+ }
+ data.WriteBits(Started, 1);
+ data.FlushBits();
+}
+
+bool DelveData::operator==(DelveData const& right) const
+{
+ return Owners == right.Owners
+ && Field_0 == right.Field_0
+ && Field_8 == right.Field_8
+ && Field_10 == right.Field_10
+ && SpellID == right.SpellID
+ && Started == right.Started;
+}
+
void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int16(ResearchProjectID);
@@ -4155,7 +4592,7 @@ bool Research::operator==(Research const& right) const
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
- for (uint32 i = 0; i < 227; ++i)
+ for (uint32 i = 0; i < 232; ++i)
{
data << InvSlots[i];
}
@@ -4163,6 +4600,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);
@@ -4193,14 +4631,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << float(VersatilityBonus);
data << float(PvpPowerDamage);
data << float(PvpPowerHealing);
- for (uint32 i = 0; i < 9; ++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);
@@ -4278,7 +4711,7 @@ 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]);
}
@@ -4286,6 +4719,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << int32(HonorNextLevel);
data << int32(PerksProgramCurrency);
data << uint8(NumBankSlots);
+ data << uint8(NumAccountBankTabs);
for (uint32 i = 0; i < 1; ++i)
{
data << uint32(ResearchSites[i].size());
@@ -4333,6 +4767,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << uint32(ActiveCombatTraitConfigID);
data << uint32(CraftingOrders.size());
data << uint32(PersonalCraftingOrderCounts.size());
+ data << uint32(NpcCraftingOrders.size());
data << uint32(CategoryCooldownMods.size());
data << uint32(WeeklySpellUses.size());
for (uint32 i = 0; i < 17; ++i)
@@ -4431,6 +4866,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
PersonalCraftingOrderCounts[i].WriteCreate(data, owner, receiver);
}
+ for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i)
+ {
+ NpcCraftingOrders[i].WriteCreate(data, owner, receiver);
+ }
for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)
{
CategoryCooldownMods[i].WriteCreate(data, owner, receiver);
@@ -4452,6 +4891,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data.WriteBit(HasPerksProgramPendingReward);
data.WriteBits(QuestSession.has_value(), 1);
data.WriteBits(PetStable.has_value(), 1);
+ data.WriteBits(AccountBankTabSettings.size(), 3);
+ data.WriteBits(WalkInData.has_value(), 1);
+ data.WriteBits(DelveData.has_value(), 1);
data.FlushBits();
ResearchHistory->WriteCreate(data, owner, receiver);
if (QuestSession.has_value())
@@ -4461,6 +4903,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << FrozenPerksVendorItem;
Field_1410->WriteCreate(data, owner, receiver);
data << DungeonScore;
+ 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 < PvpInfo.size(); ++i)
{
PvpInfo[i].WriteCreate(data, owner, receiver);
@@ -4481,6 +4931,18 @@ 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);
+ }
+ if (WalkInData.has_value())
+ {
+ WalkInData->WriteCreate(data, owner, receiver);
+ }
+ if (DelveData.has_value())
+ {
+ DelveData->WriteCreate(data, owner, receiver);
+ }
data.FlushBits();
}
@@ -4493,8 +4955,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), 14);
- for (uint32 i = 0; i < 46; ++i)
+ data.WriteBits(changesMask.GetBlocksMask(1), 15);
+ for (uint32 i = 0; i < 47; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -4531,39 +4993,21 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
else
WriteCompleteDynamicFieldUpdateMask(KnownTitles.size(), data);
}
- }
- if (changesMask[36])
- {
- for (uint32 i = 0; i < 9; ++i)
+ if (changesMask[8])
{
- if (changesMask[37])
- {
- if (!ignoreNestedChangesMask)
- DataFlags[i].WriteUpdateMask(data);
- else
- WriteCompleteDynamicFieldUpdateMask(DataFlags[i].size(), data);
- }
+ if (!ignoreNestedChangesMask)
+ CharacterDataElements.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(CharacterDataElements.size(), data);
}
- }
- if (changesMask[36])
- {
- for (uint32 i = 0; i < 9; ++i)
+ if (changesMask[9])
{
- if (changesMask[37])
- {
- 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[0])
- {
- if (changesMask[8])
+ if (changesMask[10])
{
if (!ignoreNestedChangesMask)
PvpInfo.WriteUpdateMask(data);
@@ -4571,11 +5015,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);
}
}
- if (changesMask[38])
+ if (changesMask[40])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[39])
+ if (changesMask[41])
{
if (!ignoreNestedChangesMask)
ResearchSites[i].WriteUpdateMask(data);
@@ -4584,11 +5028,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[40])
+ if (changesMask[42])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[41])
+ if (changesMask[43])
{
if (!ignoreNestedChangesMask)
ResearchSiteProgress[i].WriteUpdateMask(data);
@@ -4597,11 +5041,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[42])
+ if (changesMask[44])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[43])
+ if (changesMask[45])
{
if (!ignoreNestedChangesMask)
Research[i].WriteUpdateMask(data);
@@ -4610,11 +5054,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[38])
+ if (changesMask[40])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[39])
+ if (changesMask[41])
{
for (uint32 j = 0; j < ResearchSites[i].size(); ++j)
{
@@ -4626,11 +5070,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[40])
+ if (changesMask[42])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[41])
+ if (changesMask[43])
{
for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)
{
@@ -4642,11 +5086,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[42])
+ if (changesMask[44])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[43])
+ if (changesMask[45])
{
for (uint32 j = 0; j < Research[i].size(); ++j)
{
@@ -4661,185 +5105,192 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[9])
+ if (changesMask[11])
{
if (!ignoreNestedChangesMask)
DailyQuestsCompleted.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data);
}
- if (changesMask[10])
+ if (changesMask[12])
{
if (!ignoreNestedChangesMask)
AvailableQuestLineXQuestIDs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data);
}
- if (changesMask[11])
+ if (changesMask[13])
{
if (!ignoreNestedChangesMask)
Heirlooms.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data);
}
- if (changesMask[12])
+ if (changesMask[14])
{
if (!ignoreNestedChangesMask)
HeirloomFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data);
}
- if (changesMask[13])
+ if (changesMask[15])
{
if (!ignoreNestedChangesMask)
Toys.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Toys.size(), data);
}
- if (changesMask[14])
+ if (changesMask[16])
{
if (!ignoreNestedChangesMask)
ToyFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data);
}
- if (changesMask[15])
+ if (changesMask[17])
{
if (!ignoreNestedChangesMask)
Transmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data);
}
- if (changesMask[16])
+ if (changesMask[18])
{
if (!ignoreNestedChangesMask)
ConditionalTransmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data);
}
- if (changesMask[17])
+ if (changesMask[19])
{
if (!ignoreNestedChangesMask)
SelfResSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data);
}
- if (changesMask[18])
+ if (changesMask[20])
{
if (!ignoreNestedChangesMask)
RuneforgePowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data);
}
- if (changesMask[19])
+ if (changesMask[21])
{
if (!ignoreNestedChangesMask)
TransmogIllusions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data);
}
- if (changesMask[20])
+ if (changesMask[22])
{
if (!ignoreNestedChangesMask)
CharacterRestrictions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data);
}
- if (changesMask[21])
+ if (changesMask[23])
{
if (!ignoreNestedChangesMask)
SpellPctModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data);
}
- if (changesMask[22])
+ if (changesMask[24])
{
if (!ignoreNestedChangesMask)
SpellFlatModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data);
}
- if (changesMask[23])
+ if (changesMask[25])
{
if (!ignoreNestedChangesMask)
MawPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data);
}
- if (changesMask[24])
+ if (changesMask[26])
{
if (!ignoreNestedChangesMask)
MultiFloorExploration.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data);
}
- if (changesMask[25])
+ if (changesMask[27])
{
if (!ignoreNestedChangesMask)
RecipeProgression.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data);
}
- if (changesMask[26])
+ if (changesMask[28])
{
if (!ignoreNestedChangesMask)
ReplayedQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data);
}
- if (changesMask[27])
+ if (changesMask[29])
{
if (!ignoreNestedChangesMask)
TaskQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data);
}
- if (changesMask[28])
+ if (changesMask[30])
{
if (!ignoreNestedChangesMask)
DisabledSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data);
}
- if (changesMask[29])
+ if (changesMask[31])
{
if (!ignoreNestedChangesMask)
TraitConfigs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data);
}
- if (changesMask[30])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[33])
{
if (!ignoreNestedChangesMask)
CraftingOrders.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);
}
- if (changesMask[31])
+ if (changesMask[34])
{
if (!ignoreNestedChangesMask)
PersonalCraftingOrderCounts.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data);
}
- }
- if (changesMask[32])
- {
- if (changesMask[33])
+ if (changesMask[35])
+ {
+ if (!ignoreNestedChangesMask)
+ NpcCraftingOrders.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(NpcCraftingOrders.size(), data);
+ }
+ if (changesMask[36])
{
if (!ignoreNestedChangesMask)
CategoryCooldownMods.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data);
}
- if (changesMask[34])
+ if (changesMask[37])
{
if (!ignoreNestedChangesMask)
WeeklySpellUses.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data);
}
- if (changesMask[35])
+ if (changesMask[38])
{
if (!ignoreNestedChangesMask)
TrackedCollectableSources.WriteUpdateMask(data);
@@ -4860,7 +5311,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[9])
+ if (changesMask[11])
{
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
@@ -4870,7 +5321,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[10])
+ if (changesMask[12])
{
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
@@ -4880,7 +5331,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[11])
+ if (changesMask[13])
{
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
@@ -4890,7 +5341,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[12])
+ if (changesMask[14])
{
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
@@ -4900,7 +5351,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[13])
+ if (changesMask[15])
{
for (uint32 i = 0; i < Toys.size(); ++i)
{
@@ -4910,7 +5361,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[14])
+ if (changesMask[16])
{
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
@@ -4920,7 +5371,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[15])
+ if (changesMask[17])
{
for (uint32 i = 0; i < Transmog.size(); ++i)
{
@@ -4930,7 +5381,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[16])
+ if (changesMask[18])
{
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
@@ -4940,7 +5391,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[17])
+ if (changesMask[19])
{
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
@@ -4950,7 +5401,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[18])
+ if (changesMask[20])
{
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
@@ -4960,7 +5411,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[19])
+ if (changesMask[21])
{
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
@@ -4970,7 +5421,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[21])
+ if (changesMask[23])
{
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
@@ -4980,7 +5431,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[22])
+ if (changesMask[24])
{
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
@@ -4990,7 +5441,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[23])
+ if (changesMask[25])
{
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
@@ -5000,7 +5451,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[24])
+ if (changesMask[26])
{
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
@@ -5010,7 +5461,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[25])
+ if (changesMask[27])
{
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
@@ -5020,7 +5471,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[26])
+ if (changesMask[28])
{
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
@@ -5030,7 +5481,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[27])
+ if (changesMask[29])
{
for (uint32 i = 0; i < TaskQuests.size(); ++i)
{
@@ -5040,7 +5491,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[28])
+ if (changesMask[30])
{
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
@@ -5050,7 +5501,10 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[31])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[34])
{
for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
{
@@ -5060,10 +5514,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- }
- if (changesMask[32])
- {
- if (changesMask[33])
+ if (changesMask[35])
+ {
+ for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i)
+ {
+ if (NpcCraftingOrders.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ NpcCraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[36])
{
for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)
{
@@ -5073,7 +5534,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[34])
+ if (changesMask[37])
{
for (uint32 i = 0; i < WeeklySpellUses.size(); ++i)
{
@@ -5083,7 +5544,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[35])
+ if (changesMask[38])
{
for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)
{
@@ -5093,11 +5554,38 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
+ if (changesMask[39])
+ {
+ if (!ignoreNestedChangesMask)
+ AccountBankTabSettings.WriteUpdateMask(data, 3);
+ else
+ WriteCompleteDynamicFieldUpdateMask(AccountBankTabSettings.size(), data, 3);
+ }
}
if (changesMask[0])
{
if (changesMask[8])
{
+ for (uint32 i = 0; i < CharacterDataElements.size(); ++i)
+ {
+ if (CharacterDataElements.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ CharacterDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[9])
+ {
+ for (uint32 i = 0; i < AccountDataElements.size(); ++i)
+ {
+ if (AccountDataElements.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ AccountDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[10])
+ {
for (uint32 i = 0; i < PvpInfo.size(); ++i)
{
if (PvpInfo.HasChanged(i) || ignoreNestedChangesMask)
@@ -5106,7 +5594,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[20])
+ if (changesMask[22])
{
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
@@ -5116,7 +5604,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[29])
+ if (changesMask[31])
{
for (uint32 i = 0; i < TraitConfigs.size(); ++i)
{
@@ -5126,7 +5614,10 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[30])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[33])
{
for (uint32 i = 0; i < CraftingOrders.size(); ++i)
{
@@ -5136,533 +5627,574 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- }
- if (changesMask[32])
- {
- if (changesMask[44])
+ if (changesMask[39])
+ {
+ for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i)
+ {
+ if (AccountBankTabSettings.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ AccountBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[46])
{
data << FarsightObject;
}
- if (changesMask[45])
+ if (changesMask[47])
{
data << SummonedBattlePetGUID;
}
- if (changesMask[46])
+ if (changesMask[48])
{
data << uint64(Coinage);
}
- if (changesMask[47])
+ if (changesMask[49])
+ {
+ data << uint64(AccountBankCoinage);
+ }
+ if (changesMask[50])
{
data << int32(XP);
}
- if (changesMask[48])
+ if (changesMask[51])
{
data << int32(NextLevelXP);
}
- if (changesMask[49])
+ if (changesMask[52])
{
data << int32(TrialXP);
}
- if (changesMask[50])
+ if (changesMask[53])
{
Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[51])
+ if (changesMask[54])
{
data << int32(CharacterPoints);
}
- if (changesMask[52])
+ if (changesMask[55])
{
data << int32(MaxTalentTiers);
}
- if (changesMask[53])
+ if (changesMask[56])
{
data << uint32(TrackCreatureMask);
}
- if (changesMask[54])
+ if (changesMask[57])
{
data << float(MainhandExpertise);
}
- if (changesMask[55])
+ if (changesMask[58])
{
data << float(OffhandExpertise);
}
- if (changesMask[56])
+ if (changesMask[59])
{
data << float(RangedExpertise);
}
- if (changesMask[57])
+ if (changesMask[60])
{
data << float(CombatRatingExpertise);
}
- if (changesMask[58])
+ if (changesMask[61])
{
data << float(BlockPercentage);
}
- if (changesMask[59])
+ if (changesMask[62])
{
data << float(DodgePercentage);
}
- if (changesMask[60])
+ if (changesMask[63])
{
data << float(DodgePercentageFromAttribute);
}
- if (changesMask[61])
+ if (changesMask[64])
{
data << float(ParryPercentage);
}
- if (changesMask[62])
+ if (changesMask[65])
{
data << float(ParryPercentageFromAttribute);
}
- if (changesMask[63])
+ if (changesMask[66])
{
data << float(CritPercentage);
}
- if (changesMask[64])
+ if (changesMask[67])
{
data << float(RangedCritPercentage);
}
- if (changesMask[65])
+ if (changesMask[68])
{
data << float(OffhandCritPercentage);
}
- if (changesMask[66])
+ if (changesMask[69])
{
data << float(SpellCritPercentage);
}
- if (changesMask[67])
+ }
+ if (changesMask[70])
+ {
+ if (changesMask[71])
{
data << int32(ShieldBlock);
}
- if (changesMask[68])
+ if (changesMask[72])
{
data << float(ShieldBlockCritPercentage);
}
- if (changesMask[69])
+ if (changesMask[73])
{
data << float(Mastery);
}
- if (changesMask[70])
+ if (changesMask[74])
{
data << float(Speed);
}
- if (changesMask[71])
+ if (changesMask[75])
{
data << float(Avoidance);
}
- }
- if (changesMask[72])
- {
- if (changesMask[73])
+ if (changesMask[76])
{
data << float(Sturdiness);
}
- if (changesMask[74])
+ if (changesMask[77])
{
data << int32(Versatility);
}
- if (changesMask[75])
+ if (changesMask[78])
{
data << float(VersatilityBonus);
}
- if (changesMask[76])
+ if (changesMask[79])
{
data << float(PvpPowerDamage);
}
- if (changesMask[77])
+ if (changesMask[80])
{
data << float(PvpPowerHealing);
}
- if (changesMask[78])
+ if (changesMask[81])
+ {
+ BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[82])
{
data << int32(ModHealingDonePos);
}
- if (changesMask[79])
+ if (changesMask[83])
{
data << float(ModHealingPercent);
}
- if (changesMask[80])
+ if (changesMask[84])
{
data << float(ModPeriodicHealingDonePercent);
}
- if (changesMask[81])
+ if (changesMask[85])
{
data << float(ModSpellPowerPercent);
}
- if (changesMask[82])
+ if (changesMask[86])
{
data << float(ModResiliencePercent);
}
- if (changesMask[83])
+ if (changesMask[87])
{
data << float(OverrideSpellPowerByAPPercent);
}
- if (changesMask[84])
+ if (changesMask[88])
{
data << float(OverrideAPBySpellPowerPercent);
}
- if (changesMask[85])
+ if (changesMask[89])
{
data << int32(ModTargetResistance);
}
- if (changesMask[86])
+ if (changesMask[90])
{
data << int32(ModTargetPhysicalResistance);
}
- if (changesMask[87])
+ if (changesMask[91])
{
data << uint32(LocalFlags);
}
- if (changesMask[88])
+ if (changesMask[92])
{
data << uint8(GrantableLevels);
}
- if (changesMask[89])
+ if (changesMask[93])
{
data << uint8(MultiActionBars);
}
- if (changesMask[90])
+ if (changesMask[94])
{
data << uint8(LifetimeMaxRank);
}
- if (changesMask[91])
+ if (changesMask[95])
{
data << uint8(NumRespecs);
}
- if (changesMask[92])
+ if (changesMask[96])
{
data << uint32(PvpMedals);
}
- if (changesMask[93])
+ if (changesMask[97])
{
data << uint16(TodayHonorableKills);
}
- if (changesMask[94])
+ if (changesMask[98])
{
data << uint16(YesterdayHonorableKills);
}
- if (changesMask[95])
+ if (changesMask[99])
{
data << uint32(LifetimeHonorableKills);
}
- if (changesMask[96])
+ if (changesMask[100])
{
data << int32(WatchedFactionIndex);
}
- if (changesMask[97])
+ if (changesMask[101])
{
data << int32(MaxLevel);
}
- if (changesMask[98])
+ }
+ if (changesMask[102])
+ {
+ if (changesMask[103])
{
data << int32(ScalingPlayerLevelDelta);
}
- if (changesMask[99])
+ if (changesMask[104])
{
data << int32(MaxCreatureScalingLevel);
}
- if (changesMask[100])
+ if (changesMask[105])
{
data << int32(PetSpellPower);
}
- if (changesMask[101])
+ if (changesMask[106])
{
data << float(UiHitModifier);
}
- if (changesMask[102])
+ if (changesMask[107])
{
data << float(UiSpellHitModifier);
}
- if (changesMask[103])
+ if (changesMask[108])
{
data << int32(HomeRealmTimeOffset);
}
- }
- if (changesMask[104])
- {
- if (changesMask[105])
+ if (changesMask[109])
{
data << float(ModPetHaste);
}
- if (changesMask[106])
+ if (changesMask[110])
{
data << int8(JailersTowerLevelMax);
}
- if (changesMask[107])
+ if (changesMask[111])
{
data << int8(JailersTowerLevel);
}
- if (changesMask[108])
+ if (changesMask[112])
{
data << uint8(LocalRegenFlags);
}
- if (changesMask[109])
+ if (changesMask[113])
{
data << uint8(AuraVision);
}
- if (changesMask[110])
+ if (changesMask[114])
{
data << uint8(NumBackpackSlots);
}
- if (changesMask[111])
+ if (changesMask[115])
{
data << int32(OverrideSpellsID);
}
- if (changesMask[112])
+ if (changesMask[116])
{
data << uint16(LootSpecID);
}
- if (changesMask[113])
+ if (changesMask[117])
{
data << uint32(OverrideZonePVPType);
}
- if (changesMask[114])
+ if (changesMask[118])
{
data << int32(Honor);
}
- if (changesMask[115])
+ if (changesMask[119])
{
data << int32(HonorNextLevel);
}
- if (changesMask[116])
+ if (changesMask[120])
{
data << int32(PerksProgramCurrency);
}
- if (changesMask[117])
+ if (changesMask[121])
{
data << uint8(NumBankSlots);
}
if (changesMask[122])
{
+ data << uint8(NumAccountBankTabs);
+ }
+ if (changesMask[127])
+ {
data << int32(UiChromieTimeExpansionID);
}
- if (changesMask[123])
+ if (changesMask[128])
{
data << int32(TimerunningSeasonID);
}
- if (changesMask[124])
+ if (changesMask[129])
{
data << int32(TransportServerTime);
}
- if (changesMask[125])
+ if (changesMask[130])
{
data << uint32(WeeklyRewardsPeriodSinceOrigin);
}
- if (changesMask[126])
+ if (changesMask[131])
{
data << int16(DEBUGSoulbindConduitRank);
}
- if (changesMask[128])
+ if (changesMask[133])
{
data << uint32(ActiveCombatTraitConfigID);
}
- if (changesMask[129])
+ }
+ if (changesMask[134])
+ {
+ if (changesMask[135])
{
data << int32(ItemUpgradeHighOnehandWeaponItemID);
}
- if (changesMask[130])
+ if (changesMask[136])
{
data << int32(ItemUpgradeHighFingerItemID);
}
- if (changesMask[131])
+ if (changesMask[137])
{
data << float(ItemUpgradeHighFingerWatermark);
}
- if (changesMask[132])
+ if (changesMask[138])
{
data << int32(ItemUpgradeHighTrinketItemID);
}
- if (changesMask[133])
+ if (changesMask[139])
{
data << float(ItemUpgradeHighTrinketWatermark);
}
- if (changesMask[134])
+ if (changesMask[140])
{
data << uint64(LootHistoryInstanceID);
}
- }
- if (changesMask[136])
- {
- if (changesMask[137])
+ if (changesMask[142])
{
data << uint8(RequiredMountCapabilityFlags);
}
}
- if (changesMask[104])
+ if (changesMask[102])
{
data.WriteBits(QuestSession.has_value(), 1);
+ }
+ if (changesMask[134])
+ {
data.WriteBits(PetStable.has_value(), 1);
+ data.WriteBits(WalkInData.has_value(), 1);
+ data.WriteBits(DelveData.has_value(), 1);
}
data.FlushBits();
- if (changesMask[104])
+ if (changesMask[102])
{
- if (changesMask[118])
+ if (changesMask[123])
{
ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[120])
+ if (changesMask[125])
{
if (QuestSession.has_value())
{
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
- if (changesMask[119])
+ if (changesMask[124])
{
data << FrozenPerksVendorItem;
}
- if (changesMask[121])
+ if (changesMask[126])
{
Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[127])
+ if (changesMask[132])
{
data << DungeonScore;
}
- if (changesMask[135])
+ }
+ if (changesMask[134])
+ {
+ if (changesMask[141])
{
if (PetStable.has_value())
{
PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
+ if (changesMask[143])
+ {
+ if (WalkInData.has_value())
+ {
+ WalkInData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ if (changesMask[144])
+ {
+ if (DelveData.has_value())
+ {
+ DelveData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
}
- if (changesMask[138])
+ if (changesMask[145])
{
- for (uint32 i = 0; i < 227; ++i)
+ for (uint32 i = 0; i < 232; ++i)
{
- if (changesMask[139 + i])
+ if (changesMask[146 + i])
{
data << InvSlots[i];
}
}
}
- if (changesMask[366])
+ if (changesMask[378])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[367 + i])
+ if (changesMask[379 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[369])
+ if (changesMask[381])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[370 + i])
+ if (changesMask[382 + i])
{
data << int32(ModDamageDonePos[i]);
}
- if (changesMask[377 + i])
+ if (changesMask[389 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
- if (changesMask[384 + i])
+ if (changesMask[396 + i])
{
data << float(ModDamageDonePercent[i]);
}
- if (changesMask[391 + i])
+ if (changesMask[403 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
- if (changesMask[398])
+ if (changesMask[410])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[399 + i])
+ if (changesMask[411 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
- if (changesMask[402 + i])
+ if (changesMask[414 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
- if (changesMask[405])
+ if (changesMask[417])
{
for (uint32 i = 0; i < 12; ++i)
{
- if (changesMask[406 + i])
+ if (changesMask[418 + i])
{
data << uint32(BuybackPrice[i]);
}
- if (changesMask[418 + i])
+ if (changesMask[430 + i])
{
data << int64(BuybackTimestamp[i]);
}
}
}
- if (changesMask[430])
+ if (changesMask[442])
{
for (uint32 i = 0; i < 32; ++i)
{
- if (changesMask[431 + i])
+ if (changesMask[443 + i])
{
data << int32(CombatRatings[i]);
}
}
}
- if (changesMask[463])
+ if (changesMask[475])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[464 + i])
+ if (changesMask[476 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
- if (changesMask[468])
+ if (changesMask[480])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[469 + i])
+ if (changesMask[481 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
- if (changesMask[471])
+ if (changesMask[483])
{
for (uint32 i = 0; i < 5; ++i)
{
- if (changesMask[472 + i])
+ if (changesMask[484 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
- if (changesMask[477])
+ if (changesMask[489])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[478 + i])
+ if (changesMask[490 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
- if (changesMask[485])
+ if (changesMask[497])
{
- for (uint32 i = 0; i < 950; ++i)
+ for (uint32 i = 0; i < 960; ++i)
{
- if (changesMask[486 + i])
+ if (changesMask[498 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
- if (changesMask[1436])
+ if (changesMask[1458])
{
for (uint32 i = 0; i < 17; ++i)
{
- if (changesMask[1437 + i])
+ if (changesMask[1459 + i])
{
data << float(ItemUpgradeHighWatermark[i]);
}
@@ -5679,7 +6211,6 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(SortBagsRightToLeft);
Base::ClearChangesMask(InsertItemsLeftToRight);
Base::ClearChangesMask(HasPerksProgramPendingReward);
- Base::ClearChangesMask(DataFlags);
Base::ClearChangesMask(ResearchSites);
Base::ClearChangesMask(ResearchSiteProgress);
Base::ClearChangesMask(Research);
@@ -5704,16 +6235,21 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(TaskQuests);
Base::ClearChangesMask(DisabledSpells);
Base::ClearChangesMask(PersonalCraftingOrderCounts);
+ Base::ClearChangesMask(NpcCraftingOrders);
Base::ClearChangesMask(CategoryCooldownMods);
Base::ClearChangesMask(WeeklySpellUses);
Base::ClearChangesMask(TrackedCollectableSources);
+ Base::ClearChangesMask(CharacterDataElements);
+ Base::ClearChangesMask(AccountDataElements);
Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(CharacterRestrictions);
Base::ClearChangesMask(TraitConfigs);
Base::ClearChangesMask(CraftingOrders);
+ Base::ClearChangesMask(AccountBankTabSettings);
Base::ClearChangesMask(FarsightObject);
Base::ClearChangesMask(SummonedBattlePetGUID);
Base::ClearChangesMask(Coinage);
+ Base::ClearChangesMask(AccountBankCoinage);
Base::ClearChangesMask(XP);
Base::ClearChangesMask(NextLevelXP);
Base::ClearChangesMask(TrialXP);
@@ -5744,6 +6280,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(VersatilityBonus);
Base::ClearChangesMask(PvpPowerDamage);
Base::ClearChangesMask(PvpPowerHealing);
+ Base::ClearChangesMask(BitVectors);
Base::ClearChangesMask(ModHealingDonePos);
Base::ClearChangesMask(ModHealingPercent);
Base::ClearChangesMask(ModPeriodicHealingDonePercent);
@@ -5783,6 +6320,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(HonorNextLevel);
Base::ClearChangesMask(PerksProgramCurrency);
Base::ClearChangesMask(NumBankSlots);
+ Base::ClearChangesMask(NumAccountBankTabs);
Base::ClearChangesMask(ResearchHistory);
Base::ClearChangesMask(FrozenPerksVendorItem);
Base::ClearChangesMask(Field_1410);
@@ -5802,6 +6340,8 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(LootHistoryInstanceID);
Base::ClearChangesMask(PetStable);
Base::ClearChangesMask(RequiredMountCapabilityFlags);
+ Base::ClearChangesMask(WalkInData);
+ Base::ClearChangesMask(DelveData);
Base::ClearChangesMask(InvSlots);
Base::ClearChangesMask(RestInfo);
Base::ClearChangesMask(ModDamageDonePos);
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 0abb78c5711..43b1c60d9a9 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -74,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;
@@ -129,7 +129,7 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41>
UpdateField<uint32, 0, 10> Durability;
UpdateField<uint32, 0, 11> MaxDurability;
UpdateField<uint32, 0, 12> CreatePlayedTime;
- UpdateField<int32, 0, 13> Context;
+ UpdateField<uint8, 0, 13> Context;
UpdateField<int64, 0, 14> CreateTime;
UpdateField<uint64, 0, 15> ArtifactXP;
UpdateField<uint8, 0, 16> ItemAppearanceModID;
@@ -148,10 +148,10 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41>
void ClearChangesMask();
};
-struct ContainerData : public IsUpdateFieldStructureTag, public HasChangesMask<39>
+struct ContainerData : public IsUpdateFieldStructureTag, public HasChangesMask<101>
{
UpdateField<uint32, 0, 1> NumSlots;
- UpdateFieldArray<ObjectGuid, 36, 2, 3> Slots;
+ UpdateFieldArray<ObjectGuid, 98, 2, 3> Slots;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Bag const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Bag const* owner, Player const* receiver) const;
@@ -257,154 +257,159 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<220>
{
- UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
- DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
- DynamicUpdateField<int32, 0, 3> WorldEffects;
- DynamicUpdateField<ObjectGuid, 0, 4> ChannelObjects;
- UpdateField<int32, 0, 5> DisplayID;
+ UpdateField<bool, 0, 1> Field_314;
+ UpdateField<std::vector<uint32>, 0, 2> StateWorldEffectIDs;
+ DynamicUpdateField<UF::PassiveSpellHistory, 0, 3> PassiveSpells;
+ DynamicUpdateField<int32, 0, 4> WorldEffects;
+ DynamicUpdateField<ObjectGuid, 0, 5> ChannelObjects;
+ UpdateField<int32, 0, 6> DisplayID;
struct DisplayIDTag : ViewerDependentValueTag<int32> {};
- UpdateField<uint32, 0, 6> StateSpellVisualID;
- UpdateField<uint32, 0, 7> StateAnimID;
- UpdateField<uint32, 0, 8> StateAnimKitID;
- UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID;
- UpdateField<int32, 0, 10> SpellOverrideNameID;
- 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<int8, 0, 23> SpellEmpowerStage;
- UpdateField<uint32, 0, 24> SummonedByHomeRealm;
- UpdateField<uint8, 0, 25> Race;
- UpdateField<uint8, 0, 26> ClassId;
- UpdateField<uint8, 0, 27> PlayerClassId;
- UpdateField<uint8, 0, 28> Sex;
- UpdateField<uint8, 0, 29> DisplayPower;
- UpdateField<uint32, 0, 30> OverrideDisplayPowerID;
- UpdateField<int64, 0, 31> Health;
- UpdateField<int64, 32, 33> MaxHealth;
- UpdateField<int32, 32, 34> Level;
- UpdateField<int32, 32, 35> EffectiveLevel;
- UpdateField<int32, 32, 36> ContentTuningID;
- UpdateField<int32, 32, 37> ScalingLevelMin;
- UpdateField<int32, 32, 38> ScalingLevelMax;
- UpdateField<int32, 32, 39> ScalingLevelDelta;
- UpdateField<int32, 32, 40> ScalingFactionGroup;
- UpdateField<int32, 32, 41> FactionTemplate;
+ UpdateField<uint32, 0, 7> NpcFlags;
+ struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
+ UpdateField<uint32, 0, 8> NpcFlags2;
+ struct NpcFlags2Tag : ViewerDependentValueTag<uint32> {};
+ UpdateField<uint32, 0, 9> StateSpellVisualID;
+ UpdateField<uint32, 0, 10> StateAnimID;
+ UpdateField<uint32, 0, 11> StateAnimKitID;
+ UpdateField<uint32, 0, 12> StateWorldEffectsQuestObjectiveID;
+ UpdateField<int32, 0, 13> SpellOverrideNameID;
+ UpdateField<ObjectGuid, 0, 14> Charm;
+ UpdateField<ObjectGuid, 0, 15> Summon;
+ UpdateField<ObjectGuid, 0, 16> Critter;
+ UpdateField<ObjectGuid, 0, 17> CharmedBy;
+ UpdateField<ObjectGuid, 0, 18> SummonedBy;
+ UpdateField<ObjectGuid, 0, 19> CreatedBy;
+ UpdateField<ObjectGuid, 0, 20> DemonCreator;
+ UpdateField<ObjectGuid, 0, 21> LookAtControllerTarget;
+ UpdateField<ObjectGuid, 0, 22> Target;
+ UpdateField<ObjectGuid, 0, 23> BattlePetCompanionGUID;
+ UpdateField<uint64, 0, 24> BattlePetDBID;
+ UpdateField<UF::UnitChannel, 0, 25> ChannelData;
+ UpdateField<int8, 0, 26> SpellEmpowerStage;
+ UpdateField<uint32, 0, 27> SummonedByHomeRealm;
+ UpdateField<uint8, 0, 28> Race;
+ UpdateField<uint8, 0, 29> ClassId;
+ UpdateField<uint8, 0, 30> PlayerClassId;
+ UpdateField<uint8, 0, 31> Sex;
+ UpdateField<uint8, 32, 33> DisplayPower;
+ UpdateField<uint32, 32, 34> OverrideDisplayPowerID;
+ UpdateField<int64, 32, 35> Health;
+ UpdateField<int64, 32, 36> MaxHealth;
+ UpdateField<int32, 32, 37> Level;
+ UpdateField<int32, 32, 38> EffectiveLevel;
+ UpdateField<int32, 32, 39> ContentTuningID;
+ UpdateField<int32, 32, 40> ScalingLevelMin;
+ UpdateField<int32, 32, 41> ScalingLevelMax;
+ UpdateField<int32, 32, 42> ScalingLevelDelta;
+ UpdateField<int32, 32, 43> ScalingFactionGroup;
+ UpdateField<int32, 32, 44> FactionTemplate;
struct FactionTemplateTag : ViewerDependentValueTag<int32> {};
- UpdateField<uint32, 32, 42> Flags;
+ UpdateField<uint32, 32, 45> Flags;
struct FlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 43> Flags2;
+ UpdateField<uint32, 32, 46> Flags2;
struct Flags2Tag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 44> Flags3;
+ UpdateField<uint32, 32, 47> Flags3;
struct Flags3Tag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 45> AuraState;
+ UpdateField<uint32, 32, 48> AuraState;
struct AuraStateTag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 46> RangedAttackRoundBaseTime;
- UpdateField<float, 32, 47> BoundingRadius;
- UpdateField<float, 32, 48> CombatReach;
- UpdateField<float, 32, 49> DisplayScale;
- UpdateField<int32, 32, 50> CreatureFamily;
- UpdateField<int32, 32, 51> CreatureType;
- UpdateField<int32, 32, 52> NativeDisplayID;
- UpdateField<float, 32, 53> NativeXDisplayScale;
- UpdateField<int32, 32, 54> MountDisplayID;
- UpdateField<int32, 32, 55> CosmeticMountDisplayID;
- UpdateField<float, 32, 56> MinDamage;
- UpdateField<float, 32, 57> MaxDamage;
- UpdateField<float, 32, 58> MinOffHandDamage;
- UpdateField<float, 32, 59> MaxOffHandDamage;
- UpdateField<uint8, 32, 60> StandState;
- UpdateField<uint8, 32, 61> PetTalentPoints;
- UpdateField<uint8, 32, 62> VisFlags;
- UpdateField<uint8, 32, 63> AnimTier;
- UpdateField<uint32, 64, 65> PetNumber;
- UpdateField<uint32, 64, 66> PetNameTimestamp;
- UpdateField<uint32, 64, 67> PetExperience;
- UpdateField<uint32, 64, 68> PetNextLevelExperience;
- UpdateField<float, 64, 69> ModCastingSpeed;
- UpdateField<float, 64, 70> ModCastingSpeedNeg;
- UpdateField<float, 64, 71> ModSpellHaste;
- UpdateField<float, 64, 72> ModHaste;
- UpdateField<float, 64, 73> ModRangedHaste;
- UpdateField<float, 64, 74> ModHasteRegen;
- UpdateField<float, 64, 75> ModTimeRate;
- UpdateField<int32, 64, 76> CreatedBySpell;
- UpdateField<int32, 64, 77> EmoteState;
- UpdateField<int32, 64, 78> BaseMana;
- UpdateField<int32, 64, 79> BaseHealth;
- UpdateField<uint8, 64, 80> SheatheState;
- UpdateField<uint8, 64, 81> PvpFlags;
+ UpdateField<uint32, 32, 49> RangedAttackRoundBaseTime;
+ UpdateField<float, 32, 50> BoundingRadius;
+ UpdateField<float, 32, 51> CombatReach;
+ UpdateField<float, 32, 52> DisplayScale;
+ UpdateField<int32, 32, 53> CreatureFamily;
+ UpdateField<int32, 32, 54> CreatureType;
+ UpdateField<int32, 32, 55> NativeDisplayID;
+ UpdateField<float, 32, 56> NativeXDisplayScale;
+ UpdateField<int32, 32, 57> MountDisplayID;
+ UpdateField<int32, 32, 58> CosmeticMountDisplayID;
+ UpdateField<float, 32, 59> MinDamage;
+ UpdateField<float, 32, 60> MaxDamage;
+ UpdateField<float, 32, 61> MinOffHandDamage;
+ UpdateField<float, 32, 62> MaxOffHandDamage;
+ UpdateField<uint8, 32, 63> StandState;
+ UpdateField<uint8, 64, 65> PetTalentPoints;
+ UpdateField<uint8, 64, 66> VisFlags;
+ UpdateField<uint8, 64, 67> AnimTier;
+ UpdateField<uint32, 64, 68> PetNumber;
+ UpdateField<uint32, 64, 69> PetNameTimestamp;
+ UpdateField<uint32, 64, 70> PetExperience;
+ UpdateField<uint32, 64, 71> PetNextLevelExperience;
+ UpdateField<float, 64, 72> ModCastingSpeed;
+ UpdateField<float, 64, 73> ModCastingSpeedNeg;
+ UpdateField<float, 64, 74> ModSpellHaste;
+ UpdateField<float, 64, 75> ModHaste;
+ UpdateField<float, 64, 76> ModRangedHaste;
+ UpdateField<float, 64, 77> ModHasteRegen;
+ UpdateField<float, 64, 78> ModTimeRate;
+ UpdateField<int32, 64, 79> CreatedBySpell;
+ UpdateField<int32, 64, 80> EmoteState;
+ UpdateField<int32, 64, 81> BaseMana;
+ UpdateField<int32, 64, 82> BaseHealth;
+ UpdateField<uint8, 64, 83> SheatheState;
+ UpdateField<uint8, 64, 84> PvpFlags;
struct PvpFlagsTag : ViewerDependentValueTag<uint8> {};
- UpdateField<uint8, 64, 82> PetFlags;
- UpdateField<uint8, 64, 83> ShapeshiftForm;
- UpdateField<int32, 64, 84> AttackPower;
- UpdateField<int32, 64, 85> AttackPowerModPos;
- UpdateField<int32, 64, 86> AttackPowerModNeg;
- UpdateField<float, 64, 87> AttackPowerMultiplier;
- UpdateField<int32, 64, 88> AttackPowerModSupport;
- UpdateField<int32, 64, 89> RangedAttackPower;
- UpdateField<int32, 64, 90> RangedAttackPowerModPos;
- UpdateField<int32, 64, 91> RangedAttackPowerModNeg;
- UpdateField<float, 64, 92> RangedAttackPowerMultiplier;
- UpdateField<int32, 64, 93> RangedAttackPowerModSupport;
- UpdateField<int32, 64, 94> MainHandWeaponAttackPower;
- UpdateField<int32, 64, 95> OffHandWeaponAttackPower;
- UpdateField<int32, 96, 97> RangedWeaponAttackPower;
- UpdateField<int32, 96, 98> SetAttackSpeedAura;
- UpdateField<float, 96, 99> Lifesteal;
- UpdateField<float, 96, 100> MinRangedDamage;
- UpdateField<float, 96, 101> MaxRangedDamage;
- UpdateField<float, 96, 102> ManaCostMultiplier;
- UpdateField<float, 96, 103> MaxHealthModifier;
- UpdateField<float, 96, 104> HoverHeight;
- UpdateField<int32, 96, 105> MinItemLevelCutoff;
- UpdateField<int32, 96, 106> MinItemLevel;
- UpdateField<int32, 96, 107> MaxItemLevel;
- UpdateField<int32, 96, 108> AzeriteItemLevel;
- UpdateField<int32, 96, 109> WildBattlePetLevel;
- UpdateField<int32, 96, 110> BattlePetCompanionExperience;
- UpdateField<uint32, 96, 111> BattlePetCompanionNameTimestamp;
- UpdateField<int32, 96, 112> InteractSpellID;
+ UpdateField<uint8, 64, 85> PetFlags;
+ UpdateField<uint8, 64, 86> ShapeshiftForm;
+ UpdateField<int32, 64, 87> AttackPower;
+ UpdateField<int32, 64, 88> AttackPowerModPos;
+ UpdateField<int32, 64, 89> AttackPowerModNeg;
+ UpdateField<float, 64, 90> AttackPowerMultiplier;
+ UpdateField<int32, 64, 91> AttackPowerModSupport;
+ UpdateField<int32, 64, 92> RangedAttackPower;
+ UpdateField<int32, 64, 93> RangedAttackPowerModPos;
+ UpdateField<int32, 64, 94> RangedAttackPowerModNeg;
+ UpdateField<float, 64, 95> RangedAttackPowerMultiplier;
+ UpdateField<int32, 96, 97> RangedAttackPowerModSupport;
+ UpdateField<int32, 96, 98> MainHandWeaponAttackPower;
+ UpdateField<int32, 96, 99> OffHandWeaponAttackPower;
+ UpdateField<int32, 96, 100> RangedWeaponAttackPower;
+ UpdateField<int32, 96, 101> SetAttackSpeedAura;
+ UpdateField<float, 96, 102> Lifesteal;
+ UpdateField<float, 96, 103> MinRangedDamage;
+ UpdateField<float, 96, 104> MaxRangedDamage;
+ UpdateField<float, 96, 105> ManaCostMultiplier;
+ UpdateField<float, 96, 106> MaxHealthModifier;
+ UpdateField<float, 96, 107> HoverHeight;
+ UpdateField<int32, 96, 108> MinItemLevelCutoff;
+ UpdateField<int32, 96, 109> MinItemLevel;
+ UpdateField<int32, 96, 110> MaxItemLevel;
+ UpdateField<int32, 96, 111> AzeriteItemLevel;
+ UpdateField<int32, 96, 112> WildBattlePetLevel;
+ UpdateField<int32, 96, 113> BattlePetCompanionExperience;
+ UpdateField<uint32, 96, 114> BattlePetCompanionNameTimestamp;
+ UpdateField<int32, 96, 115> InteractSpellID;
struct InteractSpellIDTag : ViewerDependentValueTag<int32> {};
- UpdateField<int32, 96, 113> ScaleDuration;
- UpdateField<int32, 96, 114> LooksLikeMountID;
- UpdateField<int32, 96, 115> LooksLikeCreatureID;
- UpdateField<int32, 96, 116> LookAtControllerID;
- UpdateField<int32, 96, 117> PerksVendorItemID;
- UpdateField<int32, 96, 118> TaxiNodesID;
- UpdateField<ObjectGuid, 96, 119> GuildGUID;
- UpdateField<int32, 96, 120> FlightCapabilityID;
- UpdateField<float, 96, 121> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use
- UpdateField<uint32, 96, 122> Field_308;
- UpdateField<uint32, 96, 123> Field_30C;
- UpdateField<uint32, 96, 124> SilencedSchoolMask;
- UpdateField<uint32, 96, 125> CurrentAreaID;
- UpdateField<ObjectGuid, 96, 126> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 127, 128> NpcFlags;
- struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateFieldArray<int32, 10, 130, 131> Power;
- UpdateFieldArray<int32, 10, 130, 141> MaxPower;
- UpdateFieldArray<float, 10, 130, 151> PowerRegenFlatModifier;
- UpdateFieldArray<float, 10, 130, 161> PowerRegenInterruptedFlatModifier;
- UpdateFieldArray<UF::VisibleItem, 3, 171, 172> VirtualItems;
- UpdateFieldArray<uint32, 2, 175, 176> AttackRoundBaseTime;
- UpdateFieldArray<int32, 4, 178, 179> Stats;
- UpdateFieldArray<int32, 4, 178, 183> StatPosBuff;
- UpdateFieldArray<int32, 4, 178, 187> StatNegBuff;
- UpdateFieldArray<int32, 4, 178, 191> StatSupportBuff;
- UpdateFieldArray<int32, 7, 195, 196> Resistances;
- UpdateFieldArray<int32, 7, 195, 203> BonusResistanceMods;
- UpdateFieldArray<int32, 7, 195, 210> ManaCostModifier;
+ UpdateField<int32, 96, 116> ScaleDuration;
+ UpdateField<int32, 96, 117> LooksLikeMountID;
+ UpdateField<int32, 96, 118> LooksLikeCreatureID;
+ UpdateField<int32, 96, 119> LookAtControllerID;
+ UpdateField<int32, 96, 120> PerksVendorItemID;
+ UpdateField<int32, 96, 121> TaxiNodesID;
+ UpdateField<ObjectGuid, 96, 122> GuildGUID;
+ UpdateField<int32, 96, 123> FlightCapabilityID;
+ UpdateField<float, 96, 124> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use
+ UpdateField<uint32, 96, 125> MaxHealthModifierFlatNeg;
+ UpdateField<uint32, 96, 126> MaxHealthModifierFlatPos;
+ UpdateField<uint32, 96, 127> SilencedSchoolMask;
+ UpdateField<uint32, 128, 129> CurrentAreaID;
+ UpdateField<float, 128, 130> Field_31C;
+ UpdateField<float, 128, 131> Field_320; // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount
+ UpdateField<ObjectGuid, 128, 132> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<int32, 10, 133, 134> Power;
+ UpdateFieldArray<int32, 10, 133, 144> MaxPower;
+ UpdateFieldArray<float, 10, 133, 154> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 10, 133, 164> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 174, 175> VirtualItems;
+ UpdateFieldArray<uint32, 2, 178, 179> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 181, 182> Stats;
+ UpdateFieldArray<int32, 4, 181, 186> StatPosBuff;
+ UpdateFieldArray<int32, 4, 181, 190> StatNegBuff;
+ UpdateFieldArray<int32, 4, 181, 194> StatSupportBuff;
+ UpdateFieldArray<int32, 7, 198, 199> Resistances;
+ UpdateFieldArray<int32, 7, 198, 206> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 198, 213> ManaCostModifier;
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;
@@ -574,6 +579,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;
@@ -743,17 +769,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;
@@ -775,27 +814,49 @@ struct CraftingOrderItem : public IsUpdateFieldStructureTag, public HasChangesMa
void ClearChangesMask();
};
-struct CraftingOrderData : public IsUpdateFieldStructureTag, public HasChangesMask<24>
+struct CraftingOrderCustomer : public IsUpdateFieldStructureTag, public HasChangesMask<2>
+{
+ UpdateField<ObjectGuid, -1, 0> CustomerGUID;
+ UpdateField<ObjectGuid, -1, 1> CustomerAccountGUID;
+
+ 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 CraftingOrderNpcCustomer : public IsUpdateFieldStructureTag, public HasChangesMask<2>
+{
+ UpdateField<int64, -1, 0> NpcCraftingOrderCustomerID;
+ UpdateField<int32, -1, 1> Field_8;
+
+ 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 CraftingOrderData : public IsUpdateFieldStructureTag, public HasChangesMask<26>
{
DynamicUpdateField<UF::CraftingOrderItem, 0, 1> Reagents;
UpdateField<int32, 0, 2> Field_0;
UpdateField<uint64, 0, 3> OrderID;
UpdateField<int32, 0, 4> SkillLineAbilityID;
- UpdateField<uint8, 5, 6> OrderState;
- UpdateField<uint8, 5, 7> OrderType;
- UpdateField<uint8, 5, 8> MinQuality;
- UpdateField<int64, 5, 9> ExpirationTime;
- UpdateField<int64, 10, 11> ClaimEndTime;
- UpdateField<int64, 10, 12> TipAmount;
- UpdateField<int64, 10, 13> ConsortiumCut;
- UpdateField<uint32, 10, 14> Flags;
- UpdateField<ObjectGuid, 15, 16> CustomerGUID;
- UpdateField<ObjectGuid, 15, 17> CustomerAccountGUID;
- UpdateField<ObjectGuid, 15, 18> CrafterGUID;
- UpdateField<ObjectGuid, 15, 19> PersonalCrafterGUID;
- UpdateField<std::string, 20, 21> CustomerNotes;
- OptionalUpdateField<UF::CraftingOrderItem, 20, 22> OutputItem;
- OptionalUpdateField<WorldPackets::Item::ItemInstance, 20, 23> OutputItemData;
+ UpdateField<uint8, 0, 5> OrderState;
+ UpdateField<uint8, 6, 7> OrderType;
+ UpdateField<uint8, 6, 8> MinQuality;
+ UpdateField<int64, 6, 9> ExpirationTime;
+ UpdateField<int64, 6, 10> ClaimEndTime;
+ UpdateField<int64, 6, 11> TipAmount;
+ UpdateField<int64, 12, 13> ConsortiumCut;
+ UpdateField<uint32, 12, 14> Flags;
+ UpdateField<ObjectGuid, 12, 15> CrafterGUID;
+ UpdateField<ObjectGuid, 12, 16> PersonalCrafterGUID;
+ UpdateField<int32, 12, 17> NpcCraftingOrderSetID;
+ UpdateField<int32, 18, 19> NpcTreasureID;
+ UpdateField<std::string, 18, 20> CustomerNotes;
+ OptionalUpdateField<UF::CraftingOrderCustomer, 18, 21> Customer;
+ OptionalUpdateField<UF::CraftingOrderNpcCustomer, 18, 22> NpcCustomer;
+ OptionalUpdateField<UF::CraftingOrderItem, 18, 23> OutputItem;
+ OptionalUpdateField<WorldPackets::Item::ItemInstance, 24, 25> OutputItemData;
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
@@ -824,6 +885,18 @@ struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag, public Has
void ClearChangesMask();
};
+struct NPCCraftingOrderInfo : public IsUpdateFieldStructureTag, public HasChangesMask<4>
+{
+ UpdateField<uint64, -1, 0> Field_0;
+ UpdateField<int32, -1, 1> Field_8;
+ UpdateField<int32, -1, 2> Field_C;
+ UpdateField<int32, -1, 3> Field_10;
+
+ 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 CategoryCooldownMod : public IsUpdateFieldStructureTag
{
int32 SpellCategoryID;
@@ -882,6 +955,46 @@ struct CollectableSourceTrackedData : public IsUpdateFieldStructureTag, public H
void ClearChangesMask();
};
+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 WalkInData : public IsUpdateFieldStructureTag
+{
+ int32 MapID;
+ int64 Field_8;
+ uint32 Type;
+ ObjectGuid Field_18;
+
+ 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==(WalkInData const& right) const;
+ bool operator!=(WalkInData const& right) const { return !(*this == right); }
+};
+
+struct DelveData : public IsUpdateFieldStructureTag
+{
+ std::vector<ObjectGuid> Owners;
+ int32 Field_0;
+ int64 Field_8;
+ int32 Field_10;
+ int32 SpellID;
+ uint32 Started; // Restricts rewards to players in m_owners if set to true. Intended to prevent rewarwding players that join in-progress delve?
+
+ 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==(DelveData const& right) const;
+ bool operator!=(DelveData const& right) const { return !(*this == right); }
+};
+
struct Research : public IsUpdateFieldStructureTag
{
int16 ResearchProjectID;
@@ -892,7 +1005,7 @@ struct Research : public IsUpdateFieldStructureTag
bool operator!=(Research const& right) const { return !(*this == right); }
};
-struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1454>
+struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1476>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BackpackSellJunkDisabled;
@@ -900,146 +1013,154 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
UpdateField<bool, 0, 4> SortBagsRightToLeft;
UpdateField<bool, 0, 5> InsertItemsLeftToRight;
UpdateField<bool, 0, 6> HasPerksProgramPendingReward;
- UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 9, 36, 37> DataFlags;
- UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 38, 39> ResearchSites;
- UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 40, 41> ResearchSiteProgress;
- UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 42, 43> Research;
+ UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 40, 41> ResearchSites;
+ UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 42, 43> ResearchSiteProgress;
+ UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 44, 45> Research;
DynamicUpdateField<uint64, 0, 7> KnownTitles;
- DynamicUpdateField<int32, 0, 9> DailyQuestsCompleted;
- DynamicUpdateField<int32, 0, 10> AvailableQuestLineXQuestIDs;
- DynamicUpdateField<int32, 0, 11> Heirlooms;
- DynamicUpdateField<uint32, 0, 12> HeirloomFlags;
- DynamicUpdateField<int32, 0, 13> Toys;
- DynamicUpdateField<uint32, 0, 14> ToyFlags;
- DynamicUpdateField<uint32, 0, 15> Transmog;
- DynamicUpdateField<int32, 0, 16> ConditionalTransmog;
- DynamicUpdateField<int32, 0, 17> SelfResSpells;
- DynamicUpdateField<uint32, 0, 18> RuneforgePowers;
- DynamicUpdateField<uint32, 0, 19> TransmogIllusions;
- DynamicUpdateField<UF::SpellPctModByLabel, 0, 21> SpellPctModByLabel;
- DynamicUpdateField<UF::SpellFlatModByLabel, 0, 22> SpellFlatModByLabel;
- DynamicUpdateField<UF::MawPower, 0, 23> MawPowers;
- DynamicUpdateField<UF::MultiFloorExplore, 0, 24> MultiFloorExploration;
- DynamicUpdateField<UF::RecipeProgressionInfo, 0, 25> RecipeProgression;
- DynamicUpdateField<UF::ReplayedQuest, 0, 26> ReplayedQuests;
- DynamicUpdateField<UF::QuestLog, 0, 27> TaskQuests;
- DynamicUpdateField<int32, 0, 28> DisabledSpells;
- DynamicUpdateField<UF::PersonalCraftingOrderCount, 0, 31> PersonalCraftingOrderCounts;
- DynamicUpdateField<UF::CategoryCooldownMod, 32, 33> CategoryCooldownMods;
- DynamicUpdateField<UF::WeeklySpellUse, 32, 34> WeeklySpellUses;
- DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 35> TrackedCollectableSources;
- DynamicUpdateField<UF::PVPInfo, 0, 8> PvpInfo;
- DynamicUpdateField<UF::CharacterRestriction, 0, 20> CharacterRestrictions;
- DynamicUpdateField<UF::TraitConfig, 0, 29> TraitConfigs;
- DynamicUpdateField<UF::CraftingOrder, 0, 30> CraftingOrders;
- UpdateField<ObjectGuid, 32, 44> FarsightObject;
- UpdateField<ObjectGuid, 32, 45> SummonedBattlePetGUID;
- UpdateField<uint64, 32, 46> Coinage;
- UpdateField<int32, 32, 47> XP;
- UpdateField<int32, 32, 48> NextLevelXP;
- UpdateField<int32, 32, 49> TrialXP;
- UpdateField<UF::SkillInfo, 32, 50> Skill;
- UpdateField<int32, 32, 51> CharacterPoints;
- UpdateField<int32, 32, 52> MaxTalentTiers;
- UpdateField<uint32, 32, 53> TrackCreatureMask;
- UpdateField<float, 32, 54> MainhandExpertise;
- UpdateField<float, 32, 55> OffhandExpertise;
- UpdateField<float, 32, 56> RangedExpertise;
- UpdateField<float, 32, 57> CombatRatingExpertise;
- UpdateField<float, 32, 58> BlockPercentage;
- UpdateField<float, 32, 59> DodgePercentage;
- UpdateField<float, 32, 60> DodgePercentageFromAttribute;
- UpdateField<float, 32, 61> ParryPercentage;
- UpdateField<float, 32, 62> ParryPercentageFromAttribute;
- UpdateField<float, 32, 63> CritPercentage;
- UpdateField<float, 32, 64> RangedCritPercentage;
- UpdateField<float, 32, 65> OffhandCritPercentage;
- UpdateField<float, 32, 66> SpellCritPercentage;
- UpdateField<int32, 32, 67> ShieldBlock;
- UpdateField<float, 32, 68> ShieldBlockCritPercentage;
- UpdateField<float, 32, 69> Mastery;
- UpdateField<float, 32, 70> Speed;
- UpdateField<float, 32, 71> Avoidance;
- UpdateField<float, 72, 73> Sturdiness;
- UpdateField<int32, 72, 74> Versatility;
- UpdateField<float, 72, 75> VersatilityBonus;
- UpdateField<float, 72, 76> PvpPowerDamage;
- UpdateField<float, 72, 77> PvpPowerHealing;
- UpdateField<int32, 72, 78> ModHealingDonePos;
- UpdateField<float, 72, 79> ModHealingPercent;
- UpdateField<float, 72, 80> ModPeriodicHealingDonePercent;
- UpdateField<float, 72, 81> ModSpellPowerPercent;
- UpdateField<float, 72, 82> ModResiliencePercent;
- UpdateField<float, 72, 83> OverrideSpellPowerByAPPercent;
- UpdateField<float, 72, 84> OverrideAPBySpellPowerPercent;
- UpdateField<int32, 72, 85> ModTargetResistance;
- UpdateField<int32, 72, 86> ModTargetPhysicalResistance;
- UpdateField<uint32, 72, 87> LocalFlags;
- UpdateField<uint8, 72, 88> GrantableLevels;
- UpdateField<uint8, 72, 89> MultiActionBars;
- UpdateField<uint8, 72, 90> LifetimeMaxRank;
- UpdateField<uint8, 72, 91> NumRespecs;
- UpdateField<uint32, 72, 92> PvpMedals;
- UpdateField<uint16, 72, 93> TodayHonorableKills;
- UpdateField<uint16, 72, 94> YesterdayHonorableKills;
- UpdateField<uint32, 72, 95> LifetimeHonorableKills;
- UpdateField<int32, 72, 96> WatchedFactionIndex;
- UpdateField<int32, 72, 97> MaxLevel;
- UpdateField<int32, 72, 98> ScalingPlayerLevelDelta;
- UpdateField<int32, 72, 99> MaxCreatureScalingLevel;
- UpdateField<int32, 72, 100> PetSpellPower;
- UpdateField<float, 72, 101> UiHitModifier;
- UpdateField<float, 72, 102> UiSpellHitModifier;
- UpdateField<int32, 72, 103> HomeRealmTimeOffset;
- UpdateField<float, 104, 105> ModPetHaste;
- UpdateField<int8, 104, 106> JailersTowerLevelMax;
- UpdateField<int8, 104, 107> JailersTowerLevel;
- UpdateField<uint8, 104, 108> LocalRegenFlags;
- UpdateField<uint8, 104, 109> AuraVision;
- UpdateField<uint8, 104, 110> NumBackpackSlots;
- UpdateField<int32, 104, 111> OverrideSpellsID;
- UpdateField<uint16, 104, 112> LootSpecID;
- UpdateField<uint32, 104, 113> OverrideZonePVPType;
- UpdateField<int32, 104, 114> Honor;
- UpdateField<int32, 104, 115> HonorNextLevel;
- UpdateField<int32, 104, 116> PerksProgramCurrency;
- UpdateField<uint8, 104, 117> NumBankSlots;
- UpdateField<UF::ResearchHistory, 104, 118> ResearchHistory;
- UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 104, 119> FrozenPerksVendorItem;
- UpdateField<UF::ActivePlayerUnk901, 104, 121> Field_1410;
- OptionalUpdateField<UF::QuestSession, 104, 120> QuestSession;
- UpdateField<int32, 104, 122> UiChromieTimeExpansionID;
- UpdateField<int32, 104, 123> TimerunningSeasonID;
- UpdateField<int32, 104, 124> TransportServerTime;
- UpdateField<uint32, 104, 125> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
- UpdateField<int16, 104, 126> DEBUGSoulbindConduitRank;
- UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 104, 127> DungeonScore;
- UpdateField<uint32, 104, 128> ActiveCombatTraitConfigID;
- UpdateField<int32, 104, 129> ItemUpgradeHighOnehandWeaponItemID;
- UpdateField<int32, 104, 130> ItemUpgradeHighFingerItemID;
- UpdateField<float, 104, 131> ItemUpgradeHighFingerWatermark;
- UpdateField<int32, 104, 132> ItemUpgradeHighTrinketItemID;
- UpdateField<float, 104, 133> ItemUpgradeHighTrinketWatermark;
- UpdateField<uint64, 104, 134> LootHistoryInstanceID;
- OptionalUpdateField<UF::StableInfo, 104, 135> PetStable;
- UpdateField<uint8, 136, 137> RequiredMountCapabilityFlags;
- UpdateFieldArray<ObjectGuid, 227, 138, 139> InvSlots;
- UpdateFieldArray<UF::RestInfo, 2, 366, 367> RestInfo;
- UpdateFieldArray<int32, 7, 369, 370> ModDamageDonePos;
- UpdateFieldArray<int32, 7, 369, 377> ModDamageDoneNeg;
- UpdateFieldArray<float, 7, 369, 384> ModDamageDonePercent;
- UpdateFieldArray<float, 7, 369, 391> ModHealingDonePercent;
- UpdateFieldArray<float, 3, 398, 399> WeaponDmgMultipliers;
- UpdateFieldArray<float, 3, 398, 402> WeaponAtkSpeedMultipliers;
- UpdateFieldArray<uint32, 12, 405, 406> BuybackPrice;
- UpdateFieldArray<int64, 12, 405, 418> BuybackTimestamp;
- UpdateFieldArray<int32, 32, 430, 431> CombatRatings;
- UpdateFieldArray<uint32, 4, 463, 464> NoReagentCostMask;
- UpdateFieldArray<int32, 2, 468, 469> ProfessionSkillLine;
- UpdateFieldArray<uint32, 5, 471, 472> BagSlotFlags;
- UpdateFieldArray<uint32, 7, 477, 478> BankBagSlotFlags;
- UpdateFieldArray<uint64, 950, 485, 486> QuestCompleted;
- UpdateFieldArray<float, 17, 1436, 1437> ItemUpgradeHighWatermark;
+ DynamicUpdateField<int32, 0, 11> DailyQuestsCompleted;
+ DynamicUpdateField<int32, 0, 12> AvailableQuestLineXQuestIDs;
+ DynamicUpdateField<int32, 0, 13> Heirlooms;
+ DynamicUpdateField<uint32, 0, 14> HeirloomFlags;
+ DynamicUpdateField<int32, 0, 15> Toys;
+ DynamicUpdateField<uint32, 0, 16> ToyFlags;
+ DynamicUpdateField<uint32, 0, 17> Transmog;
+ DynamicUpdateField<int32, 0, 18> ConditionalTransmog;
+ DynamicUpdateField<int32, 0, 19> SelfResSpells;
+ DynamicUpdateField<uint32, 0, 20> RuneforgePowers;
+ DynamicUpdateField<uint32, 0, 21> TransmogIllusions;
+ DynamicUpdateField<UF::SpellPctModByLabel, 0, 23> SpellPctModByLabel;
+ DynamicUpdateField<UF::SpellFlatModByLabel, 0, 24> SpellFlatModByLabel;
+ DynamicUpdateField<UF::MawPower, 0, 25> MawPowers;
+ DynamicUpdateField<UF::MultiFloorExplore, 0, 26> MultiFloorExploration;
+ DynamicUpdateField<UF::RecipeProgressionInfo, 0, 27> RecipeProgression;
+ DynamicUpdateField<UF::ReplayedQuest, 0, 28> ReplayedQuests;
+ DynamicUpdateField<UF::QuestLog, 0, 29> TaskQuests;
+ DynamicUpdateField<int32, 0, 30> DisabledSpells;
+ DynamicUpdateField<UF::PersonalCraftingOrderCount, 32, 34> PersonalCraftingOrderCounts;
+ DynamicUpdateField<UF::NPCCraftingOrderInfo, 32, 35> NpcCraftingOrders;
+ DynamicUpdateField<UF::CategoryCooldownMod, 32, 36> CategoryCooldownMods;
+ DynamicUpdateField<UF::WeeklySpellUse, 32, 37> WeeklySpellUses;
+ DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 38> TrackedCollectableSources;
+ DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements;
+ DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements;
+ DynamicUpdateField<UF::PVPInfo, 0, 10> PvpInfo;
+ DynamicUpdateField<UF::CharacterRestriction, 0, 22> CharacterRestrictions;
+ DynamicUpdateField<UF::TraitConfig, 0, 31> TraitConfigs;
+ DynamicUpdateField<UF::CraftingOrder, 32, 33> CraftingOrders;
+ DynamicUpdateField<UF::BankTabSettings, 32, 39> AccountBankTabSettings;
+ UpdateField<ObjectGuid, 32, 46> FarsightObject;
+ UpdateField<ObjectGuid, 32, 47> SummonedBattlePetGUID;
+ UpdateField<uint64, 32, 48> Coinage;
+ UpdateField<uint64, 32, 49> AccountBankCoinage;
+ UpdateField<int32, 32, 50> XP;
+ UpdateField<int32, 32, 51> NextLevelXP;
+ UpdateField<int32, 32, 52> TrialXP;
+ UpdateField<UF::SkillInfo, 32, 53> Skill;
+ UpdateField<int32, 32, 54> CharacterPoints;
+ UpdateField<int32, 32, 55> MaxTalentTiers;
+ UpdateField<uint32, 32, 56> TrackCreatureMask;
+ UpdateField<float, 32, 57> MainhandExpertise;
+ UpdateField<float, 32, 58> OffhandExpertise;
+ UpdateField<float, 32, 59> RangedExpertise;
+ UpdateField<float, 32, 60> CombatRatingExpertise;
+ UpdateField<float, 32, 61> BlockPercentage;
+ UpdateField<float, 32, 62> DodgePercentage;
+ UpdateField<float, 32, 63> DodgePercentageFromAttribute;
+ UpdateField<float, 32, 64> ParryPercentage;
+ UpdateField<float, 32, 65> ParryPercentageFromAttribute;
+ UpdateField<float, 32, 66> CritPercentage;
+ UpdateField<float, 32, 67> RangedCritPercentage;
+ UpdateField<float, 32, 68> OffhandCritPercentage;
+ UpdateField<float, 32, 69> SpellCritPercentage;
+ UpdateField<int32, 70, 71> ShieldBlock;
+ UpdateField<float, 70, 72> ShieldBlockCritPercentage;
+ UpdateField<float, 70, 73> Mastery;
+ UpdateField<float, 70, 74> Speed;
+ UpdateField<float, 70, 75> Avoidance;
+ UpdateField<float, 70, 76> Sturdiness;
+ UpdateField<int32, 70, 77> Versatility;
+ UpdateField<float, 70, 78> VersatilityBonus;
+ UpdateField<float, 70, 79> PvpPowerDamage;
+ UpdateField<float, 70, 80> PvpPowerHealing;
+ UpdateField<UF::BitVectors, 70, 81> BitVectors;
+ UpdateField<int32, 70, 82> ModHealingDonePos;
+ UpdateField<float, 70, 83> ModHealingPercent;
+ UpdateField<float, 70, 84> ModPeriodicHealingDonePercent;
+ UpdateField<float, 70, 85> ModSpellPowerPercent;
+ UpdateField<float, 70, 86> ModResiliencePercent;
+ UpdateField<float, 70, 87> OverrideSpellPowerByAPPercent;
+ UpdateField<float, 70, 88> OverrideAPBySpellPowerPercent;
+ UpdateField<int32, 70, 89> ModTargetResistance;
+ UpdateField<int32, 70, 90> ModTargetPhysicalResistance;
+ UpdateField<uint32, 70, 91> LocalFlags;
+ UpdateField<uint8, 70, 92> GrantableLevels;
+ UpdateField<uint8, 70, 93> MultiActionBars;
+ UpdateField<uint8, 70, 94> LifetimeMaxRank;
+ UpdateField<uint8, 70, 95> NumRespecs;
+ UpdateField<uint32, 70, 96> PvpMedals;
+ UpdateField<uint16, 70, 97> TodayHonorableKills;
+ UpdateField<uint16, 70, 98> YesterdayHonorableKills;
+ UpdateField<uint32, 70, 99> LifetimeHonorableKills;
+ UpdateField<int32, 70, 100> WatchedFactionIndex;
+ UpdateField<int32, 70, 101> MaxLevel;
+ UpdateField<int32, 102, 103> ScalingPlayerLevelDelta;
+ UpdateField<int32, 102, 104> MaxCreatureScalingLevel;
+ UpdateField<int32, 102, 105> PetSpellPower;
+ UpdateField<float, 102, 106> UiHitModifier;
+ UpdateField<float, 102, 107> UiSpellHitModifier;
+ UpdateField<int32, 102, 108> HomeRealmTimeOffset;
+ UpdateField<float, 102, 109> ModPetHaste;
+ UpdateField<int8, 102, 110> JailersTowerLevelMax;
+ UpdateField<int8, 102, 111> JailersTowerLevel;
+ UpdateField<uint8, 102, 112> LocalRegenFlags;
+ UpdateField<uint8, 102, 113> AuraVision;
+ UpdateField<uint8, 102, 114> NumBackpackSlots;
+ UpdateField<int32, 102, 115> OverrideSpellsID;
+ UpdateField<uint16, 102, 116> LootSpecID;
+ UpdateField<uint32, 102, 117> OverrideZonePVPType;
+ UpdateField<int32, 102, 118> Honor;
+ UpdateField<int32, 102, 119> HonorNextLevel;
+ UpdateField<int32, 102, 120> PerksProgramCurrency;
+ UpdateField<uint8, 102, 121> NumBankSlots;
+ UpdateField<uint8, 102, 122> NumAccountBankTabs;
+ UpdateField<UF::ResearchHistory, 102, 123> ResearchHistory;
+ UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 124> FrozenPerksVendorItem;
+ UpdateField<UF::ActivePlayerUnk901, 102, 126> Field_1410;
+ OptionalUpdateField<UF::QuestSession, 102, 125> QuestSession;
+ UpdateField<int32, 102, 127> UiChromieTimeExpansionID;
+ UpdateField<int32, 102, 128> TimerunningSeasonID;
+ UpdateField<int32, 102, 129> TransportServerTime;
+ UpdateField<uint32, 102, 130> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
+ UpdateField<int16, 102, 131> DEBUGSoulbindConduitRank;
+ UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 102, 132> DungeonScore;
+ UpdateField<uint32, 102, 133> ActiveCombatTraitConfigID;
+ UpdateField<int32, 134, 135> ItemUpgradeHighOnehandWeaponItemID;
+ UpdateField<int32, 134, 136> ItemUpgradeHighFingerItemID;
+ UpdateField<float, 134, 137> ItemUpgradeHighFingerWatermark;
+ UpdateField<int32, 134, 138> ItemUpgradeHighTrinketItemID;
+ UpdateField<float, 134, 139> ItemUpgradeHighTrinketWatermark;
+ UpdateField<uint64, 134, 140> LootHistoryInstanceID;
+ OptionalUpdateField<UF::StableInfo, 134, 141> PetStable;
+ UpdateField<uint8, 134, 142> RequiredMountCapabilityFlags;
+ OptionalUpdateField<UF::WalkInData, 134, 143> WalkInData;
+ OptionalUpdateField<UF::DelveData, 134, 144> DelveData;
+ UpdateFieldArray<ObjectGuid, 232, 145, 146> InvSlots;
+ UpdateFieldArray<UF::RestInfo, 2, 378, 379> RestInfo;
+ UpdateFieldArray<int32, 7, 381, 382> ModDamageDonePos;
+ UpdateFieldArray<int32, 7, 381, 389> ModDamageDoneNeg;
+ UpdateFieldArray<float, 7, 381, 396> ModDamageDonePercent;
+ UpdateFieldArray<float, 7, 381, 403> ModHealingDonePercent;
+ UpdateFieldArray<float, 3, 410, 411> WeaponDmgMultipliers;
+ UpdateFieldArray<float, 3, 410, 414> WeaponAtkSpeedMultipliers;
+ UpdateFieldArray<uint32, 12, 417, 418> BuybackPrice;
+ UpdateFieldArray<int64, 12, 417, 430> BuybackTimestamp;
+ UpdateFieldArray<int32, 32, 442, 443> CombatRatings;
+ UpdateFieldArray<uint32, 4, 475, 476> NoReagentCostMask;
+ UpdateFieldArray<int32, 2, 480, 481> ProfessionSkillLine;
+ UpdateFieldArray<uint32, 5, 483, 484> BagSlotFlags;
+ UpdateFieldArray<uint32, 7, 489, 490> BankBagSlotFlags;
+ UpdateFieldArray<uint64, 960, 497, 498> QuestCompleted;
+ UpdateFieldArray<float, 17, 1458, 1459> ItemUpgradeHighWatermark;
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;
diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
index 68d393e9804..9e3461af947 100644
--- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
+++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
@@ -313,7 +313,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());
@@ -340,9 +340,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())
@@ -350,14 +350,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;
@@ -365,6 +362,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 55ad4d6a98f..32343bbe64d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -216,6 +216,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;
@@ -1488,6 +1489,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;
@@ -6370,8 +6373,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);
@@ -6423,7 +6426,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);
}
@@ -6431,7 +6435,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);
}
@@ -6445,11 +6450,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::CheckOutdoorsAuraRequirements()
@@ -13891,6 +13896,9 @@ void Player::SendNewItem(Item* item, uint32 quantity, bool pushed, bool created,
packet.QuestLogItemID = item->GetTemplate()->QuestLogItemId;
packet.Quantity = quantity;
packet.QuantityInInventory = GetItemCount(item->GetEntry());
+ if (QuestObjective const* questObjective = GetQuestObjectiveForItem(item->GetEntry(), false))
+ packet.QuantityInQuestLog = GetQuestObjectiveData(*questObjective);
+
packet.BattlePetSpeciesID = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID);
packet.BattlePetBreedID = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) & 0xFFFFFF;
packet.BattlePetBreedQuality = (item->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) >> 24) & 0xFF;
@@ -14225,7 +14233,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)];
@@ -16167,20 +16176,28 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const
case QUEST_STATUS_COMPLETE:
if (quest->IsImportant())
result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::ImportantQuestRewardCompleteNoPOI : QuestGiverStatus::ImportantQuestRewardCompletePOI;
+ else if (quest->IsMeta())
+ result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::MetaQuestRewardCompleteNoPOI : QuestGiverStatus::MetaQuestRewardCompletePOI;
else if (quest->GetQuestTag() == QuestTagType::CovenantCalling)
result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::CovenantCallingRewardCompleteNoPOI : QuestGiverStatus::CovenantCallingRewardCompletePOI;
else if (quest->HasFlagEx(QUEST_FLAGS_EX_LEGENDARY))
result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::LegendaryRewardCompleteNoPOI : QuestGiverStatus::LegendaryRewardCompletePOI;
+ else if (quest->IsDailyOrWeekly())
+ result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::RepeatableRewardCompleteNoPOI : QuestGiverStatus::RepeatableRewardCompletePOI;
else
result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::RewardCompleteNoPOI : QuestGiverStatus::RewardCompletePOI;
break;
case QUEST_STATUS_INCOMPLETE:
if (quest->IsImportant())
result |= QuestGiverStatus::ImportantReward;
+ else if (quest->IsMeta())
+ result |= QuestGiverStatus::MetaReward;
else if (quest->GetQuestTag() == QuestTagType::CovenantCalling)
result |= QuestGiverStatus::CovenantCallingReward;
else if (quest->HasFlagEx(QUEST_FLAGS_EX_LEGENDARY))
result |= QuestGiverStatus::LegendaryReward;
+ else if (quest->IsDailyOrWeekly())
+ result |= QuestGiverStatus::RepeatableReward;
else
result |= QuestGiverStatus::Reward;
break;
@@ -16188,12 +16205,17 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const
break;
}
- if (quest->IsTurnIn() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly())
+ if (quest->IsTurnIn() && CanTakeQuest(quest, false))
{
- if (GetLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF)))
- result |= QuestGiverStatus::RepeatableTurnin;
+ if (quest->IsRepeatable())
+ {
+ if (GetLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF)))
+ result |= QuestGiverStatus::RepeatableTurnin;
+ else
+ result |= QuestGiverStatus::TrivialRepeatableTurnin;
+ }
else
- result |= QuestGiverStatus::TrivialRepeatableTurnin;
+ result |= quest->HasFlag(QUEST_FLAGS_HIDE_REWARD_POI) ? QuestGiverStatus::RewardCompleteNoPOI : QuestGiverStatus::RewardCompletePOI;
}
}
@@ -16215,12 +16237,14 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const
bool isTrivial = GetLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
if (quest->IsImportant())
result |= isTrivial ? QuestGiverStatus::TrivialImportantQuest : QuestGiverStatus::ImportantQuest;
+ else if (quest->IsMeta())
+ result |= isTrivial ? QuestGiverStatus::TrivialMetaQuest : QuestGiverStatus::MetaQuest;
else if (quest->GetQuestTag() == QuestTagType::CovenantCalling)
result |= QuestGiverStatus::CovenantCallingQuest;
else if (quest->HasFlagEx(QUEST_FLAGS_EX_LEGENDARY))
result |= isTrivial ? QuestGiverStatus::TrivialLegendaryQuest : QuestGiverStatus::LegendaryQuest;
- else if (quest->IsDaily())
- result |= isTrivial ? QuestGiverStatus::TrivialDailyQuest : QuestGiverStatus::DailyQuest;
+ else if (quest->IsDailyOrWeekly())
+ result |= isTrivial ? QuestGiverStatus::TrivialRepeatableQuest : QuestGiverStatus::RepeatableQuest;
else
result |= isTrivial ? QuestGiverStatus::Trivial : QuestGiverStatus::Quest;
}
@@ -20067,10 +20091,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());
@@ -20224,10 +20248,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());
@@ -25361,9 +25385,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);
@@ -25384,7 +25409,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 b3d3d9c7466..f83e54de2bc 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -146,7 +146,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,
@@ -638,7 +638,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 = 227,
+ PLAYER_SLOT_END = 232,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
};
@@ -761,6 +761,12 @@ enum EquipableSpellSlots
EQUIPABLE_SPELL_WEAPON_SLOT4 = 226,
};
+enum AccountBankBagSlots
+{
+ ACCOUNT_BANK_SLOT_BAG_START = 227,
+ ACCOUNT_BANK_SLOT_BAG_END = 232
+};
+
struct ItemPosCount
{
ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) { }
@@ -811,11 +817,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
@@ -2294,6 +2299,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; }
@@ -3251,6 +3257,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 cc2d0f96875..6c0d491b8ea 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -8885,9 +8885,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));
}
//======================================================================
@@ -13176,6 +13177,40 @@ bool Unit::SetCollision(bool disable)
return true;
}
+bool Unit::SetEnableFullSpeedTurning(bool enable)
+{
+ if (GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (enable == HasExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_TURNING))
+ return false;
+
+ if (enable)
+ AddExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_TURNING);
+ else
+ RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_TURNING);
+
+ static constexpr OpcodeServer fullSpeedTurningOpcodeTable[2] =
+ {
+ SMSG_MOVE_DISABLE_FULL_SPEED_TURNING,
+ SMSG_MOVE_ENABLE_FULL_SPEED_TURNING
+ };
+
+ if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved()))
+ {
+ WorldPackets::Movement::MoveSetFlag packet(fullSpeedTurningOpcodeTable[enable]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.Status = &m_movementInfo;
+ SendMessageToSet(moveUpdate.Write(), playerMover);
+ }
+
+ return true;
+}
+
bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable)
{
if (GetTypeId() != TYPEID_PLAYER)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 41d48b70cdf..3adc53fcaaa 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -983,17 +983,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); }
@@ -1149,6 +1149,7 @@ class TC_GAME_API Unit : public WorldObject
bool SetFeatherFall(bool enable);
bool SetHover(bool enable, bool updateAnimTier = true);
bool SetCollision(bool disable);
+ bool SetEnableFullSpeedTurning(bool enable);
bool SetCanTransitionBetweenSwimAndFly(bool enable);
bool SetCanTurnWhileFalling(bool enable);
bool SetCanDoubleJump(bool enable);
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h
index f19ef29ada0..432a998f9b6 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 af0544234ff..a5fa869ebc2 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;