From 27a3bfce3b0c659a7b78522660c8b4e9a89e20c2 Mon Sep 17 00:00:00 2001 From: _nebula <41904486+misternebula@users.noreply.github.com> Date: Mon, 6 Jan 2025 20:23:11 +0000 Subject: [PATCH] Fix #751 Uses socket rotation if non-null, adds field to props to choose whether to randomize Y rotation. --- NewHorizons/Builder/Props/PropBuildManager.cs | 6 +++--- NewHorizons/Builder/Props/QuantumBuilder.cs | 20 +++++++++++-------- .../External/Modules/Props/DetailInfo.cs | 5 +++++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 74d638e9..94c95afc 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -164,13 +164,13 @@ namespace NewHorizons.Builder.Props if (config.Props.quantumGroups != null) { - Dictionary> propsByGroup = new Dictionary>(); + var propsByGroup = new Dictionary>(); foreach (var detail in config.Props.details) { if (detail.quantumGroupID != null) { - if (!propsByGroup.ContainsKey(detail.quantumGroupID)) propsByGroup[detail.quantumGroupID] = new List(); - propsByGroup[detail.quantumGroupID].Add(DetailBuilder.GetSpawnedGameObjectByDetailInfo(detail)); + if (!propsByGroup.ContainsKey(detail.quantumGroupID)) propsByGroup[detail.quantumGroupID] = new List<(GameObject go, bool randomizeYRotation)>(); + propsByGroup[detail.quantumGroupID].Add((DetailBuilder.GetSpawnedGameObjectByDetailInfo(detail), detail.quantumRandomizeYRotation)); } } diff --git a/NewHorizons/Builder/Props/QuantumBuilder.cs b/NewHorizons/Builder/Props/QuantumBuilder.cs index 0448eb7d..39b49a59 100644 --- a/NewHorizons/Builder/Props/QuantumBuilder.cs +++ b/NewHorizons/Builder/Props/QuantumBuilder.cs @@ -13,25 +13,27 @@ namespace NewHorizons.Builder.Props public static class QuantumBuilder { - public static void Make(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) + public static void Make(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, (GameObject go, bool randomizeY)[] propsInGroup) { switch (quantumGroup.type) { case QuantumGroupType.Sockets: MakeSocketGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; - case QuantumGroupType.States: MakeStateGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; + case QuantumGroupType.States: MakeStateGroup(go, sector, config, mod, quantumGroup, propsInGroup.Select(x => x.go).ToArray()); return; // case PropModule.QuantumGroupType.Shuffle: MakeShuffleGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; } } // TODO: Socket groups that have an equal number of props and sockets // 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 go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) + public static void MakeSocketGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, (GameObject go, bool randomizeY)[] propsInGroup) { var groupRoot = new GameObject("Quantum Sockets - " + quantumGroup.id); groupRoot.transform.parent = sector?.transform ?? go.transform; groupRoot.transform.localPosition = Vector3.zero; groupRoot.transform.localEulerAngles = Vector3.zero; + var useSocketRotation = quantumGroup.sockets.All(x => x.rotation != null); + var sockets = new QuantumSocket[quantumGroup.sockets.Length]; for (int i = 0; i < quantumGroup.sockets.Length; i++) { @@ -46,16 +48,18 @@ namespace NewHorizons.Builder.Props foreach (var prop in propsInGroup) { - prop.SetActive(false); - var quantumObject = prop.AddComponent(); + prop.go.SetActive(false); + var quantumObject = prop.go.AddComponent(); quantumObject._socketRoot = groupRoot; quantumObject._socketList = sockets.ToList(); quantumObject._sockets = sockets; quantumObject._prebuilt = true; + quantumObject._alignWithSocket = useSocketRotation; + quantumObject._randomYRotation = prop.randomizeY; + quantumObject._alignWithGravity = !useSocketRotation; quantumObject._childSockets = new List(); - // TODO: support _alignWithGravity? - if (prop.GetComponentInChildren() == null) AddBoundsVisibility(prop); - prop.SetActive(true); + if (prop.go.GetComponentInChildren() == null) AddBoundsVisibility(prop.go); + prop.go.SetActive(true); } } diff --git a/NewHorizons/External/Modules/Props/DetailInfo.cs b/NewHorizons/External/Modules/Props/DetailInfo.cs index 9cc8feb0..78784983 100644 --- a/NewHorizons/External/Modules/Props/DetailInfo.cs +++ b/NewHorizons/External/Modules/Props/DetailInfo.cs @@ -53,6 +53,11 @@ namespace NewHorizons.External.Modules.Props /// public string quantumGroupID; + /// + /// If this prop is quantum, and the quantum group is socketed, this field determines whether the prop will randomly choose a Y rotation when moving to a socket. + /// + public bool quantumRandomizeYRotation = true; + /// /// Should this detail stay loaded (visible and collideable) even if you're outside the sector (good for very large props)? /// Also makes this detail visible on the map.