diff --git a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs index e11e781f..60d0dd42 100644 --- a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs +++ b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs @@ -2,6 +2,7 @@ using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; using OWML.Common; +using OWML.Utils; using PacificEngine.OW_CommonResources.Game; using PacificEngine.OW_CommonResources.Game.Resource; using PacificEngine.OW_CommonResources.Game.State; @@ -12,6 +13,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; +using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.General { @@ -35,15 +37,43 @@ 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 && 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()?._falloffExponent ?? 2f) + (secondary?.GetAttachedGravityVolume()?._falloffExponent ?? 2f)) / 2f; + var mass = ((primary?.GetAttachedGravityVolume()?._gravitationalMass ?? ((primary?.GetMass() ?? 0f) * 1000f)) + (secondary?.GetAttachedGravityVolume()?._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 Gravity getGravity(GravityVolume volume) { + if (volume == null) + { + return Gravity.of(2, 0); + } + var exponent = volume._falloffType != GravityVolume.FalloffType.linear ? 2f : 1f; var mass = (volume._surfaceAcceleration * Mathf.Pow(volume._upperSurfaceRadius, exponent)) / GravityVolume.GRAVITATIONAL_CONSTANT; diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 6ba1f0fc..b0abf0fe 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 80b25427..29aed787 100644 --- a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs +++ b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs @@ -1,38 +1,38 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; -using NewHorizons.Utility; -using Logger = NewHorizons.Utility.Logger; -using NewHorizons.External; -using CRGravity = PacificEngine.OW_CommonResources.Geometry.Orbits.Gravity; -using KeplerCoordinates = PacificEngine.OW_CommonResources.Geometry.Orbits.KeplerCoordinates; - -/* - * Wrapper class for OW_CommonResources.Geometry.Orbits functions - */ -namespace NewHorizons.OrbitalPhysics -{ - public static class OrbitalHelper - { - public enum FalloffType - { - inverseSquared, - linear, - none - } - - public static Tuple GetCartesian(Gravity gravity, OrbitModule orbit) +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using NewHorizons.Utility; +using Logger = NewHorizons.Utility.Logger; +using NewHorizons.External; +using CRGravity = PacificEngine.OW_CommonResources.Geometry.Orbits.Gravity; +using KeplerCoordinates = PacificEngine.OW_CommonResources.Geometry.Orbits.KeplerCoordinates; + +/* + * Wrapper class for OW_CommonResources.Geometry.Orbits functions + */ +namespace NewHorizons.OrbitalPhysics +{ + public static class OrbitalHelper + { + public enum FalloffType + { + inverseSquared, + linear, + none + } + + public static Tuple GetCartesian(Gravity gravity, OrbitModule orbit) { if (orbit.SemiMajorAxis == 0) { return Tuple.Create(Vector3.zero, Vector3.zero); } - 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 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 cartesian = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler); if (cartesian == null) @@ -44,15 +44,15 @@ namespace NewHorizons.OrbitalPhysics return cartesian; } - public static Tuple GetCartesian(Gravity gravity, ParameterizedAstroObject ao) + public static Tuple GetCartesian(Gravity gravity, ParameterizedAstroObject ao) { if (ao.SemiMajorAxis == 0) { return Tuple.Create(Vector3.zero, Vector3.zero); - } - - 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 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 cartesian = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler); if (cartesian == null) @@ -64,27 +64,27 @@ namespace NewHorizons.OrbitalPhysics return cartesian; } - public static KeplerCoordinates KeplerCoordinatesFromOrbitModule(OrbitModule orbit) - { - return KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); - } - - public class Gravity - { - public float Exponent { get; } - public float Mass { get; } - - public Gravity(float exponent, float mass) - { - Exponent = exponent; - Mass = mass; - } - - public Gravity(GravityVolume gv) - { - Exponent = gv.GetFalloffExponent(); - Mass = gv.GetStandardGravitationalParameter() / GravityVolume.GRAVITATIONAL_CONSTANT; - } - } - } -} + public static KeplerCoordinates KeplerCoordinatesFromOrbitModule(OrbitModule orbit) + { + return KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); + } + + public class Gravity + { + public float Exponent { get; } + public float Mass { get; } + + public Gravity(float exponent, float mass) + { + Exponent = exponent; + Mass = mass; + } + + public Gravity(GravityVolume gv) + { + Exponent = gv.GetFalloffExponent(); + Mass = gv.GetStandardGravitationalParameter() / GravityVolume.GRAVITATIONAL_CONSTANT; + } + } + } +} diff --git a/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs b/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs deleted file mode 100644 index b17b0d70..00000000 --- a/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs +++ /dev/null @@ -1,23 +0,0 @@ -using OWML.Utils; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; -using NewHorizons.Utility; -using Logger = NewHorizons.Utility.Logger; - -namespace NewHorizons.OrbitalPhysics -{ - public class ParameterizedOrbitLine : EllipticOrbitLine - { - public ParameterizedAstroObject astroObject; - - public override void Start() - { - base.Start(); - } - } -} 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)