From af8fe06edf46f4d9404de137fae7e71258829508 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 6 Jul 2017 13:44:24 -0400 Subject: [PATCH] Fixed disconnect when clearing dynamic fields --- Game/Entities/Item/Item.cs | 6 +++--- Game/Entities/Object/Update/UpdateMask.cs | 16 ++++++++++++---- Game/Entities/Object/WorldObject.cs | 3 +-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Game/Entities/Item/Item.cs b/Game/Entities/Item/Item.cs index c04e598d1..e116151fa 100644 --- a/Game/Entities/Item/Item.cs +++ b/Game/Entities/Item/Item.cs @@ -1237,7 +1237,7 @@ namespace Game.Entities arrayValuesMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType); if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged) - arrayValuesMask.ValueCount = values.Length; + arrayValuesMask.SetCount(values.Length); if (index != (int)ItemDynamicFields.Modifiers) { @@ -1257,7 +1257,7 @@ namespace Game.Entities if (updateType == UpdateType.Values && _dynamicChangesMask[index] != DynamicFieldChangeType.ValueAndSizeChanged && _changesMask.Get((int)ItemFields.ModifiersMask)) { arrayValuesMask.DynamicFieldChangeType |= (int)DynamicFieldChangeType.ValueAndSizeChanged; - arrayValuesMask.ValueCount = m; + arrayValuesMask.SetCount(m); } // in case of ITEM_DYNAMIC_FIELD_MODIFIERS it is ITEM_FIELD_MODIFIERS_MASK that controls index of each value, not updatemask @@ -1272,7 +1272,7 @@ namespace Game.Entities } if (updateType == UpdateType.Values && _changesMask.Get((int)ItemFields.ModifiersMask)) - arrayValuesMask.ValueCount = m; + arrayValuesMask.SetCount(m); } arrayValuesMask.AppendToPacket(fieldBuffer); diff --git a/Game/Entities/Object/Update/UpdateMask.cs b/Game/Entities/Object/Update/UpdateMask.cs index bd87da645..933208285 100644 --- a/Game/Entities/Object/Update/UpdateMask.cs +++ b/Game/Entities/Object/Update/UpdateMask.cs @@ -18,6 +18,7 @@ using Framework.Constants; using Framework.IO; using System.Collections; +using System; namespace Game.Entities { @@ -31,6 +32,14 @@ namespace Game.Entities _mask = new BitArray((int)valuesCount, false); } + public void SetCount(int valuesCount) + { + _fieldCount = (uint)valuesCount; + _blockCount = (uint)(valuesCount + 32 - 1) / 32; + + _mask = new BitArray((int)valuesCount, false); + } + public uint GetCount() { return _fieldCount; } public virtual void AppendToPacket(ByteBuffer data) @@ -62,7 +71,7 @@ namespace Game.Entities _mask.SetAll(false); } - uint _fieldCount; + protected uint _fieldCount; protected uint _blockCount; protected BitArray _mask; } @@ -79,8 +88,8 @@ namespace Game.Entities public override void AppendToPacket(ByteBuffer data) { data.WriteUInt16(DynamicFieldChangeType); - if (ValueCount != 0) - data.WriteUInt32(ValueCount); + if (DynamicFieldChangeType.HasAnyFlag((uint)Entities.DynamicFieldChangeType.ValueAndSizeChanged)) + data.WriteUInt32(_fieldCount); var maskArray = new byte[_blockCount << 2]; @@ -89,7 +98,6 @@ namespace Game.Entities } public uint DynamicFieldChangeType; - public int ValueCount; } public enum DynamicFieldChangeType diff --git a/Game/Entities/Object/WorldObject.cs b/Game/Entities/Object/WorldObject.cs index 99d25bff2..5439a8f27 100644 --- a/Game/Entities/Object/WorldObject.cs +++ b/Game/Entities/Object/WorldObject.cs @@ -848,10 +848,9 @@ namespace Game.Entities fieldMask.SetBit(index); DynamicUpdateMask arrayMask = new DynamicUpdateMask((uint)values.Length); - arrayMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType); if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged) - arrayMask.ValueCount = values.Length; + arrayMask.SetCount(values.Length); for (var v = 0; v < values.Length; ++v) {