From 37c90f52f0c61c720f5119d44bb815edb2707313 Mon Sep 17 00:00:00 2001 From: xen-42 Date: Tue, 7 Jan 2025 16:48:56 -0500 Subject: [PATCH] Turn quantum lightning into a prop based thing, make quantum details build with the repeat-10-times-for-parent-to-exist thing for back compat --- NewHorizons/Builder/Props/DetailBuilder.cs | 17 ++++++++++++ NewHorizons/Builder/Props/PropBuildManager.cs | 8 +++--- NewHorizons/Builder/Props/QuantumBuilder.cs | 27 +++++-------------- NewHorizons/External/Modules/PropModule.cs | 2 +- .../Quantum/LightningQuantumGroupInfo.cs | 14 ---------- .../Props/Quantum/LightningQuantumInfo.cs | 12 +++++++++ 6 files changed, 40 insertions(+), 40 deletions(-) delete mode 100644 NewHorizons/External/Modules/Props/Quantum/LightningQuantumGroupInfo.cs create mode 100644 NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index d2243713..2b7dbfde 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -22,6 +22,20 @@ namespace NewHorizons.Builder.Props private static readonly Dictionary<(Sector, string), (GameObject prefab, bool isItem)> _fixedPrefabCache = new(); private static GameObject _emptyPrefab; + private static readonly Dictionary _detailInfoToGameObject = new(); + + public static GameObject GetGameObjectFromDetailInfo(DetailInfo info) + { + if (_detailInfoToGameObject.ContainsKey(info)) + { + return _detailInfoToGameObject[info]; + } + else + { + return null; + } + } + static DetailBuilder() { SceneManager.sceneUnloaded += SceneManager_sceneUnloaded; @@ -47,6 +61,7 @@ namespace NewHorizons.Builder.Props UnityEngine.Object.Destroy(prefab.prefab); } _fixedPrefabCache.Clear(); + _detailInfoToGameObject.Clear(); } /// @@ -286,6 +301,8 @@ namespace NewHorizons.Builder.Props ConditionalObjectActivation.SetUp(prop, detail.deactivationCondition, detail.blinkWhenActiveChanged, false); } + _detailInfoToGameObject[detail] = prop; + return prop; } diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 43a10ab4..579d5e21 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -6,15 +6,12 @@ using NewHorizons.Builder.ShipLog; using NewHorizons.External; using NewHorizons.External.Configs; using NewHorizons.External.Modules; -using NewHorizons.External.Modules.Props; -using NewHorizons.External.Modules.Props.Quantum; using NewHorizons.Utility; using NewHorizons.Utility.OWML; using OWML.Common; using System; using System.Collections.Generic; using System.Linq; -using NewHorizons.External.Modules.Props; using UnityEngine; namespace NewHorizons.Builder.Props @@ -143,6 +140,10 @@ namespace NewHorizons.Builder.Props MakeGeneralProps(go, config.Props.audioSources, (audioSource) => AudioSourceBuilder.Make(go, sector, audioSource, mod), (audioSource) => audioSource.audio); RemoteBuilder.MakeGeneralProps(go, sector, config.Props.remotes, nhBody); if (Main.HasDLC) MakeGeneralProps(go, config.Props.projectionTotems, (totem) => ProjectionTotemBuilder.Make(go, sector, totem, mod)); + // For quantum groups, make the details in advance + if (config.Props.socketQuantumGroups != null) MakeGeneralProps(go, config.Props.socketQuantumGroups.SelectMany(x => x.details), (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path); + if (config.Props.stateQuantumGroups != null) MakeGeneralProps(go, config.Props.stateQuantumGroups.SelectMany(x => x.details), (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path); + if (config.Props.lightningQuantumGroups != null) MakeGeneralProps(go, config.Props.lightningQuantumGroups, (lightning) => QuantumBuilder.MakeQuantumLightning(go, sector, mod, lightning)); RunMultiPass(); @@ -165,7 +166,6 @@ namespace NewHorizons.Builder.Props } } - if (config.Props.lightningQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.lightningQuantumGroups); if (config.Props.socketQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.socketQuantumGroups); if (config.Props.stateQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.stateQuantumGroups); } diff --git a/NewHorizons/Builder/Props/QuantumBuilder.cs b/NewHorizons/Builder/Props/QuantumBuilder.cs index b0a35ab1..90227e11 100644 --- a/NewHorizons/Builder/Props/QuantumBuilder.cs +++ b/NewHorizons/Builder/Props/QuantumBuilder.cs @@ -1,16 +1,13 @@ using NewHorizons.Components.Quantum; -using NewHorizons.External.Configs; using NewHorizons.External.Modules.Props; using NewHorizons.External.Modules.Props.Quantum; using NewHorizons.Utility.Files; using NewHorizons.Utility.Geometry; using NewHorizons.Utility.OWML; -using System; +using OWML.Common; using System.Collections.Generic; using System.Linq; -using NewHorizons.External.Modules.Props; using UnityEngine; -using OWML.Common; namespace NewHorizons.Builder.Props { @@ -40,26 +37,14 @@ namespace NewHorizons.Builder.Props { MakeStateGroup(planetGO, sector, mod, stateGroup); } - else if (quantumGroup is LightningQuantumGroupInfo lightningGroup) - { - MakeQuantumLightning(planetGO, sector, mod, lightningGroup); - } } - public static void MakeQuantumLightning(GameObject planetGO, Sector sector, IModBehaviour mod, LightningQuantumGroupInfo quantumGroup) + public static void MakeQuantumLightning(GameObject planetGO, Sector sector, IModBehaviour mod, LightningQuantumInfo quantumGroup) { - (GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray(); + (GameObject go, DetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray(); - // Bases its position off the first object with position set - var root = propsInGroup.FirstOrDefault(x => x.detail.position != null || x.detail.rotation != null || x.detail.isRelativeToParent); - - var rootGo = root == default ? sector.gameObject : root.go; - - var lightning = DetailBuilder.Make(planetGO, sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("Prefab_EYE_QuantumLightningObject"), new DetailInfo()); + var lightning = DetailBuilder.Make(planetGO, sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("Prefab_EYE_QuantumLightningObject"), new DetailInfo(quantumGroup)); AssetBundleUtilities.ReplaceShaders(lightning); - lightning.transform.position = rootGo.transform.position; - lightning.transform.rotation = rootGo.transform.rotation; - lightning.transform.parent = rootGo.transform.parent; foreach (var (go, _) in propsInGroup) { @@ -82,7 +67,7 @@ namespace NewHorizons.Builder.Props // Nice to have: socket groups that specify a filledSocketObject and an emptySocketObject (eg the archway in the giant's deep tower) public static void MakeSocketGroup(GameObject planetGO, Sector sector, IModBehaviour mod, SocketQuantumGroupInfo quantumGroup) { - (GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray(); + (GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.GetGameObjectFromDetailInfo(x), x)).ToArray(); GameObject specialProp = null; QuantumDetailInfo specialInfo = null; @@ -177,7 +162,7 @@ namespace NewHorizons.Builder.Props // while states put the QuantumObject component (NHMultiStateQuantumObject) on the parent, which is located at the center of the planet // this means that the distance measured by QuantumObject is not accurate, since it's not measuring from the active prop, but from the center of the planet - var propsInGroup = quantumGroup.details.Select(x => DetailBuilder.Make(go, sector, mod, x)).ToArray(); + var propsInGroup = quantumGroup.details.Select(x => DetailBuilder.GetGameObjectFromDetailInfo(x)).ToArray(); var groupRoot = new GameObject(quantumGroup.rename); groupRoot.transform.parent = sector?.transform ?? go.transform; diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index e2f1200b..4a162bd8 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -132,7 +132,7 @@ namespace NewHorizons.External.Modules /// /// Add quantum lightning to a planet. When lightning strikes, a different detail object is shown. The lightning will take the first defined position/rotation for all objects. /// - public LightningQuantumGroupInfo[] lightningQuantumGroups; + public LightningQuantumInfo[] lightningQuantumGroups; /// /// Add campfires that allow you to enter the dream world/simulation (requires Echoes of the Eye DLC). Must be paired with a dream arrival point, which can be placed on this planet or elsewhere. diff --git a/NewHorizons/External/Modules/Props/Quantum/LightningQuantumGroupInfo.cs b/NewHorizons/External/Modules/Props/Quantum/LightningQuantumGroupInfo.cs deleted file mode 100644 index 421c0d2e..00000000 --- a/NewHorizons/External/Modules/Props/Quantum/LightningQuantumGroupInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NewHorizons.External.Modules.Props.Quantum; - -[JsonObject] -public class LightningQuantumGroupInfo : BaseQuantumGroupInfo -{ - -} diff --git a/NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs b/NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs new file mode 100644 index 00000000..3c370dd1 --- /dev/null +++ b/NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace NewHorizons.External.Modules.Props.Quantum; + +[JsonObject] +public class LightningQuantumInfo : GeneralPropInfo +{ + /// + /// List of props which will be alternated between during flashes of lightning + /// + public DetailInfo[] details; +}