diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index cdbcd8f46..89d0887b1 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -159,6 +159,12 @@ public static GameObject Make(GameObject go, Sector sector, IModBehaviour mod, G DialogueBuilder.HandleUnityCreatedDialogue(dialogue); } + // copied details need their lanterns fixed + if (!isFromAssetBundle && component is DreamLanternController lantern) + { + lantern.gameObject.AddComponent(); + } + FixComponent(component, go, detail.ignoreSun); } catch(Exception e) @@ -438,7 +444,7 @@ public void Start() 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,7 +452,8 @@ public void Start() angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } - angler.enabled = true; + // 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); Destroy(this); @@ -500,5 +507,53 @@ public void Start() Destroy(this); } } + + /// + /// need component here to run after DreamLanternController.Awake + /// + [RequireComponent(typeof(DreamLanternController))] + private class DreamLanternControllerFixer : MonoBehaviour + { + private void Start() + { + // based on https://github.com/Bwc9876/OW-Amogus/blob/master/Amogus/LanternCreator.cs + // needed to fix petals looking backwards, among other things + + var lantern = GetComponent(); + + // this is set in Awake, we wanna override it + + // Manually copied these values from a artifact lantern so that we don't have to find it (works in Eye) + lantern._origLensFlareBrightness = 0f; + lantern._focuserPetalsBaseEulerAngles = new Vector3[] + { + new Vector3(0.7f, 270.0f, 357.5f), + new Vector3(288.7f, 270.1f, 357.4f), + new Vector3(323.3f, 90.0f, 177.5f), + new Vector3(35.3f, 90.0f, 177.5f), + new Vector3(72.7f, 270.1f, 357.5f) + }; + lantern._dirtyFlag_focus = true; + lantern._concealerRootsBaseScale = new Vector3[] + { + Vector3.one, + Vector3.one, + Vector3.one + }; + lantern._concealerCoversStartPos = new Vector3[] + { + new Vector3(0.0f, 0.0f, 0.0f), + new Vector3(0.0f, -0.1f, 0.0f), + new Vector3(0.0f, -0.2f, 0.0f), + new Vector3(0.0f, 0.2f, 0.0f), + new Vector3(0.0f, 0.1f, 0.0f), + new Vector3(0.0f, 0.0f, 0.0f) + }; + lantern._dirtyFlag_concealment = true; + lantern.UpdateVisuals(); + + Destroy(this); + } + } } } diff --git a/NewHorizons/Handlers/EyeDetailCacher.cs b/NewHorizons/Handlers/EyeDetailCacher.cs new file mode 100644 index 000000000..62dfb4609 --- /dev/null +++ b/NewHorizons/Handlers/EyeDetailCacher.cs @@ -0,0 +1,63 @@ +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using System.Linq; + +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}"); + if (body.Config?.Props?.details != null) + { + foreach (var detail in body.Config.Props.details) + { + 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/Main.cs b/NewHorizons/Main.cs index 3b38bd350..4df680c9e 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -341,6 +341,8 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { try { + EyeDetailCacher.Init(); + AtmosphereBuilder.InitPrefabs(); BrambleDimensionBuilder.InitPrefabs(); BrambleNodeBuilder.InitPrefabs(); @@ -967,7 +969,8 @@ public void ChangeCurrentStarSystem(string newStarSystem, bool warp = false, boo } 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 09e283d24..97a40178f 100644 --- a/NewHorizons/Utility/DebugTools/DebugReload.cs +++ b/NewHorizons/Utility/DebugTools/DebugReload.cs @@ -43,10 +43,21 @@ private static void ReloadConfigs() 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") + { + 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/OuterWilds/AstroObjectLocator.cs b/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs index c20aa7b6f..9e3a8a01d 100644 --- a/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs +++ b/NewHorizons/Utility/OuterWilds/AstroObjectLocator.cs @@ -164,6 +164,9 @@ public static GameObject[] GetChildren(AstroObject primary) .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")) diff --git a/NewHorizons/Utility/SearchUtilities.cs b/NewHorizons/Utility/SearchUtilities.cs index 9ed77826b..36e656e69 100644 --- a/NewHorizons/Utility/SearchUtilities.cs +++ b/NewHorizons/Utility/SearchUtilities.cs @@ -9,9 +9,24 @@ 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 ClearDontDestroyOnLoadCache() + { + foreach (var go in DontDestroyOnLoadCachedGameObjects.Values) + { + GameObject.Destroy(go); + } + DontDestroyOnLoadCachedGameObjects.Clear(); + } + public static void ClearCache() { NHLogger.LogVerbose("Clearing search cache"); @@ -96,6 +111,8 @@ public static GameObject FindChild(this GameObject g, string childPath) => /// 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 diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index 710599427..1d5f963ea 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -4,7 +4,7 @@ "author": "xen, Bwc9876, JohnCorby, MegaPiggy, Clay, Trifid, and friends", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "1.22.1", + "version": "1.22.2", "owmlVersion": "2.12.1", "dependencies": [ "JohnCorby.VanillaFix", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ], "conflicts": [ "PacificEngine.OW_CommonResources" ],