From 03455b54269c2b1ec072e6ef5ea47a980664a94a Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 9 Aug 2023 23:49:41 -0400 Subject: [PATCH 1/5] AddPhysics on planet allows it to be deorbited #194 --- .../Builder/General/RigidBodyBuilder.cs | 54 ++++++++++++++++--- .../Builder/Orbital/OrbitlineBuilder.cs | 12 ++++- NewHorizons/External/Modules/BaseModule.cs | 8 +++ NewHorizons/Handlers/PlanetCreationHandler.cs | 4 +- 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/NewHorizons/Builder/General/RigidBodyBuilder.cs b/NewHorizons/Builder/General/RigidBodyBuilder.cs index 9a0d5186..54d89cd5 100644 --- a/NewHorizons/Builder/General/RigidBodyBuilder.cs +++ b/NewHorizons/Builder/General/RigidBodyBuilder.cs @@ -1,15 +1,17 @@ +using NewHorizons.External; +using NewHorizons.External.Configs; using NewHorizons.Utility; +using NewHorizons.Utility.OWML; using UnityEngine; namespace NewHorizons.Builder.General { public static class RigidBodyBuilder { - public static OWRigidbody Make(GameObject body, float sphereOfInfluence) + public static OWRigidbody Make(GameObject body, float sphereOfInfluence, PlanetConfig config) { body.AddComponent()._bounds.radius = sphereOfInfluence; Rigidbody rigidBody = body.AddComponent(); - rigidBody.mass = 10000; rigidBody.drag = 0f; rigidBody.angularDrag = 0f; rigidBody.useGravity = false; @@ -17,18 +19,56 @@ namespace NewHorizons.Builder.General rigidBody.interpolation = RigidbodyInterpolation.None; rigidBody.collisionDetectionMode = CollisionDetectionMode.Discrete; - KinematicRigidbody kinematicRigidBody = body.AddComponent(); - OWRigidbody owRigidBody = body.AddComponent(); - owRigidBody._kinematicSimulation = true; owRigidBody._autoGenerateCenterOfMass = true; owRigidBody.SetIsTargetable(true); owRigidBody._maintainOriginalCenterOfMass = true; owRigidBody._rigidbody = rigidBody; - owRigidBody._kinematicRigidbody = kinematicRigidBody; owRigidBody._origParent = SearchUtilities.Find("SolarSystemRoot")?.transform; - owRigidBody.EnableKinematicSimulation(); + + KinematicRigidbody kinematicRigidBody = body.AddComponent(); + owRigidBody._kinematicRigidbody = kinematicRigidBody; + owRigidBody._kinematicSimulation = true; owRigidBody.MakeKinematic(); + owRigidBody.EnableKinematicSimulation(); + rigidBody.mass = 10000; + + if (config.Base.addPhysics) + { + // hack: make all mesh colliders convex + // triggers are already convex + // prints errors for non readable meshes but whatever + foreach (var meshCollider in body.GetComponentsInChildren(true)) + meshCollider.convex = true; + + var shape = body.AddComponent(); + shape._collisionMode = Shape.CollisionMode.Detector; + shape._layerMask = (int)(Shape.Layer.Default | Shape.Layer.Gravity); + shape._radius = config.Base.surfaceSize; + + var impactSensor = body.AddComponent(); + var audioSource = body.AddComponent(); + audioSource.maxDistance = 30; + audioSource.dopplerLevel = 0; + audioSource.rolloffMode = AudioRolloffMode.Custom; + audioSource.playOnAwake = false; + audioSource.spatialBlend = 1; + + var owAudioSource = body.AddComponent(); + owAudioSource._audioSource = audioSource; + owAudioSource._track = OWAudioMixer.TrackName.Environment; + + var objectImpactAudio = body.AddComponent(); + objectImpactAudio._minPitch = 0.4f; + objectImpactAudio._maxPitch = 0.6f; + objectImpactAudio._impactSensor = impactSensor; + + owRigidBody.MakeNonKinematic(); + owRigidBody.DisableKinematicSimulation(); + + // Should make this number changeable + Delay.FireOnNextUpdate(() => owRigidBody.SetMass(0.001f)); + } return owRigidBody; } diff --git a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs index 0ede52f2..fac2bfcf 100644 --- a/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs +++ b/NewHorizons/Builder/Orbital/OrbitlineBuilder.cs @@ -17,7 +17,7 @@ namespace NewHorizons.Builder.Orbital if (_dottedLineMaterial == null || _lineMaterial == null) return null; - GameObject orbitGO = new GameObject("Orbit"); + var orbitGO = new GameObject("Orbit"); orbitGO.transform.parent = planetGO.transform; orbitGO.transform.localPosition = Vector3.zero; @@ -83,6 +83,16 @@ namespace NewHorizons.Builder.Orbital Delay.FireOnNextUpdate(orbitLine.InitializeLineRenderer); + // If the planet has physics and a regular orbit line, make sure that when it's bumped into the old orbit line vanishes + if (config.Base.addPhysics && !config.Orbit.trackingOrbitLine) + { + var impactSensor = planetGO.GetComponent(); + impactSensor.OnImpact += (ImpactData _) => + { + orbitGO.SetActive(false); + }; + } + return orbitLine; } } diff --git a/NewHorizons/External/Modules/BaseModule.cs b/NewHorizons/External/Modules/BaseModule.cs index cfab241e..03dbb51a 100644 --- a/NewHorizons/External/Modules/BaseModule.cs +++ b/NewHorizons/External/Modules/BaseModule.cs @@ -71,6 +71,14 @@ namespace NewHorizons.External.Modules /// [DefaultValue(0)] public int gravityVolumePriority = 0; + /// + /// Apply physics to this planet when you bump into it. Will have a spherical collider the size of surfaceSize. + /// For custom colliders they have to all be convex and you can leave surface size as 0. + /// This is meant for stuff like satellites which are relatively simple and can be de-orbited. + /// If you are using an orbit line but a tracking line, it will be removed when the planet is bumped in to. + /// + public bool addPhysics; + #region Obsolete [Obsolete("IsSatellite is deprecated, please use ShowMinimap instead")] diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index ea235665..2b014cbf 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -348,7 +348,7 @@ namespace NewHorizons.Handlers const float sphereOfInfluence = 2000f; - var owRigidBody = RigidBodyBuilder.Make(go, sphereOfInfluence); + var owRigidBody = RigidBodyBuilder.Make(go, sphereOfInfluence, body.Config); var ao = AstroObjectBuilder.Make(go, null, body.Config, false); var sector = SectorBuilder.Make(go, owRigidBody, sphereOfInfluence); @@ -423,7 +423,7 @@ namespace NewHorizons.Handlers var sphereOfInfluence = GetSphereOfInfluence(body); - var owRigidBody = RigidBodyBuilder.Make(go, sphereOfInfluence); + var owRigidBody = RigidBodyBuilder.Make(go, sphereOfInfluence, body.Config); var ao = AstroObjectBuilder.Make(go, primaryBody, body.Config, false); var sector = SectorBuilder.Make(go, owRigidBody, sphereOfInfluence * 2f); From 39324e00b09b523e4f69bcb02ec8e846a5f09fab Mon Sep 17 00:00:00 2001 From: Ben C Date: Thu, 10 Aug 2023 03:52:34 +0000 Subject: [PATCH 2/5] Updated Schemas --- NewHorizons/Schemas/body_schema.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 62a2069c..bb897a04 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -573,6 +573,10 @@ "description": "Optional. You can force this planet's gravity to be felt over other gravity/zero-gravity sources by increasing this number.", "format": "int32", "default": 0 + }, + "addPhysics": { + "type": "boolean", + "description": "Apply physics to this planet when you bump into it. Will have a spherical collider the size of surfaceSize. \nFor custom colliders they have to all be convex and you can leave surface size as 0.\nThis is meant for stuff like satellites which are relatively simple and can be de-orbited.\nIf you are using an orbit line but a tracking line, it will be removed when the planet is bumped in to." } } }, From 0bcaa3f7ef26fa7cbd670f3a8bb221a84da4fba0 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 10 Aug 2023 00:31:50 -0400 Subject: [PATCH 3/5] Add comments --- NewHorizons/Builder/General/RigidBodyBuilder.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NewHorizons/Builder/General/RigidBodyBuilder.cs b/NewHorizons/Builder/General/RigidBodyBuilder.cs index 54d89cd5..5661d430 100644 --- a/NewHorizons/Builder/General/RigidBodyBuilder.cs +++ b/NewHorizons/Builder/General/RigidBodyBuilder.cs @@ -63,10 +63,14 @@ namespace NewHorizons.Builder.General objectImpactAudio._maxPitch = 0.6f; objectImpactAudio._impactSensor = impactSensor; + // For some reason when originally testing, not doing MakeKinematic caused the body to not move relative to the player character + // It seems that turning it on and then off makes it actually work properly owRigidBody.MakeNonKinematic(); owRigidBody.DisableKinematicSimulation(); - // Should make this number changeable + // Should make this number changeable, if anybody ever asks + // For some reason, setting this on the exact same frame as it is created doesn't work. + // I imagine something strange is happening on Awake/Start, hence the delay Delay.FireOnNextUpdate(() => owRigidBody.SetMass(0.001f)); } From 7a5630bc0e93dad7395633bc0bcd2f06b4223af9 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 10 Aug 2023 00:54:31 -0400 Subject: [PATCH 4/5] Fix default system override #687 --- NewHorizons/Main.cs | 48 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index f2d5c7e7..6e5342e4 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -116,12 +116,12 @@ namespace NewHorizons else if (Debug) NHLogger.UpdateLogLevel(NHLogger.LogType.Log); else NHLogger.UpdateLogLevel(NHLogger.LogType.Error); + var oldDefaultSystemOverride = _defaultSystemOverride; _defaultSystemOverride = config.GetSettingsValue("Default System Override"); - - // Else it doesn't get set idk - if (currentScene == "TitleScreen" && SystemDict.ContainsKey(_defaultSystemOverride)) + if (oldDefaultSystemOverride != _defaultSystemOverride) { - _currentStarSystem = _defaultSystemOverride; + ResetCurrentStarSystem(); + NHLogger.Log($"Changed default star system override to {_defaultSystemOverride}"); } var wasUsingCustomTitleScreen = _useCustomTitleScreen; @@ -553,17 +553,7 @@ namespace NewHorizons } else { - // Reset back to original solar system after going to main menu. - // If the override is a valid system then we go there - if (SystemDict.ContainsKey(_defaultSystemOverride)) - { - _currentStarSystem = _defaultSystemOverride; - IsWarpingFromShip = true; // always do this else sometimes the spawn gets messed up - } - else - { - _currentStarSystem = _defaultStarSystem; - } + ResetCurrentStarSystem(); } } @@ -614,7 +604,7 @@ namespace NewHorizons if (starSystemName != "SolarSystem") { SetDefaultSystem(starSystemName); - _currentStarSystem = starSystemName; + _currentStarSystem = DefaultStarSystem; } } @@ -903,15 +893,23 @@ namespace NewHorizons { if (SystemDict[_currentStarSystem].Config.respawnHere) return; - // If the override is a valid system then we go there - if (SystemDict.ContainsKey(_defaultSystemOverride)) - { - _currentStarSystem = _defaultSystemOverride; - } - else - { - _currentStarSystem = _defaultStarSystem; - } + ResetCurrentStarSystem(); + } + } + + private void ResetCurrentStarSystem() + { + if (SystemDict.ContainsKey(_defaultSystemOverride)) + { + _currentStarSystem = _defaultSystemOverride; + + // Sometimes the override will not support spawning regularly, so always warp in + IsWarpingFromShip = true; + } + else + { + _currentStarSystem = _defaultStarSystem; + IsWarpingFromShip = false; } } #endregion Change star system From 2914856c74565b324f01b8f4ea478d79acf761b3 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 10 Aug 2023 00:59:40 -0400 Subject: [PATCH 5/5] Remove and sort using --- NewHorizons/Main.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 6e5342e4..2906f9be 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -3,8 +3,10 @@ using NewHorizons.Builder.Atmosphere; using NewHorizons.Builder.Body; using NewHorizons.Builder.General; using NewHorizons.Builder.Props; +using NewHorizons.Builder.Props.Audio; using NewHorizons.Builder.Props.TranslatorText; using NewHorizons.Components.Fixers; +using NewHorizons.Components.Ship; using NewHorizons.Components.SizeControllers; using NewHorizons.External; using NewHorizons.External.Configs; @@ -14,9 +16,11 @@ using NewHorizons.OtherMods.MenuFramework; using NewHorizons.OtherMods.OWRichPresence; using NewHorizons.OtherMods.VoiceActing; using NewHorizons.Utility; +using NewHorizons.Utility.DebugTools; +using NewHorizons.Utility.DebugTools.Menu; using NewHorizons.Utility.Files; -using NewHorizons.Utility.OWML; using NewHorizons.Utility.OuterWilds; +using NewHorizons.Utility.OWML; using OWML.Common; using OWML.ModHelper; using OWML.Utils; @@ -29,12 +33,6 @@ using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; -using NewHorizons.Utility.DebugTools; -using NewHorizons.Utility.DebugTools.Menu; -using NewHorizons.Components.Ship; -using NewHorizons.Builder.Props.Audio; -using Epic.OnlineServices; - namespace NewHorizons {