|
| 1 | +using Google.Protobuf.Collections; |
1 | 2 | using System; |
2 | 3 | using System.Collections.Generic; |
3 | 4 | using System.Diagnostics.Contracts; |
4 | 5 | using System.Globalization; |
5 | 6 | using System.Linq; |
6 | 7 | using System.Threading; |
7 | | -using Google.Protobuf.Collections; |
8 | 8 | using WowPacketParser.Enums; |
9 | 9 | using WowPacketParser.Proto; |
10 | 10 | using WowPacketParser.Store.Objects.UpdateFields; |
@@ -220,12 +220,6 @@ public static int BinarySearch<TKey, TValue>(this SortedList<TKey, TValue> sorte |
220 | 220 | return ~lo; |
221 | 221 | } |
222 | 222 |
|
223 | | - public static void Reserve<T>(this RepeatedField<T> field, int count) where T : new() |
224 | | - { |
225 | | - while (field.Count < count) |
226 | | - field.Add(new T()); |
227 | | - } |
228 | | - |
229 | 223 | public static void UpdateData(this UpdateValuesObjectDataFields fields, IObjectData data) |
230 | 224 | { |
231 | 225 | fields.EntryID = data.EntryID; |
@@ -315,30 +309,29 @@ public static void UpdateData(this UpdateValuesObjectDataFields fields, IUnitDat |
315 | 309 | unit.SummonedBy = data.SummonedBy; |
316 | 310 | if (data.CreatedBy != null) |
317 | 311 | unit.CreatedBy = data.CreatedBy; |
318 | | - unit.NpcFlags.Reserve(data.NpcFlags.Length); |
319 | | - for (int i = 0; i < data.NpcFlags.Length; ++i) |
320 | | - unit.NpcFlags[i] = data.NpcFlags[i].ToProto(); |
321 | | - |
322 | | - unit.Power.Reserve(data.Power.Length); |
323 | | - for (int i = 0; i < data.Power.Length; ++i) |
324 | | - unit.Power[i] = data.Power[i].ToProto(); |
325 | | - |
326 | | - unit.MaxPower.Reserve(data.MaxPower.Length); |
327 | | - for (int i = 0; i < data.MaxPower.Length; ++i) |
328 | | - unit.MaxPower[i] = data.MaxPower[i].ToProto(); |
329 | | - |
330 | | - unit.AttackRoundBaseTime.Reserve(data.AttackRoundBaseTime.Length); |
331 | | - for (int i = 0; i < data.AttackRoundBaseTime.Length; ++i) |
332 | | - unit.AttackRoundBaseTime[i] = data.AttackRoundBaseTime[i].ToProto(); |
333 | | - |
334 | | - unit.Resistances.Reserve(data.Resistances.Length); |
335 | | - for (int i = 0; i < data.Resistances.Length; ++i) |
336 | | - unit.Resistances[i] = data.Resistances[i].ToProto(); |
337 | | - |
338 | | - unit.VirtualItems.Reserve(data.VirtualItems.Length); |
339 | | - for (int i = 0; i < data.VirtualItems.Length; ++i) |
340 | | - if (data.VirtualItems[i] != null) |
341 | | - unit.VirtualItems[i] = data.VirtualItems[i].ToProto(); |
| 312 | + |
| 313 | + unit.NpcFlags.FillFrom(data.NpcFlags, ToProto); |
| 314 | + unit.Power.FillFrom(data.Power, ToProto); |
| 315 | + unit.MaxPower.FillFrom(data.MaxPower, ToProto); |
| 316 | + unit.AttackRoundBaseTime.FillFrom(data.AttackRoundBaseTime, ToProto); |
| 317 | + unit.Resistances.FillFrom(data.Resistances, ToProto); |
| 318 | + unit.VirtualItems.FillFrom(data.VirtualItems, item => item != null ? item.ToProto() : new VisibleItemFields()); |
| 319 | + } |
| 320 | + |
| 321 | + private static void FillFrom<TDest, TSource>(this RepeatedField<TDest> field, TSource[] source, Func<TSource, TDest> mappingFunc) |
| 322 | + { |
| 323 | + for (var i = 0; i < Math.Min(source.Length, field.Count); ++i) |
| 324 | + field[i] = mappingFunc(source[i]); |
| 325 | + |
| 326 | + if (source.Length > field.Count) |
| 327 | + { |
| 328 | + field.Capacity = source.Length; |
| 329 | + for (var i = field.Count; i < source.Length; ++i) |
| 330 | + field.Add(mappingFunc(source[i])); |
| 331 | + } |
| 332 | + else |
| 333 | + while (source.Length < field.Count) |
| 334 | + field.RemoveAt(source.Length); |
342 | 335 | } |
343 | 336 |
|
344 | 337 | public static UInt32ValueWrapper ToProto(this uint? value) |
|
0 commit comments