diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-12-04 15:13:20 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-12-04 15:13:20 +0100 |
| commit | e98e1283ea0034baf6be9aa2ffb386eb5582801b (patch) | |
| tree | b1dd854d88e6e049d26b208bb259cdc7d31f29f8 /src/server/game/Entities/Object | |
| parent | de7c03c8385780f05530c2b3cf952a712d5f8f00 (diff) | |
Core: Updated to 10.0.2
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/MovementInfo.h | 13 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 44 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 1534 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 761 |
4 files changed, 1605 insertions, 747 deletions
diff --git a/src/server/game/Entities/Object/MovementInfo.h b/src/server/game/Entities/Object/MovementInfo.h index 15b4af8ebfa..9e8c3909b36 100644 --- a/src/server/game/Entities/Object/MovementInfo.h +++ b/src/server/game/Entities/Object/MovementInfo.h @@ -60,9 +60,9 @@ struct MovementInfo struct Inertia { - Inertia() : lifetime(0) { } + Inertia() : id(0), lifetime(0) { } - ObjectGuid guid; + int32 id; Position force; uint32 lifetime; }; @@ -86,6 +86,15 @@ struct MovementInfo float stepUpStartElevation; + // advflying + struct AdvFlying + { + float forwardVelocity; + float upVelocity; + }; + + Optional<AdvFlying> advFlying; + MovementInfo() : flags(0), flags2(0), flags3(0), time(0), pitch(0.0f), stepUpStartElevation(0.0f) { diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 1059e2d7686..cca7c5fe890 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -293,6 +293,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0; bool HasSpline = unit->IsSplineEnabled(); bool HasInertia = unit->m_movementInfo.inertia.has_value(); + bool HasAdvFlying = unit->m_movementInfo.advFlying.has_value(); *data << GetGUID(); // MoverGUID @@ -321,17 +322,24 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(false); // HeightChangeFailed data->WriteBit(false); // RemoteTimeValid data->WriteBit(HasInertia); // HasInertia + data->WriteBit(HasAdvFlying); // HasAdvFlying if (!unit->m_movementInfo.transport.guid.IsEmpty()) *data << unit->m_movementInfo.transport; if (HasInertia) { - *data << unit->m_movementInfo.inertia->guid; + *data << unit->m_movementInfo.inertia->id; *data << unit->m_movementInfo.inertia->force.PositionXYZStream(); *data << uint32(unit->m_movementInfo.inertia->lifetime); } + if (HasAdvFlying) + { + *data << float(unit->m_movementInfo.advFlying->forwardVelocity); + *data << float(unit->m_movementInfo.advFlying->upVelocity); + } + if (HasFall) { *data << uint32(unit->m_movementInfo.jump.fallTime); // Time @@ -366,6 +374,24 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe *data << float(1.0f); // MovementForcesModMagnitude } + *data << float(2.0f); // advFlyingAirFriction + *data << float(65.0f); // advFlyingMaxVel + *data << float(1.0f); // advFlyingLiftCoefficient + *data << float(3.0f); // advFlyingDoubleJumpVelMod + *data << float(10.0f); // advFlyingGlideStartMinHeight + *data << float(100.0f); // advFlyingAddImpulseMaxSpeed + *data << float(90.0f); // advFlyingMinBankingRate + *data << float(140.0f); // advFlyingMaxBankingRate + *data << float(180.0f); // advFlyingMinPitchingRateDown + *data << float(360.0f); // advFlyingMaxPitchingRateDown + *data << float(90.0f); // advFlyingMinPitchingRateUp + *data << float(270.0f); // advFlyingMaxPitchingRateUp + *data << float(30.0f); // advFlyingMinTurnVelocityThreshold + *data << float(80.0f); // advFlyingMaxTurnVelocityThreshold + *data << float(2.75f); // advFlyingSurfaceFriction + *data << float(7.0f); // advFlyingOverMaxDeceleration + *data << float(0.4f); // advFlyingLaunchSpeedCoefficient + data->WriteBit(HasSpline); data->FlushBits(); @@ -438,6 +464,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe bool hasFaceMovementDir = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR); bool hasFollowsTerrain = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN); bool hasUnk1 = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_UNK1); + bool hasUnk2 = false; bool hasTargetRollPitchYaw = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW); bool hasScaleCurveID = createProperties && createProperties->ScaleCurveId != 0; bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0; @@ -448,6 +475,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe bool hasAreaTriggerPolygon = createProperties && shape.IsPolygon(); bool hasAreaTriggerCylinder = shape.IsCylinder(); bool hasDisk = shape.IsDisk(); + bool hasBoundedPlane = shape.IsBoudedPlane(); bool hasAreaTriggerSpline = areaTrigger->HasSplines(); bool hasOrbit = areaTrigger->HasOrbit(); bool hasMovementScript = false; @@ -458,6 +486,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(hasFaceMovementDir); data->WriteBit(hasFollowsTerrain); data->WriteBit(hasUnk1); + data->WriteBit(hasUnk2); data->WriteBit(hasTargetRollPitchYaw); data->WriteBit(hasScaleCurveID); data->WriteBit(hasMorphCurveID); @@ -468,6 +497,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(hasAreaTriggerPolygon); data->WriteBit(hasAreaTriggerCylinder); data->WriteBit(hasDisk); + data->WriteBit(hasBoundedPlane); data->WriteBit(hasAreaTriggerSpline); data->WriteBit(hasOrbit); data->WriteBit(hasMovementScript); @@ -549,6 +579,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe *data << float(shape.DiskDatas.LocationZOffsetTarget); } + if (hasBoundedPlane) + { + *data << float(shape.BoundedPlaneDatas.Extents[0]); + *data << float(shape.BoundedPlaneDatas.Extents[1]); + *data << float(shape.BoundedPlaneDatas.ExtentsTarget[0]); + *data << float(shape.BoundedPlaneDatas.ExtentsTarget[1]); + } + //if (hasMovementScript) // *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo @@ -2300,10 +2338,10 @@ int32 WorldObject::ModSpellDuration(SpellInfo const* spellInfo, WorldObject cons if (!positive) { - int32 mechanicMask = spellInfo->GetSpellMechanicMaskByEffectMask(effectMask); + uint64 mechanicMask = spellInfo->GetSpellMechanicMaskByEffectMask(effectMask); auto mechanicCheck = [mechanicMask](AuraEffect const* aurEff) -> bool { - if (mechanicMask & (1 << aurEff->GetMiscValue())) + if (mechanicMask & (UI64LIT(1) << aurEff->GetMiscValue())) return true; return false; }; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index c38670e91ff..1b7632da868 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -268,11 +268,6 @@ void SocketedGem::ClearChangesMask() void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const { - data << uint32(BonusListIDs->size()); - for (uint32 i = 0; i < BonusListIDs->size(); ++i) - { - data << int32((*BonusListIDs)[i]); - } data << Owner; data << ContainedIn; data << Creator; @@ -309,6 +304,10 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) { data << uint32(DynamicFlags2); + } + data << ItemBonusKey; + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) + { data << uint16(DEBUGItemLevel); } for (uint32 i = 0; i < ArtifactPowers.size(); ++i) @@ -324,7 +323,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xF804E4FFu, 0x000001FFu }); + Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -332,12 +331,12 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x07FB1B00u, 0x00000000u }; + allowedMaskForTarget |= { 0x07F58D80u, 0x00000000u }; } void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xF804E4FFu, 0x000001FFu }); + Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -353,24 +352,12 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor { if (changesMask[1]) { - data.WriteBits(BonusListIDs->size(), 32); - for (uint32 i = 0; i < BonusListIDs->size(); ++i) - { - data << int32((*BonusListIDs)[i]); - } - } - } - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[2]) - { if (!ignoreNestedChangesMask) ArtifactPowers.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ArtifactPowers.size(), data); } - if (changesMask[3]) + if (changesMask[2]) { if (!ignoreNestedChangesMask) Gems.WriteUpdateMask(data); @@ -381,7 +368,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor data.FlushBits(); if (changesMask[0]) { - if (changesMask[2]) + if (changesMask[1]) { for (uint32 i = 0; i < ArtifactPowers.size(); ++i) { @@ -391,7 +378,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } } } - if (changesMask[3]) + if (changesMask[2]) { for (uint32 i = 0; i < Gems.size(); ++i) { @@ -401,71 +388,75 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } } } - if (changesMask[4]) + if (changesMask[3]) { data << Owner; } - if (changesMask[5]) + if (changesMask[4]) { data << ContainedIn; } - if (changesMask[6]) + if (changesMask[5]) { data << Creator; } - if (changesMask[7]) + if (changesMask[6]) { data << GiftCreator; } - if (changesMask[8]) + if (changesMask[7]) { data << uint32(StackCount); } - if (changesMask[9]) + if (changesMask[8]) { data << uint32(Expiration); } - if (changesMask[10]) + if (changesMask[9]) { data << uint32(DynamicFlags); } - if (changesMask[11]) + if (changesMask[10]) { data << uint32(Durability); } - if (changesMask[12]) + if (changesMask[11]) { data << uint32(MaxDurability); } - if (changesMask[13]) + if (changesMask[12]) { data << uint32(CreatePlayedTime); } - if (changesMask[14]) + if (changesMask[13]) { data << int32(Context); } - if (changesMask[15]) + if (changesMask[14]) { data << int64(CreateTime); } - if (changesMask[16]) + if (changesMask[15]) { data << uint64(ArtifactXP); } - if (changesMask[17]) + if (changesMask[16]) { data << uint8(ItemAppearanceModID); } - if (changesMask[19]) + if (changesMask[18]) { data << uint32(DynamicFlags2); } + if (changesMask[19]) + { + data << ItemBonusKey; + } if (changesMask[20]) { data << uint16(DEBUGItemLevel); } - if (changesMask[18]) + if (changesMask[17]) { Modifiers->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -494,7 +485,6 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor void ItemData::ClearChangesMask() { - Base::ClearChangesMask(BonusListIDs); Base::ClearChangesMask(ArtifactPowers); Base::ClearChangesMask(Gems); Base::ClearChangesMask(Owner); @@ -513,6 +503,7 @@ void ItemData::ClearChangesMask() Base::ClearChangesMask(ItemAppearanceModID); Base::ClearChangesMask(Modifiers); Base::ClearChangesMask(DynamicFlags2); + Base::ClearChangesMask(ItemBonusKey); Base::ClearChangesMask(DEBUGItemLevel); Base::ClearChangesMask(SpellCharges); Base::ClearChangesMask(Enchantment); @@ -968,6 +959,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << BattlePetCompanionGUID; data << uint64(BattlePetDBID); ChannelData->WriteCreate(data, owner, receiver); + data << int8(SpellEmpowerStage); data << uint32(SummonedByHomeRealm); data << uint8(Race); data << uint8(ClassId); @@ -1120,6 +1112,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(PassiveSpells.size()); data << uint32(WorldEffects.size()); data << uint32(ChannelObjects.size()); + data << int32(FlightCapabilityID); data << uint32(SilencedSchoolMask); data << NameplateAttachToGUID; for (uint32 i = 0; i < PassiveSpells.size(); ++i) @@ -1138,7 +1131,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, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xFC000FFFu, 0x00000001u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1146,16 +1139,16 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0x80FFFC00u, 0xFFFFFFFFu, 0x00000003u }; + allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x200000FEu, 0x03FFF000u, 0xFFFFFFFEu, 0x0000000Fu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x00FFFC00u, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x20000000u, 0x03FFF000u, 0x00000000u, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000FF000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x003FC000u, 0x00000000u }; } void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xFC000FFFu, 0x00000001u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -1310,473 +1303,481 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[23]) { - data << uint32(SummonedByHomeRealm); + data << int8(SpellEmpowerStage); } if (changesMask[24]) { - data << uint8(Race); + data << uint32(SummonedByHomeRealm); } if (changesMask[25]) { - data << uint8(ClassId); + data << uint8(Race); } if (changesMask[26]) { - data << uint8(PlayerClassId); + data << uint8(ClassId); } if (changesMask[27]) { - data << uint8(Sex); + data << uint8(PlayerClassId); } if (changesMask[28]) { - data << uint8(DisplayPower); + data << uint8(Sex); } if (changesMask[29]) { - data << uint32(OverrideDisplayPowerID); + data << uint8(DisplayPower); } if (changesMask[30]) { - data << int64(Health); + data << uint32(OverrideDisplayPowerID); } if (changesMask[31]) { - data << int64(MaxHealth); + data << int64(Health); } } if (changesMask[32]) { if (changesMask[33]) { - data << int32(Level); + data << int64(MaxHealth); } if (changesMask[34]) { - data << int32(EffectiveLevel); + data << int32(Level); } if (changesMask[35]) { - data << int32(ContentTuningID); + data << int32(EffectiveLevel); } if (changesMask[36]) { - data << int32(ScalingLevelMin); + data << int32(ContentTuningID); } if (changesMask[37]) { - data << int32(ScalingLevelMax); + data << int32(ScalingLevelMin); } if (changesMask[38]) { - data << int32(ScalingLevelDelta); + data << int32(ScalingLevelMax); } if (changesMask[39]) { - data << int32(ScalingFactionGroup); + data << int32(ScalingLevelDelta); } if (changesMask[40]) { - data << int32(ScalingHealthItemLevelCurveID); + data << int32(ScalingFactionGroup); } if (changesMask[41]) { - data << int32(ScalingDamageItemLevelCurveID); + data << int32(ScalingHealthItemLevelCurveID); } if (changesMask[42]) { - data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver)); + data << int32(ScalingDamageItemLevelCurveID); } if (changesMask[43]) { - data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); + data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver)); } if (changesMask[44]) { - data << uint32(Flags2); + data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); } if (changesMask[45]) { - data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver)); + data << uint32(Flags2); } if (changesMask[46]) { - data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver)); } if (changesMask[47]) { - data << uint32(RangedAttackRoundBaseTime); + data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); } if (changesMask[48]) { - data << float(BoundingRadius); + data << uint32(RangedAttackRoundBaseTime); } if (changesMask[49]) { - data << float(CombatReach); + data << float(BoundingRadius); } if (changesMask[50]) { - data << float(DisplayScale); + data << float(CombatReach); } if (changesMask[51]) { - data << int32(CreatureFamily); + data << float(DisplayScale); } if (changesMask[52]) { - data << int32(CreatureType); + data << int32(CreatureFamily); } if (changesMask[53]) { - data << int32(NativeDisplayID); + data << int32(CreatureType); } if (changesMask[54]) { - data << float(NativeXDisplayScale); + data << int32(NativeDisplayID); } if (changesMask[55]) { - data << int32(MountDisplayID); + data << float(NativeXDisplayScale); } if (changesMask[56]) { - data << int32(CosmeticMountDisplayID); + data << int32(MountDisplayID); } if (changesMask[57]) { - data << float(MinDamage); + data << int32(CosmeticMountDisplayID); } if (changesMask[58]) { - data << float(MaxDamage); + data << float(MinDamage); } if (changesMask[59]) { - data << float(MinOffHandDamage); + data << float(MaxDamage); } if (changesMask[60]) { - data << float(MaxOffHandDamage); + data << float(MinOffHandDamage); } if (changesMask[61]) { - data << uint8(StandState); + data << float(MaxOffHandDamage); } if (changesMask[62]) { - data << uint8(PetTalentPoints); + data << uint8(StandState); } if (changesMask[63]) { - data << uint8(VisFlags); + data << uint8(PetTalentPoints); } } if (changesMask[64]) { if (changesMask[65]) { - data << uint8(AnimTier); + data << uint8(VisFlags); } if (changesMask[66]) { - data << uint32(PetNumber); + data << uint8(AnimTier); } if (changesMask[67]) { - data << uint32(PetNameTimestamp); + data << uint32(PetNumber); } if (changesMask[68]) { - data << uint32(PetExperience); + data << uint32(PetNameTimestamp); } if (changesMask[69]) { - data << uint32(PetNextLevelExperience); + data << uint32(PetExperience); } if (changesMask[70]) { - data << float(ModCastingSpeed); + data << uint32(PetNextLevelExperience); } if (changesMask[71]) { - data << float(ModCastingSpeedNeg); + data << float(ModCastingSpeed); } if (changesMask[72]) { - data << float(ModSpellHaste); + data << float(ModCastingSpeedNeg); } if (changesMask[73]) { - data << float(ModHaste); + data << float(ModSpellHaste); } if (changesMask[74]) { - data << float(ModRangedHaste); + data << float(ModHaste); } if (changesMask[75]) { - data << float(ModHasteRegen); + data << float(ModRangedHaste); } if (changesMask[76]) { - data << float(ModTimeRate); + data << float(ModHasteRegen); } if (changesMask[77]) { - data << int32(CreatedBySpell); + data << float(ModTimeRate); } if (changesMask[78]) { - data << int32(EmoteState); + data << int32(CreatedBySpell); } if (changesMask[79]) { - data << int32(BaseMana); + data << int32(EmoteState); } if (changesMask[80]) { - data << int32(BaseHealth); + data << int32(BaseMana); } if (changesMask[81]) { - data << uint8(SheatheState); + data << int32(BaseHealth); } if (changesMask[82]) { - data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver)); + data << uint8(SheatheState); } if (changesMask[83]) { - data << uint8(PetFlags); + data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver)); } if (changesMask[84]) { - data << uint8(ShapeshiftForm); + data << uint8(PetFlags); } if (changesMask[85]) { - data << int32(AttackPower); + data << uint8(ShapeshiftForm); } if (changesMask[86]) { - data << int32(AttackPowerModPos); + data << int32(AttackPower); } if (changesMask[87]) { - data << int32(AttackPowerModNeg); + data << int32(AttackPowerModPos); } if (changesMask[88]) { - data << float(AttackPowerMultiplier); + data << int32(AttackPowerModNeg); } if (changesMask[89]) { - data << int32(RangedAttackPower); + data << float(AttackPowerMultiplier); } if (changesMask[90]) { - data << int32(RangedAttackPowerModPos); + data << int32(RangedAttackPower); } if (changesMask[91]) { - data << int32(RangedAttackPowerModNeg); + data << int32(RangedAttackPowerModPos); } if (changesMask[92]) { - data << float(RangedAttackPowerMultiplier); + data << int32(RangedAttackPowerModNeg); } if (changesMask[93]) { - data << int32(MainHandWeaponAttackPower); + data << float(RangedAttackPowerMultiplier); } if (changesMask[94]) { - data << int32(OffHandWeaponAttackPower); + data << int32(MainHandWeaponAttackPower); } if (changesMask[95]) { - data << int32(RangedWeaponAttackPower); + data << int32(OffHandWeaponAttackPower); } } if (changesMask[96]) { if (changesMask[97]) { - data << int32(SetAttackSpeedAura); + data << int32(RangedWeaponAttackPower); } if (changesMask[98]) { - data << float(Lifesteal); + data << int32(SetAttackSpeedAura); } if (changesMask[99]) { - data << float(MinRangedDamage); + data << float(Lifesteal); } if (changesMask[100]) { - data << float(MaxRangedDamage); + data << float(MinRangedDamage); } if (changesMask[101]) { - data << float(ManaCostMultiplier); + data << float(MaxRangedDamage); } if (changesMask[102]) { - data << float(MaxHealthModifier); + data << float(ManaCostMultiplier); } if (changesMask[103]) { - data << float(HoverHeight); + data << float(MaxHealthModifier); } if (changesMask[104]) { - data << int32(MinItemLevelCutoff); + data << float(HoverHeight); } if (changesMask[105]) { - data << int32(MinItemLevel); + data << int32(MinItemLevelCutoff); } if (changesMask[106]) { - data << int32(MaxItemLevel); + data << int32(MinItemLevel); } if (changesMask[107]) { - data << int32(AzeriteItemLevel); + data << int32(MaxItemLevel); } if (changesMask[108]) { - data << int32(WildBattlePetLevel); + data << int32(AzeriteItemLevel); } if (changesMask[109]) { - data << int32(BattlePetCompanionExperience); + data << int32(WildBattlePetLevel); } if (changesMask[110]) { - data << uint32(BattlePetCompanionNameTimestamp); + data << int32(BattlePetCompanionExperience); } if (changesMask[111]) { - data << int32(InteractSpellID); + data << uint32(BattlePetCompanionNameTimestamp); } if (changesMask[112]) { - data << int32(ScaleDuration); + data << int32(InteractSpellID); } if (changesMask[113]) { - data << int32(LooksLikeMountID); + data << int32(ScaleDuration); } if (changesMask[114]) { - data << int32(LooksLikeCreatureID); + data << int32(LooksLikeMountID); } if (changesMask[115]) { - data << int32(LookAtControllerID); + data << int32(LooksLikeCreatureID); } if (changesMask[116]) { - data << int32(TaxiNodesID); + data << int32(LookAtControllerID); } if (changesMask[117]) { - data << GuildGUID; + data << int32(TaxiNodesID); } if (changesMask[118]) { - data << uint32(SilencedSchoolMask); + data << GuildGUID; } if (changesMask[119]) { + data << int32(FlightCapabilityID); + } + if (changesMask[120]) + { + data << uint32(SilencedSchoolMask); + } + if (changesMask[121]) + { data << NameplateAttachToGUID; } } - if (changesMask[120]) + if (changesMask[122]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[121 + i]) + if (changesMask[123 + i]) { data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver)); } } } - if (changesMask[123]) + if (changesMask[125]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[124 + i]) + if (changesMask[126 + i]) { data << int32(Power[i]); } - if (changesMask[131 + i]) + if (changesMask[133 + i]) { data << int32(MaxPower[i]); } - if (changesMask[138 + i]) + if (changesMask[140 + i]) { data << float(PowerRegenFlatModifier[i]); } - if (changesMask[145 + i]) + if (changesMask[147 + i]) { data << float(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[152]) + if (changesMask[154]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[153 + i]) + if (changesMask[155 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[156]) + if (changesMask[158]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[157 + i]) + if (changesMask[159 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[159]) + if (changesMask[161]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[160 + i]) + if (changesMask[162 + i]) { data << int32(Stats[i]); } - if (changesMask[164 + i]) + if (changesMask[166 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[168 + i]) + if (changesMask[170 + i]) { data << int32(StatNegBuff[i]); } } } - if (changesMask[172]) + if (changesMask[174]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[173 + i]) + if (changesMask[175 + i]) { data << int32(Resistances[i]); } - if (changesMask[180 + i]) + if (changesMask[182 + i]) { data << int32(BonusResistanceMods[i]); } - if (changesMask[187 + i]) + if (changesMask[189 + i]) { data << int32(ManaCostModifier[i]); } @@ -1808,6 +1809,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(BattlePetCompanionGUID); Base::ClearChangesMask(BattlePetDBID); Base::ClearChangesMask(ChannelData); + Base::ClearChangesMask(SpellEmpowerStage); Base::ClearChangesMask(SummonedByHomeRealm); Base::ClearChangesMask(Race); Base::ClearChangesMask(ClassId); @@ -1900,6 +1902,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(LookAtControllerID); Base::ClearChangesMask(TaxiNodesID); Base::ClearChangesMask(GuildGUID); + Base::ClearChangesMask(FlightCapabilityID); Base::ClearChangesMask(SilencedSchoolMask); Base::ClearChangesMask(NameplateAttachToGUID); Base::ClearChangesMask(NpcFlags); @@ -2133,12 +2136,14 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi } data << uint8(CurrentBattlePetBreedQuality); data << int32(HonorLevel); + data << int64(LogoutTime); data << uint32(ArenaCooldowns.size()); data << int32(Field_B0); data << int32(Field_B4); CtrOptions->WriteCreate(data, owner, receiver); data << int32(CovenantID); data << int32(SoulbindID); + data << uint32(VisualItemReplacements.size()); for (uint32 i = 0; i < Customizations.size(); ++i) { Customizations[i].WriteCreate(data, owner, receiver); @@ -2154,6 +2159,10 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi { ArenaCooldowns[i].WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < VisualItemReplacements.size(); ++i) + { + data << int32(VisualItemReplacements[i]); + } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) { data.WriteBit(HasQuestSession); @@ -2165,7 +2174,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu }); + Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x3FFFFFF8u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2173,12 +2182,12 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u }; + allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFE0u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000007u }; } void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu }); + Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x3FFFFFF8u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -2222,6 +2231,13 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign else WriteCompleteDynamicFieldUpdateMask(ArenaCooldowns.size(), data); } + if (changesMask[6]) + { + if (!ignoreNestedChangesMask) + VisualItemReplacements.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(VisualItemReplacements.size(), data); + } } data.FlushBits(); if (changesMask[0]) @@ -2261,125 +2277,139 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } if (changesMask[6]) { - data << DuelArbiter; + for (uint32 i = 0; i < VisualItemReplacements.size(); ++i) + { + if (VisualItemReplacements.HasChanged(i) || ignoreNestedChangesMask) + { + data << int32(VisualItemReplacements[i]); + } + } } if (changesMask[7]) { - data << WowAccount; + data << DuelArbiter; } if (changesMask[8]) { - data << LootTargetGUID; + data << WowAccount; } if (changesMask[9]) { - data << uint32(PlayerFlags); + data << LootTargetGUID; } if (changesMask[10]) { - data << uint32(PlayerFlagsEx); + data << uint32(PlayerFlags); } if (changesMask[11]) { - data << uint32(GuildRankID); + data << uint32(PlayerFlagsEx); } if (changesMask[12]) { - data << uint32(GuildDeleteDate); + data << uint32(GuildRankID); } if (changesMask[13]) { - data << int32(GuildLevel); + data << uint32(GuildDeleteDate); } if (changesMask[14]) { - data << uint8(PartyType); + data << int32(GuildLevel); } if (changesMask[15]) { - data << uint8(NativeSex); + data << uint8(PartyType); } if (changesMask[16]) { - data << uint8(Inebriation); + data << uint8(NativeSex); } if (changesMask[17]) { - data << uint8(PvpTitle); + data << uint8(Inebriation); } if (changesMask[18]) { - data << uint8(ArenaFaction); + data << uint8(PvpTitle); } if (changesMask[19]) { - data << uint32(DuelTeam); + data << uint8(ArenaFaction); } if (changesMask[20]) { - data << int32(GuildTimeStamp); + data << uint32(DuelTeam); } if (changesMask[21]) { - data << int32(PlayerTitle); + data << int32(GuildTimeStamp); } if (changesMask[22]) { - data << int32(FakeInebriation); + data << int32(PlayerTitle); } if (changesMask[23]) { - data << uint32(VirtualPlayerRealm); + data << int32(FakeInebriation); } if (changesMask[24]) { - data << uint32(CurrentSpecID); + data << uint32(VirtualPlayerRealm); } if (changesMask[25]) { - data << int32(TaxiMountAnimKitID); + data << uint32(CurrentSpecID); } if (changesMask[26]) { - data << uint8(CurrentBattlePetBreedQuality); + data << int32(TaxiMountAnimKitID); } if (changesMask[27]) { - data << int32(HonorLevel); + data << uint8(CurrentBattlePetBreedQuality); } if (changesMask[28]) { - data << int32(Field_B0); + data << int32(HonorLevel); } if (changesMask[29]) { - data << int32(Field_B4); + data << int64(LogoutTime); } if (changesMask[30]) { - CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(Field_B0); } if (changesMask[31]) { - data << int32(CovenantID); + data << int32(Field_B4); } } if (changesMask[32]) { if (changesMask[33]) { - data << int32(SoulbindID); + CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[34]) { + data << int32(CovenantID); + } + if (changesMask[35]) + { + data << int32(SoulbindID); + } + if (changesMask[36]) + { data << DungeonScore; } } - if (changesMask[35]) + if (changesMask[37]) { for (uint32 i = 0; i < 125; ++i) { - if (changesMask[36 + i]) + if (changesMask[38 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2388,21 +2418,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[161]) + if (changesMask[163]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[162 + i]) + if (changesMask[164 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[181]) + if (changesMask[183]) { for (uint32 i = 0; i < 6; ++i) { - if (changesMask[182 + i]) + if (changesMask[184 + i]) { data << float(AvgItemLevel[i]); } @@ -2418,6 +2448,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(Customizations); Base::ClearChangesMask(QuestSessionQuestLog); Base::ClearChangesMask(ArenaCooldowns); + Base::ClearChangesMask(VisualItemReplacements); Base::ClearChangesMask(DuelArbiter); Base::ClearChangesMask(WowAccount); Base::ClearChangesMask(LootTargetGUID); @@ -2440,6 +2471,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(TaxiMountAnimKitID); Base::ClearChangesMask(CurrentBattlePetBreedQuality); Base::ClearChangesMask(HonorLevel); + Base::ClearChangesMask(LogoutTime); Base::ClearChangesMask(Field_B0); Base::ClearChangesMask(Field_B4); Base::ClearChangesMask(CtrOptions); @@ -2565,6 +2597,8 @@ void RestInfo::ClearChangesMask() void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { + data << int8(Bracket); + data << int32(PvpRatingID); data << uint32(WeeklyPlayed); data << uint32(WeeklyWon); data << uint32(SeasonPlayed); @@ -2576,6 +2610,10 @@ void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* r data << uint32(WeeklyBestWinPvpTierID); data << uint32(Field_28); data << uint32(Field_2C); + data << uint32(WeeklyRoundsPlayed); + data << uint32(WeeklyRoundsWon); + data << uint32(SeasonRoundsPlayed); + data << uint32(SeasonRoundsWon); data.WriteBit(Disqualified); data.FlushBits(); } @@ -2586,7 +2624,7 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 13); + data.WriteBits(changesMask.GetBlock(0), 19); if (changesMask[0]) { @@ -2600,48 +2638,72 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const { if (changesMask[2]) { - data << uint32(WeeklyPlayed); + data << int8(Bracket); } if (changesMask[3]) { - data << uint32(WeeklyWon); + data << int32(PvpRatingID); } if (changesMask[4]) { - data << uint32(SeasonPlayed); + data << uint32(WeeklyPlayed); } if (changesMask[5]) { - data << uint32(SeasonWon); + data << uint32(WeeklyWon); } if (changesMask[6]) { - data << uint32(Rating); + data << uint32(SeasonPlayed); } if (changesMask[7]) { - data << uint32(WeeklyBestRating); + data << uint32(SeasonWon); } if (changesMask[8]) { - data << uint32(SeasonBestRating); + data << uint32(Rating); } if (changesMask[9]) { - data << uint32(PvpTierID); + data << uint32(WeeklyBestRating); } if (changesMask[10]) { - data << uint32(WeeklyBestWinPvpTierID); + data << uint32(SeasonBestRating); } if (changesMask[11]) { - data << uint32(Field_28); + data << uint32(PvpTierID); } if (changesMask[12]) { + data << uint32(WeeklyBestWinPvpTierID); + } + if (changesMask[13]) + { + data << uint32(Field_28); + } + if (changesMask[14]) + { data << uint32(Field_2C); } + if (changesMask[15]) + { + data << uint32(WeeklyRoundsPlayed); + } + if (changesMask[16]) + { + data << uint32(WeeklyRoundsWon); + } + if (changesMask[17]) + { + data << uint32(SeasonRoundsPlayed); + } + if (changesMask[18]) + { + data << uint32(SeasonRoundsWon); + } } data.FlushBits(); } @@ -2649,6 +2711,8 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const void PVPInfo::ClearChangesMask() { Base::ClearChangesMask(Disqualified); + Base::ClearChangesMask(Bracket); + Base::ClearChangesMask(PvpRatingID); Base::ClearChangesMask(WeeklyPlayed); Base::ClearChangesMask(WeeklyWon); Base::ClearChangesMask(SeasonPlayed); @@ -2660,6 +2724,10 @@ void PVPInfo::ClearChangesMask() Base::ClearChangesMask(WeeklyBestWinPvpTierID); Base::ClearChangesMask(Field_28); Base::ClearChangesMask(Field_2C); + Base::ClearChangesMask(WeeklyRoundsPlayed); + Base::ClearChangesMask(WeeklyRoundsWon); + Base::ClearChangesMask(SeasonRoundsPlayed); + Base::ClearChangesMask(SeasonRoundsWon); _changesMask.ResetAll(); } @@ -2926,9 +2994,514 @@ void ReplayedQuest::ClearChangesMask() _changesMask.ResetAll(); } +void TraitEntry::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(TraitNodeID); + data << int32(TraitNodeEntryID); + data << int32(Rank); + data << int32(GrantedRanks); +} + +void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(TraitNodeID); + data << int32(TraitNodeEntryID); + data << int32(Rank); + data << int32(GrantedRanks); +} + +bool TraitEntry::operator==(TraitEntry const& right) const +{ + return TraitNodeID == right.TraitNodeID + && TraitNodeEntryID == right.TraitNodeEntryID + && Rank == right.Rank + && GrantedRanks == right.GrantedRanks; +} + +void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(ID); + data << int32(Type); + data << uint32(Entries.size()); + if (Type == 2) + { + data << int32(SkillLineID); + } + if (Type == 1) + { + data << int32(ChrSpecializationID); + data << int32(CombatConfigFlags); + data << int32(LocalIdentifier); + } + if (Type == 3) + { + data << int32(TraitSystemID); + } + for (uint32 i = 0; i < Entries.size(); ++i) + { + Entries[i].WriteCreate(data, owner, receiver); + } + data.WriteBits(Name->size(), 9); + data.WriteString(Name); + data.FlushBits(); +} + +void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 12); + + if (changesMask[0]) + { + if (changesMask[1]) + { + if (!ignoreChangesMask) + Entries.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Entries.size(), data); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (uint32 i = 0; i < Entries.size(); ++i) + { + if (Entries.HasChanged(i) || ignoreChangesMask) + { + Entries[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + } + } + if (changesMask[2]) + { + data << int32(ID); + } + } + if (changesMask[4]) + { + if (changesMask[5]) + { + data << int32(Type); + } + if (changesMask[6]) + { + if (Type == 2) + { + data << int32(SkillLineID); + } + } + if (changesMask[7]) + { + if (Type == 1) + { + data << int32(ChrSpecializationID); + } + } + } + if (changesMask[8]) + { + if (changesMask[9]) + { + if (Type == 1) + { + data << int32(CombatConfigFlags); + } + } + if (changesMask[10]) + { + if (Type == 1) + { + data << int32(LocalIdentifier); + } + } + if (changesMask[11]) + { + if (Type == 3) + { + data << int32(TraitSystemID); + } + } + } + if (changesMask[0]) + { + if (changesMask[3]) + { + data.WriteBits(Name->size(), 9); + data.WriteString(Name); + } + } + data.FlushBits(); +} + +void TraitConfig::ClearChangesMask() +{ + Base::ClearChangesMask(Entries); + Base::ClearChangesMask(ID); + Base::ClearChangesMask(Name); + Base::ClearChangesMask(Type); + Base::ClearChangesMask(SkillLineID); + Base::ClearChangesMask(ChrSpecializationID); + Base::ClearChangesMask(CombatConfigFlags); + Base::ClearChangesMask(LocalIdentifier); + Base::ClearChangesMask(TraitSystemID); + _changesMask.ResetAll(); +} + +void CraftingOrderItem::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << uint64(Field_0); + data << ItemGUID; + data << OwnerGUID; + data << int32(ItemID); + data << uint32(Quantity); + data << int32(ReagentQuality); + data.WriteBits(DataSlotIndex.has_value(), 1); + if (DataSlotIndex.has_value()) + { + data << uint8(DataSlotIndex); + } +} + +void CraftingOrderItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + data.FlushBits(); + if (changesMask[0]) + { + data << uint64(Field_0); + } + if (changesMask[1]) + { + data << ItemGUID; + } + if (changesMask[2]) + { + data << OwnerGUID; + } + if (changesMask[3]) + { + data << int32(ItemID); + } + if (changesMask[4]) + { + data << uint32(Quantity); + } + if (changesMask[5]) + { + data << int32(ReagentQuality); + } + data.WriteBits(DataSlotIndex.has_value(), 1); + if (changesMask[6]) + { + if (DataSlotIndex.has_value()) + { + data << uint8(DataSlotIndex); + } + } +} + +void CraftingOrderItem::ClearChangesMask() +{ + Base::ClearChangesMask(Field_0); + Base::ClearChangesMask(ItemGUID); + Base::ClearChangesMask(OwnerGUID); + Base::ClearChangesMask(ItemID); + Base::ClearChangesMask(Quantity); + Base::ClearChangesMask(ReagentQuality); + Base::ClearChangesMask(DataSlotIndex); + _changesMask.ResetAll(); +} + +void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(Field_0); + data << uint64(OrderID); + data << int32(SkillLineAbilityID); + data << uint8(OrderState); + data << uint8(OrderType); + data << uint8(MinQuality); + data << int64(ExpirationTime); + data << int64(ClaimEndTime); + data << int64(TipAmount); + data << int64(ConsortiumCut); + data << uint32(Flags); + data << CustomerGUID; + data << CustomerAccountGUID; + data << CrafterGUID; + data << PersonalCrafterGUID; + data << uint32(Reagents.size()); + data.WriteBits(CustomerNotes->size(), 10); + data.WriteBits(OutputItem.has_value(), 1); + data.WriteBits(OutputItemData.has_value(), 1); + for (uint32 i = 0; i < Reagents.size(); ++i) + { + Reagents[i].WriteCreate(data, owner, receiver); + } + data.WriteString(CustomerNotes); + if (OutputItem.has_value()) + { + OutputItem->WriteCreate(data, owner, receiver); + } + if (OutputItemData.has_value()) + { + data << OutputItemData; + } + data.FlushBits(); +} + +void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 24); + + if (changesMask[0]) + { + if (changesMask[1]) + { + if (!ignoreChangesMask) + Reagents.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Reagents.size(), data); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (uint32 i = 0; i < Reagents.size(); ++i) + { + if (Reagents.HasChanged(i) || ignoreChangesMask) + { + Reagents[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + } + } + if (changesMask[2]) + { + data << int32(Field_0); + } + if (changesMask[3]) + { + data << uint64(OrderID); + } + if (changesMask[4]) + { + data << int32(SkillLineAbilityID); + } + } + if (changesMask[5]) + { + if (changesMask[6]) + { + data << uint8(OrderState); + } + if (changesMask[7]) + { + data << uint8(OrderType); + } + if (changesMask[8]) + { + data << uint8(MinQuality); + } + if (changesMask[9]) + { + data << int64(ExpirationTime); + } + } + if (changesMask[10]) + { + if (changesMask[11]) + { + data << int64(ClaimEndTime); + } + if (changesMask[12]) + { + data << int64(TipAmount); + } + if (changesMask[13]) + { + data << int64(ConsortiumCut); + } + if (changesMask[14]) + { + data << uint32(Flags); + } + } + if (changesMask[15]) + { + if (changesMask[16]) + { + data << CustomerGUID; + } + if (changesMask[17]) + { + data << CustomerAccountGUID; + } + if (changesMask[18]) + { + data << CrafterGUID; + } + if (changesMask[19]) + { + data << PersonalCrafterGUID; + } + } + if (changesMask[20]) + { + if (changesMask[21]) + { + data.WriteBits(CustomerNotes->size(), 10); + data.WriteString(CustomerNotes); + } + data.WriteBits(OutputItem.has_value(), 1); + data.WriteBits(OutputItemData.has_value(), 1); + if (changesMask[22]) + { + if (OutputItem.has_value()) + { + OutputItem->WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + } + if (changesMask[23]) + { + if (OutputItemData.has_value()) + { + data << OutputItemData; + } + } + } + data.FlushBits(); +} + +void CraftingOrderData::ClearChangesMask() +{ + Base::ClearChangesMask(Reagents); + Base::ClearChangesMask(Field_0); + Base::ClearChangesMask(OrderID); + Base::ClearChangesMask(SkillLineAbilityID); + Base::ClearChangesMask(OrderState); + Base::ClearChangesMask(OrderType); + Base::ClearChangesMask(MinQuality); + Base::ClearChangesMask(ExpirationTime); + Base::ClearChangesMask(ClaimEndTime); + Base::ClearChangesMask(TipAmount); + Base::ClearChangesMask(ConsortiumCut); + Base::ClearChangesMask(Flags); + Base::ClearChangesMask(CustomerGUID); + Base::ClearChangesMask(CustomerAccountGUID); + Base::ClearChangesMask(CrafterGUID); + Base::ClearChangesMask(PersonalCrafterGUID); + Base::ClearChangesMask(CustomerNotes); + Base::ClearChangesMask(OutputItem); + Base::ClearChangesMask(OutputItemData); + _changesMask.ResetAll(); +} + +void CraftingOrder::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + Data->WriteCreate(data, owner, receiver); + data.WriteBits(RecraftItemInfo.has_value(), 1); + data.WriteBits(Enchantments.size(), 4); + data.WriteBits(Gems.size(), 2); + if (RecraftItemInfo.has_value()) + { + data << RecraftItemInfo; + } + for (uint32 i = 0; i < Enchantments.size(); ++i) + { + data << Enchantments[i]; + } + for (uint32 i = 0; i < Gems.size(); ++i) + { + data << Gems[i]; + } + data.FlushBits(); +} + +void CraftingOrder::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); + + if (changesMask[0]) + { + if (!ignoreChangesMask) + Enchantments.WriteUpdateMask(data, 4); + else + WriteCompleteDynamicFieldUpdateMask(Enchantments.size(), data, 4); + } + if (changesMask[1]) + { + if (!ignoreChangesMask) + Gems.WriteUpdateMask(data, 2); + else + WriteCompleteDynamicFieldUpdateMask(Gems.size(), data, 2); + } + data.FlushBits(); + if (changesMask[0]) + { + for (uint32 i = 0; i < Enchantments.size(); ++i) + { + if (Enchantments.HasChanged(i) || ignoreChangesMask) + { + data << Enchantments[i]; + } + } + } + if (changesMask[1]) + { + for (uint32 i = 0; i < Gems.size(); ++i) + { + if (Gems.HasChanged(i) || ignoreChangesMask) + { + data << Gems[i]; + } + } + } + if (changesMask[2]) + { + Data->WriteUpdate(data, ignoreChangesMask, owner, receiver); + } + data.WriteBits(RecraftItemInfo.has_value(), 1); + if (changesMask[3]) + { + if (RecraftItemInfo.has_value()) + { + data << RecraftItemInfo; + } + } + data.FlushBits(); +} + +void CraftingOrder::ClearChangesMask() +{ + Base::ClearChangesMask(Enchantments); + Base::ClearChangesMask(Gems); + Base::ClearChangesMask(Data); + Base::ClearChangesMask(RecraftItemInfo); + _changesMask.ResetAll(); +} + void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 199; ++i) + for (uint32 i = 0; i < 218; ++i) { data << InvSlots[i]; } @@ -3014,6 +3587,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << int32(CombatRatings[i]); } + data << uint32(PvpInfo.size()); data << int32(MaxLevel); data << int32(ScalingPlayerLevelDelta); data << int32(MaxCreatureScalingLevel); @@ -3040,7 +3614,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint32(OverrideZonePVPType); data << BnetAccount; data << uint64(GuildClubMemberID); - for (uint32 i = 0; i < 4; ++i) + for (uint32 i = 0; i < 5; ++i) { data << uint32(BagSlotFlags[i]); } @@ -3088,6 +3662,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << int32(TransportServerTime); data << uint32(WeeklyRewardsPeriodSinceOrigin); data << int16(DEBUGSoulbindConduitRank); + data << uint32(TraitConfigs.size()); + data << uint32(ActiveCombatTraitConfigID); + data << uint32(CraftingOrders.size()); for (uint32 i = 0; i < KnownTitles.size(); ++i) { data << uint64(KnownTitles[i]); @@ -3172,10 +3749,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << int32(DisabledSpells[i]); } - for (uint32 i = 0; i < 6; ++i) - { - PvpInfo[i].WriteCreate(data, owner, receiver); - } data.FlushBits(); data.WriteBit(BackpackAutoSortDisabled); data.WriteBit(BankAutoSortDisabled); @@ -3188,10 +3761,22 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f QuestSession->WriteCreate(data, owner, receiver); } data << DungeonScore; + for (uint32 i = 0; i < PvpInfo.size(); ++i) + { + PvpInfo[i].WriteCreate(data, owner, receiver); + } for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { CharacterRestrictions[i].WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < TraitConfigs.size(); ++i) + { + TraitConfigs[i].WriteCreate(data, owner, receiver); + } + for (uint32 i = 0; i < CraftingOrders.size(); ++i) + { + CraftingOrders[i].WriteCreate(data, owner, receiver); + } data.FlushBits(); } @@ -3204,8 +3789,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), 17); - for (uint32 i = 0; i < 49; ++i) + data.WriteBits(changesMask.GetBlocksMask(1), 18); + for (uint32 i = 0; i < 50; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -3237,109 +3822,116 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo if (changesMask[6]) { if (!ignoreNestedChangesMask) + PvpInfo.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data); + } + if (changesMask[7]) + { + if (!ignoreNestedChangesMask) ResearchSites.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ResearchSites.size(), data); } - if (changesMask[7]) + if (changesMask[8]) { if (!ignoreNestedChangesMask) ResearchSiteProgress.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ResearchSiteProgress.size(), data); } - if (changesMask[8]) + if (changesMask[9]) { if (!ignoreNestedChangesMask) DailyQuestsCompleted.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data); } - if (changesMask[9]) + if (changesMask[10]) { if (!ignoreNestedChangesMask) AvailableQuestLineXQuestIDs.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data); } - if (changesMask[10]) + if (changesMask[11]) { if (!ignoreNestedChangesMask) Heirlooms.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data); } - if (changesMask[11]) + if (changesMask[12]) { if (!ignoreNestedChangesMask) HeirloomFlags.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data); } - if (changesMask[12]) + if (changesMask[13]) { if (!ignoreNestedChangesMask) Toys.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Toys.size(), data); } - if (changesMask[13]) + if (changesMask[14]) { if (!ignoreNestedChangesMask) ToyFlags.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data); } - if (changesMask[14]) + if (changesMask[15]) { if (!ignoreNestedChangesMask) Transmog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data); } - if (changesMask[15]) + if (changesMask[16]) { if (!ignoreNestedChangesMask) ConditionalTransmog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data); } - if (changesMask[16]) + if (changesMask[17]) { if (!ignoreNestedChangesMask) SelfResSpells.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data); } - if (changesMask[17]) + if (changesMask[18]) { if (!ignoreNestedChangesMask) RuneforgePowers.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data); } - if (changesMask[18]) + if (changesMask[19]) { if (!ignoreNestedChangesMask) TransmogIllusions.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data); } - if (changesMask[19]) + if (changesMask[20]) { if (!ignoreNestedChangesMask) CharacterRestrictions.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data); } - if (changesMask[20]) + if (changesMask[21]) { if (!ignoreNestedChangesMask) SpellPctModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data); } - if (changesMask[21]) + if (changesMask[22]) { if (!ignoreNestedChangesMask) SpellFlatModByLabel.WriteUpdateMask(data); @@ -3347,11 +3939,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data); } } - if (changesMask[27]) + if (changesMask[30]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[28 + i]) + if (changesMask[31 + i]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -3370,41 +3962,55 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.FlushBits(); if (changesMask[0]) { - if (changesMask[22]) + if (changesMask[23]) { if (!ignoreNestedChangesMask) MawPowers.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data); } - if (changesMask[23]) + if (changesMask[24]) { if (!ignoreNestedChangesMask) MultiFloorExploration.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data); } - if (changesMask[24]) + if (changesMask[25]) { if (!ignoreNestedChangesMask) RecipeProgression.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data); } - if (changesMask[25]) + if (changesMask[26]) { if (!ignoreNestedChangesMask) ReplayedQuests.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data); } - if (changesMask[26]) + if (changesMask[27]) { if (!ignoreNestedChangesMask) DisabledSpells.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data); } + if (changesMask[28]) + { + if (!ignoreNestedChangesMask) + TraitConfigs.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data); + } + if (changesMask[29]) + { + if (!ignoreNestedChangesMask) + CraftingOrders.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data); + } } data.FlushBits(); if (changesMask[0]) @@ -3419,7 +4025,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[6]) + if (changesMask[7]) { for (uint32 i = 0; i < ResearchSites.size(); ++i) { @@ -3429,7 +4035,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[7]) + if (changesMask[8]) { for (uint32 i = 0; i < ResearchSiteProgress.size(); ++i) { @@ -3439,7 +4045,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[8]) + if (changesMask[9]) { for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i) { @@ -3449,7 +4055,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[9]) + if (changesMask[10]) { for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i) { @@ -3459,7 +4065,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[10]) + if (changesMask[11]) { for (uint32 i = 0; i < Heirlooms.size(); ++i) { @@ -3469,7 +4075,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[11]) + if (changesMask[12]) { for (uint32 i = 0; i < HeirloomFlags.size(); ++i) { @@ -3479,7 +4085,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[12]) + if (changesMask[13]) { for (uint32 i = 0; i < Toys.size(); ++i) { @@ -3489,7 +4095,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[13]) + if (changesMask[14]) { for (uint32 i = 0; i < ToyFlags.size(); ++i) { @@ -3499,7 +4105,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[14]) + if (changesMask[15]) { for (uint32 i = 0; i < Transmog.size(); ++i) { @@ -3509,7 +4115,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[15]) + if (changesMask[16]) { for (uint32 i = 0; i < ConditionalTransmog.size(); ++i) { @@ -3519,7 +4125,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[16]) + if (changesMask[17]) { for (uint32 i = 0; i < SelfResSpells.size(); ++i) { @@ -3529,7 +4135,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[17]) + if (changesMask[18]) { for (uint32 i = 0; i < RuneforgePowers.size(); ++i) { @@ -3539,7 +4145,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[18]) + if (changesMask[19]) { for (uint32 i = 0; i < TransmogIllusions.size(); ++i) { @@ -3549,7 +4155,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[20]) + if (changesMask[21]) { for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i) { @@ -3559,7 +4165,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[21]) + if (changesMask[22]) { for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i) { @@ -3569,7 +4175,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[22]) + if (changesMask[23]) { for (uint32 i = 0; i < MawPowers.size(); ++i) { @@ -3579,7 +4185,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[23]) + if (changesMask[24]) { for (uint32 i = 0; i < MultiFloorExploration.size(); ++i) { @@ -3589,7 +4195,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[24]) + if (changesMask[25]) { for (uint32 i = 0; i < RecipeProgression.size(); ++i) { @@ -3599,7 +4205,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[25]) + if (changesMask[26]) { for (uint32 i = 0; i < ReplayedQuests.size(); ++i) { @@ -3609,7 +4215,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[26]) + if (changesMask[27]) { for (uint32 i = 0; i < DisabledSpells.size(); ++i) { @@ -3619,7 +4225,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[19]) + if (changesMask[6]) + { + for (uint32 i = 0; i < PvpInfo.size(); ++i) + { + if (PvpInfo.HasChanged(i) || ignoreNestedChangesMask) + { + PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[20]) { for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { @@ -3629,493 +4245,507 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[29]) - { - data << FarsightObject; - } - if (changesMask[30]) + if (changesMask[28]) { - data << SummonedBattlePetGUID; + for (uint32 i = 0; i < TraitConfigs.size(); ++i) + { + if (TraitConfigs.HasChanged(i) || ignoreNestedChangesMask) + { + TraitConfigs[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[31]) + if (changesMask[29]) { - data << uint64(Coinage); + for (uint32 i = 0; i < CraftingOrders.size(); ++i) + { + if (CraftingOrders.HasChanged(i) || ignoreNestedChangesMask) + { + CraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } if (changesMask[32]) { - data << int32(XP); + data << FarsightObject; } if (changesMask[33]) { - data << int32(NextLevelXP); + data << SummonedBattlePetGUID; } } if (changesMask[34]) { if (changesMask[35]) { - data << int32(TrialXP); + data << uint64(Coinage); } if (changesMask[36]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(XP); } if (changesMask[37]) { - data << int32(CharacterPoints); + data << int32(NextLevelXP); } if (changesMask[38]) { - data << int32(MaxTalentTiers); + data << int32(TrialXP); } if (changesMask[39]) { - data << uint32(TrackCreatureMask); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[40]) { - data << float(MainhandExpertise); + data << int32(CharacterPoints); } if (changesMask[41]) { - data << float(OffhandExpertise); + data << int32(MaxTalentTiers); } if (changesMask[42]) { - data << float(RangedExpertise); + data << uint32(TrackCreatureMask); } if (changesMask[43]) { - data << float(CombatRatingExpertise); + data << float(MainhandExpertise); } if (changesMask[44]) { - data << float(BlockPercentage); + data << float(OffhandExpertise); } if (changesMask[45]) { - data << float(DodgePercentage); + data << float(RangedExpertise); } if (changesMask[46]) { - data << float(DodgePercentageFromAttribute); + data << float(CombatRatingExpertise); } if (changesMask[47]) { - data << float(ParryPercentage); + data << float(BlockPercentage); } if (changesMask[48]) { - data << float(ParryPercentageFromAttribute); + data << float(DodgePercentage); } if (changesMask[49]) { - data << float(CritPercentage); + data << float(DodgePercentageFromAttribute); } if (changesMask[50]) { - data << float(RangedCritPercentage); + data << float(ParryPercentage); } if (changesMask[51]) { - data << float(OffhandCritPercentage); + data << float(ParryPercentageFromAttribute); } if (changesMask[52]) { - data << float(SpellCritPercentage); + data << float(CritPercentage); } if (changesMask[53]) { - data << int32(ShieldBlock); + data << float(RangedCritPercentage); } if (changesMask[54]) { - data << float(ShieldBlockCritPercentage); + data << float(OffhandCritPercentage); } if (changesMask[55]) { - data << float(Mastery); + data << float(SpellCritPercentage); } if (changesMask[56]) { - data << float(Speed); + data << int32(ShieldBlock); } if (changesMask[57]) { - data << float(Avoidance); + data << float(ShieldBlockCritPercentage); } if (changesMask[58]) { - data << float(Sturdiness); + data << float(Mastery); } if (changesMask[59]) { - data << int32(Versatility); + data << float(Speed); } if (changesMask[60]) { - data << float(VersatilityBonus); + data << float(Avoidance); } if (changesMask[61]) { - data << float(PvpPowerDamage); + data << float(Sturdiness); } if (changesMask[62]) { - data << float(PvpPowerHealing); + data << int32(Versatility); } if (changesMask[63]) { - data << int32(ModHealingDonePos); + data << float(VersatilityBonus); } if (changesMask[64]) { - data << float(ModHealingPercent); + data << float(PvpPowerDamage); } if (changesMask[65]) { - data << float(ModPeriodicHealingDonePercent); + data << float(PvpPowerHealing); } } if (changesMask[66]) { if (changesMask[67]) { - data << float(ModSpellPowerPercent); + data << int32(ModHealingDonePos); } if (changesMask[68]) { - data << float(ModResiliencePercent); + data << float(ModHealingPercent); } if (changesMask[69]) { - data << float(OverrideSpellPowerByAPPercent); + data << float(ModPeriodicHealingDonePercent); } if (changesMask[70]) { - data << float(OverrideAPBySpellPowerPercent); + data << float(ModSpellPowerPercent); } if (changesMask[71]) { - data << int32(ModTargetResistance); + data << float(ModResiliencePercent); } if (changesMask[72]) { - data << int32(ModTargetPhysicalResistance); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[73]) { - data << uint32(LocalFlags); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[74]) { - data << uint8(GrantableLevels); + data << int32(ModTargetResistance); } if (changesMask[75]) { - data << uint8(MultiActionBars); + data << int32(ModTargetPhysicalResistance); } if (changesMask[76]) { - data << uint8(LifetimeMaxRank); + data << uint32(LocalFlags); } if (changesMask[77]) { - data << uint8(NumRespecs); + data << uint8(GrantableLevels); } if (changesMask[78]) { - data << uint32(PvpMedals); + data << uint8(MultiActionBars); } if (changesMask[79]) { - data << uint16(TodayHonorableKills); + data << uint8(LifetimeMaxRank); } if (changesMask[80]) { - data << uint16(YesterdayHonorableKills); + data << uint8(NumRespecs); } if (changesMask[81]) { - data << uint32(LifetimeHonorableKills); + data << uint32(PvpMedals); } if (changesMask[82]) { - data << int32(WatchedFactionIndex); + data << uint16(TodayHonorableKills); } if (changesMask[83]) { - data << int32(MaxLevel); + data << uint16(YesterdayHonorableKills); } if (changesMask[84]) { - data << int32(ScalingPlayerLevelDelta); + data << uint32(LifetimeHonorableKills); } if (changesMask[85]) { - data << int32(MaxCreatureScalingLevel); + data << int32(WatchedFactionIndex); } if (changesMask[86]) { - data << int32(PetSpellPower); + data << int32(MaxLevel); } if (changesMask[87]) { - data << float(UiHitModifier); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[88]) { - data << float(UiSpellHitModifier); + data << int32(MaxCreatureScalingLevel); } if (changesMask[89]) { - data << int32(HomeRealmTimeOffset); + data << int32(PetSpellPower); } if (changesMask[90]) { - data << float(ModPetHaste); + data << float(UiHitModifier); } if (changesMask[91]) { - data << int8(JailersTowerLevelMax); + data << float(UiSpellHitModifier); } if (changesMask[92]) { - data << int8(JailersTowerLevel); + data << int32(HomeRealmTimeOffset); } if (changesMask[93]) { - data << uint8(LocalRegenFlags); + data << float(ModPetHaste); } if (changesMask[94]) { - data << uint8(AuraVision); + data << int8(JailersTowerLevelMax); } if (changesMask[95]) { - data << uint8(NumBackpackSlots); + data << int8(JailersTowerLevel); } if (changesMask[96]) { - data << int32(OverrideSpellsID); + data << uint8(LocalRegenFlags); } if (changesMask[97]) { - data << uint16(LootSpecID); + data << uint8(AuraVision); } } if (changesMask[98]) { if (changesMask[99]) { - data << uint32(OverrideZonePVPType); + data << uint8(NumBackpackSlots); } if (changesMask[100]) { - data << BnetAccount; + data << int32(OverrideSpellsID); } if (changesMask[101]) { - data << uint64(GuildClubMemberID); + data << uint16(LootSpecID); } if (changesMask[102]) { - data << int32(Honor); + data << uint32(OverrideZonePVPType); } if (changesMask[103]) { - data << int32(HonorNextLevel); + data << BnetAccount; } if (changesMask[104]) { - data << uint8(NumBankSlots); + data << uint64(GuildClubMemberID); + } + if (changesMask[105]) + { + data << int32(Honor); + } + if (changesMask[106]) + { + data << int32(HonorNextLevel); } if (changesMask[107]) { + data << uint8(NumBankSlots); + } + if (changesMask[110]) + { data << int32(UiChromieTimeExpansionID); } - if (changesMask[108]) + if (changesMask[111]) { data << int32(TransportServerTime); } - if (changesMask[109]) + if (changesMask[112]) { data << uint32(WeeklyRewardsPeriodSinceOrigin); } - if (changesMask[110]) + if (changesMask[113]) { data << int16(DEBUGSoulbindConduitRank); } + if (changesMask[115]) + { + data << uint32(ActiveCombatTraitConfigID); + } } if (changesMask[98]) { data.WriteBits(QuestSession.has_value(), 1); - if (changesMask[106]) + if (changesMask[109]) { Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[105]) + if (changesMask[108]) { if (QuestSession.has_value()) { QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[111]) + if (changesMask[114]) { data << DungeonScore; } } - if (changesMask[112]) + if (changesMask[116]) { - for (uint32 i = 0; i < 199; ++i) + for (uint32 i = 0; i < 218; ++i) { - if (changesMask[113 + i]) + if (changesMask[117 + i]) { data << InvSlots[i]; } } } - if (changesMask[312]) + if (changesMask[335]) { for (uint32 i = 0; i < 240; ++i) { - if (changesMask[313 + i]) + if (changesMask[336 + i]) { data << uint64(ExploredZones[i]); } } } - if (changesMask[553]) + if (changesMask[576]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[554 + i]) + if (changesMask[577 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[556]) + if (changesMask[579]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[557 + i]) + if (changesMask[580 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[564 + i]) + if (changesMask[587 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[571 + i]) + if (changesMask[594 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[578 + i]) + if (changesMask[601 + i]) { data << float(ModHealingDonePercent[i]); } } } - if (changesMask[585]) + if (changesMask[608]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[586 + i]) + if (changesMask[609 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[589 + i]) + if (changesMask[612 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[592]) + if (changesMask[615]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[593 + i]) + if (changesMask[616 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[605 + i]) + if (changesMask[628 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[617]) + if (changesMask[640]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[618 + i]) + if (changesMask[641 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[657]) + if (changesMask[673]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[658 + i]) + if (changesMask[674 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[662]) + if (changesMask[678]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[663 + i]) + if (changesMask[679 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[665]) + if (changesMask[681]) { - for (uint32 i = 0; i < 4; ++i) + for (uint32 i = 0; i < 5; ++i) { - if (changesMask[666 + i]) + if (changesMask[682 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[670]) + if (changesMask[687]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[671 + i]) + if (changesMask[688 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[678]) + if (changesMask[695]) { for (uint32 i = 0; i < 875; ++i) { - if (changesMask[679 + i]) + if (changesMask[696 + i]) { data << uint64(QuestCompleted[i]); } } } - if (changesMask[650]) - { - for (uint32 i = 0; i < 6; ++i) - { - if (changesMask[651 + i]) - { - PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } data.FlushBits(); } @@ -4147,7 +4777,10 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(RecipeProgression); Base::ClearChangesMask(ReplayedQuests); Base::ClearChangesMask(DisabledSpells); + Base::ClearChangesMask(PvpInfo); Base::ClearChangesMask(CharacterRestrictions); + Base::ClearChangesMask(TraitConfigs); + Base::ClearChangesMask(CraftingOrders); Base::ClearChangesMask(FarsightObject); Base::ClearChangesMask(SummonedBattlePetGUID); Base::ClearChangesMask(Coinage); @@ -4228,6 +4861,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(WeeklyRewardsPeriodSinceOrigin); Base::ClearChangesMask(DEBUGSoulbindConduitRank); Base::ClearChangesMask(DungeonScore); + Base::ClearChangesMask(ActiveCombatTraitConfigID); Base::ClearChangesMask(InvSlots); Base::ClearChangesMask(ExploredZones); Base::ClearChangesMask(RestInfo); @@ -4240,7 +4874,6 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(BuybackPrice); Base::ClearChangesMask(BuybackTimestamp); Base::ClearChangesMask(CombatRatings); - Base::ClearChangesMask(PvpInfo); Base::ClearChangesMask(NoReagentCostMask); Base::ClearChangesMask(ProfessionSkillLine); Base::ClearChangesMask(BagSlotFlags); @@ -4278,10 +4911,18 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie data << uint32(CustomParam); data << int32(Level); data << uint32(AnimGroupInstance); + data << uint32(UiWidgetItemID); + data << uint32(UiWidgetItemQuality); + data << uint32(UiWidgetItemUnknown1000); + data << uint32(WorldEffects.size()); for (uint32 i = 0; i < EnableDoodadSets.size(); ++i) { data << int32(EnableDoodadSets[i]); } + for (uint32 i = 0; i < WorldEffects.size(); ++i) + { + data << int32(WorldEffects[i]); + } } void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const @@ -4291,7 +4932,7 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 21); + data.WriteBits(changesMask.GetBlock(0), 25); if (changesMask[0]) { @@ -4314,6 +4955,13 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool else WriteCompleteDynamicFieldUpdateMask(EnableDoodadSets.size(), data); } + if (changesMask[3]) + { + if (!ignoreNestedChangesMask) + WorldEffects.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(WorldEffects.size(), data); + } } data.FlushBits(); if (changesMask[0]) @@ -4330,79 +4978,101 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool } if (changesMask[3]) { - data << int32(DisplayID); + for (uint32 i = 0; i < WorldEffects.size(); ++i) + { + if (WorldEffects.HasChanged(i) || ignoreNestedChangesMask) + { + data << int32(WorldEffects[i]); + } + } } if (changesMask[4]) { - data << uint32(SpellVisualID); + data << int32(DisplayID); } if (changesMask[5]) { - data << uint32(StateSpellVisualID); + data << uint32(SpellVisualID); } if (changesMask[6]) { - data << uint32(SpawnTrackingStateAnimID); + data << uint32(StateSpellVisualID); } if (changesMask[7]) { - data << uint32(SpawnTrackingStateAnimKitID); + data << uint32(SpawnTrackingStateAnimID); } if (changesMask[8]) { - data << uint32(StateWorldEffectsQuestObjectiveID); + data << uint32(SpawnTrackingStateAnimKitID); } if (changesMask[9]) { - data << CreatedBy; + data << uint32(StateWorldEffectsQuestObjectiveID); } if (changesMask[10]) { - data << GuildGUID; + data << CreatedBy; } if (changesMask[11]) { - data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); + data << GuildGUID; } if (changesMask[12]) { + data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); + } + if (changesMask[13]) + { data << float(ParentRotation->x); data << float(ParentRotation->y); data << float(ParentRotation->z); data << float(ParentRotation->w); } - if (changesMask[13]) + if (changesMask[14]) { data << int32(FactionTemplate); } - if (changesMask[14]) + if (changesMask[15]) { data << int8(ViewerDependentValue<StateTag>::GetValue(this, owner, receiver)); } - if (changesMask[15]) + if (changesMask[16]) { data << int8(TypeID); } - if (changesMask[16]) + if (changesMask[17]) { data << uint8(PercentHealth); } - if (changesMask[17]) + if (changesMask[18]) { data << uint32(ArtKit); } - if (changesMask[18]) + if (changesMask[19]) { data << uint32(CustomParam); } - if (changesMask[19]) + if (changesMask[20]) { data << int32(Level); } - if (changesMask[20]) + if (changesMask[21]) { data << uint32(AnimGroupInstance); } + if (changesMask[22]) + { + data << uint32(UiWidgetItemID); + } + if (changesMask[23]) + { + data << uint32(UiWidgetItemQuality); + } + if (changesMask[24]) + { + data << uint32(UiWidgetItemUnknown1000); + } } } @@ -4410,6 +5080,7 @@ void GameObjectData::ClearChangesMask() { Base::ClearChangesMask(StateWorldEffectIDs); Base::ClearChangesMask(EnableDoodadSets); + Base::ClearChangesMask(WorldEffects); Base::ClearChangesMask(DisplayID); Base::ClearChangesMask(SpellVisualID); Base::ClearChangesMask(StateSpellVisualID); @@ -4428,6 +5099,9 @@ void GameObjectData::ClearChangesMask() Base::ClearChangesMask(CustomParam); Base::ClearChangesMask(Level); Base::ClearChangesMask(AnimGroupInstance); + Base::ClearChangesMask(UiWidgetItemID); + Base::ClearChangesMask(UiWidgetItemQuality); + Base::ClearChangesMask(UiWidgetItemUnknown1000); _changesMask.ResetAll(); } @@ -4746,6 +5420,7 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << uint32(TimeToTarget); data << uint32(TimeToTargetScale); data << uint32(TimeToTargetExtraScale); + data << uint32(Field_B0); data << int32(SpellID); data << int32(SpellForVisuals); SpellVisual->WriteCreate(data, owner, receiver); @@ -4755,7 +5430,11 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << uint32(Field_80); data << uint32(Field_84); data << Field_88; + data << Field_F8; ExtraScaleCurve->WriteCreate(data, owner, receiver); + Field_C38->WriteCreate(data, owner, receiver); + Field_C54->WriteCreate(data, owner, receiver); + Field_C70->WriteCreate(data, owner, receiver); VisualAnim->WriteCreate(data, owner, receiver); } @@ -4766,7 +5445,7 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 18); + data.WriteBits(changesMask.GetBlock(0), 23); data.FlushBits(); if (changesMask[0]) @@ -4775,67 +5454,87 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo { OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[3]) + if (changesMask[6]) { data << Caster; } - if (changesMask[4]) + if (changesMask[7]) { data << uint32(Duration); } - if (changesMask[5]) + if (changesMask[8]) { data << uint32(TimeToTarget); } - if (changesMask[6]) + if (changesMask[9]) { data << uint32(TimeToTargetScale); } - if (changesMask[7]) + if (changesMask[10]) { data << uint32(TimeToTargetExtraScale); } - if (changesMask[8]) + if (changesMask[11]) + { + data << uint32(Field_B0); + } + if (changesMask[12]) { data << int32(SpellID); } - if (changesMask[9]) + if (changesMask[13]) { data << int32(SpellForVisuals); } - if (changesMask[10]) + if (changesMask[14]) { SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[11]) + if (changesMask[15]) { data << float(BoundsRadius2D); } - if (changesMask[12]) + if (changesMask[16]) { data << uint32(DecalPropertiesID); } - if (changesMask[13]) + if (changesMask[17]) { data << CreatingEffectGUID; } - if (changesMask[14]) + if (changesMask[18]) { data << uint32(Field_80); } - if (changesMask[15]) + if (changesMask[19]) { data << uint32(Field_84); } - if (changesMask[16]) + if (changesMask[20]) { data << Field_88; } + if (changesMask[21]) + { + data << Field_F8; + } if (changesMask[2]) { ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[17]) + if (changesMask[3]) + { + Field_C38->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[4]) + { + Field_C54->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[5]) + { + Field_C70->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[22]) { VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -4846,11 +5545,15 @@ void AreaTriggerData::ClearChangesMask() { Base::ClearChangesMask(OverrideScaleCurve); Base::ClearChangesMask(ExtraScaleCurve); + Base::ClearChangesMask(Field_C38); + Base::ClearChangesMask(Field_C54); + Base::ClearChangesMask(Field_C70); Base::ClearChangesMask(Caster); Base::ClearChangesMask(Duration); Base::ClearChangesMask(TimeToTarget); Base::ClearChangesMask(TimeToTargetScale); Base::ClearChangesMask(TimeToTargetExtraScale); + Base::ClearChangesMask(Field_B0); Base::ClearChangesMask(SpellID); Base::ClearChangesMask(SpellForVisuals); Base::ClearChangesMask(SpellVisual); @@ -4860,6 +5563,7 @@ void AreaTriggerData::ClearChangesMask() Base::ClearChangesMask(Field_80); Base::ClearChangesMask(Field_84); Base::ClearChangesMask(Field_88); + Base::ClearChangesMask(Field_F8); Base::ClearChangesMask(VisualAnim); _changesMask.ResetAll(); } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 1d6d1499df8..a075a11ab81 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -19,6 +19,7 @@ #define UpdateFields_h__ #include "EnumFlag.h" +#include "ItemPacketsCommon.h" #include "MythicPlusPacketsCommon.h" #include "ObjectGuid.h" #include "Position.h" @@ -115,25 +116,25 @@ struct SocketedGem : public IsUpdateFieldStructureTag, public HasChangesMask<20> struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41> { - UpdateField<std::vector<int32>, 0, 1> BonusListIDs; - DynamicUpdateField<UF::ArtifactPower, 0, 2> ArtifactPowers; - DynamicUpdateField<UF::SocketedGem, 0, 3> Gems; - UpdateField<ObjectGuid, 0, 4> Owner; - UpdateField<ObjectGuid, 0, 5> ContainedIn; - UpdateField<ObjectGuid, 0, 6> Creator; - UpdateField<ObjectGuid, 0, 7> GiftCreator; - UpdateField<uint32, 0, 8> StackCount; - UpdateField<uint32, 0, 9> Expiration; - UpdateField<uint32, 0, 10> DynamicFlags; - UpdateField<uint32, 0, 11> Durability; - UpdateField<uint32, 0, 12> MaxDurability; - UpdateField<uint32, 0, 13> CreatePlayedTime; - UpdateField<int32, 0, 14> Context; - UpdateField<int64, 0, 15> CreateTime; - UpdateField<uint64, 0, 16> ArtifactXP; - UpdateField<uint8, 0, 17> ItemAppearanceModID; - UpdateField<UF::ItemModList, 0, 18> Modifiers; - UpdateField<uint32, 0, 19> DynamicFlags2; + DynamicUpdateField<UF::ArtifactPower, 0, 1> ArtifactPowers; + DynamicUpdateField<UF::SocketedGem, 0, 2> Gems; + UpdateField<ObjectGuid, 0, 3> Owner; + UpdateField<ObjectGuid, 0, 4> ContainedIn; + UpdateField<ObjectGuid, 0, 5> Creator; + UpdateField<ObjectGuid, 0, 6> GiftCreator; + UpdateField<uint32, 0, 7> StackCount; + UpdateField<uint32, 0, 8> Expiration; + UpdateField<uint32, 0, 9> DynamicFlags; + UpdateField<uint32, 0, 10> Durability; + UpdateField<uint32, 0, 11> MaxDurability; + UpdateField<uint32, 0, 12> CreatePlayedTime; + UpdateField<int32, 0, 13> Context; + UpdateField<int64, 0, 14> CreateTime; + UpdateField<uint64, 0, 15> ArtifactXP; + UpdateField<uint8, 0, 16> ItemAppearanceModID; + UpdateField<UF::ItemModList, 0, 17> Modifiers; + UpdateField<uint32, 0, 18> DynamicFlags2; + UpdateField<WorldPackets::Item::ItemBonusKey, 0, 19> ItemBonusKey; UpdateField<uint16, 0, 20> DEBUGItemLevel; UpdateFieldArray<int32, 5, 21, 22> SpellCharges; UpdateFieldArray<UF::ItemEnchantment, 13, 27, 28> Enchantment; @@ -254,7 +255,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<194> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells; @@ -279,119 +280,121 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<194> UpdateField<ObjectGuid, 0, 20> BattlePetCompanionGUID; UpdateField<uint64, 0, 21> BattlePetDBID; UpdateField<UF::UnitChannel, 0, 22> ChannelData; - UpdateField<uint32, 0, 23> SummonedByHomeRealm; - UpdateField<uint8, 0, 24> Race; - UpdateField<uint8, 0, 25> ClassId; - UpdateField<uint8, 0, 26> PlayerClassId; - UpdateField<uint8, 0, 27> Sex; - UpdateField<uint8, 0, 28> DisplayPower; - UpdateField<uint32, 0, 29> OverrideDisplayPowerID; - UpdateField<int64, 0, 30> Health; - UpdateField<int64, 0, 31> MaxHealth; - UpdateField<int32, 32, 33> Level; - UpdateField<int32, 32, 34> EffectiveLevel; - UpdateField<int32, 32, 35> ContentTuningID; - UpdateField<int32, 32, 36> ScalingLevelMin; - UpdateField<int32, 32, 37> ScalingLevelMax; - UpdateField<int32, 32, 38> ScalingLevelDelta; - UpdateField<int32, 32, 39> ScalingFactionGroup; - UpdateField<int32, 32, 40> ScalingHealthItemLevelCurveID; - UpdateField<int32, 32, 41> ScalingDamageItemLevelCurveID; - UpdateField<int32, 32, 42> FactionTemplate; + UpdateField<int8, 0, 23> SpellEmpowerStage; + UpdateField<uint32, 0, 24> SummonedByHomeRealm; + UpdateField<uint8, 0, 25> Race; + UpdateField<uint8, 0, 26> ClassId; + UpdateField<uint8, 0, 27> PlayerClassId; + UpdateField<uint8, 0, 28> Sex; + UpdateField<uint8, 0, 29> DisplayPower; + UpdateField<uint32, 0, 30> OverrideDisplayPowerID; + UpdateField<int64, 0, 31> Health; + UpdateField<int64, 32, 33> MaxHealth; + UpdateField<int32, 32, 34> Level; + UpdateField<int32, 32, 35> EffectiveLevel; + UpdateField<int32, 32, 36> ContentTuningID; + UpdateField<int32, 32, 37> ScalingLevelMin; + UpdateField<int32, 32, 38> ScalingLevelMax; + UpdateField<int32, 32, 39> ScalingLevelDelta; + UpdateField<int32, 32, 40> ScalingFactionGroup; + UpdateField<int32, 32, 41> ScalingHealthItemLevelCurveID; + UpdateField<int32, 32, 42> ScalingDamageItemLevelCurveID; + UpdateField<int32, 32, 43> FactionTemplate; struct FactionTemplateTag : ViewerDependentValueTag<int32> {}; - UpdateField<uint32, 32, 43> Flags; + UpdateField<uint32, 32, 44> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 44> Flags2; - UpdateField<uint32, 32, 45> Flags3; + UpdateField<uint32, 32, 45> Flags2; + UpdateField<uint32, 32, 46> Flags3; struct Flags3Tag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 46> AuraState; + UpdateField<uint32, 32, 47> AuraState; struct AuraStateTag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 47> RangedAttackRoundBaseTime; - UpdateField<float, 32, 48> BoundingRadius; - UpdateField<float, 32, 49> CombatReach; - UpdateField<float, 32, 50> DisplayScale; - UpdateField<int32, 32, 51> CreatureFamily; - UpdateField<int32, 32, 52> CreatureType; - UpdateField<int32, 32, 53> NativeDisplayID; - UpdateField<float, 32, 54> NativeXDisplayScale; - UpdateField<int32, 32, 55> MountDisplayID; - UpdateField<int32, 32, 56> CosmeticMountDisplayID; - UpdateField<float, 32, 57> MinDamage; - UpdateField<float, 32, 58> MaxDamage; - UpdateField<float, 32, 59> MinOffHandDamage; - UpdateField<float, 32, 60> MaxOffHandDamage; - UpdateField<uint8, 32, 61> StandState; - UpdateField<uint8, 32, 62> PetTalentPoints; - UpdateField<uint8, 32, 63> VisFlags; - UpdateField<uint8, 64, 65> AnimTier; - UpdateField<uint32, 64, 66> PetNumber; - UpdateField<uint32, 64, 67> PetNameTimestamp; - UpdateField<uint32, 64, 68> PetExperience; - UpdateField<uint32, 64, 69> PetNextLevelExperience; - UpdateField<float, 64, 70> ModCastingSpeed; - UpdateField<float, 64, 71> ModCastingSpeedNeg; - UpdateField<float, 64, 72> ModSpellHaste; - UpdateField<float, 64, 73> ModHaste; - UpdateField<float, 64, 74> ModRangedHaste; - UpdateField<float, 64, 75> ModHasteRegen; - UpdateField<float, 64, 76> ModTimeRate; - UpdateField<int32, 64, 77> CreatedBySpell; - UpdateField<int32, 64, 78> EmoteState; - UpdateField<int32, 64, 79> BaseMana; - UpdateField<int32, 64, 80> BaseHealth; - UpdateField<uint8, 64, 81> SheatheState; - UpdateField<uint8, 64, 82> PvpFlags; + UpdateField<uint32, 32, 48> RangedAttackRoundBaseTime; + UpdateField<float, 32, 49> BoundingRadius; + UpdateField<float, 32, 50> CombatReach; + UpdateField<float, 32, 51> DisplayScale; + UpdateField<int32, 32, 52> CreatureFamily; + UpdateField<int32, 32, 53> CreatureType; + UpdateField<int32, 32, 54> NativeDisplayID; + UpdateField<float, 32, 55> NativeXDisplayScale; + UpdateField<int32, 32, 56> MountDisplayID; + UpdateField<int32, 32, 57> CosmeticMountDisplayID; + UpdateField<float, 32, 58> MinDamage; + UpdateField<float, 32, 59> MaxDamage; + UpdateField<float, 32, 60> MinOffHandDamage; + UpdateField<float, 32, 61> MaxOffHandDamage; + UpdateField<uint8, 32, 62> StandState; + UpdateField<uint8, 32, 63> PetTalentPoints; + UpdateField<uint8, 64, 65> VisFlags; + UpdateField<uint8, 64, 66> AnimTier; + UpdateField<uint32, 64, 67> PetNumber; + UpdateField<uint32, 64, 68> PetNameTimestamp; + UpdateField<uint32, 64, 69> PetExperience; + UpdateField<uint32, 64, 70> PetNextLevelExperience; + UpdateField<float, 64, 71> ModCastingSpeed; + UpdateField<float, 64, 72> ModCastingSpeedNeg; + UpdateField<float, 64, 73> ModSpellHaste; + UpdateField<float, 64, 74> ModHaste; + UpdateField<float, 64, 75> ModRangedHaste; + UpdateField<float, 64, 76> ModHasteRegen; + UpdateField<float, 64, 77> ModTimeRate; + UpdateField<int32, 64, 78> CreatedBySpell; + UpdateField<int32, 64, 79> EmoteState; + UpdateField<int32, 64, 80> BaseMana; + UpdateField<int32, 64, 81> BaseHealth; + UpdateField<uint8, 64, 82> SheatheState; + UpdateField<uint8, 64, 83> PvpFlags; struct PvpFlagsTag : ViewerDependentValueTag<uint8> {}; - UpdateField<uint8, 64, 83> PetFlags; - UpdateField<uint8, 64, 84> ShapeshiftForm; - UpdateField<int32, 64, 85> AttackPower; - UpdateField<int32, 64, 86> AttackPowerModPos; - UpdateField<int32, 64, 87> AttackPowerModNeg; - UpdateField<float, 64, 88> AttackPowerMultiplier; - UpdateField<int32, 64, 89> RangedAttackPower; - UpdateField<int32, 64, 90> RangedAttackPowerModPos; - UpdateField<int32, 64, 91> RangedAttackPowerModNeg; - UpdateField<float, 64, 92> RangedAttackPowerMultiplier; - UpdateField<int32, 64, 93> MainHandWeaponAttackPower; - UpdateField<int32, 64, 94> OffHandWeaponAttackPower; - UpdateField<int32, 64, 95> RangedWeaponAttackPower; - UpdateField<int32, 96, 97> SetAttackSpeedAura; - UpdateField<float, 96, 98> Lifesteal; - UpdateField<float, 96, 99> MinRangedDamage; - UpdateField<float, 96, 100> MaxRangedDamage; - UpdateField<float, 96, 101> ManaCostMultiplier; - UpdateField<float, 96, 102> MaxHealthModifier; - UpdateField<float, 96, 103> HoverHeight; - UpdateField<int32, 96, 104> MinItemLevelCutoff; - UpdateField<int32, 96, 105> MinItemLevel; - UpdateField<int32, 96, 106> MaxItemLevel; - UpdateField<int32, 96, 107> AzeriteItemLevel; - UpdateField<int32, 96, 108> WildBattlePetLevel; - UpdateField<int32, 96, 109> BattlePetCompanionExperience; - UpdateField<uint32, 96, 110> BattlePetCompanionNameTimestamp; - UpdateField<int32, 96, 111> InteractSpellID; - UpdateField<int32, 96, 112> ScaleDuration; - UpdateField<int32, 96, 113> LooksLikeMountID; - UpdateField<int32, 96, 114> LooksLikeCreatureID; - UpdateField<int32, 96, 115> LookAtControllerID; - UpdateField<int32, 96, 116> TaxiNodesID; - UpdateField<ObjectGuid, 96, 117> GuildGUID; - UpdateField<uint32, 96, 118> SilencedSchoolMask; - UpdateField<ObjectGuid, 96, 119> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object - UpdateFieldArray<uint32, 2, 120, 121> NpcFlags; + UpdateField<uint8, 64, 84> PetFlags; + UpdateField<uint8, 64, 85> ShapeshiftForm; + UpdateField<int32, 64, 86> AttackPower; + UpdateField<int32, 64, 87> AttackPowerModPos; + UpdateField<int32, 64, 88> AttackPowerModNeg; + UpdateField<float, 64, 89> AttackPowerMultiplier; + UpdateField<int32, 64, 90> RangedAttackPower; + UpdateField<int32, 64, 91> RangedAttackPowerModPos; + UpdateField<int32, 64, 92> RangedAttackPowerModNeg; + UpdateField<float, 64, 93> RangedAttackPowerMultiplier; + UpdateField<int32, 64, 94> MainHandWeaponAttackPower; + UpdateField<int32, 64, 95> OffHandWeaponAttackPower; + UpdateField<int32, 96, 97> RangedWeaponAttackPower; + UpdateField<int32, 96, 98> SetAttackSpeedAura; + UpdateField<float, 96, 99> Lifesteal; + UpdateField<float, 96, 100> MinRangedDamage; + UpdateField<float, 96, 101> MaxRangedDamage; + UpdateField<float, 96, 102> ManaCostMultiplier; + UpdateField<float, 96, 103> MaxHealthModifier; + UpdateField<float, 96, 104> HoverHeight; + UpdateField<int32, 96, 105> MinItemLevelCutoff; + UpdateField<int32, 96, 106> MinItemLevel; + UpdateField<int32, 96, 107> MaxItemLevel; + UpdateField<int32, 96, 108> AzeriteItemLevel; + UpdateField<int32, 96, 109> WildBattlePetLevel; + UpdateField<int32, 96, 110> BattlePetCompanionExperience; + UpdateField<uint32, 96, 111> BattlePetCompanionNameTimestamp; + UpdateField<int32, 96, 112> InteractSpellID; + UpdateField<int32, 96, 113> ScaleDuration; + 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; struct NpcFlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateFieldArray<int32, 7, 123, 124> Power; - UpdateFieldArray<int32, 7, 123, 131> MaxPower; - UpdateFieldArray<float, 7, 123, 138> PowerRegenFlatModifier; - UpdateFieldArray<float, 7, 123, 145> PowerRegenInterruptedFlatModifier; - UpdateFieldArray<UF::VisibleItem, 3, 152, 153> VirtualItems; - UpdateFieldArray<uint32, 2, 156, 157> AttackRoundBaseTime; - UpdateFieldArray<int32, 4, 159, 160> Stats; - UpdateFieldArray<int32, 4, 159, 164> StatPosBuff; - UpdateFieldArray<int32, 4, 159, 168> StatNegBuff; - UpdateFieldArray<int32, 7, 172, 173> Resistances; - UpdateFieldArray<int32, 7, 172, 180> BonusResistanceMods; - UpdateFieldArray<int32, 7, 172, 187> ManaCostModifier; + 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; 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; @@ -453,44 +456,46 @@ struct CTROptions : public IsUpdateFieldStructureTag bool operator!=(CTROptions const& right) const { return !(*this == right); } }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<188> +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<190> { UpdateField<bool, 0, 1> HasQuestSession; UpdateField<bool, 0, 2> HasLevelLink; DynamicUpdateField<UF::ChrCustomizationChoice, 0, 3> Customizations; DynamicUpdateField<UF::QuestLog, 0, 4> QuestSessionQuestLog; DynamicUpdateField<UF::ArenaCooldown, 0, 5> ArenaCooldowns; - UpdateField<ObjectGuid, 0, 6> DuelArbiter; - UpdateField<ObjectGuid, 0, 7> WowAccount; - UpdateField<ObjectGuid, 0, 8> LootTargetGUID; - UpdateField<uint32, 0, 9> PlayerFlags; - UpdateField<uint32, 0, 10> PlayerFlagsEx; - UpdateField<uint32, 0, 11> GuildRankID; - UpdateField<uint32, 0, 12> GuildDeleteDate; - UpdateField<int32, 0, 13> GuildLevel; - UpdateField<uint8, 0, 14> PartyType; - UpdateField<uint8, 0, 15> NativeSex; - UpdateField<uint8, 0, 16> Inebriation; - UpdateField<uint8, 0, 17> PvpTitle; - UpdateField<uint8, 0, 18> ArenaFaction; - UpdateField<uint32, 0, 19> DuelTeam; - UpdateField<int32, 0, 20> GuildTimeStamp; - UpdateField<int32, 0, 21> PlayerTitle; - UpdateField<int32, 0, 22> FakeInebriation; - UpdateField<uint32, 0, 23> VirtualPlayerRealm; - UpdateField<uint32, 0, 24> CurrentSpecID; - UpdateField<int32, 0, 25> TaxiMountAnimKitID; - UpdateField<uint8, 0, 26> CurrentBattlePetBreedQuality; - UpdateField<int32, 0, 27> HonorLevel; - UpdateField<int32, 0, 28> Field_B0; - UpdateField<int32, 0, 29> Field_B4; - UpdateField<UF::CTROptions, 0, 30> CtrOptions; - UpdateField<int32, 0, 31> CovenantID; - UpdateField<int32, 32, 33> SoulbindID; - UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 34> DungeonScore; - UpdateFieldArray<UF::QuestLog, 125, 35, 36> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 161, 162> VisibleItems; - UpdateFieldArray<float, 6, 181, 182> AvgItemLevel; + DynamicUpdateField<int32, 0, 6> VisualItemReplacements; + UpdateField<ObjectGuid, 0, 7> DuelArbiter; + UpdateField<ObjectGuid, 0, 8> WowAccount; + UpdateField<ObjectGuid, 0, 9> LootTargetGUID; + UpdateField<uint32, 0, 10> PlayerFlags; + UpdateField<uint32, 0, 11> PlayerFlagsEx; + UpdateField<uint32, 0, 12> GuildRankID; + UpdateField<uint32, 0, 13> GuildDeleteDate; + UpdateField<int32, 0, 14> GuildLevel; + UpdateField<uint8, 0, 15> PartyType; + UpdateField<uint8, 0, 16> NativeSex; + UpdateField<uint8, 0, 17> Inebriation; + UpdateField<uint8, 0, 18> PvpTitle; + UpdateField<uint8, 0, 19> ArenaFaction; + UpdateField<uint32, 0, 20> DuelTeam; + UpdateField<int32, 0, 21> GuildTimeStamp; + UpdateField<int32, 0, 22> PlayerTitle; + UpdateField<int32, 0, 23> FakeInebriation; + UpdateField<uint32, 0, 24> VirtualPlayerRealm; + UpdateField<uint32, 0, 25> CurrentSpecID; + UpdateField<int32, 0, 26> TaxiMountAnimKitID; + UpdateField<uint8, 0, 27> CurrentBattlePetBreedQuality; + UpdateField<int32, 0, 28> HonorLevel; + UpdateField<int64, 0, 29> LogoutTime; + UpdateField<int32, 0, 30> Field_B0; + UpdateField<int32, 0, 31> Field_B4; + UpdateField<UF::CTROptions, 32, 33> CtrOptions; + UpdateField<int32, 32, 34> CovenantID; + UpdateField<int32, 32, 35> SoulbindID; + UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 36> DungeonScore; + UpdateFieldArray<UF::QuestLog, 125, 37, 38> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 163, 164> VisibleItems; + UpdateFieldArray<float, 6, 183, 184> AvgItemLevel; 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; @@ -526,20 +531,26 @@ struct RestInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3> void ClearChangesMask(); }; -struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<13> +struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<19> { UpdateField<bool, 0, 1> Disqualified; - UpdateField<uint32, 0, 2> WeeklyPlayed; - UpdateField<uint32, 0, 3> WeeklyWon; - UpdateField<uint32, 0, 4> SeasonPlayed; - UpdateField<uint32, 0, 5> SeasonWon; - UpdateField<uint32, 0, 6> Rating; - UpdateField<uint32, 0, 7> WeeklyBestRating; - UpdateField<uint32, 0, 8> SeasonBestRating; - UpdateField<uint32, 0, 9> PvpTierID; - UpdateField<uint32, 0, 10> WeeklyBestWinPvpTierID; - UpdateField<uint32, 0, 11> Field_28; - UpdateField<uint32, 0, 12> Field_2C; + UpdateField<int8, 0, 2> Bracket; + UpdateField<int32, 0, 3> PvpRatingID; + UpdateField<uint32, 0, 4> WeeklyPlayed; + UpdateField<uint32, 0, 5> WeeklyWon; + UpdateField<uint32, 0, 6> SeasonPlayed; + UpdateField<uint32, 0, 7> SeasonWon; + UpdateField<uint32, 0, 8> Rating; + UpdateField<uint32, 0, 9> WeeklyBestRating; + UpdateField<uint32, 0, 10> SeasonBestRating; + UpdateField<uint32, 0, 11> PvpTierID; + UpdateField<uint32, 0, 12> WeeklyBestWinPvpTierID; + UpdateField<uint32, 0, 13> Field_28; + UpdateField<uint32, 0, 14> Field_2C; + UpdateField<uint32, 0, 15> WeeklyRoundsPlayed; + UpdateField<uint32, 0, 16> WeeklyRoundsWon; + UpdateField<uint32, 0, 17> SeasonRoundsPlayed; + UpdateField<uint32, 0, 18> SeasonRoundsWon; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -656,133 +667,220 @@ struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3 void ClearChangesMask(); }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1554> +struct TraitEntry : public IsUpdateFieldStructureTag +{ + int32 TraitNodeID; + int32 TraitNodeEntryID; + int32 Rank; + int32 GrantedRanks; + + 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==(TraitEntry const& right) const; + bool operator!=(TraitEntry const& right) const { return !(*this == right); } +}; + +struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<12> +{ + DynamicUpdateField<UF::TraitEntry, 0, 1> Entries; + UpdateField<int32, 0, 2> ID; + UpdateField<std::string, 0, 3> Name; + UpdateField<int32, 4, 5> Type; + UpdateField<int32, 4, 6> SkillLineID; + UpdateField<int32, 4, 7> ChrSpecializationID; + UpdateField<int32, 8, 9> CombatConfigFlags; + UpdateField<int32, 8, 10> LocalIdentifier; + UpdateField<int32, 8, 11> TraitSystemID; + + 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 CraftingOrderItem : public IsUpdateFieldStructureTag, public HasChangesMask<7> +{ + UpdateField<uint64, -1, 0> Field_0; + UpdateField<ObjectGuid, -1, 1> ItemGUID; + UpdateField<ObjectGuid, -1, 2> OwnerGUID; + UpdateField<int32, -1, 3> ItemID; + UpdateField<uint32, -1, 4> Quantity; + UpdateField<int32, -1, 5> ReagentQuality; + OptionalUpdateField<uint8, -1, 6> DataSlotIndex; + + 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<24> +{ + DynamicUpdateField<UF::CraftingOrderItem, 0, 1> Reagents; + UpdateField<int32, 0, 2> Field_0; + UpdateField<uint64, 0, 3> OrderID; + UpdateField<int32, 0, 4> SkillLineAbilityID; + UpdateField<uint8, 5, 6> OrderState; + UpdateField<uint8, 5, 7> OrderType; + UpdateField<uint8, 5, 8> MinQuality; + UpdateField<int64, 5, 9> ExpirationTime; + UpdateField<int64, 10, 11> ClaimEndTime; + UpdateField<int64, 10, 12> TipAmount; + UpdateField<int64, 10, 13> ConsortiumCut; + UpdateField<uint32, 10, 14> Flags; + UpdateField<ObjectGuid, 15, 16> CustomerGUID; + UpdateField<ObjectGuid, 15, 17> CustomerAccountGUID; + UpdateField<ObjectGuid, 15, 18> CrafterGUID; + UpdateField<ObjectGuid, 15, 19> PersonalCrafterGUID; + UpdateField<std::string, 20, 21> CustomerNotes; + OptionalUpdateField<UF::CraftingOrderItem, 20, 22> OutputItem; + OptionalUpdateField<WorldPackets::Item::ItemInstance, 20, 23> OutputItemData; + + 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 CraftingOrder : public IsUpdateFieldStructureTag, public HasChangesMask<4> +{ + DynamicUpdateField<WorldPackets::Item::ItemEnchantData, -1, 0> Enchantments; + DynamicUpdateField<WorldPackets::Item::ItemGemData, -1, 1> Gems; + UpdateField<UF::CraftingOrderData, -1, 2> Data; + OptionalUpdateField<WorldPackets::Item::ItemInstance, -1, 3> RecraftItemInfo; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1571> { 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, 27, 28> Research; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 30, 31> Research; DynamicUpdateField<uint64, 0, 5> KnownTitles; - DynamicUpdateField<uint16, 0, 6> ResearchSites; - DynamicUpdateField<uint32, 0, 7> ResearchSiteProgress; - DynamicUpdateField<int32, 0, 8> DailyQuestsCompleted; - DynamicUpdateField<int32, 0, 9> AvailableQuestLineXQuestIDs; - DynamicUpdateField<int32, 0, 10> Heirlooms; - DynamicUpdateField<uint32, 0, 11> HeirloomFlags; - DynamicUpdateField<int32, 0, 12> Toys; - DynamicUpdateField<uint32, 0, 13> ToyFlags; - DynamicUpdateField<uint32, 0, 14> Transmog; - DynamicUpdateField<int32, 0, 15> ConditionalTransmog; - DynamicUpdateField<int32, 0, 16> SelfResSpells; - DynamicUpdateField<uint32, 0, 17> RuneforgePowers; - DynamicUpdateField<uint32, 0, 18> TransmogIllusions; - DynamicUpdateField<UF::SpellPctModByLabel, 0, 20> SpellPctModByLabel; - DynamicUpdateField<UF::SpellFlatModByLabel, 0, 21> SpellFlatModByLabel; - DynamicUpdateField<UF::MawPower, 0, 22> MawPowers; - DynamicUpdateField<UF::MultiFloorExplore, 0, 23> MultiFloorExploration; - DynamicUpdateField<UF::RecipeProgressionInfo, 0, 24> RecipeProgression; - DynamicUpdateField<UF::ReplayedQuest, 0, 25> ReplayedQuests; - DynamicUpdateField<int32, 0, 26> DisabledSpells; - DynamicUpdateField<UF::CharacterRestriction, 0, 19> CharacterRestrictions; - UpdateField<ObjectGuid, 0, 29> FarsightObject; - UpdateField<ObjectGuid, 0, 30> SummonedBattlePetGUID; - UpdateField<uint64, 0, 31> Coinage; - UpdateField<int32, 0, 32> XP; - UpdateField<int32, 0, 33> NextLevelXP; - UpdateField<int32, 34, 35> TrialXP; - UpdateField<UF::SkillInfo, 34, 36> Skill; - UpdateField<int32, 34, 37> CharacterPoints; - UpdateField<int32, 34, 38> MaxTalentTiers; - UpdateField<uint32, 34, 39> TrackCreatureMask; - UpdateField<float, 34, 40> MainhandExpertise; - UpdateField<float, 34, 41> OffhandExpertise; - UpdateField<float, 34, 42> RangedExpertise; - UpdateField<float, 34, 43> CombatRatingExpertise; - UpdateField<float, 34, 44> BlockPercentage; - UpdateField<float, 34, 45> DodgePercentage; - UpdateField<float, 34, 46> DodgePercentageFromAttribute; - UpdateField<float, 34, 47> ParryPercentage; - UpdateField<float, 34, 48> ParryPercentageFromAttribute; - UpdateField<float, 34, 49> CritPercentage; - UpdateField<float, 34, 50> RangedCritPercentage; - UpdateField<float, 34, 51> OffhandCritPercentage; - UpdateField<float, 34, 52> SpellCritPercentage; - UpdateField<int32, 34, 53> ShieldBlock; - UpdateField<float, 34, 54> ShieldBlockCritPercentage; - UpdateField<float, 34, 55> Mastery; - UpdateField<float, 34, 56> Speed; - UpdateField<float, 34, 57> Avoidance; - UpdateField<float, 34, 58> Sturdiness; - UpdateField<int32, 34, 59> Versatility; - UpdateField<float, 34, 60> VersatilityBonus; - UpdateField<float, 34, 61> PvpPowerDamage; - UpdateField<float, 34, 62> PvpPowerHealing; - UpdateField<int32, 34, 63> ModHealingDonePos; - UpdateField<float, 34, 64> ModHealingPercent; - UpdateField<float, 34, 65> ModPeriodicHealingDonePercent; - UpdateField<float, 66, 67> ModSpellPowerPercent; - UpdateField<float, 66, 68> ModResiliencePercent; - UpdateField<float, 66, 69> OverrideSpellPowerByAPPercent; - UpdateField<float, 66, 70> OverrideAPBySpellPowerPercent; - UpdateField<int32, 66, 71> ModTargetResistance; - UpdateField<int32, 66, 72> ModTargetPhysicalResistance; - UpdateField<uint32, 66, 73> LocalFlags; - UpdateField<uint8, 66, 74> GrantableLevels; - UpdateField<uint8, 66, 75> MultiActionBars; - UpdateField<uint8, 66, 76> LifetimeMaxRank; - UpdateField<uint8, 66, 77> NumRespecs; - UpdateField<uint32, 66, 78> PvpMedals; - UpdateField<uint16, 66, 79> TodayHonorableKills; - UpdateField<uint16, 66, 80> YesterdayHonorableKills; - UpdateField<uint32, 66, 81> LifetimeHonorableKills; - UpdateField<int32, 66, 82> WatchedFactionIndex; - UpdateField<int32, 66, 83> MaxLevel; - UpdateField<int32, 66, 84> ScalingPlayerLevelDelta; - UpdateField<int32, 66, 85> MaxCreatureScalingLevel; - UpdateField<int32, 66, 86> PetSpellPower; - UpdateField<float, 66, 87> UiHitModifier; - UpdateField<float, 66, 88> UiSpellHitModifier; - UpdateField<int32, 66, 89> HomeRealmTimeOffset; - UpdateField<float, 66, 90> ModPetHaste; - UpdateField<int8, 66, 91> JailersTowerLevelMax; - UpdateField<int8, 66, 92> JailersTowerLevel; - UpdateField<uint8, 66, 93> LocalRegenFlags; - UpdateField<uint8, 66, 94> AuraVision; - UpdateField<uint8, 66, 95> NumBackpackSlots; - UpdateField<int32, 66, 96> OverrideSpellsID; - UpdateField<uint16, 66, 97> LootSpecID; - UpdateField<uint32, 98, 99> OverrideZonePVPType; - UpdateField<ObjectGuid, 98, 100> BnetAccount; - UpdateField<uint64, 98, 101> GuildClubMemberID; - UpdateField<int32, 98, 102> Honor; - UpdateField<int32, 98, 103> HonorNextLevel; - UpdateField<uint8, 98, 104> NumBankSlots; - UpdateField<UF::ActivePlayerUnk901, 98, 106> Field_1410; - OptionalUpdateField<UF::QuestSession, 98, 105> QuestSession; - UpdateField<int32, 98, 107> UiChromieTimeExpansionID; - UpdateField<int32, 98, 108> TransportServerTime; - UpdateField<uint32, 98, 109> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField<int16, 98, 110> DEBUGSoulbindConduitRank; - UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 111> DungeonScore; - UpdateFieldArray<ObjectGuid, 199, 112, 113> InvSlots; - UpdateFieldArray<uint64, 240, 312, 313> ExploredZones; - UpdateFieldArray<UF::RestInfo, 2, 553, 554> RestInfo; - UpdateFieldArray<int32, 7, 556, 557> ModDamageDonePos; - UpdateFieldArray<int32, 7, 556, 564> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 556, 571> ModDamageDonePercent; - UpdateFieldArray<float, 7, 556, 578> ModHealingDonePercent; - UpdateFieldArray<float, 3, 585, 586> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 585, 589> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 592, 593> BuybackPrice; - UpdateFieldArray<int64, 12, 592, 605> BuybackTimestamp; - UpdateFieldArray<int32, 32, 617, 618> CombatRatings; - UpdateFieldArray<UF::PVPInfo, 6, 650, 651> PvpInfo; - UpdateFieldArray<uint32, 4, 657, 658> NoReagentCostMask; - UpdateFieldArray<int32, 2, 662, 663> ProfessionSkillLine; - UpdateFieldArray<uint32, 4, 665, 666> BagSlotFlags; - UpdateFieldArray<uint32, 7, 670, 671> BankBagSlotFlags; - UpdateFieldArray<uint64, 875, 678, 679> QuestCompleted; + 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; 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; @@ -790,30 +888,34 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<21> +struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<25> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<int32, 0, 2> EnableDoodadSets; - UpdateField<int32, 0, 3> DisplayID; - UpdateField<uint32, 0, 4> SpellVisualID; - UpdateField<uint32, 0, 5> StateSpellVisualID; - UpdateField<uint32, 0, 6> SpawnTrackingStateAnimID; - UpdateField<uint32, 0, 7> SpawnTrackingStateAnimKitID; - UpdateField<uint32, 0, 8> StateWorldEffectsQuestObjectiveID; - UpdateField<ObjectGuid, 0, 9> CreatedBy; - UpdateField<ObjectGuid, 0, 10> GuildGUID; - UpdateField<uint32, 0, 11> Flags; + DynamicUpdateField<int32, 0, 3> WorldEffects; + UpdateField<int32, 0, 4> DisplayID; + UpdateField<uint32, 0, 5> SpellVisualID; + UpdateField<uint32, 0, 6> StateSpellVisualID; + UpdateField<uint32, 0, 7> SpawnTrackingStateAnimID; + UpdateField<uint32, 0, 8> SpawnTrackingStateAnimKitID; + UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID; + UpdateField<ObjectGuid, 0, 10> CreatedBy; + UpdateField<ObjectGuid, 0, 11> GuildGUID; + UpdateField<uint32, 0, 12> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateField<QuaternionData, 0, 12> ParentRotation; - UpdateField<int32, 0, 13> FactionTemplate; - UpdateField<int8, 0, 14> State; + UpdateField<QuaternionData, 0, 13> ParentRotation; + UpdateField<int32, 0, 14> FactionTemplate; + UpdateField<int8, 0, 15> State; struct StateTag : ViewerDependentValueTag<int8> {}; - UpdateField<int8, 0, 15> TypeID; - UpdateField<uint8, 0, 16> PercentHealth; - UpdateField<uint32, 0, 17> ArtKit; - UpdateField<uint32, 0, 18> CustomParam; - UpdateField<int32, 0, 19> Level; - UpdateField<uint32, 0, 20> AnimGroupInstance; + UpdateField<int8, 0, 16> TypeID; + UpdateField<uint8, 0, 17> PercentHealth; + UpdateField<uint32, 0, 18> ArtKit; + UpdateField<uint32, 0, 19> CustomParam; + UpdateField<int32, 0, 20> Level; + UpdateField<uint32, 0, 21> AnimGroupInstance; + UpdateField<uint32, 0, 22> UiWidgetItemID; + UpdateField<uint32, 0, 23> UiWidgetItemQuality; + UpdateField<uint32, 0, 24> UiWidgetItemUnknown1000; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; @@ -882,25 +984,30 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5> void ClearChangesMask(); }; -struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<18> +struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<23> { UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve; UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve; - UpdateField<ObjectGuid, 0, 3> Caster; - UpdateField<uint32, 0, 4> Duration; - UpdateField<uint32, 0, 5> TimeToTarget; - UpdateField<uint32, 0, 6> TimeToTargetScale; - UpdateField<uint32, 0, 7> TimeToTargetExtraScale; - UpdateField<int32, 0, 8> SpellID; - UpdateField<int32, 0, 9> SpellForVisuals; - UpdateField<UF::SpellCastVisual, 0, 10> SpellVisual; - UpdateField<float, 0, 11> BoundsRadius2D; - UpdateField<uint32, 0, 12> DecalPropertiesID; - UpdateField<ObjectGuid, 0, 13> CreatingEffectGUID; - UpdateField<uint32, 0, 14> Field_80; - UpdateField<uint32, 0, 15> Field_84; - UpdateField<ObjectGuid, 0, 16> Field_88; - UpdateField<UF::VisualAnim, 0, 17> VisualAnim; + UpdateField<UF::ScaleCurve, 0, 3> Field_C38; + UpdateField<UF::ScaleCurve, 0, 4> Field_C54; + UpdateField<UF::ScaleCurve, 0, 5> Field_C70; + UpdateField<ObjectGuid, 0, 6> Caster; + UpdateField<uint32, 0, 7> Duration; + UpdateField<uint32, 0, 8> TimeToTarget; + UpdateField<uint32, 0, 9> TimeToTargetScale; + UpdateField<uint32, 0, 10> TimeToTargetExtraScale; + UpdateField<uint32, 0, 11> Field_B0; + UpdateField<int32, 0, 12> SpellID; + UpdateField<int32, 0, 13> SpellForVisuals; + UpdateField<UF::SpellCastVisual, 0, 14> SpellVisual; + UpdateField<float, 0, 15> BoundsRadius2D; + UpdateField<uint32, 0, 16> DecalPropertiesID; + UpdateField<ObjectGuid, 0, 17> CreatingEffectGUID; + UpdateField<uint32, 0, 18> Field_80; + UpdateField<uint32, 0, 19> Field_84; + UpdateField<ObjectGuid, 0, 20> Field_88; + UpdateField<TaggedPosition<Position::XYZ>, 0, 21> Field_F8; + UpdateField<UF::VisualAnim, 0, 22> VisualAnim; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; |
