diff --git a/NewHorizons/Builder/Body/StarBuilder.cs b/NewHorizons/Builder/Body/StarBuilder.cs index ecbbee5c1..cdb68c7e2 100644 --- a/NewHorizons/Builder/Body/StarBuilder.cs +++ b/NewHorizons/Builder/Body/StarBuilder.cs @@ -1,13 +1,12 @@ using NewHorizons.Components.SizeControllers; -using NewHorizons.Utility; -using UnityEngine; +using NewHorizons.Components.Stars; using NewHorizons.External.Modules.VariableSize; +using NewHorizons.Utility; +using NewHorizons.Utility.Files; +using NewHorizons.Utility.OuterWilds; using OWML.Common; using System.Linq; -using NewHorizons.Components.Stars; -using NewHorizons.Utility.OuterWilds; -using NewHorizons.Utility.Files; -using NewHorizons.Utility.OWML; +using UnityEngine; namespace NewHorizons.Builder.Body { @@ -54,6 +53,7 @@ internal static void InitPrefabs() 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 +344,6 @@ public static GameObject MakeStarGraphics(GameObject rootObject, Sector sector, solarFlareEmitter.transform.localPosition = Vector3.zero; solarFlareEmitter.transform.localScale = Vector3.one; solarFlareEmitter.name = "SolarFlareEmitter"; - solarFlareEmitter.SetActive(true); var emitter = solarFlareEmitter.GetComponent(); @@ -361,10 +360,19 @@ public static GameObject MakeStarGraphics(GameObject rootObject, Sector sector, } 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 +384,8 @@ public static GameObject MakeStarGraphics(GameObject rootObject, Sector sector, { controller._scaleFactor = Vector3.one * starModule.solarFlareSettings.scaleFactor; } + controller.gameObject.SetActive(true); + controller.enabled = true; } starGO.transform.position = rootObject.transform.position; @@ -413,6 +423,8 @@ public static GameObject MakeStarGraphics(GameObject rootObject, Sector sector, } } + solarFlareEmitter.SetActive(true); + return starGO; } diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 622cdd827..eeef8d1b0 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -187,8 +187,10 @@ public static GameObject Make(GameObject go, Sector sector, GameObject prefab, D // Just swap all the children to a new game object var newDetailGO = new GameObject(prop.name); newDetailGO.SetActive(false); - newDetailGO.transform.position = prop.transform.position; newDetailGO.transform.parent = prop.transform.parent; + newDetailGO.transform.position = prop.transform.position; + newDetailGO.transform.rotation = prop.transform.rotation; + newDetailGO.transform.localScale = prop.transform.localScale; // Can't modify parents while looping through children bc idk var children = new List(); diff --git a/NewHorizons/Patches/SolarFlareEmitterPatches.cs b/NewHorizons/Patches/SolarFlareEmitterPatches.cs new file mode 100644 index 000000000..5989bcd04 --- /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; + } + } + } +} diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index 72bbe1d45..a37a3905f 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -4,7 +4,7 @@ "author": "xen, Bwc9876, clay, MegaPiggy, John, Trifid, Hawkbar, Book", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "1.14.3", + "version": "1.14.4", "owmlVersion": "2.9.3", "dependencies": [ "JohnCorby.VanillaFix", "_nebula.MenuFramework", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ], "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "PacificEngine.OW_CommonResources" ],