mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Add shuttle builder
This commit is contained in:
parent
f7b59cfd62
commit
9d4dd66ea1
@ -12,6 +12,20 @@ namespace NewHorizons.Builder.Props
|
|||||||
{
|
{
|
||||||
public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, PlanetConfig config, IModBehaviour mod)
|
public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, PlanetConfig config, IModBehaviour mod)
|
||||||
{
|
{
|
||||||
|
if (config.Props.shuttles != null)
|
||||||
|
{
|
||||||
|
foreach (var shuttleInfo in config.Props.shuttles)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ShuttleBuilder.Make(go, sector, shuttleInfo);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError($"Couldn't make shuttle [{shuttleInfo.id}] for [{go.name}]:\n{ex}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (config.Props.scatter != null)
|
if (config.Props.scatter != null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
122
NewHorizons/Builder/Props/ShuttleBuilder.cs
Normal file
122
NewHorizons/Builder/Props/ShuttleBuilder.cs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
using NewHorizons.Components;
|
||||||
|
using NewHorizons.Components.Volumes;
|
||||||
|
using NewHorizons.External.Modules;
|
||||||
|
using NewHorizons.Handlers;
|
||||||
|
using NewHorizons.Utility;
|
||||||
|
using UnityEngine;
|
||||||
|
using Logger = NewHorizons.Utility.Logger;
|
||||||
|
|
||||||
|
namespace NewHorizons.Builder.Props
|
||||||
|
{
|
||||||
|
public static class ShuttleBuilder
|
||||||
|
{
|
||||||
|
private static GameObject _prefab;
|
||||||
|
private static GameObject _orbPrefab;
|
||||||
|
private static GameObject _bodyPrefab;
|
||||||
|
|
||||||
|
internal static void InitPrefab()
|
||||||
|
{
|
||||||
|
if (_prefab == null)
|
||||||
|
{
|
||||||
|
_prefab = SearchUtilities.Find("QuantumMoon_Body/Sector_QuantumMoon/QuantumShuttle/Prefab_NOM_Shuttle")?.InstantiateInactive()?.Rename("Prefab_QM_Shuttle")?.DontDestroyOnLoad();
|
||||||
|
NomaiShuttleController shuttleController = _prefab.GetComponent<NomaiShuttleController>();
|
||||||
|
NHShuttleController nhShuttleController = _prefab.AddComponent<NHShuttleController>();
|
||||||
|
nhShuttleController._exteriorSector = _prefab.FindChild("Sector_Shuttle").GetComponent<Sector>();
|
||||||
|
nhShuttleController._interiorSector = _prefab.FindChild("Sector_NomaiShuttleInterior").GetComponent<Sector>();
|
||||||
|
nhShuttleController._shuttleBody = shuttleController._shuttleBody;
|
||||||
|
nhShuttleController._retrievalLength = shuttleController._retrievalLength;
|
||||||
|
nhShuttleController._launchSlot = shuttleController._launchSlot;
|
||||||
|
nhShuttleController._retrieveSlot = shuttleController._retrieveSlot;
|
||||||
|
nhShuttleController._landSlot = shuttleController._landSlot;
|
||||||
|
nhShuttleController._triggerVolume = shuttleController._triggerVolume;
|
||||||
|
nhShuttleController._beamResetVolume = shuttleController._beamResetVolume;
|
||||||
|
nhShuttleController._tractorBeam = shuttleController._tractorBeam;
|
||||||
|
nhShuttleController._forceVolume = shuttleController._forceVolume;
|
||||||
|
nhShuttleController._exteriorCollisionGroup = shuttleController._exteriorCollisionGroup;
|
||||||
|
nhShuttleController._exteriorColliderRoot = shuttleController._exteriorColliderRoot;
|
||||||
|
nhShuttleController._landingBeamRoot = shuttleController._landingBeamRoot;
|
||||||
|
nhShuttleController._warpEffect = _prefab.GetComponentInChildren<SingularityWarpEffect>();
|
||||||
|
nhShuttleController._exteriorLegColliders = shuttleController._exteriorLegColliders;
|
||||||
|
nhShuttleController._id = NomaiShuttleController.ShuttleID.HourglassShuttle;
|
||||||
|
nhShuttleController._cannon = null;
|
||||||
|
GameObject slots = _prefab.FindChild("Sector_NomaiShuttleInterior/Interactibles_NomaiShuttleInterior/ControlPanel/Slots");
|
||||||
|
GameObject neutralSlotObject = new GameObject("Slot_Neutral", typeof(NomaiInterfaceSlot));
|
||||||
|
neutralSlotObject.transform.SetParent(slots.transform, false);
|
||||||
|
neutralSlotObject.transform.localPosition = new Vector3(-0.0153f, -0.2386f, 0.0205f);
|
||||||
|
neutralSlotObject.transform.localRotation = Quaternion.identity;
|
||||||
|
NomaiInterfaceSlot neutralSlot = neutralSlotObject.GetComponent<NomaiInterfaceSlot>();
|
||||||
|
neutralSlot._exitRadius = 0.1f;
|
||||||
|
neutralSlot._radius = 0.05f;
|
||||||
|
neutralSlot._attractive = true;
|
||||||
|
neutralSlot._muteAudio = true;
|
||||||
|
nhShuttleController._neutralSlot = neutralSlot;
|
||||||
|
_orbPrefab = shuttleController._orb.gameObject?.InstantiateInactive()?.Rename("Prefab_QM_Shuttle_InterfaceOrbSmall")?.DontDestroyOnLoad();
|
||||||
|
nhShuttleController._orb = _orbPrefab.GetComponent<NomaiInterfaceOrb>();
|
||||||
|
nhShuttleController._orb._sector = nhShuttleController._interiorSector;
|
||||||
|
nhShuttleController._orb._slotRoot = slots;
|
||||||
|
nhShuttleController._orb._safetyRails = slots.GetComponentsInChildren<OWRail>();
|
||||||
|
nhShuttleController._orb._slots = slots.GetComponentsInChildren<NomaiInterfaceSlot>();
|
||||||
|
_bodyPrefab = shuttleController._shuttleBody.gameObject?.InstantiateInactive()?.Rename("Prefab_QM_Shuttle_Body")?.DontDestroyOnLoad();
|
||||||
|
nhShuttleController._shuttleBody = _bodyPrefab.GetComponent<OWRigidbody>();
|
||||||
|
nhShuttleController._impactSensor = _bodyPrefab.GetComponent<ImpactSensor>();
|
||||||
|
nhShuttleController._forceApplier = _bodyPrefab.GetComponentInChildren<ForceApplier>();
|
||||||
|
nhShuttleController._detectorObj = nhShuttleController._forceApplier.gameObject;
|
||||||
|
GameObject.DestroyImmediate(shuttleController);
|
||||||
|
GameObject.DestroyImmediate(_prefab.FindChild("Sector_NomaiShuttleInterior/Interactibles_NomaiShuttleInterior/Prefab_NOM_Recorder"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GameObject Make(GameObject planetGO, Sector sector, PropModule.ShuttleInfo info)
|
||||||
|
{
|
||||||
|
InitPrefab();
|
||||||
|
|
||||||
|
if (_prefab == null || planetGO == null || sector == null) return null;
|
||||||
|
|
||||||
|
var detailInfo = new PropModule.DetailInfo()
|
||||||
|
{
|
||||||
|
position = info.position,
|
||||||
|
rotation = info.rotation,
|
||||||
|
parentPath = info.parentPath,
|
||||||
|
isRelativeToParent = info.isRelativeToParent,
|
||||||
|
rename = info.rename
|
||||||
|
};
|
||||||
|
var shuttleObject = DetailBuilder.Make(planetGO, sector, _prefab, detailInfo);
|
||||||
|
shuttleObject.SetActive(false);
|
||||||
|
|
||||||
|
StreamingHandler.SetUpStreaming(shuttleObject, sector);
|
||||||
|
|
||||||
|
NHShuttleController shuttleController = shuttleObject.GetComponent<NHShuttleController>();
|
||||||
|
NomaiShuttleController.ShuttleID id = ShuttleHandler.GetShuttleID(info.id);
|
||||||
|
shuttleController._id = id;
|
||||||
|
shuttleController._cannon = Locator.GetGravityCannon(id);
|
||||||
|
|
||||||
|
GameObject slots = shuttleObject.FindChild("Sector_NomaiShuttleInterior/Interactibles_NomaiShuttleInterior/ControlPanel/Slots");
|
||||||
|
GameObject orbObject = _orbPrefab.InstantiateInactive().Rename("InterfaceOrbSmall");
|
||||||
|
orbObject.transform.SetParent(slots.transform, false);
|
||||||
|
orbObject.transform.localPosition = new Vector3(-0.0153f, -0.2386f, 0.0205f);
|
||||||
|
shuttleController._orb = orbObject.GetComponent<NomaiInterfaceOrb>();
|
||||||
|
shuttleController._orb._sector = shuttleController._interiorSector;
|
||||||
|
shuttleController._orb._slotRoot = slots;
|
||||||
|
shuttleController._orb._safetyRails = slots.GetComponentsInChildren<OWRail>();
|
||||||
|
shuttleController._orb._slots = slots.GetComponentsInChildren<NomaiInterfaceSlot>();
|
||||||
|
|
||||||
|
StreamingHandler.SetUpStreaming(orbObject, sector);
|
||||||
|
|
||||||
|
GameObject bodyObject = _bodyPrefab.InstantiateInactive().Rename("Shuttle_Body");
|
||||||
|
bodyObject.transform.SetParent(shuttleObject.transform, false);
|
||||||
|
bodyObject.transform.localPosition = Vector3.zero;
|
||||||
|
bodyObject.transform.localEulerAngles = Vector3.zero;
|
||||||
|
shuttleController._shuttleBody = bodyObject.GetComponent<OWRigidbody>();
|
||||||
|
shuttleController._impactSensor = bodyObject.GetComponent<ImpactSensor>();
|
||||||
|
shuttleController._forceApplier = bodyObject.GetComponentInChildren<ForceApplier>();
|
||||||
|
shuttleController._detectorObj = shuttleController._forceApplier.gameObject;
|
||||||
|
|
||||||
|
shuttleObject.SetActive(true);
|
||||||
|
bodyObject.SetActive(true);
|
||||||
|
orbObject.SetActive(true);
|
||||||
|
shuttleController._orb.RemoveAllLocks();
|
||||||
|
|
||||||
|
return shuttleObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
NewHorizons/Components/NHShuttleController.cs
Normal file
17
NewHorizons/Components/NHShuttleController.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using NewHorizons.Utility;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace NewHorizons.Components
|
||||||
|
{
|
||||||
|
public class NHShuttleController : NomaiShuttleController
|
||||||
|
{
|
||||||
|
public NomaiInterfaceSlot _neutralSlot;
|
||||||
|
public Sector _exteriorSector;
|
||||||
|
public Sector _interiorSector;
|
||||||
|
}
|
||||||
|
}
|
||||||
39
NewHorizons/External/Modules/PropModule.cs
vendored
39
NewHorizons/External/Modules/PropModule.cs
vendored
@ -83,6 +83,11 @@ namespace NewHorizons.External.Modules
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SignalModule.SignalInfo[] signals;
|
public SignalModule.SignalInfo[] signals;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add shuttles to this planet
|
||||||
|
/// </summary>
|
||||||
|
public ShuttleInfo[] shuttles;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add projection pools/platforms, whiteboards, and stones to this planet
|
/// Add projection pools/platforms, whiteboards, and stones to this planet
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1000,5 +1005,39 @@ namespace NewHorizons.External.Modules
|
|||||||
public string rename;
|
public string rename;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[JsonObject]
|
||||||
|
public class ShuttleInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The unique shuttle id
|
||||||
|
/// </summary>
|
||||||
|
public string id;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The location of this shuttle.
|
||||||
|
/// </summary>
|
||||||
|
public MVector3 position;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The rotation of this shuttle.
|
||||||
|
/// </summary>
|
||||||
|
public MVector3 rotation;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The relative path from the planet to the parent of this object. Optional (will default to the root sector).
|
||||||
|
/// </summary>
|
||||||
|
public string parentPath;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the positional and rotational coordinates are relative to parent instead of the root planet object.
|
||||||
|
/// </summary>
|
||||||
|
public bool isRelativeToParent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// An optional rename of this object
|
||||||
|
/// </summary>
|
||||||
|
public string rename;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -288,6 +288,7 @@ namespace NewHorizons
|
|||||||
VolcanoBuilder.InitPrefab();
|
VolcanoBuilder.InitPrefab();
|
||||||
VolumesBuilder.InitPrefabs();
|
VolumesBuilder.InitPrefabs();
|
||||||
WaterBuilder.InitPrefabs();
|
WaterBuilder.InitPrefabs();
|
||||||
|
ShuttleBuilder.InitPrefab();
|
||||||
|
|
||||||
ProjectionBuilder.InitPrefabs();
|
ProjectionBuilder.InitPrefabs();
|
||||||
CloakBuilder.InitPrefab();
|
CloakBuilder.InitPrefab();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user