diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index fce3ada5..da11d9a0 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -1,4 +1,5 @@ using NewHorizons.External.Modules; +using NewHorizons.Components; using NewHorizons.Utility; using OWML.Common; using System; @@ -20,7 +21,7 @@ namespace NewHorizons.Builder.Atmosphere private static readonly int CapTex = Shader.PropertyToID("_CapTex"); private static readonly int ColorRamp = Shader.PropertyToID("_ColorRamp"); - public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, IModBehaviour mod) + public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, bool cloaked, IModBehaviour mod) { if (_lightningPrefab == null) _lightningPrefab = SearchUtilities.Find("GiantsDeep_Body/Sector_GD/Clouds_GD/LightningGenerator_GD"); if (_colorRamp == null) _colorRamp = ImageUtilities.GetTexture(Main.Instance, "Assets/textures/Clouds_Bottom_ramp.png"); @@ -65,8 +66,10 @@ namespace NewHorizons.Builder.Atmosphere bottomTSR.LODBias = 0; bottomTSR.LODRadius = 1f; - TessSphereSectorToggle bottomTSST = cloudsBottomGO.AddComponent(); - bottomTSST._sector = sector; + if (cloaked) + cloudsBottomGO.AddComponent()._sector = sector; + else + cloudsBottomGO.AddComponent()._sector = sector; GameObject cloudsFluidGO = new GameObject("CloudsFluid"); cloudsFluidGO.SetActive(false); diff --git a/NewHorizons/Components/CloakSectorController.cs b/NewHorizons/Components/CloakSectorController.cs index ae4ebdcd..ac2dd46c 100644 --- a/NewHorizons/Components/CloakSectorController.cs +++ b/NewHorizons/Components/CloakSectorController.cs @@ -1,141 +1,153 @@ -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -namespace NewHorizons.Components -{ - public class CloakSectorController : MonoBehaviour - { - private CloakFieldController _cloak; - private GameObject _root; - - private bool _isInitialized; - - private List _renderers = null; - private List _tessellatedRenderers = null; - - public static bool isPlayerInside = false; - public static bool isProbeInside = false; - public static bool isShipInside = false; - - public void Init(CloakFieldController cloak, GameObject root) - { - _cloak = cloak; - _root = root; - - // Lets just clear these off idc - _cloak.OnPlayerEnter = new OWEvent(); - _cloak.OnPlayerExit = new OWEvent(); - _cloak.OnProbeEnter = new OWEvent(); - _cloak.OnProbeExit = new OWEvent(); - _cloak.OnShipEnter = new OWEvent(); - _cloak.OnShipExit = new OWEvent(); - - _cloak.OnPlayerEnter += OnPlayerEnter; - _cloak.OnPlayerExit += OnPlayerExit; - _cloak.OnProbeEnter += OnProbeEnter; - _cloak.OnProbeExit += OnProbeExit; - _cloak.OnShipEnter += OnShipEnter; - _cloak.OnShipExit += OnShipExit; - - _isInitialized = true; - } - - void OnDestroy() - { - if (_isInitialized) - { - _cloak.OnPlayerEnter -= OnPlayerEnter; - _cloak.OnPlayerExit -= OnPlayerExit; - } - } - - private void SetUpList() - { - _renderers = _root.GetComponentsInChildren().ToList(); - _tessellatedRenderers = _root.GetComponentsInChildren().ToList(); - } - - public void OnPlayerEnter() - { - SetUpList(); - - foreach (var renderer in _renderers) - { - renderer.forceRenderingOff = false; - } - - foreach (var tessellatedRenderer in _tessellatedRenderers) - { - tessellatedRenderer.enabled = false; - } - - isPlayerInside = true; - GlobalMessenger.FireEvent("PlayerEnterCloakField"); - } - - public void OnPlayerExit() - { - SetUpList(); - - foreach (var renderer in _renderers) - { - renderer.forceRenderingOff = true; - } - - foreach (var tessellatedRenderer in _tessellatedRenderers) - { - tessellatedRenderer.enabled = true; - } - - isPlayerInside = false; - GlobalMessenger.FireEvent("PlayerExitCloakField"); - } - - public void OnProbeEnter() - { - isProbeInside = true; - GlobalMessenger.FireEvent("ProbeEnterCloakField"); - } - - public void OnProbeExit() - { - isProbeInside = false; - GlobalMessenger.FireEvent("ProbeExitCloakField"); - } - - public void OnShipEnter() - { - isShipInside = true; - GlobalMessenger.FireEvent("ShipEnterCloakField"); - } - - public void OnShipExit() - { - isShipInside = false; - GlobalMessenger.FireEvent("ShipExitCloakField"); - } - - public void EnableCloak() - { - SunLightController.RegisterSunOverrider(_cloak, 900); - _cloak._cloakSphereRenderer.SetActivation(true); - Shader.EnableKeyword("_CLOAKINGFIELDENABLED"); - _cloak._cloakVisualsEnabled = true; - } - - public void DisableCloak() - { - SunLightController.UnregisterSunOverrider(_cloak); - _cloak._cloakSphereRenderer.SetActivation(false); - Shader.DisableKeyword("_CLOAKINGFIELDENABLED"); - _cloak._cloakVisualsEnabled = false; - } - - public void SetReferenceFrameVolumeActive(bool active) => _cloak._referenceFrameVolume?.gameObject.SetActive(active); - public void EnableReferenceFrameVolume() => SetReferenceFrameVolumeActive(true); - public void DisableReferenceFrameVolume() => SetReferenceFrameVolumeActive(false); - - public void TurnOnMusic() => _cloak._hasTriggeredMusic = false; - public void TurnOffMusic() => _cloak._hasTriggeredMusic = true; - } -} +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +namespace NewHorizons.Components +{ + public class CloakSectorController : MonoBehaviour + { + private CloakFieldController _cloak; + private GameObject _root; + + private bool _isInitialized; + + private List _renderers = null; + private List _tessellatedRenderers = null; + private List _tessSphereToggles = null; + + public static bool isPlayerInside = false; + public static bool isProbeInside = false; + public static bool isShipInside = false; + + public void Init(CloakFieldController cloak, GameObject root) + { + _cloak = cloak; + _root = root; + + // Lets just clear these off idc + _cloak.OnPlayerEnter = new OWEvent(); + _cloak.OnPlayerExit = new OWEvent(); + _cloak.OnProbeEnter = new OWEvent(); + _cloak.OnProbeExit = new OWEvent(); + _cloak.OnShipEnter = new OWEvent(); + _cloak.OnShipExit = new OWEvent(); + + _cloak.OnPlayerEnter += OnPlayerEnter; + _cloak.OnPlayerExit += OnPlayerExit; + _cloak.OnProbeEnter += OnProbeEnter; + _cloak.OnProbeExit += OnProbeExit; + _cloak.OnShipEnter += OnShipEnter; + _cloak.OnShipExit += OnShipExit; + + _isInitialized = true; + } + + void OnDestroy() + { + if (_isInitialized) + { + _cloak.OnPlayerEnter -= OnPlayerEnter; + _cloak.OnPlayerExit -= OnPlayerExit; + } + } + + private void SetUpList() + { + _renderers = _root.GetComponentsInChildren().ToList(); + _tessellatedRenderers = _root.GetComponentsInChildren().ToList(); + _tessSphereToggles = _root.GetComponentsInChildren().ToList(); + } + + public void OnPlayerEnter() + { + SetUpList(); + + foreach (var renderer in _renderers) + { + renderer.forceRenderingOff = false; + } + + foreach (var tessellatedRenderer in _tessellatedRenderers) + { + tessellatedRenderer.enabled = true; + } + + foreach (var tessSphereSectorToggle in _tessSphereToggles) + { + tessSphereSectorToggle.OnEnterCloakField(); + } + + isPlayerInside = true; + GlobalMessenger.FireEvent("PlayerEnterCloakField"); + } + + public void OnPlayerExit() + { + SetUpList(); + + foreach (var renderer in _renderers) + { + renderer.forceRenderingOff = true; + } + + foreach (var tessellatedRenderer in _tessellatedRenderers) + { + tessellatedRenderer.enabled = false; + } + + foreach (var tessSphereSectorToggle in _tessSphereToggles) + { + tessSphereSectorToggle.OnExitCloakField(); + } + + isPlayerInside = false; + GlobalMessenger.FireEvent("PlayerExitCloakField"); + } + + public void OnProbeEnter() + { + isProbeInside = true; + GlobalMessenger.FireEvent("ProbeEnterCloakField"); + } + + public void OnProbeExit() + { + isProbeInside = false; + GlobalMessenger.FireEvent("ProbeExitCloakField"); + } + + public void OnShipEnter() + { + isShipInside = true; + GlobalMessenger.FireEvent("ShipEnterCloakField"); + } + + public void OnShipExit() + { + isShipInside = false; + GlobalMessenger.FireEvent("ShipExitCloakField"); + } + + public void EnableCloak() + { + SunLightController.RegisterSunOverrider(_cloak, 900); + _cloak._cloakSphereRenderer.SetActivation(true); + Shader.EnableKeyword("_CLOAKINGFIELDENABLED"); + _cloak._cloakVisualsEnabled = true; + } + + public void DisableCloak() + { + SunLightController.UnregisterSunOverrider(_cloak); + _cloak._cloakSphereRenderer.SetActivation(false); + Shader.DisableKeyword("_CLOAKINGFIELDENABLED"); + _cloak._cloakVisualsEnabled = false; + } + + public void SetReferenceFrameVolumeActive(bool active) => _cloak._referenceFrameVolume?.gameObject.SetActive(active); + public void EnableReferenceFrameVolume() => SetReferenceFrameVolumeActive(true); + public void DisableReferenceFrameVolume() => SetReferenceFrameVolumeActive(false); + + public void TurnOnMusic() => _cloak._hasTriggeredMusic = false; + public void TurnOffMusic() => _cloak._hasTriggeredMusic = true; + } +} diff --git a/NewHorizons/Components/CloakedTessSphereSectorToggle.cs b/NewHorizons/Components/CloakedTessSphereSectorToggle.cs new file mode 100644 index 00000000..b5232720 --- /dev/null +++ b/NewHorizons/Components/CloakedTessSphereSectorToggle.cs @@ -0,0 +1,74 @@ +using UnityEngine; + +namespace NewHorizons.Components +{ + [RequireComponent(typeof(TessellatedSphereRenderer))] + public class CloakedTessSphereSectorToggle : SectoredMonoBehaviour + { + protected TessellatedSphereRenderer _renderer; + protected bool _inMapView; + protected bool _inCloakField; + + public override void Awake() + { + _renderer = GetComponent(); + GlobalMessenger.AddListener("EnterMapView", OnEnterMapView); + GlobalMessenger.AddListener("ExitMapView", OnExitMapView); + } + + public override void OnDestroy() + { + GlobalMessenger.RemoveListener("EnterMapView", OnEnterMapView); + GlobalMessenger.RemoveListener("ExitMapView", OnExitMapView); + } + + public override void OnChangeSector(Sector oldSector, Sector newSector) => OnSectorOccupantsUpdated(); + + public override void OnSectorOccupantsUpdated() + { + if (_inMapView || !_inCloakField) + return; + if (_sector != null) + { + if (_sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe) && !_renderer.enabled) + { + _renderer.enabled = true; + } + else + { + if (_sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe) || !_renderer.enabled) + return; + _renderer.enabled = false; + } + } + else + _renderer.enabled = true; + } + + public virtual void OnEnterMapView() + { + _inMapView = true; + if (_renderer.enabled) + _renderer.enabled = false; + } + + public virtual void OnExitMapView() + { + _inMapView = false; + OnSectorOccupantsUpdated(); + } + + public virtual void OnEnterCloakField() + { + _inCloakField = true; + OnSectorOccupantsUpdated(); + } + + public virtual void OnExitCloakField() + { + _inCloakField = false; + if (_renderer.enabled) + _renderer.enabled = false; + } + } +} diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 888342e1..4d93a496 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -432,6 +432,8 @@ namespace NewHorizons.Handlers SandBuilder.Make(go, sector, rb, body.Config.Sand); } + var willHaveCloak = body.Config.Cloak != null && body.Config.Cloak.radius != 0f; + if (body.Config.Atmosphere != null) { var airInfo = new AtmosphereModule.AirInfo() @@ -448,7 +450,7 @@ namespace NewHorizons.Handlers if (!string.IsNullOrEmpty(body.Config.Atmosphere?.clouds?.texturePath)) { - CloudsBuilder.Make(go, sector, body.Config.Atmosphere, body.Mod); + CloudsBuilder.Make(go, sector, body.Config.Atmosphere, willHaveCloak, body.Mod); SunOverrideBuilder.Make(go, sector, body.Config.Atmosphere, body.Config.Water, surfaceSize); } @@ -477,7 +479,7 @@ namespace NewHorizons.Handlers } // Has to go last probably - if (body.Config.Cloak != null && body.Config.Cloak.radius != 0f) + if (willHaveCloak) { CloakBuilder.Make(go, sector, rb, body.Config.Cloak, !body.Config.ReferenceFrame.hideInMap, body.Mod); }