Skip to content

Commit 68109eb

Browse files
authored
fix: Duplicated nodes each time a craft tree is accessed (#559)
Fixed nodes getting duplicated everytime
1 parent 288e473 commit 68109eb

File tree

1 file changed

+45
-6
lines changed

1 file changed

+45
-6
lines changed

Nautilus/Patchers/CraftTreePatcher.cs

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,23 @@ internal class CraftTreePatcher
2121

2222
#endregion
2323

24+
private static Dictionary<CraftTree.Type, CraftTree> _originalTrees = new();
25+
2426
#region Patches
2527

2628
internal static void Patch(Harmony harmony)
2729
{
2830
harmony.PatchAll(typeof(CraftTreePatcher));
2931
InternalLogger.Log($"CraftTreePatcher is done.", LogLevel.Debug);
3032
}
31-
3233

3334
[HarmonyPostfix]
3435
[HarmonyPatch(typeof(CraftTree), nameof(CraftTree.GetTree))]
3536
private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __result)
3637
{
37-
__result ??= !CustomTrees.TryGetValue(treeType, out var customRoot) ? __result : customRoot.CustomCraftingTree;
38+
var craftTree = !CustomTrees.TryGetValue(treeType, out var customRoot) ? __result : customRoot.CustomCraftingTree;
3839

39-
if (__result == null)
40+
if (craftTree == null)
4041
{
4142
// The game actually has a few CraftTree.Type that are not used...
4243
// None, Unused1, Unused2, etc...
@@ -45,14 +46,23 @@ private static void GetTreePreFix(CraftTree.Type treeType, ref CraftTree __resul
4546
return;
4647
}
4748

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+
4857
#if BELOWZERO
4958
if (treeType is CraftTree.Type.SeaTruckFabricator)
5059
{
51-
PatchCraftTree(ref __result, CraftTree.Type.Fabricator);
60+
PatchCraftTree(ref treeCopy, CraftTree.Type.Fabricator);
5261
}
5362
#endif
54-
PatchCraftTree(ref __result, treeType);
55-
CraftTree.AddToCraftableTech(__result);
63+
PatchCraftTree(ref treeCopy, treeType);
64+
CraftTree.AddToCraftableTech(treeCopy);
65+
__result = treeCopy;
5666
}
5767

5868
#endregion
@@ -149,6 +159,35 @@ private static void RemoveNodes(ref CraftTree tree, ref List<Node> nodesToRemove
149159
}
150160
}
151161

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+
152191
private static bool TraverseTree(TreeNode nodes, string[] path, out TreeNode currentNode)
153192
{
154193
currentNode = nodes;

0 commit comments

Comments
 (0)