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