Better vessel warping

- Relative spawning when warping just like vanilla
- Async load just like vanilla
- No more wake up effects for vessel warping
This commit is contained in:
Noah Pilarski 2024-06-04 18:47:34 -04:00
parent 793f16d718
commit c768ff4dcd
8 changed files with 208 additions and 17 deletions

View File

@ -1,12 +1,12 @@
ManifestFileVersion: 0 ManifestFileVersion: 0
CRC: 423323461 CRC: 2245901288
Hashes: Hashes:
AssetFileHash: AssetFileHash:
serializedVersion: 2 serializedVersion: 2
Hash: 4199cf66477e2054e4ac61871d811161 Hash: e765e5fc418c1ed69586a3826e0cdea3
TypeTreeHash: TypeTreeHash:
serializedVersion: 2 serializedVersion: 2
Hash: 83784250589f972ee0b86ea39a5a5305 Hash: 65942a71d50cdc9f2387a8fa9383a3f8
HashAppended: 0 HashAppended: 0
ClassTypes: ClassTypes:
- Class: 1 - Class: 1
@ -41,6 +41,8 @@ ClassTypes:
Script: {instanceID: 0} Script: {instanceID: 0}
- Class: 114 - Class: 114
Script: {fileID: 11500000, guid: 70edf1000ebf31e4eb3ab4e289a345c0, type: 3} Script: {fileID: 11500000, guid: 70edf1000ebf31e4eb3ab4e289a345c0, type: 3}
- Class: 114
Script: {fileID: 11500000, guid: 86d5ae109bbc920409997135e88f1755, type: 3}
- Class: 114 - Class: 114
Script: {fileID: 11500000, guid: 77b727c07614b4041a5fe1fba0cfacff, type: 3} Script: {fileID: 11500000, guid: 77b727c07614b4041a5fe1fba0cfacff, type: 3}
- Class: 114 - Class: 114
@ -105,8 +107,6 @@ ClassTypes:
Script: {fileID: 11500000, guid: f645b92850d716a4488617b651223700, type: 3} Script: {fileID: 11500000, guid: f645b92850d716a4488617b651223700, type: 3}
- Class: 114 - Class: 114
Script: {fileID: 11500000, guid: 8ef66a28deb09ab4aaba30bb60b9f19a, type: 3} Script: {fileID: 11500000, guid: 8ef66a28deb09ab4aaba30bb60b9f19a, type: 3}
- Class: 114
Script: {fileID: 11500000, guid: 0863077874402f14dba0ca4ae81752dd, type: 3}
- Class: 114 - Class: 114
Script: {fileID: 11500000, guid: bf998978a8a701b4eb09fcd94048f916, type: 3} Script: {fileID: 11500000, guid: bf998978a8a701b4eb09fcd94048f916, type: 3}
- Class: 114 - Class: 114

View File

@ -0,0 +1,78 @@
using NewHorizons.Handlers;
using NewHorizons.Utility;
using NewHorizons.Utility.OWML;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Components
{
[UsedInUnityProject]
public class VesselSpawnPoint : EyeSpawnPoint
{
public GameObject warpControllerObject;
private VesselWarpController _warpController;
public VesselWarpController WarpController
{
get
{
if (_warpController == null && warpControllerObject != null) WarpController = warpControllerObject.GetComponent<VesselWarpController>();
return _warpController;
}
set
{
_warpController = value;
if (_warpController != null) _triggerVolumes = new OWTriggerVolume[1] { _warpController._bridgeVolume };
}
}
public VesselSpawnPoint()
{
_eyeState = EyeState.AboardVessel;
}
public int index = 0;
public void WarpPlayer(bool spawn = false)
{
var warpController = WarpController;
var player = Locator.GetPlayerBody();
var relativeTransform = warpController.transform;
var relativeBody = relativeTransform.GetAttachedOWRigidbody();
if (!spawn) Locator.GetPlayerCamera().GetComponent<PlayerCameraEffectController>().OpenEyesImmediate();
if (VesselWarpController.s_relativeLocationSaved)
{
Locator.GetPlayerBody().MoveToRelativeLocation(VesselWarpController.s_playerWarpLocation, relativeBody, relativeTransform);
}
else
{
player.SetPosition(warpController._defaultPlayerWarpPoint.position);
player.SetRotation(warpController._defaultPlayerWarpPoint.rotation);
player.SetVelocity(relativeBody.GetPointVelocity(warpController._defaultPlayerWarpPoint.position));
}
AddPlayerToVolume(warpController._bridgeVolume);
AddPlayerToTriggerVolumes();
}
public override void OnSpawnPlayer()
{
Delay.FireOnNextUpdate(() => WarpPlayer(true));
}
public void AddPlayerToVolume(OWTriggerVolume volume)
{
volume.AddObjectToVolume(Locator.GetPlayerDetector());
volume.AddObjectToVolume(Locator.GetPlayerCameraDetector());
}
public void AddPlayerToTriggerVolumes()
{
AddObjectToTriggerVolumes(Locator.GetPlayerDetector());
AddObjectToTriggerVolumes(Locator.GetPlayerCameraDetector());
}
}
}

