From 2e68c57e66c5b027efdc096e6407f76797a21b0e Mon Sep 17 00:00:00 2001 From: Joshua Thome Date: Sat, 18 May 2024 07:49:48 -0500 Subject: [PATCH] Allow spawned rafts to change water fluids and prevent NRE if one isn't set --- NewHorizons/Builder/Props/DetailBuilder.cs | 5 +++ NewHorizons/Builder/Props/RaftBuilder.cs | 3 ++ .../Components/Props/NHRaftController.cs | 33 +++++++++++++++++++ .../RaftControllerPatches.cs | 3 +- 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 NewHorizons/Components/Props/NHRaftController.cs diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 65a37584..cdbcd8f4 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -417,6 +417,11 @@ namespace NewHorizons.Builder.Props { component.gameObject.AddComponent(); } + // Add custom logic to NH-spawned rafts to handle fluid changes + else if (component is RaftController raft) + { + component.gameObject.AddComponent(); + } } /// diff --git a/NewHorizons/Builder/Props/RaftBuilder.cs b/NewHorizons/Builder/Props/RaftBuilder.cs index 14ccf8d4..98196885 100644 --- a/NewHorizons/Builder/Props/RaftBuilder.cs +++ b/NewHorizons/Builder/Props/RaftBuilder.cs @@ -1,3 +1,4 @@ +using NewHorizons.Components.Props; using NewHorizons.External.Modules.Props.EchoesOfTheEye; using NewHorizons.Handlers; using NewHorizons.Utility; @@ -73,6 +74,8 @@ namespace NewHorizons.Builder.Props sector.OnSectorOccupantsUpdated += lightSensor.OnSectorOccupantsUpdated; } + var nhRaftController = raftObject.AddComponent(); + var achievementObject = new GameObject("AchievementVolume"); achievementObject.transform.SetParent(raftObject.transform, false); diff --git a/NewHorizons/Components/Props/NHRaftController.cs b/NewHorizons/Components/Props/NHRaftController.cs new file mode 100644 index 00000000..be503eea --- /dev/null +++ b/NewHorizons/Components/Props/NHRaftController.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Components.Props +{ + public class NHRaftController : MonoBehaviour + { + RaftController raft; + + public void OnEnable() + { + raft = GetComponent(); + raft._fluidDetector.OnEnterFluid += OnEnterFluid; + } + + public void OnDisable() + { + raft._fluidDetector.OnEnterFluid -= OnEnterFluid; + } + + private void OnEnterFluid(FluidVolume volume) + { + if (volume.GetFluidType() == FluidVolume.Type.WATER) + { + raft._fluidDetector._alignmentFluid = volume; + } + } + } +} diff --git a/NewHorizons/Patches/EchoesOfTheEyePatches/RaftControllerPatches.cs b/NewHorizons/Patches/EchoesOfTheEyePatches/RaftControllerPatches.cs index a0b40a99..e615c201 100644 --- a/NewHorizons/Patches/EchoesOfTheEyePatches/RaftControllerPatches.cs +++ b/NewHorizons/Patches/EchoesOfTheEyePatches/RaftControllerPatches.cs @@ -63,7 +63,8 @@ namespace NewHorizons.Patches.EchoesOfTheEyePatches if (__instance._playerInEffectsRange) { // All this to change what fluidVolume we use on this line - float num = __instance._fluidDetector.InFluidType(FluidVolume.Type.WATER) ? __instance._fluidDetector._alignmentFluid.GetFractionSubmerged(__instance._fluidDetector) : 0f; + FluidVolume volume = __instance._fluidDetector._alignmentFluid; + float num = __instance._fluidDetector.InFluidType(FluidVolume.Type.WATER) && volume != null ? volume.GetFractionSubmerged(__instance._fluidDetector) : 0f; bool allowMovement = num > 0.25f && num < 1f; __instance._effectsController.UpdateMovementAudio(allowMovement, __instance._lightSensors); __instance._effectsController.UpdateGroundedAudio(__instance._fluidDetector);