From 48a811809dc87a636ca705c83362de7419648fcd Mon Sep 17 00:00:00 2001 From: "Nick J. Connors" Date: Thu, 30 Dec 2021 01:43:10 -0500 Subject: [PATCH] Fix infinite loop loading error --- .../Builder/General/HeavenlyBodyBuilder.cs | 31 +++++++++++++++-- NewHorizons/Main.cs | 33 ++++++++++++------- NewHorizons/OrbitalPhysics/OrbitalHelper.cs | 6 ---- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs index 1636bab9..cb68b791 100644 --- a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs +++ b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs @@ -1,6 +1,7 @@ using NewHorizons.External; using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; +using OWML.Utils; using PacificEngine.OW_CommonResources.Game.Resource; using PacificEngine.OW_CommonResources.Game.State; using PacificEngine.OW_CommonResources.Geometry.Orbits; @@ -20,8 +21,16 @@ namespace NewHorizons.Builder.General public static void Make(GameObject body, IPlanetConfig config, float SOI, GravityVolume bodyGravity, InitialMotion initialMotion) { var size = new Position.Size(config.Base.SurfaceSize, SOI); - var G = GravityVolume.GRAVITATIONAL_CONSTANT; - var gravity = Gravity.of(bodyGravity == null ? 2f : bodyGravity.GetFalloffExponent(), bodyGravity == null ? 0 : bodyGravity.GetStandardGravitationalParameter() / G); + + var gravity = Gravity.of(0, 0); + if(bodyGravity != null) + { + var G = GravityVolume.GRAVITATIONAL_CONSTANT; + var exponent = bodyGravity.GetFalloffExponent(); + var mass = bodyGravity._surfaceAcceleration * Mathf.Pow(bodyGravity._upperSurfaceRadius, exponent) / G; + gravity = Gravity.of(bodyGravity == null ? 2f : exponent, bodyGravity == null ? 0 : mass); + } + var parent = GetBody(config.Orbit.PrimaryBody); var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit); @@ -35,6 +44,24 @@ namespace NewHorizons.Builder.General var mapping = Planet.defaultMapping; mapping[hb] = planetoid; Planet.defaultMapping = mapping; + + // Fix for binary focal points + var focalPoint = Position.AstroLookup[parent].Invoke()?.gameObject.GetComponent(); + if (focalPoint != null) + { + var primary = Position.getBody(GetBody(focalPoint.PrimaryName)); + var secondary = Position.getBody(GetBody(focalPoint.SecondaryName)); + + if(primary != null && secondary != null) + { + var exponent = ((primary?.GetAttachedGravityVolume()?.GetValue("_falloffExponent") ?? 2f) + (secondary?.GetAttachedGravityVolume()?.GetValue("_falloffExponent") ?? 2f)) / 2f; + var mass = ((primary?.GetAttachedGravityVolume()?.GetValue("_gravitationalMass") ?? ((primary?.GetMass() ?? 0f) * 1000f)) + (secondary?.GetAttachedGravityVolume()?.GetValue("_gravitationalMass") ?? ((secondary?.GetMass() ?? 0f) * 1000f))) / 4f; + + var currentValue = Planet.mapping[parent]; + var newValue = new Planet.Plantoid(currentValue.size, Gravity.of(exponent, mass), currentValue.state); + Planet.defaultMapping[parent] = newValue; + } + } } private static HeavenlyBody AddHeavenlyBody(string name) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index a2c5806d..a6a59d24 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -89,33 +89,44 @@ namespace NewHorizons (b.Config.Orbit.IsMoon ? 2 : 1) ))).ToList(); - var flagNoneLoadedThisPass = true; + var count = 0; while(toLoad.Count != 0) { + Logger.Log($"Starting body loading pass #{++count}"); + var flagNoneLoadedThisPass = true; foreach (var body in toLoad) { - if (LoadBody(body)) - flagNoneLoadedThisPass = false; + if (LoadBody(body)) flagNoneLoadedThisPass = false; } if (flagNoneLoadedThisPass) { + Logger.LogWarning("No objects were loaded this pass"); // Try again but default to sun foreach(var body in toLoad) { - if (LoadBody(body, true)) - flagNoneLoadedThisPass = false; - } - if(flagNoneLoadedThisPass) - { - // Give up - Logger.Log($"Couldn't finish adding bodies."); - return; + if (LoadBody(body, true)) flagNoneLoadedThisPass = false; } } + if (flagNoneLoadedThisPass) + { + // Give up + Logger.Log($"Couldn't finish adding bodies."); + return; + } + toLoad = NextPassBodies; NextPassBodies = new List(); + + // Infinite loop failsafe + if (count > 10) + { + Logger.Log("Something went wrong"); + break; + } } + Logger.Log("Done loading bodies"); + // I don't know what these do but they look really weird from a distance Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => PlanetDestroyer.RemoveDistantProxyClones()); } diff --git a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs index a70bd305..3e4eab05 100644 --- a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs +++ b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs @@ -35,7 +35,6 @@ namespace NewHorizons.OrbitalPhysics pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } - Logger.Log($"Position : {pos}"); return pos; } @@ -49,7 +48,6 @@ namespace NewHorizons.OrbitalPhysics pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } - Logger.Log($"Position : {pos}"); return pos; } @@ -63,7 +61,6 @@ namespace NewHorizons.OrbitalPhysics pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } - Logger.Log($"Position : {pos}"); return pos; } @@ -77,7 +74,6 @@ namespace NewHorizons.OrbitalPhysics pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; } - Logger.Log($"Position : {pos}"); return pos; } @@ -86,7 +82,6 @@ namespace NewHorizons.OrbitalPhysics var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2; - Logger.Log($"Velocity : {vel}"); return vel; } @@ -95,7 +90,6 @@ namespace NewHorizons.OrbitalPhysics var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2; - Logger.Log($"Velocity : {vel}"); return vel; }