From 565a0575b8d56916230302a365f8a3a181073fc1 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 18 Jun 2024 21:04:00 -0400 Subject: [PATCH 1/6] Cache details used on the eye --- NewHorizons/Handlers/EyeDetailCacher.cs | 39 +++++++++++++++++++++++++ NewHorizons/Main.cs | 2 ++ NewHorizons/Utility/SearchUtilities.cs | 8 +++++ 3 files changed, 49 insertions(+) create mode 100644 NewHorizons/Handlers/EyeDetailCacher.cs diff --git a/NewHorizons/Handlers/EyeDetailCacher.cs b/NewHorizons/Handlers/EyeDetailCacher.cs new file mode 100644 index 00000000..6e9faef6 --- /dev/null +++ b/NewHorizons/Handlers/EyeDetailCacher.cs @@ -0,0 +1,39 @@ +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using System.Linq; + +namespace NewHorizons.Handlers; + +public static class EyeDetailCacher +{ + public static void Init() + { + foreach (var body in Main.BodyDict["EyeOfTheUniverse"]) + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {body.Config.name}"); + if (body.Config?.Props?.details == null) continue; + + foreach (var detail in body.Config.Props.details) + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {detail.path}"); + + + if (string.IsNullOrEmpty(detail.path)) continue; + + var planet = detail.path.Contains('/') ? detail.path.Split('/').First() : string.Empty; + + // TODO: what other root paths can we ignore + if (planet != "EyeOfTheUniverse_Body" && planet != "Vessel_Body") + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Looking for {detail.path}"); + var obj = SearchUtilities.Find(detail.path); + if (obj != null) + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Added solar system asset to dont destroy on load cache for eye: {detail.path}"); + SearchUtilities.AddToDontDestroyOnLoadCache(detail.path, obj); + } + } + } + } + } +} diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 3b38bd35..ec0325ea 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -341,6 +341,8 @@ namespace NewHorizons { try { + EyeDetailCacher.Init(); + AtmosphereBuilder.InitPrefabs(); BrambleDimensionBuilder.InitPrefabs(); BrambleNodeBuilder.InitPrefabs(); diff --git a/NewHorizons/Utility/SearchUtilities.cs b/NewHorizons/Utility/SearchUtilities.cs index 9ed77826..4bd0ca44 100644 --- a/NewHorizons/Utility/SearchUtilities.cs +++ b/NewHorizons/Utility/SearchUtilities.cs @@ -9,9 +9,15 @@ namespace NewHorizons.Utility { public static class SearchUtilities { + private static readonly Dictionary DontDestroyOnLoadCachedGameObjects = new Dictionary(); private static readonly Dictionary CachedGameObjects = new Dictionary(); private static readonly Dictionary CachedRootGameObjects = new Dictionary(); + public static void AddToDontDestroyOnLoadCache(string path, GameObject go) + { + DontDestroyOnLoadCachedGameObjects[path] = go.InstantiateInactive().DontDestroyOnLoad(); + } + public static void ClearCache() { NHLogger.LogVerbose("Clearing search cache"); @@ -96,6 +102,8 @@ namespace NewHorizons.Utility /// public static GameObject Find(string path, bool warn = true) { + if (DontDestroyOnLoadCachedGameObjects.TryGetValue(path, out var gameObject)) return gameObject; + if (CachedGameObjects.TryGetValue(path, out var go)) return go; // 1: normal find From 3530057a50ab94b1212a4d9b43077019a3bcb8c4 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 18 Jun 2024 21:16:18 -0400 Subject: [PATCH 2/6] Fix an ernesto nre in the eye --- NewHorizons/Builder/Props/DetailBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index cdbcd8f4..3d14ad07 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -446,7 +446,7 @@ namespace NewHorizons.Builder.Props angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } - angler.enabled = true; + angler.enabled = false; angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); Destroy(this); From f4bc2f1aa77010921b521daf7f4a17450f9ec397 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Sat, 15 Jun 2024 02:40:52 -0400 Subject: [PATCH 3/6] Add vessel to eye children --- NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs b/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs index c20aa7b6..9e3a8a01 100644 --- a/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs +++ b/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs @@ -164,6 +164,9 @@ namespace NewHorizons.Utility.OuterWilds .Select(x => x.gameObject) .Where(x => x.name == "SS_Debris_Body")); break; + case AstroObject.Name.Eye: + otherChildren.Add(SearchUtilities.Find("Vessel_Body")); + break; // Just in case GetChildren runs before sun station's name is changed case AstroObject.Name.CustomString: if (primary._customName.Equals("Sun Station")) From 67ef92772563a1a36116087d5238988a6db527f1 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 18 Jun 2024 22:30:40 -0400 Subject: [PATCH 4/6] Don't cache guys continuously forever, make reload configs work at eye --- NewHorizons/Handlers/EyeDetailCacher.cs | 9 ++++++++- NewHorizons/Main.cs | 3 ++- NewHorizons/Utility/DebugTools/DebugReload.cs | 16 ++++++++++++++-- NewHorizons/Utility/SearchUtilities.cs | 9 +++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/NewHorizons/Handlers/EyeDetailCacher.cs b/NewHorizons/Handlers/EyeDetailCacher.cs index 6e9faef6..289e5cba 100644 --- a/NewHorizons/Handlers/EyeDetailCacher.cs +++ b/NewHorizons/Handlers/EyeDetailCacher.cs @@ -6,8 +6,16 @@ namespace NewHorizons.Handlers; public static class EyeDetailCacher { + public static bool IsInitialized; + public static void Init() { + if (IsInitialized) return; + + SearchUtilities.ClearDontDestroyOnLoadCache(); + + IsInitialized = true; + foreach (var body in Main.BodyDict["EyeOfTheUniverse"]) { NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {body.Config.name}"); @@ -17,7 +25,6 @@ public static class EyeDetailCacher { NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {detail.path}"); - if (string.IsNullOrEmpty(detail.path)) continue; var planet = detail.path.Contains('/') ? detail.path.Split('/').First() : string.Empty; diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index ec0325ea..4df680c9 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -969,7 +969,8 @@ namespace NewHorizons } else { - PlayerData.SaveEyeCompletion(); // So that the title screen doesn't keep warping you back to eye + if (!IsWarpingBackToEye) + PlayerData.SaveEyeCompletion(); // So that the title screen doesn't keep warping you back to eye if (SystemDict[CurrentStarSystem].Config.enableTimeLoop) SecondsElapsedInLoop = TimeLoop.GetSecondsElapsed(); else SecondsElapsedInLoop = -1; diff --git a/NewHorizons/Utility/DebugTools/DebugReload.cs b/NewHorizons/Utility/DebugTools/DebugReload.cs index 09e283d2..bfadfa05 100644 --- a/NewHorizons/Utility/DebugTools/DebugReload.cs +++ b/NewHorizons/Utility/DebugTools/DebugReload.cs @@ -43,10 +43,22 @@ namespace NewHorizons.Utility.DebugTools NHLogger.LogWarning("Error While Reloading"); } + Main.Instance.ForceClearCaches = true; + + SearchUtilities.Find("/PauseMenu/PauseMenuManagers").GetComponent().OnSkipToNextTimeLoop(); - Main.Instance.ForceClearCaches = true; - Main.Instance.ChangeCurrentStarSystem(Main.Instance.CurrentStarSystem, Main.Instance.DidWarpFromShip, Main.Instance.DidWarpFromVessel); + if (Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") + { + PlayerData._currentGameSave.warpedToTheEye = true; + Main.Instance.IsWarpingBackToEye = true; + EyeDetailCacher.IsInitialized = false; + Main.Instance.ChangeCurrentStarSystem("SolarSystem"); + } + else + { + Main.Instance.ChangeCurrentStarSystem(Main.Instance.CurrentStarSystem, Main.Instance.DidWarpFromShip, Main.Instance.DidWarpFromVessel); + } Main.SecondsElapsedInLoop = -1f; } diff --git a/NewHorizons/Utility/SearchUtilities.cs b/NewHorizons/Utility/SearchUtilities.cs index 4bd0ca44..36e656e6 100644 --- a/NewHorizons/Utility/SearchUtilities.cs +++ b/NewHorizons/Utility/SearchUtilities.cs @@ -18,6 +18,15 @@ namespace NewHorizons.Utility DontDestroyOnLoadCachedGameObjects[path] = go.InstantiateInactive().DontDestroyOnLoad(); } + public static void ClearDontDestroyOnLoadCache() + { + foreach (var go in DontDestroyOnLoadCachedGameObjects.Values) + { + GameObject.Destroy(go); + } + DontDestroyOnLoadCachedGameObjects.Clear(); + } + public static void ClearCache() { NHLogger.LogVerbose("Clearing search cache"); From 804665b3a9010cf5d46ae713780927608ad98c98 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 18 Jun 2024 22:33:20 -0400 Subject: [PATCH 5/6] Ignore asset bundle guys, remove unneeded comment, comment angler stuff --- NewHorizons/Builder/Props/DetailBuilder.cs | 3 ++- NewHorizons/Handlers/EyeDetailCacher.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 3d14ad07..5700ced2 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -438,7 +438,7 @@ namespace NewHorizons.Builder.Props NHLogger.LogVerbose("Fixing anglerfish animation"); - // Remove any event reference to its angler + // Remove any event reference to its angler so that they dont change its state if (angler._anglerfishController) { angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; @@ -446,6 +446,7 @@ namespace NewHorizons.Builder.Props angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } + // Disable the angler anim controller because we don't want Update or LateUpdate to run, just need it to set the initial Animator state angler.enabled = false; angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); diff --git a/NewHorizons/Handlers/EyeDetailCacher.cs b/NewHorizons/Handlers/EyeDetailCacher.cs index 289e5cba..422e74d3 100644 --- a/NewHorizons/Handlers/EyeDetailCacher.cs +++ b/NewHorizons/Handlers/EyeDetailCacher.cs @@ -25,11 +25,11 @@ public static class EyeDetailCacher { NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {detail.path}"); + if (!string.IsNullOrEmpty(detail.assetBundle)) continue; if (string.IsNullOrEmpty(detail.path)) continue; var planet = detail.path.Contains('/') ? detail.path.Split('/').First() : string.Empty; - // TODO: what other root paths can we ignore if (planet != "EyeOfTheUniverse_Body" && planet != "Vessel_Body") { NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Looking for {detail.path}"); From aaa21aa3bacc4ccc5558217af5ffe42d939c44e3 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 18 Jun 2024 22:48:13 -0400 Subject: [PATCH 6/6] Make scatter work too and dont set warpedToEye since its unneeded --- NewHorizons/Handlers/EyeDetailCacher.cs | 53 ++++++++++++------- NewHorizons/Utility/DebugTools/DebugReload.cs | 1 - 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/NewHorizons/Handlers/EyeDetailCacher.cs b/NewHorizons/Handlers/EyeDetailCacher.cs index 422e74d3..62dfb460 100644 --- a/NewHorizons/Handlers/EyeDetailCacher.cs +++ b/NewHorizons/Handlers/EyeDetailCacher.cs @@ -19,28 +19,45 @@ public static class EyeDetailCacher foreach (var body in Main.BodyDict["EyeOfTheUniverse"]) { NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {body.Config.name}"); - if (body.Config?.Props?.details == null) continue; - - foreach (var detail in body.Config.Props.details) + if (body.Config?.Props?.details != null) { - NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {detail.path}"); - - if (!string.IsNullOrEmpty(detail.assetBundle)) continue; - if (string.IsNullOrEmpty(detail.path)) continue; - - var planet = detail.path.Contains('/') ? detail.path.Split('/').First() : string.Empty; - - if (planet != "EyeOfTheUniverse_Body" && planet != "Vessel_Body") + foreach (var detail in body.Config.Props.details) { - NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Looking for {detail.path}"); - var obj = SearchUtilities.Find(detail.path); - if (obj != null) - { - NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Added solar system asset to dont destroy on load cache for eye: {detail.path}"); - SearchUtilities.AddToDontDestroyOnLoadCache(detail.path, obj); - } + if (!string.IsNullOrEmpty(detail.assetBundle)) continue; + + AddPathToCache(detail.path); + } + } + + if (body.Config?.Props?.scatter != null) + { + foreach (var scatter in body.Config.Props.scatter) + { + if (!string.IsNullOrEmpty(scatter.assetBundle)) continue; + + AddPathToCache(scatter.path); } } } } + + private static void AddPathToCache(string path) + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: {path}"); + + if (string.IsNullOrEmpty(path)) return; + + var planet = path.Contains('/') ? path.Split('/').First() : string.Empty; + + if (planet != "EyeOfTheUniverse_Body" && planet != "Vessel_Body") + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Looking for {path}"); + var obj = SearchUtilities.Find(path); + if (obj != null) + { + NHLogger.LogVerbose($"{nameof(EyeDetailCacher)}: Added solar system asset to dont destroy on load cache for eye: {path}"); + SearchUtilities.AddToDontDestroyOnLoadCache(path, obj); + } + } + } } diff --git a/NewHorizons/Utility/DebugTools/DebugReload.cs b/NewHorizons/Utility/DebugTools/DebugReload.cs index bfadfa05..97a40178 100644 --- a/NewHorizons/Utility/DebugTools/DebugReload.cs +++ b/NewHorizons/Utility/DebugTools/DebugReload.cs @@ -50,7 +50,6 @@ namespace NewHorizons.Utility.DebugTools if (Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") { - PlayerData._currentGameSave.warpedToTheEye = true; Main.Instance.IsWarpingBackToEye = true; EyeDetailCacher.IsInitialized = false; Main.Instance.ChangeCurrentStarSystem("SolarSystem");