diff --git a/CLA/Signatures.json b/CLA/Signatures.json index d9ab2b1a..e06b16c2 100644 --- a/CLA/Signatures.json +++ b/CLA/Signatures.json @@ -71,6 +71,14 @@ "created_at": "2024-01-02T00:09:02Z", "repoId": 123711758, "pullRequestNo": 523 + }, + { + "name": "RamuneNeptune", + "id": 94365980, + "comment_id": 1880001483, + "created_at": "2024-01-07T09:15:31Z", + "repoId": 123711758, + "pullRequestNo": 526 } ] } \ No newline at end of file diff --git a/Nautilus/Patchers/CraftDataPatcher_Subnautica.cs b/Nautilus/Patchers/CraftDataPatcher_Subnautica.cs index 51641da4..bb6ab546 100644 --- a/Nautilus/Patchers/CraftDataPatcher_Subnautica.cs +++ b/Nautilus/Patchers/CraftDataPatcher_Subnautica.cs @@ -150,14 +150,12 @@ private static void GetBuildablePrefix(TechType recipe) PatchUtils.PatchList(CraftData.buildables, CustomBuildables); } - [HarmonyPostfix] - [HarmonyPatch(typeof(CraftData), nameof(CraftData.Get))] - private static void GetRecipePostfix(TechType techType, ref ITechData __result) + [HarmonyPatch(typeof(CraftData), nameof(CraftData.Get)), HarmonyPrefix, HarmonyPriority(Priority.First)] + private static void GetRecipePrefix(TechType techType) { - if (CustomRecipeData.TryGetValue(techType, out var customTechData) && (__result == null || !customTechData.SameAs(__result))) + if (CustomRecipeData.TryGetValue(techType, out var customTechData) && (!CraftData.techData.TryGetValue(techType, out var current) || !customTechData.SameAs(current))) { CraftData.techData[techType] = customTechData.ConvertToTechData(techType); - __result = customTechData; } } } diff --git a/Nautilus/Patchers/CraftTreePatcher.cs b/Nautilus/Patchers/CraftTreePatcher.cs index b7f5dc24..41b7761b 100644 --- a/Nautilus/Patchers/CraftTreePatcher.cs +++ b/Nautilus/Patchers/CraftTreePatcher.cs @@ -19,6 +19,14 @@ internal class CraftTreePatcher internal static Dictionary> CraftingNodes = new(); internal static Dictionary> TabNodes = new(); internal static Dictionary CachedTrees = new(); + internal static Dictionary Fallbacks = new() + { + { CraftTree.Type.Workbench, TechType.Workbench }, + { CraftTree.Type.Fabricator, TechType.Fabricator }, + { CraftTree.Type.Constructor, TechType.Constructor }, + { CraftTree.Type.SeamothUpgrades, TechType.BaseUpgradeConsole }, + { CraftTree.Type.MapRoom, TechType.BaseMapRoom } + }; private const string FallbackTabNode = "Modded"; private const string VanillaRoot = "Vanilla"; @@ -35,30 +43,23 @@ internal static void Patch(Harmony harmony) private static void CreateFallbackNodes() { - // Workbench CreateVanillaTabNode(CraftTree.Type.Workbench, "Modification Station", TechType.Workbench, CraftTree.WorkbenchScheme().root); - CraftTreeHandler.AddTabNode(CraftTree.Type.Workbench, FallbackTabNode + CraftTree.Type.Workbench, "Mod Items", SpriteManager.Get(TechType.Workbench)); - - // Fabricator - CraftTreeHandler.AddTabNode(CraftTree.Type.Fabricator, FallbackTabNode + CraftTree.Type.Fabricator, "Mod Items", SpriteManager.Get(TechType.Fabricator)); - - // Constructor - CraftTreeHandler.AddTabNode(CraftTree.Type.Constructor, FallbackTabNode + CraftTree.Type.Constructor, "Mod Items", SpriteManager.Get(TechType.Constructor)); - - // Seamoth Upgrades - CraftTreeHandler.AddTabNode(CraftTree.Type.SeamothUpgrades, FallbackTabNode + CraftTree.Type.SeamothUpgrades, "Mod Items", SpriteManager.Get(TechType.BaseUpgradeConsole)); - - // Map Room CreateVanillaTabNode(CraftTree.Type.MapRoom, "Scanner Upgrades", TechType.BaseMapRoom, CraftTree.MapRoomSheme().root); - CraftTreeHandler.AddTabNode(CraftTree.Type.MapRoom, FallbackTabNode + CraftTree.Type.MapRoom, "Mod Items", SpriteManager.Get(TechType.BaseMapRoom)); + #if SUBNAUTICA - // Cyclops Fabricator CreateVanillaTabNode(CraftTree.Type.CyclopsFabricator, "Cyclops Fabricator", TechType.Cyclops, CraftTree.CyclopsFabricatorScheme().root); - CraftTreeHandler.AddTabNode(CraftTree.Type.CyclopsFabricator, FallbackTabNode + CraftTree.Type.CyclopsFabricator, "Mod Items", SpriteManager.Get(TechType.Cyclops)); + Fallbacks.Add(CraftTree.Type.CyclopsFabricator, TechType.Cyclops); #elif BELOWZERO - // SeaTruck Fabricator - CraftTreeHandler.AddTabNode(CraftTree.Type.SeaTruckFabricator, FallbackTabNode+CraftTree.Type.SeaTruckFabricator, "Mod Items", SpriteManager.Get(TechType.SeaTruckFabricator)); + Fallbacks.Add(CraftTree.Type.SeaTruckFabricator, TechType.SeaTruckFabricator); #endif + + foreach (var pair in Fallbacks) + CreateFallbackNode(pair.Key, pair.Value); + } + + private static void CreateFallbackNode(CraftTree.Type craftTreeType, TechType techTypeForSprite) + { + CraftTreeHandler.AddTabNode(craftTreeType, FallbackTabNode + craftTreeType, "Mod Items", SpriteManager.Get(techTypeForSprite)); } private static void CreateVanillaTabNode(CraftTree.Type treeType, string DisplayName, TechType spriteTechType, TreeNode root) @@ -162,8 +163,13 @@ private static void PatchNodes(ref CraftTree tree, CraftTree.Type type) { if (!TraverseTree(tree.nodes, customNode.Path, out var currentNode)) { - InternalLogger.Error($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the parent node could not be found."); - continue; + InternalLogger.Warn($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the parent node could not be found."); + + if (!TraverseTree(tree.nodes, new[] { FallbackTabNode + customNode.Scheme }, out currentNode)) + { + InternalLogger.Error($"Cannot add Crafting node: {customNode.TechType.AsString()} to {customNode.Scheme} at {string.Join("/", customNode.Path)} as the fallback node could not be found."); + continue; + } } if (currentNode.nodes.Any(x => x is CraftNode craftNode && craftNode.action == TreeAction.Expand)) diff --git a/Version.targets b/Version.targets index d3ee5d9e..16e98d42 100644 --- a/Version.targets +++ b/Version.targets @@ -3,7 +3,7 @@ 1.0.0 - 26 + 28 pre.$(SuffixNumber) \ No newline at end of file