View File

@ -56,14 +56,39 @@ namespace NewHorizons.Handlers
if (IsVesselPresentAndActive()) if (IsVesselPresentAndActive())
_vesselSpawnPoint = Instance.CurrentStarSystem == "SolarSystem" ? UpdateVessel() : CreateVessel(); _vesselSpawnPoint = Instance.CurrentStarSystem == "SolarSystem" ? UpdateVessel() : CreateVessel();
else else
_vesselSpawnPoint = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension").GetComponentInChildren<SpawnPoint>(); {
var vesselDimension = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension");
var vesselDimensionSpawn = vesselDimension.GetComponentInChildren<SpawnPoint>(true);
var vesselWarpController = vesselDimension.GetComponentInChildren<VesselWarpController>(true);
var defaultPlayerWarpPoint = new GameObject("DefaultPlayerWarpPos");
defaultPlayerWarpPoint.transform.SetParent(vesselWarpController.transform, false);
defaultPlayerWarpPoint.transform.localPosition = new Vector3(0, -5.82f, -6.56f);
vesselWarpController._defaultPlayerWarpPoint = defaultPlayerWarpPoint.transform;
var vesselSpawnObj = new GameObject("SPAWN_Vessel");
vesselSpawnObj.transform.SetParent(vesselWarpController.transform.parent.parent, false);
vesselSpawnObj.transform.localPosition = new Vector3(-0.3f, -5.18f, -6.35f);
var vesselSpawnPoint = vesselSpawnObj.AddComponent<VesselSpawnPoint>();
vesselSpawnPoint.WarpController = vesselWarpController;
vesselSpawnPoint._triggerVolumes = vesselDimensionSpawn._triggerVolumes;
_vesselSpawnPoint = vesselSpawnPoint;
}
} }
public static void TeleportToVessel() public static void TeleportToVessel()
{ {
var playerSpawner = Object.FindObjectOfType<PlayerSpawner>(); var playerSpawner = Object.FindObjectOfType<PlayerSpawner>();
NHLogger.LogVerbose("Debug warping into vessel"); if (_vesselSpawnPoint is VesselSpawnPoint vesselSpawnPoint)
playerSpawner.DebugWarp(_vesselSpawnPoint); {
NHLogger.LogVerbose("Relative warping into vessel");
vesselSpawnPoint.WarpPlayer();//Delay.FireOnNextUpdate(vesselSpawnPoint.WarpPlayer);
}
else
{
NHLogger.LogVerbose("Debug warping into vessel");
playerSpawner.DebugWarp(_vesselSpawnPoint);
}
Builder.General.SpawnPointBuilder.SuitUp(); Builder.General.SpawnPointBuilder.SuitUp();
LoadDB(); LoadDB();
@ -86,7 +111,7 @@ namespace NewHorizons.Handlers
} }
} }
public static EyeSpawnPoint CreateVessel() public static VesselSpawnPoint CreateVessel()
{ {
var system = SystemDict[Instance.CurrentStarSystem]; var system = SystemDict[Instance.CurrentStarSystem];
@ -209,10 +234,10 @@ namespace NewHorizons.Handlers
} }
} }
EyeSpawnPoint eyeSpawnPoint = vesselObject.GetComponentInChildren<EyeSpawnPoint>(true); VesselSpawnPoint spawnPoint = vesselObject.GetComponentInChildren<VesselSpawnPoint>(true);
if (ShouldSpawnAtVessel()) if (ShouldSpawnAtVessel())
{ {
system.SpawnPoint = eyeSpawnPoint; system.SpawnPoint = spawnPoint;
} }
vesselObject.SetActive(true); vesselObject.SetActive(true);
@ -221,10 +246,10 @@ namespace NewHorizons.Handlers
var orb = power.GetComponentInChildren<NomaiInterfaceOrb>(true); var orb = power.GetComponentInChildren<NomaiInterfaceOrb>(true);
Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb)); Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb));
return eyeSpawnPoint; return spawnPoint;
} }
public static SpawnPoint UpdateVessel() public static VesselSpawnPoint UpdateVessel()
{ {
var system = SystemDict[Instance.CurrentStarSystem]; var system = SystemDict[Instance.CurrentStarSystem];
@ -247,11 +272,23 @@ namespace NewHorizons.Handlers
vesselWarpController._whiteHole._startActive = true; vesselWarpController._whiteHole._startActive = true;
vesselWarpController._whiteHole.Stabilize(); vesselWarpController._whiteHole.Stabilize();
var defaultPlayerWarpPoint = new GameObject("DefaultPlayerWarpPos");
defaultPlayerWarpPoint.transform.SetParent(vesselWarpController.transform, false);
defaultPlayerWarpPoint.transform.localPosition = new Vector3(0, -5.82f, -6.56f);
vesselWarpController._defaultPlayerWarpPoint = defaultPlayerWarpPoint.transform;
var vesselSpawnObj = new GameObject("SPAWN_Vessel");
vesselSpawnObj.transform.SetParent(vesselWarpController.transform.parent.parent, false);
vesselSpawnObj.transform.localPosition = new Vector3(-0.3f, -5.18f, -6.35f);
var vesselSpawnPoint = vesselSpawnObj.AddComponent<VesselSpawnPoint>();
vesselSpawnPoint.WarpController = vesselWarpController;
vesselSpawnPoint._triggerVolumes = spawnPoint._triggerVolumes;
var power = vesselWarpController.transform.Find("PowerSwitchInterface"); var power = vesselWarpController.transform.Find("PowerSwitchInterface");
var orb = power.GetComponentInChildren<NomaiInterfaceOrb>(true); var orb = power.GetComponentInChildren<NomaiInterfaceOrb>(true);
Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb, true)); Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb, true));
return spawnPoint; return vesselSpawnPoint;
} }
public static void SetupWarpController(VesselWarpController vesselWarpController, NomaiInterfaceOrb orb, bool db = false) public static void SetupWarpController(VesselWarpController vesselWarpController, NomaiInterfaceOrb orb, bool db = false)

