diff --git a/NewHorizons/Assets/newhorizons_private b/NewHorizons/Assets/newhorizons_private index f0e946e7..1351ea40 100644 Binary files a/NewHorizons/Assets/newhorizons_private and b/NewHorizons/Assets/newhorizons_private differ diff --git a/NewHorizons/Assets/newhorizons_private.manifest b/NewHorizons/Assets/newhorizons_private.manifest index 34d43099..3248cae9 100644 --- a/NewHorizons/Assets/newhorizons_private.manifest +++ b/NewHorizons/Assets/newhorizons_private.manifest @@ -1,12 +1,12 @@ ManifestFileVersion: 0 -CRC: 423323461 +CRC: 2245901288 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 4199cf66477e2054e4ac61871d811161 + Hash: e765e5fc418c1ed69586a3826e0cdea3 TypeTreeHash: serializedVersion: 2 - Hash: 83784250589f972ee0b86ea39a5a5305 + Hash: 65942a71d50cdc9f2387a8fa9383a3f8 HashAppended: 0 ClassTypes: - Class: 1 @@ -41,6 +41,8 @@ ClassTypes: Script: {instanceID: 0} - Class: 114 Script: {fileID: 11500000, guid: 70edf1000ebf31e4eb3ab4e289a345c0, type: 3} +- Class: 114 + Script: {fileID: 11500000, guid: 86d5ae109bbc920409997135e88f1755, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 77b727c07614b4041a5fe1fba0cfacff, type: 3} - Class: 114 @@ -105,8 +107,6 @@ ClassTypes: Script: {fileID: 11500000, guid: f645b92850d716a4488617b651223700, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 8ef66a28deb09ab4aaba30bb60b9f19a, type: 3} -- Class: 114 - Script: {fileID: 11500000, guid: 0863077874402f14dba0ca4ae81752dd, type: 3} - Class: 114 Script: {fileID: 11500000, guid: bf998978a8a701b4eb09fcd94048f916, type: 3} - Class: 114 diff --git a/NewHorizons/Components/Vessel/VesselSpawnPoint.cs b/NewHorizons/Components/Vessel/VesselSpawnPoint.cs new file mode 100644 index 00000000..9bb01990 --- /dev/null +++ b/NewHorizons/Components/Vessel/VesselSpawnPoint.cs @@ -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(); + 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().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()); + } + } +} diff --git a/NewHorizons/Handlers/VesselWarpHandler.cs b/NewHorizons/Handlers/VesselWarpHandler.cs index 5bed0654..5f3241a5 100644 --- a/NewHorizons/Handlers/VesselWarpHandler.cs +++ b/NewHorizons/Handlers/VesselWarpHandler.cs @@ -56,14 +56,39 @@ namespace NewHorizons.Handlers if (IsVesselPresentAndActive()) _vesselSpawnPoint = Instance.CurrentStarSystem == "SolarSystem" ? UpdateVessel() : CreateVessel(); else - _vesselSpawnPoint = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension").GetComponentInChildren(); + { + var vesselDimension = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension"); + var vesselDimensionSpawn = vesselDimension.GetComponentInChildren(true); + var vesselWarpController = vesselDimension.GetComponentInChildren(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.WarpController = vesselWarpController; + vesselSpawnPoint._triggerVolumes = vesselDimensionSpawn._triggerVolumes; + _vesselSpawnPoint = vesselSpawnPoint; + } } public static void TeleportToVessel() { var playerSpawner = Object.FindObjectOfType(); - NHLogger.LogVerbose("Debug warping into vessel"); - playerSpawner.DebugWarp(_vesselSpawnPoint); + if (_vesselSpawnPoint is VesselSpawnPoint 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(); LoadDB(); @@ -86,7 +111,7 @@ namespace NewHorizons.Handlers } } - public static EyeSpawnPoint CreateVessel() + public static VesselSpawnPoint CreateVessel() { var system = SystemDict[Instance.CurrentStarSystem]; @@ -209,10 +234,10 @@ namespace NewHorizons.Handlers } } - EyeSpawnPoint eyeSpawnPoint = vesselObject.GetComponentInChildren(true); + VesselSpawnPoint spawnPoint = vesselObject.GetComponentInChildren(true); if (ShouldSpawnAtVessel()) { - system.SpawnPoint = eyeSpawnPoint; + system.SpawnPoint = spawnPoint; } vesselObject.SetActive(true); @@ -221,10 +246,10 @@ namespace NewHorizons.Handlers var orb = power.GetComponentInChildren(true); Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb)); - return eyeSpawnPoint; + return spawnPoint; } - public static SpawnPoint UpdateVessel() + public static VesselSpawnPoint UpdateVessel() { var system = SystemDict[Instance.CurrentStarSystem]; @@ -247,11 +272,23 @@ namespace NewHorizons.Handlers vesselWarpController._whiteHole._startActive = true; 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.WarpController = vesselWarpController; + vesselSpawnPoint._triggerVolumes = spawnPoint._triggerVolumes; + var power = vesselWarpController.transform.Find("PowerSwitchInterface"); var orb = power.GetComponentInChildren(true); Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb, true)); - return spawnPoint; + return vesselSpawnPoint; } public static void SetupWarpController(VesselWarpController vesselWarpController, NomaiInterfaceOrb orb, bool db = false) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 73045bab..1efbb6a5 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -944,6 +944,7 @@ namespace NewHorizons IsWarpingFromVessel = vessel; DidWarpFromVessel = false; OnChangeStarSystem?.Invoke(newStarSystem); + VesselWarpController.s_relativeLocationSaved = false; NHLogger.Log($"Warping to {newStarSystem}"); if (warp && ShipWarpController) ShipWarpController.WarpOut(); @@ -983,8 +984,38 @@ namespace NewHorizons } } + /// + /// Exclusively for + /// + 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 _) { + VesselWarpController.s_relativeLocationSaved = false; // We reset the solar system on death if (!IsChangingStarSystem) { diff --git a/NewHorizons/Patches/PlayerPatches/PlayerBreathingAudioPatches.cs b/NewHorizons/Patches/PlayerPatches/PlayerBreathingAudioPatches.cs new file mode 100644 index 00000000..a550b504 --- /dev/null +++ b/NewHorizons/Patches/PlayerPatches/PlayerBreathingAudioPatches.cs @@ -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; + } + } +} diff --git a/NewHorizons/Patches/PlayerPatches/PlayerCameraEffectControllerPatches.cs b/NewHorizons/Patches/PlayerPatches/PlayerCameraEffectControllerPatches.cs new file mode 100644 index 00000000..26933ce5 --- /dev/null +++ b/NewHorizons/Patches/PlayerPatches/PlayerCameraEffectControllerPatches.cs @@ -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; + } + } +} diff --git a/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs b/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs index 559f43d0..e4f993a3 100644 --- a/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs +++ b/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs @@ -1,6 +1,9 @@ using HarmonyLib; +using NewHorizons.Components.Ship; +using NewHorizons.Handlers; using NewHorizons.Utility; using NewHorizons.Utility.OuterWilds; +using NewHorizons.Utility.OWML; namespace NewHorizons.Patches.WarpPatches { @@ -20,6 +23,7 @@ namespace NewHorizons.Patches.WarpPatches if (!Main.Instance.IsWarpingFromVessel) PlayerData.SaveWarpedToTheEye(TimeLoopUtilities.GetVanillaSecondsRemaining()); + Locator.GetPlayerSectorDetector().RemoveFromAllSectors(); LoadManager.EnableAsyncLoadTransition(); return false; @@ -64,10 +68,10 @@ namespace NewHorizons.Patches.WarpPatches if (canWarpToEye || canWarpToStarSystem && targetSystem == "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) - Main.Instance.ChangeCurrentStarSystem(targetSystem, false, true); + else if (canWarpToStarSystem && targetSystem != "EyeOfTheUniverse") + Main.Instance.ChangeCurrentStarSystemVesselAsync(targetSystem); __instance._blackHoleOneShot.PlayOneShot(AudioType.VesselSingularityCreate); GlobalMessenger.FireEvent("StartVesselWarp"); }