Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of PForProduct Mono v1.0.4
Mods/PForProductMono.dll
Decompiled 3 months agousing System; using System.Collections; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using MelonLoader; using MelonLoader.Preferences; using ModManagerPhoneApp; using P_For_Product_Mono; using ScheduleOne.UI; using ScheduleOne.UI.Phone; using ScheduleOne.UI.Phone.ProductManagerApp; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(PForProductMono), "P For Product", "1.0.4", "KrakHedKorps", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: AssemblyTitle("PForProductMono")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PForProductMono")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("a32f9410-4bdd-4e21-854f-635a17f0a050")] [assembly: AssemblyFileVersion("1.0.4")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.4.0")] namespace P_For_Product_Mono; public class PForProductMono : MelonMod { private KeyCode toggleKey = (KeyCode)112; private bool isInitialized = false; private const string APP_OBJECT_NAME = "ModSettingsApp"; private static MelonPreferences_Entry<KeyCode> toggleKeyEntry; public override void OnSceneWasLoaded(int buildIndex, string sceneName) { if (sceneName != "Main") { MelonLogger.Msg("Scene '" + sceneName + "' detected. Product Manager is disabled in non-gameplay scenes."); isInitialized = false; } else { MelonCoroutines.Start(InitializeMod()); } } private IEnumerator InitializeMod() { yield return (object)new WaitForSeconds(1f); try { try { ModSettingsEvents.OnPreferencesSaved += HandleSettingsUpdate; MelonLogger.Msg("Successfully subscribed to Mod Manager save event."); } catch (Exception ex3) { Exception ex2 = ex3; MelonLogger.Warning("Could not subscribe to Mod Manager event: " + ex2.Message); } MelonPreferences_Category category = MelonPreferences.CreateCategory("PForProduct", "P For Product Config"); toggleKeyEntry = category.CreateEntry<KeyCode>("Keybind", (KeyCode)112, "Keybind", (string)null, false, false, (ValueValidator)null, (string)null); toggleKey = toggleKeyEntry.Value; MelonLogger.Msg("P For Product Mod ready in Main Scene."); isInitialized = true; } catch (Exception ex) { MelonLogger.Error("Error initializing P For Product: " + ex.Message); } } private void HandleSettingsUpdate() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) try { toggleKey = toggleKeyEntry.Value; MelonLogger.Msg($"Keybind for PForProduct updated to: {toggleKey}"); } catch (Exception ex) { MelonLogger.Error("Error handling settings update: " + ex.Message); } } public override void OnUpdate() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) if (isInitialized) { Scene activeScene = SceneManager.GetActiveScene(); if (!(((Scene)(ref activeScene)).name != "Main") && Input.GetKeyDown(toggleKey)) { Toggle(); } } } private void Toggle() { try { GameplayMenu val = Object.FindObjectOfType<GameplayMenu>(); ProductManagerApp val2 = Object.FindObjectOfType<ProductManagerApp>(); Phone val3 = Object.FindObjectOfType<Phone>(); GameObject val4 = GameObject.Find("ModSettingsApp"); if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null) { MelonLogger.Warning("One or more required UI components were not found."); return; } if ((Object)(object)val4 != (Object)null && val4.activeSelf) { MelonLogger.Msg("Closing Mod Manager App."); val4.SetActive(false); } if (val.IsOpen) { if ((Object)(object)Phone.ActiveApp == (Object)(object)((Component)val2).gameObject) { MelonLogger.Msg("Closing the phone."); val.SetIsOpen(false); } else { MelonLogger.Msg("Switching to the Product Manager App."); val3.closeApps(); ((App<ProductManagerApp>)(object)val2).SetOpen(true); } } else { MelonLogger.Msg("Opening the phone with the Product Manager App."); val3.closeApps(); val.SetIsOpen(true); ((App<ProductManagerApp>)(object)val2).SetOpen(true); } } catch (Exception ex) { MelonLogger.Error("Error toggling Product Manager: " + ex.Message); } } public override void OnDeinitializeMelon() { GameplayMenu val = Object.FindObjectOfType<GameplayMenu>(); if ((Object)(object)val != (Object)null && val.IsOpen) { val.SetIsOpen(false); } try { ModSettingsEvents.OnPreferencesSaved -= HandleSettingsUpdate; MelonLogger.Msg("Unsubscribed from Mod Manager save event."); } catch { } } }