From 11652e893957d93ada66afee2736d504538bc02c Mon Sep 17 00:00:00 2001 From: "Nick J. Connors" Date: Sat, 1 Jan 2022 23:21:11 -0500 Subject: [PATCH] Finished custom signals + custom save data --- NewHorizons/Builder/General/GravityBuilder.cs | 9 +- NewHorizons/Builder/Props/SignalBuilder.cs | 109 +++++--- NewHorizons/Components/CloakedAudioSignal.cs | 78 ++++++ NewHorizons/External/NewHorizonsData.cs | 116 +++++++++ NewHorizons/External/SignalModule.cs | 3 + NewHorizons/Main.cs | 58 ++--- NewHorizons/NewHorizons.csproj | 3 - NewHorizons/Utility/DebugRaycaster.cs | 17 +- NewHorizons/Utility/Patches.cs | 232 ++++++++++++++---- 9 files changed, 489 insertions(+), 136 deletions(-) create mode 100644 NewHorizons/Components/CloakedAudioSignal.cs create mode 100644 NewHorizons/External/NewHorizonsData.cs diff --git a/NewHorizons/Builder/General/GravityBuilder.cs b/NewHorizons/Builder/General/GravityBuilder.cs index 57bbe2c7..3a049f94 100644 --- a/NewHorizons/Builder/General/GravityBuilder.cs +++ b/NewHorizons/Builder/General/GravityBuilder.cs @@ -1,6 +1,7 @@ using NewHorizons.External; using NewHorizons.Utility; using OWML.Utils; +using System; using System.Reflection; using UnityEngine; using Logger = NewHorizons.Utility.Logger; @@ -35,7 +36,13 @@ namespace NewHorizons.Builder.General GravityVolume GV = gravityGO.AddComponent(); GV.SetValue("_cutoffAcceleration", 0.1f); - GV.SetValue("_falloffType", GV.GetType().GetNestedType("FalloffType", BindingFlags.NonPublic).GetField(config.Base.GravityFallOff).GetValue(GV)); + + GravityVolume.FalloffType falloff = GravityVolume.FalloffType.linear; + if (config.Base.GravityFallOff.ToUpper().Equals("LINEAR")) falloff = GravityVolume.FalloffType.linear; + else if (config.Base.GravityFallOff.ToUpper().Equals("INVERSESQUARED")) falloff = GravityVolume.FalloffType.inverseSquared; + else Logger.LogError($"Couldn't set gravity type {config.Base.GravityFallOff}. Must be either \"linear\" or \"inverseSquared\". Defaulting to linear."); + GV._falloffType = falloff; + GV.SetValue("_alignmentRadius", config.Base.SurfaceGravity != 0 ? 1.5f * config.Base.SurfaceSize : 0f); GV.SetValue("_upperSurfaceRadius", config.Base.SurfaceSize); GV.SetValue("_lowerSurfaceRadius", 0); diff --git a/NewHorizons/Builder/Props/SignalBuilder.cs b/NewHorizons/Builder/Props/SignalBuilder.cs index 48c246c9..15205b55 100644 --- a/NewHorizons/Builder/Props/SignalBuilder.cs +++ b/NewHorizons/Builder/Props/SignalBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External; +using NewHorizons.Components; +using NewHorizons.External; using NewHorizons.Utility; using System; using System.Collections.Generic; @@ -15,41 +16,55 @@ namespace NewHorizons.Builder.Props private static AnimationCurve _customCurve = null; private static Dictionary _customSignalNames; - private static Stack _availableSignalNames; + private static Stack _availableSignalNames; - // TODO : Save and load this from/to a file - public static List KnownSignals { get; private set; } = new List(); + public static Dictionary SignalFrequencyOverrides; public static void Reset() { _customSignalNames = new Dictionary(); - _availableSignalNames = new Stack (new int[] + _availableSignalNames = new Stack (new SignalName[] { - 17, - 18, - 19, - 26, - 27, - 28, - 29, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59 + (SignalName)17, + (SignalName)18, + (SignalName)19, + (SignalName)26, + (SignalName)27, + (SignalName)28, + (SignalName)29, + (SignalName)33, + (SignalName)34, + (SignalName)35, + (SignalName)36, + (SignalName)37, + (SignalName)38, + (SignalName)39, + (SignalName)50, + (SignalName)51, + (SignalName)52, + (SignalName)53, + (SignalName)54, + (SignalName)55, + (SignalName)56, + (SignalName)57, + (SignalName)58, + (SignalName)59, + SignalName.WhiteHole_WH, + SignalName.WhiteHole_SS_Receiver, + SignalName.WhiteHole_CT_Receiver, + SignalName.WhiteHole_CT_Experiment, + SignalName.WhiteHole_TT_Receiver, + SignalName.WhiteHole_TT_TimeLoopCore, + SignalName.WhiteHole_TH_Receiver, + SignalName.WhiteHole_BH_NorthPoleReceiver, + SignalName.WhiteHole_BH_ForgeReceiver, + SignalName.WhiteHole_GD_Receiver, }); + SignalFrequencyOverrides = new Dictionary() { + { SignalFrequency.Statue, "NOMAI STATUE" }, + { SignalFrequency.Default, "???" }, + { SignalFrequency.WarpCore, "ANTI-MASS FLUCTUATIONS" } + }; } public static SignalName AddSignalName(string str) @@ -61,15 +76,16 @@ namespace NewHorizons.Builder.Props } Logger.Log($"Registering new signal name [{str}]"); - var newName = (SignalName)_availableSignalNames.Pop(); + var newName = _availableSignalNames.Pop(); _customSignalNames.Add(newName, str.ToUpper()); return newName; } public static string GetCustomSignalName(SignalName signalName) { - if (_customSignalNames.ContainsKey(signalName)) return _customSignalNames[signalName]; - return null; + string name = null; + _customSignalNames.TryGetValue(signalName, out name); + return name; } public static void Make(GameObject body, Sector sector, SignalModule module) @@ -84,12 +100,16 @@ namespace NewHorizons.Builder.Props { var signalGO = new GameObject($"Signal_{info.Name}"); signalGO.SetActive(false); - signalGO.transform.parent = sector.transform; + signalGO.transform.parent = body.transform; signalGO.transform.localPosition = info.Position != null ? (Vector3)info.Position : Vector3.zero; + signalGO.layer = LayerMask.NameToLayer("AdvancedEffectVolume"); var source = signalGO.AddComponent(); var owAudioSource = signalGO.AddComponent(); - var audioSignal = signalGO.AddComponent(); + + AudioSignal audioSignal = null; + if (info.InsideCloak) audioSignal = signalGO.AddComponent(); + else audioSignal = signalGO.AddComponent(); var frequency = StringToFrequency(info.Frequency); var name = StringToSignalName(info.Name); @@ -107,7 +127,8 @@ namespace NewHorizons.Builder.Props audioSignal._name = name; audioSignal._sourceRadius = info.SourceRadius; audioSignal._onlyAudibleToScope = info.OnlyAudibleToScope; - + audioSignal._identificationDistance = info.IdentificationRadius; + source.clip = clip; source.loop = true; source.minDistance = 0; @@ -122,10 +143,28 @@ namespace NewHorizons.Builder.Props source.playOnAwake = false; source.spatialBlend = 1f; source.volume = 0.5f; + source.dopplerLevel = 0; owAudioSource.SetTrack(OWAudioMixer.TrackName.Signal); + // Frequency detection trigger volume + + var signalDetectionGO = new GameObject($"SignalDetectionTrigger_{info.Name}"); + signalDetectionGO.SetActive(false); + signalDetectionGO.transform.parent = body.transform; + signalDetectionGO.transform.localPosition = info.Position != null ? (Vector3)info.Position : Vector3.zero; + signalDetectionGO.layer = LayerMask.NameToLayer("AdvancedEffectVolume"); + + var sphereShape = signalDetectionGO.AddComponent(); + var owTriggerVolume = signalDetectionGO.AddComponent(); + var audioSignalDetectionTrigger = signalDetectionGO.AddComponent(); + + sphereShape.radius = info.DetectionRadius == 0 ? info.SourceRadius + 30 : info.DetectionRadius; + audioSignalDetectionTrigger._signal = audioSignal; + audioSignalDetectionTrigger._trigger = owTriggerVolume; + signalGO.SetActive(true); + signalDetectionGO.SetActive(true); } private static SignalFrequency StringToFrequency(string str) diff --git a/NewHorizons/Components/CloakedAudioSignal.cs b/NewHorizons/Components/CloakedAudioSignal.cs new file mode 100644 index 00000000..a27fd795 --- /dev/null +++ b/NewHorizons/Components/CloakedAudioSignal.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Components +{ + public class CloakedAudioSignal : AudioSignal + { + public new void UpdateSignalStrength(Signalscope scope, float distToClosestScopeObstruction) + { + this._canBePickedUpByScope = false; + if (!PlayerState.InCloakingField()) + { + this._signalStrength = 0f; + this._degreesFromScope = 180f; + return; + } + if (this._sunController != null && this._sunController.IsPointInsideSupernova(base.transform.position)) + { + this._signalStrength = 0f; + this._degreesFromScope = 180f; + return; + } + if (Locator.GetQuantumMoon() != null && Locator.GetQuantumMoon().IsPlayerInside() && this._name != SignalName.Quantum_QM) + { + this._signalStrength = 0f; + this._degreesFromScope = 180f; + return; + } + if (!this._active || !base.gameObject.activeInHierarchy || this._outerFogWarpVolume != PlayerState.GetOuterFogWarpVolume() || (scope.GetFrequencyFilter() & this._frequency) != this._frequency) + { + this._signalStrength = 0f; + this._degreesFromScope = 180f; + return; + } + this._scopeToSignal = base.transform.position - scope.transform.position; + this._distToScope = this._scopeToSignal.magnitude; + if (this._outerFogWarpVolume == null && distToClosestScopeObstruction < 1000f && this._distToScope > 1000f) + { + this._signalStrength = 0f; + this._degreesFromScope = 180f; + return; + } + this._canBePickedUpByScope = true; + if (this._distToScope < this._sourceRadius) + { + this._signalStrength = 1f; + } + else + { + this._degreesFromScope = Vector3.Angle(scope.GetScopeDirection(), this._scopeToSignal); + float t = Mathf.InverseLerp(2000f, 1000f, this._distToScope); + float a = Mathf.Lerp(45f, 90f, t); + float a2 = 57.29578f * Mathf.Atan2(this._sourceRadius, this._distToScope); + float b = Mathf.Lerp(Mathf.Max(a2, 5f), Mathf.Max(a2, 1f), scope.GetZoomFraction()); + this._signalStrength = Mathf.Clamp01(Mathf.InverseLerp(a, b, this._degreesFromScope)); + } + if (this._distToScope < this._identificationDistance + this._sourceRadius && this._signalStrength > 0.9f) + { + if (!PlayerData.KnowsFrequency(this._frequency) && !this._preventIdentification) + { + this.IdentifyFrequency(); + } + if (!PlayerData.KnowsSignal(this._name) && !this._preventIdentification) + { + this.IdentifySignal(); + } + if (this._revealFactID.Length > 0) + { + Locator.GetShipLogManager().RevealFact(this._revealFactID, true, true); + } + } + } + } +} diff --git a/NewHorizons/External/NewHorizonsData.cs b/NewHorizons/External/NewHorizonsData.cs new file mode 100644 index 00000000..84a5bb8b --- /dev/null +++ b/NewHorizons/External/NewHorizonsData.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Logger = NewHorizons.Utility.Logger; + +namespace NewHorizons.External +{ + public static class NewHorizonsData + { + private static NewHorizonsSaveFile _saveFile; + private static NewHorizonsProfile _activeProfile; + private static string _fileName = "save.json"; + + public static void Load() + { + var profileName = StandaloneProfileManager.SharedInstance.currentProfile.profileName; + try + { + _saveFile = Main.Instance.ModHelper.Storage.Load(_fileName); + if (!_saveFile.Profiles.ContainsKey(profileName)) _saveFile.Profiles.Add(profileName, new NewHorizonsProfile()); + _activeProfile = _saveFile.Profiles[profileName]; + Logger.Log($"Loaded save data for {profileName}"); + } + catch(Exception) + { + try + { + Logger.Log($"Couldn't load save data from {_fileName}, creating a new file"); + _saveFile = new NewHorizonsSaveFile(); + _saveFile.Profiles.Add(profileName, new NewHorizonsProfile()); + _activeProfile = _saveFile.Profiles[profileName]; + Main.Instance.ModHelper.Storage.Save(_saveFile, _fileName); + Logger.Log($"Loaded save data for {profileName}"); + } + catch(Exception e) + { + Logger.LogError($"Couldn't create save data {e.Message}, {e.StackTrace}"); + } + } + } + + public static void Save() + { + if (_saveFile == null) return; + Main.Instance.ModHelper.Storage.Save(_saveFile, _fileName); + } + + public static void Reset() + { + if (_saveFile == null || _activeProfile == null) return; + _activeProfile = new NewHorizonsProfile(); + Save(); + } + + public static bool KnowsFrequency(string frequency) + { + if (_activeProfile == null) return true; + return _activeProfile.KnownFrequencies.Contains(frequency); + } + + public static void LearnFrequency(string frequency) + { + if (_activeProfile == null) return; + if (!KnowsFrequency(frequency)) + { + _activeProfile.KnownFrequencies.Add(frequency); + Save(); + } + } + + public static bool KnowsSignal(string signal) + { + if (_activeProfile == null) return true; + return _activeProfile.KnownSignals.Contains(signal); + } + + public static void LearnSignal(string signal) + { + if (_activeProfile == null) return; + if (!KnowsSignal(signal)) + { + _activeProfile.KnownSignals.Add(signal); + Save(); + } + } + + public static bool KnowsMultipleFrequencies() + { + return (_activeProfile != null && _activeProfile.KnownFrequencies.Count > 0); + } + + private class NewHorizonsSaveFile + { + public NewHorizonsSaveFile() + { + Profiles = new Dictionary(); + } + + public Dictionary Profiles { get; set; } + } + + private class NewHorizonsProfile + { + public NewHorizonsProfile() + { + KnownFrequencies = new List(); + KnownSignals = new List(); + } + + public List KnownFrequencies { get; set; } + public List KnownSignals { get; set; } + } + } +} diff --git a/NewHorizons/External/SignalModule.cs b/NewHorizons/External/SignalModule.cs index b7c1d2f9..ea4298c0 100644 --- a/NewHorizons/External/SignalModule.cs +++ b/NewHorizons/External/SignalModule.cs @@ -18,7 +18,10 @@ namespace NewHorizons.External public string Name; public string AudioClip; public float SourceRadius = 1f; + public float DetectionRadius = 0f; + public float IdentificationRadius = 10f; public bool OnlyAudibleToScope = true; + public bool InsideCloak = false; } } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 647bc318..fdb6af25 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -71,6 +71,8 @@ namespace NewHorizons if (scene.name != "SolarSystem") { return; } + NewHorizonsData.Load(); + // Need to manage this when there are multiple stars var sun = GameObject.Find("Sun_Body"); var starController = sun.AddComponent(); @@ -162,10 +164,12 @@ namespace NewHorizons var map = GameObject.FindObjectOfType(); if (map != null) map._maxPanDistance = FurthestOrbit * 1.5f; + /* foreach(var cam in GameObject.FindObjectsOfType()) { cam.farClipPlane = FurthestOrbit * 3f; } + */ } private bool LoadBody(NewHorizonsBody body, bool defaultPrimaryToSun = false) @@ -177,15 +181,17 @@ namespace NewHorizons if (stringID.Equals("EMBER_TWIN")) stringID = "CAVE_TWIN"; if (stringID.Equals("INTERLOPER")) stringID = "COMET"; - AstroObject existingPlanet = null; + GameObject existingPlanet = null; try { - existingPlanet = AstroObjectLocator.GetAstroObject(stringID); - if (existingPlanet == null) existingPlanet = AstroObjectLocator.GetAstroObject(body.Config.Name.Replace(" ", "")); + existingPlanet = AstroObjectLocator.GetAstroObject(stringID).gameObject; + if (existingPlanet == null) existingPlanet = AstroObjectLocator.GetAstroObject(body.Config.Name.Replace(" ", "")).gameObject; } catch (Exception e) { - Logger.LogWarning($"Error when looking for {body.Config.Name}: {e.Message}, {e.StackTrace}"); + existingPlanet = GameObject.Find(body.Config.Name.Replace(" ", "") + "_Body"); + + if(existingPlanet == null) Logger.LogWarning($"Error when looking for {body.Config.Name}: {e.Message}, {e.StackTrace}"); } if (existingPlanet != null) @@ -194,7 +200,9 @@ namespace NewHorizons { if (body.Config.Destroy) { - Instance.ModHelper.Events.Unity.FireInNUpdates(() => PlanetDestroyer.RemoveBody(existingPlanet), 2); + var ao = existingPlanet.GetComponent(); + if (ao != null) Instance.ModHelper.Events.Unity.FireInNUpdates(() => PlanetDestroyer.RemoveBody(ao), 2); + else Instance.ModHelper.Events.Unity.FireInNUpdates(() => existingPlanet.SetActive(false), 2); } else UpdateBody(body, existingPlanet); } @@ -239,17 +247,15 @@ namespace NewHorizons } } - public GameObject UpdateBody(NewHorizonsBody body, AstroObject ao) + public GameObject UpdateBody(NewHorizonsBody body, GameObject go) { - Logger.Log($"Updating existing AstroObject {ao}"); - - var go = ao.gameObject; + Logger.Log($"Updating existing Object {go.name}"); var sector = go.GetComponentInChildren(); var rb = go.GetAttachedOWRigidbody(); // Do stuff that's shared between generating new planets and updating old ones - return SharedGenerateBody(body, go, sector, rb, ao); + return SharedGenerateBody(body, go, sector, rb); } public GameObject GenerateBody(NewHorizonsBody body, bool defaultPrimaryToSun = false) @@ -323,11 +329,8 @@ namespace NewHorizons if (body.Config.FocalPoint != null) FocalPointBuilder.Make(go, body.Config.FocalPoint); - if (body.Config.Signal != null) - SignalBuilder.Make(go, sector, body.Config.Signal); - // Do stuff that's shared between generating new planets and updating old ones - go = SharedGenerateBody(body, go, sector, owRigidBody, ao); + go = SharedGenerateBody(body, go, sector, owRigidBody); body.Object = go; @@ -359,7 +362,7 @@ namespace NewHorizons return go; } - private GameObject SharedGenerateBody(NewHorizonsBody body, GameObject go, Sector sector, OWRigidbody rb, AstroObject ao) + private GameObject SharedGenerateBody(NewHorizonsBody body, GameObject go, Sector sector, OWRigidbody rb) { if (body.Config.Ring != null) RingBuilder.Make(go, body.Config.Ring, body.Assets); @@ -370,13 +373,10 @@ namespace NewHorizons if (body.Config.Base.HasCometTail) CometTailBuilder.Make(go, body.Config.Base, go.GetComponent().GetPrimaryBody()); - if (body.Config.Base != null) - { - if (body.Config.Base.LavaSize != 0) - LavaBuilder.Make(go, sector, rb, body.Config.Base.LavaSize); - if (body.Config.Base.WaterSize != 0) - WaterBuilder.Make(go, sector, rb, body.Config.Base.WaterSize); - } + if (body.Config.Base.LavaSize != 0) + LavaBuilder.Make(go, sector, rb, body.Config.Base.LavaSize); + if (body.Config.Base.WaterSize != 0) + WaterBuilder.Make(go, sector, rb, body.Config.Base.WaterSize); if (body.Config.Atmosphere != null) { @@ -398,18 +398,10 @@ namespace NewHorizons } if (body.Config.Props != null) - { PropBuilder.Make(go, sector, body.Config); - /* - if (body.Config.Props.Rafts != null) - { - foreach(var v in body.Config.Props.Rafts) - { - Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => RaftBuilder.Make(go, v, sector, rb, ao)); - } - } - */ - } + + if (body.Config.Signal != null) + SignalBuilder.Make(go, sector, body.Config.Signal); return go; } diff --git a/NewHorizons/NewHorizons.csproj b/NewHorizons/NewHorizons.csproj index d5d94965..486ddf83 100644 --- a/NewHorizons/NewHorizons.csproj +++ b/NewHorizons/NewHorizons.csproj @@ -30,7 +30,4 @@ - - - \ No newline at end of file diff --git a/NewHorizons/Utility/DebugRaycaster.cs b/NewHorizons/Utility/DebugRaycaster.cs index 8a265396..387d78f0 100644 --- a/NewHorizons/Utility/DebugRaycaster.cs +++ b/NewHorizons/Utility/DebugRaycaster.cs @@ -22,20 +22,6 @@ namespace NewHorizons.Utility { if (Keyboard.current != null && Keyboard.current[Key.P].wasReleasedThisFrame) { - /* - var soundSources = GameObject.FindObjectsOfType(); - foreach(var s in soundSources) - { - if (s.isPlaying) - { - Logger.Log($"{s.name}, {s.gameObject.name}"); - Logger.LogPath(s.gameObject); - s.loop = false; - s.Stop(); - } - } - */ - // Raycast _rb.DisableCollisionDetection(); int layerMask = OWLayerMask.physicalMask; @@ -43,7 +29,8 @@ namespace NewHorizons.Utility var direction = Locator.GetActiveCamera().transform.TransformDirection(Vector3.forward); if (Physics.Raycast(origin, direction, out RaycastHit hitInfo, 100f, layerMask)) { - Logger.Log($"Raycast hit [{hitInfo.transform.InverseTransformPoint(hitInfo.point)}] on [{hitInfo.transform.gameObject.name}]"); + var pos = hitInfo.transform.InverseTransformPoint(hitInfo.point); + Logger.Log($"Raycast hit {{\"x\": {pos.x}, \"y\": {pos.y}, \"z\": {pos.z}}} on [{hitInfo.transform.gameObject.name}]"); } _rb.EnableCollisionDetection(); } diff --git a/NewHorizons/Utility/Patches.cs b/NewHorizons/Utility/Patches.cs index e8726618..6d938261 100644 --- a/NewHorizons/Utility/Patches.cs +++ b/NewHorizons/Utility/Patches.cs @@ -1,4 +1,6 @@ using NewHorizons.Builder.Props; +using NewHorizons.Components; +using NewHorizons.External; using OWML.Common; using System; using System.Collections.Generic; @@ -18,15 +20,28 @@ namespace NewHorizons.Utility Main.Instance.ModHelper.HarmonyHelper.AddPrefix("CheckShipOutsideSolarSystem", typeof(Patches), nameof(Patches.CheckShipOutersideSolarSystem)); Main.Instance.ModHelper.HarmonyHelper.AddPrefix("LateUpdate", typeof(Patches), nameof(Patches.OnSunLightParamUpdaterLateUpdate)); Main.Instance.ModHelper.HarmonyHelper.AddPrefix("Update", typeof(Patches), nameof(Patches.OnSunSurfaceAudioControllerUpdate)); + + // Lot of audio signal stuff Main.Instance.ModHelper.HarmonyHelper.AddPrefix("SignalNameToString", typeof(Patches), nameof(Patches.OnAudioSignalSignalNameToString)); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix("IndexToFrequency", typeof(Patches), nameof(Patches.OnAudioSignalIndexToFrequency)); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix("FrequencyToIndex", typeof(Patches), nameof(Patches.OnAudioSignalFrequencyToIndex)); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix("FrequencyToString", typeof(Patches), nameof(Patches.OnAudioSignalFrequencyToString)); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix("Awake", typeof(Patches), nameof(Patches.OnSignalscopeAwake)); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix("SwitchFrequencyFilter", typeof(Patches), nameof(Patches.OnSignalscopeSwitchFrequencyFilter)); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix("UpdateSignalStrength", typeof(Patches), nameof(Patches.OnAudioSignalUpdateSignalStrength)); var playerDataKnowsSignal = typeof(PlayerData).GetMethod("KnowsSignal"); Main.Instance.ModHelper.HarmonyHelper.AddPrefix(playerDataKnowsSignal, typeof(Patches), nameof(Patches.OnPlayerDataKnowsSignal)); var playerDataLearnSignal = typeof(PlayerData).GetMethod("LearnSignal"); Main.Instance.ModHelper.HarmonyHelper.AddPrefix(playerDataLearnSignal, typeof(Patches), nameof(Patches.OnPlayerDataLearnSignal)); + var playerDataKnowsFrequency = typeof(PlayerData).GetMethod("KnowsFrequency"); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix(playerDataKnowsFrequency, typeof(Patches), nameof(Patches.OnPlayerDataKnowsFrequency)); + var playerDataLearnFrequency = typeof(PlayerData).GetMethod("LearnFrequency"); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix(playerDataLearnFrequency, typeof(Patches), nameof(Patches.OnPlayerDataLearnFrequency)); + var playerDataKnowsMultipleFrequencies = typeof(PlayerData).GetMethod("KnowsMultipleFrequencies"); + Main.Instance.ModHelper.HarmonyHelper.AddPrefix(playerDataKnowsMultipleFrequencies, typeof(Patches), nameof(Patches.OnPlayerDataKnowsMultipleFrequencies)); // Postfixes - Main.Instance.ModHelper.HarmonyHelper.AddPostfix("Start", typeof(Patches), nameof(Patches.OnEllipticOrbitLineStart)); Main.Instance.ModHelper.HarmonyHelper.AddPostfix("Awake", typeof(Patches), nameof(Patches.OnMapControllerAwake)); Main.Instance.ModHelper.HarmonyHelper.AddPostfix("Awake", typeof(Patches), nameof(Patches.OnOWCameraAwake)); } @@ -42,20 +57,12 @@ namespace NewHorizons.Utility return true; } - public static bool CheckShipOutersideSolarSystem(PlayerState __instance, bool __result) + public static bool CheckShipOutersideSolarSystem(PlayerState __instance, ref bool __result) { __result = false; return false; } - public static void OnEllipticOrbitLineStart(EllipticOrbitLine __instance, ref Vector3 ____upAxisDir, AstroObject ____astroObject) - { - if (____astroObject.GetAstroObjectName() == AstroObject.Name.Comet) return; - - // For some reason other planets do this idk - ____upAxisDir *= -1f; - } - public static void OnMapControllerAwake(MapController __instance, ref float ____maxPanDistance, ref float ____maxZoomDistance, ref float ____minPitchAngle, ref float ____zoomSpeed) { ____maxPanDistance = Main.FurthestOrbit * 1.5f; @@ -66,7 +73,7 @@ namespace NewHorizons.Utility public static void OnOWCameraAwake(OWCamera __instance) { - __instance.farClipPlane = Main.FurthestOrbit * 3f; + __instance.farClipPlane *= 4f; } public static bool OnSunLightParamUpdaterLateUpdate(SunLightParamUpdater __instance) @@ -101,54 +108,170 @@ namespace NewHorizons.Utility return false; } + #region AudioSignal + public static bool OnAudioSignalSignalNameToString(SignalName __0, ref string __result) { - switch(__0) + var customSignalName = SignalBuilder.GetCustomSignalName(__0); + if (customSignalName == null) return true; + else { - case SignalName.WhiteHole_SS_Receiver: - __result = "Sun Station Receiver"; - return false; - case SignalName.WhiteHole_CT_Receiver: - __result = "Ember Twin Receiver"; - return false; - case SignalName.WhiteHole_CT_Experiment: - __result = "White Hole Receiver"; - return false; - case SignalName.WhiteHole_TT_Receiver: - __result = "Ash Twin Receiver"; - return false; - case SignalName.WhiteHole_TT_TimeLoopCore: - __result = "Ash Twin Project"; - return false; - case SignalName.WhiteHole_TH_Receiver: - __result = "Timber Hearth Receiver"; - return false; - case SignalName.WhiteHole_BH_NorthPoleReceiver: - __result = "North Pole Receiver"; - return false; - case SignalName.WhiteHole_BH_ForgeReceiver: - __result = "Black Hole Forge Receiver"; - return false; - case SignalName.WhiteHole_GD_Receiver: - __result = "Giant's Deep Receiver"; - return false; - default: - var customSignalName = SignalBuilder.GetCustomSignalName(__0); - if (customSignalName == null) return true; - else - { - __result = customSignalName; - return false; - } + __result = customSignalName; + return false; } } + public static bool OnAudioSignalIndexToFrequency(int __0, ref SignalFrequency __result) { + switch (__0) + { + case 1: + __result = SignalFrequency.Traveler; + break; + case 2: + __result = SignalFrequency.Quantum; + break; + case 3: + __result = SignalFrequency.EscapePod; + break; + case 4: + __result = SignalFrequency.WarpCore; + break; + case 5: + __result = SignalFrequency.HideAndSeek; + break; + case 6: + __result = SignalFrequency.Radio; + break; + case 7: + __result = SignalFrequency.Statue; + break; + default: + __result = SignalFrequency.Default; + break; + } + return false; + } + + public static bool OnAudioSignalFrequencyToIndex(SignalFrequency __0, ref int __result) + { + var frequency = __0; + if (frequency <= SignalFrequency.EscapePod) + { + if(frequency == SignalFrequency.Default) + { + __result = 0; + } + else if (frequency == SignalFrequency.Traveler) + { + __result = 1; + } + else if (frequency == SignalFrequency.Quantum) + { + __result = 2; + } + else if (frequency == SignalFrequency.EscapePod) + { + __result = 3; + } + } + else + { + if (frequency == SignalFrequency.WarpCore) + { + __result = 4; + } + else if (frequency == SignalFrequency.HideAndSeek) + { + __result = 5; + } + else if (frequency == SignalFrequency.Radio) + { + __result = 6; + } + else if (frequency == SignalFrequency.Statue) + { + __result = 7; + } + } + return false; + } + + public static bool OnAudioSignalFrequencyToString(SignalFrequency __0, ref string __result) + { + SignalBuilder.SignalFrequencyOverrides.TryGetValue(__0, out string customName); + if (customName != null) + { + if (NewHorizonsData.KnowsFrequency(customName)) __result = customName; + else __result = UITextLibrary.GetString(UITextType.SignalFreqUnidentified); + return false; + } + return true; + } + + public static bool OnAudioSignalUpdateSignalStrength(AudioSignal __instance, Signalscope __0, float __1) + { + // I hate this + if(__instance is CloakedAudioSignal) + { + ((CloakedAudioSignal)__instance).UpdateSignalStrength(__0, __1); + return false; + } + return true; + } + #endregion + + #region Signalscope + public static bool OnSignalscopeAwake(Signalscope __instance, ref AudioSignal[] ____strongestSignals) + { + ____strongestSignals = new AudioSignal[8]; + return true; + } + + public static bool OnSignalscopeSwitchFrequencyFilter(Signalscope __instance, int __0) + { + var increment = __0; + var count = Enum.GetValues(typeof(SignalFrequency)).Length; + __instance._frequencyFilterIndex += increment; + __instance._frequencyFilterIndex = ((__instance._frequencyFilterIndex >= count) ? 0 : __instance._frequencyFilterIndex); + __instance._frequencyFilterIndex = ((__instance._frequencyFilterIndex < 0) ? count - 1 : __instance._frequencyFilterIndex); + SignalFrequency signalFrequency = AudioSignal.IndexToFrequency(__instance._frequencyFilterIndex); + if (!PlayerData.KnowsFrequency(signalFrequency) && (!__instance._isUnknownFreqNearby || __instance._unknownFrequency != signalFrequency)) + { + __instance.SwitchFrequencyFilter(increment); + } + return false; + } + #endregion + + #region PlayerData + public static bool OnPlayerDataKnowsFrequency(SignalFrequency __0, ref bool __result) + { + SignalBuilder.SignalFrequencyOverrides.TryGetValue(__0, out string freqString); + if (freqString != null) + { + __result = NewHorizonsData.KnowsFrequency(freqString); + return false; + } + return true; + } + + public static bool OnPlayerDataLearnFrequency(SignalFrequency __0) + { + SignalBuilder.SignalFrequencyOverrides.TryGetValue(__0, out string freqString); + if (freqString != null) + { + NewHorizonsData.LearnFrequency(freqString); + return false; + } + return true; + } + public static bool OnPlayerDataKnowsSignal(SignalName __0, ref bool __result) { var customSignalName = SignalBuilder.GetCustomSignalName(__0); if (customSignalName != null) { - __result = SignalBuilder.KnownSignals.Contains(customSignalName); + __result = NewHorizonsData.KnowsSignal(customSignalName); return false; } return true; @@ -159,10 +282,21 @@ namespace NewHorizons.Utility var customSignalName = SignalBuilder.GetCustomSignalName(__0); if (customSignalName != null) { - if(!SignalBuilder.KnownSignals.Contains(customSignalName)) SignalBuilder.KnownSignals.Add(customSignalName); + if (!NewHorizonsData.KnowsSignal(customSignalName)) NewHorizonsData.LearnSignal(customSignalName); return false; } return true; } + + public static bool OnPlayerDataKnowsMultipleFrequencies(ref bool __result) + { + if (NewHorizonsData.KnowsMultipleFrequencies()) + { + __result = true; + return false; + } + return true; + } + #endregion } }