aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-01-28 01:53:26 +0100
committerShauren <shauren.trinity@gmail.com>2023-01-28 01:53:26 +0100
commit4bec7233badf9d3ab71dbdde8b24f66f7c4eedfb (patch)
treeb0d28e475ba99293fd0ca531a82a3446a027078f /src/server/game/Entities
parent1bb9ba457418889d848998ccf6d412b1b369a5d3 (diff)
Core: Updated to 10.0.5
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h24
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp457
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h305
-rw-r--r--src/server/game/Entities/Player/Player.cpp43
-rw-r--r--src/server/game/Entities/Player/Player.h9
5 files changed, 467 insertions, 371 deletions
diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h
index 1012000322c..91b95eb0888 100644
--- a/src/server/game/Entities/GameObject/GameObjectData.h
+++ b/src/server/game/Entities/GameObject/GameObjectData.h
@@ -40,7 +40,7 @@ struct GameObjectTemplate
int32 ContentTuningId;
union
{
- // 0 GAMEOBJECT_TYPE_DOOR
+ // 0 GAMEOBJECT_TYPE_DOOR
struct
{
uint32 startOpen; // 0 startOpen, enum { false, true, }; Default: false
@@ -512,6 +512,7 @@ struct GameObjectTemplate
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 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;
// 33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
@@ -818,6 +819,12 @@ struct GameObjectTemplate
{
uint32 Profession; // 0 Profession, enum { First Aid, Blacksmithing, Leatherworking, Alchemy, Herbalism, Cooking, Mining, Tailoring, Engineering, Enchanting, Fishing, Skinning, Jewelcrafting, Inscription, Archaeology, }; Default: Blacksmithing
} craftingTable;
+ // 62 GAMEOBJECT_TYPE_PERKS_PROGRAM_CHEST
+ struct
+ {
+ uint32 Script; // 0 Script, References: SpellScript, NoValue = 0
+ uint32 autoClose; // 1 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000
+ } PerksProgramChest;
struct
{
uint32 data[MAX_GAMEOBJECT_DATA];
@@ -1052,13 +1059,14 @@ struct GameObjectTemplate
{
switch (type)
{
- case GAMEOBJECT_TYPE_DOOR: return door.autoClose;
- case GAMEOBJECT_TYPE_BUTTON: return button.autoClose;
- case GAMEOBJECT_TYPE_TRAP: return trap.autoClose;
- case GAMEOBJECT_TYPE_GOOBER: return goober.autoClose;
- case GAMEOBJECT_TYPE_TRANSPORT: return transport.autoClose;
- case GAMEOBJECT_TYPE_AREADAMAGE: return areaDamage.autoClose;
- case GAMEOBJECT_TYPE_TRAPDOOR: return trapdoor.autoClose;
+ case GAMEOBJECT_TYPE_DOOR: return door.autoClose;
+ case GAMEOBJECT_TYPE_BUTTON: return button.autoClose;
+ case GAMEOBJECT_TYPE_TRAP: return trap.autoClose;
+ case GAMEOBJECT_TYPE_GOOBER: return goober.autoClose;
+ case GAMEOBJECT_TYPE_TRANSPORT: return transport.autoClose;
+ case GAMEOBJECT_TYPE_AREADAMAGE: return areaDamage.autoClose;
+ case GAMEOBJECT_TYPE_TRAPDOOR: return trapdoor.autoClose;
+ case GAMEOBJECT_TYPE_PERKS_PROGRAM_CHEST: return PerksProgramChest.autoClose;
default: return 0;
}
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index 1b7632da868..1cb77b9afe2 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -1107,6 +1107,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << int32(LooksLikeMountID);
data << int32(LooksLikeCreatureID);
data << int32(LookAtControllerID);
+ data << int32(PerksVendorItemID);
data << int32(TaxiNodesID);
data << GuildGUID;
data << uint32(PassiveSpells.size());
@@ -1131,7 +1132,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xFC000FFFu, 0x00000001u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xF8001FFFu, 0x00000003u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1139,16 +1140,16 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x200000FEu, 0x03FFF000u, 0xFFFFFFFEu, 0x0000000Fu };
+ allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x400000FEu, 0x07FFE000u, 0xFFFFFFFCu, 0x0000001Fu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x20000000u, 0x03FFF000u, 0x00000000u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x40000000u, 0x07FFE000u, 0x00000000u, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x003FC000u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x007F8000u, 0x00000000u };
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xFC000FFFu, 0x00000001u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xF8001FFFu, 0x00000003u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -1676,108 +1677,112 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[117])
{
- data << int32(TaxiNodesID);
+ data << int32(PerksVendorItemID);
}
if (changesMask[118])
{
- data << GuildGUID;
+ data << int32(TaxiNodesID);
}
if (changesMask[119])
{
- data << int32(FlightCapabilityID);
+ data << GuildGUID;
}
if (changesMask[120])
{
- data << uint32(SilencedSchoolMask);
+ data << int32(FlightCapabilityID);
}
if (changesMask[121])
{
+ data << uint32(SilencedSchoolMask);
+ }
+ if (changesMask[122])
+ {
data << NameplateAttachToGUID;
}
}
- if (changesMask[122])
+ if (changesMask[123])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[123 + i])
+ if (changesMask[124 + i])
{
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
}
}
}
- if (changesMask[125])
+ if (changesMask[126])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[126 + i])
+ if (changesMask[127 + i])
{
data << int32(Power[i]);
}
- if (changesMask[133 + i])
+ if (changesMask[134 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[140 + i])
+ if (changesMask[141 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[147 + i])
+ if (changesMask[148 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[154])
+ if (changesMask[155])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[155 + i])
+ if (changesMask[156 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[158])
+ if (changesMask[159])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[159 + i])
+ if (changesMask[160 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[161])
+ if (changesMask[162])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[162 + i])
+ if (changesMask[163 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[166 + i])
+ if (changesMask[167 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[170 + i])
+ if (changesMask[171 + i])
{
data << int32(StatNegBuff[i]);
}
}
}
- if (changesMask[174])
+ if (changesMask[175])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[175 + i])
+ if (changesMask[176 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[182 + i])
+ if (changesMask[183 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[189 + i])
+ if (changesMask[190 + i])
{
data << int32(ManaCostModifier[i]);
}
@@ -1900,6 +1905,7 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(LooksLikeMountID);
Base::ClearChangesMask(LooksLikeCreatureID);
Base::ClearChangesMask(LookAtControllerID);
+ Base::ClearChangesMask(PerksVendorItemID);
Base::ClearChangesMask(TaxiNodesID);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(FlightCapabilityID);
@@ -3499,6 +3505,24 @@ void CraftingOrder::ClearChangesMask()
_changesMask.ResetAll();
}
+void PersonalCraftingOrderCount::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int32(ProfessionID);
+ data << uint32(Count);
+}
+
+void PersonalCraftingOrderCount::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ data << int32(ProfessionID);
+ data << uint32(Count);
+}
+
+bool PersonalCraftingOrderCount::operator==(PersonalCraftingOrderCount const& right) const
+{
+ return ProfessionID == right.ProfessionID
+ && Count == right.Count;
+}
+
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 218; ++i)
@@ -3628,6 +3652,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
}
data << int32(Honor);
data << int32(HonorNextLevel);
+ data << int32(PerksProgramCurrency);
data << uint8(NumBankSlots);
data << uint32(ResearchSites.size());
data << uint32(ResearchSiteProgress.size());
@@ -3665,6 +3690,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << uint32(TraitConfigs.size());
data << uint32(ActiveCombatTraitConfigID);
data << uint32(CraftingOrders.size());
+ data << uint32(PersonalCraftingOrderCounts.size());
for (uint32 i = 0; i < KnownTitles.size(); ++i)
{
data << uint64(KnownTitles[i]);
@@ -3749,17 +3775,23 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
data << int32(DisabledSpells[i]);
}
+ for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
+ {
+ PersonalCraftingOrderCounts[i].WriteCreate(data, owner, receiver);
+ }
data.FlushBits();
data.WriteBit(BackpackAutoSortDisabled);
data.WriteBit(BankAutoSortDisabled);
data.WriteBit(SortBagsRightToLeft);
data.WriteBit(InsertItemsLeftToRight);
+ data.WriteBit(HasPerksProgramPendingReward);
data.WriteBits(QuestSession.has_value(), 1);
- Field_1410->WriteCreate(data, owner, receiver);
+ data << FrozenPerksVendorItem;
if (QuestSession.has_value())
{
QuestSession->WriteCreate(data, owner, receiver);
}
+ Field_1410->WriteCreate(data, owner, receiver);
data << DungeonScore;
for (uint32 i = 0; i < PvpInfo.size(); ++i)
{
@@ -3814,124 +3846,128 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
if (changesMask[5])
{
+ data.WriteBit(HasPerksProgramPendingReward);
+ }
+ if (changesMask[6])
+ {
if (!ignoreNestedChangesMask)
KnownTitles.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(KnownTitles.size(), data);
}
- if (changesMask[6])
+ if (changesMask[7])
{
if (!ignoreNestedChangesMask)
PvpInfo.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);
}
- if (changesMask[7])
+ if (changesMask[8])
{
if (!ignoreNestedChangesMask)
ResearchSites.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ResearchSites.size(), data);
}
- if (changesMask[8])
+ if (changesMask[9])
{
if (!ignoreNestedChangesMask)
ResearchSiteProgress.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ResearchSiteProgress.size(), data);
}
- if (changesMask[9])
+ if (changesMask[10])
{
if (!ignoreNestedChangesMask)
DailyQuestsCompleted.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data);
}
- if (changesMask[10])
+ if (changesMask[11])
{
if (!ignoreNestedChangesMask)
AvailableQuestLineXQuestIDs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data);
}
- if (changesMask[11])
+ if (changesMask[12])
{
if (!ignoreNestedChangesMask)
Heirlooms.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data);
}
- if (changesMask[12])
+ if (changesMask[13])
{
if (!ignoreNestedChangesMask)
HeirloomFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data);
}
- if (changesMask[13])
+ if (changesMask[14])
{
if (!ignoreNestedChangesMask)
Toys.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Toys.size(), data);
}
- if (changesMask[14])
+ if (changesMask[15])
{
if (!ignoreNestedChangesMask)
ToyFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data);
}
- if (changesMask[15])
+ if (changesMask[16])
{
if (!ignoreNestedChangesMask)
Transmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data);
}
- if (changesMask[16])
+ if (changesMask[17])
{
if (!ignoreNestedChangesMask)
ConditionalTransmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data);
}
- if (changesMask[17])
+ if (changesMask[18])
{
if (!ignoreNestedChangesMask)
SelfResSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data);
}
- if (changesMask[18])
+ if (changesMask[19])
{
if (!ignoreNestedChangesMask)
RuneforgePowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data);
}
- if (changesMask[19])
+ if (changesMask[20])
{
if (!ignoreNestedChangesMask)
TransmogIllusions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data);
}
- if (changesMask[20])
+ if (changesMask[21])
{
if (!ignoreNestedChangesMask)
CharacterRestrictions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data);
}
- if (changesMask[21])
+ if (changesMask[22])
{
if (!ignoreNestedChangesMask)
SpellPctModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data);
}
- if (changesMask[22])
+ if (changesMask[23])
{
if (!ignoreNestedChangesMask)
SpellFlatModByLabel.WriteUpdateMask(data);
@@ -3939,11 +3975,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data);
}
}
- if (changesMask[30])
+ if (changesMask[32])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[31 + i])
+ if (changesMask[33 + i])
{
if (!ignoreNestedChangesMask)
Research[i].WriteUpdateMask(data);
@@ -3962,60 +3998,67 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[23])
+ if (changesMask[24])
{
if (!ignoreNestedChangesMask)
MawPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data);
}
- if (changesMask[24])
+ if (changesMask[25])
{
if (!ignoreNestedChangesMask)
MultiFloorExploration.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data);
}
- if (changesMask[25])
+ if (changesMask[26])
{
if (!ignoreNestedChangesMask)
RecipeProgression.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data);
}
- if (changesMask[26])
+ if (changesMask[27])
{
if (!ignoreNestedChangesMask)
ReplayedQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data);
}
- if (changesMask[27])
+ if (changesMask[28])
{
if (!ignoreNestedChangesMask)
DisabledSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data);
}
- if (changesMask[28])
+ if (changesMask[29])
{
if (!ignoreNestedChangesMask)
TraitConfigs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data);
}
- if (changesMask[29])
+ if (changesMask[30])
{
if (!ignoreNestedChangesMask)
CraftingOrders.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);
}
+ if (changesMask[31])
+ {
+ if (!ignoreNestedChangesMask)
+ PersonalCraftingOrderCounts.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data);
+ }
}
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[5])
+ if (changesMask[6])
{
for (uint32 i = 0; i < KnownTitles.size(); ++i)
{
@@ -4025,7 +4068,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[7])
+ if (changesMask[8])
{
for (uint32 i = 0; i < ResearchSites.size(); ++i)
{
@@ -4035,7 +4078,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[8])
+ if (changesMask[9])
{
for (uint32 i = 0; i < ResearchSiteProgress.size(); ++i)
{
@@ -4045,7 +4088,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[9])
+ if (changesMask[10])
{
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
@@ -4055,7 +4098,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[10])
+ if (changesMask[11])
{
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
@@ -4065,7 +4108,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[11])
+ if (changesMask[12])
{
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
@@ -4075,7 +4118,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[12])
+ if (changesMask[13])
{
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
@@ -4085,7 +4128,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[13])
+ if (changesMask[14])
{
for (uint32 i = 0; i < Toys.size(); ++i)
{
@@ -4095,7 +4138,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[14])
+ if (changesMask[15])
{
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
@@ -4105,7 +4148,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[15])
+ if (changesMask[16])
{
for (uint32 i = 0; i < Transmog.size(); ++i)
{
@@ -4115,7 +4158,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[16])
+ if (changesMask[17])
{
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
@@ -4125,7 +4168,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[17])
+ if (changesMask[18])
{
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
@@ -4135,7 +4178,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[18])
+ if (changesMask[19])
{
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
@@ -4145,7 +4188,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[19])
+ if (changesMask[20])
{
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
@@ -4155,7 +4198,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[21])
+ if (changesMask[22])
{
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
@@ -4165,7 +4208,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[22])
+ if (changesMask[23])
{
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
@@ -4175,7 +4218,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[23])
+ if (changesMask[24])
{
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
@@ -4185,7 +4228,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[24])
+ if (changesMask[25])
{
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
@@ -4195,7 +4238,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[25])
+ if (changesMask[26])
{
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
@@ -4205,7 +4248,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[26])
+ if (changesMask[27])
{
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
@@ -4215,7 +4258,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[27])
+ if (changesMask[28])
{
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
@@ -4225,7 +4268,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[6])
+ if (changesMask[31])
+ {
+ for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
+ {
+ if (PersonalCraftingOrderCounts.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ PersonalCraftingOrderCounts[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[7])
{
for (uint32 i = 0; i < PvpInfo.size(); ++i)
{
@@ -4235,7 +4288,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[20])
+ if (changesMask[21])
{
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
@@ -4245,7 +4298,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[28])
+ if (changesMask[29])
{
for (uint32 i = 0; i < TraitConfigs.size(); ++i)
{
@@ -4255,7 +4308,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[29])
+ if (changesMask[30])
{
for (uint32 i = 0; i < CraftingOrders.size(); ++i)
{
@@ -4265,324 +4318,328 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[32])
- {
- data << FarsightObject;
- }
- if (changesMask[33])
- {
- data << SummonedBattlePetGUID;
- }
}
if (changesMask[34])
{
if (changesMask[35])
{
- data << uint64(Coinage);
+ data << FarsightObject;
}
if (changesMask[36])
{
- data << int32(XP);
+ data << SummonedBattlePetGUID;
}
if (changesMask[37])
{
- data << int32(NextLevelXP);
+ data << uint64(Coinage);
}
if (changesMask[38])
{
- data << int32(TrialXP);
+ data << int32(XP);
}
if (changesMask[39])
{
- Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << int32(NextLevelXP);
}
if (changesMask[40])
{
- data << int32(CharacterPoints);
+ data << int32(TrialXP);
}
if (changesMask[41])
{
- data << int32(MaxTalentTiers);
+ Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[42])
{
- data << uint32(TrackCreatureMask);
+ data << int32(CharacterPoints);
}
if (changesMask[43])
{
- data << float(MainhandExpertise);
+ data << int32(MaxTalentTiers);
}
if (changesMask[44])
{
- data << float(OffhandExpertise);
+ data << uint32(TrackCreatureMask);
}
if (changesMask[45])
{
- data << float(RangedExpertise);
+ data << float(MainhandExpertise);
}
if (changesMask[46])
{
- data << float(CombatRatingExpertise);
+ data << float(OffhandExpertise);
}
if (changesMask[47])
{
- data << float(BlockPercentage);
+ data << float(RangedExpertise);
}
if (changesMask[48])
{
- data << float(DodgePercentage);
+ data << float(CombatRatingExpertise);
}
if (changesMask[49])
{
- data << float(DodgePercentageFromAttribute);
+ data << float(BlockPercentage);
}
if (changesMask[50])
{
- data << float(ParryPercentage);
+ data << float(DodgePercentage);
}
if (changesMask[51])
{
- data << float(ParryPercentageFromAttribute);
+ data << float(DodgePercentageFromAttribute);
}
if (changesMask[52])
{
- data << float(CritPercentage);
+ data << float(ParryPercentage);
}
if (changesMask[53])
{
- data << float(RangedCritPercentage);
+ data << float(ParryPercentageFromAttribute);
}
if (changesMask[54])
{
- data << float(OffhandCritPercentage);
+ data << float(CritPercentage);
}
if (changesMask[55])
{
- data << float(SpellCritPercentage);
+ data << float(RangedCritPercentage);
}
if (changesMask[56])
{
- data << int32(ShieldBlock);
+ data << float(OffhandCritPercentage);
}
if (changesMask[57])
{
- data << float(ShieldBlockCritPercentage);
+ data << float(SpellCritPercentage);
}
if (changesMask[58])
{
- data << float(Mastery);
+ data << int32(ShieldBlock);
}
if (changesMask[59])
{
- data << float(Speed);
+ data << float(ShieldBlockCritPercentage);
}
if (changesMask[60])
{
- data << float(Avoidance);
+ data << float(Mastery);
}
if (changesMask[61])
{
- data << float(Sturdiness);
+ data << float(Speed);
}
if (changesMask[62])
{
- data << int32(Versatility);
+ data << float(Avoidance);
}
if (changesMask[63])
{
- data << float(VersatilityBonus);
+ data << float(Sturdiness);
}
if (changesMask[64])
{
- data << float(PvpPowerDamage);
+ data << int32(Versatility);
}
if (changesMask[65])
{
- data << float(PvpPowerHealing);
+ data << float(VersatilityBonus);
}
}
if (changesMask[66])
{
if (changesMask[67])
{
- data << int32(ModHealingDonePos);
+ data << float(PvpPowerDamage);
}
if (changesMask[68])
{
- data << float(ModHealingPercent);
+ data << float(PvpPowerHealing);
}
if (changesMask[69])
{
- data << float(ModPeriodicHealingDonePercent);
+ data << int32(ModHealingDonePos);
}
if (changesMask[70])
{
- data << float(ModSpellPowerPercent);
+ data << float(ModHealingPercent);
}
if (changesMask[71])
{
- data << float(ModResiliencePercent);
+ data << float(ModPeriodicHealingDonePercent);
}
if (changesMask[72])
{
- data << float(OverrideSpellPowerByAPPercent);
+ data << float(ModSpellPowerPercent);
}
if (changesMask[73])
{
- data << float(OverrideAPBySpellPowerPercent);
+ data << float(ModResiliencePercent);
}
if (changesMask[74])
{
- data << int32(ModTargetResistance);
+ data << float(OverrideSpellPowerByAPPercent);
}
if (changesMask[75])
{
- data << int32(ModTargetPhysicalResistance);
+ data << float(OverrideAPBySpellPowerPercent);
}
if (changesMask[76])
{
- data << uint32(LocalFlags);
+ data << int32(ModTargetResistance);
}
if (changesMask[77])
{
- data << uint8(GrantableLevels);
+ data << int32(ModTargetPhysicalResistance);
}
if (changesMask[78])
{
- data << uint8(MultiActionBars);
+ data << uint32(LocalFlags);
}
if (changesMask[79])
{
- data << uint8(LifetimeMaxRank);
+ data << uint8(GrantableLevels);
}
if (changesMask[80])
{
- data << uint8(NumRespecs);
+ data << uint8(MultiActionBars);
}
if (changesMask[81])
{
- data << uint32(PvpMedals);
+ data << uint8(LifetimeMaxRank);
}
if (changesMask[82])
{
- data << uint16(TodayHonorableKills);
+ data << uint8(NumRespecs);
}
if (changesMask[83])
{
- data << uint16(YesterdayHonorableKills);
+ data << uint32(PvpMedals);
}
if (changesMask[84])
{
- data << uint32(LifetimeHonorableKills);
+ data << uint16(TodayHonorableKills);
}
if (changesMask[85])
{
- data << int32(WatchedFactionIndex);
+ data << uint16(YesterdayHonorableKills);
}
if (changesMask[86])
{
- data << int32(MaxLevel);
+ data << uint32(LifetimeHonorableKills);
}
if (changesMask[87])
{
- data << int32(ScalingPlayerLevelDelta);
+ data << int32(WatchedFactionIndex);
}
if (changesMask[88])
{
- data << int32(MaxCreatureScalingLevel);
+ data << int32(MaxLevel);
}
if (changesMask[89])
{
- data << int32(PetSpellPower);
+ data << int32(ScalingPlayerLevelDelta);
}
if (changesMask[90])
{
- data << float(UiHitModifier);
+ data << int32(MaxCreatureScalingLevel);
}
if (changesMask[91])
{
- data << float(UiSpellHitModifier);
+ data << int32(PetSpellPower);
}
if (changesMask[92])
{
- data << int32(HomeRealmTimeOffset);
+ data << float(UiHitModifier);
}
if (changesMask[93])
{
- data << float(ModPetHaste);
+ data << float(UiSpellHitModifier);
}
if (changesMask[94])
{
- data << int8(JailersTowerLevelMax);
+ data << int32(HomeRealmTimeOffset);
}
if (changesMask[95])
{
- data << int8(JailersTowerLevel);
+ data << float(ModPetHaste);
}
if (changesMask[96])
{
- data << uint8(LocalRegenFlags);
+ data << int8(JailersTowerLevelMax);
}
if (changesMask[97])
{
- data << uint8(AuraVision);
+ data << int8(JailersTowerLevel);
}
}
if (changesMask[98])
{
if (changesMask[99])
{
- data << uint8(NumBackpackSlots);
+ data << uint8(LocalRegenFlags);
}
if (changesMask[100])
{
- data << int32(OverrideSpellsID);
+ data << uint8(AuraVision);
}
if (changesMask[101])
{
- data << uint16(LootSpecID);
+ data << uint8(NumBackpackSlots);
}
if (changesMask[102])
{
- data << uint32(OverrideZonePVPType);
+ data << int32(OverrideSpellsID);
}
if (changesMask[103])
{
- data << BnetAccount;
+ data << uint16(LootSpecID);
}
if (changesMask[104])
{
- data << uint64(GuildClubMemberID);
+ data << uint32(OverrideZonePVPType);
}
if (changesMask[105])
{
- data << int32(Honor);
+ data << BnetAccount;
}
if (changesMask[106])
{
- data << int32(HonorNextLevel);
+ data << uint64(GuildClubMemberID);
}
if (changesMask[107])
{
- data << uint8(NumBankSlots);
+ data << int32(Honor);
+ }
+ if (changesMask[108])
+ {
+ data << int32(HonorNextLevel);
+ }
+ if (changesMask[109])
+ {
+ data << int32(PerksProgramCurrency);
}
if (changesMask[110])
{
+ data << uint8(NumBankSlots);
+ }
+ if (changesMask[114])
+ {
data << int32(UiChromieTimeExpansionID);
}
- if (changesMask[111])
+ if (changesMask[115])
{
data << int32(TransportServerTime);
}
- if (changesMask[112])
+ if (changesMask[116])
{
data << uint32(WeeklyRewardsPeriodSinceOrigin);
}
- if (changesMask[113])
+ if (changesMask[117])
{
data << int16(DEBUGSoulbindConduitRank);
}
- if (changesMask[115])
+ if (changesMask[119])
{
data << uint32(ActiveCombatTraitConfigID);
}
@@ -4590,157 +4647,161 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
if (changesMask[98])
{
data.WriteBits(QuestSession.has_value(), 1);
- if (changesMask[109])
+ if (changesMask[111])
{
- Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << FrozenPerksVendorItem;
}
- if (changesMask[108])
+ if (changesMask[112])
{
if (QuestSession.has_value())
{
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
- if (changesMask[114])
+ if (changesMask[113])
+ {
+ Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[118])
{
data << DungeonScore;
}
}
- if (changesMask[116])
+ if (changesMask[120])
{
for (uint32 i = 0; i < 218; ++i)
{
- if (changesMask[117 + i])
+ if (changesMask[121 + i])
{
data << InvSlots[i];
}
}
}
- if (changesMask[335])
+ if (changesMask[339])
{
for (uint32 i = 0; i < 240; ++i)
{
- if (changesMask[336 + i])
+ if (changesMask[340 + i])
{
data << uint64(ExploredZones[i]);
}
}
}
- if (changesMask[576])
+ if (changesMask[580])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[577 + i])
+ if (changesMask[581 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[579])
+ if (changesMask[583])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[580 + i])
+ if (changesMask[584 + i])
{
data << int32(ModDamageDonePos[i]);
}
- if (changesMask[587 + i])
+ if (changesMask[591 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
- if (changesMask[594 + i])
+ if (changesMask[598 + i])
{
data << float(ModDamageDonePercent[i]);
}
- if (changesMask[601 + i])
+ if (changesMask[605 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
- if (changesMask[608])
+ if (changesMask[612])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[609 + i])
+ if (changesMask[613 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
- if (changesMask[612 + i])
+ if (changesMask[616 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
- if (changesMask[615])
+ if (changesMask[619])
{
for (uint32 i = 0; i < 12; ++i)
{
- if (changesMask[616 + i])
+ if (changesMask[620 + i])
{
data << uint32(BuybackPrice[i]);
}
- if (changesMask[628 + i])
+ if (changesMask[632 + i])
{
data << int64(BuybackTimestamp[i]);
}
}
}
- if (changesMask[640])
+ if (changesMask[644])
{
for (uint32 i = 0; i < 32; ++i)
{
- if (changesMask[641 + i])
+ if (changesMask[645 + i])
{
data << int32(CombatRatings[i]);
}
}
}
- if (changesMask[673])
+ if (changesMask[677])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[674 + i])
+ if (changesMask[678 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
- if (changesMask[678])
+ if (changesMask[682])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[679 + i])
+ if (changesMask[683 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
- if (changesMask[681])
+ if (changesMask[685])
{
for (uint32 i = 0; i < 5; ++i)
{
- if (changesMask[682 + i])
+ if (changesMask[686 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
- if (changesMask[687])
+ if (changesMask[691])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[688 + i])
+ if (changesMask[692 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
- if (changesMask[695])
+ if (changesMask[699])
{
for (uint32 i = 0; i < 875; ++i)
{
- if (changesMask[696 + i])
+ if (changesMask[700 + i])
{
data << uint64(QuestCompleted[i]);
}
@@ -4755,6 +4816,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(BankAutoSortDisabled);
Base::ClearChangesMask(SortBagsRightToLeft);
Base::ClearChangesMask(InsertItemsLeftToRight);
+ Base::ClearChangesMask(HasPerksProgramPendingReward);
Base::ClearChangesMask(Research);
Base::ClearChangesMask(KnownTitles);
Base::ClearChangesMask(ResearchSites);
@@ -4777,6 +4839,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(RecipeProgression);
Base::ClearChangesMask(ReplayedQuests);
Base::ClearChangesMask(DisabledSpells);
+ Base::ClearChangesMask(PersonalCraftingOrderCounts);
Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(CharacterRestrictions);
Base::ClearChangesMask(TraitConfigs);
@@ -4853,7 +4916,9 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(GuildClubMemberID);
Base::ClearChangesMask(Honor);
Base::ClearChangesMask(HonorNextLevel);
+ Base::ClearChangesMask(PerksProgramCurrency);
Base::ClearChangesMask(NumBankSlots);
+ Base::ClearChangesMask(FrozenPerksVendorItem);
Base::ClearChangesMask(Field_1410);
Base::ClearChangesMask(QuestSession);
Base::ClearChangesMask(UiChromieTimeExpansionID);
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index a075a11ab81..3048896d2f7 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -22,6 +22,7 @@
#include "ItemPacketsCommon.h"
#include "MythicPlusPacketsCommon.h"
#include "ObjectGuid.h"
+#include "PerksProgramPacketsCommon.h"
#include "Position.h"
#include "QuaternionData.h"
#include "UpdateField.h"
@@ -255,7 +256,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<197>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
@@ -376,25 +377,26 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196>
UpdateField<int32, 96, 114> LooksLikeMountID;
UpdateField<int32, 96, 115> LooksLikeCreatureID;
UpdateField<int32, 96, 116> LookAtControllerID;
- UpdateField<int32, 96, 117> TaxiNodesID;
- UpdateField<ObjectGuid, 96, 118> GuildGUID;
- UpdateField<int32, 96, 119> FlightCapabilityID;
- UpdateField<uint32, 96, 120> SilencedSchoolMask;
- UpdateField<ObjectGuid, 96, 121> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 122, 123> NpcFlags;
+ UpdateField<int32, 96, 117> PerksVendorItemID;
+ UpdateField<int32, 96, 118> TaxiNodesID;
+ UpdateField<ObjectGuid, 96, 119> GuildGUID;
+ UpdateField<int32, 96, 120> FlightCapabilityID;
+ UpdateField<uint32, 96, 121> SilencedSchoolMask;
+ UpdateField<ObjectGuid, 96, 122> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<uint32, 2, 123, 124> NpcFlags;
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateFieldArray<int32, 7, 125, 126> Power;
- UpdateFieldArray<int32, 7, 125, 133> MaxPower;
- UpdateFieldArray<float, 7, 125, 140> PowerRegenFlatModifier;
- UpdateFieldArray<float, 7, 125, 147> PowerRegenInterruptedFlatModifier;
- UpdateFieldArray<UF::VisibleItem, 3, 154, 155> VirtualItems;
- UpdateFieldArray<uint32, 2, 158, 159> AttackRoundBaseTime;
- UpdateFieldArray<int32, 4, 161, 162> Stats;
- UpdateFieldArray<int32, 4, 161, 166> StatPosBuff;
- UpdateFieldArray<int32, 4, 161, 170> StatNegBuff;
- UpdateFieldArray<int32, 7, 174, 175> Resistances;
- UpdateFieldArray<int32, 7, 174, 182> BonusResistanceMods;
- UpdateFieldArray<int32, 7, 174, 189> ManaCostModifier;
+ UpdateFieldArray<int32, 7, 126, 127> Power;
+ UpdateFieldArray<int32, 7, 126, 134> MaxPower;
+ UpdateFieldArray<float, 7, 126, 141> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 7, 126, 148> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 155, 156> VirtualItems;
+ UpdateFieldArray<uint32, 2, 159, 160> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 162, 163> Stats;
+ UpdateFieldArray<int32, 4, 162, 167> StatPosBuff;
+ UpdateFieldArray<int32, 4, 162, 171> StatNegBuff;
+ UpdateFieldArray<int32, 7, 175, 176> Resistances;
+ UpdateFieldArray<int32, 7, 175, 183> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 175, 190> ManaCostModifier;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
@@ -751,136 +753,151 @@ struct CraftingOrder : public IsUpdateFieldStructureTag, public HasChangesMask<4
void ClearChangesMask();
};
-struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1571>
+struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag
+{
+ int32 ProfessionID;
+ uint32 Count;
+
+ 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==(PersonalCraftingOrderCount const& right) const;
+ bool operator!=(PersonalCraftingOrderCount const& right) const { return !(*this == right); }
+};
+
+struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1575>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BankAutoSortDisabled;
UpdateField<bool, 0, 3> SortBagsRightToLeft;
UpdateField<bool, 0, 4> InsertItemsLeftToRight;
- UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 30, 31> Research;
- DynamicUpdateField<uint64, 0, 5> KnownTitles;
- DynamicUpdateField<uint16, 0, 7> ResearchSites;
- DynamicUpdateField<uint32, 0, 8> ResearchSiteProgress;
- DynamicUpdateField<int32, 0, 9> DailyQuestsCompleted;
- DynamicUpdateField<int32, 0, 10> AvailableQuestLineXQuestIDs;
- DynamicUpdateField<int32, 0, 11> Heirlooms;
- DynamicUpdateField<uint32, 0, 12> HeirloomFlags;
- DynamicUpdateField<int32, 0, 13> Toys;
- DynamicUpdateField<uint32, 0, 14> ToyFlags;
- DynamicUpdateField<uint32, 0, 15> Transmog;
- DynamicUpdateField<int32, 0, 16> ConditionalTransmog;
- DynamicUpdateField<int32, 0, 17> SelfResSpells;
- DynamicUpdateField<uint32, 0, 18> RuneforgePowers;
- DynamicUpdateField<uint32, 0, 19> TransmogIllusions;
- DynamicUpdateField<UF::SpellPctModByLabel, 0, 21> SpellPctModByLabel;
- DynamicUpdateField<UF::SpellFlatModByLabel, 0, 22> SpellFlatModByLabel;
- DynamicUpdateField<UF::MawPower, 0, 23> MawPowers;
- DynamicUpdateField<UF::MultiFloorExplore, 0, 24> MultiFloorExploration;
- DynamicUpdateField<UF::RecipeProgressionInfo, 0, 25> RecipeProgression;
- DynamicUpdateField<UF::ReplayedQuest, 0, 26> ReplayedQuests;
- DynamicUpdateField<int32, 0, 27> DisabledSpells;
- DynamicUpdateField<UF::PVPInfo, 0, 6> PvpInfo;
- DynamicUpdateField<UF::CharacterRestriction, 0, 20> CharacterRestrictions;
- DynamicUpdateField<UF::TraitConfig, 0, 28> TraitConfigs;
- DynamicUpdateField<UF::CraftingOrder, 0, 29> CraftingOrders;
- UpdateField<ObjectGuid, 0, 32> FarsightObject;
- UpdateField<ObjectGuid, 0, 33> SummonedBattlePetGUID;
- UpdateField<uint64, 34, 35> Coinage;
- UpdateField<int32, 34, 36> XP;
- UpdateField<int32, 34, 37> NextLevelXP;
- UpdateField<int32, 34, 38> TrialXP;
- UpdateField<UF::SkillInfo, 34, 39> Skill;
- UpdateField<int32, 34, 40> CharacterPoints;
- UpdateField<int32, 34, 41> MaxTalentTiers;
- UpdateField<uint32, 34, 42> TrackCreatureMask;
- UpdateField<float, 34, 43> MainhandExpertise;
- UpdateField<float, 34, 44> OffhandExpertise;
- UpdateField<float, 34, 45> RangedExpertise;
- UpdateField<float, 34, 46> CombatRatingExpertise;
- UpdateField<float, 34, 47> BlockPercentage;
- UpdateField<float, 34, 48> DodgePercentage;
- UpdateField<float, 34, 49> DodgePercentageFromAttribute;
- UpdateField<float, 34, 50> ParryPercentage;
- UpdateField<float, 34, 51> ParryPercentageFromAttribute;
- UpdateField<float, 34, 52> CritPercentage;
- UpdateField<float, 34, 53> RangedCritPercentage;
- UpdateField<float, 34, 54> OffhandCritPercentage;
- UpdateField<float, 34, 55> SpellCritPercentage;
- UpdateField<int32, 34, 56> ShieldBlock;
- UpdateField<float, 34, 57> ShieldBlockCritPercentage;
- UpdateField<float, 34, 58> Mastery;
- UpdateField<float, 34, 59> Speed;
- UpdateField<float, 34, 60> Avoidance;
- UpdateField<float, 34, 61> Sturdiness;
- UpdateField<int32, 34, 62> Versatility;
- UpdateField<float, 34, 63> VersatilityBonus;
- UpdateField<float, 34, 64> PvpPowerDamage;
- UpdateField<float, 34, 65> PvpPowerHealing;
- UpdateField<int32, 66, 67> ModHealingDonePos;
- UpdateField<float, 66, 68> ModHealingPercent;
- UpdateField<float, 66, 69> ModPeriodicHealingDonePercent;
- UpdateField<float, 66, 70> ModSpellPowerPercent;
- UpdateField<float, 66, 71> ModResiliencePercent;
- UpdateField<float, 66, 72> OverrideSpellPowerByAPPercent;
- UpdateField<float, 66, 73> OverrideAPBySpellPowerPercent;
- UpdateField<int32, 66, 74> ModTargetResistance;
- UpdateField<int32, 66, 75> ModTargetPhysicalResistance;
- UpdateField<uint32, 66, 76> LocalFlags;
- UpdateField<uint8, 66, 77> GrantableLevels;
- UpdateField<uint8, 66, 78> MultiActionBars;
- UpdateField<uint8, 66, 79> LifetimeMaxRank;
- UpdateField<uint8, 66, 80> NumRespecs;
- UpdateField<uint32, 66, 81> PvpMedals;
- UpdateField<uint16, 66, 82> TodayHonorableKills;
- UpdateField<uint16, 66, 83> YesterdayHonorableKills;
- UpdateField<uint32, 66, 84> LifetimeHonorableKills;
- UpdateField<int32, 66, 85> WatchedFactionIndex;
- UpdateField<int32, 66, 86> MaxLevel;
- UpdateField<int32, 66, 87> ScalingPlayerLevelDelta;
- UpdateField<int32, 66, 88> MaxCreatureScalingLevel;
- UpdateField<int32, 66, 89> PetSpellPower;
- UpdateField<float, 66, 90> UiHitModifier;
- UpdateField<float, 66, 91> UiSpellHitModifier;
- UpdateField<int32, 66, 92> HomeRealmTimeOffset;
- UpdateField<float, 66, 93> ModPetHaste;
- UpdateField<int8, 66, 94> JailersTowerLevelMax;
- UpdateField<int8, 66, 95> JailersTowerLevel;
- UpdateField<uint8, 66, 96> LocalRegenFlags;
- UpdateField<uint8, 66, 97> AuraVision;
- UpdateField<uint8, 98, 99> NumBackpackSlots;
- UpdateField<int32, 98, 100> OverrideSpellsID;
- UpdateField<uint16, 98, 101> LootSpecID;
- UpdateField<uint32, 98, 102> OverrideZonePVPType;
- UpdateField<ObjectGuid, 98, 103> BnetAccount;
- UpdateField<uint64, 98, 104> GuildClubMemberID;
- UpdateField<int32, 98, 105> Honor;
- UpdateField<int32, 98, 106> HonorNextLevel;
- UpdateField<uint8, 98, 107> NumBankSlots;
- UpdateField<UF::ActivePlayerUnk901, 98, 109> Field_1410;
- OptionalUpdateField<UF::QuestSession, 98, 108> QuestSession;
- UpdateField<int32, 98, 110> UiChromieTimeExpansionID;
- UpdateField<int32, 98, 111> TransportServerTime;
- UpdateField<uint32, 98, 112> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
- UpdateField<int16, 98, 113> DEBUGSoulbindConduitRank;
- UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 114> DungeonScore;
- UpdateField<uint32, 98, 115> ActiveCombatTraitConfigID;
- UpdateFieldArray<ObjectGuid, 218, 116, 117> InvSlots;
- UpdateFieldArray<uint64, 240, 335, 336> ExploredZones;
- UpdateFieldArray<UF::RestInfo, 2, 576, 577> RestInfo;
- UpdateFieldArray<int32, 7, 579, 580> ModDamageDonePos;
- UpdateFieldArray<int32, 7, 579, 587> ModDamageDoneNeg;
- UpdateFieldArray<float, 7, 579, 594> ModDamageDonePercent;
- UpdateFieldArray<float, 7, 579, 601> ModHealingDonePercent;
- UpdateFieldArray<float, 3, 608, 609> WeaponDmgMultipliers;
- UpdateFieldArray<float, 3, 608, 612> WeaponAtkSpeedMultipliers;
- UpdateFieldArray<uint32, 12, 615, 616> BuybackPrice;
- UpdateFieldArray<int64, 12, 615, 628> BuybackTimestamp;
- UpdateFieldArray<int32, 32, 640, 641> CombatRatings;
- UpdateFieldArray<uint32, 4, 673, 674> NoReagentCostMask;
- UpdateFieldArray<int32, 2, 678, 679> ProfessionSkillLine;
- UpdateFieldArray<uint32, 5, 681, 682> BagSlotFlags;
- UpdateFieldArray<uint32, 7, 687, 688> BankBagSlotFlags;
- UpdateFieldArray<uint64, 875, 695, 696> QuestCompleted;
+ UpdateField<bool, 0, 5> HasPerksProgramPendingReward;
+ UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 32, 33> Research;
+ DynamicUpdateField<uint64, 0, 6> KnownTitles;
+ DynamicUpdateField<uint16, 0, 8> ResearchSites;
+ DynamicUpdateField<uint32, 0, 9> ResearchSiteProgress;
+ DynamicUpdateField<int32, 0, 10> DailyQuestsCompleted;
+ DynamicUpdateField<int32, 0, 11> AvailableQuestLineXQuestIDs;
+ DynamicUpdateField<int32, 0, 12> Heirlooms;
+ DynamicUpdateField<uint32, 0, 13> HeirloomFlags;
+ DynamicUpdateField<int32, 0, 14> Toys;
+ DynamicUpdateField<uint32, 0, 15> ToyFlags;
+ DynamicUpdateField<uint32, 0, 16> Transmog;
+ DynamicUpdateField<int32, 0, 17> ConditionalTransmog;
+ DynamicUpdateField<int32, 0, 18> SelfResSpells;
+ DynamicUpdateField<uint32, 0, 19> RuneforgePowers;
+ DynamicUpdateField<uint32, 0, 20> TransmogIllusions;
+ DynamicUpdateField<UF::SpellPctModByLabel, 0, 22> SpellPctModByLabel;
+ DynamicUpdateField<UF::SpellFlatModByLabel, 0, 23> SpellFlatModByLabel;
+ DynamicUpdateField<UF::MawPower, 0, 24> MawPowers;
+ DynamicUpdateField<UF::MultiFloorExplore, 0, 25> MultiFloorExploration;
+ DynamicUpdateField<UF::RecipeProgressionInfo, 0, 26> RecipeProgression;
+ DynamicUpdateField<UF::ReplayedQuest, 0, 27> ReplayedQuests;
+ DynamicUpdateField<int32, 0, 28> DisabledSpells;
+ DynamicUpdateField<UF::PersonalCraftingOrderCount, 0, 31> PersonalCraftingOrderCounts;
+ DynamicUpdateField<UF::PVPInfo, 0, 7> PvpInfo;
+ DynamicUpdateField<UF::CharacterRestriction, 0, 21> CharacterRestrictions;
+ DynamicUpdateField<UF::TraitConfig, 0, 29> TraitConfigs;
+ DynamicUpdateField<UF::CraftingOrder, 0, 30> CraftingOrders;
+ UpdateField<ObjectGuid, 34, 35> FarsightObject;
+ UpdateField<ObjectGuid, 34, 36> SummonedBattlePetGUID;
+ UpdateField<uint64, 34, 37> Coinage;
+ UpdateField<int32, 34, 38> XP;
+ UpdateField<int32, 34, 39> NextLevelXP;
+ UpdateField<int32, 34, 40> TrialXP;
+ UpdateField<UF::SkillInfo, 34, 41> Skill;
+ UpdateField<int32, 34, 42> CharacterPoints;
+ UpdateField<int32, 34, 43> MaxTalentTiers;
+ UpdateField<uint32, 34, 44> TrackCreatureMask;
+ UpdateField<float, 34, 45> MainhandExpertise;
+ UpdateField<float, 34, 46> OffhandExpertise;
+ UpdateField<float, 34, 47> RangedExpertise;
+ UpdateField<float, 34, 48> CombatRatingExpertise;
+ UpdateField<float, 34, 49> BlockPercentage;
+ UpdateField<float, 34, 50> DodgePercentage;
+ UpdateField<float, 34, 51> DodgePercentageFromAttribute;
+ UpdateField<float, 34, 52> ParryPercentage;
+ UpdateField<float, 34, 53> ParryPercentageFromAttribute;
+ UpdateField<float, 34, 54> CritPercentage;
+ UpdateField<float, 34, 55> RangedCritPercentage;
+ UpdateField<float, 34, 56> OffhandCritPercentage;
+ UpdateField<float, 34, 57> SpellCritPercentage;
+ UpdateField<int32, 34, 58> ShieldBlock;
+ UpdateField<float, 34, 59> ShieldBlockCritPercentage;
+ UpdateField<float, 34, 60> Mastery;
+ UpdateField<float, 34, 61> Speed;
+ UpdateField<float, 34, 62> Avoidance;
+ UpdateField<float, 34, 63> Sturdiness;
+ UpdateField<int32, 34, 64> Versatility;
+ UpdateField<float, 34, 65> VersatilityBonus;
+ UpdateField<float, 66, 67> PvpPowerDamage;
+ UpdateField<float, 66, 68> PvpPowerHealing;
+ UpdateField<int32, 66, 69> ModHealingDonePos;
+ UpdateField<float, 66, 70> ModHealingPercent;
+ UpdateField<float, 66, 71> ModPeriodicHealingDonePercent;
+ UpdateField<float, 66, 72> ModSpellPowerPercent;
+ UpdateField<float, 66, 73> ModResiliencePercent;
+ UpdateField<float, 66, 74> OverrideSpellPowerByAPPercent;
+ UpdateField<float, 66, 75> OverrideAPBySpellPowerPercent;
+ UpdateField<int32, 66, 76> ModTargetResistance;
+ UpdateField<int32, 66, 77> ModTargetPhysicalResistance;
+ UpdateField<uint32, 66, 78> LocalFlags;
+ UpdateField<uint8, 66, 79> GrantableLevels;
+ UpdateField<uint8, 66, 80> MultiActionBars;
+ UpdateField<uint8, 66, 81> LifetimeMaxRank;
+ UpdateField<uint8, 66, 82> NumRespecs;
+ UpdateField<uint32, 66, 83> PvpMedals;
+ UpdateField<uint16, 66, 84> TodayHonorableKills;
+ UpdateField<uint16, 66, 85> YesterdayHonorableKills;
+ UpdateField<uint32, 66, 86> LifetimeHonorableKills;
+ UpdateField<int32, 66, 87> WatchedFactionIndex;
+ UpdateField<int32, 66, 88> MaxLevel;
+ UpdateField<int32, 66, 89> ScalingPlayerLevelDelta;
+ UpdateField<int32, 66, 90> MaxCreatureScalingLevel;
+ UpdateField<int32, 66, 91> PetSpellPower;
+ UpdateField<float, 66, 92> UiHitModifier;
+ UpdateField<float, 66, 93> UiSpellHitModifier;
+ UpdateField<int32, 66, 94> HomeRealmTimeOffset;
+ UpdateField<float, 66, 95> ModPetHaste;
+ UpdateField<int8, 66, 96> JailersTowerLevelMax;
+ UpdateField<int8, 66, 97> JailersTowerLevel;
+ UpdateField<uint8, 98, 99> LocalRegenFlags;
+ UpdateField<uint8, 98, 100> AuraVision;
+ UpdateField<uint8, 98, 101> NumBackpackSlots;
+ UpdateField<int32, 98, 102> OverrideSpellsID;
+ UpdateField<uint16, 98, 103> LootSpecID;
+ UpdateField<uint32, 98, 104> OverrideZonePVPType;
+ UpdateField<ObjectGuid, 98, 105> BnetAccount;
+ UpdateField<uint64, 98, 106> GuildClubMemberID;
+ UpdateField<int32, 98, 107> Honor;
+ UpdateField<int32, 98, 108> HonorNextLevel;
+ UpdateField<int32, 98, 109> PerksProgramCurrency;
+ UpdateField<uint8, 98, 110> NumBankSlots;
+ UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 98, 111> FrozenPerksVendorItem;
+ UpdateField<UF::ActivePlayerUnk901, 98, 113> Field_1410;
+ OptionalUpdateField<UF::QuestSession, 98, 112> QuestSession;
+ UpdateField<int32, 98, 114> UiChromieTimeExpansionID;
+ UpdateField<int32, 98, 115> TransportServerTime;
+ UpdateField<uint32, 98, 116> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
+ UpdateField<int16, 98, 117> DEBUGSoulbindConduitRank;
+ UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 118> DungeonScore;
+ UpdateField<uint32, 98, 119> ActiveCombatTraitConfigID;
+ UpdateFieldArray<ObjectGuid, 218, 120, 121> InvSlots;
+ UpdateFieldArray<uint64, 240, 339, 340> ExploredZones;
+ UpdateFieldArray<UF::RestInfo, 2, 580, 581> RestInfo;
+ UpdateFieldArray<int32, 7, 583, 584> ModDamageDonePos;
+ UpdateFieldArray<int32, 7, 583, 591> ModDamageDoneNeg;
+ UpdateFieldArray<float, 7, 583, 598> ModDamageDonePercent;
+ UpdateFieldArray<float, 7, 583, 605> ModHealingDonePercent;
+ UpdateFieldArray<float, 3, 612, 613> WeaponDmgMultipliers;
+ UpdateFieldArray<float, 3, 612, 616> WeaponAtkSpeedMultipliers;
+ UpdateFieldArray<uint32, 12, 619, 620> BuybackPrice;
+ UpdateFieldArray<int64, 12, 619, 632> BuybackTimestamp;
+ UpdateFieldArray<int32, 32, 644, 645> CombatRatings;
+ UpdateFieldArray<uint32, 4, 677, 678> NoReagentCostMask;
+ UpdateFieldArray<int32, 2, 682, 683> ProfessionSkillLine;
+ UpdateFieldArray<uint32, 5, 685, 686> BagSlotFlags;
+ UpdateFieldArray<uint32, 7, 691, 692> BankBagSlotFlags;
+ UpdateFieldArray<uint64, 875, 699, 700> QuestCompleted;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3d51060c926..bf5e6a9a4fb 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2650,7 +2650,7 @@ void Player::SendUnlearnSpells()
SendDirectMessage(sendUnlearnSpells.Write());
}
-void Player::RemoveMail(uint32 id)
+void Player::RemoveMail(uint64 id)
{
for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
{
@@ -2663,7 +2663,7 @@ void Player::RemoveMail(uint32 id)
}
}
-void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError, ObjectGuid::LowType item_guid, uint32 item_count) const
+void Player::SendMailResult(uint64 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError, ObjectGuid::LowType itemGuid, uint32 itemCount) const
{
WorldPackets::Mail::MailCommandResult result;
@@ -2675,8 +2675,8 @@ void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResp
result.BagResult = equipError;
else if (mailAction == MAIL_ITEM_TAKEN)
{
- result.AttachID = item_guid;
- result.QtyInInventory = item_count;
+ result.AttachID = itemGuid;
+ result.QtyInInventory = itemCount;
}
SendDirectMessage(result.Write());
}
@@ -3578,7 +3578,7 @@ void Player::ResetPvpTalents()
RemovePvpTalent(talentInfo, spec);
}
-Mail* Player::GetMail(uint32 id)
+Mail* Player::GetMail(uint64 id)
{
for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
if ((*itr)->messageID == id)
@@ -3865,7 +3865,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
if (resultMail)
{
- std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
+ std::unordered_map<uint64, std::vector<Item*>> itemsByMail;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
stmt->setUInt64(0, guid);
@@ -3900,7 +3900,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
do
{
Field* fields = resultItems->Fetch();
- uint32 mailId = fields[44].GetUInt32();
+ uint64 mailId = fields[44].GetUInt64();
if (Item* mailItem = _LoadMailedItem(playerguid, nullptr, mailId, nullptr, fields, Trinity::Containers::MapGetValuePtr(additionalData, fields[0].GetUInt64())))
itemsByMail[mailId].push_back(mailItem);
@@ -3911,7 +3911,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
{
Field* mailFields = resultMail->Fetch();
- uint32 mail_id = mailFields[0].GetUInt32();
+ uint64 mail_id = mailFields[0].GetUInt64();
uint8 mailType = mailFields[1].GetUInt8();
uint16 mailTemplateId= mailFields[2].GetUInt16();
ObjectGuid::LowType sender = mailFields[3].GetUInt64();
@@ -3923,7 +3923,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
// We can return mail now
// So firstly delete the old one
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
- stmt->setUInt32(0, mail_id);
+ stmt->setUInt64(0, mail_id);
trans->Append(stmt);
// Mail is not from player
@@ -3932,7 +3932,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
if (has_items)
{
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
- stmt->setUInt32(0, mail_id);
+ stmt->setUInt64(0, mail_id);
trans->Append(stmt);
}
continue;
@@ -3953,7 +3953,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
}
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
- stmt->setUInt32(0, mail_id);
+ stmt->setUInt64(0, mail_id);
trans->Append(stmt);
uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(playerguid);
@@ -16749,9 +16749,14 @@ void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const
void Player::SendQuestGiverStatusMultiple()
{
+ SendQuestGiverStatusMultiple(m_clientGUIDs);
+}
+
+void Player::SendQuestGiverStatusMultiple(GuidUnorderedSet const& guids)
+{
WorldPackets::Quest::QuestGiverStatusMultiple response;
- for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
+ for (auto itr = guids.begin(); itr != guids.end(); ++itr)
{
if (itr->IsAnyTypeCreature())
{
@@ -18528,7 +18533,7 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3
}
// load mailed item which should receive current player
-Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint32 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData)
+Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint64 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData)
{
ObjectGuid::LowType itemGuid = fields[0].GetUInt64();
uint32 itemEntry = fields[1].GetUInt32();
@@ -18600,7 +18605,7 @@ void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mail
{
m_mail.clear();
- std::unordered_map<uint32, Mail*> mailById;
+ std::unordered_map<uint64, Mail*> mailById;
if (mailsResult)
{
@@ -18609,7 +18614,7 @@ void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mail
Field* fields = mailsResult->Fetch();
Mail* m = new Mail();
- m->messageID = fields[0].GetUInt32();
+ m->messageID = fields[0].GetUInt64();
m->messageType = fields[1].GetUInt8();
m->sender = fields[2].GetUInt64();
m->receiver = fields[3].GetUInt64();
@@ -18646,7 +18651,7 @@ void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mail
do
{
Field* fields = mailItemsResult->Fetch();
- uint32 mailId = fields[52].GetUInt32();
+ uint64 mailId = fields[52].GetUInt64();
_LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields, Trinity::Containers::MapGetValuePtr(additionalData, fields[0].GetUInt64()));
} while (mailItemsResult->NextRow());
}
@@ -20113,7 +20118,7 @@ void Player::_SaveMail(CharacterDatabaseTransaction trans)
stmt->setUInt64(3, m->money);
stmt->setUInt64(4, m->COD);
stmt->setUInt8(5, uint8(m->checked));
- stmt->setUInt32(6, m->messageID);
+ stmt->setUInt64(6, m->messageID);
trans->Append(stmt);
@@ -20141,11 +20146,11 @@ void Player::_SaveMail(CharacterDatabaseTransaction trans)
}
}
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
- stmt->setUInt32(0, m->messageID);
+ stmt->setUInt64(0, m->messageID);
trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
- stmt->setUInt32(0, m->messageID);
+ stmt->setUInt64(0, m->messageID);
trans->Append(stmt);
}
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index d8ca3a8568e..3c795bcee63 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1674,6 +1674,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendQuestUpdateAddCreditSimple(QuestObjective const& obj) const;
void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const;
void SendQuestGiverStatusMultiple();
+ void SendQuestGiverStatusMultiple(GuidUnorderedSet const& guids);
void SendDisplayToast(uint32 entry, DisplayToastType type, bool isBonusRoll, uint32 quantity, DisplayToastMethod method, uint32 questId = 0, Item* item = nullptr) const;
uint32 GetSharedQuestID() const { return m_sharedQuestId; }
@@ -1760,16 +1761,16 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SetTarget(ObjectGuid const& /*guid*/) override { } /// Used for serverside target changes, does not apply to players
void SetSelection(ObjectGuid const& guid) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Target), guid); }
- void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, ObjectGuid::LowType item_guid = UI64LIT(0), uint32 item_count = 0) const;
+ void SendMailResult(uint64 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, ObjectGuid::LowType itemGuid = UI64LIT(0), uint32 itemCount = 0) const;
void SendNewMail() const;
void UpdateNextMailTimeAndUnreads();
void AddNewMailDeliverTime(time_t deliver_time);
- void RemoveMail(uint32 id);
+ void RemoveMail(uint64 id);
void AddMail(Mail* mail) { m_mail.push_front(mail);}// for call from WorldSession::SendMailTo
uint32 GetMailSize() const { return uint32(m_mail.size()); }
- Mail* GetMail(uint32 id);
+ Mail* GetMail(uint64 id);
PlayerMails const& GetMails() const { return m_mail; }
@@ -2915,7 +2916,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void _LoadVoidStorage(PreparedQueryResult result);
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult,
PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult);
- static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint32 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData);
+ static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint64 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData);
void _LoadQuestStatus(PreparedQueryResult result);
void _LoadQuestStatusObjectives(PreparedQueryResult result);
void _LoadQuestStatusRewarded(PreparedQueryResult result);