View File

@ -944,6 +944,7 @@ namespace NewHorizons
IsWarpingFromVessel = vessel; IsWarpingFromVessel = vessel;
DidWarpFromVessel = false; DidWarpFromVessel = false;
OnChangeStarSystem?.Invoke(newStarSystem); OnChangeStarSystem?.Invoke(newStarSystem);
VesselWarpController.s_relativeLocationSaved = false;
NHLogger.Log($"Warping to {newStarSystem}"); NHLogger.Log($"Warping to {newStarSystem}");
if (warp && ShipWarpController) ShipWarpController.WarpOut(); if (warp && ShipWarpController) ShipWarpController.WarpOut();
@ -983,8 +984,38 @@ namespace NewHorizons
} }
} }
/// <summary>
/// Exclusively for <see cref="Patches.WarpPatches.VesselWarpControllerPatches.VesselWarpController_OnSlotActivated(VesselWarpController, NomaiInterfaceSlot)"/>
/// </summary>
internal void ChangeCurrentStarSystemVesselAsync(string newStarSystem)
{
if (IsChangingStarSystem) return;
if (LoadManager.GetCurrentScene() == OWScene.SolarSystem || LoadManager.GetCurrentScene() == OWScene.EyeOfTheUniverse)
{
IsWarpingFromShip = false;
IsWarpingFromVessel = true;
DidWarpFromVessel = false;
OnChangeStarSystem?.Invoke(newStarSystem);
NHLogger.Log($"Vessel warping to {newStarSystem}");
IsChangingStarSystem = true;
WearingSuit = PlayerState.IsWearingSuit();
PlayerData.SaveEyeCompletion(); // So that the title screen doesn't keep warping you back to eye
if (SystemDict[CurrentStarSystem].Config.enableTimeLoop) SecondsElapsedInLoop = TimeLoop.GetSecondsElapsed();
else SecondsElapsedInLoop = -1;
CurrentStarSystem = newStarSystem;
LoadManager.LoadSceneAsync(OWScene.SolarSystem, false, LoadManager.FadeType.ToBlack);
}
}
void OnDeath(DeathType _) void OnDeath(DeathType _)
{ {
VesselWarpController.s_relativeLocationSaved = false;
// We reset the solar system on death // We reset the solar system on death
if (!IsChangingStarSystem) if (!IsChangingStarSystem)
{ {

View File

@ -0,0 +1,17 @@
using HarmonyLib;
namespace NewHorizons.Patches.PlayerPatches
{
[HarmonyPatch(typeof(PlayerBreathingAudio))]
public static class PlayerBreathingAudioPatches
{
[HarmonyPrefix]
[HarmonyPatch(nameof(PlayerBreathingAudio.OnWakeUp))]
public static bool PlayerBreathingAudio_OnWakeUp(PlayerBreathingAudio __instance)
{
if (Main.Instance.IsWarpingFromShip || Main.Instance.IsWarpingFromVessel || Main.Instance.DidWarpFromShip || Main.Instance.DidWarpFromVessel)
return false;
return true;
}
}
}

View File

@ -0,0 +1,24 @@
using HarmonyLib;
using NewHorizons.Utility;
using NewHorizons.Utility.OWML;
using UnityEngine;
namespace NewHorizons.Patches.PlayerPatches
{
[HarmonyPatch(typeof(PlayerCameraEffectController))]
public static class PlayerCameraEffectControllerPatches
{
[HarmonyPrefix]
[HarmonyPatch(nameof(PlayerCameraEffectController.OnStartOfTimeLoop))]
public static bool PlayerCameraEffectController_OnStartOfTimeLoop(PlayerCameraEffectController __instance, int loopCount)
{
if (__instance.gameObject.CompareTag("MainCamera") && (Main.Instance.IsWarpingFromShip || Main.Instance.IsWarpingFromVessel || Main.Instance.DidWarpFromShip || Main.Instance.DidWarpFromVessel))
{
__instance.CloseEyesImmediate();
GlobalMessenger.FireEvent("WakeUp");
return false;
}
return true;
}
}
}

View File

@ -1,6 +1,9 @@
using HarmonyLib; using HarmonyLib;
using NewHorizons.Components.Ship;
using NewHorizons.Handlers;
using NewHorizons.Utility; using NewHorizons.Utility;
using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OuterWilds;
using NewHorizons.Utility.OWML;
namespace NewHorizons.Patches.WarpPatches namespace NewHorizons.Patches.WarpPatches
{ {
@ -20,6 +23,7 @@ namespace NewHorizons.Patches.WarpPatches
if (!Main.Instance.IsWarpingFromVessel) if (!Main.Instance.IsWarpingFromVessel)
PlayerData.SaveWarpedToTheEye(TimeLoopUtilities.GetVanillaSecondsRemaining()); PlayerData.SaveWarpedToTheEye(TimeLoopUtilities.GetVanillaSecondsRemaining());
Locator.GetPlayerSectorDetector().RemoveFromAllSectors();
LoadManager.EnableAsyncLoadTransition(); LoadManager.EnableAsyncLoadTransition();
return false; return false;
@ -64,10 +68,10 @@ namespace NewHorizons.Patches.WarpPatches
if (canWarpToEye || canWarpToStarSystem && targetSystem == "EyeOfTheUniverse") if (canWarpToEye || canWarpToStarSystem && targetSystem == "EyeOfTheUniverse")
{ {
Main.Instance.CurrentStarSystem = "EyeOfTheUniverse"; Main.Instance.CurrentStarSystem = "EyeOfTheUniverse";
LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, false, LoadManager.FadeType.ToWhite); LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, false, LoadManager.FadeType.ToBlack);// Mobius had the fade set to white. Doesn't look that good because of the loadng screen being black.
} }
else if (canWarpToStarSystem) else if (canWarpToStarSystem && targetSystem != "EyeOfTheUniverse")
Main.Instance.ChangeCurrentStarSystem(targetSystem, false, true); Main.Instance.ChangeCurrentStarSystemVesselAsync(targetSystem);
__instance._blackHoleOneShot.PlayOneShot(AudioType.VesselSingularityCreate); __instance._blackHoleOneShot.PlayOneShot(AudioType.VesselSingularityCreate);
GlobalMessenger.FireEvent("StartVesselWarp"); GlobalMessenger.FireEvent("StartVesselWarp");
} }