diff --git a/Game/Entities/Item/Item.cs b/Game/Entities/Item/Item.cs index 584e76214..c04e598d1 100644 --- a/Game/Entities/Item/Item.cs +++ b/Game/Entities/Item/Item.cs @@ -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]); } } diff --git a/Game/Entities/Object/WorldObject.cs b/Game/Entities/Object/WorldObject.cs index e8cce6a98..99d25bff2 100644 --- a/Game/Entities/Object/WorldObject.cs +++ b/Game/Entities/Object/WorldObject.cs @@ -96,12 +96,12 @@ namespace Game.Entities if (_dynamicValuesCount != 0) { - _dynamicValues = new Dictionary[_dynamicValuesCount]; + _dynamicValues = new uint[_dynamicValuesCount][]; _dynamicChangesArrayMask = new BitArray[_dynamicValuesCount]; for (var i = 0; i < _dynamicValuesCount; ++i) { - _dynamicValues[i] = new Dictionary(); + _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 GetDynamicKeyAndValues(object index) + public uint[] GetDynamicValues(object index) { Contract.Assert((int)index < _dynamicValuesCount || PrintIndexError(index, false)); return _dynamicValues[(int)index]; } - public ICollection 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 GetDynamicStructuredValues(object index) { - var values = _dynamicValues[(int)index].Values; + var values = _dynamicValues[(int)index]; return new List(values.DeserializeObjects()); } @@ -1531,8 +1518,7 @@ namespace Game.Entities public void AddDynamicStructuredValue(object index, T value) { int BlockCount = Marshal.SizeOf() / 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[] _dynamicValues; + protected uint[][] _dynamicValues; protected BitArray _changesMask { get; set; } protected Dictionary _dynamicChangesMask = new Dictionary(); protected BitArray[] _dynamicChangesArrayMask; diff --git a/Game/Entities/Player/CollectionManager.cs b/Game/Entities/Player/CollectionManager.cs index 03c801dea..54d2ce088 100644 --- a/Game/Entities/Player/CollectionManager.cs +++ b/Game/Entities/Player/CollectionManager.cs @@ -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); diff --git a/Game/Entities/Player/Player.Quest.cs b/Game/Entities/Player/Player.Quest.cs index 0b03ea288..889af0f7e 100644 --- a/Game/Entities/Player/Player.Quest.cs +++ b/Game/Entities/Player/Player.Quest.cs @@ -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); diff --git a/Game/Handlers/ItemHandler.cs b/Game/Handlers/ItemHandler.cs index 9df16b83b..0d642efda 100644 --- a/Game/Handlers/ItemHandler.cs +++ b/Game/Handlers/ItemHandler.cs @@ -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()); diff --git a/Game/Network/Packets/ItemPackets.cs b/Game/Network/Packets/ItemPackets.cs index 07feaad66..c06a82a7b 100644 --- a/Game/Network/Packets/ItemPackets.cs +++ b/Game/Network/Packets/ItemPackets.cs @@ -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);