Skip to content

Commit 4e939e3

Browse files
author
Janis Estelmann
committed
Made compatible with current ReClass.NET master branch.
1 parent 219bedf commit 4e939e3

9 files changed

+141
-90
lines changed

Diff for: CodeGenerator.cs

+14-22
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,10 @@
66

77
namespace UnrealEngineClassesPlugin
88
{
9-
public class CodeGenerator : ICustomCodeGenerator
9+
public class CodeGenerator : ICustomCppCodeGenerator
1010
{
11-
/// <summary>Checks if the language is C++ and the node is a WeakPtrNode.</summary>
12-
/// <param name="node">The node to check.</param>
13-
/// <param name="language">The language to check.</param>
14-
/// <returns>True if we can generate code, false if not.</returns>
15-
public bool CanGenerateCode(BaseNode node, Language language)
11+
public bool CanHandle(BaseNode node)
1612
{
17-
if (language != Language.Cpp)
18-
{
19-
return false;
20-
}
21-
2213
switch (node)
2314
{
2415
case FDateTimeNode _:
@@ -33,29 +24,30 @@ public bool CanGenerateCode(BaseNode node, Language language)
3324
return false;
3425
}
3526

36-
/// <summary>Gets the member definition of the node.</summary>
37-
/// <param name="node">The member node.</param>
38-
/// <param name="language">The language to generate.</param>
39-
/// <returns>The member definition of the node.</returns>
40-
public MemberDefinition GetMemberDefinition(BaseNode node, Language language, ILogger logger)
27+
public string GetTypeDefinition(BaseNode node, GetTypeDefinitionFunc defaultGetTypeDefinitionFunc, ResolveWrappedTypeFunc defaultResolveWrappedTypeFunc, ILogger logger)
4128
{
4229
switch (node)
4330
{
4431
case FDateTimeNode _:
45-
return new MemberDefinition(node, "FDateTime");
32+
return "FDateTime";
4633
case FGuidNode _:
47-
return new MemberDefinition(node, "FGuid");
34+
return "FGuid";
4835
case FQWordNode _:
49-
return new MemberDefinition(node, "FQWord");
36+
return "FQWord";
5037
case FStringNode _:
51-
return new MemberDefinition(node, "FString");
38+
return "FString";
5239
case TArrayNode arrayNode:
53-
return new MemberDefinition(node, $"TArray<{arrayNode.InnerNode.Name}>");
40+
return $"TArray<{defaultResolveWrappedTypeFunc(arrayNode.InnerNode, true, logger)}>";
5441
case TSharedPtrNode sharedPtrNode:
55-
return new MemberDefinition(node, $"TSharedPtr<{sharedPtrNode.InnerNode.Name}>");
42+
return $"TSharedPtr<{defaultResolveWrappedTypeFunc(sharedPtrNode.InnerNode, true, logger)}>";
5643
}
5744

5845
throw new InvalidOperationException("Can not handle node: " + node.GetType());
5946
}
47+
48+
public BaseNode TransformNode(BaseNode node)
49+
{
50+
return node;
51+
}
6052
}
6153
}

Diff for: NodeConverter.cs

+36-17
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace UnrealEngineClassesPlugin
1111
{
12-
public class NodeConverter : ICustomNodeConverter
12+
public class NodeConverter : ICustomNodeSerializer
1313
{
1414
/// <summary>Name of the type used in the XML data.</summary>
1515
private const string XmlTypePrefix = "UnrealEngineClasses.";
@@ -18,7 +18,7 @@ public class NodeConverter : ICustomNodeConverter
1818

1919
public bool CanHandleElement(XElement element) => element.Attribute(ReClassNetFile.XmlTypeAttribute)?.Value.StartsWith(XmlTypePrefix) == true;
2020

21-
public bool TryCreateNodeFromElement(XElement element, ClassNode parent, IEnumerable<ClassNode> classes, ILogger logger, out BaseNode node)
21+
public bool TryCreateNodeFromElement(XElement element, BaseNode parent, IEnumerable<ClassNode> classes, ILogger logger, CreateNodeFromElementHandler defaultHandler, out BaseNode node)
2222
{
2323
node = null;
2424

@@ -40,25 +40,41 @@ public bool TryCreateNodeFromElement(XElement element, ClassNode parent, IEnumer
4040
case XmlTypePrefix + "TArray":
4141
case XmlTypePrefix + "TSharedPtr":
4242
{
43-
var reference = NodeUuid.FromBase64String(element.Attribute(ReClassNetFile.XmlReferenceAttribute)?.Value, false);
44-
var innerClass = classes.FirstOrDefault(c => c.Uuid.Equals(reference));
45-
if (innerClass == null)
43+
if (type == XmlTypePrefix + "TArray")
44+
{
45+
node = new TArrayNode();
46+
}
47+
else
4648
{
47-
logger.Log(LogLevel.Warning, $"Skipping node with unknown reference: {reference}");
48-
logger.Log(LogLevel.Warning, element.ToString());
49+
node = new TSharedPtrNode();
50+
}
4951

50-
return false;
52+
BaseNode innerNode = null;
53+
var innerElement = element.Elements().FirstOrDefault();
54+
if (innerElement != null)
55+
{
56+
innerNode = defaultHandler(innerElement, node, logger);
5157
}
5258

53-
if (type == XmlTypePrefix + "TArray")
59+
var wrapperNode = (BaseWrapperNode)node;
60+
if (wrapperNode.CanChangeInnerNodeTo(innerNode))
5461
{
55-
node = new TArrayNode();
62+
var rootWrapperNode = node.GetRootWrapperNode();
63+
if (rootWrapperNode.ShouldPerformCycleCheckForInnerNode()
64+
&& innerNode is ClassNode classNode
65+
&& ClassUtil.IsCyclicIfClassIsAccessibleFromParent(node.GetParentClass(), classNode, classes))
66+
{
67+
logger.Log(LogLevel.Error, $"Skipping node with cyclic class reference: {node.GetParentClass().Name}->{rootWrapperNode.Name}");
68+
69+
return false;
70+
}
71+
72+
wrapperNode.ChangeInnerNode(innerNode);
5673
}
5774
else
5875
{
59-
node = new TSharedPtrNode();
76+
return false;
6077
}
61-
((BaseReferenceNode)node).ChangeInnerNode(innerClass);
6278

6379
break;
6480
}
@@ -72,7 +88,7 @@ public bool TryCreateNodeFromElement(XElement element, ClassNode parent, IEnumer
7288
return true;
7389
}
7490

75-
public XElement CreateElementFromNode(BaseNode node, ILogger logger)
91+
public XElement CreateElementFromNode(BaseNode node, ILogger logger, CreateElementFromNodeHandler defaultHandler)
7692
{
7793
var element = new XElement(
7894
ReClassNetFile.XmlNodeElement,
@@ -94,16 +110,19 @@ public XElement CreateElementFromNode(BaseNode node, ILogger logger)
94110
case FStringNode _:
95111
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "FString");
96112
break;
97-
case TArrayNode arrayNode:
113+
case TArrayNode _:
98114
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "TArray");
99-
element.SetAttributeValue(ReClassNetFile.XmlReferenceAttribute, arrayNode.InnerNode.Uuid.ToBase64String());
100115
break;
101-
case TSharedPtrNode sharedPtrNode:
116+
case TSharedPtrNode _:
102117
element.SetAttributeValue(ReClassNetFile.XmlTypeAttribute, XmlTypePrefix + "TSharedPtr");
103-
element.SetAttributeValue(ReClassNetFile.XmlReferenceAttribute, sharedPtrNode.InnerNode.Uuid.ToBase64String());
104118
break;
105119
}
106120

121+
if (node is BaseWrapperNode wrapperNode)
122+
{
123+
element.Add(defaultHandler(wrapperNode.InnerNode, logger));
124+
}
125+
107126
return element;
108127
}
109128
}

Diff for: Nodes/FDateTimeNode.cs

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ public class FDateTimeNode : BaseNode
1010
{
1111
public override int MemorySize => sizeof(long);
1212

13+
public override void GetUserInterfaceInfo(out string name, out Image icon)
14+
{
15+
name = "FDateTime";
16+
icon = null;
17+
}
18+
1319
public override Size Draw(ViewInfo view, int x, int y)
1420
{
1521
if (IsHidden)

Diff for: Nodes/FGuidNode.cs

+6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ public class FGuidNode : BaseNode
88
{
99
public override int MemorySize => sizeof(int) * 4;
1010

11+
public override void GetUserInterfaceInfo(out string name, out Image icon)
12+
{
13+
name = "FGuid";
14+
icon = null;
15+
}
16+
1117
public override Size Draw(ViewInfo view, int x, int y)
1218
{
1319
if (IsHidden)

Diff for: Nodes/FQWordNode.cs

+8-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@ public class FQWordNode : BaseNode
88
{
99
public override int MemorySize => 8;
1010

11+
public override void GetUserInterfaceInfo(out string name, out Image icon)
12+
{
13+
name = "FQWord";
14+
icon = null;
15+
}
16+
1117
public override Size Draw(ViewInfo view, int x, int y)
1218
{
13-
if (IsHidden)
19+
if (IsHidden && !IsWrapped)
1420
{
1521
return DrawHidden(view, x, y);
1622
}
@@ -45,7 +51,7 @@ public override Size Draw(ViewInfo view, int x, int y)
4551

4652
public override int CalculateDrawnHeight(ViewInfo view)
4753
{
48-
return IsHidden ? HiddenHeight : view.Font.Height;
54+
return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height;
4955
}
5056
}
5157
}

Diff for: Nodes/FStringNode.cs

+8-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,15 @@ public class FStringNode : BaseNode
1010
{
1111
public override int MemorySize => IntPtr.Size + sizeof(int) * 2;
1212

13+
public override void GetUserInterfaceInfo(out string name, out Image icon)
14+
{
15+
name = "FString";
16+
icon = null;
17+
}
18+
1319
public override Size Draw(ViewInfo view, int x, int y)
1420
{
15-
if (IsHidden)
21+
if (IsHidden && !IsWrapped)
1622
{
1723
return DrawHidden(view, x, y);
1824
}
@@ -48,7 +54,7 @@ public override Size Draw(ViewInfo view, int x, int y)
4854

4955
public override int CalculateDrawnHeight(ViewInfo view)
5056
{
51-
return IsHidden ? HiddenHeight : view.Font.Height;
57+
return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height;
5258
}
5359
}
5460
}

Diff for: Nodes/TArrayNode.cs

+17-8
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,35 @@
77

88
namespace UnrealEngineClassesPlugin.Nodes
99
{
10-
public class TArrayNode : BaseArrayNode
10+
public class TArrayNode : BaseWrapperArrayNode
1111
{
1212
private readonly MemoryBuffer memory = new MemoryBuffer();
1313

1414
public override int MemorySize => IntPtr.Size + sizeof(int) * 2;
15-
public override bool PerformCycleCheck => false;
1615

17-
public override void Intialize()
16+
protected override bool PerformCycleCheck => false;
17+
18+
public TArrayNode()
19+
{
20+
IsReadOnly = true;
21+
}
22+
23+
public override void GetUserInterfaceInfo(out string name, out Image icon)
24+
{
25+
name = "TArray";
26+
icon = null;
27+
}
28+
29+
public override void Initialize()
1830
{
19-
var node = ClassNode.Create();
20-
node.Intialize();
21-
node.AddBytes(64);
22-
InnerNode = node;
31+
InnerNode = IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node();
2332
}
2433

2534
public override Size Draw(ViewInfo view, int x, int y)
2635
{
2736
Count = view.Memory.ReadInt32(Offset + IntPtr.Size);
2837

29-
return Draw(view, x, y, "TArray", HotSpotType.ChangeType);
38+
return Draw(view, x, y, "TArray");
3039
}
3140

3241
protected override Size DrawChild(ViewInfo view, int x, int y)

Diff for: Nodes/TSharedPtrNode.cs

+39-15
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,35 @@
77

88
namespace UnrealEngineClassesPlugin.Nodes
99
{
10-
public class TSharedPtrNode : BaseReferenceNode
10+
public class TSharedPtrNode : BaseWrapperNode
1111
{
1212
private readonly MemoryBuffer memory = new MemoryBuffer();
1313

1414
public override int MemorySize => IntPtr.Size * 2;
1515

16-
public override bool PerformCycleCheck => false;
16+
protected override bool PerformCycleCheck => false;
1717

18-
public override void Intialize()
18+
public override void GetUserInterfaceInfo(out string name, out Image icon)
1919
{
20-
var node = ClassNode.Create();
21-
node.Intialize();
22-
node.AddBytes(64);
23-
InnerNode = node;
20+
name = "TSharedPtr";
21+
icon = null;
22+
}
23+
24+
public override bool CanChangeInnerNodeTo(BaseNode node)
25+
{
26+
switch (node)
27+
{
28+
case ClassNode _:
29+
case VirtualMethodNode _:
30+
return false;
31+
}
32+
33+
return true;
2434
}
2535

2636
public override Size Draw(ViewInfo view, int x, int y)
2737
{
28-
if (IsHidden)
38+
if (IsHidden && !IsWrapped)
2939
{
3040
return DrawHidden(view, x, y);
3141
}
@@ -37,16 +47,29 @@ public override Size Draw(ViewInfo view, int x, int y)
3747

3848
AddSelection(view, x, y, view.Font.Height);
3949

40-
x = AddOpenClose(view, x, y);
50+
if (InnerNode != null)
51+
{
52+
x = AddOpenClose(view, x, y);
53+
}
54+
else
55+
{
56+
x += TextPadding;
57+
}
4158
x = AddIcon(view, x, y, Icons.Pointer, -1, HotSpotType.None);
4259

4360
var tx = x;
4461
x = AddAddressOffset(view, x, y);
4562

4663
x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "TSharedPtr") + view.Font.Width;
47-
x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width;
48-
x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width;
49-
x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width;
64+
if (!IsWrapped)
65+
{
66+
x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width;
67+
}
68+
if (InnerNode == null)
69+
{
70+
x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, "<void>") + view.Font.Width;
71+
}
72+
x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeWrappedType) + view.Font.Width;
5073

5174
var ptr = view.Memory.ReadIntPtr(Offset);
5275

@@ -55,14 +78,15 @@ public override Size Draw(ViewInfo view, int x, int y)
5578

5679
x = AddComment(view, x, y);
5780

81+
DrawInvalidMemoryIndicator(view, y);
5882
AddTypeDrop(view, y);
5983
AddDelete(view, y);
6084

6185
y += view.Font.Height;
6286

6387
var size = new Size(x - origX, y - origY);
6488

65-
if (levelsOpen[view.Level])
89+
if (LevelsOpen[view.Level] && InnerNode != null)
6690
{
6791
memory.Size = InnerNode.MemorySize;
6892
memory.Process = view.Memory.Process;
@@ -83,13 +107,13 @@ public override Size Draw(ViewInfo view, int x, int y)
83107

84108
public override int CalculateDrawnHeight(ViewInfo view)
85109
{
86-
if (IsHidden)
110+
if (IsHidden && !IsWrapped)
87111
{
88112
return HiddenHeight;
89113
}
90114

91115
var height = view.Font.Height;
92-
if (levelsOpen[view.Level])
116+
if (LevelsOpen[view.Level] && InnerNode != null)
93117
{
94118
height += InnerNode.CalculateDrawnHeight(view);
95119
}

0 commit comments

Comments
 (0)