mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Reorganize a bit and add more comments
This commit is contained in:
parent
187bf415dc
commit
ddb1d50816
@ -36,6 +36,8 @@ namespace NewHorizons.Handlers
|
||||
[HarmonyPatch(typeof(PlayerImpactAudio), nameof(PlayerImpactAudio.OnImpact))]
|
||||
public static bool DeathManager_KillPlayer_Prefix()
|
||||
{
|
||||
// Base game _invincible is still overriden by high speed impacts
|
||||
// We also are avoiding playing impact related effects by just skipping these methods
|
||||
return !_invulnerable;
|
||||
}
|
||||
|
||||
|
||||
@ -70,18 +70,24 @@ namespace NewHorizons.Handlers
|
||||
|
||||
// Spawn ship
|
||||
Delay.FireInNUpdates(SpawnShip, 30);
|
||||
Delay.FireInNUpdates(() =>
|
||||
{
|
||||
var spawnOWRigidBody = GetDefaultSpawn().GetAttachedOWRigidbody();
|
||||
if (shouldWarpInFromVessel) spawnOWRigidBody = VesselWarpHandler.VesselSpawnPoint.GetAttachedOWRigidbody();
|
||||
if (shouldWarpInFromShip) spawnOWRigidBody = Locator.GetShipBody();
|
||||
|
||||
var spawnVelocity = spawnOWRigidBody.GetVelocity();
|
||||
var spawnAngularVelocity = spawnOWRigidBody.GetPointTangentialVelocity(Locator.GetPlayerBody().GetPosition());
|
||||
var velocity = spawnVelocity + spawnAngularVelocity;
|
||||
// Have had bug reports (#1034, #975) where sometimes after spawning via vessel warp or ship warp you die from impact velocity after being flung
|
||||
// Something weird must be happening with velocity.
|
||||
// Try to correct it here after the ship is done spawning
|
||||
Delay.FireInNUpdates(() => FixVelocity(shouldWarpInFromVessel, shouldWarpInFromShip), 31);
|
||||
}
|
||||
|
||||
Locator.GetPlayerBody().SetVelocity(velocity);
|
||||
}, 31);
|
||||
private static void FixVelocity(bool shouldWarpInFromVessel, bool shouldWarpInFromShip)
|
||||
{
|
||||
var spawnOWRigidBody = GetDefaultSpawn().GetAttachedOWRigidbody();
|
||||
if (shouldWarpInFromVessel) spawnOWRigidBody = VesselWarpHandler.VesselSpawnPoint.GetAttachedOWRigidbody();
|
||||
if (shouldWarpInFromShip) spawnOWRigidBody = Locator.GetShipBody();
|
||||
|
||||
var spawnVelocity = spawnOWRigidBody.GetVelocity();
|
||||
var spawnAngularVelocity = spawnOWRigidBody.GetPointTangentialVelocity(Locator.GetPlayerBody().GetPosition());
|
||||
var velocity = spawnVelocity + spawnAngularVelocity;
|
||||
|
||||
Locator.GetPlayerBody().SetVelocity(velocity);
|
||||
}
|
||||
|
||||
public static void SpawnShip()
|
||||
|
||||
@ -56,7 +56,9 @@ namespace NewHorizons.Handlers
|
||||
}
|
||||
|
||||
if (IsVesselPresentAndActive())
|
||||
{
|
||||
_vesselSpawnPoint = Instance.CurrentStarSystem == "SolarSystem" ? UpdateVessel() : CreateVessel();
|
||||
}
|
||||
else
|
||||
{
|
||||
var vesselDimension = SearchUtilities.Find("DB_VesselDimension_Body/Sector_VesselDimension");
|
||||
@ -84,9 +86,12 @@ namespace NewHorizons.Handlers
|
||||
if (_vesselSpawnPoint is VesselSpawnPoint vesselSpawnPoint)
|
||||
{
|
||||
NHLogger.LogVerbose("Relative warping into vessel");
|
||||
vesselSpawnPoint.WarpPlayer();//Delay.FireOnNextUpdate(vesselSpawnPoint.WarpPlayer);
|
||||
//Delay.FireInNUpdates(() => InvulnerabilityHandler.MakeInvulnerable(false), 25);
|
||||
Delay.StartCoroutine(RunEveryNFrames(25, vesselSpawnPoint));
|
||||
vesselSpawnPoint.WarpPlayer();
|
||||
|
||||
// #1034 Vessel warp sometimes has the player get flung away into space and die
|
||||
// We do what we do with regular spawns where we keep resetting their position to the right one while invincible until we're relatively certain
|
||||
// that the spawning sequence is done
|
||||
Delay.StartCoroutine(FixPlayerSpawning(25, vesselSpawnPoint));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -98,24 +103,22 @@ namespace NewHorizons.Handlers
|
||||
LoadDB();
|
||||
}
|
||||
|
||||
private static IEnumerator RunEveryNFrames(int frameInterval, VesselSpawnPoint vesselSpawn)
|
||||
private static IEnumerator FixPlayerSpawning(int frameInterval, VesselSpawnPoint vesselSpawn)
|
||||
{
|
||||
int frameCount = 0;
|
||||
InvulnerabilityHandler.MakeInvulnerable(true);
|
||||
|
||||
var frameCount = 0;
|
||||
while (frameCount <= frameInterval)
|
||||
{
|
||||
vesselSpawn.WarpPlayer();
|
||||
if (frameCount == frameInterval)
|
||||
{
|
||||
InvulnerabilityHandler.MakeInvulnerable(false);
|
||||
var playerBody = SearchUtilities.Find("Player_Body").GetAttachedOWRigidbody();
|
||||
var resources = playerBody.GetComponent<PlayerResources>();
|
||||
resources._currentHealth = 100f;
|
||||
}
|
||||
frameCount++;
|
||||
yield return null; // Wait for the next frame
|
||||
}
|
||||
|
||||
InvulnerabilityHandler.MakeInvulnerable(false);
|
||||
var playerBody = SearchUtilities.Find("Player_Body").GetAttachedOWRigidbody();
|
||||
var resources = playerBody.GetComponent<PlayerResources>();
|
||||
resources._currentHealth = 100f;
|
||||
}
|
||||
|
||||
public static void LoadDB()
|
||||
|
||||
@ -613,7 +613,7 @@ namespace NewHorizons
|
||||
{
|
||||
IsSystemReady = true;
|
||||
|
||||
// ShipWarpController will handle the invulnerability otherwise
|
||||
// ShipWarpController or VesselWarpHandler will handle the invulnerability otherwise
|
||||
if (!shouldWarpInFromShip && !shouldWarpInFromVessel)
|
||||
{
|
||||
Delay.FireOnNextUpdate(() => InvulnerabilityHandler.MakeInvulnerable(false));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user