From e4c8b14f6fbaf9736a459e4cd3bc0bb255e92b23 Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 22 Jul 2023 14:41:01 -0400 Subject: [PATCH] Add in the platform, allow separately placing the cannon and the controls --- .../Builder/Props/GravityCannonBuilder.cs | 71 +++++++++++++------ .../External/Modules/GeneralPropInfo.cs | 2 +- .../Props/Shuttle/GravityCannonInfo.cs | 7 ++ 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/NewHorizons/Builder/Props/GravityCannonBuilder.cs b/NewHorizons/Builder/Props/GravityCannonBuilder.cs index 3ccb0ada..39ae8bdf 100644 --- a/NewHorizons/Builder/Props/GravityCannonBuilder.cs +++ b/NewHorizons/Builder/Props/GravityCannonBuilder.cs @@ -6,37 +6,47 @@ using NewHorizons.Handlers; using NewHorizons.Utility; using NewHorizons.Utility.OWML; using OWML.Common; -using System; using UnityEngine; -using UnityEngine.InputSystem.XR; namespace NewHorizons.Builder.Props { public static class GravityCannonBuilder { - private static GameObject _prefab; - private static GameObject _orb; + private static GameObject _interfacePrefab; + private static GameObject _platformPrefab; + private static GameObject _orbPrefab; internal static void InitPrefab() { - if (_prefab == null) + if (_interfacePrefab == null) { - var original = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Interactables_GravityCannon/Prefab_NOM_GravityCannonInterface"); - _prefab = original?.InstantiateInactive()?.Rename("Prefab_GravityCannon")?.DontDestroyOnLoad(); - _prefab.transform.position = original.transform.position; - _prefab.transform.rotation = original.transform.rotation; - var gravityCannonController = _prefab.GetComponent(); - gravityCannonController._shuttleID = NomaiShuttleController.ShuttleID.HourglassShuttle; - gravityCannonController._shuttleSocket = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Interactables_GravityCannon/Prefab_NOM_ShuttleSocket"), _prefab.transform, true).Rename("ShuttleSocket").transform; - gravityCannonController._warpEffect = gravityCannonController._shuttleSocket.GetComponentInChildren(); - gravityCannonController._recallProxyGeometry = gravityCannonController._shuttleSocket.gameObject.FindChild("ShuttleRecallProxy"); - gravityCannonController._forceVolume = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Interactables_GravityCannon/CannonForceVolume"), _prefab.transform, true).Rename("ForceVolume").GetComponent(); - gravityCannonController._platformTrigger = GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Volumes_GravityCannon/CannonPlatformTrigger"), _prefab.transform, true).Rename("PlatformTrigger").GetComponent(); - gravityCannonController._nomaiComputer = null; + _interfacePrefab = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Interactables_GravityCannon/Prefab_NOM_GravityCannonInterface") + .InstantiateInactive() + .Rename("Prefab_GravityCannon") + .DontDestroyOnLoad(); } - if (_orb == null) + if (_platformPrefab == null) { - _orb = SearchUtilities.Find("Prefab_NOM_InterfaceOrb") + // Creating it in the original position so we can instantiate the other parts in the right relative positions + var original = SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Geometry_GravityCannon/ControlledByProxy_OPC/Structure_NOM_GravityCannon_BH"); + _platformPrefab = original + .InstantiateInactive() + .Rename("Prefab_GravityCannonPlatform") + .DontDestroyOnLoad(); + _platformPrefab.transform.position = original.transform.position; + _platformPrefab.transform.rotation = original.transform.rotation; + + GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Interactables_GravityCannon/Prefab_NOM_ShuttleSocket"), _platformPrefab.transform, true) + .Rename("ShuttleSocket"); + GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Interactables_GravityCannon/CannonForceVolume"), _platformPrefab.transform, true) + .Rename("ForceVolume"); + GameObject.Instantiate(SearchUtilities.Find("BrittleHollow_Body/Sector_BH/Sector_GravityCannon/Volumes_GravityCannon/CannonPlatformTrigger"), _platformPrefab.transform, true) + .Rename("PlatformTrigger"); + } + + if (_orbPrefab == null) + { + _orbPrefab = SearchUtilities.Find("Prefab_NOM_InterfaceOrb") .InstantiateInactive() .Rename("Prefab_NOM_InterfaceOrb") .DontDestroyOnLoad(); @@ -47,10 +57,10 @@ namespace NewHorizons.Builder.Props { InitPrefab(); - if (_prefab == null || planetGO == null || sector == null) return null; + if (_interfacePrefab == null || planetGO == null || sector == null || _platformPrefab == null || _orbPrefab == null) return null; - var detailInfo = new DetailInfo(info) { keepLoaded = true }; - var gravityCannonObject = DetailBuilder.Make(planetGO, sector, _prefab, detailInfo); + var detailInfo = new DetailInfo(info.controls) { keepLoaded = true }; + var gravityCannonObject = DetailBuilder.Make(planetGO, sector, _interfacePrefab, detailInfo); gravityCannonObject.SetActive(false); var gravityCannonController = gravityCannonObject.GetComponent(); @@ -60,6 +70,8 @@ namespace NewHorizons.Builder.Props gravityCannonController._retrieveShipLogFact = info.retrieveReveal ?? string.Empty; gravityCannonController._launchShipLogFact = info.launchReveal ?? string.Empty; + CreatePlatform(planetGO, sector, gravityCannonController, info); + if (info.computer != null) { gravityCannonController._nomaiComputer = CreateComputer(planetGO, sector, info.computer); @@ -78,7 +90,7 @@ namespace NewHorizons.Builder.Props private static void CreateOrb(GameObject planetGO, GravityCannonController gravityCannonController) { - var orb = _orb.InstantiateInactive().Rename(_orb.name); + var orb = _orbPrefab.InstantiateInactive().Rename(_orbPrefab.name); orb.transform.parent = gravityCannonController.transform; orb.transform.localPosition = new Vector3(0f, 0.9673f, 0f); orb.transform.localScale = Vector3.one; @@ -129,5 +141,18 @@ namespace NewHorizons.Builder.Props return computer; } + + private static GameObject CreatePlatform(GameObject planetGO, Sector sector, GravityCannonController gravityCannonController, GeneralPropInfo platformInfo) + { + var platform = DetailBuilder.Make(planetGO, sector, _platformPrefab, new DetailInfo(platformInfo) { keepLoaded = true }); + + gravityCannonController._forceVolume = platform.FindChild("ForceVolume").GetComponent(); + gravityCannonController._platformTrigger = platform.FindChild("PlatformTrigger").GetComponent(); + gravityCannonController._shuttleSocket = platform.FindChild("ShuttleSocket").transform; + gravityCannonController._warpEffect = gravityCannonController._shuttleSocket.GetComponentInChildren(); + gravityCannonController._recallProxyGeometry = gravityCannonController._shuttleSocket.gameObject.FindChild("ShuttleRecallProxy"); + + return platform; + } } } diff --git a/NewHorizons/External/Modules/GeneralPropInfo.cs b/NewHorizons/External/Modules/GeneralPropInfo.cs index 5b4d9b02..fc855f9a 100644 --- a/NewHorizons/External/Modules/GeneralPropInfo.cs +++ b/NewHorizons/External/Modules/GeneralPropInfo.cs @@ -29,7 +29,7 @@ namespace NewHorizons.External.Modules } [JsonObject] - public abstract class GeneralPropInfo : GeneralPointPropInfo + public class GeneralPropInfo : GeneralPointPropInfo { /// /// Rotation of the object diff --git a/NewHorizons/External/Modules/Props/Shuttle/GravityCannonInfo.cs b/NewHorizons/External/Modules/Props/Shuttle/GravityCannonInfo.cs index 7f6a3b84..1e296f60 100644 --- a/NewHorizons/External/Modules/Props/Shuttle/GravityCannonInfo.cs +++ b/NewHorizons/External/Modules/Props/Shuttle/GravityCannonInfo.cs @@ -1,7 +1,9 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -29,5 +31,10 @@ namespace NewHorizons.External.Modules.Props.Shuttle /// Will create a modern Nomai computer linked to this gravity cannon. /// public NomaiComputerInfo computer; + + /// + /// Position of the interface used to launc the shuttle + /// + public GeneralPropInfo controls; } }