mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Move everything to VesselWarpHandler
This commit is contained in:
parent
89ce1d5228
commit
071901517a
164
NewHorizons/Handlers/VesselWarpHandler.cs
Normal file
164
NewHorizons/Handlers/VesselWarpHandler.cs
Normal file
@ -0,0 +1,164 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using NewHorizons.Utility;
|
||||
using Logger = NewHorizons.Utility.Logger;
|
||||
using static NewHorizons.Main;
|
||||
|
||||
namespace NewHorizons.Handlers
|
||||
{
|
||||
public static class VesselWarpHandler
|
||||
{
|
||||
public static AssetBundle VesselBundle { get; private set; }
|
||||
public static GameObject VesselPrefab { get; private set; }
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
VesselBundle = Main.Instance.ModHelper.Assets.LoadBundle("Assets/vessel.newhorizons");
|
||||
VesselPrefab = VesselBundle.LoadAsset<GameObject>("Vessel_Body");
|
||||
}
|
||||
|
||||
public static void OnReceiveWarpedBody(OWRigidbody warpedBody, NomaiWarpPlatform startPlatform, NomaiWarpPlatform targetPlatform)
|
||||
{
|
||||
bool isPlayer = warpedBody.CompareTag("Player");
|
||||
if (isPlayer)
|
||||
{
|
||||
Transform player_body = Locator.GetPlayerTransform();
|
||||
OWRigidbody s_rb = Locator.GetShipBody();
|
||||
OWRigidbody p_rb = Locator.GetPlayerBody();
|
||||
Vector3 newPos = player_body.position;
|
||||
Vector3 offset = player_body.up * 10;
|
||||
newPos += offset;
|
||||
s_rb.SetPosition(newPos);
|
||||
s_rb.SetRotation(player_body.transform.rotation);
|
||||
s_rb.SetVelocity(p_rb.GetVelocity());
|
||||
}
|
||||
}
|
||||
|
||||
public static EyeSpawnPoint CreateVessel()
|
||||
{
|
||||
var system = SystemDict[Instance.CurrentStarSystem];
|
||||
Logger.Log("Checking for Vessel Prefab");
|
||||
if (VesselPrefab == null) return null;
|
||||
Logger.Log("Creating Vessel");
|
||||
var vesselObject = GameObject.Instantiate(VesselPrefab);
|
||||
vesselObject.name = VesselPrefab.name;
|
||||
vesselObject.transform.parent = null;
|
||||
if (system.Config.vesselPosition != null)
|
||||
vesselObject.transform.position += system.Config.vesselPosition;
|
||||
if (system.Config.vesselRotation != null)
|
||||
vesselObject.transform.eulerAngles = system.Config.vesselRotation;
|
||||
|
||||
VesselWarpController vesselWarpController = vesselObject.GetComponentInChildren<VesselWarpController>(true);
|
||||
vesselWarpController._sourceWarpPlatform.transform.DestroyAllChildren();
|
||||
vesselWarpController._targetWarpPlatform.transform.DestroyAllChildren();
|
||||
GameObject.Destroy(vesselWarpController._blackHole.transform.parent.gameObject);
|
||||
GameObject.Destroy(vesselWarpController._whiteHole.transform.parent.gameObject);
|
||||
GameObject WarpPlatform = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension/Sector_VesselBridge/Interactibles_VesselBridge/WarpController/Prefab_NOM_WarpPlatform");
|
||||
GameObject warpBH = WarpPlatform.transform.Find("BlackHole").gameObject;
|
||||
GameObject warpWH = WarpPlatform.transform.Find("WhiteHole").gameObject;
|
||||
GameObject sourceBH = GameObject.Instantiate(warpBH, vesselWarpController._sourceWarpPlatform.transform, false);
|
||||
vesselWarpController._sourceWarpPlatform._blackHole = sourceBH.GetComponentInChildren<SingularityController>();
|
||||
GameObject sourceWH = GameObject.Instantiate(warpWH, vesselWarpController._sourceWarpPlatform.transform, false);
|
||||
vesselWarpController._sourceWarpPlatform._whiteHole = sourceWH.GetComponentInChildren<SingularityController>();
|
||||
GameObject targetBH = GameObject.Instantiate(warpBH, vesselWarpController._targetWarpPlatform.transform, false);
|
||||
vesselWarpController._targetWarpPlatform._blackHole = targetBH.GetComponentInChildren<SingularityController>();
|
||||
GameObject targetWH = GameObject.Instantiate(warpWH, vesselWarpController._targetWarpPlatform.transform, false);
|
||||
vesselWarpController._targetWarpPlatform._whiteHole = targetWH.GetComponentInChildren<SingularityController>();
|
||||
GameObject blackHole = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension/Sector_VesselBridge/Interactibles_VesselBridge/BlackHole");
|
||||
GameObject newBlackHole = GameObject.Instantiate(blackHole, vesselWarpController.transform.parent, false);
|
||||
newBlackHole.name = "BlackHole";
|
||||
vesselWarpController._blackHole = newBlackHole.GetComponentInChildren<SingularityController>();
|
||||
vesselWarpController._blackHoleOneShot = vesselWarpController._blackHole.transform.parent.Find("BlackHoleAudio_OneShot").GetComponent<OWAudioSource>();
|
||||
GameObject whiteHole = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension/Sector_VesselBridge/Interactibles_VesselBridge/WhiteHole");
|
||||
GameObject newWhiteHole = GameObject.Instantiate(whiteHole, vesselWarpController.transform.parent, false);
|
||||
newWhiteHole.name = "WhiteHole";
|
||||
vesselWarpController._whiteHole = newWhiteHole.GetComponentInChildren<SingularityController>();
|
||||
vesselWarpController._whiteHoleOneShot = vesselWarpController._whiteHole.transform.parent.Find("WhiteHoleAudio_OneShot").GetComponent<OWAudioSource>();
|
||||
|
||||
vesselObject.SetActive(true);
|
||||
vesselWarpController._targetWarpPlatform.OnReceiveWarpedBody += OnReceiveWarpedBody;
|
||||
if (system.Config.warpExitPosition != null)
|
||||
vesselWarpController._targetWarpPlatform.transform.localPosition = system.Config.warpExitPosition;
|
||||
if (system.Config.warpExitRotation != null)
|
||||
vesselObject.transform.localEulerAngles = system.Config.warpExitRotation;
|
||||
vesselObject.GetComponent<MapMarker>()._labelID = (UITextType)TranslationHandler.AddUI("Vessel");
|
||||
EyeSpawnPoint eyeSpawnPoint = vesselObject.GetComponentInChildren<EyeSpawnPoint>(true);
|
||||
system.SpawnPoint = eyeSpawnPoint;
|
||||
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => SetupWarpController(vesselWarpController));
|
||||
return eyeSpawnPoint;
|
||||
}
|
||||
|
||||
public static SpawnPoint UpdateVessel()
|
||||
{
|
||||
var system = SystemDict[Instance.CurrentStarSystem];
|
||||
var vectorSector = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension");
|
||||
var spawnPoint = vectorSector.GetComponentInChildren<SpawnPoint>();
|
||||
system.SpawnPoint = spawnPoint;
|
||||
VesselWarpController vesselWarpController = vectorSector.GetComponentInChildren<VesselWarpController>(true);
|
||||
if (vesselWarpController._targetWarpPlatform != null)
|
||||
vesselWarpController._targetWarpPlatform.OnReceiveWarpedBody += OnReceiveWarpedBody;
|
||||
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, true));
|
||||
return spawnPoint;
|
||||
}
|
||||
|
||||
public static void SetupWarpController(VesselWarpController vesselWarpController, bool db = false)
|
||||
{
|
||||
if (db)
|
||||
{
|
||||
//Make warp core
|
||||
foreach (WarpCoreItem core in Resources.FindObjectsOfTypeAll<WarpCoreItem>())
|
||||
{
|
||||
if (core.GetWarpCoreType().Equals(WarpCoreType.Vessel))
|
||||
{
|
||||
var newCore = GameObject.Instantiate(core, AstroObjectLocator.GetAstroObject("Vessel Dimension")?.transform ?? Locator.GetPlayerBody()?.transform);
|
||||
newCore._visible = true;
|
||||
foreach (OWRenderer render in newCore._renderers)
|
||||
{
|
||||
if (render)
|
||||
{
|
||||
render.enabled = true;
|
||||
render.SetActivation(true);
|
||||
render.SetLODActivation(true);
|
||||
if (render.GetRenderer()) render.GetRenderer().enabled = true;
|
||||
}
|
||||
}
|
||||
foreach (ParticleSystem particleSystem in newCore._particleSystems)
|
||||
{
|
||||
if (particleSystem) particleSystem.Play(true);
|
||||
}
|
||||
foreach (OWLight2 light in newCore._lights)
|
||||
{
|
||||
if (light)
|
||||
{
|
||||
light.enabled = true;
|
||||
light.SetActivation(true);
|
||||
light.SetLODActivation(true);
|
||||
if (light.GetLight()) light.GetLight().enabled = true;
|
||||
}
|
||||
}
|
||||
vesselWarpController._coreSocket.PlaceIntoSocket(newCore);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
vesselWarpController.OnSlotDeactivated(vesselWarpController._coordinatePowerSlot);
|
||||
if (!db) vesselWarpController.OnSlotActivated(vesselWarpController._coordinatePowerSlot);
|
||||
vesselWarpController._gravityVolume.SetFieldMagnitude(vesselWarpController._origGravityMagnitude);
|
||||
vesselWarpController._coreCable.SetPowered(true);
|
||||
vesselWarpController._coordinateCable.SetPowered(!db);
|
||||
vesselWarpController._warpPlatformCable.SetPowered(false);
|
||||
vesselWarpController._cageClosed = true;
|
||||
if (vesselWarpController._cageAnimator != null)
|
||||
{
|
||||
vesselWarpController._cageAnimator.TranslateToLocalPosition(new Vector3(0.0f, -8.1f, 0.0f), 0.1f);
|
||||
vesselWarpController._cageAnimator.RotateToLocalEulerAngles(new Vector3(0.0f, 180f, 0.0f), 0.1f);
|
||||
vesselWarpController._cageAnimator.OnTranslationComplete -= new TransformAnimator.AnimationEvent(vesselWarpController.OnCageAnimationComplete);
|
||||
vesselWarpController._cageAnimator.OnTranslationComplete += new TransformAnimator.AnimationEvent(vesselWarpController.OnCageAnimationComplete);
|
||||
}
|
||||
if (vesselWarpController._cageLoopingAudio != null)
|
||||
vesselWarpController._cageLoopingAudio.FadeIn(1f);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -24,7 +24,6 @@ namespace NewHorizons
|
||||
public class Main : ModBehaviour
|
||||
{
|
||||
public static AssetBundle NHAssetBundle { get; private set; }
|
||||
public static AssetBundle VesselBundle { get; private set; }
|
||||
public static Main Instance { get; private set; }
|
||||
|
||||
// Settings
|
||||
@ -58,7 +57,6 @@ namespace NewHorizons
|
||||
|
||||
// Vessel
|
||||
private SpawnPoint _vesselSpawnPoint;
|
||||
private static GameObject VesselPrefab = null;
|
||||
|
||||
// API events
|
||||
public class StarSystemEvent : UnityEvent<string> { }
|
||||
@ -156,8 +154,7 @@ namespace NewHorizons
|
||||
|
||||
GlobalMessenger.AddListener("WakeUp", OnWakeUp);
|
||||
NHAssetBundle = ModHelper.Assets.LoadBundle("Assets/xen.newhorizons");
|
||||
VesselBundle = ModHelper.Assets.LoadBundle("Assets/vessel.newhorizons");
|
||||
VesselPrefab = VesselBundle.LoadAsset<GameObject>("Vessel_Body");
|
||||
VesselWarpHandler.Initialize();
|
||||
|
||||
ResetConfigs(resetTranslation: false);
|
||||
|
||||
@ -272,7 +269,7 @@ namespace NewHorizons
|
||||
OWAssetHandler.Init();
|
||||
PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]);
|
||||
if (IsWarpingFromVessel)
|
||||
_vesselSpawnPoint = CurrentStarSystem == "SolarSystem" ? UpdateVessel() : CreateVessel();
|
||||
_vesselSpawnPoint = CurrentStarSystem == "SolarSystem" ? VesselWarpHandler.UpdateVessel() : VesselWarpHandler.CreateVessel();
|
||||
else
|
||||
_vesselSpawnPoint = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension").GetComponentInChildren<SpawnPoint>();
|
||||
SystemCreationHandler.LoadSystem(SystemDict[CurrentStarSystem]);
|
||||
@ -314,146 +311,6 @@ namespace NewHorizons
|
||||
}
|
||||
}
|
||||
|
||||
private void OnReceiveWarpedBody(GameObject vessel, OWRigidbody warpedBody, NomaiWarpPlatform startPlatform, NomaiWarpPlatform targetPlatform)
|
||||
{
|
||||
bool isPlayer = warpedBody.CompareTag("Player");
|
||||
if (isPlayer)
|
||||
{
|
||||
Transform player_body = Locator.GetPlayerTransform();
|
||||
OWRigidbody s_rb = Locator.GetShipBody();
|
||||
OWRigidbody p_rb = Locator.GetPlayerBody();
|
||||
Vector3 newPos = player_body.position;
|
||||
Vector3 offset = player_body.up * 10;
|
||||
newPos += offset;
|
||||
s_rb.SetPosition(newPos);
|
||||
s_rb.SetRotation(player_body.transform.rotation);
|
||||
s_rb.SetVelocity(p_rb.GetVelocity());
|
||||
}
|
||||
}
|
||||
|
||||
private EyeSpawnPoint CreateVessel()
|
||||
{
|
||||
var system = SystemDict[_currentStarSystem];
|
||||
Logger.Log("Checking for Vessel Prefab");
|
||||
if (VesselPrefab == null) return null;
|
||||
Logger.Log("Creating Vessel");
|
||||
var vesselObject = GameObject.Instantiate(VesselPrefab);
|
||||
vesselObject.name = VesselPrefab.name;
|
||||
vesselObject.transform.parent = null;
|
||||
if (system.Config.vesselPosition != null)
|
||||
vesselObject.transform.position += system.Config.vesselPosition;
|
||||
if (system.Config.vesselRotation != null)
|
||||
vesselObject.transform.eulerAngles = system.Config.vesselRotation;
|
||||
|
||||
VesselWarpController vesselWarpController = vesselObject.GetComponentInChildren<VesselWarpController>(true);
|
||||
vesselWarpController._sourceWarpPlatform.transform.DestroyAllChildren();
|
||||
vesselWarpController._targetWarpPlatform.transform.DestroyAllChildren();
|
||||
Destroy(vesselWarpController._blackHole.transform.parent.gameObject);
|
||||
Destroy(vesselWarpController._whiteHole.transform.parent.gameObject);
|
||||
GameObject WarpPlatform = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension/Sector_VesselBridge/Interactibles_VesselBridge/WarpController/Prefab_NOM_WarpPlatform");
|
||||
GameObject warpBH = WarpPlatform.transform.Find("BlackHole").gameObject;
|
||||
GameObject warpWH = WarpPlatform.transform.Find("WhiteHole").gameObject;
|
||||
GameObject sourceBH = Instantiate(warpBH, vesselWarpController._sourceWarpPlatform.transform, false);
|
||||
vesselWarpController._sourceWarpPlatform._blackHole = sourceBH.GetComponentInChildren<SingularityController>();
|
||||
GameObject sourceWH = Instantiate(warpWH, vesselWarpController._sourceWarpPlatform.transform, false);
|
||||
vesselWarpController._sourceWarpPlatform._whiteHole = sourceWH.GetComponentInChildren<SingularityController>();
|
||||
GameObject targetBH = Instantiate(warpBH, vesselWarpController._targetWarpPlatform.transform, false);
|
||||
vesselWarpController._targetWarpPlatform._blackHole = targetBH.GetComponentInChildren<SingularityController>();
|
||||
GameObject targetWH = Instantiate(warpWH, vesselWarpController._targetWarpPlatform.transform, false);
|
||||
vesselWarpController._targetWarpPlatform._whiteHole = targetWH.GetComponentInChildren<SingularityController>();
|
||||
GameObject blackHole = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension/Sector_VesselBridge/Interactibles_VesselBridge/BlackHole");
|
||||
GameObject newBlackHole = Instantiate(blackHole, vesselWarpController.transform.parent, false);
|
||||
newBlackHole.name = "BlackHole";
|
||||
vesselWarpController._blackHole = newBlackHole.GetComponentInChildren<SingularityController>();
|
||||
vesselWarpController._blackHoleOneShot = vesselWarpController._blackHole.transform.parent.Find("BlackHoleAudio_OneShot").GetComponent<OWAudioSource>();
|
||||
GameObject whiteHole = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension/Sector_VesselBridge/Interactibles_VesselBridge/WhiteHole");
|
||||
GameObject newWhiteHole = Instantiate(whiteHole, vesselWarpController.transform.parent, false);
|
||||
newWhiteHole.name = "WhiteHole";
|
||||
vesselWarpController._whiteHole = newWhiteHole.GetComponentInChildren<SingularityController>();
|
||||
vesselWarpController._whiteHoleOneShot = vesselWarpController._whiteHole.transform.parent.Find("WhiteHoleAudio_OneShot").GetComponent<OWAudioSource>();
|
||||
|
||||
vesselObject.SetActive(true);
|
||||
vesselWarpController._targetWarpPlatform.OnReceiveWarpedBody += (OWRigidbody warpedBody, NomaiWarpPlatform startPlatform, NomaiWarpPlatform targetPlatform) => OnReceiveWarpedBody(vesselObject, warpedBody, startPlatform, targetPlatform);
|
||||
if (system.Config.warpExitPosition != null)
|
||||
vesselWarpController._targetWarpPlatform.transform.localPosition = system.Config.warpExitPosition;
|
||||
if (system.Config.warpExitRotation != null)
|
||||
vesselObject.transform.localEulerAngles = system.Config.warpExitRotation;
|
||||
vesselObject.GetComponent<MapMarker>()._labelID = (UITextType)TranslationHandler.AddUI("Vessel");
|
||||
EyeSpawnPoint eyeSpawnPoint = vesselObject.GetComponentInChildren<EyeSpawnPoint>(true);
|
||||
system.SpawnPoint = eyeSpawnPoint;
|
||||
ModHelper.Events.Unity.FireOnNextUpdate(() => SetupWarpController(vesselWarpController));
|
||||
return eyeSpawnPoint;
|
||||
}
|
||||
|
||||
private SpawnPoint UpdateVessel()
|
||||
{
|
||||
var system = SystemDict[_currentStarSystem];
|
||||
var vectorSector = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension");
|
||||
var spawnPoint = vectorSector.GetComponentInChildren<SpawnPoint>();
|
||||
system.SpawnPoint = spawnPoint;
|
||||
VesselWarpController vesselWarpController = vectorSector.GetComponentInChildren<VesselWarpController>(true);
|
||||
ModHelper.Events.Unity.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, true));
|
||||
return spawnPoint;
|
||||
}
|
||||
|
||||
private void SetupWarpController(VesselWarpController vesselWarpController, bool db = false)
|
||||
{
|
||||
if (db)
|
||||
{
|
||||
//Make warp core
|
||||
foreach (WarpCoreItem core in Resources.FindObjectsOfTypeAll<WarpCoreItem>())
|
||||
{
|
||||
if (core.GetWarpCoreType().Equals(WarpCoreType.Vessel))
|
||||
{
|
||||
var newCore = Instantiate(core, AstroObjectLocator.GetAstroObject("Vessel Dimension")?.transform ?? Locator.GetPlayerBody()?.transform);
|
||||
newCore._visible = true;
|
||||
foreach (OWRenderer render in newCore._renderers)
|
||||
{
|
||||
if (render)
|
||||
{
|
||||
render.enabled = true;
|
||||
render.SetActivation(true);
|
||||
render.SetLODActivation(true);
|
||||
if (render.GetRenderer()) render.GetRenderer().enabled = true;
|
||||
}
|
||||
}
|
||||
foreach (ParticleSystem particleSystem in newCore._particleSystems)
|
||||
{
|
||||
if (particleSystem) particleSystem.Play(true);
|
||||
}
|
||||
foreach (OWLight2 light in newCore._lights)
|
||||
{
|
||||
if (light)
|
||||
{
|
||||
light.enabled = true;
|
||||
light.SetActivation(true);
|
||||
light.SetLODActivation(true);
|
||||
if (light.GetLight()) light.GetLight().enabled = true;
|
||||
}
|
||||
}
|
||||
vesselWarpController._coreSocket.PlaceIntoSocket(newCore);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
vesselWarpController.OnSlotDeactivated(vesselWarpController._coordinatePowerSlot);
|
||||
if (!db) vesselWarpController.OnSlotActivated(vesselWarpController._coordinatePowerSlot);
|
||||
vesselWarpController._gravityVolume.SetFieldMagnitude(vesselWarpController._origGravityMagnitude);
|
||||
vesselWarpController._coreCable.SetPowered(true);
|
||||
vesselWarpController._coordinateCable.SetPowered(!db);
|
||||
vesselWarpController._warpPlatformCable.SetPowered(false);
|
||||
vesselWarpController._cageClosed = true;
|
||||
if (vesselWarpController._cageAnimator != null)
|
||||
{
|
||||
vesselWarpController._cageAnimator.TranslateToLocalPosition(new Vector3(0.0f, -8.1f, 0.0f), 0.1f);
|
||||
vesselWarpController._cageAnimator.RotateToLocalEulerAngles(new Vector3(0.0f, 180f, 0.0f), 0.1f);
|
||||
vesselWarpController._cageAnimator.OnTranslationComplete -= new TransformAnimator.AnimationEvent(vesselWarpController.OnCageAnimationComplete);
|
||||
vesselWarpController._cageAnimator.OnTranslationComplete += new TransformAnimator.AnimationEvent(vesselWarpController.OnCageAnimationComplete);
|
||||
}
|
||||
if (vesselWarpController._cageLoopingAudio != null)
|
||||
vesselWarpController._cageLoopingAudio.FadeIn(1f);
|
||||
}
|
||||
|
||||
// Had a bunch of separate unity things firing stuff when the system is ready so I moved it all to here
|
||||
private void OnSystemReady(bool shouldWarpInFromShip, bool shouldWarpInFromVessel)
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user