The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of PeakTimer v1.2.4
com.turtledsr.peaktimer.dll
Decompiled 2 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("com.turtledsr.peaktimer")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.2.3.0")] [assembly: AssemblyInformationalVersion("1.2.3+7e757a95fdff16cccdde718318ab0bfee456d25c")] [assembly: AssemblyProduct("PeakTimer")] [assembly: AssemblyTitle("com.turtledsr.peaktimer")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.3.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 peaktimer { [BepInPlugin("com.turtledsr.peaktimer", "PeakTimer", "1.2.3")] [BepInProcess("Peak.exe")] public class Plugin : BaseUnityPlugin { public enum StartLocation { Shore, Tropics, Alpine, Caldera, Kiln } public enum StopLocation { Tropics, Alpine, Caldera, Kiln, Peak } public enum TimingMethod { RTA, IGT } [HarmonyPatch(typeof(PauseOptionsMenu), "OnOpen")] private static class PauseoptionsMenu_OnOpen_Patch { private static bool Prefix() { if (timingMethod == TimingMethod.IGT) { Logger.LogInfo((object)"Timer Paused (GAME PAUSE)"); timing = false; } return true; } } [HarmonyPatch(typeof(PauseOptionsMenu), "OnClose")] private static class PauseoptionsMenu_OnClose_Patch { private static bool Prefix() { if (timingMethod == TimingMethod.IGT) { Logger.LogInfo((object)"Timer Unpaused (GAME UNPAUSE)"); timing = true; } return true; } } [HarmonyPatch(typeof(SteamLobbyHandler), "LeaveLobby")] private static class SteamLobbyHandler_LeaveLobby_Patch { private static bool Prefix() { Logger.LogInfo((object)"Lobby Left"); Unbind(); return true; } } [HarmonyPatch(typeof(RunManager), "StartRun")] private static class RunManager_StartRun_Patch { private static bool Prefix() { Bind(); return true; } } [HarmonyPatch(typeof(GlobalEvents), "TriggerRunEnded")] private static class GlobalEvents_TriggerRunEnded_Patch { private static bool Prefix() { if (goalPoint == StopLocation.Peak) { Logger.LogInfo((object)"Run Ended By game End"); timing = false; } return true; } } internal static ManualLogSource Logger; private static ConfigEntry<StopLocation> goalConfig; private static ConfigEntry<StartLocation> startConfig; private static ConfigEntry<TimingMethod> timingMethodConfig; private static ConfigEntry<string> versionConfig; private static GameObject mountainProgress; private static Component progressScript; private static Campfire beachCampfire; private static Campfire jungleCampfire; private static Campfire snowCampfire; private static Campfire volcanoCampfire; private static bool timing; private static TimingMethod timingMethod; private static StopLocation goalPoint; private static StartLocation startPoint; private static float time; private static string timeString; private static Vector2 timerPos; private static float timerStartDelay; private static Version currentVersion = new Version("1.2.3"); private void Awake() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown Init(); Logger = ((BaseUnityPlugin)this).Logger; Harmony val = new Harmony("com.turtledsr.peaktimer"); val.PatchAll(); ConfigDefinition val2 = new ConfigDefinition("info", "version"); bool flag = false; versionConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Info", "version", "", (ConfigDescription)null); if (versionConfig.Value != "") { Version version = new Version("1.2.2"); Logger.LogInfo((object)versionConfig.Value); Logger.LogInfo((object)version.ToString()); Logger.LogInfo((object)new Version(versionConfig.Value).CompareTo(version)); if (new Version(versionConfig.Value).CompareTo(version) < 0) { Logger.LogInfo((object)"New mod version detected: Resetting config"); flag = true; } ((BaseUnityPlugin)this).Config.Save(); ((BaseUnityPlugin)this).Config.Reload(); } else { Logger.LogInfo((object)"New mod version detected: Resetting config"); flag = true; } versionConfig = null; ((BaseUnityPlugin)this).Config.Remove(val2); ((BaseUnityPlugin)this).Config.Reload(); startConfig = ((BaseUnityPlugin)this).Config.Bind<StartLocation>("Timing", "Start", StartLocation.Shore, "Start point for the timer"); startPoint = startConfig.Value; startConfig.SettingChanged += delegate { startPoint = startConfig.Value; }; goalConfig = ((BaseUnityPlugin)this).Config.Bind<StopLocation>("Timing", "Goal", StopLocation.Peak, "Goal point for the timer"); goalPoint = goalConfig.Value; goalConfig.SettingChanged += delegate { goalPoint = goalConfig.Value; }; timingMethodConfig = ((BaseUnityPlugin)this).Config.Bind<TimingMethod>("Timing", "Timing Method", TimingMethod.RTA, "Timing method for the timer"); timingMethod = timingMethodConfig.Value; timingMethodConfig.SettingChanged += delegate { timingMethod = timingMethodConfig.Value; }; if (flag) { startConfig.Value = StartLocation.Shore; goalConfig.Value = StopLocation.Peak; timingMethodConfig.Value = TimingMethod.RTA; ((BaseUnityPlugin)this).Config.Save(); } Logger.LogInfo((object)"Peak Timer is loaded!"); } private void OnGUI() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) GUIStyle val = new GUIStyle { fontSize = 30, fontStyle = (FontStyle)1 }; val.normal.textColor = Color.white; GUI.Label(new Rect(timerPos.x, timerPos.y, 200f, 30f), timeString, val); } private void Update() { //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Invalid comparison between Unknown and I4 //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Invalid comparison between Unknown and I4 //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Invalid comparison between Unknown and I4 //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Invalid comparison between Unknown and I4 //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Invalid comparison between Unknown and I4 //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Invalid comparison between Unknown and I4 //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Invalid comparison between Unknown and I4 //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Invalid comparison between Unknown and I4 if (timerStartDelay > 0f) { timerStartDelay -= Time.deltaTime; if (timerStartDelay <= 0f) { timerStartDelay = -1f; timing = true; } } if (timing && (Object)(object)mountainProgress != (Object)null) { time += Time.deltaTime; timeString = GetTimeString(); switch (goalPoint) { case StopLocation.Tropics: if ((Object)(object)beachCampfire != (Object)null && (int)beachCampfire.state > 0) { timing = false; } break; case StopLocation.Alpine: if ((Object)(object)jungleCampfire != (Object)null && (int)jungleCampfire.state > 0) { timing = false; } break; case StopLocation.Caldera: if ((Object)(object)snowCampfire != (Object)null && (int)snowCampfire.state > 0) { timing = false; } break; case StopLocation.Kiln: if ((Object)(object)volcanoCampfire != (Object)null && (int)volcanoCampfire.state > 0) { timing = false; } break; } } else { if (timing || !((Object)(object)mountainProgress != (Object)null)) { return; } switch (startPoint) { case StartLocation.Tropics: if ((Object)(object)beachCampfire != (Object)null && (int)beachCampfire.state > 0) { timing = true; } break; case StartLocation.Alpine: if ((Object)(object)jungleCampfire != (Object)null && (int)jungleCampfire.state > 0) { timing = true; } break; case StartLocation.Caldera: if ((Object)(object)snowCampfire != (Object)null && (int)snowCampfire.state > 0) { timing = true; } break; case StartLocation.Kiln: if ((Object)(object)volcanoCampfire != (Object)null && (int)volcanoCampfire.state > 0) { timing = true; } break; } } } public void OnApplicationQuit() { Logger.LogInfo((object)"Application Quitting!"); ConfigEntry<string> val = ((BaseUnityPlugin)this).Config.Bind<string>("Info", "version", currentVersion.ToString(), (ConfigDescription)null); val.Value = currentVersion.ToString(); ((BaseUnityPlugin)this).Config.Save(); } private void Init() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) timing = false; time = 0f; timeString = "00:00:00.000"; Resolution currentResolution = Screen.currentResolution; timerPos = new Vector2((float)(((Resolution)(ref currentResolution)).width - 210), 10f); timerStartDelay = -1f; } private static void Bind() { goalPoint = goalConfig.Value; timingMethod = timingMethodConfig.Value; mountainProgress = GameObject.Find("MountainProgress"); timing = false; if ((Object)(object)mountainProgress != (Object)null) { timeString = "00:00:00.000"; time = 0f; Logger.LogInfo((object)"Bound MountainProgress!"); progressScript = mountainProgress.GetComponentAtIndex(1); if (startPoint == StartLocation.Shore) { timerStartDelay = 6f; } if ((Object)(object)progressScript == (Object)null) { Logger.LogWarning((object)"Couldn't bind progressScript"); } LoadCampfires(); } else { Logger.LogWarning((object)"Couldn't bind MountainProgress :("); } } private static void Unbind() { mountainProgress = null; progressScript = null; timing = false; Logger.LogInfo((object)"Unbound RunManager!"); } public static void LoadCampfires() { Logger.LogInfo((object)"Loading Campfires"); try { beachCampfire = ((Component)GameObject.Find("Map").transform.GetChild(1).GetChild(3).GetChild(0)).gameObject.GetComponentAtIndex<Campfire>(1); if ((Object)(object)beachCampfire == (Object)null) { Logger.LogError((object)"Could not find Beach_Campfire"); } else { Logger.LogInfo((object)"Found Beach_Campfire"); } } catch (Exception) { Logger.LogError((object)"Could not find Beach_Campfire"); } try { jungleCampfire = ((Component)GameObject.Find("Map").transform.GetChild(3).GetChild(3).GetChild(0)).gameObject.GetComponentAtIndex<Campfire>(1); if ((Object)(object)jungleCampfire == (Object)null) { Logger.LogError((object)"Could not find Jungle_Campfire"); } else { Logger.LogInfo((object)"Found Jungle_Campfire"); } } catch (Exception) { Logger.LogError((object)"Could not find Jungle_Campfire"); } try { snowCampfire = ((Component)GameObject.Find("Map").transform.GetChild(5).GetChild(3).GetChild(0)).gameObject.GetComponentAtIndex<Campfire>(1); if ((Object)(object)snowCampfire == (Object)null) { Logger.LogError((object)"Could not find Snow_Campfire"); } else { Logger.LogInfo((object)"Found Snow_Campfire"); } } catch (Exception) { Logger.LogError((object)"Could not find Snow_Campfire"); } try { volcanoCampfire = ((Component)GameObject.Find("Map").transform.GetChild(6).GetChild(0).GetChild(7) .GetChild(1) .GetChild(1) .GetChild(0)).gameObject.GetComponentAtIndex<Campfire>(1); if ((Object)(object)volcanoCampfire == (Object)null) { Logger.LogError((object)"Could not find Volcano_Campfire"); } else { Logger.LogInfo((object)"Found Volcano_Campfire"); } } catch (Exception) { Logger.LogError((object)"Could not find Volcano_Campfire"); } } private string GetTimeString() { int num = (int)(time / 3600f); float num2 = time - (float)(num * 3600); int num3 = (int)(num2 / 60f); num2 -= (float)(num3 * 60); int num4 = (int)num2; int num5 = (int)(((double)num2 - Math.Truncate(num2)) * 1000.0); return num.ToString("00") + ":" + num3.ToString("00") + ":" + num4.ToString("00") + "." + num5.ToString("000"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.turtledsr.peaktimer"; public const string PLUGIN_NAME = "PeakTimer"; public const string PLUGIN_VERSION = "1.2.3"; } }