Make multiple cloaks / zero cloaks work properly

This commit is contained in:
Nick 2023-07-13 22:19:21 -04:00
parent b0bbffd21c
commit 3d942ec9d6
6 changed files with 182 additions and 2 deletions

View File

@ -1,5 +1,6 @@
using NewHorizons.Components.Sectored;
using NewHorizons.External.Modules;
using NewHorizons.Handlers;
using NewHorizons.Utility;
using NewHorizons.Utility.Files;
using NewHorizons.Utility.OWML;
@ -63,7 +64,7 @@ namespace NewHorizons.Builder.Body
cloakFieldController._ringworldFadeRenderers = new OWRenderer[0];
var cloakSectorController = newCloak.AddComponent<CloakSectorController>();
cloakSectorController.Init(newCloak.GetComponent<CloakFieldController>(), planetGO);
cloakSectorController.Init(cloakFieldController, planetGO);
var cloakAudioSource = newCloak.GetComponentInChildren<OWAudioSource>();
cloakAudioSource._audioSource = cloakAudioSource.GetComponent<AudioSource>();
@ -75,6 +76,8 @@ namespace NewHorizons.Builder.Body
cloakSectorController.EnableCloak();
CloakHandler.RegisterCloak(cloakFieldController);
// To cloak from the start
Delay.FireOnNextUpdate(cloakSectorController.OnPlayerExit);
Delay.FireOnNextUpdate(hasCustomAudio ? cloakSectorController.TurnOnMusic : cloakSectorController.TurnOffMusic);

View File

@ -0,0 +1,77 @@
using NewHorizons.Components.Stars;
using NewHorizons.Handlers;
using NewHorizons.Utility.OWML;
using UnityEngine;
namespace NewHorizons.Components.EOTE
{
internal class CloakLocatorController : MonoBehaviour
{
private float _currentAngle = float.MaxValue;
private CloakFieldController _currentController;
public void Start()
{
// Enable and disable all cloaks, else Stranger state is weird at the start
foreach (var cloak in CloakHandler.Cloaks)
{
SetCurrentCloak(cloak);
cloak.enabled = false;
}
}
// Always makes sure the Locator's cloak field controller is the one that is between the player and the sun
public void Update()
{
var sun = SunLightEffectsController.Instance?.transform;
if (sun != null)
{
// Keep tracking the angle to the current cloak
if (_currentController != null)
{
_currentAngle = CalculateAngleToCloak(_currentController.transform, sun);
}
// Compare the current cloak to all the other ones
foreach (var cloak in CloakHandler.Cloaks)
{
if (cloak == _currentController) continue;
var angle = CalculateAngleToCloak(cloak.transform, sun);
if (angle < _currentAngle && cloak != _currentController)
{
_currentAngle = angle;
SetCurrentCloak(cloak);
NHLogger.LogVerbose($"Changed cloak controller to {_currentController.GetAttachedOWRigidbody().name} angle {_currentAngle}");
}
}
}
}
public void SetCurrentCloak(CloakFieldController cloak)
{
if (_currentController != null)
{
_currentController.enabled = false;
}
_currentController = cloak;
if (_currentController != null)
{
_currentController.enabled = true;
Locator.RegisterCloakFieldController(_currentController);
_currentController.UpdateCloakVisualsState();
}
}
private float CalculateAngleToCloak(Transform cloak, Transform sun)
{
var playerVector = Locator.GetPlayerTransform().position - sun.position;
var cloakVector = cloak.position - sun.position;
return Vector3.Angle(playerVector, cloakVector);
}
}
}

View File

