From afe054f3e920873ea5fcd415fdddf957da34c24c Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Sun, 17 Nov 2024 22:12:44 -0500 Subject: [PATCH] Fixes UpdateObject packets --- Source/Game/AI/SmartScripts/SmartScript.cs | 2 +- Source/Game/Entities/Creature/CreatureData.cs | 4 +- Source/Game/Entities/Object/WorldObject.cs | 93 ++++--------------- Source/Game/Globals/ObjectManager.cs | 2 +- 4 files changed, 24 insertions(+), 77 deletions(-) diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 9b6551109..1ec506462 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -4272,7 +4272,7 @@ namespace Game.AI return false; bool smart = true; - if (creature.GetAI() == null) + if (creature.GetAI() is not SmartAI || creature.GetAI() == null) smart = false; if (!smart && !silent) diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index 97f72b07b..a53111bea 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -23,7 +23,7 @@ namespace Game.Entities public string IconName; public List GossipMenuIds = new(); public Dictionary difficultyStorage = new(); - public uint RequiredExpansion; + public int RequiredExpansion; public uint VignetteID; public uint Faction; public ulong Npcflag; @@ -184,7 +184,7 @@ namespace Game.Entities stats.EnergyMulti = creatureDifficulty.ManaModifier; stats.CreatureMovementInfoID = MovementId; - stats.RequiredExpansion = RequiredExpansion; + stats.RequiredExpansion = (uint)RequiredExpansion; stats.HealthScalingExpansion = creatureDifficulty.HealthScalingExpansion; stats.VignetteID = VignetteID; stats.Class = (int)UnitClass; diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 053948119..1d05b5f38 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -208,16 +208,17 @@ namespace Game.Entities UpdateFieldFlag fieldFlags = GetUpdateFieldFlagsFor(target); WorldPacket tempBuffer = new(); - BuildValuesUpdate(tempBuffer, fieldFlags, target); - buffer.WriteUInt32(tempBuffer.GetSize()); - buffer.WriteUInt8((byte)(fieldFlags.HasFlag(UpdateFieldFlag.Owner) ? 1 : 0)); - buffer.WriteUInt8((byte)(m_entityFragments.IdsChanged ? 1 : 0)); + tempBuffer.WriteUInt8((byte)(fieldFlags.HasFlag(UpdateFieldFlag.Owner) ? 1 : 0)); + tempBuffer.WriteUInt8((byte)(m_entityFragments.IdsChanged ? 1 : 0)); if (m_entityFragments.IdsChanged) { - buffer.WriteUInt8((byte)EntityFragmentSerializationType.Full); - BuildEntityFragments(buffer, m_entityFragments.GetIds()); + tempBuffer.WriteUInt8((byte)EntityFragmentSerializationType.Full); + BuildEntityFragments(tempBuffer, m_entityFragments.GetIds()); } - buffer.WriteUInt8(m_entityFragments.ContentsChangedMask); + tempBuffer.WriteUInt8(m_entityFragments.ContentsChangedMask); + + BuildValuesUpdate(tempBuffer, fieldFlags, target); + buffer.WriteUInt32(tempBuffer.GetSize()); buffer.WriteBytes(tempBuffer); data.AddUpdateBlock(buffer); @@ -4243,23 +4244,29 @@ namespace Game.Entities public HasChangesMask ModifyValue(HasChangesMask updateData) { - _changesMask.Set(updateData.Bit); + _owner.m_entityFragments.ContentsChangedMask |= _owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit); + if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject) + _changesMask.Set(updateData.Bit); return updateData; } public void ClearChangesMask(HasChangesMask updateData) { - _changesMask.Reset(updateData.Bit); + _owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit); + if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject) + _changesMask.Reset(updateData.Bit); + updateData.ClearChangesMask(); } public void ClearChangesMask(HasChangesMask updateData, ref UpdateField updateField) where U : new() { - _changesMask.Reset(updateData.Bit); + _owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit); + if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject) + _changesMask.Reset(updateData.Bit); - IHasChangesMask hasChangesMask = (IHasChangesMask)updateField._value; - if (hasChangesMask != null) - hasChangesMask.ClearChangesMask(); + if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) + ((IHasChangesMask)updateField._value).ClearChangesMask(); } public uint GetChangedObjectTypeMask() @@ -4271,65 +4278,5 @@ namespace Game.Entities { return _changesMask[(int)index]; } - - //New shit - /*HasChangesMask ModifyValue(HasChangesMask updateData) - { - _owner.m_entityFragments.ContentsChangedMask |= _owner.m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); - if constexpr(WowCS::EntityFragment(BlockBit) == WowCS::EntityFragment::CGObject) - _changesMask |= UpdateMaskHelpers::GetBlockFlag(Bit); - - return { (static_cast(owner)->* field)._value }; - }*/ - - public UpdateField ModifyValue(UpdateField updateField) where U : new() - { - _owner.m_entityFragments.ContentsChangedMask |= _owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateField.BlockBit); - if ((EntityFragment)updateField.BlockBit == EntityFragment.CGObject) - _changesMask.Set(updateField.Bit); - - return updateField; - } - - public OptionalUpdateField ModifyValue(OptionalUpdateField updateField) where U : new() - { - _owner.m_entityFragments.ContentsChangedMask |= _owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateField.BlockBit); - if ((EntityFragment)updateField.BlockBit == EntityFragment.CGObject) - _changesMask.Set(updateField.Bit); - - return updateField; - } - - public OptionalUpdateField ModifyValue(OptionalUpdateField updateField, uint dummy) where U : new() - { - _owner.m_entityFragments.ContentsChangedMask |= _owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateField.BlockBit); - if ((EntityFragment)updateField.BlockBit == EntityFragment.CGObject) - _changesMask.Set(updateField.Bit); - - if (!updateField.HasValue()) - updateField.SetValue(new U()); - - return updateField; - } - - void ClearChangesMask(UpdateField updateField) where U : new() - { - _owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateField.BlockBit); - if ((EntityFragment)updateField.BlockBit == EntityFragment.CGObject) - _changesMask.Reset(updateField.Bit); - - if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) - ((IHasChangesMask)updateField._value).ClearChangesMask(); - } - - void ClearChangesMask(OptionalUpdateField updateField) where U : new() - { - _owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateField.BlockBit); - if ((EntityFragment)updateField.BlockBit == EntityFragment.CGObject) - _changesMask.Reset(updateField.Bit); - - if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) - ((IHasChangesMask)updateField._value).ClearChangesMask(); - } } } \ No newline at end of file diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 8f5e9aadb..a1417c978 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -1826,7 +1826,7 @@ namespace Game creature.SubName = fields.Read(5); creature.TitleAlt = fields.Read(6); creature.IconName = fields.Read(7); - creature.RequiredExpansion = fields.Read(8); + creature.RequiredExpansion = fields.Read(8); creature.VignetteID = fields.Read(9); creature.Faction = fields.Read(10); creature.Npcflag = fields.Read(11);