Implement StopTime, SlowTime mod compat (#760)

## Improvements

- StopTime and SlowTime mods will now effect the time loop in new
systems
This commit is contained in:
Noah Pilarski 2024-01-01 22:43:38 -05:00 committed by GitHub
commit 02b4c2b522
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 2 deletions

View File

@ -7,6 +7,8 @@ using NewHorizons.Utility.OWML;
using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OuterWilds;
using UnityEngine; using UnityEngine;
using Object = UnityEngine.Object; using Object = UnityEngine.Object;
using NewHorizons.OtherMods;
namespace NewHorizons.Handlers namespace NewHorizons.Handlers
{ {
public static class SystemCreationHandler public static class SystemCreationHandler
@ -31,7 +33,8 @@ namespace NewHorizons.Handlers
// No time loop or travel audio at the eye // No time loop or travel audio at the eye
if (Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") return; if (Main.Instance.CurrentStarSystem == "EyeOfTheUniverse") return;
if (system.Config.enableTimeLoop) // Small mod compat change for StopTime - do nothing if it's enabled
if (system.Config.enableTimeLoop && !OtherModUtil.IsEnabled("_nebula.StopTime"))
{ {
var timeLoopController = new GameObject("TimeLoopController"); var timeLoopController = new GameObject("TimeLoopController");
timeLoopController.AddComponent<TimeLoopController>(); timeLoopController.AddComponent<TimeLoopController>();

View File

@ -0,0 +1,6 @@
namespace NewHorizons.OtherMods;
public static class OtherModUtil
{
public static bool IsEnabled(string modName) => Main.Instance.ModHelper.Interaction.ModExists(modName);
}

View File

@ -1,3 +1,4 @@
using NewHorizons.OtherMods;
using UnityEngine; using UnityEngine;
namespace NewHorizons.Utility.OuterWilds namespace NewHorizons.Utility.OuterWilds
@ -5,7 +6,17 @@ namespace NewHorizons.Utility.OuterWilds
public static class TimeLoopUtilities public static class TimeLoopUtilities
{ {
public const float LOOP_DURATION_IN_SECONDS = TimeLoop.LOOP_DURATION_IN_MINUTES * 60; public const float LOOP_DURATION_IN_SECONDS = TimeLoop.LOOP_DURATION_IN_MINUTES * 60;
public static void SetLoopDuration(float minutes) => TimeLoop._loopDuration = minutes * 60f; public static void SetLoopDuration(float minutes)
{
TimeLoop._loopDuration = minutes * 60f;
// If slow time mod is on give them at least an hour
// This won't slow down time based events like sand sizes but oh well
if (OtherModUtil.IsEnabled("dnlwtsn.SlowTime"))
{
TimeLoop._loopDuration = Mathf.Max(TimeLoop._loopDuration, 60f * 60f);
}
}
public static void SetSecondsElapsed(float secondsElapsed) => TimeLoop._timeOffset = secondsElapsed - Time.timeSinceLevelLoad; public static void SetSecondsElapsed(float secondsElapsed) => TimeLoop._timeOffset = secondsElapsed - Time.timeSinceLevelLoad;
public static void SetMinutesRemaining(float minutes) => TimeLoop.SetSecondsRemaining(minutes * 60); public static void SetMinutesRemaining(float minutes) => TimeLoop.SetSecondsRemaining(minutes * 60);
public static float GetMinutesRemaining() => TimeLoop.GetSecondsRemaining() / 60f; public static float GetMinutesRemaining() => TimeLoop.GetSecondsRemaining() / 60f;