Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of FPSChanger v1.0.1
gafoneo.fpschanger.dll
Decompiled 4 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using LethalCompanyInputUtils.Api; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.InputSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("gafoneo.fpschanger")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: AssemblyInformationalVersion("1.0.1+80bfa3dd230fd53050b4e4b78a69337f5c38bd0e")] [assembly: AssemblyProduct("FPSChanger")] [assembly: AssemblyTitle("gafoneo.fpschanger")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FPSChanger { public class FPSCInputClass : LcInputActions { [InputAction(/*Could not decode attribute arguments.*/)] public InputAction ChangeFPS { get; set; } } [BepInPlugin("gafoneo.fpschanger", "FPSChanger", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class FPSChanger : BaseUnityPlugin { [CompilerGenerated] private sealed class <RemoveNextFrame>d__15 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public FPSChanger <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RemoveNextFrame>d__15(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; FPSChanger fPSChanger = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; fPSChanger.RemoveLCSTKeybinds(); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } internal static ManualLogSource Logger; private ConfigEntry<string> fpsValues; private ConfigEntry<bool> disableLCST; internal string filePath = "LCGeneralSaveData"; internal int[] ingameFPSCaps = new int[6] { -1, 250, 144, 120, 60, 30 }; internal int currentGameIndex; internal int currentModIndex; internal int currentSetting; internal int[] FPSValues; internal static FPSCInputClass InputActionsInstance; public static FPSChanger Instance { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; Logger.LogInfo((object)"Plugin gafoneo.fpschanger is loading!"); fpsValues = ((BaseUnityPlugin)this).Config.Bind<string>("FPSChanger", "FPS Values", CommaJoin(new int[2] { 30, 250 }), "Values of fps that would be cycled, comma-separated. Available options: 30, 60, 120, 144, 250, 0. 250 is written as \"Uncapped\" ingame and -1 is for Vsync"); disableLCST = ((BaseUnityPlugin)this).Config.Bind<bool>("Advanced", "Disable LCSoundTool keybinds", true, "LCSoundTool mod has in-built keybinds for F5 and F6, this settings disables them cause they can cause a lot of lag and are only used for debugging and modding"); if (!CommaSplit(fpsValues.Value, out FPSValues)) { Logger.LogInfo((object)"Was not able to parse the config. The mod will not work, shutting it down"); return; } Logger.LogInfo((object)("Config values: " + GeneralExtensions.Join<string>(FPSValues.Select((int i) => i.ToString()), (Func<string, string>)null, ", "))); if (!FPSValues.Select((int i) => ingameFPSCaps.Contains(i)).All((bool i) => i)) { Logger.LogError((object)"Wrong option in your config was found. Shutting down."); return; } currentGameIndex = ES3.Load<int>("FPSCap", filePath, 0); currentSetting = ingameFPSCaps[currentGameIndex]; Logger.LogInfo((object)$"Current game index: {currentGameIndex}"); Logger.LogInfo((object)string.Format("Current FPS setting: {0}", (currentSetting != -1) ? ((object)currentSetting) : "Vsync")); currentModIndex = Array.IndexOf(FPSValues, currentSetting); Logger.LogInfo((object)$"Current mod index: {currentModIndex}"); InputActionsInstance = new FPSCInputClass(); SetupKeybindCallbacks(); if (disableLCST.Value) { ((MonoBehaviour)this).StartCoroutine(RemoveNextFrame()); } Logger.LogInfo((object)"Finished setting up"); } [IteratorStateMachine(typeof(<RemoveNextFrame>d__15))] private IEnumerator RemoveNextFrame() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RemoveNextFrame>d__15(0) { <>4__this = this }; } private void RemoveLCSTKeybinds() { Logger.LogInfo((object)"Checking if LCSoundTool is installed"); if (!Chainloader.PluginInfos.ContainsKey("LCSoundTool")) { Logger.LogInfo((object)"LCST is not installed"); return; } Logger.LogInfo((object)"LCST is installed, removing it's keybinds"); Assembly assembly = ((object)Chainloader.PluginInfos["LCSoundTool"].Instance).GetType().Assembly; Type type = assembly.GetType("LCSoundTool.Utilities.InputHelper"); if (type == null) { Logger.LogDebug((object)"Getting InputHelper type failed, stopped trying to remove keybinds"); return; } FieldInfo field = type.GetField("keybinds", BindingFlags.Static | BindingFlags.Public); if (field == null) { Logger.LogDebug((object)"Getting keybinds field from InputHelper failed, stopped trying to remove keybinds"); return; } if (!(field.GetValue(null) is IDictionary dictionary)) { Logger.LogDebug((object)"Getting keybinds from the field failed, stopped trying to remove keybinds"); return; } dictionary.Clear(); Logger.LogInfo((object)"All LCST keybinds has been removed"); } private static string CommaJoin(int[] i) { return GeneralExtensions.Join<int>((IEnumerable<int>)i, (Func<int, string>)null, ",").ToString(); } private static bool CommaSplit(string input, out int[] values) { string[] array = input.Split(','); values = new int[array.Length]; for (int i = 0; i < array.Length; i++) { if (!int.TryParse(array[i].Trim(), out values[i])) { values = Array.Empty<int>(); return false; } } return true; } public void SetupKeybindCallbacks() { InputActionsInstance.ChangeFPS.performed += OnChangeFPSPressed; } public void OnChangeFPSPressed(CallbackContext changeFPSConext) { if (!((CallbackContext)(ref changeFPSConext)).performed) { return; } Settings settings = IngamePlayerSettings.Instance.settings; if (settings == null) { Logger.LogError((object)"Settings not found!"); HUDManager.Instance.DisplayTip("FPSChanger", "Settings not found!", true, false, "LC_Tip1"); return; } currentGameIndex = settings.framerateCapIndex; currentSetting = ingameFPSCaps[currentGameIndex]; if (!FPSValues.Contains(currentSetting)) { Logger.LogInfo((object)$"Current FPS setting: {currentSetting}, not in the FPSValues array -> setting index to -1"); currentModIndex = -1; } currentModIndex = (currentModIndex + 1) % FPSValues.Length; currentSetting = FPSValues[currentModIndex]; currentGameIndex = Array.IndexOf(ingameFPSCaps, currentSetting); settings.framerateCapIndex = currentGameIndex; try { ES3.Save<int>("FPSCap", currentGameIndex, filePath); } catch { Logger.LogWarning((object)"Was not able to write into the settings file"); } IngamePlayerSettings.Instance.UpdateGameToMatchSettings(); string text = ((currentSetting == -1) ? "Vsync" : currentSetting.ToString()); HUDManager.Instance.DisplayTip("FPSChanger", "Changed FPS cap to " + text, false, false, "LC_Tip1"); Logger.LogInfo((object)$"FPS cap changed to: {text}, index: {currentGameIndex}"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "gafoneo.fpschanger"; public const string PLUGIN_NAME = "FPSChanger"; public const string PLUGIN_VERSION = "1.0.1"; } }