diff --git a/NewHorizons/Builder/Body/CloakBuilder.cs b/NewHorizons/Builder/Body/CloakBuilder.cs index b0197bc4..ab18f6bf 100644 --- a/NewHorizons/Builder/Body/CloakBuilder.cs +++ b/NewHorizons/Builder/Body/CloakBuilder.cs @@ -1,14 +1,30 @@ using NewHorizons.Components; using NewHorizons.External.Modules; using NewHorizons.Utility; +using OWML.Common; using UnityEngine; namespace NewHorizons.Builder.Body { public static class CloakBuilder { - public static void Make(GameObject planetGO, Sector sector, OWRigidbody OWRB, CloakModule module, bool keepReferenceFrame) + public static void Make(GameObject planetGO, Sector sector, OWRigidbody OWRB, CloakModule module, bool keepReferenceFrame, IModBehaviour mod) { var radius = module.radius; + + AudioClip clip = null; + if (module.audioClip != null) clip = SearchUtilities.FindResourceOfTypeAndName(module.audioClip); + else if (module.audioFilePath != null) + { + try + { + clip = AudioUtilities.LoadAudio(mod.ModHelper.Manifest.ModFolderPath + "/" + module.audioFilePath); + } + catch (System.Exception e) + { + Utility.Logger.LogError($"Couldn't load audio file {module.audioFilePath} : {e.Message}"); + } + } + var cloak = SearchUtilities.Find("RingWorld_Body/CloakingField_IP"); var newCloak = GameObject.Instantiate(cloak, sector?.transform ?? planetGO.transform); @@ -31,6 +47,14 @@ namespace NewHorizons.Builder.Body var cloakSectorController = newCloak.AddComponent(); cloakSectorController.Init(newCloak.GetComponent(), planetGO); + var cloakAudioSource = newCloak.GetComponentInChildren(); + cloakAudioSource._audioSource = cloakAudioSource.GetComponent(); + cloakAudioSource._audioLibraryClip = AudioType.None; + cloakAudioSource._clipArrayIndex = 0; + cloakAudioSource._clipArrayLength = 0; + cloakAudioSource._clipSelectionOnPlay = OWAudioSource.ClipSelectionOnPlay.MANUAL; + cloakAudioSource.clip = clip; + newCloak.SetActive(true); cloakFieldController.enabled = true; @@ -38,6 +62,7 @@ namespace NewHorizons.Builder.Body // To cloak from the start Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(cloakSectorController.OnPlayerExit); + Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(clip != null ? cloakSectorController.TurnOnMusic : cloakSectorController.TurnOffMusic); Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(keepReferenceFrame ? cloakSectorController.EnableReferenceFrameVolume : cloakSectorController.DisableReferenceFrameVolume); } } diff --git a/NewHorizons/Components/CloakSectorController.cs b/NewHorizons/Components/CloakSectorController.cs index 9a047ddc..72a83aea 100644 --- a/NewHorizons/Components/CloakSectorController.cs +++ b/NewHorizons/Components/CloakSectorController.cs @@ -80,5 +80,8 @@ namespace NewHorizons.Components 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/External/Modules/CloakModule.cs b/NewHorizons/External/Modules/CloakModule.cs index 87f6dbf7..55ad844c 100644 --- a/NewHorizons/External/Modules/CloakModule.cs +++ b/NewHorizons/External/Modules/CloakModule.cs @@ -15,5 +15,15 @@ namespace NewHorizons.External.Modules /// don't want a cloak, leave this as 0. /// public float radius; + + /// + /// Name of an existing AudioClip in the game that will play when entering the cloaking field. + /// + public string audioClip; + + /// + /// Relative filepath to the .wav file to use as the audio. Mutually exclusive with audioClip. + /// + public string audioFilePath; } } \ No newline at end of file diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index a6324b55..77ca0ebe 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -482,7 +482,7 @@ namespace NewHorizons.Handlers // Has to go last probably if (body.Config.Cloak != null && body.Config.Cloak.radius != 0f) { - CloakBuilder.Make(go, sector, rb, body.Config.Cloak, body.Config.Base.hasReferenceFrame); + CloakBuilder.Make(go, sector, rb, body.Config.Cloak, body.Config.Base.hasReferenceFrame, body.Mod); } return go; diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 5856cea7..4e929a02 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -297,6 +297,14 @@ "type": "number", "description": "Radius of the cloaking field around the planet. It's a bit finicky so experiment with different values. If you\ndon't want a cloak, leave this as 0.", "format": "float" + }, + "audioClip": { + "type": "string", + "description": "Name of an existing AudioClip in the game that will play when entering the cloaking field." + }, + "audioFilePath": { + "type": "string", + "description": "Relative filepath to the .wav file to use as the audio. Mutually exclusive with audioClip." } } },