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();
fieldMask.SetBit(index);
DynamicUpdateMask arrayValuesMask = new DynamicUpdateMask((uint)values.Count);
DynamicUpdateMask arrayValuesMask = new DynamicUpdateMask((uint)values.Length);
arrayValuesMask.EncodeDynamicFieldChangeType(_dynamicChangesMask[index], updateType);
if (updateType == UpdateType.Values && _dynamicChangesMask[index] == DynamicFieldChangeType.ValueAndSizeChanged)
arrayValuesMask.ValueCount = values.Count;
arrayValuesMask.ValueCount = values.Length;
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);
arrayValuesBuffer.WriteUInt32(pair.Value);
arrayValuesMask.SetBit(v);
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
// 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++);
arrayValuesBuffer.WriteUInt32(pair.Value);
arrayValuesBuffer.WriteUInt32(values[v]);
}
}
+23 -37
View File
@@ -96,12 +96,12 @@ namespace Game.Entities
if (_dynamicValuesCount != 0)
{
_dynamicValues = new Dictionary<int, uint>[_dynamicValuesCount];
_dynamicValues = new uint[_dynamicValuesCount][];
_dynamicChangesArrayMask = new BitArray[_dynamicValuesCount];
for (var i = 0; i < _dynamicValuesCount; ++i)
{
_dynamicValues[i] = new Dictionary<int, uint>();
_dynamicValues[i] = new uint[0];
_dynamicChangesArrayMask[i] = new BitArray(0);
_dynamicChangesMask[i] = DynamicFieldChangeType.Unchanged;
}
@@ -214,11 +214,6 @@ namespace Game.Entities
if (unit.GetVictim())
flags |= UpdateFlag.HasTarget;
if (target.m_clientGUIDs.Contains(GetGUID()))
{
}
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt8(updateType);
buffer.WritePackedGuid(GetGUID());
@@ -852,18 +847,18 @@ namespace Game.Entities
{
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);
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);
valueBuffer.WriteUInt32(pair.Value);
arrayMask.SetBit(v);
valueBuffer.WriteUInt32(values[v]);
}
}
@@ -1422,22 +1417,16 @@ namespace Game.Entities
RemoveFlag64(index, flag);
}
public Dictionary<int, uint> GetDynamicKeyAndValues(object index)
public uint[] GetDynamicValues(object index)
{
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
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)
{
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
if (!_dynamicValues[(int)index].ContainsKey(offset))
if (offset >= _dynamicValues[(int)index].Length)
return 0;
return _dynamicValues[(int)index][offset];
@@ -1447,7 +1436,7 @@ namespace Game.Entities
{
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)
@@ -1455,14 +1444,13 @@ namespace Game.Entities
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false));
// TODO: Research if this is blizzlike to just set value to 0
var values = _dynamicValues[(int)index];
foreach (var pair in values.ToList())
for (var i = 0; i < _dynamicValues[(int)index].Length; ++i)
{
if (pair.Value == value)
if (_dynamicValues[(int)index][i] == value)
{
values[pair.Key] = 0;
_dynamicValues[(int)index][i] = 0;
_dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueChanged;
_dynamicChangesArrayMask[(int)index].Set(pair.Key, true);
_dynamicChangesArrayMask[(int)index].Set(i, true);
AddToObjectUpdateIfNeeded();
}
@@ -1475,7 +1463,7 @@ namespace Game.Entities
if (!_dynamicValues[(int)index].Empty())
{
_dynamicValues[(int)index].Clear();
_dynamicValues[(int)index] = new uint[0];
_dynamicChangesMask[(int)index] = DynamicFieldChangeType.ValueAndSizeChanged;
_dynamicChangesArrayMask[(int)index].SetAll(false);
@@ -1488,19 +1476,18 @@ namespace Game.Entities
Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, true));
DynamicFieldChangeType changeType = DynamicFieldChangeType.ValueChanged;
var values = _dynamicValues[(int)index];
if (!values.ContainsKey(offset))
if (_dynamicValues[(int)index].Length <= offset)
{
values.Add(offset, 0u);
Array.Resize(ref _dynamicValues[(int)index], offset + 1);
changeType = DynamicFieldChangeType.ValueAndSizeChanged;
}
if (_dynamicChangesArrayMask[(int)index].Count <= offset)
_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;
_dynamicChangesArrayMask[(int)index].Set(offset, true);
@@ -1510,7 +1497,7 @@ namespace Game.Entities
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>());
}
@@ -1531,8 +1518,7 @@ namespace Game.Entities
public void AddDynamicStructuredValue<T>(object index, T value)
{
int BlockCount = Marshal.SizeOf<T>() / sizeof(uint);
var values = _dynamicValues[(int)index];
ushort offset = (ushort)(values.Count / BlockCount);
ushort offset = (ushort)(_dynamicValues[(int)index].Length / BlockCount);
SetDynamicValue(index, (ushort)((offset + 1) * BlockCount - 1), 0); // reserve space
for (ushort i = 0; i < BlockCount; ++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 Hashtable UpdateData;
protected Dictionary<int, uint>[] _dynamicValues;
protected uint[][] _dynamicValues;
protected BitArray _changesMask { get; set; }
protected Dictionary<int, DynamicFieldChangeType> _dynamicChangesMask = new Dictionary<int, DynamicFieldChangeType>();
protected BitArray[] _dynamicChangesArrayMask;
+4 -4
View File
@@ -249,8 +249,8 @@ namespace Game.Entities
item.AddBonuses(bonusId);
// Get heirloom offset to update only one part of dynamic field
var heirloomsFields = player.GetDynamicKeyAndValues(PlayerDynamicFields.Heirlooms);
ushort offset = (ushort)heirloomsFields.FirstOrDefault(p => p.Value == itemId).Key;
var fields = player.GetDynamicValues(PlayerDynamicFields.Heirlooms);
ushort offset = (ushort)Array.IndexOf(fields, itemId);
player.SetDynamicValue(PlayerDynamicFields.HeirloomsFlags, offset, (uint)flags);
data.flags = flags;
@@ -292,8 +292,8 @@ namespace Game.Entities
if (newItemId != 0)
{
var heirloomsFields = player.GetDynamicKeyAndValues(PlayerDynamicFields.Heirlooms);
ushort offset = (ushort)heirloomsFields.FirstOrDefault(p => p.Value == item.GetEntry()).Key;
var heirloomFields = player.GetDynamicValues(PlayerDynamicFields.Heirlooms);
ushort offset = (ushort)Array.IndexOf(heirloomFields, item.GetEntry());
player.SetDynamicValue(PlayerDynamicFields.Heirlooms, offset, newItemId);
player.SetDynamicValue(PlayerDynamicFields.HeirloomsFlags, offset, 0);
+1 -1
View File
@@ -125,7 +125,7 @@ namespace Game.Entities
}
DailyQuestsReset dailyQuestsReset = new DailyQuestsReset();
dailyQuestsReset.Count = GetDynamicValues(PlayerDynamicFields.DailyQuests).Count;
dailyQuestsReset.Count = GetDynamicValues(PlayerDynamicFields.DailyQuests).Length;
SendPacket(dailyQuestsReset);
ClearDynamicValue(PlayerDynamicFields.DailyQuests);
+2 -2
View File
@@ -359,7 +359,7 @@ namespace Game
packet.Item = item->GetGUID();
packet.Subcode = ??;
packet.Delay = ??;
SendPacket(packet.Write());*/
SendPacket(packet);*/
Log.outInfo(LogFilter.Network, "STORAGE: Unable to read item");
_player.SendEquipError(msg, item);
@@ -791,7 +791,7 @@ namespace Game
gems[i] = gem;
gemData[i].ItemId = gem.GetEntry();
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);
gemProperties[i] = CliDB.GemPropertiesStorage.LookupByKey(gem.GetTemplate().GetGemProperties());
+1 -1
View File
@@ -730,7 +730,7 @@ namespace Game.Network.Packets
RandomPropertiesSeed = item.GetItemSuffixFactor();
RandomPropertiesID = (uint)item.GetItemRandomPropertyId();
var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds);
if (bonusListIds.Count != 0)
if (!bonusListIds.Empty())
{
ItemBonus.HasValue = true;
ItemBonus.Value.BonusListIDs.AddRange(bonusListIds);