diff --git a/NewHorizons/Builder/General/DetectorBuilder.cs b/NewHorizons/Builder/General/DetectorBuilder.cs index 3f47e8bb..82671951 100644 --- a/NewHorizons/Builder/General/DetectorBuilder.cs +++ b/NewHorizons/Builder/General/DetectorBuilder.cs @@ -44,45 +44,41 @@ namespace NewHorizons.Builder.General public static void SetDetector(AstroObject primaryBody, AstroObject astroObject, ConstantForceDetector forceDetector) { - GravityVolume parentGravityVolume = primaryBody?.GetAttachedOWRigidbody()?.GetAttachedGravityVolume(); - if (parentGravityVolume != null) + var binaryFocalPoint = primaryBody?.gameObject?.GetComponent(); + var parentGravityVolume = primaryBody?.GetAttachedOWRigidbody()?.GetAttachedGravityVolume(); + + if (binaryFocalPoint != null) { - forceDetector._detectableFields = new ForceVolume[] { parentGravityVolume }; - } - else if (astroObject != null) - { - // It's probably a focal point (or its just broken) - var binaryFocalPoint = primaryBody?.gameObject?.GetComponent(); - if (binaryFocalPoint != null) + if (astroObject.GetCustomName().Equals(binaryFocalPoint.PrimaryName)) { - if (astroObject.GetCustomName().Equals(binaryFocalPoint.PrimaryName)) + binaryFocalPoint.Primary = astroObject; + if (binaryFocalPoint.Secondary != null) { - binaryFocalPoint.Primary = astroObject; - if (binaryFocalPoint.Secondary != null) - { - var secondaryRB = binaryFocalPoint.Secondary.GetAttachedOWRigidbody(); - SetBinaryForceDetectableFields(binaryFocalPoint, forceDetector, (ConstantForceDetector)secondaryRB.GetAttachedForceDetector()); - } - } - else if (astroObject.GetCustomName().Equals(binaryFocalPoint.SecondaryName)) - { - binaryFocalPoint.Secondary = astroObject; - if (binaryFocalPoint.Primary != null) - { - var primaryRB = binaryFocalPoint.Primary.GetAttachedOWRigidbody(); - SetBinaryForceDetectableFields(binaryFocalPoint, (ConstantForceDetector)primaryRB.GetAttachedForceDetector(), forceDetector); - } - } - else - { - // It's a planet - if (binaryFocalPoint.Primary != null && binaryFocalPoint.Secondary != null) - { - var fakeBarycenterGravityVolume = binaryFocalPoint.FakeMassBody.GetComponent().GetGravityVolume(); - forceDetector._detectableFields = new ForceVolume[] { fakeBarycenterGravityVolume }; - } + var secondaryRB = binaryFocalPoint.Secondary.GetAttachedOWRigidbody(); + SetBinaryForceDetectableFields(binaryFocalPoint, forceDetector, (ConstantForceDetector)secondaryRB.GetAttachedForceDetector()); } } + else if (astroObject.GetCustomName().Equals(binaryFocalPoint.SecondaryName)) + { + binaryFocalPoint.Secondary = astroObject; + if (binaryFocalPoint.Primary != null) + { + var primaryRB = binaryFocalPoint.Primary.GetAttachedOWRigidbody(); + SetBinaryForceDetectableFields(binaryFocalPoint, (ConstantForceDetector)primaryRB.GetAttachedForceDetector(), forceDetector); + } + } + else + { + // It's a planet + if (binaryFocalPoint.Primary != null && binaryFocalPoint.Secondary != null) + { + forceDetector._detectableFields = new ForceVolume[] { parentGravityVolume }; + } + } + } + else + { + forceDetector._detectableFields = new ForceVolume[] { parentGravityVolume }; } } diff --git a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs index a9810eda..6c939658 100644 --- a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs +++ b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs @@ -4,6 +4,7 @@ using NewHorizons.External.Modules; using NewHorizons.Handlers; using NewHorizons.Utility; using OWML.Common; +using System.Linq; using UnityEngine; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Orbital @@ -18,12 +19,10 @@ namespace NewHorizons.Builder.Orbital binary.PrimaryName = module.primary; binary.SecondaryName = module.secondary; - // Below is the stupid fix for making circumbinary planets or wtv - // Grab the bodies from the main dictionary NewHorizonsBody primary = null; NewHorizonsBody secondary = null; - foreach (var body in Main.BodyDict[Main.Instance.CurrentStarSystem]) + foreach (var body in Main.BodyDict[config.starSystem]) { if (body.Config.name == module.primary) { @@ -44,28 +43,26 @@ namespace NewHorizons.Builder.Orbital Logger.LogError($"Couldn't make focal point between [{module.primary} = {primary}] and [{module.secondary} = {secondary}]"); return; } + } + + public static void ValidateConfig(PlanetConfig config) + { + var primary = Main.BodyDict[config.starSystem].Where(x => x.Config.name == config.FocalPoint.primary).FirstOrDefault(); + var secondary = Main.BodyDict[config.starSystem].Where(x => x.Config.name == config.FocalPoint.secondary).FirstOrDefault(); var gravitationalMass = GetGravitationalMass(primary.Config) + GetGravitationalMass(secondary.Config); - // Copying it because I don't want to modify the actual config - var fakeMassConfig = new PlanetConfig(); - // Now need to fake the 3 values to make it return this mass - fakeMassConfig.Base.surfaceSize = 1; - fakeMassConfig.Base.surfaceGravity = gravitationalMass * GravityVolume.GRAVITATIONAL_CONSTANT; - fakeMassConfig.Base.gravityFallOff = primary.Config.Base.gravityFallOff; + config.Base.surfaceSize = 1; + config.Base.surfaceGravity = gravitationalMass * GravityVolume.GRAVITATIONAL_CONSTANT; + config.Base.gravityFallOff = primary.Config.Base.gravityFallOff; - // Other stuff to make the fake barycenter not interact with anything in any way - fakeMassConfig.name = config.name + "_FakeBarycenterMass"; - fakeMassConfig.Base.soiOverride = 0; - fakeMassConfig.Base.hasMapMarker = false; - fakeMassConfig.ReferenceFrame.enabled = false; - fakeMassConfig.ReferenceFrame.hideInMap = true; + // Other stuff to make the barycenter not interact with anything in any way + config.Base.soiOverride = 0; - fakeMassConfig.Orbit = new OrbitModule(); - fakeMassConfig.Orbit.CopyPropertiesFrom(config.Orbit); - - binary.FakeMassBody = PlanetCreationHandler.GenerateBody(new NewHorizonsBody(fakeMassConfig, mod)); + var separation = primary.Config.Orbit.semiMajorAxis + secondary.Config.Orbit.semiMajorAxis; + config.ReferenceFrame.bracketRadius = separation; + config.ReferenceFrame.targetColliderRadius = separation; } private static float GetGravitationalMass(PlanetConfig config) diff --git a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs index d204e79f..36ece316 100644 --- a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs +++ b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs @@ -70,8 +70,8 @@ namespace NewHorizons.Builder.Orbital else { // It's a circumbinary moon/planet - var fakePrimaryBody = focalPoint.FakeMassBody.GetComponent(); - SetMotionFromPrimary(fakePrimaryBody, secondaryBody, secondaryBody as NHAstroObject, initialMotion); + var focalPointAO = focalPoint.GetComponent(); + SetMotionFromPrimary(focalPointAO, secondaryBody, secondaryBody as NHAstroObject, initialMotion); } } else if (primaryBody.GetGravityVolume()) @@ -107,11 +107,11 @@ namespace NewHorizons.Builder.Orbital // Might make binaries with binaries with binaries work if (primaryBody.GetGravityVolume() == null) { - primaryGravity = new Gravity(primaryBody.GetComponent()?.FakeMassBody?.GetComponent()?.GetGravityVolume()); + primaryGravity = new Gravity(primaryBody.GetGravityVolume()); } if (secondaryBody.GetGravityVolume() == null) { - secondaryGravity = new Gravity(secondaryBody.GetComponent()?.FakeMassBody?.GetComponent()?.GetGravityVolume()); + secondaryGravity = new Gravity(secondaryBody.GetGravityVolume()); } // Update the positions diff --git a/NewHorizons/Components/Orbital/BinaryFocalPoint.cs b/NewHorizons/Components/Orbital/BinaryFocalPoint.cs index 6738a690..c67fd568 100644 --- a/NewHorizons/Components/Orbital/BinaryFocalPoint.cs +++ b/NewHorizons/Components/Orbital/BinaryFocalPoint.cs @@ -1,4 +1,4 @@ -using UnityEngine; +using UnityEngine; namespace NewHorizons.Components.Orbital { public class BinaryFocalPoint : MonoBehaviour @@ -9,14 +9,6 @@ namespace NewHorizons.Components.Orbital public AstroObject Primary { get; set; } public AstroObject Secondary { get; set; } - public GameObject FakeMassBody { get; set; } - - void Start() - { - // Make sure its active but maybe it hasn't been set yet - if (FakeMassBody) FakeMassBody.SetActive(true); - } - void Update() { if (Primary == null || Secondary == null) @@ -48,8 +40,6 @@ namespace NewHorizons.Components.Orbital { component2.DisableMarker(); } - - FakeMassBody.SetActive(false); } } } diff --git a/NewHorizons/External/Configs/PlanetConfig.cs b/NewHorizons/External/Configs/PlanetConfig.cs index 075ec326..2f64b1b9 100644 --- a/NewHorizons/External/Configs/PlanetConfig.cs +++ b/NewHorizons/External/Configs/PlanetConfig.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; +using NewHorizons.Builder.Orbital; using NewHorizons.External.Modules; using NewHorizons.External.Modules.VariableSize; using Newtonsoft.Json; diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 888342e1..4b45f2c1 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -267,6 +267,9 @@ namespace NewHorizons.Handlers // Only called when making new planets public static GameObject GenerateBody(NewHorizonsBody body, bool defaultPrimaryToSun = false) { + // Focal points are weird + if (body.Config.FocalPoint != null) FocalPointBuilder.ValidateConfig(body.Config); + AstroObject primaryBody; if (body.Config.Orbit.primaryBody != null) {