Bonelab mods are targeting MelonLoader version 0.5.7. Newer versions will not work!, so double-check your MelonLoader version if you're having issues.
Decompiled source of LabCam v1.0.0
Mods/LabCam.dll
Decompiled 5 months agousing System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BoneLib; using BoneLib.BoneMenu; using BoneLib.BoneMenu.Elements; using LabCam; using LabCam.Melon; using LabCam.Menu; using LabCam.Resources; using LabCam.Scripts; using MelonLoader; using MelonLoader.Preferences; using SLZ.SFX; using SLZ.VRMK; using UnhollowerBaseLib; using UnityEngine; using UnityEngine.Experimental.Rendering; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Take pictures with a physical camera that save to a file!")] [assembly: AssemblyDescription("Take pictures with a physical camera that save to a file!")] [assembly: AssemblyCompany("Weather Electric")] [assembly: AssemblyProduct("LabCam")] [assembly: AssemblyCopyright("Developed by SoulWithMae")] [assembly: AssemblyTrademark("Weather Electric")] [assembly: AssemblyFileVersion("1.0.0")] [assembly: MelonInfo(typeof(Main), "LabCam", "1.0.0", "SoulWithMae", "https://bonelab.thunderstore.io/package/SoulWithMae/LabCam/")] [assembly: MelonColor(ConsoleColor.White)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace LabCam { public class Main : MelonMod { internal const string Name = "LabCam"; internal const string Description = "Take pictures with a physical camera that save to a file!"; internal const string Author = "SoulWithMae"; internal const string Company = "Weather Electric"; internal const string Version = "1.0.0"; internal const string DownloadLink = "https://bonelab.thunderstore.io/package/SoulWithMae/LabCam/"; internal static string CurrentMap; internal static Assembly CurrAsm => Assembly.GetExecutingAssembly(); public override void OnInitializeMelon() { ModConsole.Setup(((MelonBase)this).LoggerInstance); Preferences.Setup(); BoneMenu.Setup(); UserData.Setup(); Assets.Load(); Hooking.OnLevelInitialized += OnLevelLoad; } private static void OnLevelLoad(LevelInfo levelInfo) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) CurrentMap = levelInfo.title.Replace(" ", ""); } } } namespace LabCam.Scripts { [RegisterTypeInIl2Cpp] public class LabCamera : MonoBehaviour { public static LabCamera Instance; private Camera _camera; private AudioSource _captureSound; private MeshRenderer _previewRenderer; private GameObject _flashRenderer; private bool _flash; private GameObject _light; private PlayerAvatarArt _avatarArt; private void Awake() { Instance = this; } private void Start() { AssignFields(); SetQuality(); SetMixers(); } private void SetMixers() { ImpactSFX component = ((Component)this).GetComponent<ImpactSFX>(); if ((Object)(object)component != (Object)null) { component.outputMixer = Audio.SFXMixer; } if ((Object)(object)_captureSound != (Object)null) { _captureSound.outputAudioMixerGroup = Audio.SFXMixer; } } private void AssignFields() { _camera = ((Component)((Component)this).transform.Find("Camera")).GetComponent<Camera>(); _captureSound = ((Component)((Component)this).transform.Find("CaptureSound")).GetComponent<AudioSource>(); _previewRenderer = ((Component)((Component)this).transform.Find("LensPreview")).GetComponent<MeshRenderer>(); _flashRenderer = ((Component)((Component)this).transform.Find("FlashWarning")).gameObject; _light = ((Component)((Component)this).transform.Find("Flash")).gameObject; _avatarArt = ((Component)Player.rigManager).gameObject.GetComponent<PlayerAvatarArt>(); } public void SetQuality() { switch (Preferences.Quality.Value) { case ImageQuality.Low: _camera.targetTexture = Assets.RenderTextures.LowQuality; ((Renderer)_previewRenderer).material = Assets.Materials.LowQuality; break; case ImageQuality.Medium: _camera.targetTexture = Assets.RenderTextures.MediumQuality; ((Renderer)_previewRenderer).material = Assets.Materials.MediumQuality; break; case ImageQuality.High: _camera.targetTexture = Assets.RenderTextures.HighQuality; ((Renderer)_previewRenderer).material = Assets.Materials.HighQuality; break; default: ModConsole.Error("Invalid quality setting!"); break; } } public void ToggleFlash() { _flash = !_flash; _flashRenderer.SetActive(_flash); } public void Capture() { if ((Object)(object)_camera == (Object)null || (Object)(object)_camera.targetTexture == (Object)null) { ModConsole.Error("Camera, render texture, or both are/is null!"); return; } _captureSound.Play(); SetHairMeshes(state: true); SetQuagmire(state: false); if (_flash) { _light.SetActive(true); } SaveRenderedImage(Render()); SetHairMeshes(state: false); SetQuagmire(state: true); if (_flash) { ((MonoBehaviour)this).Invoke("LightDisable", 0.3f); } } private static void SaveRenderedImage(Texture2D image) { string path; byte[] bytes; if (Preferences.Quality.Value == ImageQuality.Low) { path = Path.Combine(UserData.ModPath, $"BONELAB_{Main.CurrentMap}_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.jpg"); bytes = Il2CppArrayBase<byte>.op_Implicit((Il2CppArrayBase<byte>)(object)ImageConversion.EncodeToJPG(image)); } else { path = Path.Combine(UserData.ModPath, $"BONELAB_{Main.CurrentMap}_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png"); bytes = Il2CppArrayBase<byte>.op_Implicit((Il2CppArrayBase<byte>)(object)ImageConversion.EncodeToPNG(image)); } File.WriteAllBytes(path, bytes); Object.Destroy((Object)(object)image); } private Texture2D Render() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown RenderTexture targetTexture = _camera.targetTexture; Texture2D val = new Texture2D(targetTexture.width, targetTexture.height, targetTexture.graphicsFormat, ((Texture)targetTexture).mipmapCount, (TextureCreationFlags)0); _camera.Render(); RenderTexture.active = targetTexture; val.ReadPixels(new Rect(0f, 0f, (float)targetTexture.width, (float)targetTexture.height), 0, 0); return val; } private void LightDisable() { _light.SetActive(false); } private void SetHairMeshes(bool state) { if (!((Object)(object)_avatarArt == (Object)null)) { if (state) { _avatarArt.EnableHair(); } else { _avatarArt.DisableHair(); } } } private static void SetQuagmire(bool state) { if (!((Object)(object)Quagmire.Instance == (Object)null)) { Quagmire.Instance.giggity.SetActive(state); Quagmire.Instance.giggityPreview.SetActive(state); } } private void OnDestroy() { Instance = null; } public LabCamera(IntPtr ptr) : base(ptr) { } } [RegisterTypeInIl2Cpp] public class Quagmire : MonoBehaviour { public static Quagmire Instance; public GameObject giggity; public GameObject giggityPreview; public MeshRenderer giggityRenderer; public AudioSource giggityAudio; private void Awake() { Instance = this; } private void Start() { SetFields(); SetQuality(); } private void SetFields() { giggity = ((Component)((Component)this).transform.Find("Scale")).gameObject; giggityPreview = ((Component)((Component)this).transform.Find("Preview")).gameObject; giggityRenderer = giggityPreview.GetComponent<MeshRenderer>(); giggityAudio = ((Component)((Component)this).transform.Find("TriggerSound")).GetComponent<AudioSource>(); } public void SetQuality() { switch (Preferences.Quality.Value) { case ImageQuality.Low: ((Renderer)giggityRenderer).material = Assets.Materials.LowQuality; break; case ImageQuality.Medium: ((Renderer)giggityRenderer).material = Assets.Materials.MediumQuality; break; case ImageQuality.High: ((Renderer)giggityRenderer).material = Assets.Materials.HighQuality; break; default: ModConsole.Error("Invalid quality setting!"); break; } } public void SendCapture() { if (!((Object)(object)LabCamera.Instance == (Object)null)) { giggityAudio.Play(); LabCamera.Instance.Capture(); } } private void OnDestroy() { Instance = null; } public Quagmire(IntPtr ptr) : base(ptr) { } } } namespace LabCam.Resources { internal static class Assets { internal static class Prefabs { public static GameObject CameraPrefab; public static GameObject TriggerPrefab; internal static void LoadPrefabs() { if (!((Object)(object)_assetBundle == (Object)null)) { if ((Object)(object)CameraPrefab == (Object)null) { CameraPrefab = HelperMethods.LoadPersistentAsset<GameObject>(_assetBundle, "Assets/LabCam/LabCam.prefab"); } if ((Object)(object)TriggerPrefab == (Object)null) { TriggerPrefab = HelperMethods.LoadPersistentAsset<GameObject>(_assetBundle, "Assets/LabCam/RemoteTrigger.prefab"); } } } } internal static class RenderTextures { public static RenderTexture HighQuality; public static RenderTexture MediumQuality; public static RenderTexture LowQuality; internal static void LoadRenderTextures() { if (!((Object)(object)_assetBundle == (Object)null)) { if ((Object)(object)HighQuality == (Object)null) { HighQuality = HelperMethods.LoadPersistentAsset<RenderTexture>(_assetBundle, "Assets/LabCam/HighQuality.renderTexture"); } if ((Object)(object)MediumQuality == (Object)null) { MediumQuality = HelperMethods.LoadPersistentAsset<RenderTexture>(_assetBundle, "Assets/LabCam/MediumQuality.renderTexture"); } if ((Object)(object)LowQuality == (Object)null) { LowQuality = HelperMethods.LoadPersistentAsset<RenderTexture>(_assetBundle, "Assets/LabCam/LowQuality.renderTexture"); } } } } internal static class Materials { public static Material HighQuality; public static Material MediumQuality; public static Material LowQuality; internal static void LoadMaterials() { if (!((Object)(object)_assetBundle == (Object)null)) { if ((Object)(object)HighQuality == (Object)null) { HighQuality = HelperMethods.LoadPersistentAsset<Material>(_assetBundle, "Assets/LabCam/Materials/HighQualityPreview.mat"); } if ((Object)(object)MediumQuality == (Object)null) { MediumQuality = HelperMethods.LoadPersistentAsset<Material>(_assetBundle, "Assets/LabCam/Materials/MediumQualityPreview.mat"); } if ((Object)(object)LowQuality == (Object)null) { LowQuality = HelperMethods.LoadPersistentAsset<Material>(_assetBundle, "Assets/LabCam/Materials/LowQualityPreview.mat"); } } } } private static AssetBundle _assetBundle; public static void Load() { _assetBundle = HelperMethods.LoadEmbeddedAssetBundle(Main.CurrAsm, HelperMethods.IsAndroid() ? "LabCam.Resources.Android.bundle" : "LabCam.Resources.Windows.bundle"); if (!((Object)(object)_assetBundle == (Object)null)) { Prefabs.LoadPrefabs(); RenderTextures.LoadRenderTextures(); Materials.LoadMaterials(); } } } } namespace LabCam.Melon { internal static class ModConsole { private static Instance _logger; public static void Setup(Instance loggerInstance) { _logger = loggerInstance; } public static void Msg(object obj, int loggingMode = 0) { string text = ((loggingMode == 1) ? $"[DEBUG] {obj}" : obj.ToString()); ConsoleColor consoleColor = ((loggingMode == 1) ? ConsoleColor.Yellow : ConsoleColor.Gray); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Msg(consoleColor, text); } } public static void Msg(string txt, int loggingMode = 0) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); ConsoleColor consoleColor = ((loggingMode == 1) ? ConsoleColor.Yellow : ConsoleColor.Gray); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Msg(consoleColor, text); } } public static void Msg(ConsoleColor txtcolor, object obj, int loggingMode = 0) { string text = ((loggingMode == 1) ? $"[DEBUG] {obj}" : obj.ToString()); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Msg(txtcolor, text); } } public static void Msg(ConsoleColor txtcolor, string txt, int loggingMode = 0) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Msg(txtcolor, text); } } public static void Msg(string txt, int loggingMode = 0, params object[] args) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); ConsoleColor consoleColor = ((loggingMode == 1) ? ConsoleColor.Yellow : ConsoleColor.Gray); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Msg(consoleColor, text, args); } } public static void Msg(ConsoleColor txtcolor, string txt, int loggingMode = 0, params object[] args) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Msg(txtcolor, text, args); } } public static void Error(object obj, int loggingMode = 0) { string text = ((loggingMode == 1) ? $"[DEBUG] {obj}" : obj.ToString()); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Error(text); } } public static void Error(string txt, int loggingMode = 0) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Error(text); } } public static void Error(string txt, int loggingMode = 0, params object[] args) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Error(text, args); } } public static void Warning(object obj, int loggingMode = 0) { string text = ((loggingMode == 1) ? $"[DEBUG] {obj}" : obj.ToString()); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Warning(text); } } public static void Warning(string txt, int loggingMode = 0) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Warning(text); } } public static void Warning(string txt, int loggingMode = 0, params object[] args) { string text = ((loggingMode == 1) ? ("[DEBUG] " + txt) : txt); if (Preferences.LoggingMode.Value >= loggingMode) { _logger.Warning(text, args); } } } internal static class Preferences { public static readonly MelonPreferences_Category GlobalCategory = MelonPreferences.CreateCategory("Global"); public static readonly MelonPreferences_Category OwnCategory = MelonPreferences.CreateCategory("LabCam"); public static MelonPreferences_Entry<int> LoggingMode { get; set; } public static MelonPreferences_Entry<ImageQuality> Quality { get; set; } public static void Setup() { LoggingMode = GlobalCategory.GetEntry<int>("LoggingMode") ?? GlobalCategory.CreateEntry<int>("LoggingMode", 0, "Logging Mode", "The level of logging to use. 0 = Important Only, 1 = All", false, false, (ValueValidator)null, (string)null); GlobalCategory.SetFilePath(MelonUtils.UserDataDirectory + "/WeatherElectric.cfg"); GlobalCategory.SaveToFile(false); Quality = OwnCategory.CreateEntry<ImageQuality>("ImageQuality", (!HelperMethods.IsAndroid()) ? ImageQuality.High : ImageQuality.Low, "Image Quality", "The quality of the images taken. Low = 480p, Medium = 720p, High = 1080p", false, false, (ValueValidator)null, (string)null); OwnCategory.SetFilePath(MelonUtils.UserDataDirectory + "/WeatherElectric.cfg"); OwnCategory.SaveToFile(false); ModConsole.Msg("Finished preferences setup for LabCam", 1); } } internal enum ImageQuality { Low, Medium, High } internal static class UserData { private static readonly string WeatherElectricPath = Path.Combine(MelonUtils.UserDataDirectory, "Weather Electric"); public static readonly string ModPath = Path.Combine(MelonUtils.UserDataDirectory, "Weather Electric/LabCam"); public static void Setup() { if (!Directory.Exists(WeatherElectricPath)) { Directory.CreateDirectory(WeatherElectricPath); } if (!Directory.Exists(ModPath)) { Directory.CreateDirectory(ModPath); } } } } namespace LabCam.Menu { internal static class BoneMenu { public static void Setup() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) MenuCategory obj = MenuManager.CreateCategory("Weather Electric", "#6FBDFF").CreateCategory("LabCam", "#ffad2d"); obj.CreateEnumElement<ImageQuality>("Quality", Color.white, Preferences.Quality.Value, (Action<ImageQuality>)delegate(ImageQuality v) { Preferences.Quality.Value = v; Preferences.OwnCategory.SaveToFile(false); if ((Object)(object)LabCamera.Instance != (Object)null) { LabCamera.Instance.SetQuality(); } if ((Object)(object)Quagmire.Instance != (Object)null) { Quagmire.Instance.SetQuality(); } }); obj.CreateFunctionElement("Spawn Camera", Color.green, (Action)SpawnCam); obj.CreateFunctionElement("Despawn Camera", Color.red, (Action)DespawnCam); obj.CreateFunctionElement("Spawn Trigger", Color.green, (Action)SpawnTrigger); obj.CreateFunctionElement("Despawn Trigger", Color.red, (Action)DespawnTrigger); } private static void SpawnCam() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)LabCamera.Instance != (Object)null)) { Vector3 val = Player.playerHead.position + Player.playerHead.forward * 2f; Object.Instantiate<GameObject>(Assets.Prefabs.CameraPrefab, val, Quaternion.identity); } } private static void DespawnCam() { if (!((Object)(object)LabCamera.Instance == (Object)null)) { Object.Destroy((Object)(object)((Component)LabCamera.Instance).gameObject); } } private static void SpawnTrigger() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Quagmire.Instance != (Object)null)) { Vector3 val = Player.playerHead.position + Player.playerHead.forward * 2f; Object.Instantiate<GameObject>(Assets.Prefabs.TriggerPrefab, val, Quaternion.identity); } } private static void DespawnTrigger() { if (!((Object)(object)Quagmire.Instance == (Object)null)) { Object.Destroy((Object)(object)((Component)Quagmire.Instance).gameObject); } } } internal static class BoneMenuExtensions { public static BoolElement CreateBoolPreference(this MenuCategory category, string name, Color color, MelonPreferences_Entry<bool> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) return category.CreateBoolElement(name, color, pref.Value, (Action<bool>)delegate(bool v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static BoolElement CreateBoolPreference(this MenuCategory category, string name, string hexColor, MelonPreferences_Entry<bool> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { return category.CreateBoolElement(name, hexColor, pref.Value, (Action<bool>)delegate(bool v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static BoolElement CreateBoolPreference(this SubPanelElement category, string name, Color color, MelonPreferences_Entry<bool> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) return category.CreateBoolElement(name, color, pref.Value, (Action<bool>)delegate(bool v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static BoolElement CreateBoolPreference(this SubPanelElement category, string name, string hexColor, MelonPreferences_Entry<bool> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { return category.CreateBoolElement(name, hexColor, pref.Value, (Action<bool>)delegate(bool v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static FloatElement CreateFloatPreference(this MenuCategory category, string name, Color color, float increment, float min, float max, MelonPreferences_Entry<float> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) return category.CreateFloatElement(name, color, pref.Value, increment, min, max, (Action<float>)delegate(float v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static FloatElement CreateFloatPreference(this MenuCategory category, string name, string hexColor, float increment, float min, float max, MelonPreferences_Entry<float> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { return category.CreateFloatElement(name, hexColor, pref.Value, increment, min, max, (Action<float>)delegate(float v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static FloatElement CreateFloatPreference(this SubPanelElement category, string name, Color color, float increment, float min, float max, MelonPreferences_Entry<float> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) return category.CreateFloatElement(name, color, pref.Value, increment, min, max, (Action<float>)delegate(float v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static FloatElement CreateFloatPreference(this SubPanelElement category, string name, string hexColor, float increment, float min, float max, MelonPreferences_Entry<float> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { return category.CreateFloatElement(name, hexColor, pref.Value, increment, min, max, (Action<float>)delegate(float v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static IntElement CreateIntPreference(this MenuCategory category, string name, Color color, int increment, int min, int max, MelonPreferences_Entry<int> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) return category.CreateIntElement(name, color, pref.Value, increment, min, max, (Action<int>)delegate(int v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static IntElement CreateIntPreference(this MenuCategory category, string name, string hexColor, int increment, int min, int max, MelonPreferences_Entry<int> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { return category.CreateIntElement(name, hexColor, pref.Value, increment, min, max, (Action<int>)delegate(int v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static IntElement CreateIntPreference(this SubPanelElement category, string name, Color color, int increment, int min, int max, MelonPreferences_Entry<int> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) return category.CreateIntElement(name, color, pref.Value, increment, min, max, (Action<int>)delegate(int v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static IntElement CreateIntPreference(this SubPanelElement category, string name, string hexColor, int increment, int min, int max, MelonPreferences_Entry<int> pref, MelonPreferences_Category prefCategory, bool autoSave = true) { return category.CreateIntElement(name, hexColor, pref.Value, increment, min, max, (Action<int>)delegate(int v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static EnumElement<TEnum> CreateEnumPreference<TEnum>(this MenuCategory category, string name, Color color, MelonPreferences_Entry<TEnum> pref, MelonPreferences_Category prefCategory, bool autoSave = true) where TEnum : Enum { //IL_001f: Unknown result type (might be due to invalid IL or missing references) return category.CreateEnumElement<TEnum>(name, color, pref.Value, (Action<TEnum>)delegate(TEnum v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static EnumElement<TEnum> CreateEnumPreference<TEnum>(this MenuCategory category, string name, string hexColor, MelonPreferences_Entry<TEnum> pref, MelonPreferences_Category prefCategory, bool autoSave = true) where TEnum : Enum { return category.CreateEnumElement<TEnum>(name, hexColor, pref.Value, (Action<TEnum>)delegate(TEnum v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static EnumElement<TEnum> CreateEnumPreference<TEnum>(this SubPanelElement category, string name, Color color, MelonPreferences_Entry<TEnum> pref, MelonPreferences_Category prefCategory, bool autoSave = true) where TEnum : Enum { //IL_001f: Unknown result type (might be due to invalid IL or missing references) return category.CreateEnumElement<TEnum>(name, color, pref.Value, (Action<TEnum>)delegate(TEnum v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } public static EnumElement<TEnum> CreateEnumPreference<TEnum>(this SubPanelElement category, string name, string hexColor, MelonPreferences_Entry<TEnum> pref, MelonPreferences_Category prefCategory, bool autoSave = true) where TEnum : Enum { return category.CreateEnumElement<TEnum>(name, hexColor, pref.Value, (Action<TEnum>)delegate(TEnum v) { pref.Value = v; if (autoSave) { prefCategory.SaveToFile(false); } }); } } }