Fixed server sending dynamic values of 0.
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user