From 03455b54269c2b1ec072e6ef5ea47a980664a94a Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 9 Aug 2023 23:49:41 -0400 Subject: [PATCH] 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);