@ -0,0 +1,91 @@
using NewHorizons.Components.EOTE;
using NewHorizons.OtherMods.VoiceActing;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace NewHorizons.Handlers
{
public static class CloakHandler
{
private static HashSet<CloakFieldController> _cloaks;
public static HashSet<CloakFieldController> Cloaks => _cloaks;
private static bool _flagStrangerDisabled;
public static bool FlagStrangerDisabled
{
get => _flagStrangerDisabled;
set
{
_flagStrangerDisabled = value;
if (value && _strangerCloak != null)
{
DeregisterCloak(_strangerCloak);
}
}
}
public static bool VisibleStrangerInstalled => Main.Instance.ModHelper.Interaction.ModExists("xen.Decloaked");
private static CloakFieldController _strangerCloak;
private static CloakLocatorController _cloakLocator;
public static void Init()
{
_cloaks = new();
FlagStrangerDisabled = false;
_strangerCloak = null;
_cloakLocator = null;
}
public static void OnSystemReady()
{
// If NH is disabling the stranger it will not be gone yet, however other mods might have gotten rid of it
var stranger = Locator.GetAstroObject(AstroObject.Name.RingWorld)?.gameObject;
if (stranger != null && stranger.activeInHierarchy && !FlagStrangerDisabled && !VisibleStrangerInstalled)
{
_strangerCloak = stranger.GetComponentInChildren<CloakFieldController>();
RegisterCloak(_strangerCloak);
}
_cloakLocator = Locator.GetRootTransform().gameObject.AddComponent<CloakLocatorController>();
foreach (var cloak in _cloaks)
{
cloak.enabled = false;
cloak.UpdateCloakVisualsState();
}
Refresh();
}
public static void RegisterCloak(CloakFieldController cloak)
{
_cloaks.Add(cloak);
}
public static void DeregisterCloak(CloakFieldController cloak)
{
if (_cloaks.Contains(cloak))
{
cloak.enabled = false;
cloak.UpdateCloakVisualsState();
_cloaks.Remove(cloak);
Refresh();
}
}
private static void Refresh()
{
// Make sure we aren't using the disabled cloak
Locator.RegisterCloakFieldController(_cloaks.FirstOrDefault());
if (!_cloaks.Any())
{
Locator.RegisterCloakFieldController(null);
Shader.DisableKeyword("_CLOAKINGFIELDENABLED");
_cloakLocator.SetCurrentCloak(null);
_cloakLocator.enabled = false;
}
}
}
}

View File

@ -83,6 +83,12 @@ namespace NewHorizons.Handlers
{
NHLogger.LogVerbose($"Removing [{ao.name}]");
if (ao.GetAstroObjectName() == AstroObject.Name.RingWorld)
{
CloakHandler.FlagStrangerDisabled = true;
if (Locator._cloakFieldController.GetComponentInParent<AstroObject>() == ao) Locator._cloakFieldController = null;
}
if (ao.gameObject == null || !ao.gameObject.activeInHierarchy)
{
NHLogger.LogVerbose($"[{ao.name}] was already removed");

View File

@ -8,7 +8,7 @@ using static NewHorizons.External.Configs.StarSystemConfig;
namespace NewHorizons.Handlers
{
public class VesselCoordinatePromptHandler
public static class VesselCoordinatePromptHandler
{
private static List<Tuple<string, string, ScreenPrompt>> _factSystemIDPrompt;
// TODO: move this to ImageUtilities

View File

@ -403,6 +403,7 @@ namespace NewHorizons
SingularityBuilder.Init();
AtmosphereBuilder.Init();
BrambleNodeBuilder.Init(BodyDict[CurrentStarSystem].Select(x => x.Config).Where(x => x.Bramble?.dimension != null).ToArray());
CloakHandler.Init();
if (isSolarSystem)
{
@ -570,6 +571,8 @@ namespace NewHorizons
PlayerSpawnHandler.OnSystemReady(shouldWarpInFromShip, shouldWarpInFromVessel);
VesselCoordinatePromptHandler.RegisterPrompts(SystemDict.Where(system => system.Value.Config.Vessel?.coords != null).Select(x => x.Value).ToList());
CloakHandler.OnSystemReady();
}
public void EnableWarpDrive()