Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of BetterFlashlight v1.0.0
BetterFlashlight.dll
Decompiled a month agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BetterFlashlight; using HarmonyLib; using Il2CppScheduleOne.UI.Phone; using Il2CppSystem.IO; using MelonLoader; using MelonLoader.Utils; using Newtonsoft.Json; 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: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace BetterFlashlight; 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; } string text = File.ReadAllText(ConfigPath); MelonLogger.Msg("JSON lu : " + text); return JsonConvert.DeserializeObject<FlashlightConfig>(text); } public static void SaveConfig(FlashlightConfig config) { try { string text = JsonConvert.SerializeObject((object)config, (Formatting)1); File.WriteAllText(ConfigPath, text); } catch (Exception ex) { MelonLogger.Error("Failed to save config: " + ex.Message); } } } 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_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00de: 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.green; MelonLogger.Warning("[Better Flashlight] Erreur de parsing de la couleur. Couleur verte par défaut appliquée."); } if ((Object)(object)Camera.main != (Object)null) { val.transform.SetParent(((Component)Camera.main).transform); val.transform.localPosition = new Vector3(0f, -0.1f, 0.5f); val.transform.localRotation = Quaternion.identity; } } public static void SetState(bool on) { if ((Object)(object)_customLight != (Object)null) { ((Behaviour)_customLight).enabled = on; } } } 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), "Update")] public class FlashlightUpdatePatch { private static bool lastState; [HarmonyPostfix] public static void Postfix(Phone __instance) { if ((Object)(object)__instance == (Object)null) { return; } bool flashlightOn = __instance.FlashlightOn; if (flashlightOn != lastState) { lastState = flashlightOn; MelonLogger.Msg($"[BetterFlashlight] Flashlight state changed to: {flashlightOn}"); CustomFlashlight.SetState(flashlightOn); if ((Object)(object)__instance.PhoneFlashlight != (Object)null) { __instance.PhoneFlashlight.SetActive(false); } } } } 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 && (Object)(object)((Component)Camera.main).GetComponent<Camera>() != (Object)null) { CustomFlashlight.Init(); flashlightInitialized = true; } } }