Fixed server sending dynamic values of 0.

This commit is contained in:
hondacrx
2017-07-06 11:02:52 -04:00
parent 210a2958ff
commit 1b47104167
6 changed files with 40 additions and 54 deletions
+9 -9
View File
@@ -1233,20 +1233,20 @@ namespace Game.Entities
ByteBuffer arrayValuesBuffer = new ByteBuffer(); ByteBuffer arrayValuesBuffer = new ByteBuffer();
fieldMask.SetBit(index); fieldMask.SetBit(index);
DynamicUpdateMask arrayValuesMask = new DynamicUpdateMask((uint)values.Count); DynamicUpdateMask arrayValuesMask = new DynamicUpdateMask((uint)values.Length);
arrayValuesMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType); arrayValuesMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType);
if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged) if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged)
arrayValuesMask.ValueCount = values.Count; arrayValuesMask.ValueCount = values.Length;
if (index != (int)ItemDynamicFields.Modifiers) if (index != (int)ItemDynamicFields.Modifiers)
{ {
foreach (var pair in values) for (var v = 0; v < values.Length; ++v)
{ {
if (updateType != UpdateType.Values || _dynamicChangesArrayMask[index].Get(pair.Key)) if (updateType != UpdateType.Values || _dynamicChangesArrayMask[index].Get(v))
{ {
arrayValuesMask.SetBit(pair.Key); arrayValuesMask.SetBit(v);
arrayValuesBuffer.WriteUInt32(pair.Value); arrayValuesBuffer.WriteUInt32(values[v]);
} }
} }
} }
@@ -1262,12 +1262,12 @@ namespace Game.Entities
// in case of ITEM_DYNAMIC_FIELD_MODIFIERS it is ITEM_FIELD_MODIFIERS_MASK that controls index of each value, not updatemask // in case of ITEM_DYNAMIC_FIELD_MODIFIERS it is ITEM_FIELD_MODIFIERS_MASK that controls index of each value, not updatemask
// so we just have to write this starting from 0 index // so we just have to write this starting from 0 index
foreach (var pair in values) for (var v = 0; v < values.Length; ++v)
{ {
if (pair.Value != 0) if (values[v] != 0)
{ {
arrayValuesMask.SetBit(m++); arrayValuesMask.SetBit(m++);
arrayValuesBuffer.WriteUInt32(pair.Value); arrayValuesBuffer.WriteUInt32(values[v]);
} }
} }
+23 -37
View File
@@ -96,12 +96,12 @@ namespace Game.Entities
if (_dynamicValuesCount != 0) if (_dynamicValuesCount != 0)
{ {
_dynamicValues = new Dictionary<int, uint>[_dynamicValuesCount]; _dynamicValues = new uint[_dynamicValuesCount][];
_dynamicChangesArrayMask = new BitArray[_dynamicValuesCount]; _dynamicChangesArrayMask = new BitArray[_dynamicValuesCount];
for (var i = 0; i < _dynamicValuesCount; ++i) for (var i = 0; i < _dynamicValuesCount; ++i)
{ {
_dynamicValues[i] = new Dictionary<int, uint>(); _dynamicValues[i] = new uint[0];
_dynamicChangesArrayMask[i] = new BitArray(0); _dynamicChangesArrayMask[i] = new BitArray(0);
_dynamicChangesMask[i] = DynamicFieldChangeType.Unchanged; _dynamicChangesMask[i] = DynamicFieldChangeType.Unchanged;
} }
@@ -214,11 +214,6 @@ namespace Game.Entities
if (unit.GetVictim()) if (unit.GetVictim())
flags |= UpdateFlag.HasTarget; flags |= UpdateFlag.HasTarget;
if (target.m_clientGUIDs.Contains(GetGUID()))
{
}
WorldPacket buffer = new WorldPacket(); WorldPacket buffer = new WorldPacket();
buffer.WriteUInt8(updateType); buffer.WriteUInt8(updateType);
buffer.WritePackedGuid(GetGUID()); buffer.WritePackedGuid(GetGUID());
@@ -852,18 +847,18 @@ namespace Game.Entities
{ {
fieldMask.SetBit(index); fieldMask.SetBit(index);
DynamicUpdateMask arrayMask = new DynamicUpdateMask((uint)(values.Empty() ? 0 : values.Keys.Max() + 1)); DynamicUpdateMask arrayMask = new DynamicUpdateMask((uint)values.Length);
arrayMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType); arrayMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType);
if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged) if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged)
arrayMask.ValueCount = values.Empty() ? 0 : values.Keys.Max() + 1; arrayMask.ValueCount = values.Length;
foreach (var pair in values) for (var v = 0; v < values.Length; ++v)
{ {
if (updateType != UpdateType.Values || _dynamicChangesArrayMask[index].Get(pair.Key)) if (updateType != UpdateType.Values || _dynamicChangesArrayMask[index].Get(v))
{ {
arrayMask.SetBit(pair.Key); arrayMask.SetBit(v);
valueBuffer.WriteUInt32(pair.Value); valueBuffer.WriteUInt32(values[v]);
} }
} }
@@ -1422,22 +1417,16 @@ namespace Game.Entities
RemoveFlag64(index, flag); RemoveFlag64(index, flag);
} }
public Dictionary<int, uint> GetDynamicKeyAndValues(object index) public uint[] GetDynamicValues(object index)
{ {
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
return _dynamicValues[(int)index]; return _dynamicValues[(int)index];
} }
public ICollection<uint> GetDynamicValues(object index)
{
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
return _dynamicValues[(int)index].Values;
}
public uint GetDynamicValue(object index, ushort offset) public uint GetDynamicValue(object index, ushort offset)
{ {
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
if (!_dynamicValues[(int)index].ContainsKey(offset)) if (offset >= _dynamicValues[(int)index].Length)
return 0; return 0;
return _dynamicValues[(int)index][offset]; return _dynamicValues[(int)index][offset];
@@ -1447,7 +1436,7 @@ namespace Game.Entities
{ {
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true)); Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true));
SetDynamicValue(index, (byte)_dynamicValues[(int)index].Count, value); SetDynamicValue(index, (byte)_dynamicValues[(int)index].Length, value);
} }
public void RemoveDynamicValue(object index, uint value) public void RemoveDynamicValue(object index, uint value)
@@ -1455,14 +1444,13 @@ namespace Game.Entities
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
// TODO: Research if this is blizzlike to just set value to 0 // TODO: Research if this is blizzlike to just set value to 0
var values = _dynamicValues[(int)index]; for (var i = 0; i < _dynamicValues[(int)index].Length; ++i)
foreach (var pair in values.ToList())
{ {
if (pair.Value == value) if (_dynamicValues[(int)index][i] == value)
{ {
values[pair.Key] = 0; _dynamicValues[(int)index][i] = 0;
_dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueChanged; _dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueChanged;
_dynamicChangesArrayMask[(int)index].Set(pair.Key, true); _dynamicChangesArrayMask[(int)index].Set(i, true);
AddToObjectUpdateIfNeeded(); AddToObjectUpdateIfNeeded();
} }
@@ -1475,7 +1463,7 @@ namespace Game.Entities
if (!_dynamicValues[(int)index].Empty()) if (!_dynamicValues[(int)index].Empty())
{ {
_dynamicValues[(int)index].Clear(); _dynamicValues[(int)index] = new uint[0];
_dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueAndSizeChanged; _dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueAndSizeChanged;
_dynamicChangesArrayMask[(int)index].SetAll(false); _dynamicChangesArrayMask[(int)index].SetAll(false);
@@ -1488,19 +1476,18 @@ namespace Game.Entities
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true)); Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true));
DynamicFieldChangeType changeType = DynamicFieldChangeType.ValueChanged; DynamicFieldChangeType changeType = DynamicFieldChangeType.ValueChanged;
var values = _dynamicValues[(int)index]; if (_dynamicValues[(int)index].Length <= offset)
if (!values.ContainsKey(offset))
{ {
values.Add(offset, 0u); Array.Resize(ref _dynamicValues[(int)index], offset + 1);
changeType = DynamicFieldChangeType.ValueAndSizeChanged; changeType = DynamicFieldChangeType.ValueAndSizeChanged;
} }
if (_dynamicChangesArrayMask[(int)index].Count <= offset) if (_dynamicChangesArrayMask[(int)index].Count <= offset)
_dynamicChangesArrayMask[(int)index].Length = offset + 1; _dynamicChangesArrayMask[(int)index].Length = offset + 1;
if (values[offset] != value || changeType == DynamicFieldChangeType.ValueAndSizeChanged) if (_dynamicValues[(int)index][offset] != value || changeType == DynamicFieldChangeType.ValueAndSizeChanged)
{ {
values[offset] = value; _dynamicValues[(int)index][offset] = value;
_dynamicChangesMask[(int)index] = changeType; _dynamicChangesMask[(int)index] = changeType;
_dynamicChangesArrayMask[(int)index].Set(offset, true); _dynamicChangesArrayMask[(int)index].Set(offset, true);
@@ -1510,7 +1497,7 @@ namespace Game.Entities
public List<T> GetDynamicStructuredValues<T>(object index) public List<T> GetDynamicStructuredValues<T>(object index)
{ {
var values = _dynamicValues[(int)index].Values; var values = _dynamicValues[(int)index];
return new List<T>(values.DeserializeObjects<T>()); return new List<T>(values.DeserializeObjects<T>());
} }
@@ -1531,8 +1518,7 @@ namespace Game.Entities
public void AddDynamicStructuredValue<T>(object index, T value) public void AddDynamicStructuredValue<T>(object index, T value)
{ {
int BlockCount = Marshal.SizeOf<T>() / sizeof(uint); int BlockCount = Marshal.SizeOf<T>() / sizeof(uint);
var values = _dynamicValues[(int)index]; ushort offset = (ushort)(_dynamicValues[(int)index].Length / BlockCount);
ushort offset = (ushort)(values.Count / BlockCount);
SetDynamicValue(index, (ushort)((offset + 1) * BlockCount - 1), 0); // reserve space SetDynamicValue(index, (ushort)((offset + 1) * BlockCount - 1), 0); // reserve space
for (ushort i = 0; i < BlockCount; ++i) for (ushort i = 0; i < BlockCount; ++i)
SetDynamicValue(index, (ushort)(offset * BlockCount + i), Extensions.SerializeObject(value)[i]); SetDynamicValue(index, (ushort)(offset * BlockCount + i), Extensions.SerializeObject(value)[i]);
@@ -3139,7 +3125,7 @@ namespace Game.Entities
protected UpdateFlag m_updateFlag { get; set; } protected UpdateFlag m_updateFlag { get; set; }
protected Hashtable UpdateData; protected Hashtable UpdateData;
protected Dictionary<int, uint>[] _dynamicValues; protected uint[][] _dynamicValues;
protected BitArray _changesMask { get; set; } protected BitArray _changesMask { get; set; }
protected Dictionary<int, DynamicFieldChangeType> _dynamicChangesMask = new Dictionary<int, DynamicFieldChangeType>(); protected Dictionary<int, DynamicFieldChangeType> _dynamicChangesMask = new Dictionary<int, DynamicFieldChangeType>();
protected BitArray[] _dynamicChangesArrayMask; protected BitArray[] _dynamicChangesArrayMask;
+4 -4
View File
@@ -249,8 +249,8 @@ namespace Game.Entities
item.AddBonuses(bonusId); item.AddBonuses(bonusId);
// Get heirloom offset to update only one part of dynamic field // Get heirloom offset to update only one part of dynamic field
var heirloomsFields = player.GetDynamicKeyAndValues(PlayerDynamicFields.Heirlooms); var fields = player.GetDynamicValues(PlayerDynamicFields.Heirlooms);
ushort offset = (ushort)heirloomsFields.FirstOrDefault(p => p.Value == itemId).Key; ushort offset = (ushort)Array.IndexOf(fields, itemId);
player.SetDynamicValue(PlayerDynamicFields.HeirloomsFlags, offset, (uint)flags); player.SetDynamicValue(PlayerDynamicFields.HeirloomsFlags, offset, (uint)flags);
data.flags = flags; data.flags = flags;
@@ -292,8 +292,8 @@ namespace Game.Entities
if (newItemId != 0) if (newItemId != 0)
{ {
var heirloomsFields = player.GetDynamicKeyAndValues(PlayerDynamicFields.Heirlooms); var heirloomFields = player.GetDynamicValues(PlayerDynamicFields.Heirlooms);
ushort offset = (ushort)heirloomsFields.FirstOrDefault(p => p.Value == item.GetEntry()).Key; ushort offset = (ushort)Array.IndexOf(heirloomFields, item.GetEntry());
player.SetDynamicValue(PlayerDynamicFields.Heirlooms, offset, newItemId); player.SetDynamicValue(PlayerDynamicFields.Heirlooms, offset, newItemId);
player.SetDynamicValue(PlayerDynamicFields.HeirloomsFlags, offset, 0); player.SetDynamicValue(PlayerDynamicFields.HeirloomsFlags, offset, 0);
+1 -1
View File
@@ -125,7 +125,7 @@ namespace Game.Entities
} }
DailyQuestsReset dailyQuestsReset = new DailyQuestsReset(); DailyQuestsReset dailyQuestsReset = new DailyQuestsReset();
dailyQuestsReset.Count = GetDynamicValues(PlayerDynamicFields.DailyQuests).Count; dailyQuestsReset.Count = GetDynamicValues(PlayerDynamicFields.DailyQuests).Length;
SendPacket(dailyQuestsReset); SendPacket(dailyQuestsReset);
ClearDynamicValue(PlayerDynamicFields.DailyQuests); ClearDynamicValue(PlayerDynamicFields.DailyQuests);
+2 -2
View File
@@ -359,7 +359,7 @@ namespace Game
packet.Item = item->GetGUID(); packet.Item = item->GetGUID();
packet.Subcode = ??; packet.Subcode = ??;
packet.Delay = ??; packet.Delay = ??;
SendPacket(packet.Write());*/ SendPacket(packet);*/
Log.outInfo(LogFilter.Network, "STORAGE: Unable to read item"); Log.outInfo(LogFilter.Network, "STORAGE: Unable to read item");
_player.SendEquipError(msg, item); _player.SendEquipError(msg, item);
@@ -791,7 +791,7 @@ namespace Game
gems[i] = gem; gems[i] = gem;
gemData[i].ItemId = gem.GetEntry(); gemData[i].ItemId = gem.GetEntry();
gemData[i].Context = (byte)gem.GetUInt32Value(ItemFields.Context); gemData[i].Context = (byte)gem.GetUInt32Value(ItemFields.Context);
for (ushort b = 0; b < gem.GetDynamicValues(ItemDynamicFields.BonusListIds).Count && b < 16; ++b) for (ushort b = 0; b < gem.GetDynamicValues(ItemDynamicFields.BonusListIds).Length && b < 16; ++b)
gemData[i].BonusListIDs[b] = (ushort)gem.GetDynamicValue(ItemDynamicFields.BonusListIds, b); gemData[i].BonusListIDs[b] = (ushort)gem.GetDynamicValue(ItemDynamicFields.BonusListIds, b);
gemProperties[i] = CliDB.GemPropertiesStorage.LookupByKey(gem.GetTemplate().GetGemProperties()); gemProperties[i] = CliDB.GemPropertiesStorage.LookupByKey(gem.GetTemplate().GetGemProperties());
+1 -1
View File
@@ -730,7 +730,7 @@ namespace Game.Network.Packets
RandomPropertiesSeed = item.GetItemSuffixFactor(); RandomPropertiesSeed = item.GetItemSuffixFactor();
RandomPropertiesID = (uint)item.GetItemRandomPropertyId(); RandomPropertiesID = (uint)item.GetItemRandomPropertyId();
var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds); var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds);
if (bonusListIds.Count != 0) if (!bonusListIds.Empty())
{ {
ItemBonus.HasValue = true; ItemBonus.HasValue = true;
ItemBonus.Value.BonusListIDs.AddRange(bonusListIds); ItemBonus.Value.BonusListIDs.AddRange(bonusListIds);