@@ -21,22 +21,23 @@ internal class CraftTreePatcher
21
21
22
22
#endregion
23
23
24
+ private static Dictionary < CraftTree . Type , CraftTree > _originalTrees = new ( ) ;
25
+
24
26
#region Patches
25
27
26
28
internal static void Patch ( Harmony harmony )
27
29
{
28
30
harmony . PatchAll ( typeof ( CraftTreePatcher ) ) ;
29
31
InternalLogger . Log ( $ "CraftTreePatcher is done.", LogLevel . Debug ) ;
30
32
}
31
-
32
33
33
34
[ HarmonyPostfix ]
34
35
[ HarmonyPatch ( typeof ( CraftTree ) , nameof ( CraftTree . GetTree ) ) ]
35
36
private static void GetTreePreFix ( CraftTree . Type treeType , ref CraftTree __result )
36
37
{
37
- __result ?? = ! CustomTrees . TryGetValue ( treeType , out var customRoot ) ? __result : customRoot . CustomCraftingTree ;
38
+ var craftTree = ! CustomTrees . TryGetValue ( treeType , out var customRoot ) ? __result : customRoot . CustomCraftingTree ;
38
39
39
- if ( __result == null )
40
+ if ( craftTree == null )
40
41
{
41
42
// The game actually has a few CraftTree.Type that are not used...
42
43
// None, Unused1, Unused2, etc...
@@ -45,14 +46,23 @@ private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __resul
45
46
return ;
46
47
}
47
48
49
+ if ( ! _originalTrees . TryGetValue ( treeType , out var originalTree ) )
50
+ {
51
+ originalTree = CopyTree ( craftTree ) ;
52
+ _originalTrees . Add ( treeType , originalTree ) ;
53
+ }
54
+
55
+ var treeCopy = CopyTree ( originalTree ) ;
56
+
48
57
#if BELOWZERO
49
58
if ( treeType is CraftTree . Type . SeaTruckFabricator )
50
59
{
51
- PatchCraftTree ( ref __result , CraftTree . Type . Fabricator ) ;
60
+ PatchCraftTree ( ref treeCopy , CraftTree . Type . Fabricator ) ;
52
61
}
53
62
#endif
54
- PatchCraftTree ( ref __result , treeType ) ;
55
- CraftTree . AddToCraftableTech ( __result ) ;
63
+ PatchCraftTree ( ref treeCopy , treeType ) ;
64
+ CraftTree . AddToCraftableTech ( treeCopy ) ;
65
+ __result = treeCopy ;
56
66
}
57
67
58
68
#endregion
@@ -149,6 +159,35 @@ private static void RemoveNodes(ref CraftTree tree, ref List<Node> nodesToRemove
149
159
}
150
160
}
151
161
162
+ private static CraftTree CopyTree ( CraftTree tree )
163
+ {
164
+ return new CraftTree ( tree . id , ( CraftNode ) CopyCraftNode ( tree . nodes ) ) ;
165
+ }
166
+
167
+ /// <summary>
168
+ /// Copy the specified node and it's inner nodes recursively.
169
+ /// </summary>
170
+ /// <param name="treeNode">The node to begin this operation on. Can be used on any node.</param>
171
+ /// <returns>A complete copy of the passed node.</returns>
172
+ private static TreeNode CopyCraftNode ( TreeNode treeNode )
173
+ {
174
+ var copiedNode = treeNode . Copy ( ) ;
175
+ copiedNode . nodes = treeNode . nodes . ToList ( ) ;
176
+
177
+ if ( copiedNode . nodes . Count == 0 )
178
+ {
179
+ return copiedNode ;
180
+ }
181
+
182
+ for ( var i = 0 ; i < copiedNode . nodes . Count ; i ++ )
183
+ {
184
+ treeNode . nodes [ i ] = CopyCraftNode ( treeNode . nodes [ i ] ) ;
185
+ treeNode . nodes [ i ] . parent = copiedNode ;
186
+ }
187
+
188
+ return copiedNode ;
189
+ }
190
+
152
191
private static bool TraverseTree ( TreeNode nodes , string [ ] path , out TreeNode currentNode )
153
192
{
154
193
currentNode = nodes ;
0 commit comments