Skip to content

Commit 8788b0e

Browse files
committed
Implement UpdateFieldType.Enum with ItemFieldFlags as first example
1 parent f6636bf commit 8788b0e

File tree

5 files changed

+42
-13
lines changed

5 files changed

+42
-13
lines changed

WowPacketParser/Enums/ItemFieldFlags.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
namespace WowPacketParser.Enums
44
{
5-
// TODO: use when reading ITEM_FIELD_FLAGS
65
[Flags]
76
public enum ItemFieldFlags : uint
87
{
9-
Souldbound = 0x00000001, // Item is soulbound and cannot be traded
10-
Unk1 = 0x00000002, // ?
8+
Soulbound = 0x00000001, // Item is soulbound and cannot be traded
9+
Translated = 0x00000002, // Translates pagetext to lang id in query
1110
Unlocked = 0x00000004, // Item had lock but can be opened now
1211
Wrapped = 0x00000008, // Item is wrapped and contains another item
1312
Unk2 = 0x00000010, // ?

WowPacketParser/Enums/UpdateFields.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public enum ItemField
6767
ITEM_FIELD_ENCHANTMENT_8_3,
6868
ITEM_FIELD_ENCHANTMENT_9_1,
6969
ITEM_FIELD_ENCHANTMENT_9_3,
70+
[UpdateField(UpdateFieldType.Enum, typeof(ItemFieldFlags))]
7071
ITEM_FIELD_FLAGS,
7172
[UpdateField(UpdateFieldType.Guid)]
7273
ITEM_FIELD_GIFTCREATOR,

WowPacketParser/Enums/Version/UpdateFields.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class UpdateFieldInfo
1616
public string Name;
1717
public int Size;
1818
public UpdateFieldType Format;
19+
public Type? EnumType;
1920
}
2021

2122
public static class UpdateFields
@@ -64,15 +65,15 @@ private static bool LoadUFDictionariesInto(Dictionary<Type, SortedList<int, Upda
6465
};
6566

6667
bool loaded = false;
67-
foreach (Type enumType in enumTypes)
68+
foreach (Type ufEnumType in enumTypes)
6869
{
6970
string vTypeString =
70-
$"WowPacketParserModule.{GetUpdateFieldDictionaryBuildName(build)}.Enums.{enumType.Name}";
71+
$"WowPacketParserModule.{GetUpdateFieldDictionaryBuildName(build)}.Enums.{ufEnumType.Name}";
7172
Type vEnumType = asm.GetType(vTypeString);
7273
if (vEnumType == null)
7374
{
7475
vTypeString =
75-
$"WowPacketParser.Enums.Version.{GetUpdateFieldDictionaryBuildName(build)}.{enumType.Name}";
76+
$"WowPacketParser.Enums.Version.{GetUpdateFieldDictionaryBuildName(build)}.{ufEnumType.Name}";
7677
vEnumType = Assembly.GetExecutingAssembly().GetType(vTypeString);
7778
if (vEnumType == null)
7879
continue; // versions prior to 4.3.0 do not have AreaTriggerField
@@ -86,22 +87,22 @@ private static bool LoadUFDictionariesInto(Dictionary<Type, SortedList<int, Upda
8687

8788
for (int i = 0; i < vValues.Length; ++i)
8889
{
89-
var format = enumType.GetMember(vNames[i])
90+
UpdateFieldAttribute? attribute = (UpdateFieldAttribute)ufEnumType.GetMember(vNames[i])
9091
.SelectMany(member => member.GetCustomAttributes(typeof(UpdateFieldAttribute), false))
9192
.Where(attribute => ((UpdateFieldAttribute)attribute).Version <= ClientVersion.VersionDefiningBuild)
92-
.OrderByDescending(attribute => ((UpdateFieldAttribute)attribute).Version)
93-
.Select(attribute => ((UpdateFieldAttribute)attribute).UFAttribute)
94-
.DefaultIfEmpty(UpdateFieldType.Default).First();
93+
.OrderByDescending(attribute => ((UpdateFieldAttribute)attribute).Version).FirstOrDefault();;
94+
UpdateFieldType format = attribute?.UFAttribute ?? UpdateFieldType.Default;
95+
Type? enumType = attribute?.EnumType ?? null;
9596

96-
result.Add((int)vValues.GetValue(i), new UpdateFieldInfo() { Value = (int)vValues.GetValue(i), Name = vNames[i], Size = 0, Format = format });
97+
result.Add((int)vValues.GetValue(i), new UpdateFieldInfo() { Value = (int)vValues.GetValue(i), Name = vNames[i], Size = 0, Format = format, EnumType = enumType });
9798
namesResult.Add(vNames[i], (int)vValues.GetValue(i));
9899
}
99100

100101
for (var i = 0; i < result.Count - 1; ++i)
101102
result.Values[i].Size = result.Keys[i + 1] - result.Keys[i];
102103

103-
dicts.Add(enumType, result);
104-
nameToValueDict.Add(enumType, namesResult);
104+
dicts.Add(ufEnumType, result);
105+
nameToValueDict.Add(ufEnumType, namesResult);
105106
loaded = true;
106107
}
107108

WowPacketParser/Parsing/Parsers/UpdateHandler.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
using Google.Protobuf.WellKnownTypes;
12
using System;
23
using System.Collections;
34
using System.Collections.Generic;
5+
using System.Globalization;
6+
using System.Xml.Linq;
47
using WowPacketParser.Enums;
58
using WowPacketParser.Enums.Version;
69
using WowPacketParser.Misc;
@@ -349,12 +352,14 @@ private static Dictionary<int, UpdateField> ReadValuesUpdateBlock(Packet packet,
349352
int start = i;
350353
int size = 1;
351354
UpdateFieldType updateFieldType = UpdateFieldType.Default;
355+
System.Type? enumType = null;
352356
if (fieldInfo != null)
353357
{
354358
key = fieldInfo.Name;
355359
size = fieldInfo.Size;
356360
start = fieldInfo.Value;
357361
updateFieldType = fieldInfo.Format;
362+
enumType = fieldInfo.EnumType;
358363
}
359364

360365
List<UpdateField> fieldData = new List<UpdateField>();
@@ -529,6 +534,13 @@ private static Dictionary<int, UpdateField> ReadValuesUpdateBlock(Packet packet,
529534
}
530535
break;
531536
}
537+
case UpdateFieldType.Enum:
538+
{
539+
IConvertible enumValue = (IConvertible)System.Enum.ToObject(enumType, fieldData[0].Int32Value);
540+
packet.AddValue(key, Convert.ToInt64(enumValue) + " (" + enumValue.ToString(CultureInfo.InvariantCulture) + ")", index);
541+
updateValues.Ints[key] = fieldData[0].Int32Value;
542+
break;
543+
}
532544
default:
533545
for (int k = 0; k < fieldData.Count; ++k)
534546
if (mask[start + k] && (!isCreating || fieldData[k].UInt32Value != 0))

WowPacketParser/Parsing/UpdateFieldAttributes.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public enum UpdateFieldType
1414
Float, // Supports variable length
1515
Bytes, // Supports variable length
1616
Short,
17+
Enum,
1718
Custom
1819
}
1920

@@ -32,7 +33,22 @@ public UpdateFieldAttribute(UpdateFieldType attrib, ClientVersionBuild fromVersi
3233
Version = fromVersion;
3334
}
3435

36+
public UpdateFieldAttribute(UpdateFieldType attrib, Type enumType)
37+
{
38+
UFAttribute = attrib;
39+
Version = ClientVersionBuild.Zero;
40+
EnumType = enumType;
41+
}
42+
43+
public UpdateFieldAttribute(UpdateFieldType attrib, ClientVersionBuild fromVersion, Type? enumType)
44+
{
45+
UFAttribute = attrib;
46+
Version = fromVersion;
47+
EnumType = enumType;
48+
}
49+
3550
public UpdateFieldType UFAttribute { get; private set; }
3651
public ClientVersionBuild Version { get; private set; }
52+
public Type? EnumType { get; private set; }
3753
}
3854
}

0 commit comments

Comments
 (0)