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 4d93a496..f0ff27b9 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) { diff --git a/docs/content/pages/tutorials/details.md b/docs/content/pages/tutorials/details.md index d4517922..93390d5c 100644 --- a/docs/content/pages/tutorials/details.md +++ b/docs/content/pages/tutorials/details.md @@ -1,6 +1,6 @@ --- Title: Detailing -Sort_Priority: 90 +Sort_Priority: 85 --- # Details/Scatterer diff --git a/docs/content/pages/tutorials/star_system.md b/docs/content/pages/tutorials/star_system.md new file mode 100644 index 00000000..734a9b61 --- /dev/null +++ b/docs/content/pages/tutorials/star_system.md @@ -0,0 +1,46 @@ +--- +Title: Star System +Description: A guide to editing a custom star system in New Horizons +Sort_Priority: 90 +--- + +# Intro + +Welcome! This page outlines how to edit a custom star system. + +## Getting Started + +Star Systems are placed in a folder called systems within your mod folder. + +The name of your star system config must be the same as the unique id used in the `starSystem` field of your planet configs. Example: `xen.RealSolarSystem.json`. + +A star system config file will look something like this: + +```json +{ + "$schema": "https://raw.githubusercontent.com/xen-42/outer-wilds-new-horizons/main/NewHorizons/Schemas/star_system_schema.json", + "coords": { + "x": [ 4, 0, 3, 1 ], + "y": [ 0, 5, 4 ], + "z": [ 5, 4, 0, 3, 1 ] + }, + "vesselPosition": { + "x": 0, + "y": 0, + "z": 8000 + } +} +``` + +To see all the different things you can put into a config file check out the [Star System Schema]({{ 'Star System Schema'|route}}). + +## Vessel Coordinates + +You can warp to custom star systems via the Nomai vessel. Each coordinate has to be 2-6 points long. +These are the points for each coordinate node. When making your unique coordinate you should only use each point once. +![nomaiCoordinateIndexes]({{ "images/star_system/nomai_coordinate_indexes.webp"|static }}) + +### Hearthian Solar System Vessel Coordinates + +You can use these coordinates to warp back to the hearthian solar system. +![hearthianSolarSystemCoordinates]({{ "images/star_system/hearthian_solar_system_coordinates.webp"|static }}) \ No newline at end of file diff --git a/docs/content/static/images/star_system/hearthian_solar_system_coordinates.webp b/docs/content/static/images/star_system/hearthian_solar_system_coordinates.webp new file mode 100644 index 00000000..17730df0 Binary files /dev/null and b/docs/content/static/images/star_system/hearthian_solar_system_coordinates.webp differ diff --git a/docs/content/static/images/star_system/nomai_coordinate_indexes.webp b/docs/content/static/images/star_system/nomai_coordinate_indexes.webp new file mode 100644 index 00000000..5bc128dd Binary files /dev/null and b/docs/content/static/images/star_system/nomai_coordinate_indexes.webp differ