diff --git a/Blackout/AssetHandler.cs b/Blackout/AssetHandler.cs index 7d213ee..db52492 100644 --- a/Blackout/AssetHandler.cs +++ b/Blackout/AssetHandler.cs @@ -1,7 +1,7 @@ using System.Reflection; using UnityEngine; -namespace Blackout; +namespace NAK.Melons.Blackout; /* diff --git a/Blackout/Blackout.csproj b/Blackout/Blackout.csproj index 60c5870..52398a9 100644 --- a/Blackout/Blackout.csproj +++ b/Blackout/Blackout.csproj @@ -26,6 +26,9 @@ ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp-firstpass.dll + + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\ChilloutVR\Mods\BTKUILib.dll + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Cohtml.Runtime.dll diff --git a/Blackout/BlackoutController.cs b/Blackout/BlackoutController.cs index 150afd3..790024c 100644 --- a/Blackout/BlackoutController.cs +++ b/Blackout/BlackoutController.cs @@ -5,7 +5,7 @@ using MelonLoader; using System.Text; using UnityEngine; -namespace Blackout; +namespace NAK.Melons.Blackout; /* @@ -30,28 +30,37 @@ namespace Blackout; public class BlackoutController : MonoBehaviour { public static BlackoutController Instance; - + + // The current state of the player's consciousness. public BlackoutState CurrentState = BlackoutState.Awake; - //degrees of movement to give partial vision - public float drowsyThreshold = 1f; - //degrees of movement to give complete vision - public float wakeThreshold = 12f; + // Should the states automatically change based on time? + public bool AutomaticStateChange = true; + // Should the sleep state be automatically transitioned to? Some may prefer drowsy state only due to dimming. + public bool AutoSleepState = true; - //how long without movement until the screen dims - public float DrowsyModeTimer = 3f; // MINUTES - //how long should the wake state last before return - public float SleepModeTimer = 10f; // SECONDS + // The minimum amount of movement required to partially restore vision. + public float drowsyThreshold = 2f; + // The minimum amount of movement required to fully restore vision. + public float wakeThreshold = 4f; - //how much does DrowsyMode affect the screen - public float DrowsyDimStrength = 0.5f; + // The amount of time the player must remain still to enter drowsy state (in minutes). + public float DrowsyModeTimer = 3f; + // The amount of time the player must remain in drowsy state before entering sleep state (in seconds). + public float SleepModeTimer = 10f; - //this is uh, not work well- might rewrite now that i know how this should work - public bool HudMessages = false; + // The amount by which DrowsyMode affects the screen. + public float DrowsyDimStrength = 0.6f; + // Should DrowsyDimStrength be affected by velocity? + public bool DrowsyVelocityMultiplier = true; - //lower FPS while in sleep mode + // Whether to display HUD messages. + public bool HudMessages = true; + + // Whether to lower the frame rate while in sleep mode. public bool DropFPSOnSleep = false; + // The available states of consciousness. public enum BlackoutState { Awake = 0, @@ -60,14 +69,16 @@ public class BlackoutController : MonoBehaviour } private Camera activeModeCam; - private Quaternion oldHeadRotation = Quaternion.identity; - private float angularMovement = 0f; + private Vector3 headVelocity = Vector3.zero; + private Vector3 lastHeadPos = Vector3.zero; private float curTime = 0f; private float lastAwakeTime = 0f; - private int nextUpdate = 1; private Animator blackoutAnimator; private int targetFPS; + public void ChangeBlackoutStateFromInt(int state) => ChangeBlackoutState((BlackoutState)state); + + // Changes the player's state of consciousness. public void ChangeBlackoutState(BlackoutState newState) { if (!blackoutAnimator) return; @@ -75,47 +86,61 @@ public class BlackoutController : MonoBehaviour lastAwakeTime = curTime; + // Update the blackout animator based on the new state. switch (newState) { case BlackoutState.Awake: blackoutAnimator.SetBool("BlackoutState.Drowsy", false); blackoutAnimator.SetBool("BlackoutState.Sleeping", false); - blackoutAnimator.SetFloat("BlackoutSetting.DrowsyStrength", DrowsyDimStrength); + drowsyMagnitude = 0f; break; case BlackoutState.Drowsy: blackoutAnimator.SetBool("BlackoutState.Drowsy", true); blackoutAnimator.SetBool("BlackoutState.Sleeping", false); - blackoutAnimator.SetFloat("BlackoutSetting.DrowsyStrength", DrowsyDimStrength); + drowsyMagnitude = 0f; break; case BlackoutState.Sleeping: blackoutAnimator.SetBool("BlackoutState.Drowsy", false); blackoutAnimator.SetBool("BlackoutState.Sleeping", true); - blackoutAnimator.SetFloat("BlackoutSetting.DrowsyStrength", DrowsyDimStrength); + drowsyMagnitude = 1f; break; default: break; } + + // Update the current state and send a HUD message if enabled. BlackoutState prevState = CurrentState; CurrentState = newState; SendHUDMessage($"Exiting {prevState} and entering {newState} state."); ChangeTargetFPS(); } - //initialize BlackoutInstance object + public void AdjustDrowsyDimStrength(float multiplier = 1f) + { + blackoutAnimator.SetFloat("BlackoutSetting.DrowsyStrength", DrowsyDimStrength * multiplier); + } + + // Initialize the BlackoutInstance object. void Start() { Instance = this; + // Get the blackout asset and instantiate it. GameObject blackoutAsset = AssetsHandler.GetAsset("Assets/BundledAssets/Blackout/Blackout.prefab"); GameObject blackoutGO = Instantiate(blackoutAsset, new Vector3(0, 0, 0), Quaternion.identity); - - if (blackoutGO == null) return; - blackoutGO.name = "BlackoutInstance"; + + // Get the blackout animator component. blackoutAnimator = blackoutGO.GetComponent(); + if (!blackoutAnimator) + { + MelonLogger.Error("Blackout: Could not find blackout animator component!"); + return; + } + SetupBlackoutInstance(); - //we dont want this to ever disable (unless in awake state maybe? + //we dont want this to ever disable Camera.onPreRender += OnPreRender; Camera.onPostRender += OnPostRender; } @@ -123,41 +148,45 @@ public class BlackoutController : MonoBehaviour //Automatic State Change void Update() { - //only run once a second, angularMovement is "smoothed out" at high FPS otherwise - //for the sake of responsivness while user is in a sleepy state, this might be removed to prevent confusion... - curTime = Time.time; - if (!(curTime >= nextUpdate)) return; - nextUpdate = Mathf.FloorToInt(curTime) + 1; + //get the current position of the player's head + Vector3 curHeadPos = activeModeCam.transform.position; + //calculate the player's head velocity by taking the difference in position + headVelocity = (curHeadPos - lastHeadPos) / Time.deltaTime; + //store the current head position for use in the next frame + lastHeadPos = curHeadPos; - //get difference between last frame rotation and current rotation - Quaternion currentHeadRotation = activeModeCam.transform.rotation; - angularMovement = Quaternion.Angle(oldHeadRotation, currentHeadRotation); - oldHeadRotation = currentHeadRotation; - - //handle current state - switch (CurrentState) + if (AutomaticStateChange) { - case BlackoutState.Awake: - HandleAwakeState(); - break; - case BlackoutState.Drowsy: - HandleDrowsyState(); - break; - case BlackoutState.Sleeping: - HandleSleepingState(); - break; - default: - break; + curTime = Time.time; + //handle current state + switch (CurrentState) + { + case BlackoutState.Awake: + HandleAwakeState(); + break; + case BlackoutState.Drowsy: + HandleDrowsyState(); + break; + case BlackoutState.Sleeping: + HandleSleepingState(); + break; + default: + break; + } + } + else + { + CalculateDimmingMultiplier(); } } - void OnEnable() + public void OnEnable() { curTime = Time.time; lastAwakeTime = curTime; } - void OnDisable() + public void OnDisable() { ChangeBlackoutState(BlackoutState.Awake); } @@ -204,8 +233,17 @@ public class BlackoutController : MonoBehaviour if (!CohtmlHud.Instance || !HudMessages) return; StringBuilder secondmessage = new StringBuilder(); - if (enabled) - secondmessage = new StringBuilder(GetNextStateTimer().ToString() + " seconds till next state change."); + if (AutomaticStateChange) + { + if (CurrentState == BlackoutState.Drowsy && !AutoSleepState) + { + secondmessage = new StringBuilder("AutoSleepState is disabled. Staying in Drowsy State."); + } + else + { + secondmessage = new StringBuilder(GetNextStateTimer().ToString() + " seconds till next state change."); + } + } CohtmlHud.Instance.ViewDropTextImmediate("Blackout", message, secondmessage.ToString()); } @@ -223,7 +261,7 @@ public class BlackoutController : MonoBehaviour private void HandleAwakeState() { //small movement should reset sleep timer - if (angularMovement > drowsyThreshold) + if (headVelocity.magnitude > drowsyThreshold) { lastAwakeTime = curTime; } @@ -233,23 +271,51 @@ public class BlackoutController : MonoBehaviour ChangeBlackoutState(BlackoutState.Drowsy); } } + + public float fadeSpeed = 0.8f; // The speed at which the value fades back to 0 or increases + public float minimumThreshold = 0.5f; // The minimum value that the drowsy magnitude can have + public float drowsyMagnitude = 0f; + + private void CalculateDimmingMultiplier() + { + if (!DrowsyVelocityMultiplier) + { + AdjustDrowsyDimStrength(); + return; + } + + float normalizedMagnitude = headVelocity.magnitude / wakeThreshold; + float targetMagnitude = 1f - normalizedMagnitude; + targetMagnitude = Mathf.Max(targetMagnitude, minimumThreshold); + drowsyMagnitude = Mathf.Lerp(drowsyMagnitude, targetMagnitude, fadeSpeed * Time.deltaTime); + AdjustDrowsyDimStrength(drowsyMagnitude); + } + private void HandleDrowsyState() { //hard movement should exit drowsy state - if (angularMovement > wakeThreshold) + if (headVelocity.magnitude > wakeThreshold) { ChangeBlackoutState(BlackoutState.Awake); + return; + } + //small movement should reset sleep timer + if (headVelocity.magnitude > drowsyThreshold) + { + lastAwakeTime = curTime; } //enter full sleep mode - if (curTime > lastAwakeTime + SleepModeTimer) + if (AutoSleepState && curTime > lastAwakeTime + SleepModeTimer) { ChangeBlackoutState(BlackoutState.Sleeping); } + CalculateDimmingMultiplier(); } + private void HandleSleepingState() { //small movement should enter drowsy state - if (angularMovement > drowsyThreshold) + if (headVelocity.magnitude > drowsyThreshold) { ChangeBlackoutState(BlackoutState.Drowsy); } diff --git a/Blackout/HarmonyPatches.cs b/Blackout/HarmonyPatches.cs index 1387e9e..eb53c70 100644 --- a/Blackout/HarmonyPatches.cs +++ b/Blackout/HarmonyPatches.cs @@ -3,7 +3,7 @@ using ABI_RC.Core.Savior; using HarmonyLib; using MelonLoader; -namespace Blackout; +namespace NAK.Melons.Blackout.HarmonyPatches; [HarmonyPatch] internal class HarmonyPatches diff --git a/Blackout/Integrations/BTKUIAddon.cs b/Blackout/Integrations/BTKUIAddon.cs new file mode 100644 index 0000000..e0fb660 --- /dev/null +++ b/Blackout/Integrations/BTKUIAddon.cs @@ -0,0 +1,63 @@ +using BTKUILib; +using BTKUILib.UIObjects; +using System.Runtime.CompilerServices; + +namespace NAK.Melons.Blackout; + +public static class BTKUIAddon +{ + [MethodImpl(MethodImplOptions.NoInlining)] + public static void Init() + { + //Add myself to the Misc Menu + Page miscPage = QuickMenuAPI.MiscTabPage; + Category miscCategory = miscPage.AddCategory(Blackout.SettingsCategory); + + AddMelonToggle(ref miscCategory, Blackout.m_entryEnabled); + + //Add my own page to not clog up Misc Menu + + Page blackoutPage = miscCategory.AddPage("Blackout Settings", "", "Configure the settings for Blackout.", "Blackout"); + blackoutPage.MenuTitle = "Blackout Settings"; + blackoutPage.MenuSubtitle = "Dim screen after set time of sitting still, or configure with manual control. Should be nice for VR sleeping."; + + Category blackoutCategory = blackoutPage.AddCategory("Blackout"); + + AddMelonToggle(ref blackoutCategory, Blackout.m_entryEnabled); + + //manual state changing + var state_Awake = blackoutCategory.AddButton("Awake State", null, "Enter the Awake State."); + state_Awake.OnPress += () => BlackoutController.Instance?.ChangeBlackoutState(BlackoutController.BlackoutState.Awake); + var state_Drowsy = blackoutCategory.AddButton("Drowsy State", null, "Enter the Drowsy State."); + state_Drowsy.OnPress += () => BlackoutController.Instance?.ChangeBlackoutState(BlackoutController.BlackoutState.Drowsy); + var state_Sleeping = blackoutCategory.AddButton("Sleeping State", null, "Enter the Sleeping State."); + state_Sleeping.OnPress += () => BlackoutController.Instance?.ChangeBlackoutState(BlackoutController.BlackoutState.Sleeping); + + //dimming strength + AddMelonSlider(ref blackoutPage, Blackout.m_entryDrowsyDimStrength, 0f, 1f); + + //velocity dim multiplier + AddMelonToggle(ref blackoutCategory, Blackout.m_entryDrowsyVelocityMultiplier); + + //hud messages + AddMelonToggle(ref blackoutCategory, Blackout.m_entryHudMessages); + + //lower fps while sleep (desktop) + AddMelonToggle(ref blackoutCategory, Blackout.m_entryDropFPSOnSleep); + + //auto sleep state + AddMelonToggle(ref blackoutCategory, Blackout.m_entryAutoSleepState); + + //i will add the rest of the settings once BTKUILib supports int input + } + + private static void AddMelonToggle(ref Category category, MelonLoader.MelonPreferences_Entry entry) + { + category.AddToggle(entry.DisplayName, entry.Description, entry.Value).OnValueUpdated += b => entry.Value = b; + } + + private static void AddMelonSlider(ref Page page, MelonLoader.MelonPreferences_Entry entry, float min, float max) + { + page.AddSlider(entry.DisplayName, entry.Description, entry.Value, min, max).OnValueUpdated += f => entry.Value = f; + } +} \ No newline at end of file diff --git a/Blackout/Integrations/UIExpansionKitAddon.cs b/Blackout/Integrations/UIExpansionKitAddon.cs new file mode 100644 index 0000000..3e6a4a6 --- /dev/null +++ b/Blackout/Integrations/UIExpansionKitAddon.cs @@ -0,0 +1,29 @@ +using System.Runtime.CompilerServices; +using UIExpansionKit.API; + +namespace NAK.Melons.Blackout; +public static class UIExpansionKitAddon +{ + [MethodImpl(MethodImplOptions.NoInlining)] + public static void Init() + { + /** + ive spent hours debugging this, and no matter what the buttons wont actually call the actions + from logging shit to straight up closing the game, nothing + + implementing btkuilib support, but gonna leave this shit as a reminder why to not use uiexpansionkit + also because it **used to work**... a game update broke it and uiexpansionkit hasnt updated since + + what pisses me off more, is that DesktopVRSwitch works, and that was originally copied from Blackout -_- + https://github.com/NotAKidOnSteam/DesktopVRSwitch/blob/main/DesktopVRSwitch/UIExpansionKitAddon.cs + **/ + var settings = ExpansionKitApi.GetSettingsCategory(Blackout.SettingsCategory); + settings.AddSimpleButton("Awake State", AwakeState); + settings.AddSimpleButton("Drowsy State", DrowsyState); + settings.AddSimpleButton("Sleep State", SleepingState); + } + //UIExpansionKit actions + internal static void AwakeState() => BlackoutController.Instance?.ChangeBlackoutState(BlackoutController.BlackoutState.Awake); + internal static void DrowsyState() => BlackoutController.Instance?.ChangeBlackoutState(BlackoutController.BlackoutState.Drowsy); + internal static void SleepingState() => BlackoutController.Instance?.ChangeBlackoutState(BlackoutController.BlackoutState.Sleeping); +} \ No newline at end of file diff --git a/Blackout/Main.cs b/Blackout/Main.cs index b4926a3..fbc473b 100644 --- a/Blackout/Main.cs +++ b/Blackout/Main.cs @@ -2,43 +2,58 @@ using ABI_RC.Core.Savior; using MelonLoader; -namespace Blackout; +namespace NAK.Melons.Blackout; public class Blackout : MelonMod { internal static bool inVR; internal const string SettingsCategory = "Blackout"; - private static MelonPreferences_Category m_categoryBlackout; - private static MelonPreferences_Entry m_entryEnabled, m_entryHudMessages, m_entryDropFPSOnSleep; - private static MelonPreferences_Entry + internal static MelonPreferences_Category m_categoryBlackout; + internal static MelonPreferences_Entry + m_entryEnabled, + m_entryAutoSleepState, + m_entryHudMessages, + m_entryDropFPSOnSleep, + m_entryDrowsyVelocityMultiplier; + internal static MelonPreferences_Entry m_entryDrowsyThreshold, m_entryAwakeThreshold, m_entryDrowsyModeTimer, m_entrySleepModeTimer, m_entryDrowsyDimStrength; public override void OnInitializeMelon() { - m_categoryBlackout = MelonPreferences.CreateCategory(nameof(Blackout)); - m_entryEnabled = m_categoryBlackout.CreateEntry("Automatic State Change", true, description: "Dim screen when there is no movement for a while."); - m_entryHudMessages = m_categoryBlackout.CreateEntry("Hud Messages", false, description: "Notify on state change."); - m_entryDropFPSOnSleep = m_categoryBlackout.CreateEntry("Lower FPS While Sleep", false, description: "Lowers FPS to 5 while in Sleep State."); - m_entryDrowsyThreshold = m_categoryBlackout.CreateEntry("Drowsy Threshold", 1f, description: "Degrees of movement to return partial vision."); - m_entryAwakeThreshold = m_categoryBlackout.CreateEntry("Awake Threshold", 12f, description: "Degrees of movement to return full vision."); + m_categoryBlackout = MelonPreferences.CreateCategory(SettingsCategory); + m_entryEnabled = m_categoryBlackout.CreateEntry("Automatic State Change", true, description: "Should the screen automatically dim if head is still for enough time?"); + m_entryEnabled.OnEntryValueChangedUntyped.Subscribe(OnUpdateEnabled); + m_entryHudMessages = m_categoryBlackout.CreateEntry("Hud Messages", true, description: "Notify on state change."); + m_entryDropFPSOnSleep = m_categoryBlackout.CreateEntry("Limit FPS While Sleep", false, description: "Limits FPS to 5 while in Sleep State. This only works in Desktop, as SteamVR/HMD handles VR FPS."); + m_entryDrowsyVelocityMultiplier = m_categoryBlackout.CreateEntry("Drowsy Velocity Multiplier", true, description: "Should head velocity act as a multiplier to Drowsy Dim Strength?"); + m_entryAutoSleepState = m_categoryBlackout.CreateEntry("Auto Sleep State", true, description: "Should the sleep state be used during Automatic State Change?"); + m_entryDrowsyThreshold = m_categoryBlackout.CreateEntry("Drowsy Threshold", 2f, description: "Velocity to return partial vision."); + m_entryAwakeThreshold = m_categoryBlackout.CreateEntry("Awake Threshold", 4f, description: "Velocity to return full vision."); m_entryDrowsyModeTimer = m_categoryBlackout.CreateEntry("Enter Drowsy Time (Minutes)", 3f, description: "How many minutes without movement until enter drowsy mode."); m_entrySleepModeTimer = m_categoryBlackout.CreateEntry("Enter Sleep Time (Seconds)", 10f, description: "How many seconds without movement until enter sleep mode."); - m_entryDrowsyDimStrength = m_categoryBlackout.CreateEntry("Drowsy Dim Strength", 0.5f, description: "How strong of a dimming effect should drowsy mode have."); - m_categoryBlackout.SaveToFile(false); + m_entryDrowsyDimStrength = m_categoryBlackout.CreateEntry("Drowsy Dim Strength", 0.6f, description: "How strong of a dimming effect should drowsy mode have."); foreach (var setting in m_categoryBlackout.Entries) { - setting.OnEntryValueChangedUntyped.Subscribe(OnUpdateSettings); + if (!setting.OnEntryValueChangedUntyped.GetSubscribers().Any()) + setting.OnEntryValueChangedUntyped.Subscribe(OnUpdateSettings); } //UIExpansionKit addon if (MelonMod.RegisteredMelons.Any(it => it.Info.Name == "UI Expansion Kit")) { MelonLogger.Msg("Initializing UIExpansionKit support."); - UiExtensionsAddon.Init(); + UIExpansionKitAddon.Init(); + } + + //BTKUILib addon + if (MelonMod.RegisteredMelons.Any(it => it.Info.Name == "BTKUILib")) + { + MelonLogger.Msg("Initializing BTKUILib support."); + BTKUIAddon.Init(); } MelonLoader.MelonCoroutines.Start(WaitForLocalPlayer()); @@ -60,32 +75,37 @@ public class Blackout : MelonMod yield return null; UpdateAllSettings(); + OnEnabled(); } private void OnEnabled() { if (!BlackoutController.Instance) return; - BlackoutController.Instance.enabled = m_entryEnabled.Value; + if (m_entryEnabled.Value) + { + BlackoutController.Instance.OnEnable(); + } + else + { + BlackoutController.Instance.OnDisable(); + } + BlackoutController.Instance.AutomaticStateChange = m_entryEnabled.Value; } private void UpdateAllSettings() { if (!BlackoutController.Instance) return; - BlackoutController.Instance.enabled = m_entryEnabled.Value; BlackoutController.Instance.HudMessages = m_entryHudMessages.Value; + BlackoutController.Instance.AutoSleepState = m_entryAutoSleepState.Value; BlackoutController.Instance.DropFPSOnSleep = m_entryDropFPSOnSleep.Value; BlackoutController.Instance.drowsyThreshold = m_entryDrowsyThreshold.Value; BlackoutController.Instance.wakeThreshold = m_entryAwakeThreshold.Value; BlackoutController.Instance.DrowsyModeTimer = m_entryDrowsyModeTimer.Value; BlackoutController.Instance.SleepModeTimer = m_entrySleepModeTimer.Value; BlackoutController.Instance.DrowsyDimStrength = m_entryDrowsyDimStrength.Value; + BlackoutController.Instance.DrowsyVelocityMultiplier = m_entryDrowsyVelocityMultiplier.Value; } private void OnUpdateEnabled(object arg1, object arg2) => OnEnabled(); private void OnUpdateSettings(object arg1, object arg2) => UpdateAllSettings(); - - //UIExpansionKit actions - internal static void AwakeState() => BlackoutController.Instance.ChangeBlackoutState(BlackoutController.BlackoutState.Awake); - internal static void DrowsyState() => BlackoutController.Instance.ChangeBlackoutState(BlackoutController.BlackoutState.Drowsy); - internal static void SleepingState() => BlackoutController.Instance.ChangeBlackoutState(BlackoutController.BlackoutState.Sleeping); } \ No newline at end of file diff --git a/Blackout/Properties/AssemblyInfo.cs b/Blackout/Properties/AssemblyInfo.cs index c79bb81..e69e1a5 100644 --- a/Blackout/Properties/AssemblyInfo.cs +++ b/Blackout/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using Blackout.Properties; +using NAK.Melons.Blackout.Properties; using MelonLoader; using System.Reflection; @@ -6,13 +6,13 @@ using System.Reflection; [assembly: AssemblyVersion(AssemblyInfoParams.Version)] [assembly: AssemblyFileVersion(AssemblyInfoParams.Version)] [assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)] -[assembly: AssemblyTitle(nameof(Blackout))] +[assembly: AssemblyTitle(nameof(NAK.Melons.Blackout))] [assembly: AssemblyCompany(AssemblyInfoParams.Author)] -[assembly: AssemblyProduct(nameof(Blackout))] +[assembly: AssemblyProduct(nameof(NAK.Melons.Blackout))] [assembly: MelonInfo( - typeof(Blackout.Blackout), - nameof(Blackout), + typeof(NAK.Melons.Blackout.Blackout), + nameof(NAK.Melons.Blackout), AssemblyInfoParams.Version, AssemblyInfoParams.Author, downloadLink: "https://github.com/NotAKidOnSteam/Blackout" @@ -21,10 +21,11 @@ using System.Reflection; [assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")] [assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] [assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)] +[assembly: MelonOptionalDependencies("UIExpansionKit", "BTKUILib")] -namespace Blackout.Properties; +namespace NAK.Melons.Blackout.Properties; internal static class AssemblyInfoParams { - public const string Version = "1.0.4"; + public const string Version = "2.0.0"; public const string Author = "NotAKidoS"; } \ No newline at end of file diff --git a/Blackout/Resource1.Designer.cs b/Blackout/Resource1.Designer.cs index 5c2b3b3..0378e77 100644 --- a/Blackout/Resource1.Designer.cs +++ b/Blackout/Resource1.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace Blackout { +namespace NAK.Melons.Blackout { using System; diff --git a/Blackout/UIExpansionKitAddon.cs b/Blackout/UIExpansionKitAddon.cs deleted file mode 100644 index f38bccb..0000000 --- a/Blackout/UIExpansionKitAddon.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Runtime.CompilerServices; -using UIExpansionKit.API; - -namespace Blackout; -public static class UiExtensionsAddon -{ - [MethodImpl(MethodImplOptions.NoInlining)] - public static void Init() - { - var settings = ExpansionKitApi.GetSettingsCategory(Blackout.SettingsCategory); - settings.AddSimpleButton("Awake State", Blackout.AwakeState); - settings.AddSimpleButton("Drowsy State", Blackout.DrowsyState); - settings.AddSimpleButton("Sleep State", Blackout.SleepingState); - } -} \ No newline at end of file diff --git a/Blackout/format.json b/Blackout/format.json index eb09686..5f2e9f7 100644 --- a/Blackout/format.json +++ b/Blackout/format.json @@ -1,12 +1,12 @@ { "_id": 106, "name": "Blackout", - "modversion": "1.0.4", - "gameversion": "2022r169", + "modversion": "2.0.0", + "gameversion": "2022r170", "loaderversion": "0.5.7", "modtype": "Mod", "author": "NotAKidoS", - "description": "Dim screen after set time of sitting still. Should be nice for VR sleeping.\n\nNotable Options:\n Cap FPS while sleeping.\nManual control via UIX\nConfigurable dimming strength.", + "description": "Dim screen after set time of sitting still. Should be nice for VR sleeping.\n\nNotable Options:\n Cap FPS while sleeping.\nManual control via BTKUILib\nConfigurable dimming strength.", "searchtags": [ "black", "dimmer", @@ -14,10 +14,11 @@ "sleeper" ], "requirements": [ - "None" + "BTKUILib", + "UIExpansionKit" ], - "downloadlink": "https://github.com/NotAKidOnSteam/Blackout/releases/download/r5/Blackout.dll", + "downloadlink": "https://github.com/NotAKidOnSteam/Blackout/releases/download/v2.0.0/Blackout.dll", "sourcelink": "https://github.com/NotAKidOnSteam/Blackout/", - "changelog": "Small tweak to fix VRMode change detection with latest experimental.", + "changelog": "- Added BTKUILib support.\n- Added dimming strength velocity multiplier option.\n- Added option to not use Automatic Sleep State.\n- Dimming strengh now updates in realtime when configuring.", "embedcolor": "#161b22" } \ No newline at end of file