From 1416e07f9b3a43d75481f4c8aaf597cf4489b171 Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 12 Aug 2023 15:18:40 -0400 Subject: [PATCH] Fix flares being white #668 --- NewHorizons/Builder/Body/StarBuilder.cs | 22 +++++++++++++++---- .../Patches/SolarFlareEmitterPatches.cs | 21 ++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 NewHorizons/Patches/SolarFlareEmitterPatches.cs diff --git a/NewHorizons/Builder/Body/StarBuilder.cs b/NewHorizons/Builder/Body/StarBuilder.cs index ecbbee5c..1aba65fd 100644 --- a/NewHorizons/Builder/Body/StarBuilder.cs +++ b/NewHorizons/Builder/Body/StarBuilder.cs @@ -8,6 +8,7 @@ using NewHorizons.Components.Stars; using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.Files; using NewHorizons.Utility.OWML; +using UnityEngine.InputSystem.XR; namespace NewHorizons.Builder.Body { @@ -54,6 +55,7 @@ namespace NewHorizons.Builder.Body if (_starSurface == null) _starSurface = SearchUtilities.Find("Sun_Body/Sector_SUN/Geometry_SUN/Surface").InstantiateInactive().Rename("Prefab_Surface_Star").DontDestroyOnLoad(); if (_starSolarFlareEmitter == null) _starSolarFlareEmitter = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/SolarFlareEmitter").InstantiateInactive().Rename("Prefab_SolarFlareEmitter_Star").DontDestroyOnLoad(); if (_supernovaPrefab == null) _supernovaPrefab = SearchUtilities.Find("Sun_Body/Sector_SUN/Effects_SUN/Supernova").InstantiateInactive().Rename("Prefab_Supernova").DontDestroyOnLoad(); + if (_mainSequenceMaterial == null) _mainSequenceMaterial = new Material(SearchUtilities.Find("Sun_Body").GetComponent()._startSurfaceMaterial).DontDestroyOnLoad(); if (_giantMaterial == null) _giantMaterial = new Material(SearchUtilities.Find("Sun_Body").GetComponent()._endSurfaceMaterial).DontDestroyOnLoad(); if (_flareMaterial == null) @@ -344,7 +346,6 @@ namespace NewHorizons.Builder.Body solarFlareEmitter.transform.localPosition = Vector3.zero; solarFlareEmitter.transform.localScale = Vector3.one; solarFlareEmitter.name = "SolarFlareEmitter"; - solarFlareEmitter.SetActive(true); var emitter = solarFlareEmitter.GetComponent(); @@ -361,10 +362,19 @@ namespace NewHorizons.Builder.Body } var material = new Material(_flareMaterial); - // Since the star isn't awake yet the controllers haven't been made - foreach (var prefab in new GameObject[] { emitter.domePrefab, emitter.loopPrefab, emitter.streamerPrefab }) + + // Make our own copies of all prefabs to make sure we don't actually modify them + // else it will affect any other star using these prefabs + // #668 + emitter._domePrefab = emitter.domePrefab.InstantiateInactive(); + emitter._loopPrefab = emitter.loopPrefab.InstantiateInactive(); + emitter._streamerPrefab = emitter.streamerPrefab.InstantiateInactive(); + + // Get all possible controllers, prefabs or already created ones + foreach (var controller in new GameObject[] { emitter.domePrefab, emitter.loopPrefab, emitter.streamerPrefab } + .Select(x => x.GetComponent()) + .Concat(emitter.GetComponentsInChildren())) { - var controller = prefab.GetComponent(); // controller._meshRenderer doesn't exist yet since Awake hasn't been called if (starModule.tint != null) { @@ -376,6 +386,8 @@ namespace NewHorizons.Builder.Body { controller._scaleFactor = Vector3.one * starModule.solarFlareSettings.scaleFactor; } + controller.gameObject.SetActive(true); + controller.enabled = true; } starGO.transform.position = rootObject.transform.position; @@ -413,6 +425,8 @@ namespace NewHorizons.Builder.Body } } + solarFlareEmitter.SetActive(true); + return starGO; } diff --git a/NewHorizons/Patches/SolarFlareEmitterPatches.cs b/NewHorizons/Patches/SolarFlareEmitterPatches.cs new file mode 100644 index 00000000..5989bcd0 --- /dev/null +++ b/NewHorizons/Patches/SolarFlareEmitterPatches.cs @@ -0,0 +1,21 @@ +using HarmonyLib; +using System.Linq; + +namespace NewHorizons.Patches +{ + [HarmonyPatch(typeof(SolarFlareEmitter))] + public static class SolarFlareEmitterPatches + { + [HarmonyPostfix] + [HarmonyPatch(nameof(SolarFlareEmitter.Awake))] + public static void SolarFlareEmitter_Awake(SolarFlareEmitter __instance) + { + // Because in StarBuilder we use inactive game objects instead of real prefabs these objects all get created inactive + foreach (var flare in __instance._streamers.Concat(__instance._loops).Concat(__instance._domes)) + { + flare.gameObject.SetActive(true); + flare.enabled = true; + } + } + } +}