From e59eef5432c7b70679d33f4911c88d0f7d75fd39 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 2 Aug 2024 13:25:41 +0200 Subject: Core/PacketIO: Updated to 11.0.0 --- src/server/game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/Creature/GossipDef.cpp | 14 +- src/server/game/Entities/Creature/GossipDef.h | 8 +- .../game/Entities/GameObject/GameObjectData.h | 108 +- src/server/game/Entities/Item/Container/Bag.h | 4 +- src/server/game/Entities/Item/ItemDefines.h | 8 + src/server/game/Entities/Object/Object.cpp | 2 +- .../game/Entities/Object/Updates/UpdateField.h | 53 +- .../game/Entities/Object/Updates/UpdateFields.cpp | 1476 +++++++++++++------- .../game/Entities/Object/Updates/UpdateFields.h | 737 ++++++---- .../Object/Updates/ViewerDependentValues.h | 36 +- src/server/game/Entities/Player/Player.cpp | 71 +- src/server/game/Entities/Player/Player.h | 21 +- src/server/game/Entities/Unit/Unit.cpp | 41 +- src/server/game/Entities/Unit/Unit.h | 23 +- src/server/game/Entities/Unit/UnitDefines.h | 2 +- .../game/Entities/Unit/enuminfo_UnitDefines.cpp | 6 +- 17 files changed, 1695 insertions(+), 917 deletions(-) (limited to 'src/server/game/Entities') 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 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 npcflag; Optional unitFlags; Optional 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 class UpdateFieldArrayBase; - template + template class UpdateFieldArray; template @@ -268,7 +268,7 @@ namespace UF return { (_value.*field)._value }; } - template + template std::enable_if_t, std::conditional_t, MutableFieldReference, @@ -278,10 +278,13 @@ namespace UF ModifyValue(UpdateFieldArray(T::* field), uint32 index) { _value._changesMask.Set(Bit); - if constexpr (!std::is_base_of_v) - _value._changesMask.Set(FirstElementBit + index); - else - _value._changesMask.Set(FirstElementBit); + if constexpr (FirstElementBit >= 0) + { + if constexpr (!std::is_base_of_v) + _value._changesMask.Set(FirstElementBit + index); + else + _value._changesMask.Set(FirstElementBit); + } return { (_value.*field)._values[index] }; } @@ -469,7 +472,7 @@ namespace UF template friend class UpdateField; - template + template friend class UpdateFieldArray; template @@ -486,7 +489,7 @@ namespace UF return { (static_cast(this)->*field)._value }; } - template + template MutableFieldReference ModifyValue(UpdateFieldArray(Derived::* field), uint32 index) { MarkChanged(field, index); @@ -534,16 +537,19 @@ namespace UF _changesMask.Set(Bit); } - template + template void MarkChanged(UpdateFieldArray(Derived::*), uint32 index) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); _changesMask.Set(Bit); - if constexpr (!std::is_base_of_v) - _changesMask.Set(FirstElementBit + index); - else - _changesMask.Set(FirstElementBit); + if constexpr (FirstElementBit >= 0) + { + if constexpr (!std::is_base_of_v) + _changesMask.Set(FirstElementBit + index); + else + _changesMask.Set(FirstElementBit); + } } template @@ -576,15 +582,18 @@ namespace UF _changesMask.Reset(Bit); } - template + template void ClearChanged(UpdateFieldArray(Derived::*), uint32 index) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); - if constexpr (!std::is_base_of_v) - _changesMask.Reset(FirstElementBit + index); - else - _changesMask.Reset(FirstElementBit); + if constexpr (FirstElementBit >= 0) + { + if constexpr (!std::is_base_of_v) + _changesMask.Reset(FirstElementBit + index); + else + _changesMask.Reset(FirstElementBit); + } } template @@ -620,16 +629,16 @@ namespace UF field._value.ClearChangesMask(); } - template + template static void ClearChangesMask(UpdateFieldArray& field) { ClearChangesMask(field, std::disjunction, std::is_base_of>{}); } - template + template static void ClearChangesMask(UpdateFieldArray&, std::false_type) { } - template + template static void ClearChangesMask(UpdateFieldArray& field, std::true_type) { for (uint32 i = 0; i < Size; ++i) @@ -804,7 +813,7 @@ namespace UF return sizeof(typename T::value_type); } - template + template class UpdateFieldArray : public UpdateFieldArrayBase { }; 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 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 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 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 fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { data << int32(ViewerDependentValue::GetValue(this, owner, receiver)); - for (uint32 i = 0; i < 2; ++i) - { - data << uint32(ViewerDependentValue::GetValue(this, i, owner, receiver)); - } + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); data << uint32(StateSpellVisualID); data << uint32(StateAnimID); data << uint32(StateAnimKitID); @@ -1093,8 +1091,8 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag 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 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 fieldVisi { data << ChannelObjects[i]; } + data.WriteBit(Field_314); + data.FlushBits(); } void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag 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 fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= std::array{ 0x00002000u, 0x0F004000u, 0xFFF08000u, 0x000000FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu }; + allowedMaskForTarget |= std::array{ 0x00010000u, 0x78020000u, 0xFF840000u, 0x000003FEu, 0xFC000020u, 0xFFE03FFFu, 0x0FFFFFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= std::array{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u }; + allowedMaskForTarget |= std::array{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFC000020u, 0x00003FFFu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= std::array{ 0x00000000u, 0x0F000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u }; + allowedMaskForTarget |= std::array{ 0x00000000u, 0x78000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00003FC0u }; } void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xF0FFBFFFu, 0x000F7FFFu, 0xFFFFFF01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -1169,6 +1171,10 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor if (changesMask[0]) { 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::GetValue(this, owner, receiver)); - } if (changesMask[6]) { - data << uint32(StateSpellVisualID); + data << int32(ViewerDependentValue::GetValue(this, owner, receiver)); } if (changesMask[7]) { - data << uint32(StateAnimID); + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); } if (changesMask[8]) { - data << uint32(StateAnimKitID); + data << uint32(ViewerDependentValue::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::GetValue(this, owner, receiver)); + data << int32(ScalingLevelMax); } if (changesMask[42]) { - data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); + data << int32(ScalingLevelDelta); } if (changesMask[43]) { - data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); + data << int32(ScalingFactionGroup); } if (changesMask[44]) { - data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); + data << int32(ViewerDependentValue::GetValue(this, owner, receiver)); } if (changesMask[45]) { - data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); } if (changesMask[46]) { - data << uint32(RangedAttackRoundBaseTime); + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); } if (changesMask[47]) { - data << float(BoundingRadius); + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); } if (changesMask[48]) { - data << float(CombatReach); + data << uint32(ViewerDependentValue::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::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::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::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::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::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]) @@ -3478,48 +3629,61 @@ 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[22]) + if (changesMask[21]) { - if (OutputItem.has_value()) + if (Customer.has_value()) { - OutputItem->WriteUpdate(data, ignoreChangesMask, owner, receiver); + 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[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 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 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 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 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 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 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 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 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 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 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,10 +5554,37 @@ 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) { @@ -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 Durability; UpdateField MaxDurability; UpdateField CreatePlayedTime; - UpdateField Context; + UpdateField Context; UpdateField CreateTime; UpdateField ArtifactXP; UpdateField 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 NumSlots; - UpdateFieldArray Slots; + UpdateFieldArray Slots; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Bag const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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, 0, 1> StateWorldEffectIDs; - DynamicUpdateField PassiveSpells; - DynamicUpdateField WorldEffects; - DynamicUpdateField ChannelObjects; - UpdateField DisplayID; + UpdateField Field_314; + UpdateField, 0, 2> StateWorldEffectIDs; + DynamicUpdateField PassiveSpells; + DynamicUpdateField WorldEffects; + DynamicUpdateField ChannelObjects; + UpdateField DisplayID; struct DisplayIDTag : ViewerDependentValueTag {}; - UpdateField StateSpellVisualID; - UpdateField StateAnimID; - UpdateField StateAnimKitID; - UpdateField StateWorldEffectsQuestObjectiveID; - UpdateField SpellOverrideNameID; - UpdateField Charm; - UpdateField Summon; - UpdateField Critter; - UpdateField CharmedBy; - UpdateField SummonedBy; - UpdateField CreatedBy; - UpdateField DemonCreator; - UpdateField LookAtControllerTarget; - UpdateField Target; - UpdateField BattlePetCompanionGUID; - UpdateField BattlePetDBID; - UpdateField ChannelData; - UpdateField SpellEmpowerStage; - UpdateField SummonedByHomeRealm; - UpdateField Race; - UpdateField ClassId; - UpdateField PlayerClassId; - UpdateField Sex; - UpdateField DisplayPower; - UpdateField OverrideDisplayPowerID; - UpdateField Health; - UpdateField MaxHealth; - UpdateField Level; - UpdateField EffectiveLevel; - UpdateField ContentTuningID; - UpdateField ScalingLevelMin; - UpdateField ScalingLevelMax; - UpdateField ScalingLevelDelta; - UpdateField ScalingFactionGroup; - UpdateField FactionTemplate; + UpdateField NpcFlags; + struct NpcFlagsTag : ViewerDependentValueTag {}; + UpdateField NpcFlags2; + struct NpcFlags2Tag : ViewerDependentValueTag {}; + UpdateField StateSpellVisualID; + UpdateField StateAnimID; + UpdateField StateAnimKitID; + UpdateField StateWorldEffectsQuestObjectiveID; + UpdateField SpellOverrideNameID; + UpdateField Charm; + UpdateField Summon; + UpdateField Critter; + UpdateField CharmedBy; + UpdateField SummonedBy; + UpdateField CreatedBy; + UpdateField DemonCreator; + UpdateField LookAtControllerTarget; + UpdateField Target; + UpdateField BattlePetCompanionGUID; + UpdateField BattlePetDBID; + UpdateField ChannelData; + UpdateField SpellEmpowerStage; + UpdateField SummonedByHomeRealm; + UpdateField Race; + UpdateField ClassId; + UpdateField PlayerClassId; + UpdateField Sex; + UpdateField DisplayPower; + UpdateField OverrideDisplayPowerID; + UpdateField Health; + UpdateField MaxHealth; + UpdateField Level; + UpdateField EffectiveLevel; + UpdateField ContentTuningID; + UpdateField ScalingLevelMin; + UpdateField ScalingLevelMax; + UpdateField ScalingLevelDelta; + UpdateField ScalingFactionGroup; + UpdateField FactionTemplate; struct FactionTemplateTag : ViewerDependentValueTag {}; - UpdateField Flags; + UpdateField Flags; struct FlagsTag : ViewerDependentValueTag {}; - UpdateField Flags2; + UpdateField Flags2; struct Flags2Tag : ViewerDependentValueTag {}; - UpdateField Flags3; + UpdateField Flags3; struct Flags3Tag : ViewerDependentValueTag {}; - UpdateField AuraState; + UpdateField AuraState; struct AuraStateTag : ViewerDependentValueTag {}; - UpdateField RangedAttackRoundBaseTime; - UpdateField BoundingRadius; - UpdateField CombatReach; - UpdateField DisplayScale; - UpdateField CreatureFamily; - UpdateField CreatureType; - UpdateField NativeDisplayID; - UpdateField NativeXDisplayScale; - UpdateField MountDisplayID; - UpdateField CosmeticMountDisplayID; - UpdateField MinDamage; - UpdateField MaxDamage; - UpdateField MinOffHandDamage; - UpdateField MaxOffHandDamage; - UpdateField StandState; - UpdateField PetTalentPoints; - UpdateField VisFlags; - UpdateField AnimTier; - UpdateField PetNumber; - UpdateField PetNameTimestamp; - UpdateField PetExperience; - UpdateField PetNextLevelExperience; - UpdateField ModCastingSpeed; - UpdateField ModCastingSpeedNeg; - UpdateField ModSpellHaste; - UpdateField ModHaste; - UpdateField ModRangedHaste; - UpdateField ModHasteRegen; - UpdateField ModTimeRate; - UpdateField CreatedBySpell; - UpdateField EmoteState; - UpdateField BaseMana; - UpdateField BaseHealth; - UpdateField SheatheState; - UpdateField PvpFlags; + UpdateField RangedAttackRoundBaseTime; + UpdateField BoundingRadius; + UpdateField CombatReach; + UpdateField DisplayScale; + UpdateField CreatureFamily; + UpdateField CreatureType; + UpdateField NativeDisplayID; + UpdateField NativeXDisplayScale; + UpdateField MountDisplayID; + UpdateField CosmeticMountDisplayID; + UpdateField MinDamage; + UpdateField MaxDamage; + UpdateField MinOffHandDamage; + UpdateField MaxOffHandDamage; + UpdateField StandState; + UpdateField PetTalentPoints; + UpdateField VisFlags; + UpdateField AnimTier; + UpdateField PetNumber; + UpdateField PetNameTimestamp; + UpdateField PetExperience; + UpdateField PetNextLevelExperience; + UpdateField ModCastingSpeed; + UpdateField ModCastingSpeedNeg; + UpdateField ModSpellHaste; + UpdateField ModHaste; + UpdateField ModRangedHaste; + UpdateField ModHasteRegen; + UpdateField ModTimeRate; + UpdateField CreatedBySpell; + UpdateField EmoteState; + UpdateField BaseMana; + UpdateField BaseHealth; + UpdateField SheatheState; + UpdateField PvpFlags; struct PvpFlagsTag : ViewerDependentValueTag {}; - UpdateField PetFlags; - UpdateField ShapeshiftForm; - UpdateField AttackPower; - UpdateField AttackPowerModPos; - UpdateField AttackPowerModNeg; - UpdateField AttackPowerMultiplier; - UpdateField AttackPowerModSupport; - UpdateField RangedAttackPower; - UpdateField RangedAttackPowerModPos; - UpdateField RangedAttackPowerModNeg; - UpdateField RangedAttackPowerMultiplier; - UpdateField RangedAttackPowerModSupport; - UpdateField MainHandWeaponAttackPower; - UpdateField OffHandWeaponAttackPower; - UpdateField RangedWeaponAttackPower; - UpdateField SetAttackSpeedAura; - UpdateField Lifesteal; - UpdateField MinRangedDamage; - UpdateField MaxRangedDamage; - UpdateField ManaCostMultiplier; - UpdateField MaxHealthModifier; - UpdateField HoverHeight; - UpdateField MinItemLevelCutoff; - UpdateField MinItemLevel; - UpdateField MaxItemLevel; - UpdateField AzeriteItemLevel; - UpdateField WildBattlePetLevel; - UpdateField BattlePetCompanionExperience; - UpdateField BattlePetCompanionNameTimestamp; - UpdateField InteractSpellID; + UpdateField PetFlags; + UpdateField ShapeshiftForm; + UpdateField AttackPower; + UpdateField AttackPowerModPos; + UpdateField AttackPowerModNeg; + UpdateField AttackPowerMultiplier; + UpdateField AttackPowerModSupport; + UpdateField RangedAttackPower; + UpdateField RangedAttackPowerModPos; + UpdateField RangedAttackPowerModNeg; + UpdateField RangedAttackPowerMultiplier; + UpdateField RangedAttackPowerModSupport; + UpdateField MainHandWeaponAttackPower; + UpdateField OffHandWeaponAttackPower; + UpdateField RangedWeaponAttackPower; + UpdateField SetAttackSpeedAura; + UpdateField Lifesteal; + UpdateField MinRangedDamage; + UpdateField MaxRangedDamage; + UpdateField ManaCostMultiplier; + UpdateField MaxHealthModifier; + UpdateField HoverHeight; + UpdateField MinItemLevelCutoff; + UpdateField MinItemLevel; + UpdateField MaxItemLevel; + UpdateField AzeriteItemLevel; + UpdateField WildBattlePetLevel; + UpdateField BattlePetCompanionExperience; + UpdateField BattlePetCompanionNameTimestamp; + UpdateField InteractSpellID; struct InteractSpellIDTag : ViewerDependentValueTag {}; - UpdateField ScaleDuration; - UpdateField LooksLikeMountID; - UpdateField LooksLikeCreatureID; - UpdateField LookAtControllerID; - UpdateField PerksVendorItemID; - UpdateField TaxiNodesID; - UpdateField GuildGUID; - UpdateField FlightCapabilityID; - UpdateField GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use - UpdateField Field_308; - UpdateField Field_30C; - UpdateField SilencedSchoolMask; - UpdateField CurrentAreaID; - UpdateField NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object - UpdateFieldArray NpcFlags; - struct NpcFlagsTag : ViewerDependentValueTag {}; - UpdateFieldArray Power; - UpdateFieldArray MaxPower; - UpdateFieldArray PowerRegenFlatModifier; - UpdateFieldArray PowerRegenInterruptedFlatModifier; - UpdateFieldArray VirtualItems; - UpdateFieldArray AttackRoundBaseTime; - UpdateFieldArray Stats; - UpdateFieldArray StatPosBuff; - UpdateFieldArray StatNegBuff; - UpdateFieldArray StatSupportBuff; - UpdateFieldArray Resistances; - UpdateFieldArray BonusResistanceMods; - UpdateFieldArray ManaCostModifier; + UpdateField ScaleDuration; + UpdateField LooksLikeMountID; + UpdateField LooksLikeCreatureID; + UpdateField LookAtControllerID; + UpdateField PerksVendorItemID; + UpdateField TaxiNodesID; + UpdateField GuildGUID; + UpdateField FlightCapabilityID; + UpdateField GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use + UpdateField MaxHealthModifierFlatNeg; + UpdateField MaxHealthModifierFlatPos; + UpdateField SilencedSchoolMask; + UpdateField CurrentAreaID; + UpdateField Field_31C; + UpdateField Field_320; // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount + UpdateField NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object + UpdateFieldArray Power; + UpdateFieldArray MaxPower; + UpdateFieldArray PowerRegenFlatModifier; + UpdateFieldArray PowerRegenInterruptedFlatModifier; + UpdateFieldArray VirtualItems; + UpdateFieldArray AttackRoundBaseTime; + UpdateFieldArray Stats; + UpdateFieldArray StatPosBuff; + UpdateFieldArray StatNegBuff; + UpdateFieldArray StatSupportBuff; + UpdateFieldArray Resistances; + UpdateFieldArray BonusResistanceMods; + UpdateFieldArray ManaCostModifier; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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, 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 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 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 Entries; - UpdateField ID; - UpdateField Name; - UpdateField Type; - UpdateField SkillLineID; - UpdateField ChrSpecializationID; - UpdateField CombatConfigFlags; - UpdateField LocalIdentifier; - UpdateField TraitSystemID; + DynamicUpdateField SubTrees; + UpdateField ID; + UpdateField Name; + UpdateField Type; + UpdateField SkillLineID; + UpdateField ChrSpecializationID; + UpdateField CombatConfigFlags; + UpdateField LocalIdentifier; + UpdateField 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 CustomerGUID; + UpdateField 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 NpcCraftingOrderCustomerID; + UpdateField 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 Reagents; UpdateField Field_0; UpdateField OrderID; UpdateField SkillLineAbilityID; - UpdateField OrderState; - UpdateField OrderType; - UpdateField MinQuality; - UpdateField ExpirationTime; - UpdateField ClaimEndTime; - UpdateField TipAmount; - UpdateField ConsortiumCut; - UpdateField Flags; - UpdateField CustomerGUID; - UpdateField CustomerAccountGUID; - UpdateField CrafterGUID; - UpdateField PersonalCrafterGUID; - UpdateField CustomerNotes; - OptionalUpdateField OutputItem; - OptionalUpdateField OutputItemData; + UpdateField OrderState; + UpdateField OrderType; + UpdateField MinQuality; + UpdateField ExpirationTime; + UpdateField ClaimEndTime; + UpdateField TipAmount; + UpdateField ConsortiumCut; + UpdateField Flags; + UpdateField CrafterGUID; + UpdateField PersonalCrafterGUID; + UpdateField NpcCraftingOrderSetID; + UpdateField NpcTreasureID; + UpdateField CustomerNotes; + OptionalUpdateField Customer; + OptionalUpdateField NpcCustomer; + OptionalUpdateField OutputItem; + OptionalUpdateField 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 Field_0; + UpdateField Field_8; + UpdateField Field_C; + UpdateField 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 Name; + UpdateField Icon; + UpdateField Description; + UpdateField 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 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 BackpackAutoSortDisabled; UpdateField BackpackSellJunkDisabled; @@ -900,146 +1013,154 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField SortBagsRightToLeft; UpdateField InsertItemsLeftToRight; UpdateField HasPerksProgramPendingReward; - UpdateFieldArray, 9, 36, 37> DataFlags; - UpdateFieldArray, 1, 38, 39> ResearchSites; - UpdateFieldArray, 1, 40, 41> ResearchSiteProgress; - UpdateFieldArray, 1, 42, 43> Research; + UpdateFieldArray, 1, 40, 41> ResearchSites; + UpdateFieldArray, 1, 42, 43> ResearchSiteProgress; + UpdateFieldArray, 1, 44, 45> Research; DynamicUpdateField KnownTitles; - DynamicUpdateField DailyQuestsCompleted; - DynamicUpdateField AvailableQuestLineXQuestIDs; - DynamicUpdateField Heirlooms; - DynamicUpdateField HeirloomFlags; - DynamicUpdateField Toys; - DynamicUpdateField ToyFlags; - DynamicUpdateField Transmog; - DynamicUpdateField ConditionalTransmog; - DynamicUpdateField SelfResSpells; - DynamicUpdateField RuneforgePowers; - DynamicUpdateField TransmogIllusions; - DynamicUpdateField SpellPctModByLabel; - DynamicUpdateField SpellFlatModByLabel; - DynamicUpdateField MawPowers; - DynamicUpdateField MultiFloorExploration; - DynamicUpdateField RecipeProgression; - DynamicUpdateField ReplayedQuests; - DynamicUpdateField TaskQuests; - DynamicUpdateField DisabledSpells; - DynamicUpdateField PersonalCraftingOrderCounts; - DynamicUpdateField CategoryCooldownMods; - DynamicUpdateField WeeklySpellUses; - DynamicUpdateField TrackedCollectableSources; - DynamicUpdateField PvpInfo; - DynamicUpdateField CharacterRestrictions; - DynamicUpdateField TraitConfigs; - DynamicUpdateField CraftingOrders; - UpdateField FarsightObject; - UpdateField SummonedBattlePetGUID; - UpdateField Coinage; - UpdateField XP; - UpdateField NextLevelXP; - UpdateField TrialXP; - UpdateField Skill; - UpdateField CharacterPoints; - UpdateField MaxTalentTiers; - UpdateField TrackCreatureMask; - UpdateField MainhandExpertise; - UpdateField OffhandExpertise; - UpdateField RangedExpertise; - UpdateField CombatRatingExpertise; - UpdateField BlockPercentage; - UpdateField DodgePercentage; - UpdateField DodgePercentageFromAttribute; - UpdateField ParryPercentage; - UpdateField ParryPercentageFromAttribute; - UpdateField CritPercentage; - UpdateField RangedCritPercentage; - UpdateField OffhandCritPercentage; - UpdateField SpellCritPercentage; - UpdateField ShieldBlock; - UpdateField ShieldBlockCritPercentage; - UpdateField Mastery; - UpdateField Speed; - UpdateField Avoidance; - UpdateField Sturdiness; - UpdateField Versatility; - UpdateField VersatilityBonus; - UpdateField PvpPowerDamage; - UpdateField PvpPowerHealing; - UpdateField ModHealingDonePos; - UpdateField ModHealingPercent; - UpdateField ModPeriodicHealingDonePercent; - UpdateField ModSpellPowerPercent; - UpdateField ModResiliencePercent; - UpdateField OverrideSpellPowerByAPPercent; - UpdateField OverrideAPBySpellPowerPercent; - UpdateField ModTargetResistance; - UpdateField ModTargetPhysicalResistance; - UpdateField LocalFlags; - UpdateField GrantableLevels; - UpdateField MultiActionBars; - UpdateField LifetimeMaxRank; - UpdateField NumRespecs; - UpdateField PvpMedals; - UpdateField TodayHonorableKills; - UpdateField YesterdayHonorableKills; - UpdateField LifetimeHonorableKills; - UpdateField WatchedFactionIndex; - UpdateField MaxLevel; - UpdateField ScalingPlayerLevelDelta; - UpdateField MaxCreatureScalingLevel; - UpdateField PetSpellPower; - UpdateField UiHitModifier; - UpdateField UiSpellHitModifier; - UpdateField HomeRealmTimeOffset; - UpdateField ModPetHaste; - UpdateField JailersTowerLevelMax; - UpdateField JailersTowerLevel; - UpdateField LocalRegenFlags; - UpdateField AuraVision; - UpdateField NumBackpackSlots; - UpdateField OverrideSpellsID; - UpdateField LootSpecID; - UpdateField OverrideZonePVPType; - UpdateField Honor; - UpdateField HonorNextLevel; - UpdateField PerksProgramCurrency; - UpdateField NumBankSlots; - UpdateField ResearchHistory; - UpdateField FrozenPerksVendorItem; - UpdateField Field_1410; - OptionalUpdateField QuestSession; - UpdateField UiChromieTimeExpansionID; - UpdateField TimerunningSeasonID; - UpdateField TransportServerTime; - UpdateField WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField DEBUGSoulbindConduitRank; - UpdateField DungeonScore; - UpdateField ActiveCombatTraitConfigID; - UpdateField ItemUpgradeHighOnehandWeaponItemID; - UpdateField ItemUpgradeHighFingerItemID; - UpdateField ItemUpgradeHighFingerWatermark; - UpdateField ItemUpgradeHighTrinketItemID; - UpdateField ItemUpgradeHighTrinketWatermark; - UpdateField LootHistoryInstanceID; - OptionalUpdateField PetStable; - UpdateField RequiredMountCapabilityFlags; - UpdateFieldArray InvSlots; - UpdateFieldArray RestInfo; - UpdateFieldArray ModDamageDonePos; - UpdateFieldArray ModDamageDoneNeg; - UpdateFieldArray ModDamageDonePercent; - UpdateFieldArray ModHealingDonePercent; - UpdateFieldArray WeaponDmgMultipliers; - UpdateFieldArray WeaponAtkSpeedMultipliers; - UpdateFieldArray BuybackPrice; - UpdateFieldArray BuybackTimestamp; - UpdateFieldArray CombatRatings; - UpdateFieldArray NoReagentCostMask; - UpdateFieldArray ProfessionSkillLine; - UpdateFieldArray BagSlotFlags; - UpdateFieldArray BankBagSlotFlags; - UpdateFieldArray QuestCompleted; - UpdateFieldArray ItemUpgradeHighWatermark; + DynamicUpdateField DailyQuestsCompleted; + DynamicUpdateField AvailableQuestLineXQuestIDs; + DynamicUpdateField Heirlooms; + DynamicUpdateField HeirloomFlags; + DynamicUpdateField Toys; + DynamicUpdateField ToyFlags; + DynamicUpdateField Transmog; + DynamicUpdateField ConditionalTransmog; + DynamicUpdateField SelfResSpells; + DynamicUpdateField RuneforgePowers; + DynamicUpdateField TransmogIllusions; + DynamicUpdateField SpellPctModByLabel; + DynamicUpdateField SpellFlatModByLabel; + DynamicUpdateField MawPowers; + DynamicUpdateField MultiFloorExploration; + DynamicUpdateField RecipeProgression; + DynamicUpdateField ReplayedQuests; + DynamicUpdateField TaskQuests; + DynamicUpdateField DisabledSpells; + DynamicUpdateField PersonalCraftingOrderCounts; + DynamicUpdateField NpcCraftingOrders; + DynamicUpdateField CategoryCooldownMods; + DynamicUpdateField WeeklySpellUses; + DynamicUpdateField TrackedCollectableSources; + DynamicUpdateField CharacterDataElements; + DynamicUpdateField AccountDataElements; + DynamicUpdateField PvpInfo; + DynamicUpdateField CharacterRestrictions; + DynamicUpdateField TraitConfigs; + DynamicUpdateField CraftingOrders; + DynamicUpdateField AccountBankTabSettings; + UpdateField FarsightObject; + UpdateField SummonedBattlePetGUID; + UpdateField Coinage; + UpdateField AccountBankCoinage; + UpdateField XP; + UpdateField NextLevelXP; + UpdateField TrialXP; + UpdateField Skill; + UpdateField CharacterPoints; + UpdateField MaxTalentTiers; + UpdateField TrackCreatureMask; + UpdateField MainhandExpertise; + UpdateField OffhandExpertise; + UpdateField RangedExpertise; + UpdateField CombatRatingExpertise; + UpdateField BlockPercentage; + UpdateField DodgePercentage; + UpdateField DodgePercentageFromAttribute; + UpdateField ParryPercentage; + UpdateField ParryPercentageFromAttribute; + UpdateField CritPercentage; + UpdateField RangedCritPercentage; + UpdateField OffhandCritPercentage; + UpdateField SpellCritPercentage; + UpdateField ShieldBlock; + UpdateField ShieldBlockCritPercentage; + UpdateField Mastery; + UpdateField Speed; + UpdateField Avoidance; + UpdateField Sturdiness; + UpdateField Versatility; + UpdateField VersatilityBonus; + UpdateField PvpPowerDamage; + UpdateField PvpPowerHealing; + UpdateField BitVectors; + UpdateField ModHealingDonePos; + UpdateField ModHealingPercent; + UpdateField ModPeriodicHealingDonePercent; + UpdateField ModSpellPowerPercent; + UpdateField ModResiliencePercent; + UpdateField OverrideSpellPowerByAPPercent; + UpdateField OverrideAPBySpellPowerPercent; + UpdateField ModTargetResistance; + UpdateField ModTargetPhysicalResistance; + UpdateField LocalFlags; + UpdateField GrantableLevels; + UpdateField MultiActionBars; + UpdateField LifetimeMaxRank; + UpdateField NumRespecs; + UpdateField PvpMedals; + UpdateField TodayHonorableKills; + UpdateField YesterdayHonorableKills; + UpdateField LifetimeHonorableKills; + UpdateField WatchedFactionIndex; + UpdateField MaxLevel; + UpdateField ScalingPlayerLevelDelta; + UpdateField MaxCreatureScalingLevel; + UpdateField PetSpellPower; + UpdateField UiHitModifier; + UpdateField UiSpellHitModifier; + UpdateField HomeRealmTimeOffset; + UpdateField ModPetHaste; + UpdateField JailersTowerLevelMax; + UpdateField JailersTowerLevel; + UpdateField LocalRegenFlags; + UpdateField AuraVision; + UpdateField NumBackpackSlots; + UpdateField OverrideSpellsID; + UpdateField LootSpecID; + UpdateField OverrideZonePVPType; + UpdateField Honor; + UpdateField HonorNextLevel; + UpdateField PerksProgramCurrency; + UpdateField NumBankSlots; + UpdateField NumAccountBankTabs; + UpdateField ResearchHistory; + UpdateField FrozenPerksVendorItem; + UpdateField Field_1410; + OptionalUpdateField QuestSession; + UpdateField UiChromieTimeExpansionID; + UpdateField TimerunningSeasonID; + UpdateField TransportServerTime; + UpdateField WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin + UpdateField DEBUGSoulbindConduitRank; + UpdateField DungeonScore; + UpdateField ActiveCombatTraitConfigID; + UpdateField ItemUpgradeHighOnehandWeaponItemID; + UpdateField ItemUpgradeHighFingerItemID; + UpdateField ItemUpgradeHighFingerWatermark; + UpdateField ItemUpgradeHighTrinketItemID; + UpdateField ItemUpgradeHighTrinketWatermark; + UpdateField LootHistoryInstanceID; + OptionalUpdateField PetStable; + UpdateField RequiredMountCapabilityFlags; + OptionalUpdateField WalkInData; + OptionalUpdateField DelveData; + UpdateFieldArray InvSlots; + UpdateFieldArray RestInfo; + UpdateFieldArray ModDamageDonePos; + UpdateFieldArray ModDamageDoneNeg; + UpdateFieldArray ModDamageDonePercent; + UpdateFieldArray ModHealingDonePercent; + UpdateFieldArray WeaponDmgMultipliers; + UpdateFieldArray WeaponAtkSpeedMultipliers; + UpdateFieldArray BuybackPrice; + UpdateFieldArray BuybackTimestamp; + UpdateFieldArray CombatRatings; + UpdateFieldArray NoReagentCostMask; + UpdateFieldArray ProfessionSkillLine; + UpdateFieldArray BagSlotFlags; + UpdateFieldArray BankBagSlotFlags; + UpdateFieldArray QuestCompleted; + UpdateFieldArray ItemUpgradeHighWatermark; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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 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,20 +350,36 @@ 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; } }; +template<> +class ViewerDependentValue +{ +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 { 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() * 8, + PLAYER_EXPLORED_ZONES_BITS = UF::size_of_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 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 // 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::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::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::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; -- cgit v1.2.3