Fix infinite loop loading error

This commit is contained in:
Nick J. Connors 2021-12-30 01:43:10 -05:00
parent 207c4cdce5
commit 48a811809d
3 changed files with 51 additions and 19 deletions

View File

@ -1,6 +1,7 @@
using NewHorizons.External; using NewHorizons.External;
using NewHorizons.OrbitalPhysics; using NewHorizons.OrbitalPhysics;
using NewHorizons.Utility; using NewHorizons.Utility;
using OWML.Utils;
using PacificEngine.OW_CommonResources.Game.Resource; using PacificEngine.OW_CommonResources.Game.Resource;
using PacificEngine.OW_CommonResources.Game.State; using PacificEngine.OW_CommonResources.Game.State;
using PacificEngine.OW_CommonResources.Geometry.Orbits; 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) public static void Make(GameObject body, IPlanetConfig config, float SOI, GravityVolume bodyGravity, InitialMotion initialMotion)
{ {
var size = new Position.Size(config.Base.SurfaceSize, SOI); var size = new Position.Size(config.Base.SurfaceSize, SOI);
var gravity = Gravity.of(0, 0);
if(bodyGravity != null)
{
var G = GravityVolume.GRAVITATIONAL_CONSTANT; var G = GravityVolume.GRAVITATIONAL_CONSTANT;
var gravity = Gravity.of(bodyGravity == null ? 2f : bodyGravity.GetFalloffExponent(), bodyGravity == null ? 0 : bodyGravity.GetStandardGravitationalParameter() / G); 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 parent = GetBody(config.Orbit.PrimaryBody);
var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit); var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit);
@ -35,6 +44,24 @@ namespace NewHorizons.Builder.General
var mapping = Planet.defaultMapping; var mapping = Planet.defaultMapping;
mapping[hb] = planetoid; mapping[hb] = planetoid;
Planet.defaultMapping = mapping; Planet.defaultMapping = mapping;
// Fix for binary focal points
var focalPoint = Position.AstroLookup[parent].Invoke()?.gameObject.GetComponent<BinaryFocalPoint>();
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<float>("_falloffExponent") ?? 2f) + (secondary?.GetAttachedGravityVolume()?.GetValue<float>("_falloffExponent") ?? 2f)) / 2f;
var mass = ((primary?.GetAttachedGravityVolume()?.GetValue<float>("_gravitationalMass") ?? ((primary?.GetMass() ?? 0f) * 1000f)) + (secondary?.GetAttachedGravityVolume()?.GetValue<float>("_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) private static HeavenlyBody AddHeavenlyBody(string name)

View File

@ -89,32 +89,43 @@ namespace NewHorizons
(b.Config.Orbit.IsMoon ? 2 : 1) (b.Config.Orbit.IsMoon ? 2 : 1)
))).ToList(); ))).ToList();
var flagNoneLoadedThisPass = true; var count = 0;
while(toLoad.Count != 0) while(toLoad.Count != 0)
{ {
Logger.Log($"Starting body loading pass #{++count}");
var flagNoneLoadedThisPass = true;
foreach (var body in toLoad) foreach (var body in toLoad)
{ {
if (LoadBody(body)) if (LoadBody(body)) flagNoneLoadedThisPass = false;
flagNoneLoadedThisPass = false;
} }
if (flagNoneLoadedThisPass) if (flagNoneLoadedThisPass)
{ {
Logger.LogWarning("No objects were loaded this pass");
// Try again but default to sun // Try again but default to sun
foreach(var body in toLoad) foreach(var body in toLoad)
{ {
if (LoadBody(body, true)) if (LoadBody(body, true)) flagNoneLoadedThisPass = false;
flagNoneLoadedThisPass = false;
} }
if(flagNoneLoadedThisPass) }
if (flagNoneLoadedThisPass)
{ {
// Give up // Give up
Logger.Log($"Couldn't finish adding bodies."); Logger.Log($"Couldn't finish adding bodies.");
return; return;
} }
}
toLoad = NextPassBodies; toLoad = NextPassBodies;
NextPassBodies = new List<NewHorizonsBody>(); NextPassBodies = new List<NewHorizonsBody>();
// 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 // I don't know what these do but they look really weird from a distance
Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => PlanetDestroyer.RemoveDistantProxyClones()); Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => PlanetDestroyer.RemoveDistantProxyClones());

View File

@ -35,7 +35,6 @@ namespace NewHorizons.OrbitalPhysics
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
} }
Logger.Log($"Position : {pos}");
return pos; return pos;
} }
@ -49,7 +48,6 @@ namespace NewHorizons.OrbitalPhysics
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
} }
Logger.Log($"Position : {pos}");
return pos; return pos;
} }
@ -63,7 +61,6 @@ namespace NewHorizons.OrbitalPhysics
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
} }
Logger.Log($"Position : {pos}");
return pos; return pos;
} }
@ -77,7 +74,6 @@ namespace NewHorizons.OrbitalPhysics
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
} }
Logger.Log($"Position : {pos}");
return pos; return pos;
} }
@ -86,7 +82,6 @@ namespace NewHorizons.OrbitalPhysics
var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); 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 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; var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2;
Logger.Log($"Velocity : {vel}");
return vel; return vel;
} }
@ -95,7 +90,6 @@ namespace NewHorizons.OrbitalPhysics
var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); 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 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; var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2;
Logger.Log($"Velocity : {vel}");
return vel; return vel;
} }