From c648fbe428b1772948a9d5637d1cb4ab2df32e3f Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 10 May 2022 23:49:48 -0400 Subject: [PATCH] Add visibility tracker to quantum planets --- NewHorizons/Components/QuantumPlanet.cs | 20 +++++++++++++++++-- NewHorizons/Handlers/PlanetCreationHandler.cs | 15 +++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/NewHorizons/Components/QuantumPlanet.cs b/NewHorizons/Components/QuantumPlanet.cs index a42c4bcf..24e6d1b3 100644 --- a/NewHorizons/Components/QuantumPlanet.cs +++ b/NewHorizons/Components/QuantumPlanet.cs @@ -18,6 +18,7 @@ namespace NewHorizons.Components public class QuantumPlanet : QuantumObject { public List states = new List(); + public State groundState; private int _currentIndex; private NHAstroObject _astroObject; @@ -33,6 +34,8 @@ namespace NewHorizons.Components _detector = GetComponentInChildren(); _alignment = GetComponent(); _rb = GetComponent(); + + GlobalMessenger.AddListener("PlayerBlink", new Callback(OnPlayerBlink)); } public override void Start() @@ -62,8 +65,8 @@ namespace NewHorizons.Components var oldState = states[_currentIndex]; var newState = states[newIndex]; - if (newState.sector != null) SetNewSector(oldState, newState); - if(newState.orbit != null) SetNewOrbit(newState); + if (newState.sector != null && newState.sector != oldState.sector) SetNewSector(oldState, newState); + if (newState.orbit != null && newState.orbit != oldState.orbit) SetNewOrbit(newState); _currentIndex = newIndex; @@ -94,6 +97,19 @@ namespace NewHorizons.Components _rb.SetVelocity(currentOrbit.GetOrbitalParameters(primaryGravity, secondaryGravity).InitialVelocity); } + private void OnPlayerBlink() + { + if (base.IsVisible()) + { + base.Collapse(true); + } + } + + public override bool IsPlayerEntangled() + { + return states[_currentIndex].sector.ContainsAnyOccupants(DynamicOccupant.Player); + } + public class State { public Sector sector { get; set; } diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 7fbf96b4..cdac126b 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -166,7 +166,16 @@ namespace NewHorizons.Handlers var rootSector = quantumPlanet.GetComponentInChildren(); var groundOrbit = _dict[ao].Config.Orbit; - quantumPlanet.states.Add(new QuantumPlanet.State(rootSector, groundOrbit)); + quantumPlanet.groundState = new QuantumPlanet.State(rootSector, groundOrbit); + quantumPlanet.states.Add(quantumPlanet.groundState); + + var visibilityTracker = new GameObject("VisibilityTracker_Sphere"); + visibilityTracker.transform.parent = existingPlanet.transform; + visibilityTracker.transform.localPosition = Vector3.zero; + var sphere = visibilityTracker.AddComponent(); + sphere.radius = GetSphereOfInfluence(_dict[ao]); + var tracker = visibilityTracker.AddComponent(); + quantumPlanet._visibilityTrackers = new VisibilityTracker[] { tracker }; } var rb = existingPlanet.GetComponent(); @@ -177,10 +186,10 @@ namespace NewHorizons.Handlers SharedGenerateBody(body, existingPlanet, sector, rb); // If nothing was generated then forget the sector - if (sector.transform.childCount == 0) sector = null; + if (sector.transform.childCount == 0) sector = quantumPlanet.groundState.sector; // If semimajor axis is 0 then forget the orbit - var orbit = body.Config.Orbit.SemiMajorAxis == 0 ? null : body.Config.Orbit; + var orbit = body.Config.Orbit.SemiMajorAxis == 0 ? quantumPlanet.groundState.orbit : body.Config.Orbit; quantumPlanet.states.Add(new QuantumPlanet.State(sector, orbit)); }