diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index fb4ae2df..ae7a63f7 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -1,4 +1,3 @@ -using NewHorizons.Builder.General; using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Handlers; @@ -6,10 +5,8 @@ using NewHorizons.Utility; using OWML.Common; using System; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using UnityEngine; -using Component = UnityEngine.Component; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Props { @@ -74,9 +71,6 @@ namespace NewHorizons.Builder.Props var isTorch = prop.GetComponent() != null; - // Fix a bunch of stuff when done loading - var fixes = new List(); - foreach (var component in prop.GetComponentsInChildren(true)) { if (sector == null) @@ -86,16 +80,6 @@ namespace NewHorizons.Builder.Props else FixSectoredComponent(component, sector, isTorch); FixComponent(component, go, prefab.name); - - if (DetailFixer.fixes.Keys.Any(x => x.IsInstanceOfType(component))) - { - fixes.Add(component); - } - } - - if (fixes.Count > 0) - { - prop.AddComponent().SetFixes(fixes); } prop.transform.position = detail.position == null ? go.transform.position : go.transform.TransformPoint(detail.position); @@ -116,7 +100,6 @@ namespace NewHorizons.Builder.Props prop.transform.localScale = detail.scale != 0 ? Vector3.one * detail.scale : prefab.transform.localScale; - if (!detail.keepLoaded) GroupsBuilder.Make(prop, sector); prop.SetActive(true); if (prop == null) return null; @@ -294,75 +277,44 @@ namespace NewHorizons.Builder.Props torchItem.mindProjectorTrigger.enabled = true; torchItem.mindSlideProjector._mindProjectorImageEffect = SearchUtilities.Find("Player_Body/PlayerCamera").GetComponent(); } - } - /// - /// Performs fixes that have to be done after the system loads - /// Has to be done this way to ensure that scatter works - /// - private class DetailFixer : MonoBehaviour - { - public static Dictionary> fixes = new() + // Fix a bunch of stuff when done loading + Delay.RunWhen(() => Main.IsSystemReady, () => { - [typeof(AnglerfishAnimController)] = (x) => + try { - var angler = x as AnglerfishAnimController; - - Logger.LogVerbose("Enabling anglerfish animation"); - // Remove any reference to its angler - if (angler._anglerfishController) + if (component == null) return; + if (component is Animator animator) animator.enabled = true; + else if (component is Collider collider) collider.enabled = true; + else if (component is Renderer renderer) renderer.enabled = true; + else if (component is Shape shape) shape.enabled = true; + else if (component is SectorCullGroup sectorCullGroup) { - angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; - angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; - angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; - angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; + sectorCullGroup._inMapView = false; + sectorCullGroup._isFastForwarding = false; + sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); } - angler.enabled = true; - angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); - }, - [typeof(SectorCullGroup)] = (x) => - { - var sectorCullGroup = x as SectorCullGroup; - sectorCullGroup._inMapView = false; - sectorCullGroup._isFastForwarding = false; - sectorCullGroup.SetVisible(sectorCullGroup.ShouldBeVisible(), true, false); - }, - [typeof(Shape)] = (x) => (x as Shape).enabled = true, - [typeof(Renderer)] = (x) => (x as Renderer).enabled = true, - [typeof(Collider)] = (x) => (x as Collider).enabled = true, - [typeof(Animator)] = (x) => (x as Animator).enabled = true - }; - - // Have to be public to be copied by Instantiate - public Component[] componentsToFix; - - public void SetFixes(List fixes) - { - // Components must be in a list for unity to properly deep copy - componentsToFix = fixes.ToArray(); - } - - public void Start() - { - for (int i = 0; i < componentsToFix.Length; i++) - { - var component = componentsToFix[i]; - - try + // If it's not a moving anglerfish make sure the anim controller is regular + else if (component is AnglerfishAnimController angler && angler.GetComponentInParent() == null) { - if (component != null) + Logger.LogVerbose("Enabling anglerfish animation"); + // Remove any reference to its angler + if (angler._anglerfishController) { - var key = fixes.Keys.FirstOrDefault(x => x.IsInstanceOfType(component)); - var fix = fixes[key]; - fix(component); + angler._anglerfishController.OnChangeAnglerState -= angler.OnChangeAnglerState; + angler._anglerfishController.OnAnglerTurn -= angler.OnAnglerTurn; + angler._anglerfishController.OnAnglerSuspended -= angler.OnAnglerSuspended; + angler._anglerfishController.OnAnglerUnsuspended -= angler.OnAnglerUnsuspended; } - } - catch (Exception) - { - Logger.LogWarning($"Failed to fix component {component} on {gameObject.name}"); + angler.enabled = true; + angler.OnChangeAnglerState(AnglerfishController.AnglerState.Lurking); } } - } + catch (Exception e) + { + Logger.LogWarning($"Exception when modifying component [{component.GetType().Name}] on [{planetGO.name}] for prop [{prefab}]:\n{e}"); + } + }); } } } \ No newline at end of file