Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of BetterFlashlightMono v1.0.0
BetterFlashlight.dll
Decompiled 11 months agousing System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BetterFlashlight; using HarmonyLib; using MelonLoader; using MelonLoader.Utils; using Newtonsoft.Json; using ScheduleOne.UI.Phone; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Main), "Better Flashlight", "1.0.0", "LAKHLEF Mehdi", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("BetterFlashlight")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BetterFlashlight")] [assembly: AssemblyTitle("BetterFlashlight")] [assembly: AssemblyVersion("1.0.0.0")] public static class ConfigManager { public static string ConfigPath = Path.Combine(MelonEnvironment.UserDataDirectory, "flashlight_config.json"); public static FlashlightConfig LoadConfig() { if (!File.Exists(ConfigPath)) { FlashlightConfig flashlightConfig = FlashlightConfig.Default(); SaveConfig(flashlightConfig); return flashlightConfig; } return JsonConvert.DeserializeObject<FlashlightConfig>(File.ReadAllText(ConfigPath)); } public static void SaveConfig(FlashlightConfig config) { string contents = JsonConvert.SerializeObject((object)config, (Formatting)1); File.WriteAllText(ConfigPath, contents); } } public class FlashlightConfig { public float Range = 20f; public float Intensity = 5f; public float SpotAngle = 70f; public string LightColor = "#00FFFF"; public static FlashlightConfig Default() { return new FlashlightConfig(); } } public static class CustomFlashlight { private static Light _customLight; public static void Init() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) FlashlightConfig flashlightConfig = ConfigManager.LoadConfig(); GameObject val = new GameObject("ModdedFlashlight"); _customLight = val.AddComponent<Light>(); _customLight.type = (LightType)0; _customLight.range = flashlightConfig.Range; _customLight.intensity = flashlightConfig.Intensity; _customLight.spotAngle = flashlightConfig.SpotAngle; ((Behaviour)_customLight).enabled = false; Color color = default(Color); if (ColorUtility.TryParseHtmlString(flashlightConfig.LightColor, ref color)) { _customLight.color = color; } else { _customLight.color = Color.cyan; MelonLogger.Msg("Échec de la conversion, couleur par défaut (cyan) appliquée."); } Camera main = Camera.main; if ((Object)(object)main != (Object)null) { val.transform.SetParent(((Component)main).transform); val.transform.localPosition = new Vector3(0f, 0f, 0.5f); val.transform.localRotation = Quaternion.identity; } } public static void SetState(bool on) { if ((Object)(object)_customLight != (Object)null) { ((Behaviour)_customLight).enabled = on; } } } namespace BetterFlashlight; public class FlashlightConfig { public string LightColor = "#00FF00"; public float Intensity = 3f; public float Range = 30f; public float SpotAngle = 100f; public static FlashlightConfig Default() { return new FlashlightConfig(); } } [HarmonyPatch(typeof(Phone), "ToggleFlashlight")] public class FlashlightPatch { [HarmonyPostfix] public static void Postfix(Phone __instance) { CustomFlashlight.SetState(__instance.FlashlightOn); } } public class Main : MelonMod { private bool flashlightInitialized; public override void OnInitializeMelon() { MelonLogger.Msg("Mod BetterFlashlight loaded !"); } public override void OnUpdate() { if (!flashlightInitialized && (Object)(object)Camera.main != (Object)null) { CustomFlashlight.Init(); flashlightInitialized = true; } } }