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 2 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; } } }