Merge branch 'dev' into fix-remove-children

This commit is contained in:
FreezeDriedMangoes 2022-07-05 17:50:55 -04:00
commit 9c55f0fbbd
4 changed files with 237 additions and 146 deletions

View File

@ -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<TessSphereSectorToggle>();
bottomTSST._sector = sector;
if (cloaked)
cloudsBottomGO.AddComponent<CloakedTessSphereSectorToggle>()._sector = sector;
else
cloudsBottomGO.AddComponent<TessSphereSectorToggle>()._sector = sector;
GameObject cloudsFluidGO = new GameObject("CloudsFluid");
cloudsFluidGO.SetActive(false);

View File

@ -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<Renderer> _renderers = null;
private List<TessellatedRenderer> _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<Renderer>().ToList();
_tessellatedRenderers = _root.GetComponentsInChildren<TessellatedRenderer>().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<Renderer> _renderers = null;
private List<TessellatedRenderer> _tessellatedRenderers = null;
private List<CloakedTessSphereSectorToggle> _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<Renderer>().ToList();
_tessellatedRenderers = _root.GetComponentsInChildren<TessellatedRenderer>().ToList();
_tessSphereToggles = _root.GetComponentsInChildren<CloakedTessSphereSectorToggle>().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;
}
}

View File

@ -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<TessellatedSphereRenderer>();
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;
}
}
}

View File

@ -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);
}