mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Make multiple cloaks / zero cloaks work properly
This commit is contained in:
parent
b0bbffd21c
commit
3d942ec9d6
@ -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);
|
||||
|
||||
77
NewHorizons/Components/EOTE/CloakLocatorController.cs
Normal file
77
NewHorizons/Components/EOTE/CloakLocatorController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
91
NewHorizons/Handlers/CloakHandler.cs
Normal file
91
NewHorizons/Handlers/CloakHandler.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user