From 207c4cdce5d4966e80e07eee97482ae4a482a4ac Mon Sep 17 00:00:00 2001 From: "Nick J. Connors" Date: Thu, 30 Dec 2021 00:30:28 -0500 Subject: [PATCH 1/3] Fix GetFalloffExponent (maybe) --- NewHorizons/Utility/NewHorizonExtensions.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index 7a2e4e27..ef01fa86 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -30,7 +30,10 @@ namespace NewHorizons.Utility public static float GetFalloffExponent(this GravityVolume gv) { if (gv == null) return 0; - return (float)typeof(GravityVolume).GetField("_falloffExponent", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(gv); + if (gv._falloffType == GravityVolume.FalloffType.linear) return 1; + if (gv._falloffType == GravityVolume.FalloffType.inverseSquared) return 2; + + return 0; } public static string ToCamelCase(this string str) From 48a811809dc87a636ca705c83362de7419648fcd Mon Sep 17 00:00:00 2001 From: "Nick J. Connors" Date: Thu, 30 Dec 2021 01:43:10 -0500 Subject: [PATCH 2/3] 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; } From a5eb0d25eeab5bbadb9493aeeabb72f115a80147 Mon Sep 17 00:00:00 2001 From: "Nick J. Connors" Date: Thu, 30 Dec 2021 02:19:01 -0500 Subject: [PATCH 3/3] Fix static heavenly body --- .../Builder/General/HeavenlyBodyBuilder.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs index cb68b791..5b634669 100644 --- a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs +++ b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; +using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.General { @@ -39,21 +40,26 @@ namespace NewHorizons.Builder.General { hb = AddHeavenlyBody(config.Name); } - var planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, initialMotion._initAngularSpeed, parent, orbit); - var mapping = Planet.defaultMapping; - mapping[hb] = planetoid; - Planet.defaultMapping = mapping; + if(!config.Orbit.IsStatic) + { + var planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, initialMotion._initAngularSpeed, parent, orbit); + + 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) + if (focalPoint != null && Planet.defaultMapping.ContainsKey(parent)) { var primary = Position.getBody(GetBody(focalPoint.PrimaryName)); var secondary = Position.getBody(GetBody(focalPoint.SecondaryName)); if(primary != null && secondary != null) { + Logger.Log($"Fixing BinaryFocalPoint HeavenlyBody gravity value for {parent.name}"); 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;