Fix flares being white #668

This commit is contained in:
Nick 2023-08-12 15:18:40 -04:00
parent 0a76fca4cb
commit 1416e07f9b
2 changed files with 39 additions and 4 deletions

View File

@ -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<SunController>()._startSurfaceMaterial).DontDestroyOnLoad();
if (_giantMaterial == null) _giantMaterial = new Material(SearchUtilities.Find("Sun_Body").GetComponent<SunController>()._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<SolarFlareEmitter>();
@ -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<SolarFlareController>())
.Concat(emitter.GetComponentsInChildren<SolarFlareController>()))
{
var controller = prefab.GetComponent<SolarFlareController>();
// 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;
}

View File

@ -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;
}
}
}
}