diff --git a/NewHorizons/Builder/General/PlanetDestroyer.cs b/NewHorizons/Builder/General/PlanetDestroyer.cs index 48f5db46..0d3dd61a 100644 --- a/NewHorizons/Builder/General/PlanetDestroyer.cs +++ b/NewHorizons/Builder/General/PlanetDestroyer.cs @@ -85,93 +85,100 @@ namespace NewHorizons.Builder.General } } - if (ao.GetAstroObjectName() == AstroObject.Name.CaveTwin || ao.GetAstroObjectName() == AstroObject.Name.TowerTwin) + try { - if (ao.GetAstroObjectName() == AstroObject.Name.TowerTwin) - GameObject.Find("TimeLoopRing_Body").SetActive(false); - var focalBody = GameObject.Find("FocalBody"); - if (focalBody != null) focalBody.SetActive(false); - } - else if (ao.GetAstroObjectName() == AstroObject.Name.MapSatellite) - { - var msb = GameObject.Find("MapSatellite_Body"); - if (msb != null) msb.SetActive(false); - } - else if(ao.GetAstroObjectName() == AstroObject.Name.ProbeCannon) - { - GameObject.Find("NomaiProbe_Body").SetActive(false); - GameObject.Find("CannonMuzzle_Body").SetActive(false); - GameObject.Find("FakeCannonMuzzle_Body (1)").SetActive(false); - GameObject.Find("CannonBarrel_Body").SetActive(false); - GameObject.Find("FakeCannonBarrel_Body (1)").SetActive(false); - GameObject.Find("Debris_Body (1)").SetActive(false); - } - else if(ao.GetAstroObjectName() == AstroObject.Name.SunStation) - { - GameObject.Find("SS_Debris_Body").SetActive(false); - } - else if(ao.GetAstroObjectName() == AstroObject.Name.GiantsDeep) - { - GameObject.Find("BrambleIsland_Body").SetActive(false); - GameObject.Find("GabbroIsland_Body").SetActive(false); - GameObject.Find("QuantumIsland_Body").SetActive(false); - GameObject.Find("StatueIsland_Body").SetActive(false); - GameObject.Find("ConstructionYardIsland_Body").SetActive(false); - GameObject.Find("GabbroShip_Body").SetActive(false); - foreach(var jelly in GameObject.FindObjectsOfType()) + if (ao.GetAstroObjectName() == AstroObject.Name.CaveTwin || ao.GetAstroObjectName() == AstroObject.Name.TowerTwin) { - jelly.gameObject.SetActive(false); + if (ao.GetAstroObjectName() == AstroObject.Name.TowerTwin) + GameObject.Find("TimeLoopRing_Body").SetActive(false); + var focalBody = GameObject.Find("FocalBody"); + if (focalBody != null) focalBody.SetActive(false); } - } - else if(ao.GetAstroObjectName() == AstroObject.Name.WhiteHole) - { - GameObject.Find("WhiteholeStation_Body").SetActive(false); - GameObject.Find("WhiteholeStationSuperstructure_Body").SetActive(false); - } - else if(ao.GetAstroObjectName() == AstroObject.Name.TimberHearth) - { - GameObject.Find("MiningRig_Body").SetActive(false); + else if (ao.GetAstroObjectName() == AstroObject.Name.MapSatellite) + { + var msb = GameObject.Find("MapSatellite_Body"); + if (msb != null) msb.SetActive(false); + } + else if (ao.GetAstroObjectName() == AstroObject.Name.ProbeCannon) + { + GameObject.Find("NomaiProbe_Body").SetActive(false); + GameObject.Find("CannonMuzzle_Body").SetActive(false); + GameObject.Find("FakeCannonMuzzle_Body (1)").SetActive(false); + GameObject.Find("CannonBarrel_Body").SetActive(false); + GameObject.Find("FakeCannonBarrel_Body (1)").SetActive(false); + GameObject.Find("Debris_Body (1)").SetActive(false); + } + else if (ao.GetAstroObjectName() == AstroObject.Name.SunStation) + { + GameObject.Find("SS_Debris_Body").SetActive(false); + } + else if (ao.GetAstroObjectName() == AstroObject.Name.GiantsDeep) + { + GameObject.Find("BrambleIsland_Body").SetActive(false); + GameObject.Find("GabbroIsland_Body").SetActive(false); + GameObject.Find("QuantumIsland_Body").SetActive(false); + GameObject.Find("StatueIsland_Body").SetActive(false); + GameObject.Find("ConstructionYardIsland_Body").SetActive(false); + GameObject.Find("GabbroShip_Body").SetActive(false); + foreach (var jelly in GameObject.FindObjectsOfType()) + { + jelly.gameObject.SetActive(false); + } + } + else if (ao.GetAstroObjectName() == AstroObject.Name.WhiteHole) + { + GameObject.Find("WhiteholeStation_Body").SetActive(false); + GameObject.Find("WhiteholeStationSuperstructure_Body").SetActive(false); + } + else if (ao.GetAstroObjectName() == AstroObject.Name.TimberHearth) + { + GameObject.Find("MiningRig_Body").SetActive(false); - foreach(var obj in GameObject.FindObjectsOfType()) - { - GameObject.Destroy(obj); + foreach (var obj in GameObject.FindObjectsOfType()) + { + GameObject.Destroy(obj); + } + foreach (var obj in GameObject.FindObjectsOfType()) + { + GameObject.Destroy(obj); + } } - foreach (var obj in GameObject.FindObjectsOfType()) + else if (ao.GetAstroObjectName() == AstroObject.Name.Sun) { - GameObject.Destroy(obj); + var starController = ao.gameObject.GetComponent(); + StarLightController.RemoveStar(starController); + GameObject.Destroy(starController); + + var audio = ao.GetComponentInChildren(); + GameObject.Destroy(audio); + + foreach (var owAudioSource in ao.GetComponentsInChildren()) + { + owAudioSource.Stop(); + GameObject.Destroy(owAudioSource); + } + + foreach (var audioSource in ao.GetComponentsInChildren()) + { + audioSource.Stop(); + GameObject.Destroy(audioSource); + } + + foreach (var sunProxy in GameObject.FindObjectsOfType()) + { + Logger.Log($"Destroying SunProxy {sunProxy.gameObject.name}"); + GameObject.Destroy(sunProxy.gameObject); + } + } + else if (ao.GetAstroObjectName() == AstroObject.Name.DreamWorld) + { + GameObject.Find("BackRaft_Body").SetActive(false); + GameObject.Find("SealRaft_Body").SetActive(false); } } - else if(ao.GetAstroObjectName() == AstroObject.Name.Sun) + catch(Exception e) { - var starController = ao.gameObject.GetComponent(); - StarLightController.RemoveStar(starController); - GameObject.Destroy(starController); - - var audio = ao.GetComponentInChildren(); - GameObject.Destroy(audio); - - foreach(var owAudioSource in ao.GetComponentsInChildren()) - { - owAudioSource.Stop(); - GameObject.Destroy(owAudioSource); - } - - foreach (var audioSource in ao.GetComponentsInChildren()) - { - audioSource.Stop(); - GameObject.Destroy(audioSource); - } - - foreach(var sunProxy in GameObject.FindObjectsOfType()) - { - Logger.Log($"Destroying SunProxy {sunProxy.gameObject.name}"); - GameObject.Destroy(sunProxy.gameObject); - } - } - else if(ao.GetAstroObjectName() == AstroObject.Name.DreamWorld) - { - GameObject.Find("BackRaft_Body").SetActive(false); - GameObject.Find("SealRaft_Body").SetActive(false); + Logger.LogWarning($"Exception thrown when trying to delete bodies related to [{ao.name}]: {e.Message}, {e.StackTrace}"); } // Deal with proxies @@ -185,7 +192,8 @@ namespace NewHorizons.Builder.General } RemoveProxy(ao.name.Replace("_Body", "")); - ao.transform.root.gameObject.SetActive(false); + // For TH we wait until the player is fully loaded in + Main.Instance.ModHelper.Events.Unity.RunWhen(() => Main.IsSystemReady, () => ao.transform.root.gameObject.SetActive(false)); foreach (ProxyBody proxy in GameObject.FindObjectsOfType()) { diff --git a/NewHorizons/Builder/General/SpawnPointBuilder.cs b/NewHorizons/Builder/General/SpawnPointBuilder.cs index 0b729eee..bc8d0aba 100644 --- a/NewHorizons/Builder/General/SpawnPointBuilder.cs +++ b/NewHorizons/Builder/General/SpawnPointBuilder.cs @@ -60,7 +60,7 @@ namespace NewHorizons.Builder.General if(!Main.Instance.IsWarping && module.StartWithSuit && !suitUpQueued) { suitUpQueued = true; - Main.Instance.ModHelper.Events.Unity.FireInNUpdates(() => SuitUp(), 4); + Main.Instance.ModHelper.Events.Unity.RunWhen(() => Main.IsSystemReady, () => SuitUp()); } Logger.Log("Made spawnpoint on [" + body.name + "]"); diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 56a4d4e5..f74dac74 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -81,7 +81,7 @@ namespace NewHorizons.Builder.Props if(component is AnglerfishAnimController && component.GetComponentInParent() == null) Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as AnglerfishAnimController).enabled = false); - if (component is Animator) Main.Instance.ModHelper.Events.Unity.FireInNUpdates(() => (component as Animator).enabled = true, 5); + if (component is Animator) Main.Instance.ModHelper.Events.Unity.RunWhen(() => Main.IsSystemReady, () => (component as Animator).enabled = true); if (component is Collider) Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as Collider).enabled = true); if(component is Shape) Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => (component as Shape).enabled = true); diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 9475c095..0e9aca9a 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -43,6 +43,7 @@ namespace NewHorizons public static Dictionary AssetBundles = new Dictionary(); public static List MountedAddons = new List(); + public static bool IsSystemReady { get; private set; } public static float FurthestOrbit { get; set; } = 50000f; public string CurrentStarSystem { get { return Instance._currentStarSystem; } } @@ -91,6 +92,7 @@ namespace NewHorizons SceneManager.sceneLoaded += OnSceneLoaded; Instance = this; GlobalMessenger.AddListener("PlayerDeath", OnDeath); + GlobalMessenger.AddListener("WakeUp", new Callback(OnWakeUp)); ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader"); BodyDict["SolarSystem"] = new List(); SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), this); @@ -170,6 +172,12 @@ namespace NewHorizons Logger.Log($"Destroying NewHorizons"); SceneManager.sceneLoaded -= OnSceneLoaded; GlobalMessenger.RemoveListener("PlayerDeath", OnDeath); + GlobalMessenger.RemoveListener("WakeUp", new Callback(OnWakeUp)); + } + + private static void OnWakeUp() + { + IsSystemReady = true; } void OnSceneLoaded(Scene scene, LoadSceneMode mode) @@ -185,6 +193,8 @@ namespace NewHorizons if(scene.name == "SolarSystem") { + IsSystemReady = false; + HeavenlyBodyBuilder.Reset(); NewHorizonsData.Load(); SignalBuilder.Init(); @@ -203,8 +213,8 @@ namespace NewHorizons if (HasWarpDrive == true) EnableWarpDrive(); Logger.Log($"Is the player warping in? {IsWarping}"); - if (IsWarping && _shipWarpController) Instance.ModHelper.Events.Unity.FireInNUpdates(() => _shipWarpController.WarpIn(WearingSuit), 5); - else Instance.ModHelper.Events.Unity.FireInNUpdates(() => GameObject.FindObjectOfType().DebugWarp(SystemDict[_currentStarSystem].SpawnPoint), 5); + if (IsWarping && _shipWarpController) Instance.ModHelper.Events.Unity.RunWhen(() => IsSystemReady, () => _shipWarpController.WarpIn(WearingSuit)); + else Instance.ModHelper.Events.Unity.RunWhen(() => IsSystemReady, () => FindObjectOfType().DebugWarp(SystemDict[_currentStarSystem].SpawnPoint)); IsWarping = false; var map = GameObject.FindObjectOfType();