Decompiled source of Risk Of Options v2.8.2
plugins/RiskOfOptions/RiskOfOptions.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using JetBrains.Annotations; using LeTai.Asset.TranslucentImage; using Microsoft.CodeAnalysis; using MonoMod.RuntimeDetour; using RiskOfOptions.Components.AssetResolution; using RiskOfOptions.Components.AssetResolution.Data; using RiskOfOptions.Components.ColorPicker; using RiskOfOptions.Components.Misc; using RiskOfOptions.Components.Options; using RiskOfOptions.Components.Panel; using RiskOfOptions.Components.RuntimePrefabs; using RiskOfOptions.Containers; using RiskOfOptions.Lib; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RiskOfOptions.Resources; using RiskOfOptions.Utils; using RoR2; using RoR2.UI; using RoR2.UI.SkinControllers; using TMPro; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.TextCore; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Rune580")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.8.2.0")] [assembly: AssemblyInformationalVersion("2.8.2+0fc745670dc15a3da9295e4b4dfc23f9c20009fe")] [assembly: AssemblyProduct("RiskOfOptions")] [assembly: AssemblyTitle("RiskOfOptions")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Rune580/RiskOfOptions")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace RiskOfOptions { internal static class ExtensionMethods { internal static ModMetaData GetModMetaData(this Assembly assembly) { ModMetaData result = default(ModMetaData); Type[] exportedTypes = assembly.GetExportedTypes(); for (int i = 0; i < exportedTypes.Length; i++) { BepInPlugin customAttribute = ((MemberInfo)exportedTypes[i]).GetCustomAttribute<BepInPlugin>(); if (customAttribute != null) { result.Guid = customAttribute.GUID; result.Name = customAttribute.Name; } } return result; } internal static float Remap(this float value, float fromMin, float fromMax, float toMin, float toMax) { float num = value - fromMin; float num2 = fromMax - fromMin; float num3 = num / num2; return Mathf.Clamp((toMax - toMin) * num3 + toMin, toMin, toMax); } internal static T GetCopyOf<T>(this Component comp, T other) where T : Component { Type type = ((object)comp).GetType(); if (type != ((object)other).GetType()) { return default(T); } BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanWrite) { try { propertyInfo.SetValue(comp, propertyInfo.GetValue(other, null), null); } catch { } } } FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { fieldInfo.SetValue(comp, fieldInfo.GetValue(other)); } return (T)(object)((comp is T) ? comp : null); } internal static T AddComponent<T>(this GameObject go, T toAdd) where T : Component { return ((Component)(object)go.AddComponent<T>()).GetCopyOf(toAdd); } internal static T GetOrAddComponent<T>(this GameObject gameObject) where T : Component { T val = gameObject.GetComponent<T>(); if (!Object.op_Implicit((Object)(object)val)) { val = gameObject.AddComponent<T>(); } return val; } internal static bool CloseEnough(Vector2 a, Vector2 b) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (Mathf.Abs(a.x - b.x) < 0.0001f) { return Mathf.Abs(a.y - b.y) < 0.0001f; } return false; } internal static bool CloseEnough(Color a, Color b) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) if (Mathf.Abs(a.r - b.r) < 0.0001f && Mathf.Abs(a.g - b.g) < 0.0001f && Mathf.Abs(a.b - b.b) < 0.0001f) { return Mathf.Abs(a.a - b.a) < 0.0001f; } return false; } internal static bool CloseEnough(Color[] a, Color b) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < a.Length; i++) { _ = ref a[i]; if (!CloseEnough(a[i], b)) { return false; } } return true; } internal static Vector2 SmoothStep(Vector2 a, Vector2 b, float t) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_0038: Unknown result type (might be due to invalid IL or missing references) Vector2 zero = Vector2.zero; zero.x = Mathf.SmoothStep(a.x, b.x, t); zero.y = Mathf.SmoothStep(a.y, b.y, t); return zero; } internal static double Abs(double num) { if (!(num < 0.0)) { return num; } return -1.0 * num; } internal static double RoundUpToDecimalPlace(this double num, int place) { float num2 = Mathf.Pow(10f, (float)place); num2 = ((num2 == 0f) ? 1f : num2); return Mathf.Ceil((float)num * num2) / num2; } } public static class KeyboardShortcutExtensions { public static bool IsPressedInclusive(this KeyboardShortcut key) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) bool flag = ((KeyboardShortcut)(ref key)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); return Input.GetKey(((KeyboardShortcut)(ref key)).MainKey) && flag; } } internal static class LanguageTokens { public static readonly string OptionRebindDialogTitle = "RISK_OF_OPTIONS".ToUpper() + "_OPTION_REBIND_DIALOG_TITLE_TOKEN"; public static readonly string OptionRebindDialogDescription = "RISK_OF_OPTIONS".ToUpper() + "_OPTION_REBIND_DIALOG_DESCRIPTION_TOKEN"; public static readonly string LeftPageButton = "RISK_OF_OPTIONS".ToUpper() + "_LEFT_PAGE_BUTTON_TEXT_TOKEN;"; public static readonly string RightPageButton = "RISK_OF_OPTIONS".ToUpper() + "_RIGHT_PAGE_BUTTON_TEXT_TOKEN;"; public const string HeaderToken = "RISK_OF_OPTIONS_MOD_OPTIONS_HEADER_BUTTON_TEXT"; public const string NoModsHeaderToken = "RISK_OF_OPTIONS_NO_MODS_HEADER_TEXT"; public const string NoModsDescriptionToken = "RISK_OF_OPTIONS_NO_MODS_DESCRIPTION_TEXT"; public const string ModsHeaderToken = "RISK_OF_OPTIONS_MODS_HEADER_TEXT"; public const string ModsDescriptionToken = "RISK_OF_OPTIONS_DESCRIPTION_TEXT"; public const string DialogButtonToken = "RISK_OF_OPTIONS_NO_MODS_BUTTON_TEXT"; public static void Register() { LanguageApi.Add(OptionRebindDialogTitle, "Rebind Control..."); LanguageApi.Add(LeftPageButton, "<"); LanguageApi.Add(RightPageButton, ">"); LanguageApi.Add("RISK_OF_OPTIONS_NO_MODS_HEADER_TEXT", "No Supported Mods Installed"); LanguageApi.Add("RISK_OF_OPTIONS_NO_MODS_DESCRIPTION_TEXT", "No mods implementing RiskOfOptions found.\nThis mod doesn't do anything if you don't have any mods installed that supports RiskOfOptions.\nThis won't show again."); LanguageApi.Add("RISK_OF_OPTIONS_MODS_HEADER_TEXT", "You can configure your mods in game!"); LanguageApi.Add("RISK_OF_OPTIONS_DESCRIPTION_TEXT", "Mods with support for RiskOfOptions found!\nYou can configure them in the \"MOD OPTIONS\" panel.\nThis won't show again"); LanguageApi.Add("RISK_OF_OPTIONS_NO_MODS_BUTTON_TEXT", "Ok"); } } public static class ModSettingsManager { private static Hook _pauseHook; internal static readonly ModIndexedOptionCollection OptionCollection = new ModIndexedOptionCollection(); internal const string StartingText = "RISK_OF_OPTIONS"; internal const int StartingTextLength = 15; internal static bool disablePause = false; internal static readonly List<string> RestartRequiredOptions = new List<string>(); internal static void Init() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown LanguageApi.Init(); Assets.LoadAssets(); Prefabs.Init(); LanguageTokens.Register(); SettingsModifier.Init(); MethodInfo? method = typeof(PauseManager).GetMethod("CCTogglePause", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo method2 = typeof(ModSettingsManager).GetMethod("PauseManagerOnCCTogglePause", BindingFlags.Static | BindingFlags.NonPublic); _pauseHook = new Hook((MethodBase)method, method2); } private static void PauseManagerOnCCTogglePause(Action<ConCommandArgs> orig, ConCommandArgs args) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (!disablePause) { orig(args); } } public static void SetModDescription(string description) { ModMetaData modMetaData = Assembly.GetCallingAssembly().GetModMetaData(); SetModDescription(description, modMetaData.Guid, modMetaData.Name); } public static void SetModDescription(string description, string modGuid, string modName) { EnsureContainerExists(modGuid, modName); OptionCollection[modGuid].SetDescriptionText(description); } public static void SetModDescriptionToken(string descriptionToken) { ModMetaData modMetaData = Assembly.GetCallingAssembly().GetModMetaData(); SetModDescriptionToken(descriptionToken, modMetaData.Guid, modMetaData.Name); } public static void SetModDescriptionToken(string descriptionToken, string modGuid, string modName) { EnsureContainerExists(modGuid, modName); OptionCollection[modGuid].DescriptionToken = descriptionToken; } public static void SetModIcon(Sprite iconSprite) { ModMetaData modMetaData = Assembly.GetCallingAssembly().GetModMetaData(); SetModIcon(iconSprite, modMetaData.Guid, modMetaData.Name); } public static void SetModIcon(Sprite iconSprite, string modGuid, string modName) { EnsureContainerExists(modGuid, modName); OptionCollection[modGuid].icon = iconSprite; } public static void SetModIcon(GameObject iconPrefab) { ModMetaData modMetaData = Assembly.GetCallingAssembly().GetModMetaData(); SetModIcon(iconPrefab, modMetaData.Guid, modMetaData.Name); } public static void SetModIcon(GameObject iconPrefab, string modGuid, string modName) { EnsureContainerExists(modGuid, modName); OptionCollection[modGuid].iconPrefab = iconPrefab; } public static void AddOption(BaseOption option) { ModMetaData modMetaData = Assembly.GetCallingAssembly().GetModMetaData(); AddOption(option, modMetaData.Guid, modMetaData.Name); } public static void AddOption(BaseOption option, string modGuid, string modName) { option.SetProperties(); option.ModGuid = modGuid; option.ModName = modName; option.Identifier = (modGuid + "." + option.Category + "." + option.Name + "." + option.OptionTypeName).Replace(" ", "_").ToUpper(); option.RegisterTokens(); OptionCollection.AddOption(ref option); } private static void EnsureContainerExists(string modGuid, string modName) { if (!OptionCollection.ContainsModGuid(modGuid)) { OptionCollection[modGuid] = new OptionCollection(modName, modGuid); } } } [BepInPlugin("com.rune580.riskofoptions", "RiskOfOptions", "2.8.2")] public sealed class RiskOfOptionsPlugin : BaseUnityPlugin { internal static ConfigEntry<bool>? seenNoMods; internal static ConfigEntry<bool>? seenMods; public static ConfigEntry<DecimalSeparator>? decimalSeparator; private void Awake() { seenNoMods = ((BaseUnityPlugin)this).Config.Bind<bool>("One Time Stuff", "Has seen the no mods prompt", false, (ConfigDescription)null); seenMods = ((BaseUnityPlugin)this).Config.Bind<bool>("One Time Stuff", "Has seen the mods prompt", false, (ConfigDescription)null); decimalSeparator = ((BaseUnityPlugin)this).Config.Bind<DecimalSeparator>("Display", "DecimalSeparator", DecimalSeparator.Period, "Changes how numbers are displayed across RoO.\nPeriod: 1,000.00\nComma: 1.000,00"); ModSettingsManager.Init(); ModSettingsManager.SetModIcon(Prefabs.animatedIcon); ModSettingsManager.AddOption(new ChoiceOption((ConfigEntryBase)(object)decimalSeparator)); } } internal static class SettingsModifier { public static void Init() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) GameObject obj = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/UI/SettingsPanelTitle.prefab").WaitForCompletion(); GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/UI/SettingsPanel.prefab").WaitForCompletion(); if ((Object)(object)obj == (Object)null || (Object)(object)val == (Object)null) { throw new Exception("Couldn't initialize Risk Of Options! Continue at your own risk!"); } obj.AddComponent<ModOptionPanelController>(); val.AddComponent<ModOptionPanelController>(); LanguageApi.Add("RISK_OF_OPTIONS_MOD_OPTIONS_HEADER_BUTTON_TEXT", "MOD OPTIONS"); RuntimePrefabManager.Register<ModOptionsPanelPrefab>(); RuntimePrefabManager.Register<CheckBoxPrefab>(); RuntimePrefabManager.Register<SliderPrefab>(); RuntimePrefabManager.Register<StepSliderPrefab>(); RuntimePrefabManager.Register<IntSliderPrefab>(); RuntimePrefabManager.Register<FloatFieldPrefab>(); RuntimePrefabManager.Register<IntFieldPrefab>(); RuntimePrefabManager.Register<KeyBindPrefab>(); RuntimePrefabManager.Register<InputFieldPrefab>(); RuntimePrefabManager.Register<ChoicePrefab>(); RuntimePrefabManager.Register<GenericButtonPrefab>(); } } public static class PluginInfo { public const string PLUGIN_GUID = "com.rune580.riskofoptions"; public const string PLUGIN_NAME = "RiskOfOptions"; public const string PLUGIN_VERSION = "2.8.2"; } } namespace RiskOfOptions.Utils { public class ColorPickerUtil : MonoBehaviour { [Serializable] public class ColorChangedEvent : UnityEvent<Color> { } public RooColorHue hueController; public RooColorPicker colorPicker; public RgbaSliderController rgbaSliders; public Image preview; public TMP_InputField hexField; public string hexFormatString = "{0:X6}"; private Action<Color> _onColorSelected; private float _hue; private float _saturation; private float _value; private int _hexValue; private Color _color = Color.white; public void Awake() { ((UnityEvent<float>)hueController.onHueChanged).AddListener((UnityAction<float>)UpdateHue); ((UnityEvent<float, float>)colorPicker.onValueChanged).AddListener((UnityAction<float, float>)UpdateSatAndVal); ((UnityEvent<string>)(object)hexField.onSubmit).AddListener((UnityAction<string>)HexFieldSubmit); ((UnityEvent<string>)(object)hexField.onEndEdit).AddListener((UnityAction<string>)HexFieldSubmit); ((UnityEvent<Color>)rgbaSliders.onColorChanged).AddListener((UnityAction<Color>)SetColor); } public void SetColor(Color newColor) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) _color = newColor; float value = default(float); Color.RGBToHSV(_color, ref value, ref _saturation, ref _value); _hue = value.Remap(0f, 1f, 0f, 6.28f); _hexValue = _color.ToRGBHex(); UpdateControls(); UpdateHandles(); } private void UpdateHue(float hue) { _hue = hue; colorPicker.SetHue(_hue); UpdateColorFromHSV(); } private void UpdateSatAndVal(float saturation, float value) { _saturation = saturation; _value = value; UpdateColorFromHSV(); } private void HexFieldSubmit(string text) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) if (int.TryParse(text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var result)) { _hexValue = result; } SetColor(_color.FromRGBHex(_hexValue)); } private void UpdateColorFromHSV() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_0033: Unknown result type (might be due to invalid IL or missing references) Color color = ColorExtensions.ColorFromHSV(_hue, _saturation, _value); color.a = _color.a; _color = color; _hexValue = _color.ToRGBHex(); rgbaSliders.inPicker = true; UpdateControls(); rgbaSliders.inPicker = false; } private void UpdateHandles() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) hueController.SetHue(_hue); colorPicker.SetHue(_hue); if (_color != Color.black) { colorPicker.SetValues(_saturation, _value); } } private void UpdateControls() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) ((Graphic)preview).color = _color; hexField.text = string.Format(CultureInfo.InvariantCulture, hexFormatString, _hexValue); rgbaSliders.SetSliders(_color); } public void Accept() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) _onColorSelected(_color); Close(); } public void Close() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) RoR2Application.unscaledTimeTimers.CreateTimer(0.1f, (Action)delegate { DestroyPicker(((Component)this).gameObject); }); } private static void DestroyPicker(GameObject gameObject) { Object.DestroyImmediate((Object)(object)gameObject); } public static void OpenColorPicker(Action<Color> onColorSelected, Color currentColor) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) ColorPickerUtil component = Object.Instantiate<GameObject>(Prefabs.colorPickerOverlay).GetComponent<ColorPickerUtil>(); component._onColorSelected = onColorSelected; component.SetColor(currentColor); } } public class KeyBindUtil : MonoBehaviour { private MPEventSystem _mpEventSystem; private SimpleDialogBox _dialogBox; private Action<KeyboardShortcut> _onBind; private float _timeoutTimer; private string _keyBindName; private bool _finished; private readonly List<KeyCode> _heldKeys = new List<KeyCode>(); private readonly List<KeyCode> _keySequence = new List<KeyCode>(); public void StartListening() { if (ModSettingsManager.disablePause || _finished) { Object.DestroyImmediate((Object)(object)((Component)this).gameObject); return; } ModSettingsManager.disablePause = true; _dialogBox = SimpleDialogBox.Create(_mpEventSystem); LanguageApi.AddDelegate(LanguageTokens.OptionRebindDialogDescription, ControlRebindingHook); } public void StopListening() { //IL_005d: Unknown result type (might be due to invalid IL or missing references) _finished = true; if (Object.op_Implicit((Object)(object)_dialogBox) && Object.op_Implicit((Object)(object)_dialogBox.rootObject)) { Object.DestroyImmediate((Object)(object)_dialogBox.rootObject); _dialogBox = null; } LanguageApi.RemoveDelegate(LanguageTokens.OptionRebindDialogDescription); RoR2Application.unscaledTimeTimers.CreateTimer(0.3f, (Action)Finish); Object.Destroy((Object)(object)((Component)this).gameObject, 0.5f); } private void Update() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) if (!_finished) { _timeoutTimer -= Time.unscaledDeltaTime; ExtraKeyDown(); ExtraKeyUp(); if (_timeoutTimer < 0f || !Object.op_Implicit((Object)(object)_dialogBox)) { StopListening(); return; } _dialogBox.headerToken = new TokenParamsPair { token = LanguageTokens.OptionRebindDialogTitle, formatParams = Array.Empty<object>() }; _dialogBox.descriptionToken = new TokenParamsPair { token = LanguageTokens.OptionRebindDialogDescription, formatParams = new object[2] { LanguageTokens.OptionRebindDialogDescription, _timeoutTimer } }; } } public void OnGUI() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Invalid comparison between Unknown and I4 //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Invalid comparison between Unknown and I4 //IL_0089: Unknown result type (might be due to invalid IL or missing references) if (_finished) { return; } bool flag = !Event.current.isKey; EventType type; if (!flag) { type = Event.current.type; bool flag2 = type - 4 <= 1; flag = !flag2; } if (flag || (int)Event.current.keyCode == 0) { return; } if ((int)Event.current.keyCode == 27) { SetKeyBind((KeyCode)0); return; } type = Event.current.type; if ((int)type != 4) { if ((int)type != 5) { throw new ArgumentOutOfRangeException(); } KeyUp(Event.current.keyCode); } else { KeyDown(Event.current.keyCode); } } private void ExtraKeyDown() { if (Input.GetKeyDown((KeyCode)304)) { KeyDown((KeyCode)304); } else if (Input.GetKeyDown((KeyCode)303)) { KeyDown((KeyCode)303); } else if (Input.GetKeyDown((KeyCode)323)) { KeyDown((KeyCode)323); } else if (Input.GetKeyDown((KeyCode)324)) { KeyDown((KeyCode)324); } else if (Input.GetKeyDown((KeyCode)325)) { KeyDown((KeyCode)325); } else if (Input.GetKeyDown((KeyCode)326)) { KeyDown((KeyCode)326); } else if (Input.GetKeyDown((KeyCode)327)) { KeyDown((KeyCode)327); } } private void ExtraKeyUp() { if (Input.GetKeyUp((KeyCode)304)) { KeyUp((KeyCode)304); } else if (Input.GetKeyUp((KeyCode)303)) { KeyUp((KeyCode)303); } else if (Input.GetKeyUp((KeyCode)323)) { KeyUp((KeyCode)323); } else if (Input.GetKeyUp((KeyCode)324)) { KeyUp((KeyCode)324); } else if (Input.GetKeyUp((KeyCode)325)) { KeyUp((KeyCode)325); } else if (Input.GetKeyUp((KeyCode)326)) { KeyUp((KeyCode)326); } else if (Input.GetKeyUp((KeyCode)327)) { KeyUp((KeyCode)327); } } private void KeyDown(KeyCode keyCode) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (!_heldKeys.Contains(keyCode)) { _heldKeys.Add(keyCode); } } private void KeyUp(KeyCode keyCode) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0022: 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_00a4: 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) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected I4, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) if (!_heldKeys.Contains(keyCode)) { return; } _heldKeys.Remove(keyCode); if (_keySequence.Contains(keyCode)) { return; } _keySequence.Add(keyCode); if (_heldKeys.Count != 0) { return; } KeyboardShortcut keyBind = default(KeyboardShortcut); if (_keySequence.Count > 1) { KeyCode[] array = (KeyCode[])(object)new KeyCode[_keySequence.Count - 1]; for (int i = 0; i < array.Length; i++) { array[i] = (KeyCode)(int)_keySequence[i + 1]; } ((KeyboardShortcut)(ref keyBind))..ctor(_keySequence[0], array); } else { ((KeyboardShortcut)(ref keyBind))..ctor(_keySequence[0], Array.Empty<KeyCode>()); } SetKeyBind(keyBind); } private void SetKeyBind(KeyCode keyCode) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) SetKeyBind(new KeyboardShortcut(keyCode, Array.Empty<KeyCode>())); } private void SetKeyBind(KeyboardShortcut keyBind) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) _onBind(keyBind); StopListening(); } private string ControlRebindingHook() { int num = Mathf.RoundToInt(_timeoutTimer); return $"Press the button(s) you wish to assign for {_keyBindName}.\n{num} second(s) remaining."; } private void Finish() { ModSettingsManager.disablePause = false; } public static void StartBinding(Action<KeyboardShortcut> onBind, string keyBindName, float timeoutTimer = 5f, MPEventSystem mpEventSystem = null) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) KeyBindUtil component = new GameObject("KeyBindUtil instance", new Type[1] { typeof(KeyBindUtil) }).GetComponent<KeyBindUtil>(); component._onBind = onBind; component._timeoutTimer = timeoutTimer; component._mpEventSystem = mpEventSystem; component._keyBindName = keyBindName; component.StartListening(); } } } namespace RiskOfOptions.Resources { internal static class Assets { private static AssetBundle _mainAssetBundle; internal static T Load<T>(string asset) where T : Object { return _mainAssetBundle.LoadAsset<T>(asset); } internal static void LoadAssets() { using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("RiskOfOptions.Resources.AssetBundles.riskofoptions"); _mainAssetBundle = AssetBundle.LoadFromStream(stream); } } public static class Prefabs { private static AssetBundle _uiBundle; public static GameObject animatedIcon; public static GameObject modOptionsPanel; public static GameObject modListPanel; public static GameObject modListButton; public static GameObject modDescriptionPanel; public static GameObject modOptionDescriptionPanel; public static GameObject modOptionCategories; public static GameObject boolButton; public static GameObject sliderButton; public static GameObject stepSliderButton; public static GameObject intSliderButton; public static GameObject floatFieldButton; public static GameObject intFieldButton; public static GameObject inputFieldButton; public static GameObject colorPickerButton; public static GameObject colorPickerOverlay; internal static void Init() { _uiBundle = LoadBundle("uielements"); animatedIcon = LoadPrefab("RoO-Icon.prefab"); modOptionsPanel = LoadPrefab("Options Panel.prefab"); modListPanel = LoadPrefab("Mod List Panel.prefab"); modListButton = LoadPrefab("Mod List Button.prefab"); modDescriptionPanel = LoadPrefab("Mod Description Panel.prefab"); modOptionDescriptionPanel = LoadPrefab("Option Description Panel.prefab"); modOptionCategories = LoadPrefab("Category Headers.prefab"); boolButton = LoadPrefab("ModSettingsButton, Bool.prefab"); sliderButton = LoadPrefab("ModSettingsButton, Slider.prefab"); stepSliderButton = LoadPrefab("ModSettingsButton, Step Slider.prefab"); intSliderButton = LoadPrefab("ModSettingsButton, Int Slider.prefab"); floatFieldButton = LoadPrefab("ModSettingsButton, Float Field.prefab"); intFieldButton = LoadPrefab("ModSettingsButton, Int Field.prefab"); inputFieldButton = LoadPrefab("ModSettingsButton, InputField.prefab"); colorPickerButton = LoadPrefab("ModSettingsButton, ColorPicker.prefab"); colorPickerOverlay = LoadPrefab("Color Picker Overlay.prefab"); } private static GameObject LoadPrefab(string path) { GameObject val = _uiBundle.LoadAsset<GameObject>("assets/roo/prefabs/" + path); AssetResolver[] componentsInChildren = val.GetComponentsInChildren<AssetResolver>(); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].AttemptResolve(); } return val; } private static AssetBundle LoadBundle(string name) { using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("RiskOfOptions.Resources.AssetBundles." + name); return AssetBundle.LoadFromStream(stream); } } } namespace RiskOfOptions.Options { public abstract class BaseOption { public abstract string OptionTypeName { get; protected set; } public string Identifier { get; internal set; } public string ModGuid { get; internal set; } public string ModName { get; internal set; } public string Category { get; internal set; } public string Name { get; internal set; } public string Description { get; internal set; } internal abstract ConfigEntryBase ConfigEntry { get; } public virtual void SetCategoryName(string fallback, BaseOptionConfig config) { if (!string.IsNullOrEmpty(config.category)) { Category = config.category; } else { Category = fallback; } } public virtual void SetName(string fallback, BaseOptionConfig config) { if (!string.IsNullOrEmpty(config.name)) { Name = config.name; } else { Name = fallback; } } public virtual void SetDescription(string fallback, BaseOptionConfig config) { if (!string.IsNullOrEmpty(config.description)) { Description = config.description; } else { Description = fallback; } } internal virtual void RegisterTokens() { LanguageApi.Add(GetNameToken(), Name); LanguageApi.Add(GetDescriptionToken(), Description); } public string GetNameToken() { return ("RISK_OF_OPTIONS." + ModGuid + "." + Category + "." + Name + "." + OptionTypeName + ".name").Replace(" ", "_").ToUpper(); } public string GetDescriptionToken() { return ("RISK_OF_OPTIONS." + ModGuid + "." + Category + "." + Name + "." + OptionTypeName + ".description").Replace(" ", "_").ToUpper(); } public abstract GameObject CreateOptionGameObject(GameObject prefab, Transform parent); public abstract BaseOptionConfig GetConfig(); public override bool Equals(object obj) { if (obj == null) { return false; } if (obj is BaseOption other) { return Equals(other); } return false; } private bool Equals(BaseOption other) { return string.Equals(Identifier, other.Identifier, StringComparison.InvariantCulture); } public override int GetHashCode() { if (Identifier == null) { return 0; } return StringComparer.InvariantCulture.GetHashCode(Identifier); } protected internal virtual void SetProperties() { if (ConfigEntry != null) { BaseOptionConfig config = GetConfig(); SetCategoryName(ConfigEntry.Definition.Section, config); SetName(ConfigEntry.Definition.Key, config); SetDescription(ConfigEntry.Description.Description, config); } } } public class CheckBoxOption : BaseOption, ITypedValueHolder<bool> { protected readonly bool originalValue; private readonly ConfigEntry<bool> _configEntry; protected readonly CheckBoxConfig config; public override string OptionTypeName { get; protected set; } = "checkbox"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual bool Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public CheckBoxOption(ConfigEntry<bool> configEntry) : this(configEntry, new CheckBoxConfig()) { } public CheckBoxOption(ConfigEntry<bool> configEntry, bool restartRequired) : this(configEntry, new CheckBoxConfig { restartRequired = restartRequired }) { } public CheckBoxOption(ConfigEntry<bool> configEntry, CheckBoxConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected CheckBoxOption(CheckBoxConfig config, bool originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsBool componentInChildren = obj.GetComponentInChildren<ModSettingsBool>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; ((Object)obj).name = "Mod Option CheckBox, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { return Value != GetOriginalValue(); } public bool GetOriginalValue() { return originalValue; } } public class ChoiceOption : BaseOption, ITypedValueHolder<object> { protected readonly object originalValue; private readonly ConfigEntryBase _configEntry; protected readonly ChoiceConfig config; private string[] _nameTokens; public override string OptionTypeName { get; protected set; } = "choice"; internal override ConfigEntryBase ConfigEntry => _configEntry; public virtual object Value { get { return _configEntry.BoxedValue; } set { _configEntry.BoxedValue = Enum.Parse(_configEntry.SettingType, value.ToString()); } } public ChoiceOption(ConfigEntryBase configEntry) : this(configEntry, new ChoiceConfig()) { } public ChoiceOption(ConfigEntryBase configEntry, bool restartRequired) : this(configEntry, new ChoiceConfig { restartRequired = restartRequired }) { } public ChoiceOption(ConfigEntryBase configEntry, ChoiceConfig config) : this(config, configEntry.BoxedValue) { if (!configEntry.SettingType.IsEnum) { throw new InvalidCastException("T in configEntry<T> must be of type Enum, Type found: " + configEntry.SettingType.Name); } _configEntry = configEntry; } protected ChoiceOption(ChoiceConfig config, object originalValue) { this.originalValue = originalValue; this.config = config; } internal override void RegisterTokens() { base.RegisterTokens(); string[] names = Enum.GetNames(Value.GetType()); _nameTokens = new string[names.Length]; for (int i = 0; i < names.Length; i++) { string text = ("RISK_OF_OPTIONS." + base.ModGuid + "." + base.Category + "." + base.Name + "." + OptionTypeName + ".item." + names[i]).Replace(" ", "_").ToUpper(); _nameTokens[i] = text; LanguageApi.Add(text, names[i]); } } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); DropDownController componentInChildren = obj.GetComponentInChildren<DropDownController>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; ((Object)obj).name = "Mod Option Choice, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { return !Value.Equals(originalValue); } public object GetOriginalValue() { return originalValue; } internal string[] GetNameTokens() { return _nameTokens; } } public class ColorOption : BaseOption, ITypedValueHolder<Color> { protected readonly Color originalValue; private readonly ConfigEntry<Color> _configEntry; protected readonly ColorOptionConfig config; public override string OptionTypeName { get; protected set; } = "color"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual Color Value { get { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return _configEntry.Value; } set { //IL_0006: Unknown result type (might be due to invalid IL or missing references) _configEntry.Value = value; } } public ColorOption(ConfigEntry<Color> configEntry) : this(configEntry, new ColorOptionConfig()) { } public ColorOption(ConfigEntry<Color> configEntry, bool restartRequired) : this(configEntry, new ColorOptionConfig { restartRequired = true }) { } public ColorOption(ConfigEntry<Color> configEntry, ColorOptionConfig config) : this(config, configEntry.Value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) _configEntry = configEntry; } protected ColorOption(ColorOptionConfig config, Color originalValue) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsColor componentInChildren = obj.GetComponentInChildren<ModSettingsColor>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; ((Object)obj).name = "Mod Option Color, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) return Value != GetOriginalValue(); } public Color GetOriginalValue() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return originalValue; } } public enum DecimalSeparator { Period, Comma } public static class DecimalSeparatorExtensions { private static CultureInfo? _commaCultureInstance; private static CultureInfo CommaCulture { get { if (_commaCultureInstance == null) { _commaCultureInstance = (CultureInfo)CultureInfo.InvariantCulture.Clone(); _commaCultureInstance.NumberFormat.NumberDecimalSeparator = ","; _commaCultureInstance.NumberFormat.NumberGroupSeparator = "."; } return _commaCultureInstance; } } public static char Char(this DecimalSeparator separator) { return separator switch { DecimalSeparator.Period => '.', DecimalSeparator.Comma => ',', _ => throw new ArgumentOutOfRangeException("separator", separator, null), }; } public static CultureInfo GetCultureInfo(this DecimalSeparator separator) { return separator switch { DecimalSeparator.Period => CultureInfo.InvariantCulture, DecimalSeparator.Comma => CommaCulture, _ => throw new ArgumentOutOfRangeException("separator", separator, null), }; } } public class FloatFieldOption : BaseOption, ITypedValueHolder<float> { protected readonly float originalValue; private readonly ConfigEntry<float> _configEntry; protected readonly FloatFieldConfig config; public override string OptionTypeName { get; protected set; } = "float_field"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual float Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public FloatFieldOption(ConfigEntry<float> configEntry) : this(configEntry, new FloatFieldConfig()) { } public FloatFieldOption(ConfigEntry<float> configEntry, bool restartRequired) : this(configEntry, new FloatFieldConfig { restartRequired = restartRequired }) { } public FloatFieldOption(ConfigEntry<float> configEntry, FloatFieldConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected FloatFieldOption(FloatFieldConfig config, float originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsFloatField componentInChildren = obj.GetComponentInChildren<ModSettingsFloatField>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.min = config.Min; componentInChildren.max = config.Max; componentInChildren.formatString = config.FormatString; ((Object)componentInChildren).name = "Mod Options Float Field, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public float GetOriginalValue() { return originalValue; } public bool ValueChanged() { return Value != GetOriginalValue(); } } public class GenericButtonOption : BaseOption { internal readonly GenericButtonConfig config; internal override ConfigEntryBase ConfigEntry => null; public override string OptionTypeName { get; protected set; } = "generic_button"; public GenericButtonOption(string name, string category, UnityAction onButtonPressed) : this(name, category, "", "Open", onButtonPressed) { } public GenericButtonOption(string name, string category, string description, string buttonText, UnityAction onButtonPressed) { config = new GenericButtonConfig(name, category, description, buttonText, onButtonPressed); base.Category = category; base.Name = name; base.Description = description; } internal override void RegisterTokens() { base.RegisterTokens(); LanguageApi.Add(GetButtonLabelToken(), config.ButtonText); } public string GetButtonLabelToken() { return ("RISK_OF_OPTIONS." + base.ModGuid + "." + base.Category + "." + base.Name + "." + OptionTypeName + ".sub_button.name").Replace(" ", "_").ToUpper(); } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); GenericButtonController componentInChildren = obj.GetComponentInChildren<GenericButtonController>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.buttonToken = GetButtonLabelToken(); componentInChildren.OnButtonPressed = config.OnButtonPressed; ((Object)obj).name = "Mod Option GenericButton, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } } public class IntFieldOption : BaseOption, ITypedValueHolder<int> { protected readonly int originalValue; private readonly ConfigEntry<int> _configEntry; protected readonly IntFieldConfig config; public override string OptionTypeName { get; protected set; } = "int_field"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual int Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public IntFieldOption(ConfigEntry<int> configEntry) : this(configEntry, new IntFieldConfig()) { } public IntFieldOption(ConfigEntry<int> configEntry, bool restartRequired) : this(configEntry, new IntFieldConfig { restartRequired = restartRequired }) { } public IntFieldOption(ConfigEntry<int> configEntry, IntFieldConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected IntFieldOption(IntFieldConfig config, int originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsIntField componentInChildren = obj.GetComponentInChildren<ModSettingsIntField>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.min = config.Min; componentInChildren.max = config.Max; componentInChildren.formatString = config.FormatString; ((Object)componentInChildren).name = "Mod Options Int Field, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public int GetOriginalValue() { return originalValue; } public bool ValueChanged() { return Value != GetOriginalValue(); } } public class IntSliderOption : BaseOption, ITypedValueHolder<int> { protected readonly int originalValue; private readonly ConfigEntry<int> _configEntry; protected readonly IntSliderConfig config; public override string OptionTypeName { get; protected set; } = "int_slider"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual int Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public IntSliderOption(ConfigEntry<int> configEntry) : this(configEntry, new IntSliderConfig()) { } public IntSliderOption(ConfigEntry<int> configEntry, bool restartRequired) : this(configEntry, new IntSliderConfig { restartRequired = restartRequired }) { } public IntSliderOption(ConfigEntry<int> configEntry, IntSliderConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected IntSliderOption(IntSliderConfig config, int originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsIntSlider componentInChildren = obj.GetComponentInChildren<ModSettingsIntSlider>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.minValue = config.min; componentInChildren.maxValue = config.max; componentInChildren.formatString = config.formatString; ((Object)obj).name = "Mod Options Int Slider, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { return Value != GetOriginalValue(); } public int GetOriginalValue() { return originalValue; } } public interface ITypedValueHolder<T> { T Value { get; set; } T GetOriginalValue(); bool ValueChanged(); } public class KeyBindOption : BaseOption, ITypedValueHolder<KeyboardShortcut> { protected readonly KeyboardShortcut originalValue; private readonly ConfigEntry<KeyboardShortcut> _configEntry; protected readonly KeyBindConfig config; public override string OptionTypeName { get; protected set; } = "key_bind"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual KeyboardShortcut Value { get { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return _configEntry.Value; } set { //IL_0006: Unknown result type (might be due to invalid IL or missing references) _configEntry.Value = value; } } public KeyBindOption(ConfigEntry<KeyboardShortcut> configEntry) : this(configEntry, new KeyBindConfig()) { } public KeyBindOption(ConfigEntry<KeyboardShortcut> configEntry, bool restartRequired) : this(configEntry, new KeyBindConfig { restartRequired = restartRequired }) { } public KeyBindOption(ConfigEntry<KeyboardShortcut> configEntry, KeyBindConfig config) : this(config, configEntry.Value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) _configEntry = configEntry; } protected KeyBindOption(KeyBindConfig config, KeyboardShortcut originalValue) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00a5: Expected O, but got Unknown GameObject val = Object.Instantiate<GameObject>(prefab, parent); KeyBindController controller = val.GetComponentInChildren<KeyBindController>(); controller.nameToken = GetNameToken(); controller.settingToken = base.Identifier; ((TMP_Text)((Component)val.transform.Find("ButtonText")).GetComponent<HGTextMeshProUGUI>()).SetText(base.Name, true); ((Object)val).name = "Mod Option KeyBind, " + base.Name; HGButton[] componentsInChildren = val.GetComponentsInChildren<HGButton>(); UnityAction val2 = default(UnityAction); for (int i = 0; i < componentsInChildren.Length; i++) { ButtonClickedEvent onClick = ((Button)componentsInChildren[i]).onClick; UnityAction obj = val2; if (obj == null) { UnityAction val3 = delegate { controller.StartListening(); }; UnityAction val4 = val3; val2 = val3; obj = val4; } ((UnityEvent)onClick).AddListener(obj); } return val; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut value = Value; return !((object)(KeyboardShortcut)(ref value)).Equals((object?)GetOriginalValue()); } public KeyboardShortcut GetOriginalValue() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return originalValue; } } public class SliderOption : BaseOption, ITypedValueHolder<float> { protected readonly float originalValue; private readonly ConfigEntry<float> _configEntry; protected readonly SliderConfig config; public override string OptionTypeName { get; protected set; } = "slider"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual float Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public SliderOption(ConfigEntry<float> configEntry) : this(configEntry, new SliderConfig()) { } public SliderOption(ConfigEntry<float> configEntry, bool restartRequired) : this(configEntry, new SliderConfig { restartRequired = restartRequired }) { } public SliderOption(ConfigEntry<float> configEntry, SliderConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected SliderOption(SliderConfig config, float originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsSlider componentInChildren = obj.GetComponentInChildren<ModSettingsSlider>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.minValue = config.min; componentInChildren.maxValue = config.max; componentInChildren.formatString = config.FormatString; ((Object)obj).name = "Mod Option Slider, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { return Value != GetOriginalValue(); } public float GetOriginalValue() { return originalValue; } } public class StepSliderOption : BaseOption, ITypedValueHolder<float> { protected readonly float originalValue; private readonly ConfigEntry<float> _configEntry; protected readonly StepSliderConfig config; public override string OptionTypeName { get; protected set; } = "step_slider"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual float Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public StepSliderOption(ConfigEntry<float> configEntry) : this(configEntry, new StepSliderConfig()) { } public StepSliderOption(ConfigEntry<float> configEntry, bool restartRequired) : this(configEntry, new StepSliderConfig { restartRequired = restartRequired }) { } public StepSliderOption(ConfigEntry<float> configEntry, StepSliderConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected StepSliderOption(StepSliderConfig config, float originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { GameObject obj = Object.Instantiate<GameObject>(prefab, parent); ModSettingsStepSlider componentInChildren = obj.GetComponentInChildren<ModSettingsStepSlider>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.increment = config.increment; componentInChildren.minValue = config.min; componentInChildren.maxValue = config.max; componentInChildren.formatString = config.FormatString; int num = (int)Math.Round(Math.Abs(config.min - config.max) / config.increment); componentInChildren.slider.minValue = 0f; componentInChildren.slider.maxValue = num; componentInChildren.slider.wholeNumbers = true; ((Object)obj).name = "Mod Option Step Slider, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { return Value != GetOriginalValue(); } public float GetOriginalValue() { return originalValue; } } public class StringInputFieldOption : BaseOption, ITypedValueHolder<string> { protected readonly string originalValue; private readonly ConfigEntry<string> _configEntry; protected readonly InputFieldConfig config; public override string OptionTypeName { get; protected set; } = "string_input_field"; internal override ConfigEntryBase ConfigEntry => (ConfigEntryBase)(object)_configEntry; public virtual string Value { get { return _configEntry.Value; } set { _configEntry.Value = value; } } public StringInputFieldOption(ConfigEntry<string> configEntry) : this(configEntry, new InputFieldConfig()) { } public StringInputFieldOption(ConfigEntry<string> configEntry, bool restartRequired) : this(configEntry, new InputFieldConfig { restartRequired = restartRequired }) { } public StringInputFieldOption(ConfigEntry<string> configEntry, InputFieldConfig config) : this(config, configEntry.Value) { _configEntry = configEntry; } protected StringInputFieldOption(InputFieldConfig config, string originalValue) { this.originalValue = originalValue; this.config = config; } public override GameObject CreateOptionGameObject(GameObject prefab, Transform parent) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) GameObject obj = Object.Instantiate<GameObject>(prefab, parent); InputFieldController componentInChildren = obj.GetComponentInChildren<InputFieldController>(); componentInChildren.nameToken = GetNameToken(); componentInChildren.settingToken = base.Identifier; componentInChildren.submitOn = config.submitOn; componentInChildren.lineType = config.lineType; componentInChildren.richText = config.richText; componentInChildren.characterValidation = (CharacterValidation)0; ((Object)obj).name = "Mod Option Input Field, " + base.Name; return obj; } public override BaseOptionConfig GetConfig() { return config; } public bool ValueChanged() { return !string.Equals(_configEntry.Value, originalValue, StringComparison.InvariantCulture); } public string GetOriginalValue() { return originalValue; } } } namespace RiskOfOptions.OptionConfigs { public class BaseOptionConfig { public delegate bool IsDisabledDelegate(); public string name = ""; public string description = ""; public string category = ""; public bool restartRequired; [Obsolete("Not yet implemented")] public bool hidden; public IsDisabledDelegate checkIfDisabled; } public class CheckBoxConfig : BaseOptionConfig { } public class ChoiceConfig : BaseOptionConfig { } public class ColorOptionConfig : BaseOptionConfig { } public class FloatFieldConfig : NumericFieldConfig<float> { public override float Min { get; set; } = float.MinValue; public override float Max { get; set; } = float.MaxValue; } public class GenericButtonConfig : BaseOptionConfig { public readonly UnityAction OnButtonPressed; public readonly string ButtonText; public GenericButtonConfig(string name, string category, string description, string buttonText, UnityAction onButtonPressed) { base.name = name; base.category = category; base.description = description; ButtonText = buttonText; OnButtonPressed = onButtonPressed; } } public class InputFieldConfig : BaseOptionConfig { [Flags] public enum SubmitEnum { OnChar = 1, OnSubmit = 2, OnExit = 4, OnExitOrSubmit = 6, All = 7 } public SubmitEnum submitOn = SubmitEnum.OnChar; public LineType lineType = (LineType)1; public bool richText = true; } public class IntFieldConfig : NumericFieldConfig<int> { public override int Min { get; set; } = int.MinValue; public override int Max { get; set; } = int.MaxValue; } public class IntSliderConfig : BaseOptionConfig { public delegate bool IntSliderTryParse(string input, CultureInfo cultureInfo, out int value); public int min; public int max = 100; public string formatString = "{0}"; public IntSliderTryParse? TryParseDelegate { get; set; } } public class KeyBindConfig : BaseOptionConfig { } public abstract class NumericFieldConfig<TNumeric> : BaseOptionConfig { public delegate bool NumericFieldTryParse(string input, CultureInfo cultureInfo, out TNumeric value); public abstract TNumeric Min { get; set; } public abstract TNumeric Max { get; set; } public string FormatString { get; set; } = "{0}"; public NumericFieldTryParse? TryParse { get; set; } } public class SliderConfig : BaseOptionConfig { public delegate bool SliderTryParse(string input, CultureInfo cultureInfo, out float value); public float min; public float max = 100f; [Obsolete("Use FormatString Property instead")] public string formatString = "{0:0}%"; public virtual string FormatString { get { return formatString; } set { formatString = value; } } public SliderTryParse? TryParseDelegate { get; set; } } public class StepSliderConfig : SliderConfig { public float increment = 1f; public override string FormatString { get; set; } = "{0}"; } } namespace RiskOfOptions.Lib { public static class ColorExtensions { private const float Scale = 255f; public static Color FromRGBHex(this Color orig, int hex) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) int num = (hex & 0xFF0000) >> 16; int num2 = (hex & 0xFF00) >> 8; int num3 = hex & 0xFF; return new Color((float)num / 255f, (float)num2 / 255f, (float)num3 / 255f, orig.a); } public static int ToRGBHex(this Color orig) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) int num = (int)(orig.r * 255f) << 16; int num2 = (int)(orig.g * 255f) << 8; int num3 = (int)(orig.b * 255f); return num | num2 | num3; } internal static Color ColorFromHSV(float hue, float sat, float val) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) float num = val * sat; float num2 = MathF.PI / 3f; float num3 = num * (1f - Mathf.Abs((float)((double)(hue / num2) % 2.0 - 1.0))); float num4 = val - num; if (hue < 1f * num2) { return new Color(num4 + num, num4 + num3, num4 + 0f, 1f); } if (hue < 2f * num2) { return new Color(num4 + num3, num4 + num, num4 + 0f, 1f); } if (hue < 3f * num2) { return new Color(num4 + 0f, num4 + num, num4 + num3, 1f); } if (hue < 4f * num2) { return new Color(num4 + 0f, num4 + num3, num4 + num, 1f); } if (hue < 5f * num2) { return new Color(num4 + num3, num4 + 0f, num4 + num, 1f); } return new Color(num4 + num, num4 + 0f, num4 + num3, 1f); } internal static void ToHSV(this Color orig, float inHue, out float outHue, out float saturation, out float value) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) outHue = 0f; float num = Mathf.Min(orig.r, Mathf.Min(orig.g, orig.b)); float num2 = Mathf.Max(orig.r, Mathf.Max(orig.g, orig.b)); float num3 = num2 - num; value = num2; if (num3 == 0f) { saturation = 0f; outHue = inHue.Remap(0f, 6.28f, 0f, 1f); } else { saturation = num3 / num2; float num4 = ((num2 - orig.r) / 6f + num3 / 2f) / num3; float num5 = ((num2 - orig.g) / 6f + num3 / 2f) / num3; float num6 = ((num2 - orig.b) / 6f + num3 / 2f) / num3; if (orig.r == num3) { outHue = num6 - num5; } else if (orig.g == num3) { outHue = 1f / 3f + num4 - num6; } else if (orig.b == num3) { outHue = 2f / 3f + num5 - num4; } if (outHue < 0f) { outHue += 1f; } if (outHue > 1f) { outHue -= 1f; } } outHue = outHue.Remap(0f, 1f, 0f, 6.28f); } } internal static class CursorController { private static Hook _controllerHook; private static CursorSet _origMouse; private static CursorSet _origGamepad; private static CursorSet _cursorSet = default(CursorSet); private static CursorIndicatorController _indicatorControllerInstance; internal static readonly Dictionary<string, GameObject> Cursors = new Dictionary<string, GameObject>(); private static CursorIndicatorController IndicatorController { get { if (!Object.op_Implicit((Object)(object)_indicatorControllerInstance)) { _indicatorControllerInstance = ((IEnumerable<MPEventSystem>)MPEventSystem.readOnlyInstancesList).FirstOrDefault((Func<MPEventSystem, bool>)((MPEventSystem instance) => (Object)(object)instance.cursorIndicatorController != (Object)null))?.cursorIndicatorController; } return _indicatorControllerInstance; } } internal static void Init() { InitHooks(); LoadCursors(); ModifyCursorIndicatorController(); } private static void InitHooks() { MethodInfo method = typeof(CursorController).GetMethod("SetCursorOverride", BindingFlags.Static | BindingFlags.NonPublic); _controllerHook = HookHelper.NewHook<CursorIndicatorController>("SetCursor", method); } private static void LoadCursors() { } private static void ModifyCursorIndicatorController() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) GameObject obj = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/UI/CursorIndicator.prefab").WaitForCompletion(); obj.AddComponent<AddCursorsToController>(); CursorIndicatorController component = obj.GetComponent<CursorIndicatorController>(); _origMouse = component.mouseCursorSet; _origGamepad = component.gamepadCursorSet; } private static void SetCursorOverride(Action<CursorIndicatorController, CursorSet, CursorImage, Color> orig, CursorIndicatorController self, CursorSet set, CursorImage image, Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) orig(self, set, image, color); } } internal static class HookHelper { private const BindingFlags TargetFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private const BindingFlags DestFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; internal static Hook NewHook<TTarget, TDest>(string targetMethodName, string destMethodName, TDest instance) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown MethodInfo? method = typeof(TTarget).GetMethod(targetMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo method2 = typeof(TDest).GetMethod(destMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); return new Hook((MethodBase)method, method2, (object)instance); } internal static Hook NewHook<TTarget>(string targetMethodName, MethodInfo destMethod) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown return new Hook((MethodBase)typeof(TTarget).GetMethod(targetMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic), destMethod); } } internal static class KeyValuePairExtensions { internal static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> keyValuePair, out TKey key, out TValue value) { key = keyValuePair.Key; value = keyValuePair.Value; } } internal static class LanguageApi { internal delegate string LanguageStringDelegate(); private static readonly Dictionary<string, string> LanguageEntries = new Dictionary<string, string>(); private static readonly Dictionary<string, LanguageStringDelegate> DynamicLanguageEntries = new Dictionary<string, LanguageStringDelegate>(); private static Hook _languageHook; internal static void Init() { MethodInfo method = typeof(LanguageApi).GetMethod("GetLocalizedStringByToken", BindingFlags.Static | BindingFlags.NonPublic); _languageHook = HookHelper.NewHook<Language>("GetLocalizedStringByToken", method); } internal static void Add(string token, string entry) { LanguageEntries[token] = entry; } internal static void AddDelegate(string token, LanguageStringDelegate stringDelegate) { DynamicLanguageEntries[token] = stringDelegate; } internal static void RemoveDelegate(string token) { DynamicLanguageEntries.Remove(token); } private static string GetLocalizedStringByToken(Func<Language, string, string> orig, Language self, string token) { if (token.Length > 15) { if (token.Substring(0, 15) != "RISK_OF_OPTIONS") { return orig(self, token); } if (LanguageEntries.TryGetValue(token, out string value)) { return value; } if (DynamicLanguageEntries.TryGetValue(token, out LanguageStringDelegate value2)) { return value2(); } } return orig(self, token); } } public struct ModMetaData { public string Guid; public string Name; } } namespace RiskOfOptions.Containers { internal class Category { public readonly string name; private readonly List<BaseOption> _options = new List<BaseOption>(); private readonly Dictionary<string, int> _identifierOptionMap = new Dictionary<string, int>(); public string ModGuid { get; } internal string NameToken => ("RISK_OF_OPTIONS." + ModGuid + ".category." + name).Replace(" ", "_").ToUpper(); internal int OptionCount => _options.Count; internal BaseOption this[int index] => _options[index]; internal Category(string name, string modGuid) { this.name = name; ModGuid = modGuid; LanguageApi.Add(NameToken, name); } internal void AddOption(ref BaseOption option) { int count = _options.Count; _options.Add(option); _identifierOptionMap.Add(option.Identifier, count); } internal BaseOption GetOption(string identifier) { return _options[_identifierOptionMap[identifier]]; } private bool Equals(Category other) { return name == other.name; } public override bool Equals(object obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (obj.GetType() == GetType()) { return Equals((Category)obj); } return false; } public override int GetHashCode() { if (name == null) { return 0; } return name.GetHashCode(); } public static bool operator ==(Category left, Category right) { if ((object)right != null && (object)left != null) { return left.name == right.name; } return false; } public static bool operator !=(Category left, Category right) { return !(left == right); } } internal class ModIndexedOptionCollection : IEnumerable<OptionCollection>, IEnumerable { private class OptionCollectionEnumerator : IEnumerator<OptionCollection>, IEnumerator, IDisposable { private readonly OptionCollection[] _optionCollections; private int _position = -1; public OptionCollection Current { get { try { return _optionCollections[_position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } object IEnumerator.Current => Current; internal OptionCollectionEnumerator(OptionCollection[] optionCollections) { _optionCollections = optionCollections; } public bool MoveNext() { _position++; return _position < _optionCollections.Length; } public void Reset() { _position = -1; } public void Dispose() { } } private readonly Dictionary<string, OptionCollection> _optionCollections = new Dictionary<string, OptionCollection>(); private readonly Dictionary<string, string> _identifierModGuidMap = new Dictionary<string, string>(); internal OptionCollection this[string modGuid] { get { return _optionCollections[modGuid]; } set { _optionCollections[modGuid] = value; } } internal int Count => _optionCollections.Count; internal void AddOption(ref BaseOption option) { if (!_optionCollections.ContainsKey(option.ModGuid)) { _optionCollections[option.ModGuid] = new OptionCollection(option.ModName, option.ModGuid); } _optionCollections[option.ModGuid].AddOption(ref option); _identifierModGuidMap[option.Identifier] = option.ModGuid; } internal BaseOption GetOption(string identifier) { string key = _identifierModGuidMap[identifier]; return _optionCollections[key].GetOption(identifier); } internal bool ContainsModGuid(string modGuid) { return _optionCollections.ContainsKey(modGuid); } public IEnumerator<OptionCollection> GetEnumerator() { return new OptionCollectionEnumerator(_optionCollections.Values.ToArray()); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } internal class OptionCollection { private readonly List<Category> _categories = new List<Category>(); private readonly Dictionary<string, int> _nameCategoryMap = new Dictionary<string, int>(); private readonly Dictionary<string, string> _identifierCategoryNameMap = new Dictionary<string, string>(); public Sprite? icon; public GameObject? iconPrefab; private string? _descriptionToken; public string ModName { get; } public string ModGuid { get; } internal int CategoryCount => _categories.Count; internal string NameToken => ("RISK_OF_OPTIONS." + ModGuid + ".mod_list_button.name").Replace(" ", "_").ToUpper(); internal string DescriptionToken { get { if (_descriptionToken == null) { _descriptionToken = ("RISK_OF_OPTIONS." + ModGuid + ".mod_list_button.description").Replace(" ", "_").ToUpper(); } return _descriptionToken; } set { _descriptionToken = value; } } internal Category this[int index] => _categories[index]; internal Category this[string categoryName] => _categories[_nameCategoryMap[categoryName]]; internal OptionCollection(string modName, string modGuid) { ModName = modName; ModGuid = modGuid; LanguageApi.Add(NameToken, ModName); } internal void SetDescriptionText(string descriptionText) { LanguageApi.Add(DescriptionToken, descriptionText); } internal void AddOption(ref BaseOption option) { if (!_nameCategoryMap.ContainsKey(option.Category)) { int count = _categories.Count; _categories.Add(new Category(option.Category, ModGuid)); _nameCategoryMap[option.Category] = count; } _categories[_nameCategoryMap[option.Category]].AddOption(ref option); _identifierCategoryNameMap[option.Identifier] = option.Category; } internal BaseOption GetOption(string identifier) { _ = _identifierCategoryNameMap[identifier]; return _categories[_nameCategoryMap[_identifierCategoryNameMap[identifier]]].GetOption(identifier); } } } namespace RiskOfOptions.Components.RuntimePrefabs { public class CheckBoxPrefab : IRuntimePrefab { public GameObject CheckBoxButton { get; private set; } public void Instantiate(GameObject settingsPanel) { CheckBoxButton = Object.Instantiate<GameObject>(Prefabs.boolButton); GameObject val = Object.Instantiate<GameObject>(((Component)settingsPanel.transform.Find("SafeArea").Find("SubPanelArea").Find("SettingsSubPanel, Audio") .Find("Scroll View") .Find("Viewport") .Find("VerticalLayout") .Find("SettingsEntryButton, Bool (Audio Focus)")).gameObject); CarouselController componentInChildren = val.GetComponentInChildren<CarouselController>(); ModSettingsBool component = CheckBoxButton.GetComponent<ModSettingsBool>(); component.checkBoxFalse = componentInChildren.choices[0].customSprite; component.checkBoxTrue = componentInChildren.choices[1].customSprite; CheckBoxButton.GetComponent<HGButton>().hoverLanguageTextMeshController = val.GetComponent<HGButton>().hoverLanguageTextMeshController; Object.DestroyImmediate((Object)(object)val); } public void Destroy() { Object.DestroyImmediate((Object)(object)CheckBoxButton); } } public class ChoicePrefab : IRuntimePrefab { public GameObject ChoiceButton { get; private set; } public void Instantiate(GameObject settingsPanel) { //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_0480: Unknown result type (might be due to invalid IL or missing references) //IL_0495: Unknown result type (might be due to invalid IL or missing references) //IL_04aa: Unknown result type (might be due to invalid IL or missing references) //IL_04bf: Unknown result type (might be due to invalid IL or missing references) //IL_04c9: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Unknown result type (might be due to invalid IL or missing references) //IL_0513: Unknown result type (might be due to invalid IL or missing references) //IL_0528: Unknown result type (might be due to invalid IL or missing references) //IL_053c: Unknown result type (might be due to invalid IL or missing references) //IL_057e: Unknown result type (might be due to invalid IL or missing references) //IL_0588: Expected O, but got Unknown GameObject gameObject = ((Component)settingsPanel.transform.Find("SafeArea").Find("SubPanelArea").Find("SettingsSubPanel, Audio") .Find("Scroll View") .Find("Viewport") .Find("VerticalLayout") .Find("SettingsEntryButton, Bool (Audio Focus)")).gameObject; ChoiceButton = Object.Instantiate<GameObject>(((Component)settingsPanel.transform.Find("SafeArea").Find("SubPanelArea").Find("SettingsSubPanel, Video") .Find("Scroll View") .Find("Viewport") .Find("VerticalLayout") .Find("Option, Resolution")).gameObject); Transform obj = ChoiceButton.transform.Find("CarouselRect"); Object.DestroyImmediate((Object)(object)((Component)obj).GetComponent<ResolutionControl>()); Object.DestroyImmediate((Object)(object)((Component)obj.Find("RefreshRateDropdown")).gameObject); Object.DestroyImmediate((Object)(object)((Component)obj.Find("ApplyButton")).gameObject); Object.DestroyImmediate((Object)(object)ChoiceButton.GetComponent<SelectableDescriptionUpdater>()); Object.DestroyImmediate((Object)(object)ChoiceButton.GetComponent<PanelSkinController>()); Object.DestroyImmediate((Object)(object)ChoiceButton.GetComponent<Image>()); Object.Instantiate<GameObject>(((Component)gameObject.transform.Find("BaseOutline")).gameObject, ChoiceButton.transform); GameObject val = Object.Instantiate<GameObject>(((Component)gameObject.transform.Find("HoverOutline")).gameObject, ChoiceButton.transform); ChoiceButton.SetActive(false); HGButton obj2 = ChoiceButton.AddComponent<HGButton>(gameObject.GetComponent<HGButton>()); obj2.imageOnHover = val.GetComponent<Image>(); ChoiceButton.AddComponent<ButtonSkinController>(gameObject.GetComponent<ButtonSkinController>()); Image targetGraphic = ChoiceButton.AddComponent<Image>(gameObject.GetComponent<Image>()); ((Selectable)obj2).targetGraphic = (Graphic)(object)targetGraphic; ((Selectable)obj2).navigation = default(Navigation); ((UnityEventBase)((Button)obj2).onClick).RemoveAllListeners(); ChoiceButton.AddComponent<DropDownController>().nameLabel = ((Component)ChoiceButton.transform.Find("Text, Name")).GetComponent<LanguageTextMeshController>(); GameObject gameObject2 = ((Component)ChoiceButton.transform.Find("CarouselRect").Find("ResolutionDropdown")).gameObject; ((Object)gameObject2).name = "Dropdown"; LayoutElement component = gameObject2.GetComponent<LayoutElement>(); component.minWidth = 300f; component.preferredWidth = 300f; Object.DestroyImmediate((Object)(object)gameObject2.GetComponent<MPDropdown>()); ((Component)gameObject2.transform.Find("Label")).gameObject.AddComponent<LanguageTextMeshController>(); RooDropdown rooDropdown = gameObject2.AddComponent<RooDropdown>(); rooDropdown.defaultColors = ((Selectable)gameObject.GetComponent<HGButton>()).colors; Object.DestroyImmediate((Object)(object)((Component)gameObject2.transform.Find("Template")).gameObject); GameObject val2 = Object.Instantiate<GameObject>(gameObject, ChoiceButton.transform); ((Object)val2).name = "Choice Item Prefab"; val2.SetActive(false); HGButton component2 = val2.GetComponent<HGButton>(); ((UnityEventBase)((Button)component2).onClick).RemoveAllListeners(); ((MPButton)component2).disablePointerClick = false; Object.DestroyImmediate((Object)(object)val2.GetComponent<CarouselController>()); Object.DestroyImmediate((Object)(object)((Component)val2.transform.Find("CarouselRect")).gameObject); LayoutElement component3 = val2.GetComponent<LayoutElement>(); component3.minHeight = 40f; component3.preferredHeight = 40f; rooDropdown.choiceItemPrefab = val2; GameObject val3 = Object.Instantiate<GameObject>(((Component)settingsPanel.transform.Find("SafeArea").Find("SubPanelArea").Find("SettingsSubPanel, Audio")).gameObject, gameObject2.transform); ((Object)val3).name = "Drop Down Parent"; val3.SetActive(false); Transform obj3 = val3.transform.Find("Scroll View").Find("Viewport").Find("VerticalLayout"); Object.DestroyImmediate((Object)(object)((Component)((Component)obj3).transform.Find("SettingsEntryButton, Bool (Audio Focus)")).gameObject); Object.DestroyImmediate((Object)(object)((Component)((Component)obj3).transform.Find("SettingsEntryButton, Slider (Master Volume)")).gameObject); Object.DestroyImmediate((Object)(object)((Component)((Component)obj3).transform.Find("SettingsEntryButton, Slider (SFX Volume)")).gameObject); Object.DestroyImmediate((Object)(object)((Component)((Component)obj3).transform.Find("SettingsEntryButton, Slider (MSX Volume)")).gameObject); Object.DestroyImmediate((Object)(object)val3.GetComponent<SettingsPanelController>()); Object.DestroyImmediate((Object)(object)val3.GetComponent<HGButtonHistory>()); Object.DestroyImmediate((Object)(object)val3.GetComponent<OnEnableEvent>()); Object.DestroyImmediate((Object)(object)val3.GetComponent<UIJuice>()); Canvas orAddComponent = val3.GetOrAddComponent<Canvas>(); orAddComponent.overrideSorting = true; orAddComponent.sortingOrder = 30000; val3.GetOrAddComponent<GraphicRaycaster>(); val3.GetOrAddComponent<CanvasGroup>().alpha = 1f; RectTransform component4 = val3.GetComponent<RectTransform>(); component4.anchorMin = new Vector2(0f, 0f); component4.anchorMax = new Vector2(1f, 0f); component4.pivot = new Vector2(0.5f, 1f); component4.sizeDelta = new Vector2(0f, 300f); component4.anchoredPosition = Vector2.zero; RectTransform component5 = ((Component)val3.transform.Find("Scroll View").Find("Scrollbar Vertical")).GetComponent<RectTransform>(); component5.anchorMin = new Vector2(1f, 0.02f); component5.anchorMax = new Vector2(1f, 0.98f); component5.sizeDelta = new Vector2(24f, 0f); component5.anchoredPosition = new Vector2(-26f, 0f); GameObject gameObject3 = ((Component)val3.transform.Find("Scroll View").Find("Viewport").Find("VerticalLayout")).gameObject; ((LayoutGroup)gameObject3.GetComponent<VerticalLayoutGroup>()).padding = new RectOffset(4, 18, 4, 4); rooDropdown.content = gameObject3; rooDropdown.template = val3; ((Object)ChoiceButton).name = "Mod Option Prefab, Choice"; } public void Destroy() { Object.DestroyImmediate((Object)(object)ChoiceButton); } } public class FloatFieldPrefab : IRuntimePrefab { public GameObject FloatField { get; private set; } public void Instantiate(GameObject settingsPanel) { FloatField = Object.Instantiate<GameObject>(Prefabs.floatFieldButton); } public void Destroy() { Object.DestroyImmediate((Object)(object)FloatField); } } public class GenericButtonPrefab : IRuntimePrefab { public GameObject GenericButton { get; private set; } public void Instantiate(GameObject settingsPanel) { //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) Transform val = settingsPanel.transform.Find("SafeArea").Find("SubPanelArea").Find("SettingsSubPanel, Audio") .Find("Scroll View") .Find("Viewport") .Find("VerticalLayout"); GenericButton = Object.Instantiate<GameObject>(((Component)val.Find("SettingsEntryButton, Bool (Audio Focus)")).gameObject); ((Object)GenericButton).name = "Mod Option Prefab, GenericButton"; GenericButton.SetActive(false); Object.DestroyImmediate((Object)(object)GenericButton.GetComponentInChildren<CarouselController>()); Object.DestroyImmediate((Object)(object)((Component)GenericButton.transform.Find("CarouselRect")).gameObject); GenericButton.AddComponent<GenericButtonController>(); GameObject val2 = new GameObject("ButtonContainer", new Type[3] { typeof(RectTransform), typeof(HorizontalLayoutGroup), typeof(ContentSizeFitter) }); val2.transform.SetParent(GenericButton.transform); HorizontalLayoutGroup component = val2.GetComponent<HorizontalLayoutGroup>(); ((LayoutGroup)component).childAlignment = (TextAnchor)5; ((LayoutGroup)component).padding = new RectOffset(8, 8, 0, 0); ((HorizontalOrVerticalLayoutGroup)component).spacing = 8f; ((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = false; RectTransform component2 = val2.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0f, 0f); component2.anchorMax = new Vector2(1f, 1f); component2.pivot = new Vector2(1f, 0.5f); component2.anchoredPosition = new Vector2(-6f, 0f); ContentSizeFitter component3 = val2.GetComponent<ContentSizeFitter>(); component3.horizontalFit = (FitMode)2; component3.verticalFit = (FitMode)1; GameObject obj = Object.Instantiate<GameObject>(((Component)val.Find("SettingsEntryButton, Bool (Audio Focus)")).gameObject, val2.transform); ((Object)obj).name = "Button"; Object.DestroyImmediate((Object)(object)obj.GetComponentInChildren<CarouselController>()); Object.DestroyImmediate((Object)(object)((Component)obj.transform.Find("CarouselRect")).gameObject); obj.GetComponent<LayoutElement>().minHeight = 48f; HGButton component4 = obj.GetComponent<HGButton>(); ((MPButton)component4).disablePointerClick = false; ((UnityEventBase)((Button)component4).onClick).RemoveAllListeners(); HGTextMeshProUGUI componentInChildren = obj.GetComponentInChildren<HGTextMeshProUGUI>(); ((TMP_Text)componentInChildren).enableAutoSizing = false; ((TMP_Text)componentInChildren).fontSizeMin = ((TMP_Text)componentInChildren).fontSize; ((TMP_Text)componentInChildren).fontSizeMax = ((TMP_Text)componentInChildren).fontSize; } public void Destroy() { Object.DestroyImmediate((Object)(object)GenericButton); } } public class InputFieldPrefab : IRuntimePrefab { public GameObject InputField { get; private set; } public void Instantiate(GameObject settingsPanel) { InputField = Object.Instantiate<GameObject>(Prefabs.inputFieldButton); InputField.SetActive(false); } public void Destroy() { Object.DestroyImmediate((Object)(object)InputField); } } public class IntFieldPrefab : IRuntimePrefab { public GameObject IntField { get; private set; } public void Instantiate(GameObject settingsPanel) { IntField = Object.Instantiate<GameObject>(Prefabs.intFieldButton); } public void Destroy() { Object.DestroyImmediate((Object)(object)IntField); } } public class IntSliderPrefab : IRuntimePrefab { public GameObject IntSlider { get; private set; } public void Instantiate(GameObject settingsPanel) { IntSlider = Object.Instantiate<GameObject>(Prefabs.intSliderButton); } public void Destroy() { Object.DestroyImmediate((Object)(object)IntSlider); } } public interface IRuntimePrefab { void Instantiate(GameObject settingsPanel); void Destroy(); } public class KeyBindPrefab : IRuntimePrefab { public GameObject KeyBind { get; private set; } public void Instantiate(GameObject settingsPanel) { GameObject gameObject = ((Component)settingsPanel.transform.Find("SafeArea").Find("SubPanelArea").Find("SettingsSubPanel, Controls (M&KB)") .Find("Scroll View") .Find("Viewport") .Find("VerticalLayout") .Find("SettingsEntryButton, Binding (Jump)")).gameObject; KeyBind = Object.Instantiate<GameObject>(gameObject); ((Object)KeyBind).name = "Mod Option Prefab, KeyBind"; InputBindingControl componentInChildren = KeyBind.GetComponentInChildren<InputBindingControl>(); KeyBind.AddComponent<KeyBindController>().nameLabel = componentInChildren.nameLabel; Object.DestroyImmediate((Object)(object)componentInChildren); Object.DestroyImmediate((Object)(object)KeyBind.GetComponentInChildren<InputBindingDisplayController>()); HGButton[] componentsInChildren = KeyBind.GetComponentsInChildren<HGButton>(); for (int i = 0; i < componentsInChildren.Length; i++) { ((UnityEventBase)((Button)componentsInChildren[i]).onClick).RemoveAllListeners(); } } public void Destroy() { Object.DestroyImmediate((Object)(object)KeyBind); } } public class ModOptionsPanelPrefab : IRuntimePrefab { [CanBeNull] private GameObject _optionsPanel; [CanBeNull] private GameObject _genericDescriptionPanel; private GameObject _audioVerticalLayout; [CanBeNull] private GameObject _emptyButton; public GameObject ModListButton { get; private set; } public GameObject ModOptionsHeaderButton { get; private set; } public GameObject Canvas { get; private set; } public GameObject ModListPanel { get; private set; } public GameObject ModListHighlight { get; private set; } public GameObject ModDescriptionPanel { get; private set; } public GameObject CategoryHeader { get; private set; } public GameObject CategoryHeaderButton { get; private set; } public GameObject CategoryHeaderHighlight { get; private set; } public GameObject CategoryPageIndicators { get; private set; } public GameObject CategoryPageIndicator { get; private set; } public GameObject CategoryPageIndicatorOutline { get; private set; } public GameObject CategoryLeftButton { get; private set; } public GameObject CategoryRightButton { get; private set; } public GameObject ModOptionsPanel { get; private set; } public GameObject ModOptionsDescriptionPanel { get; private set; } public GameObject WarningPanel { get; private set; } public void Instantiate(GameObject settingsPanel) { Transform transform = settingsPanel.transform; Transform subPanelArea = transform.Find("SafeArea").Find("SubPanelArea"); Transform headerArea = transform.Find("SafeArea").Find("HeaderContainer").Find("Header (JUICED)"); CreateOptionsPanel(subPanelArea); CreateGenericDescriptionPanel(subPanelArea); CreateModOptionsHeaderButton(headerArea); CreateVerticalLayout(subPanelArea); CreateModListButton(); CreateEmptyButton(); CreateCanvas(); CreateModListPanel(settingsPanel); CreateModDescriptionPanel(); CreateCategoryHeader(); CreateAdditionalCategoryStuff(); CreateModOptionsPanel(); Object.DestroyImmediate((Object)(object)_emptyButton); Object.DestroyImmediate((Object)(object)_optionsPanel); CreateModOptionsDescriptionPanel(); CreateWarningPanel(); Object.DestroyImmediate((Object)(object)_genericDescriptionPanel); } public void Destroy() { Object.DestroyImmediate((Object)(object)ModOptionsHeaderButton); Object.DestroyImmediate((Object)(object)_emptyButton); Object.DestroyImmediate((Object)(object)Canvas); Object.DestroyImmediate((Object)(object)ModListPanel); Object.DestroyImmediate((Object)(object)ModListHighlight); Object.DestroyImmediate((Object)(object)ModDescriptionPanel); Object.DestroyImmediate((Object)(object)CategoryPageIndicators); Object.DestroyImmediate((Object)(object)CategoryPageIndicator); Object.DestroyImmediate((Object)(object)CategoryPageIndicatorOutline); Object.DestroyImmediate((Object)(object)CategoryLeftButton); Object.DestroyImmediate((Object)(object)CategoryRightButton); Object.DestroyImmediate((Object)(object)CategoryHeader); Object.DestroyImmediate((Object)(object)CategoryHeaderButton); Object.DestroyImmediate((Object)(object)CategoryHeaderHighlight); Object.DestroyImmediate((Object)(object)ModOptionsPanel); Object.DestroyImmediate((Object)(object)ModOptionsDescriptionPanel); Object.DestroyImmediate((Object)(object)WarningPanel); } private void CreateOptionsPanel(Transform subPanelArea) { GameObject gameObject = ((Component)subPanelArea.Find("SettingsSubPanel, Audio")).gameObject; _optionsPanel = Object.Instantiate<GameObject>(gameObject, subPanelArea); ((Object)_optionsPanel).name = "Empty Panel"; Object.DestroyImmediate((Object)(object)_optionsPanel.GetComponent<SettingsPanelController>()); Transform val = _optionsPanel.transform.Find("Scroll View").Find("Viewport").Find("VerticalLayout"); while (val.childCount > 0) { Object.DestroyImmediate((Object)(object)((Component)val.GetChild(0)).gameObject); } } private void CreateGenericDescriptionPanel(Transform subPanelArea) { _genericDescriptionPanel = Object.Instantiate<GameObject>(((Component)subPanelArea.Find("GenericDescriptionPanel")).gameObject); Object.DestroyImmediate((Object)(object)_genericDescriptionPanel.GetComponentInChildren<DisableIfTextIsEmpty>()); Object.DestroyImmediate((Object)(object)_genericDescriptionPanel.GetComponentInChildren<LanguageTextMeshController>()); Object.DestroyImmediate((Object)(object)((Component)_genericDescriptionPanel.transform.Find("ContentSizeFitter").Find("BlurPanel")).gameObject); Object.DestroyImmediate((Object)(object)((Component)_genericDescriptionPanel.transform.Find("ContentSizeFitter").Find("CornerRect")).gameObject); } private void CreateModOptionsHeaderButton(Transform headerArea) { ModOptionsHeaderButton = Object.Instantiate<GameObject>(((Component)headerArea.Find("GenericHeaderButton (Audio)")).gameObject); ((Object)ModOptionsHeaderButton).name = "GenericHeaderButton (Mod Options)"; ModOptionsHeaderButton.GetComponentInChildren<LanguageTextMeshController>().token = "RISK_OF_OPTIONS_MOD_OPTIONS_HEADER_BUTTON_TEXT"; ((UnityEventBase)((Button)ModOptionsHeaderButton.GetComponentInChildren<HGButton>()).onClick).RemoveAllListeners(); } private void CreateVerticalLayout(Transform subPanelArea) { _audioVerticalLayout = ((Component)subPanelArea.Find("SettingsSubPanel, Audio").Find("Scroll View").Find("Viewport") .Find("VerticalLayout")).gameObject; } private void CreateModListButton() { ModListButton = Prefabs.modListButton; } private void CreateEmptyButton() { _emptyButton = Object.Instantiate<GameObject>(((Component)_audioVerticalLayout.transform.Find("SettingsEntryButton, Bool (Audio Focus)")).gameObject); ((Object)_emptyButton).name = "Mod Options Prefab, Empty Button"; Object.DestroyImmediate((Object)(object)_emptyButton.GetComponentInChildren<CarouselController>()); Object.DestroyImmediate((Object)(object)_emptyButton.GetComponentInChildren<ButtonSkinController>()); Object.DestroyImmediate((Object)(object)((Component)_emptyButton.transform.Find("CarouselRect")).gameObject); } private void CreateCanvas() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) Canvas = Object.Instantiate<GameObject>(_optionsPanel, _optionsPanel.transform.parent); Canvas.GetCompo