From e9a400cadf257126322b67d18b7b633b00c41a7b Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 12 May 2022 15:42:09 -0400 Subject: [PATCH 01/20] Add removeComponents option to DetailBuilder --- NewHorizons/Builder/Props/DetailBuilder.cs | 17 +++++++++++++++-- NewHorizons/External/PropModule.cs | 1 + NewHorizons/schema.json | 5 +++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 5343557d..ee320f9b 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -51,6 +51,20 @@ namespace NewHorizons.Builder.Props else Logger.LogWarning($"Couldn't find {childPath}"); } } + + if(detailGO != null && detail.removeComponents) + { + // Just swap all the children to a new game object + var newDetailGO = new GameObject(detailGO.name); + newDetailGO.transform.position = detailGO.transform.position; + newDetailGO.transform.parent = detailGO.transform.parent; + foreach(Transform child in detailGO.transform.GetComponentsInChildren()) + { + child.parent = newDetailGO.transform; + } + GameObject.Destroy(detailGO); + detailGO = newDetailGO; + } } public static GameObject MakeDetail(GameObject go, Sector sector, string propToClone, MVector3 position, MVector3 rotation, float scale, bool alignWithNormal) @@ -153,12 +167,11 @@ namespace NewHorizons.Builder.Props prop.transform.position = position == null ? planetGO.transform.position : planetGO.transform.TransformPoint((Vector3)position); Quaternion rot = rotation == null ? Quaternion.identity : Quaternion.Euler((Vector3)rotation); - prop.transform.rotation = planetGO.transform.TransformRotation(Quaternion.identity); if (alignWithNormal) { // Apply the rotation after aligning it with normal var up = planetGO.transform.InverseTransformPoint(prop.transform.position).normalized; - prop.transform.rotation = Quaternion.FromToRotation(prop.transform.up, up) * prop.transform.rotation; + prop.transform.rotation = Quaternion.FromToRotation(Vector3.up, up); prop.transform.rotation *= rot; } else diff --git a/NewHorizons/External/PropModule.cs b/NewHorizons/External/PropModule.cs index 80b982e2..2bf7cbc3 100644 --- a/NewHorizons/External/PropModule.cs +++ b/NewHorizons/External/PropModule.cs @@ -43,6 +43,7 @@ namespace NewHorizons.External public float scale { get; set; } = 1f; public bool alignToNormal; public string[] removeChildren; + public bool removeComponents; } public class RaftInfo diff --git a/NewHorizons/schema.json b/NewHorizons/schema.json index c70c6faa..9ef93fd7 100644 --- a/NewHorizons/schema.json +++ b/NewHorizons/schema.json @@ -666,6 +666,11 @@ "items": { "type": "string" } + }, + "removeComponents": { + "type": "boolean", + "description": "Do we reset all the components on this object? Useful for certain props that have dialogue components attached to them.", + "default": false } } } From b4739ce67f05019fa6ee11f260bfbe15fd6f30e6 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 12 May 2022 18:31:48 -0400 Subject: [PATCH 02/20] Move stretch --- .../Builder/Body/Geometry/CubeSphere.cs | 37 +------------------ NewHorizons/Builder/Body/HeightMapBuilder.cs | 3 +- 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/NewHorizons/Builder/Body/Geometry/CubeSphere.cs b/NewHorizons/Builder/Body/Geometry/CubeSphere.cs index 113dfbbd..96f58006 100644 --- a/NewHorizons/Builder/Body/Geometry/CubeSphere.cs +++ b/NewHorizons/Builder/Body/Geometry/CubeSphere.cs @@ -11,7 +11,7 @@ namespace NewHorizons.Builder.Body.Geometry { static class CubeSphere { - public static Mesh Build(int resolution, Texture2D heightMap, float minHeight, float maxHeight, Vector3 stretch) + public static Mesh Build(int resolution, Texture2D heightMap, float minHeight, float maxHeight) { // It breaks if resolution is greater than 100 I don't know why if(resolution > 100) @@ -23,24 +23,7 @@ namespace NewHorizons.Builder.Body.Geometry Mesh mesh = new Mesh(); mesh.name = "CubeSphere"; - float max = 1; - if (stretch.x > stretch.y && stretch.x > stretch.z) - max = stretch.x; - else if (stretch.y > stretch.x && stretch.y > stretch.z) - max = stretch.y; - else if (stretch.z > stretch.x && stretch.z > stretch.y) - max = stretch.z; - else if (stretch.y == stretch.z && stretch.x > stretch.y) - max = stretch.x; - else if (stretch.x == stretch.z && stretch.y > stretch.x) - max = stretch.y; - else if (stretch.x == stretch.y && stretch.z > stretch.x) - max = stretch.z; - minHeight /= max; - maxHeight /= max; - CreateVertices(mesh, resolution, heightMap, minHeight, maxHeight); - StretchVertices(mesh, stretch); CreateTriangles(mesh, resolution); mesh.RecalculateNormals(); @@ -50,24 +33,6 @@ namespace NewHorizons.Builder.Body.Geometry return mesh; } - private static void StretchVertices(Mesh mesh, Vector3 scale) - { - var baseVertices = mesh.vertices; - - var vertices = new Vector3[baseVertices.Length]; - - for (var i = 0; i < vertices.Length; i++) - { - var vertex = baseVertices[i]; - vertex.x = vertex.x * scale.x; - vertex.y = vertex.y * scale.y; - vertex.z = vertex.z * scale.z; - vertices[i] = vertex; - } - - mesh.vertices = vertices; - } - // Thank you Catlikecoding private static void CreateVertices(Mesh mesh, int resolution, Texture2D heightMap, float minHeight, float maxHeight) { diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index 5fa0e752..2a89748f 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -37,8 +37,9 @@ namespace NewHorizons.Builder.Body cubeSphere.SetActive(false); cubeSphere.transform.parent = sector?.transform ?? planetGO.transform; cubeSphere.transform.rotation = Quaternion.Euler(90, 0, 0); + cubeSphere.transform.localScale = module.Stretch; - Mesh mesh = CubeSphere.Build(51, heightMap, module.MinHeight, module.MaxHeight, module.Stretch); + Mesh mesh = CubeSphere.Build(51, heightMap, module.MinHeight, module.MaxHeight); cubeSphere.AddComponent(); cubeSphere.GetComponent().mesh = mesh; From 6f7314726ac64aa2040f87114775b82904e672c2 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 12 May 2022 18:51:13 -0400 Subject: [PATCH 03/20] Move Default --- NewHorizons/Builder/Body/HeightMapBuilder.cs | 3 ++- NewHorizons/External/HeightMapModule.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index 2a89748f..5f486915 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -37,7 +37,8 @@ namespace NewHorizons.Builder.Body cubeSphere.SetActive(false); cubeSphere.transform.parent = sector?.transform ?? planetGO.transform; cubeSphere.transform.rotation = Quaternion.Euler(90, 0, 0); - cubeSphere.transform.localScale = module.Stretch; + if (module.Stretch != null) cubeSphere.transform.localScale = module.Stretch; + else cubeSphere.transform.localScale = Vector3.one; Mesh mesh = CubeSphere.Build(51, heightMap, module.MinHeight, module.MaxHeight); diff --git a/NewHorizons/External/HeightMapModule.cs b/NewHorizons/External/HeightMapModule.cs index ea81c16e..f859e949 100644 --- a/NewHorizons/External/HeightMapModule.cs +++ b/NewHorizons/External/HeightMapModule.cs @@ -9,6 +9,6 @@ namespace NewHorizons.External public string TextureMap { get; set; } public float MinHeight { get; set; } public float MaxHeight { get; set; } - public MVector3 Stretch { get; set; } = (MVector3)Vector3.one; + public MVector3 Stretch { get; set; } } } From b6c5c4b637e89802484f5f3063c1436f435793a3 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 12 May 2022 19:18:17 -0400 Subject: [PATCH 04/20] Readd mesh stretch --- .../Builder/Body/Geometry/CubeSphere.cs | 37 ++++++++++++++++++- NewHorizons/Builder/Body/HeightMapBuilder.cs | 5 +-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/NewHorizons/Builder/Body/Geometry/CubeSphere.cs b/NewHorizons/Builder/Body/Geometry/CubeSphere.cs index 96f58006..113dfbbd 100644 --- a/NewHorizons/Builder/Body/Geometry/CubeSphere.cs +++ b/NewHorizons/Builder/Body/Geometry/CubeSphere.cs @@ -11,7 +11,7 @@ namespace NewHorizons.Builder.Body.Geometry { static class CubeSphere { - public static Mesh Build(int resolution, Texture2D heightMap, float minHeight, float maxHeight) + public static Mesh Build(int resolution, Texture2D heightMap, float minHeight, float maxHeight, Vector3 stretch) { // It breaks if resolution is greater than 100 I don't know why if(resolution > 100) @@ -23,7 +23,24 @@ namespace NewHorizons.Builder.Body.Geometry Mesh mesh = new Mesh(); mesh.name = "CubeSphere"; + float max = 1; + if (stretch.x > stretch.y && stretch.x > stretch.z) + max = stretch.x; + else if (stretch.y > stretch.x && stretch.y > stretch.z) + max = stretch.y; + else if (stretch.z > stretch.x && stretch.z > stretch.y) + max = stretch.z; + else if (stretch.y == stretch.z && stretch.x > stretch.y) + max = stretch.x; + else if (stretch.x == stretch.z && stretch.y > stretch.x) + max = stretch.y; + else if (stretch.x == stretch.y && stretch.z > stretch.x) + max = stretch.z; + minHeight /= max; + maxHeight /= max; + CreateVertices(mesh, resolution, heightMap, minHeight, maxHeight); + StretchVertices(mesh, stretch); CreateTriangles(mesh, resolution); mesh.RecalculateNormals(); @@ -33,6 +50,24 @@ namespace NewHorizons.Builder.Body.Geometry return mesh; } + private static void StretchVertices(Mesh mesh, Vector3 scale) + { + var baseVertices = mesh.vertices; + + var vertices = new Vector3[baseVertices.Length]; + + for (var i = 0; i < vertices.Length; i++) + { + var vertex = baseVertices[i]; + vertex.x = vertex.x * scale.x; + vertex.y = vertex.y * scale.y; + vertex.z = vertex.z * scale.z; + vertices[i] = vertex; + } + + mesh.vertices = vertices; + } + // Thank you Catlikecoding private static void CreateVertices(Mesh mesh, int resolution, Texture2D heightMap, float minHeight, float maxHeight) { diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index 5f486915..c0d15865 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -37,10 +37,9 @@ namespace NewHorizons.Builder.Body cubeSphere.SetActive(false); cubeSphere.transform.parent = sector?.transform ?? planetGO.transform; cubeSphere.transform.rotation = Quaternion.Euler(90, 0, 0); - if (module.Stretch != null) cubeSphere.transform.localScale = module.Stretch; - else cubeSphere.transform.localScale = Vector3.one; - Mesh mesh = CubeSphere.Build(51, heightMap, module.MinHeight, module.MaxHeight); + Vector3 stretch = module.Stretch != null ? (Vector3)module.Stretch : Vector3.one; + Mesh mesh = CubeSphere.Build(51, heightMap, module.MinHeight, module.MaxHeight, stretch); cubeSphere.AddComponent(); cubeSphere.GetComponent().mesh = mesh; From e27455bfb15b0748e42eb3062e51d3aac4b588e3 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 12 May 2022 19:49:02 -0400 Subject: [PATCH 05/20] Add enableTimeLoop to system configs --- .../Builder/StarSystem/SkyboxBuilder.cs | 2 +- NewHorizons/Components/TimeLoopController.cs | 36 +++++++++++++++++++ .../External/Configs/StarSystemConfig.cs | 1 + NewHorizons/Handlers/PlanetCreationHandler.cs | 1 + .../Handlers/PlanetDestructionHandler.cs | 4 +++ NewHorizons/Handlers/SystemCreationHandler.cs | 8 +++-- NewHorizons/Main.cs | 27 +++++++++++++- NewHorizons/Utility/DebugReload.cs | 2 ++ NewHorizons/star_system_schema.json | 5 +++ 9 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 NewHorizons/Components/TimeLoopController.cs diff --git a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs index f3557854..b4066abc 100644 --- a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs +++ b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs @@ -8,7 +8,7 @@ using Object = System.Object; namespace NewHorizons.Builder.StarSystem { - internal class SkyboxBuilder + public class SkyboxBuilder { public static Material LoadMaterial(string assetBundle, string path, string uniqueModName, IModBehaviour mod) { diff --git a/NewHorizons/Components/TimeLoopController.cs b/NewHorizons/Components/TimeLoopController.cs new file mode 100644 index 00000000..0ad6a7ef --- /dev/null +++ b/NewHorizons/Components/TimeLoopController.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Components +{ + public class TimeLoopController : MonoBehaviour + { + private float _supernovaTime; + private bool _supernovaHappened; + + public void Start() + { + GlobalMessenger.AddListener("TriggerSupernova", OnTriggerSupernova); + } + + public void Update() + { + // Stock gives like 33 seconds after the sun collapses + // Gonna assume it takes like 7 seconds to collapse after the supernova trigger + if(_supernovaHappened && Time.time > _supernovaTime + 40f) + { + Locator.GetDeathManager().KillPlayer(DeathType.TimeLoop); + } + } + + public void OnTriggerSupernova() + { + _supernovaHappened = true; + _supernovaTime = Time.time; + } + } +} diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs index f0c2be3a..1447dd8d 100644 --- a/NewHorizons/External/Configs/StarSystemConfig.cs +++ b/NewHorizons/External/Configs/StarSystemConfig.cs @@ -13,6 +13,7 @@ namespace NewHorizons.External.Configs public bool startHere = false; public bool destroyStockPlanets = true; public string factRequiredForWarp; + public bool enableTimeLoop = true; public NomaiCoordinates coords; public SkyboxConfig skybox; diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 5ae66008..0c963484 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -586,6 +586,7 @@ namespace NewHorizons.Handlers { foreach (var childChild in AstroObjectLocator.GetChildren(childAO)) { + if (childChild == null) continue; var dPos = childChild.transform.position - child.transform.position; childChild.transform.position = go.transform.position + relativeMoonPositions[i] + dPos; } diff --git a/NewHorizons/Handlers/PlanetDestructionHandler.cs b/NewHorizons/Handlers/PlanetDestructionHandler.cs index 44a63647..9b79631d 100644 --- a/NewHorizons/Handlers/PlanetDestructionHandler.cs +++ b/NewHorizons/Handlers/PlanetDestructionHandler.cs @@ -80,6 +80,7 @@ namespace NewHorizons.Handlers else if (ao.GetAstroObjectName() == AstroObject.Name.CaveTwin || ao.GetAstroObjectName() == AstroObject.Name.TowerTwin) { DisableBody(GameObject.Find("FocalBody"), delete); + DisableBody(GameObject.Find("SandFunnel_Body"), delete); } else if (ao.GetAstroObjectName() == AstroObject.Name.MapSatellite) { @@ -132,6 +133,9 @@ namespace NewHorizons.Handlers Logger.Log($"Destroying SunProxy {sunProxy.gameObject.name}"); GameObject.Destroy(sunProxy.gameObject); } + + // Stop the sun from breaking stuff when the supernova gets triggered + GlobalMessenger.RemoveListener("TriggerSupernova", ao.GetComponent().OnTriggerSupernova); } // Just delete the children diff --git a/NewHorizons/Handlers/SystemCreationHandler.cs b/NewHorizons/Handlers/SystemCreationHandler.cs index ad50a626..60208699 100644 --- a/NewHorizons/Handlers/SystemCreationHandler.cs +++ b/NewHorizons/Handlers/SystemCreationHandler.cs @@ -9,6 +9,7 @@ using NewHorizons.Builder.StarSystem; using UnityEngine; using Logger = NewHorizons.Utility.Logger; using Object = UnityEngine.Object; +using NewHorizons.Components; namespace NewHorizons.Handlers { @@ -16,8 +17,6 @@ namespace NewHorizons.Handlers { public static void LoadSystem(NewHorizonsSystem system) { - - var skybox = GameObject.Find("Skybox/Starfield"); if (system.Config.skybox?.destroyStarField ?? false) @@ -30,6 +29,11 @@ namespace NewHorizons.Handlers SkyboxBuilder.Make(system.Config.skybox, system.Mod); } + if(system.Config.enableTimeLoop) + { + var timeLoopController = new GameObject("TimeLoopController"); + timeLoopController.AddComponent(); + } } } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index ba857f29..9290c3d9 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -44,6 +44,8 @@ namespace NewHorizons public static Dictionary AssetBundles = new Dictionary(); public static List MountedAddons = new List(); + public static float SecondsLeftInLoop = -1; + public static bool IsSystemReady { get; private set; } public static float FurthestOrbit { get; set; } = 50000f; @@ -179,6 +181,28 @@ namespace NewHorizons { Logger.Log($"Scene Loaded: {scene.name} {mode}"); + // Set time loop stuff if its enabled and if we're warping to a new place + if(_isChangingStarSystem && (SystemDict[_currentStarSystem].Config.enableTimeLoop || _currentStarSystem == "SolarSystem") && SecondsLeftInLoop > 0f) + { + TimeLoop.SetSecondsRemaining(SecondsLeftInLoop); + // Prevent the OPC from firing + var launchController = GameObject.FindObjectOfType(); + if(launchController != null) + { + GlobalMessenger.RemoveListener("StartOfTimeLoop", launchController.OnStartOfTimeLoop); + foreach(var fakeDebris in launchController._fakeDebrisBodies) + { + fakeDebris.gameObject.SetActive(false); + } + launchController.enabled = false; + } + var nomaiProbe = GameObject.Find("NomaiProbe_Body"); + if(nomaiProbe != null) nomaiProbe.gameObject.SetActive(false); + } + + // Reset this + SecondsLeftInLoop = -1; + _isChangingStarSystem = false; if (scene.name == "TitleScreen" && _useCustomTitleScreen) @@ -407,11 +431,12 @@ namespace NewHorizons if(newStarSystem == "EyeOfTheUniverse") { - PlayerData.SaveWarpedToTheEye(60); + PlayerData.SaveWarpedToTheEye(TimeLoop.GetSecondsRemaining()); LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToBlack, 0.1f, true); } else { + SecondsLeftInLoop = TimeLoop.GetSecondsRemaining(); LoadManager.LoadSceneAsync(OWScene.SolarSystem, true, LoadManager.FadeType.ToBlack, 0.1f, true); } } diff --git a/NewHorizons/Utility/DebugReload.cs b/NewHorizons/Utility/DebugReload.cs index ecbfb00d..2dc0a2cc 100644 --- a/NewHorizons/Utility/DebugReload.cs +++ b/NewHorizons/Utility/DebugReload.cs @@ -50,6 +50,8 @@ namespace NewHorizons.Utility GameObject.Find("/PauseMenu/PauseMenuManagers").GetComponent().OnSkipToNextTimeLoop(); Main.Instance.ChangeCurrentStarSystem(Main.Instance.CurrentStarSystem); + + Main.SecondsLeftInLoop = -1f; } } } \ No newline at end of file diff --git a/NewHorizons/star_system_schema.json b/NewHorizons/star_system_schema.json index be3573b1..b8557a98 100644 --- a/NewHorizons/star_system_schema.json +++ b/NewHorizons/star_system_schema.json @@ -20,6 +20,11 @@ "type": "bool", "description": "Do you want a clean slate for this star system? Or will it be a modified version of the original." }, + "enableTimeLoop": { + "type": "bool", + "description": "Should the player be sent back in time after 22 minutes?", + "default": true + }, "skybox": { "type": "object", "description": "Options for the skybox of your system", From 80c61e5261e0450f4e9d5a13dd21db1bfceea838 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 12 May 2022 19:54:15 -0400 Subject: [PATCH 06/20] Rigidbody Null Check --- NewHorizons/Builder/Body/CloakBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NewHorizons/Builder/Body/CloakBuilder.cs b/NewHorizons/Builder/Body/CloakBuilder.cs index 8080bddb..fa34415b 100644 --- a/NewHorizons/Builder/Body/CloakBuilder.cs +++ b/NewHorizons/Builder/Body/CloakBuilder.cs @@ -28,7 +28,7 @@ namespace NewHorizons.Builder.Body cloakFieldController._innerCloakRadius = radius * 900 / 3000f; cloakFieldController._nearCloakRadius = radius * 800 / 3000f; - cloakFieldController._referenceFrameVolume = planetGO.GetAttachedOWRigidbody()._attachedRFVolume; + cloakFieldController._referenceFrameVolume = planetGO.GetAttachedOWRigidbody()?._attachedRFVolume; cloakFieldController._exclusionSector = null; var cloakSectorController = newCloak.AddComponent(); From 646f2649d7eae6c965a26df1c6cc878e4d2131ea Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 12 May 2022 20:03:18 -0400 Subject: [PATCH 07/20] Cloak Rigidbody --- NewHorizons/Builder/Body/CloakBuilder.cs | 4 ++-- NewHorizons/Handlers/PlanetCreationHandler.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NewHorizons/Builder/Body/CloakBuilder.cs b/NewHorizons/Builder/Body/CloakBuilder.cs index fa34415b..9a509517 100644 --- a/NewHorizons/Builder/Body/CloakBuilder.cs +++ b/NewHorizons/Builder/Body/CloakBuilder.cs @@ -11,7 +11,7 @@ namespace NewHorizons.Builder.Body { public static class CloakBuilder { - public static void Make(GameObject planetGO, Sector sector, float radius) + public static void Make(GameObject planetGO, Sector sector, OWRigidbody OWRB, float radius) { var cloak = SearchUtilities.Find("RingWorld_Body/CloakingField_IP"); @@ -28,7 +28,7 @@ namespace NewHorizons.Builder.Body cloakFieldController._innerCloakRadius = radius * 900 / 3000f; cloakFieldController._nearCloakRadius = radius * 800 / 3000f; - cloakFieldController._referenceFrameVolume = planetGO.GetAttachedOWRigidbody()?._attachedRFVolume; + cloakFieldController._referenceFrameVolume = OWRB._attachedRFVolume; cloakFieldController._exclusionSector = null; var cloakSectorController = newCloak.AddComponent(); diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 5ae66008..85ee64af 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -498,7 +498,7 @@ namespace NewHorizons.Handlers // Has to go last probably if (body.Config.Base.CloakRadius != 0f) { - CloakBuilder.Make(go, sector, body.Config.Base.CloakRadius); + CloakBuilder.Make(go, sector, rb, body.Config.Base.CloakRadius); } return go; From 23e245ff82a8c1b27a427573d3fed1b1656f3301 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 12 May 2022 20:21:52 -0400 Subject: [PATCH 08/20] Fix removeComponents --- NewHorizons/Builder/Props/DetailBuilder.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index ee320f9b..3779fd50 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -58,7 +58,13 @@ namespace NewHorizons.Builder.Props var newDetailGO = new GameObject(detailGO.name); newDetailGO.transform.position = detailGO.transform.position; newDetailGO.transform.parent = detailGO.transform.parent; - foreach(Transform child in detailGO.transform.GetComponentsInChildren()) + // Can't modify parents while looping through children bc idk + var children = new List(); + foreach(Transform child in detailGO.transform) + { + children.Add(child); + } + foreach(var child in children) { child.parent = newDetailGO.transform; } From 0a7e1411d9f3ac0e2f97a5599b2afe4c118b28c0 Mon Sep 17 00:00:00 2001 From: Noah Pilarski Date: Thu, 12 May 2022 22:49:16 -0400 Subject: [PATCH 09/20] Add Nomai Text Schema --- NewHorizons/text_schema.xsd | 112 ++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 NewHorizons/text_schema.xsd diff --git a/NewHorizons/text_schema.xsd b/NewHorizons/text_schema.xsd new file mode 100644 index 00000000..19cc2392 --- /dev/null +++ b/NewHorizons/text_schema.xsd @@ -0,0 +1,112 @@ + + + + + + + + + + + The different text blocks of this object + + + + + + + The conditions for unlocking ship log facts + + + + + + + + + + + + + + + + + The id of this text block + + + + + + + The id of the parent text block + + + + + + + + + + + + + + + + + + + The text to show for this option + + + + + + + + + + + + + + + + + + + + + + + + + Facts to reveal when the player goes through this dialogue node + + + + + + + + + + + + + The ID of a fact to reveal + + + + + + + The text block ids (separated by commas) that need to be read to reveal that fact + + + + + + \ No newline at end of file From 8d1f5c3bee0b9c2134efd7cb62b8b40fd7b7f0a3 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 02:24:14 -0400 Subject: [PATCH 10/20] Fix the colour between cloud layers --- .../Builder/Atmosphere/VolumesBuilder.cs | 21 ++++++++++++++----- NewHorizons/Handlers/PlanetCreationHandler.cs | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs index 2fb722fc..bb27a514 100644 --- a/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/VolumesBuilder.cs @@ -8,8 +8,11 @@ namespace NewHorizons.Builder.Atmosphere { public static class VolumesBuilder { - public static void Make(GameObject planetGO, float innerRadius, float outerRadius, bool useMiniMap) + public static void Make(GameObject planetGO, IPlanetConfig config, float sphereOfInfluence) { + var innerRadius = config.Base.SurfaceSize; + var useMiniMap = config.Base.IsSatellite; + GameObject volumesGO = new GameObject("Volumes"); volumesGO.SetActive(false); volumesGO.transform.parent = planetGO.transform; @@ -23,20 +26,28 @@ namespace NewHorizons.Builder.Atmosphere SS.SetLayer(Shape.Layer.Sector); SS.layerMask = -1; SS.pointChecksOnly = true; - SS.radius = outerRadius; + SS.radius = sphereOfInfluence; rulesetGO.AddComponent(); PlanetoidRuleset PR = rulesetGO.AddComponent(); PR._altitudeFloor = innerRadius; - PR._altitudeCeiling = outerRadius; + PR._altitudeCeiling = sphereOfInfluence; PR._useMinimap = useMiniMap; PR._useAltimeter = useMiniMap; EffectRuleset ER = rulesetGO.AddComponent(); ER._type = EffectRuleset.BubbleType.Underwater; - ER._material = GameObject.Find("RulesetVolumes_GD").GetComponent().GetValue("_material"); - ER._cloudMaterial = GameObject.Find("RulesetVolumes_GD").GetComponent().GetValue("_cloudMaterial"); + var gdRuleset = GameObject.Find("GiantsDeep_Body/Sector_GD/Volumes_GD/RulesetVolumes_GD").GetComponent(); + + ER._material = gdRuleset._material; + + var cloudMaterial = new Material(gdRuleset._cloudMaterial); + if (config.Atmosphere?.CloudTint != null) + { + cloudMaterial.SetColor("_FogColor", config.Atmosphere.CloudTint.ToColor32()); + } + ER._cloudMaterial = cloudMaterial; volumesGO.transform.position = planetGO.transform.position; rulesetGO.SetActive(true); diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 0c963484..95bd82cb 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -318,7 +318,7 @@ namespace NewHorizons.Handlers MarkerBuilder.Make(go, body.Config.Name, body.Config); } - VolumesBuilder.Make(go, body.Config.Base.SurfaceSize, sphereOfInfluence, !body.Config.Base.IsSatellite); + VolumesBuilder.Make(go, body.Config, sphereOfInfluence); if (body.Config.FocalPoint != null) { From ba2a9722fb36c6f78fc7c2b8de18344ab499a33f Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 02:24:28 -0400 Subject: [PATCH 11/20] Got some proc gen materials for later --- NewHorizons/Builder/Body/ProcGenBuilder.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NewHorizons/Builder/Body/ProcGenBuilder.cs b/NewHorizons/Builder/Body/ProcGenBuilder.cs index af7222c7..77f38d84 100644 --- a/NewHorizons/Builder/Body/ProcGenBuilder.cs +++ b/NewHorizons/Builder/Body/ProcGenBuilder.cs @@ -12,8 +12,15 @@ namespace NewHorizons.Builder.Body { public static class ProcGenBuilder { + private static Material quantumMaterial; + private static Material iceMaterial; + public static void Make(GameObject planetGO, Sector sector, ProcGenModule module) { + if(quantumMaterial == null) quantumMaterial = SearchUtilities.FindResourceOfTypeAndName("Rock_QM_EyeRock_mat"); + if(iceMaterial == null) iceMaterial = SearchUtilities.FindResourceOfTypeAndName("Rock_BH_IceSpike_mat"); + + GameObject icosphere = new GameObject("Icosphere"); icosphere.transform.parent = sector?.transform ?? planetGO.transform; icosphere.transform.rotation = Quaternion.Euler(90, 0, 0); From e9106ad88e4ab0cba5a4bac706b3066b2568eded Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 14:12:58 -0400 Subject: [PATCH 12/20] Fix cloud fog when using basic shader --- .../Builder/Atmosphere/CloudsBuilder.cs | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index 5289156e..9156b2e3 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -11,6 +11,7 @@ namespace NewHorizons.Builder.Atmosphere public static class CloudsBuilder { private static Shader _sphereShader = null; + private static Material[] _gdCloudMaterials; public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, IModBehaviour mod) { Texture2D image, cap, ramp; @@ -45,26 +46,31 @@ namespace NewHorizons.Builder.Atmosphere topMF.mesh = GameObject.Find("CloudsTopLayer_GD").GetComponent().mesh; MeshRenderer topMR = cloudsTopGO.AddComponent(); - if (!atmo.UseBasicCloudShader) + + if (_sphereShader == null) _sphereShader = Main.ShaderBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); + if (_gdCloudMaterials == null) _gdCloudMaterials = GameObject.Find("CloudsTopLayer_GD").GetComponent().sharedMaterials; + var tempArray = new Material[2]; + + if (atmo.UseBasicCloudShader) { - var tempArray = new Material[2]; - for (int i = 0; i < 2; i++) - { - var mat = new Material(GameObject.Find("CloudsTopLayer_GD").GetComponent().sharedMaterials[i]); - if (!atmo.ShadowsOnClouds) mat.renderQueue = 2550; - mat.name = atmo.ShadowsOnClouds ? "AdvancedShadowCloud" : "AdvancedCloud"; - tempArray[i] = mat; - } - topMR.sharedMaterials = tempArray; + var material = new Material(_sphereShader); + if (!atmo.ShadowsOnClouds) material.renderQueue = 2550; + material.name = atmo.ShadowsOnClouds ? "BasicShadowCloud" : "BasicCloud"; + + tempArray[0] = material; } else { - if (_sphereShader == null) _sphereShader = Main.ShaderBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); - topMR.material = new Material(_sphereShader); - if (!atmo.ShadowsOnClouds) topMR.material.renderQueue = 2550; - topMR.material.name = atmo.ShadowsOnClouds ? "BasicShadowCloud" : "BasicCloud"; + var material = new Material(_gdCloudMaterials[0]); + if (!atmo.ShadowsOnClouds) material.renderQueue = 2550; + material.name = atmo.ShadowsOnClouds ? "AdvancedShadowCloud" : "AdvancedCloud"; + tempArray[0] = material; } + // This is the stencil material for the fog under the clouds + tempArray[1] = new Material(_gdCloudMaterials[1]); + topMR.sharedMaterials = tempArray; + foreach (var material in topMR.sharedMaterials) { material.SetColor("_Color", cloudTint); @@ -80,7 +86,6 @@ namespace NewHorizons.Builder.Atmosphere cloudsTopGO.layer = LayerMask.NameToLayer("IgnoreSun"); } - RotateTransform topRT = cloudsTopGO.AddComponent(); // Idk why but the axis is weird topRT._localAxis = atmo.UseBasicCloudShader ? Vector3.forward : Vector3.up; From 87c859728eda61f2cfdfb5c6728e01f8e96e5e36 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 16:30:24 -0400 Subject: [PATCH 13/20] Destroy sun station debris properly --- NewHorizons/Utility/AstroObjectLocator.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/NewHorizons/Utility/AstroObjectLocator.cs b/NewHorizons/Utility/AstroObjectLocator.cs index b46bec43..76c5e579 100644 --- a/NewHorizons/Utility/AstroObjectLocator.cs +++ b/NewHorizons/Utility/AstroObjectLocator.cs @@ -111,9 +111,6 @@ namespace NewHorizons.Utility otherChildren.Add(GameObject.Find("FakeCannonBarrel_Body (1)")); otherChildren.Add(GameObject.Find("Debris_Body (1)")); break; - case AstroObject.Name.SunStation: - otherChildren.Add(GameObject.Find("SS_Debris_Body")); - break; case AstroObject.Name.GiantsDeep: otherChildren.Add(GameObject.Find("BrambleIsland_Body")); otherChildren.Add(GameObject.Find("GabbroIsland_Body")); @@ -134,6 +131,10 @@ namespace NewHorizons.Utility otherChildren.Add(GameObject.Find("BackRaft_Body")); otherChildren.Add(GameObject.Find("SealRaft_Body")); break; + // For some dumb reason the sun station doesn't use AstroObject.Name.SunStation + case AstroObject.Name.CustomString: + if(primary._customName.Equals("Sun Station")) otherChildren.Add(GameObject.Find("SS_Debris_Body")); + break; default: break; } From d5ee5ff33a9a23811cf65f45b0dc61df78a3a814 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 16:30:37 -0400 Subject: [PATCH 14/20] Add default star system override option --- NewHorizons/Main.cs | 81 ++++++++++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 9290c3d9..c537f99d 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -35,9 +35,10 @@ namespace NewHorizons public static Main Instance { get; private set; } // Settings - public static bool Debug; + public static bool Debug { get; private set; } private static bool _useCustomTitleScreen; private static bool _wasConfigured = false; + private static string _defaultSystemOverride; public static Dictionary SystemDict = new Dictionary(); public static Dictionary> BodyDict = new Dictionary>(); @@ -84,6 +85,8 @@ namespace NewHorizons DebugReload.UpdateReloadButton(); Logger.UpdateLogLevel(Debug ? Logger.LogType.Log : Logger.LogType.Error); + _defaultSystemOverride = config.GetSettingsValue("Default System Override"); + var wasUsingCustomTitleScreen = _useCustomTitleScreen; _useCustomTitleScreen = config.GetSettingsValue("Custom title screen"); // Reload the title screen if this was updated on it @@ -111,11 +114,14 @@ namespace NewHorizons destroyStockPlanets = false } }; - foreach (AssetBundle bundle in AssetBundles.Values) + + foreach (var pair in AssetBundles) { - bundle.Unload(true); + if (pair.Value == null) Logger.LogError($"The asset bundle for {pair.Key} was null when trying to unload"); + else pair.Value.Unload(true); } AssetBundles.Clear(); + if (!resetTranslation) return; TranslationHandler.ClearTables(); TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); @@ -136,9 +142,9 @@ namespace NewHorizons GlobalMessenger.AddListener("PlayerDeath", OnDeath); GlobalMessenger.AddListener("WakeUp", new Callback(OnWakeUp)); ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader"); - + ResetConfigs(resetTranslation: false); - + Logger.Log("Begin load of config files...", Logger.LogType.Log); try @@ -153,7 +159,7 @@ namespace NewHorizons Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single)); Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => _firstLoad = false); Instance.ModHelper.Menus.PauseMenu.OnInit += DebugReload.InitializePauseMenu; - } + } public void OnDestroy() { @@ -182,22 +188,22 @@ namespace NewHorizons Logger.Log($"Scene Loaded: {scene.name} {mode}"); // Set time loop stuff if its enabled and if we're warping to a new place - if(_isChangingStarSystem && (SystemDict[_currentStarSystem].Config.enableTimeLoop || _currentStarSystem == "SolarSystem") && SecondsLeftInLoop > 0f) + if (_isChangingStarSystem && (SystemDict[_currentStarSystem].Config.enableTimeLoop || _currentStarSystem == "SolarSystem") && SecondsLeftInLoop > 0f) { TimeLoop.SetSecondsRemaining(SecondsLeftInLoop); // Prevent the OPC from firing var launchController = GameObject.FindObjectOfType(); - if(launchController != null) + if (launchController != null) { GlobalMessenger.RemoveListener("StartOfTimeLoop", launchController.OnStartOfTimeLoop); - foreach(var fakeDebris in launchController._fakeDebrisBodies) + foreach (var fakeDebris in launchController._fakeDebrisBodies) { fakeDebris.gameObject.SetActive(false); } launchController.enabled = false; } var nomaiProbe = GameObject.Find("NomaiProbe_Body"); - if(nomaiProbe != null) nomaiProbe.gameObject.SetActive(false); + if (nomaiProbe != null) nomaiProbe.gameObject.SetActive(false); } // Reset this @@ -210,21 +216,21 @@ namespace NewHorizons TitleSceneHandler.DisplayBodyOnTitleScreen(BodyDict.Values.ToList().SelectMany(x => x).ToList()); } - if(scene.name == "EyeOfTheUniverse" && IsWarping) + if (scene.name == "EyeOfTheUniverse" && IsWarping) { - if(_ship != null) SceneManager.MoveGameObjectToScene(_ship, SceneManager.GetActiveScene()); + if (_ship != null) SceneManager.MoveGameObjectToScene(_ship, SceneManager.GetActiveScene()); _ship.transform.position = new Vector3(50, 0, 0); _ship.SetActive(true); } - if(scene.name == "SolarSystem") + if (scene.name == "SolarSystem") { - foreach(var body in GameObject.FindObjectsOfType()) + foreach (var body in GameObject.FindObjectsOfType()) { Logger.Log($"{body.name}, {body.transform.rotation}"); } - if(_ship != null) + if (_ship != null) { _ship = GameObject.Find("Ship_Body").InstantiateInactive(); DontDestroyOnLoad(_ship); @@ -252,14 +258,14 @@ namespace NewHorizons if (IsWarping && _shipWarpController) { Instance.ModHelper.Events.Unity.RunWhen( - () => IsSystemReady, + () => IsSystemReady, () => _shipWarpController.WarpIn(WearingSuit) ); } else { Instance.ModHelper.Events.Unity.RunWhen( - () => IsSystemReady, + () => IsSystemReady, () => FindObjectOfType().DebugWarp(SystemDict[_currentStarSystem].SpawnPoint) ); } @@ -274,7 +280,16 @@ namespace NewHorizons else { // Reset back to original solar system after going to main menu. - _currentStarSystem = _defaultStarSystem; + // If the override is a valid system then we go there + if (SystemDict.Keys.Contains(_defaultSystemOverride)) + { + _currentStarSystem = _defaultSystemOverride; + IsWarping = true; // always do this else sometimes the spawn gets messed up + } + else + { + _currentStarSystem = _defaultStarSystem; + } } } @@ -309,6 +324,12 @@ namespace NewHorizons var relativePath = file.Replace(folder, ""); var starSystemConfig = mod.ModHelper.Storage.Load(relativePath); + if (starSystemConfig.startHere) + { + // We always want to allow mods to overwrite setting the main SolarSystem as default but not the other way around + if (name != "SolarSystem") SetDefaultSystem(name); + } + var system = new NewHorizonsSystem(name, starSystemConfig, mod); SystemDict[name] = system; } @@ -336,7 +357,7 @@ namespace NewHorizons LoadTranslations(folder, mod); } } - catch(Exception ex) + catch (Exception ex) { Logger.LogError($"{ex.Message}, {ex.StackTrace}"); } @@ -380,15 +401,13 @@ namespace NewHorizons if (config.Base.CenterOfSolarSystem) config.Orbit.IsStatic = true; if (!SystemDict.ContainsKey(config.StarSystem)) { - // See if theres a star system config + // Since we didn't load it earlier there shouldn't be a star system config var starSystemConfig = mod.ModHelper.Storage.Load($"systems/{config.StarSystem}.json"); if (starSystemConfig == null) starSystemConfig = new StarSystemConfig(null); - else Logger.Log($"Loaded system config for {config.StarSystem}"); + else Logger.LogWarning($"Loaded system config for {config.StarSystem}. Why wasn't this loaded earlier?"); var system = new NewHorizonsSystem(config.StarSystem, starSystemConfig, mod); - if (system.Config.startHere) SetDefaultSystem(system.Name); - SystemDict.Add(config.StarSystem, system); BodyDict.Add(config.StarSystem, new List()); @@ -420,7 +439,7 @@ namespace NewHorizons OnChangeStarSystem?.Invoke(newStarSystem); Logger.Log($"Warping to {newStarSystem}"); - if(warp && _shipWarpController) _shipWarpController.WarpOut(); + if (warp && _shipWarpController) _shipWarpController.WarpOut(); _currentStarSystem = newStarSystem; _isChangingStarSystem = true; IsWarping = warp; @@ -429,7 +448,7 @@ namespace NewHorizons // We kill them so they don't move as much Locator.GetDeathManager().KillPlayer(DeathType.Meditation); - if(newStarSystem == "EyeOfTheUniverse") + if (newStarSystem == "EyeOfTheUniverse") { PlayerData.SaveWarpedToTheEye(TimeLoop.GetSecondsRemaining()); LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToBlack, 0.1f, true); @@ -446,7 +465,17 @@ namespace NewHorizons // We reset the solar system on death (unless we just killed the player) if (!_isChangingStarSystem) { - _currentStarSystem = _defaultStarSystem; + // If the override is a valid system then we go there + if (SystemDict.Keys.Contains(_defaultSystemOverride)) + { + _currentStarSystem = _defaultSystemOverride; + IsWarping = true; // always do this else sometimes the spawn gets messed up + } + else + { + _currentStarSystem = _defaultStarSystem; + } + IsWarping = false; } } From 055836fb30e0df1f76be4d12f32fe1e3b949694d Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 16:30:43 -0400 Subject: [PATCH 15/20] Update default-config.json --- NewHorizons/default-config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NewHorizons/default-config.json b/NewHorizons/default-config.json index 75790651..f5200a8d 100644 --- a/NewHorizons/default-config.json +++ b/NewHorizons/default-config.json @@ -2,6 +2,7 @@ "enabled": true, "settings": { "Debug": false, - "Custom title screen": true + "Custom title screen": true, + "Default System Override": "" } } \ No newline at end of file From e274fbc030c8c15db80765be587787ff1bd68eb2 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 16:30:54 -0400 Subject: [PATCH 16/20] Fix bundle dictionary --- NewHorizons/Builder/Props/PropBuildManager.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 7bd2a39f..1ca12058 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -177,7 +177,7 @@ namespace NewHorizons.Builder.Props public static GameObject LoadPrefab(string assetBundle, string path, string uniqueModName, IModBehaviour mod) { - string key = uniqueModName + "." + assetBundle; + string key = assetBundle; AssetBundle bundle; GameObject prefab; @@ -186,7 +186,14 @@ namespace NewHorizons.Builder.Props if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key]; else { - bundle = mod.ModHelper.Assets.LoadBundle(assetBundle); + var completePath = mod.ModHelper.Manifest.ModFolderPath + assetBundle; + bundle = AssetBundle.LoadFromFile(completePath); + if(bundle == null) + { + Logger.LogError($"Couldn't load AssetBundle at [{completePath}] for [{mod.ModHelper.Manifest.Name}]"); + return null; + } + Main.AssetBundles[key] = bundle; } } @@ -203,7 +210,7 @@ namespace NewHorizons.Builder.Props } catch (Exception e) { - Logger.Log($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); + Logger.LogError($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); return null; } From eebccceaabf9682bb3f66d9d64dfc2cb5112d8ba Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 16:49:29 -0400 Subject: [PATCH 17/20] Fix asset bundle issue and made a class of them --- NewHorizons/Builder/Props/DetailBuilder.cs | 4 +- NewHorizons/Builder/Props/PropBuildManager.cs | 62 +------------ NewHorizons/Builder/Props/ScatterBuilder.cs | 2 +- .../Builder/StarSystem/SkyboxBuilder.cs | 36 +------- NewHorizons/Main.cs | 9 +- NewHorizons/Utility/AssetBundleUtilities.cs | 91 +++++++++++++++++++ 6 files changed, 97 insertions(+), 107 deletions(-) create mode 100644 NewHorizons/Utility/AssetBundleUtilities.cs diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 3779fd50..d2a1b179 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -22,7 +22,7 @@ namespace NewHorizons.Builder.Props if (detail.assetBundle != null) { - var prefab = PropBuildManager.LoadPrefab(detail.assetBundle, detail.path, uniqueModName, mod); + var prefab = AssetBundleUtilities.LoadPrefab(detail.assetBundle, detail.path, mod); detailGO = MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal); } @@ -31,7 +31,7 @@ namespace NewHorizons.Builder.Props try { var prefab = mod.ModHelper.Assets.Get3DObject(detail.objFilePath, detail.mtlFilePath); - PropBuildManager.ReplaceShaders(prefab); + AssetBundleUtilities.ReplaceShaders(prefab); prefab.SetActive(false); detailGO = MakeDetail(go, sector, prefab, detail.position, detail.rotation, detail.scale, detail.alignToNormal); } diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 1ca12058..0c45045f 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -13,6 +13,7 @@ using NewHorizons.Utility; using OWML.Common; using NewHorizons.Builder.ShipLog; using NewHorizons.External.Configs; +using System.IO; namespace NewHorizons.Builder.Props { @@ -174,66 +175,5 @@ namespace NewHorizons.Builder.Props } } } - - public static GameObject LoadPrefab(string assetBundle, string path, string uniqueModName, IModBehaviour mod) - { - string key = assetBundle; - AssetBundle bundle; - GameObject prefab; - - try - { - if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key]; - else - { - var completePath = mod.ModHelper.Manifest.ModFolderPath + assetBundle; - bundle = AssetBundle.LoadFromFile(completePath); - if(bundle == null) - { - Logger.LogError($"Couldn't load AssetBundle at [{completePath}] for [{mod.ModHelper.Manifest.Name}]"); - return null; - } - - Main.AssetBundles[key] = bundle; - } - } - catch (Exception e) - { - Logger.LogError($"Couldn't load AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - try - { - prefab = bundle.LoadAsset(path); - prefab.SetActive(false); - } - catch (Exception e) - { - Logger.LogError($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - ReplaceShaders(prefab); - - return prefab; - } - - public static void ReplaceShaders(GameObject prefab) - { - foreach (var renderer in prefab.GetComponentsInChildren(true)) - { - foreach (var material in renderer.sharedMaterials) - { - if (material == null) - { - continue; - } - - var replacementShader = Shader.Find(material.shader.name); - if (replacementShader != null) material.shader = replacementShader; - } - } - } } } diff --git a/NewHorizons/Builder/Props/ScatterBuilder.cs b/NewHorizons/Builder/Props/ScatterBuilder.cs index 4a979455..2df47932 100644 --- a/NewHorizons/Builder/Props/ScatterBuilder.cs +++ b/NewHorizons/Builder/Props/ScatterBuilder.cs @@ -46,7 +46,7 @@ namespace NewHorizons.Builder.Props Random.InitState(propInfo.seed); GameObject prefab; - if (propInfo.assetBundle != null) prefab = PropBuildManager.LoadPrefab(propInfo.assetBundle, propInfo.path, uniqueModName, mod); + if (propInfo.assetBundle != null) prefab = AssetBundleUtilities.LoadPrefab(propInfo.assetBundle, propInfo.path, mod); else prefab = GameObject.Find(propInfo.path); for (int i = 0; i < propInfo.count; i++) { diff --git a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs index b4066abc..6c69fd82 100644 --- a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs +++ b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs @@ -10,44 +10,10 @@ namespace NewHorizons.Builder.StarSystem { public class SkyboxBuilder { - public static Material LoadMaterial(string assetBundle, string path, string uniqueModName, IModBehaviour mod) - { - string key = uniqueModName + "." + assetBundle; - AssetBundle bundle; - Material cubemap; - - try - { - if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key]; - else - { - bundle = mod.ModHelper.Assets.LoadBundle(assetBundle); - Main.AssetBundles[key] = bundle; - } - } - catch (Exception e) - { - Logger.LogError($"Couldn't load AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - try - { - cubemap = bundle.LoadAsset(path); - } - catch (Exception e) - { - Logger.Log($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); - return null; - } - - return cubemap; - } - public static void Make(StarSystemConfig.SkyboxConfig info, IModBehaviour mod) { Logger.Log("Building Skybox"); - Material skyBoxMaterial = LoadMaterial(info.assetBundle, info.path, mod.ModHelper.Manifest.UniqueName, mod); + var skyBoxMaterial = AssetBundleUtilities.Load(info.assetBundle, info.path, mod); RenderSettings.skybox = skyBoxMaterial; DynamicGI.UpdateEnvironment(); Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index c537f99d..39f04c08 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -42,7 +42,6 @@ namespace NewHorizons public static Dictionary SystemDict = new Dictionary(); public static Dictionary> BodyDict = new Dictionary>(); - public static Dictionary AssetBundles = new Dictionary(); public static List MountedAddons = new List(); public static float SecondsLeftInLoop = -1; @@ -115,13 +114,6 @@ namespace NewHorizons } }; - foreach (var pair in AssetBundles) - { - if (pair.Value == null) Logger.LogError($"The asset bundle for {pair.Key} was null when trying to unload"); - else pair.Value.Unload(true); - } - AssetBundles.Clear(); - if (!resetTranslation) return; TranslationHandler.ClearTables(); TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); @@ -180,6 +172,7 @@ namespace NewHorizons SearchUtilities.ClearCache(); ImageUtilities.ClearCache(); AudioUtilities.ClearCache(); + AssetBundleUtilities.ClearCache(); IsSystemReady = false; } diff --git a/NewHorizons/Utility/AssetBundleUtilities.cs b/NewHorizons/Utility/AssetBundleUtilities.cs new file mode 100644 index 00000000..fc4cd0ed --- /dev/null +++ b/NewHorizons/Utility/AssetBundleUtilities.cs @@ -0,0 +1,91 @@ +using OWML.Common; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Utility +{ + public static class AssetBundleUtilities + { + public static Dictionary AssetBundles = new Dictionary(); + + public static void ClearCache() + { + foreach (var pair in AssetBundles) + { + if (pair.Value == null) Logger.LogError($"The asset bundle for {pair.Key} was null when trying to unload"); + else pair.Value.Unload(true); + } + AssetBundles.Clear(); + } + + public static T Load(string assetBundleRelativeDir, string pathInBundle, IModBehaviour mod) where T : UnityEngine.Object + { + string key = Path.GetFileName(assetBundleRelativeDir); + T obj; + + try + { + AssetBundle bundle; + + if (AssetBundles.ContainsKey(key)) + { + bundle = AssetBundles[key]; + } + else + { + var completePath = mod.ModHelper.Manifest.ModFolderPath + assetBundleRelativeDir; + bundle = AssetBundle.LoadFromFile(completePath); + if (bundle == null) + { + Logger.LogError($"Couldn't load AssetBundle at [{completePath}] for [{mod.ModHelper.Manifest.Name}]"); + return null; + } + + AssetBundles[key] = bundle; + } + + obj = bundle.LoadAsset(pathInBundle); + } + catch (Exception e) + { + Logger.LogError($"Couldn't load asset {pathInBundle} from AssetBundle {assetBundleRelativeDir} : {e.Message}"); + return null; + } + + return obj; + } + + public static GameObject LoadPrefab(string assetBundleRelativeDir, string pathInBundle, IModBehaviour mod) + { + var prefab = Load(assetBundleRelativeDir, pathInBundle, mod); + + prefab.SetActive(false); + + ReplaceShaders(prefab); + + return prefab; + } + + public static void ReplaceShaders(GameObject prefab) + { + foreach (var renderer in prefab.GetComponentsInChildren(true)) + { + foreach (var material in renderer.sharedMaterials) + { + if (material == null) + { + continue; + } + + var replacementShader = Shader.Find(material.shader.name); + if (replacementShader != null) material.shader = replacementShader; + } + } + } + } +} From a7b649c32fabb89058de8c664297454f61712fe2 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 17:10:17 -0400 Subject: [PATCH 18/20] Namespace the asset bundle --- NewHorizons/AssetBundle/AssetBundle | Bin 1029 -> 0 bytes NewHorizons/AssetBundle/AssetBundle.manifest | 7 ------ NewHorizons/AssetBundle/shader | Bin 27575 -> 0 bytes NewHorizons/AssetBundle/shader.manifest | 21 ------------------ NewHorizons/AssetBundle/xen.newhorizons | Bin 0 -> 27566 bytes .../Builder/Atmosphere/CloudsBuilder.cs | 2 +- NewHorizons/Builder/Body/HeightMapBuilder.cs | 2 +- NewHorizons/Builder/Body/RingBuilder.cs | 8 +++---- NewHorizons/Main.cs | 4 ++-- 9 files changed, 8 insertions(+), 36 deletions(-) delete mode 100644 NewHorizons/AssetBundle/AssetBundle delete mode 100644 NewHorizons/AssetBundle/AssetBundle.manifest delete mode 100644 NewHorizons/AssetBundle/shader delete mode 100644 NewHorizons/AssetBundle/shader.manifest create mode 100644 NewHorizons/AssetBundle/xen.newhorizons diff --git a/NewHorizons/AssetBundle/AssetBundle b/NewHorizons/AssetBundle/AssetBundle deleted file mode 100644 index b0ee697805ba4378b1a163fb8547b9beee5efba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029 zcmV+g1p50`ZfSIRMpFO)000LyE_g0@05UK!IW9CVGB;*100000000041poj5K>z>% zTL1t6LjV8(00000000000000U009890RR9Hv;Y7DgaAPf00;p902%=B7ytxAK|(EM zHZwV4H#A~6IAdfsWMyP!Fk)jjWn^VCG%{r{I5IT=T>tyx@H`n~UzYRv4hYJv*2 zHggNBW%(Qa0CHg-%v4N;5H_Wlnu_k;%qn3%5UWLf7Dpbw*@)R=8>?t zPZxkt%en8RMQ9%|9kOK0`04ri|HbTBFLEHb1<{Q*F&qfa$5Zk3#`6#2L@w_ky`CS_w$v z%AZD9Wk>8)r6r#DwL*&?=AjbXZ@T%HhnhQ;D8?j@7z=|I83BCic)Zk=XtFP9BJ#wM z(sK({0*EEz=f^{!$=vXpRjz1pk?EG$sZNz3S%Bl0g8$y}swy~j@1k{g zAY3i3z8w5UoWPQ8|CHkh-DwS7c4R2s${4GPd|?*`n}L{<*xdTJ%Zt0g47!%JRdB|9 zX%0*W=9{fv^3`>yC+apex`AWL5qg(0>*7H7%uAecN8tq3j}cnS(k`$?ZqhnhkyP#g zvX5L~&3{Fqe!F1C$qvYuVh3OclOPW!~auo^^ZdzWi*H# zZxM}QOTQzbdDn(^J>yw;lsYOvqVD1P%G2H3Qx;9)B08d^DxXe5bQ`5PcK7r?f#FOD zm@^NF&s;gOlq&ks4dsO(46y(25uN-nY7h~W+YxuSBX~}6q^xX5@xnF#yP%1~j-%KF diff --git a/NewHorizons/AssetBundle/AssetBundle.manifest b/NewHorizons/AssetBundle/AssetBundle.manifest deleted file mode 100644 index 3edbdeeb..00000000 --- a/NewHorizons/AssetBundle/AssetBundle.manifest +++ /dev/null @@ -1,7 +0,0 @@ -ManifestFileVersion: 0 -CRC: 920416521 -AssetBundleManifest: - AssetBundleInfos: - Info_0: - Name: shader - Dependencies: {} diff --git a/NewHorizons/AssetBundle/shader b/NewHorizons/AssetBundle/shader deleted file mode 100644 index 4eea1968e11f2901e00a227757086322d6f3e9cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27575 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 diff --git a/NewHorizons/AssetBundle/shader.manifest b/NewHorizons/AssetBundle/shader.manifest deleted file mode 100644 index dd99a585..00000000 --- a/NewHorizons/AssetBundle/shader.manifest +++ /dev/null @@ -1,21 +0,0 @@ -ManifestFileVersion: 0 -CRC: 1131808909 -Hashes: - AssetFileHash: - serializedVersion: 2 - Hash: 183a5bb48d2c1afa94657b52eb300f40 - TypeTreeHash: - serializedVersion: 2 - Hash: 55d48f4ad9c3b13330b9eb5ee5686477 -HashAppended: 0 -ClassTypes: -- Class: 48 - Script: {instanceID: 0} -SerializeReferenceClassIdentifiers: [] -Assets: -- Assets/Shaders/SphereTextureWrapper.shader -- Assets/Shaders/Ring.shader -- Assets/Shaders/UnlitRing1Pixel.shader -- Assets/Shaders/UnlitTransparent.shader -- Assets/Shaders/Ring1Pixel.shader -Dependencies: [] diff --git a/NewHorizons/AssetBundle/xen.newhorizons b/NewHorizons/AssetBundle/xen.newhorizons new file mode 100644 index 0000000000000000000000000000000000000000..8424b8001baa75ddc448057afc68ef25490249f6 GIT binary patch literal 27566 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 literal 0 HcmV?d00001 diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index 9156b2e3..5c968483 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -47,7 +47,7 @@ namespace NewHorizons.Builder.Atmosphere MeshRenderer topMR = cloudsTopGO.AddComponent(); - if (_sphereShader == null) _sphereShader = Main.ShaderBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); + if (_sphereShader == null) _sphereShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); if (_gdCloudMaterials == null) _gdCloudMaterials = GameObject.Find("CloudsTopLayer_GD").GetComponent().sharedMaterials; var tempArray = new Material[2]; diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index c0d15865..88d02e83 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -45,7 +45,7 @@ namespace NewHorizons.Builder.Body cubeSphere.GetComponent().mesh = mesh; // TODO: fix UVs so we can switch to the default shader - if (PlanetShader == null) PlanetShader = Main.ShaderBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); + if (PlanetShader == null) PlanetShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/SphereTextureWrapper.shader"); //if (PlanetShader == null) PlanetShader = Shader.Find("Standard"); var cubeSphereMR = cubeSphere.AddComponent(); diff --git a/NewHorizons/Builder/Body/RingBuilder.cs b/NewHorizons/Builder/Body/RingBuilder.cs index c52d102c..a88ddb27 100644 --- a/NewHorizons/Builder/Body/RingBuilder.cs +++ b/NewHorizons/Builder/Body/RingBuilder.cs @@ -49,10 +49,10 @@ namespace NewHorizons.Builder.Body var ringMR = ringGO.AddComponent(); var texture = ringTexture; - if (RingShader == null) RingShader = Main.ShaderBundle.LoadAsset("Assets/Shaders/Ring.shader"); - if (UnlitRingShader == null) UnlitRingShader = Main.ShaderBundle.LoadAsset("Assets/Shaders/UnlitTransparent.shader"); - if (RingShader1Pixel == null) RingShader1Pixel = Main.ShaderBundle.LoadAsset("Assets/Shaders/Ring1Pixel.shader"); - if (UnlitRingShader1Pixel == null) UnlitRingShader1Pixel = Main.ShaderBundle.LoadAsset("Assets/Shaders/UnlitRing1Pixel.shader"); + if (RingShader == null) RingShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/Ring.shader"); + if (UnlitRingShader == null) UnlitRingShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/UnlitTransparent.shader"); + if (RingShader1Pixel == null) RingShader1Pixel = Main.NHAssetBundle.LoadAsset("Assets/Shaders/Ring1Pixel.shader"); + if (UnlitRingShader1Pixel == null) UnlitRingShader1Pixel = Main.NHAssetBundle.LoadAsset("Assets/Shaders/UnlitRing1Pixel.shader"); var mat = new Material(ring.Unlit ? UnlitRingShader : RingShader); if (texture.width == 1) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 39f04c08..03652a77 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -31,7 +31,7 @@ namespace NewHorizons { public class Main : ModBehaviour { - public static AssetBundle ShaderBundle; + public static AssetBundle NHAssetBundle { get; private set; } public static Main Instance { get; private set; } // Settings @@ -133,7 +133,7 @@ namespace NewHorizons Instance = this; GlobalMessenger.AddListener("PlayerDeath", OnDeath); GlobalMessenger.AddListener("WakeUp", new Callback(OnWakeUp)); - ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader"); + NHAssetBundle = ModHelper.Assets.LoadBundle("AssetBundle/xen.newhorizons"); ResetConfigs(resetTranslation: false); From 0bf7b694e66b798d9d4683088cfedf1b9512449d Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 17:16:16 -0400 Subject: [PATCH 19/20] Update manifest.json --- NewHorizons/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index b0fc9dd3..80f0af97 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -3,7 +3,7 @@ "author": "xen, Bwc9876, & Book", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "0.15.2", + "version": "0.16.0", "owmlVersion": "2.1.0", "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume", "PacificEngine.OW_Randomizer" ], "pathsToPreserve": [ "planets", "systems", "translations" ] From b0e93ab8e9e9366df2e910579c0842c317e46b59 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 13 May 2022 17:19:26 -0400 Subject: [PATCH 20/20] Only carry over seconds remaining when enableTimeLoop --- NewHorizons/Main.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 03652a77..f3636d43 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -433,7 +433,6 @@ namespace NewHorizons Logger.Log($"Warping to {newStarSystem}"); if (warp && _shipWarpController) _shipWarpController.WarpOut(); - _currentStarSystem = newStarSystem; _isChangingStarSystem = true; IsWarping = warp; WearingSuit = PlayerState.IsWearingSuit(); @@ -441,16 +440,24 @@ namespace NewHorizons // We kill them so they don't move as much Locator.GetDeathManager().KillPlayer(DeathType.Meditation); + OWScene sceneToLoad; + if (newStarSystem == "EyeOfTheUniverse") { PlayerData.SaveWarpedToTheEye(TimeLoop.GetSecondsRemaining()); - LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToBlack, 0.1f, true); + sceneToLoad = OWScene.EyeOfTheUniverse; } else { - SecondsLeftInLoop = TimeLoop.GetSecondsRemaining(); - LoadManager.LoadSceneAsync(OWScene.SolarSystem, true, LoadManager.FadeType.ToBlack, 0.1f, true); + if (SystemDict[_currentStarSystem].Config.enableTimeLoop) SecondsLeftInLoop = TimeLoop.GetSecondsRemaining(); + else SecondsLeftInLoop = -1; + + sceneToLoad = OWScene.SolarSystem; } + + _currentStarSystem = newStarSystem; + + LoadManager.LoadSceneAsync(sceneToLoad, true, LoadManager.FadeType.ToBlack, 0.1f, true); } void OnDeath(DeathType _)