1
1
namespace Nautilus . Handlers ;
2
2
3
+ using System ;
3
4
using System . Collections . Generic ;
5
+ using System . Linq ;
4
6
using Nautilus . Crafting ;
5
7
using Nautilus . Patchers ;
8
+ using Nautilus . Utility ;
6
9
7
10
/// <summary>
8
11
/// A handler class for creating and modifying crafting trees.
@@ -29,23 +32,27 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt
29
32
30
33
nodes . Add ( new CraftingNode ( stepsToTab , craftTree , craftingItem ) ) ;
31
34
CraftTreePatcher . CraftingNodes [ craftTree ] = nodes ;
35
+
36
+ // If this node had previously been slated for removal, undo that instruction.
37
+ if ( CraftTreePatcher . NodesToRemove . TryGetValue ( craftTree , out List < Node > queuedNodes ) )
38
+ {
39
+ var fullPath = stepsToTab . Append ( craftingItem . AsString ( false ) ) ;
40
+ int removedNodes = queuedNodes . RemoveAll ( node => node . Path . SequenceEqual ( fullPath ) ) ;
41
+ if ( removedNodes > 0 )
42
+ {
43
+ InternalLogger . Debug ( $ "Removal of CraftNode at { string . Join ( "/" , fullPath ) } overwritten by new custom CraftNode.") ;
44
+ }
45
+ }
32
46
}
33
47
34
48
/// <summary>
35
49
/// Adds a new crafting node to the root of the specified crafting tree
36
50
/// </summary>
37
51
/// <param name="craftTree">The target craft tree to edit.</param>
38
52
/// <param name="craftingItem">The item to craft.</param>
39
-
40
53
public static void AddCraftingNode ( CraftTree . Type craftTree , TechType craftingItem )
41
54
{
42
- if ( ! CraftTreePatcher . CraftingNodes . TryGetValue ( craftTree , out var nodes ) )
43
- {
44
- nodes = new List < CraftingNode > ( ) ;
45
- }
46
-
47
- nodes . Add ( new CraftingNode ( new string [ 0 ] , craftTree , craftingItem ) ) ;
48
- CraftTreePatcher . CraftingNodes [ craftTree ] = nodes ;
55
+ AddCraftingNode ( craftTree , craftingItem , Array . Empty < string > ( ) ) ;
49
56
}
50
57
51
58
#if SUBNAUTICA
@@ -58,13 +65,7 @@ public static void AddCraftingNode(CraftTree.Type craftTree, TechType craftingIt
58
65
/// <param name="sprite">The sprite of the tab.</param>
59
66
public static void AddTabNode ( CraftTree . Type craftTree , string name , string displayName , Atlas . Sprite sprite )
60
67
{
61
- if ( ! CraftTreePatcher . TabNodes . TryGetValue ( craftTree , out var craftTreeTabNodes ) )
62
- {
63
- craftTreeTabNodes = new List < TabNode > ( ) ;
64
- }
65
-
66
- craftTreeTabNodes . Add ( new TabNode ( new string [ 0 ] , craftTree , sprite , name , displayName ) ) ;
67
- CraftTreePatcher . TabNodes [ craftTree ] = craftTreeTabNodes ;
68
+ AddTabNode ( craftTree , name , displayName , sprite , Array . Empty < string > ( ) ) ;
68
69
}
69
70
70
71
/// <summary>
@@ -74,16 +75,9 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp
74
75
/// <param name="name">The ID of the tab node. Must be unique!</param>
75
76
/// <param name="displayName">The display name of the tab, which will show up when you hover your mouse on the tab. If null or empty, this will use the language line "{craftTreeName}_{tabName}" instead.</param>
76
77
/// <param name="sprite">The sprite of the tab.</param>
77
-
78
78
public static void AddTabNode ( CraftTree . Type craftTree , string name , string displayName , UnityEngine . Sprite sprite )
79
79
{
80
- if ( ! CraftTreePatcher . TabNodes . TryGetValue ( craftTree , out var craftTreeTabNodes ) )
81
- {
82
- craftTreeTabNodes = new List < TabNode > ( ) ;
83
- }
84
-
85
- craftTreeTabNodes . Add ( new TabNode ( new string [ 0 ] , craftTree , new Atlas . Sprite ( sprite ) , name , displayName ) ) ;
86
- CraftTreePatcher . TabNodes [ craftTree ] = craftTreeTabNodes ;
80
+ AddTabNode ( craftTree , name , displayName , new Atlas . Sprite ( sprite ) , Array . Empty < string > ( ) ) ;
87
81
}
88
82
89
83
/// <summary>
@@ -108,6 +102,17 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp
108
102
109
103
craftTreeTabNodes . Add ( new TabNode ( stepsToTab , craftTree , sprite , name , displayName ) ) ;
110
104
CraftTreePatcher . TabNodes [ craftTree ] = craftTreeTabNodes ;
105
+
106
+ // If this node had previously been slated for removal, undo that instruction.
107
+ if ( CraftTreePatcher . NodesToRemove . TryGetValue ( craftTree , out List < Node > queuedNodes ) )
108
+ {
109
+ var fullPath = stepsToTab . Append ( name ) ;
110
+ int removedNodes = queuedNodes . RemoveAll ( node => node . Path . SequenceEqual ( fullPath ) ) ;
111
+ if ( removedNodes > 0 )
112
+ {
113
+ InternalLogger . Debug ( $ "Removal of TabNode at { string . Join ( "/" , fullPath ) } overwritten by new custom TabNode.") ;
114
+ }
115
+ }
111
116
}
112
117
113
118
/// <summary>
@@ -125,13 +130,7 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp
125
130
/// </param>
126
131
public static void AddTabNode ( CraftTree . Type craftTree , string name , string displayName , UnityEngine . Sprite sprite , params string [ ] stepsToTab )
127
132
{
128
- if ( ! CraftTreePatcher . TabNodes . TryGetValue ( craftTree , out var craftTreeTabNodes ) )
129
- {
130
- craftTreeTabNodes = new List < TabNode > ( ) ;
131
- }
132
-
133
- craftTreeTabNodes . Add ( new TabNode ( stepsToTab , craftTree , new Atlas . Sprite ( sprite ) , name , displayName ) ) ;
134
- CraftTreePatcher . TabNodes [ craftTree ] = craftTreeTabNodes ;
133
+ AddTabNode ( craftTree , name , displayName , new Atlas . Sprite ( sprite ) , stepsToTab ) ;
135
134
}
136
135
137
136
#elif BELOWZERO
@@ -144,13 +143,7 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp
144
143
/// <param name="sprite">The sprite of the tab.</param>
145
144
public static void AddTabNode ( CraftTree . Type craftTree , string name , string displayName , UnityEngine . Sprite sprite )
146
145
{
147
- if ( ! CraftTreePatcher . TabNodes . TryGetValue ( craftTree , out var craftTreeTabNodes ) )
148
- {
149
- craftTreeTabNodes = new List < TabNode > ( ) ;
150
- }
151
-
152
- craftTreeTabNodes . Add ( new TabNode ( new string [ 0 ] , craftTree , sprite , name , displayName ) ) ;
153
- CraftTreePatcher . TabNodes [ craftTree ] = craftTreeTabNodes ;
146
+ AddTabNode ( craftTree , name , displayName , sprite , Array . Empty < string > ( ) ) ;
154
147
}
155
148
156
149
/// <summary>
@@ -175,6 +168,17 @@ public static void AddTabNode(CraftTree.Type craftTree, string name, string disp
175
168
176
169
craftTreeTabNodes . Add ( new TabNode ( stepsToTab , craftTree , sprite , name , displayName ) ) ;
177
170
CraftTreePatcher . TabNodes [ craftTree ] = craftTreeTabNodes ;
171
+
172
+ // If this node had previously been slated for removal, undo that instruction.
173
+ if ( CraftTreePatcher . NodesToRemove . TryGetValue ( craftTree , out List < Node > queuedNodes ) )
174
+ {
175
+ var fullPath = stepsToTab . Append ( name ) ;
176
+ int removedNodes = queuedNodes . RemoveAll ( node => node . Path . SequenceEqual ( fullPath ) ) ;
177
+ if ( removedNodes > 0 )
178
+ {
179
+ InternalLogger . Debug ( $ "Removal of TabNode at { string . Join ( "/" , fullPath ) } overwritten by new custom TabNode.") ;
180
+ }
181
+ }
178
182
}
179
183
180
184
#endif
@@ -201,6 +205,24 @@ public static void RemoveNode(CraftTree.Type craftTree, params string[] stepsToN
201
205
202
206
nodesToRemove . Add ( new Node ( stepsToNode , craftTree ) ) ;
203
207
CraftTreePatcher . NodesToRemove [ craftTree ] = nodesToRemove ;
208
+
209
+ // If this is a previously registered custom node, undo that instruction.
210
+ // This avoids accumulation of instructions that cancel each other out.
211
+ int removedNodes = 0 ;
212
+ if ( CraftTreePatcher . CraftingNodes . TryGetValue ( craftTree , out List < CraftingNode > craftingNodes ) )
213
+ {
214
+ removedNodes += craftingNodes . RemoveAll ( node => node . Path . Append ( node . TechType . ToString ( ) ) . SequenceEqual ( stepsToNode ) ) ;
215
+ }
216
+
217
+ if ( CraftTreePatcher . TabNodes . TryGetValue ( craftTree , out List < TabNode > tabNodes ) )
218
+ {
219
+ removedNodes += tabNodes . RemoveAll ( node => node . Path . Append ( node . Id ) . SequenceEqual ( stepsToNode ) ) ;
220
+ }
221
+
222
+ if ( removedNodes > 0 )
223
+ {
224
+ InternalLogger . Debug ( $ "Removed another mod's custom node at { string . Join ( "/" , stepsToNode ) } from future craft trees.") ;
225
+ }
204
226
}
205
227
206
228
/// <summary>
0 commit comments