Core/PacketIO: Updated SMSG_UPDATE_OBJECT for 11.0.5

Port From (https://github.com/TrinityCore/TrinityCore/commit/68db469ee1f992bcdc81de64d6af1007d303be05)
This commit is contained in:
Hondacrx
2024-11-11 21:11:21 -05:00
parent 5909e7ba98
commit 7d351406f5
23 changed files with 678 additions and 208 deletions
@@ -82,6 +82,7 @@ namespace Game.Entities
uint m_boundaryCheckTime; // (msecs) remaining time for next evade boundary check
// vendor items
VendorData m_vendorData;
List<VendorItemCount> m_vendorItemCounts = new();
internal Dictionary<ObjectGuid, Loot> m_personalLoot = new();
+87 -5
View File
@@ -316,9 +316,17 @@ namespace Game.Entities
if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent))
npcFlags |= Global.GameEventMgr.GetNPCFlag(this);
if (IsVendor() && !npcFlags.HasAnyFlag((ulong)NPCFlags.VendorMask))
SetVendor(NPCFlags.VendorMask, false);
ReplaceAllNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF));
ReplaceAllNpcFlags2((NPCFlags2)(npcFlags >> 32));
if (npcFlags.HasAnyFlag((ulong)NPCFlags.VendorMask))
SetVendor((NPCFlags)npcFlags & NPCFlags.VendorMask, true);
SetPetitioner(npcFlags.HasAnyFlag((ulong)NPCFlags.Petitioner));
// if unit is in combat, keep this flag
unitFlags &= ~(uint)UnitFlags.InCombat;
if (IsInCombat())
@@ -3081,6 +3089,62 @@ namespace Game.Entities
return vCount.count;
}
public void SetVendor(NPCFlags flags, bool apply)
{
flags &= NPCFlags.VendorMask;
VendorDataTypeFlags vendorFlags = (VendorDataTypeFlags)((uint)flags >> 7);
if (apply)
{
if (m_vendorData == null)
{
m_entityFragments.Add(EntityFragment.FVendor_C, IsInWorld);
m_vendorData = new();
}
SetNpcFlag(flags);
SetUpdateFieldFlagValue(m_values.ModifyValue(m_vendorData).ModifyValue(m_vendorData.Flags), (int)vendorFlags);
}
else if (m_vendorData != null)
{
RemoveNpcFlag(flags);
RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_vendorData).ModifyValue(m_vendorData.Flags), (int)vendorFlags);
if (m_vendorData.Flags == 0)
{
m_values.ModifyValue(m_vendorData);
AddToObjectUpdateIfNeeded();
m_vendorData = null;
m_entityFragments.Remove(EntityFragment.FVendor_C);
}
}
}
void SetPetitioner(bool apply)
{
if (apply)
{
if (m_vendorData == null)
{
m_entityFragments.Add(EntityFragment.FVendor_C, IsInWorld);
m_vendorData = new();
}
SetNpcFlag(NPCFlags.Petitioner);
SetUpdateFieldFlagValue(m_values.ModifyValue(m_vendorData).ModifyValue(m_vendorData.Flags), (int)VendorDataTypeFlags.Petition);
}
else if (m_vendorData != null)
{
RemoveNpcFlag(NPCFlags.Petitioner);
RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_vendorData).ModifyValue(m_vendorData.Flags), (int)VendorDataTypeFlags.Petition);
if (m_vendorData.Flags == 0)
{
m_values.ModifyValue(m_vendorData);
AddToObjectUpdateIfNeeded();
m_vendorData = null;
m_entityFragments.Remove(EntityFragment.FVendor_C);
}
}
}
public override string GetName(Locale locale = Locale.enUS)
{
if (locale != Locale.enUS)
@@ -3695,17 +3759,26 @@ namespace Game.Entities
{
m_objectData.WriteCreate(data, flags, this, target);
m_unitData.WriteCreate(data, flags, this, target);
if (m_vendorData != null)
m_vendorData.WriteCreate(data, flags, this, target);
}
public override void BuildValuesUpdate(WorldPacket data, UpdateFieldFlag flags, Player target)
{
data.WriteUInt32(m_values.GetChangedObjectTypeMask());
if ((m_entityFragments.ContentsChangedMask & m_entityFragments.GetUpdateMaskFor(EntityFragment.CGObject)) != 0)
{
data.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(data, flags, this, target);
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(data, flags, this, target);
if (m_values.HasChanged(TypeId.Unit))
m_unitData.WriteUpdate(data, flags, this, target);
if (m_values.HasChanged(TypeId.Unit))
m_unitData.WriteUpdate(data, flags, this, target);
}
if (m_vendorData != null && (m_entityFragments.ContentsChangedMask & m_entityFragments.GetUpdateMaskFor(EntityFragment.FVendor_C)) != 0)
m_vendorData.WriteUpdate(data, flags, this, target);
}
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
@@ -3733,6 +3806,7 @@ namespace Game.Entities
valuesMask.Set((int)TypeId.Unit);
WorldPacket buffer = new();
BuildEntityFragmentsForValuesUpdateForPlayerWithMask(buffer, flags);
buffer.WriteUInt32(valuesMask.GetBlock(0));
if (valuesMask[(int)TypeId.Object])
@@ -3750,6 +3824,14 @@ namespace Game.Entities
data.AddUpdateBlock(buffer1);
}
public override void ClearUpdateMask(bool remove)
{
if (m_vendorData != null)
m_values.ClearChangesMask(m_vendorData);
base.ClearUpdateMask(remove);
}
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
{
Creature Owner;