Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Rebindables v1.0.4
Rebindables.dll
Decompiled a month agousing System; using System.Collections.Generic; using System.Diagnostics; 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 BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using MonoMod.RuntimeDetour; using On.RoR2; using On.RoR2.UI; using Rewired; using Rewired.Data; using Rewired.Data.Mapping; using RoR2; using RoR2.UI; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Rebindables")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+92a073609133a40c801e07c71061ab4ac98901f0")] [assembly: AssemblyProduct("Rebindables")] [assembly: AssemblyTitle("Rebindables")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Rebindables { public static class InputBankExtensions { public static ButtonState GetButtonState(this InputBankTest bank, ModKeybind bind) { //IL_0003: 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_000b: Unknown result type (might be due to invalid IL or missing references) return bind.GetButtonState(bank); } } public class RebindAPI { internal delegate void orig_RewiredMoment(UserData self); [CompilerGenerated] private static class <>O { public static hook_LoadUserProfiles <0>__LoadProfiles; public static hook_Start <1>__SPCStart; public static hook_Start <2>__IBTStart; public static hook_LoadDefaultProfile <3>__LoadDefault; public static hook_FillDefaultJoystickMaps <4>__FillJoystickMaps; } private static int lastClaimedID = 940; public static List<ModKeybind> Keybinds = new List<ModKeybind>(); public static Dictionary<ModKeybind, InputAction> KeybindActions = new Dictionary<ModKeybind, InputAction>(); internal static void ApplyHooks() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_00d0: 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_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown object obj = <>O.<0>__LoadProfiles; if (obj == null) { hook_LoadUserProfiles val = LoadProfiles; <>O.<0>__LoadProfiles = val; obj = (object)val; } SaveSystem.LoadUserProfiles += (hook_LoadUserProfiles)obj; object obj2 = <>O.<1>__SPCStart; if (obj2 == null) { hook_Start val2 = SPCStart; <>O.<1>__SPCStart = val2; obj2 = (object)val2; } SettingsPanelController.Start += (hook_Start)obj2; object obj3 = <>O.<2>__IBTStart; if (obj3 == null) { hook_Start val3 = IBTStart; <>O.<2>__IBTStart = val3; obj3 = (object)val3; } InputBankTest.Start += (hook_Start)obj3; object obj4 = <>O.<3>__LoadDefault; if (obj4 == null) { hook_LoadDefaultProfile val4 = LoadDefault; <>O.<3>__LoadDefault = val4; obj4 = (object)val4; } UserProfile.LoadDefaultProfile += (hook_LoadDefaultProfile)obj4; object obj5 = <>O.<4>__FillJoystickMaps; if (obj5 == null) { hook_FillDefaultJoystickMaps val5 = FillJoystickMaps; <>O.<4>__FillJoystickMaps = val5; obj5 = (object)val5; } UserProfile.FillDefaultJoystickMaps += (hook_FillDefaultJoystickMaps)obj5; new Hook((MethodBase)typeof(UserData).GetMethod("gLOOAxUFAvrvUufkVjaYyZoeLbLE", (BindingFlags)(-1)), typeof(RebindAPI).GetMethod("RewiredMoment", (BindingFlags)(-1))); } private static void FillJoystickMaps(orig_FillDefaultJoystickMaps orig, UserProfile self) { orig.Invoke(self); AddMaps(self); self.RequestEventualSave(); } private static void LoadDefault(orig_LoadDefaultProfile orig) { orig.Invoke(); AddMaps(UserProfile.defaultProfile); UserProfile.defaultProfile.RequestEventualSave(); } private static void IBTStart(orig_Start orig, InputBankTest self) { orig.Invoke(self); ((Component)self).gameObject.AddComponent<ModdedInputBank>(); } private static void RewiredMoment(orig_RewiredMoment orig, UserData self) { foreach (ModKeybind keybind in Keybinds) { self.actions?.Add(KeybindActions[keybind]); FillAction(keybind, self.keyboardMaps, self.joystickMaps, self.mouseMaps); } orig(self); } private static void SPCStart(orig_Start orig, SettingsPanelController self) { orig.Invoke(self); if (!(((Object)self).name == "SettingsSubPanel, Controls (M&KB)") && !(((Object)self).name == "SettingsSubPanel, Controls (Gamepad)")) { return; } GameObject gameObject = ((Component)((Component)self).transform.Find("Scroll View").Find("Viewport").Find("VerticalLayout") .Find("SettingsEntryButton, Binding (Jump)")).gameObject; Transform val = ((Component)self).transform.Find("Scroll View").Find("Viewport").Find("VerticalLayout"); foreach (ModKeybind keybind in Keybinds) { GameObject val2 = Object.Instantiate<GameObject>(gameObject, val); InputBindingControl component = val2.GetComponent<InputBindingControl>(); component.actionName = keybind.InternalName; component.Awake(); if (keybind.Position != null) { int num = FindSiblingIndex(keybind.Position, val); if (num != -1) { val2.transform.SetSiblingIndex(num + 1); } } } } private static int FindSiblingIndex(string input, Transform target) { Transform val = target.Find("SettingsEntryButton, Binding (" + input + ")"); Transform val2 = target.Find("SettingsEntryButton, Bool (" + input + ")"); Transform val3 = target.Find("SettingsEntryButton, Slider (" + input + ")"); return ((Object)(object)val != (Object)null) ? val.GetSiblingIndex() : (((Object)(object)val2 != (Object)null) ? val2.GetSiblingIndex() : (((Object)(object)val3 != (Object)null) ? val3.GetSiblingIndex() : (-1))); } private static void LoadProfiles(orig_LoadUserProfiles orig, SaveSystem self) { orig.Invoke(self); foreach (KeyValuePair<string, UserProfile> loadedUserProfile in self.loadedUserProfiles) { UserProfile value = loadedUserProfile.Value; AddMaps(value); value.RequestEventualSave(); } } private static void AddMaps(UserProfile prof) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) ActionElementMap val = default(ActionElementMap); ActionElementMap val2 = default(ActionElementMap); foreach (ModKeybind bind in Keybinds) { if (((ControllerMap)prof.keyboardMap).AllMaps.All((ActionElementMap x) => x.actionId != bind.Id) && ((ControllerMap)prof.mouseMap).AllMaps.All((ActionElementMap x) => x.actionId != bind.Id) && !bind.IsMouse()) { ((ControllerMap)prof.keyboardMap).CreateElementMap(bind.kbMap.actionId, bind.kbMap.axisContribution, bind.kbMap.elementIdentifierId, bind.kbMap.elementType, bind.kbMap.axisRange, bind.kbMap.invert, ref val); val._keyboardKeyCode = (KeyboardKeyCode)bind.DefaultKeyboardInput; val.keyCode = bind.DefaultKeyboardInput; bind.kbMap.cVYzDXVDMNXvRMrklCVdVyeXGAlK((ControllerMap)(object)prof.keyboardMap); } if (((ControllerMap)prof.keyboardMap).AllMaps.All((ActionElementMap x) => x.actionId != bind.Id) && ((ControllerMap)prof.mouseMap).AllMaps.All((ActionElementMap x) => x.actionId != bind.Id) && !bind.IsMouse()) { ((ControllerMap)prof.mouseMap).CreateElementMap(bind.mMap.actionId, bind.mMap.axisContribution, bind.mMap.elementIdentifierId, bind.mMap.elementType, bind.mMap.axisRange, bind.mMap.invert, ref val2); val2.keyCode = bind.DefaultKeyboardInput; bind.mMap.cVYzDXVDMNXvRMrklCVdVyeXGAlK((ControllerMap)(object)prof.mouseMap); } foreach (var (_, val4) in prof.HardwareJoystickMaps2) { if (((ControllerMap)val4).AllMaps.All((ActionElementMap x) => x.actionId != bind.Id)) { ((ControllerMap)val4).CreateElementMap(bind.jsMap.actionId, bind.jsMap.axisContribution, bind.jsMap.elementIdentifierId, bind.jsMap.elementType, bind.jsMap.axisRange, bind.jsMap.invert); bind.jsMap.cVYzDXVDMNXvRMrklCVdVyeXGAlK((ControllerMap)(object)prof.joystickMap); } } } } private static void FillAction(ModKeybind bind, List<ControllerMap_Editor> kb, List<ControllerMap_Editor> ctrl, List<ControllerMap_Editor> m) { foreach (ControllerMap_Editor item in kb) { if (item.categoryId == 0 && item.actionElementMaps.All((ActionElementMap x) => x.actionId != bind.Id)) { item.actionElementMaps.Add(bind.kbMap); } } foreach (ControllerMap_Editor item2 in ctrl) { if (item2.categoryId == 0 && item2.actionElementMaps.All((ActionElementMap x) => x.actionId != bind.Id)) { item2.actionElementMaps.Add(bind.jsMap); } } foreach (ControllerMap_Editor item3 in m) { if (item3.categoryId == 0 && item3.actionElementMaps.All((ActionElementMap x) => x.actionId != bind.Id)) { item3.actionElementMaps.Add(bind.kbMap); } } } public static ModKeybind RegisterModKeybind(ModKeybind keybind) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) InputAction val = new InputAction(); int num = Rebindables.ReadID(keybind.InternalName); while (num == -1) { int num2 = lastClaimedID++; if (!Rebindables.CheckIDExists(num2)) { num = num2; break; } } val.QurFqcdYtHIEpCpYBddZfQQtnImHA(num); Rebindables.WriteID(keybind.InternalName, num); val.MFwTFVDRoziRWNJMARlSUXIebtLw(0); val.nfWwbfSEwQCdVSicPaIBIPkMqJfu(keybind.InternalName); val.LEWtVuPGPZtPpCUSAMYCEbPqyAuf(keybind.InternalName); val.REsRGcKFtjbUwlqUSreCTUubayPb(0); val.BSFQAxJApIZsVFnOmINQEGShHPvFb(true); val.nLGCfekdjaMIxCLlcjdYgcEjEDxz(keybind.InputType); keybind.Id = val.id; keybind.action = val; ActionAxisPair key = default(ActionAxisPair); ((ActionAxisPair)(ref key))..ctor(val.name, keybind.AxisRange); InputCatalog.actionToToken[key] = keybind.DisplayToken; Keybinds.Add(keybind); KeybindActions.Add(keybind, val); return keybind; } } public class ModKeybind { internal string InternalName; public string DisplayToken; public KeyCode DefaultKeyboardInput; public int DefaultJoystickInput; public InputActionType InputType; public AxisRange AxisRange; private ActionElementMap _kbMap; private ActionElementMap _jsMap; private ActionElementMap _mMap; public string Position; internal int Id; internal InputAction action; internal ActionElementMap kbMap { get { //IL_0018: 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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_002e: Expected O, but got Unknown ActionElementMap obj = _kbMap; if (obj == null) { ActionElementMap val = new ActionElementMap(action.id, (ControllerElementType)1, ToElementId(DefaultKeyboardInput)); ActionElementMap val2 = val; _kbMap = val; obj = val2; } return obj; } } internal ActionElementMap jsMap { get { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Invalid comparison between Unknown and I4 //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0048: Expected O, but got Unknown ActionElementMap obj = _jsMap; if (obj == null) { ActionElementMap val = new ActionElementMap(action.id, (ControllerElementType)((int)InputType == 1), DefaultJoystickInput, (Pole)((int)AxisRange == 2), AxisRange); ActionElementMap val2 = val; _jsMap = val; obj = val2; } return obj; } } internal ActionElementMap mMap { get { //IL_0018: 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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_002e: Expected O, but got Unknown ActionElementMap obj = _mMap; if (obj == null) { ActionElementMap val = new ActionElementMap(action.id, (ControllerElementType)1, ToElementId(DefaultKeyboardInput)); ActionElementMap val2 = val; _mMap = val; obj = val2; } return obj; } } public ModKeybind(string displayToken, KeyCode defaultKeyboardInput, int defaultJoystickInput, string position = null, InputActionType type = 1, AxisRange range = 0) { //IL_0026: 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) InternalName = displayToken.Replace("_", ""); DisplayToken = displayToken; DefaultKeyboardInput = defaultKeyboardInput; DefaultJoystickInput = defaultJoystickInput; Position = position; } public ButtonState GetButtonState(InputBankTest inputBank) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)inputBank != (Object)null && ModdedInputBank.BankMap.ContainsKey(inputBank)) { return ModdedInputBank.BankMap[inputBank].ButtonStates[this]; } Rebindables.ModLogger.LogError((object)("Attempted to get state for " + InternalName + " on a InputBankTest that does not exist!")); return default(ButtonState); } public bool IsMouse() { //IL_0002: 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) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: 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_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_0016: 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) //IL_001e: Invalid comparison between Unknown and I4 KeyCode defaultKeyboardInput = DefaultKeyboardInput; KeyCode val = defaultKeyboardInput; if (val - 323 <= 1 || val - 326 <= 2) { return true; } return false; } public static int ToElementId(KeyCode key) { //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_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) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Expected I4, but got Unknown //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_033d: Expected I4, but got Unknown switch ((int)key) { default: switch (key - 256) { case 0: return 37; case 1: return 38; case 2: return 39; case 3: return 40; case 4: return 41; case 5: return 42; case 6: return 43; case 7: return 44; case 8: return 45; case 9: return 46; case 10: return 47; case 11: return 48; case 12: return 49; case 13: return 50; case 14: return 51; case 15: return 52; case 16: return 53; case 17: return 89; case 18: return 90; case 19: return 91; case 20: return 92; case 21: return 93; case 22: return 94; case 23: return 95; case 24: return 96; case 25: return 97; case 26: return 98; case 27: return 99; case 28: return 100; case 29: return 101; case 30: return 102; case 31: return 103; case 32: return 104; case 33: return 105; case 34: return 106; case 35: return 107; case 36: return 108; case 37: return 109; case 38: return 110; case 39: return 111; case 40: return 112; case 44: return 113; case 45: return 114; case 46: return 115; case 47: return 116; case 48: return 117; case 49: return 118; case 50: return 119; case 51: return 120; case 52: return 121; case 53: return 122; case 54: return 123; case 55: return 124; case 56: return 125; case 57: return 126; case 59: return 127; case 60: return 128; case 61: return 129; case 62: return 130; case 63: return 131; case 67: return 3; case 68: return 4; case 70: return 5; case 71: return 6; case 72: return 7; } break; case 0: return 0; case 97: return 1; case 98: return 2; case 99: return 3; case 100: return 4; case 101: return 5; case 102: return 6; case 103: return 7; case 104: return 8; case 105: return 9; case 106: return 10; case 107: return 11; case 108: return 12; case 109: return 13; case 110: return 14; case 111: return 15; case 112: return 16; case 113: return 17; case 114: return 18; case 115: return 19; case 116: return 20; case 117: return 21; case 118: return 22; case 119: return 23; case 120: return 24; case 121: return 25; case 122: return 26; case 48: return 27; case 49: return 28; case 50: return 29; case 51: return 30; case 52: return 31; case 53: return 32; case 54: return 33; case 55: return 34; case 56: return 35; case 57: return 36; case 32: return 54; case 8: return 55; case 9: return 56; case 12: return 57; case 13: return 58; case 19: return 59; case 27: return 60; case 33: return 61; case 34: return 62; case 35: return 63; case 36: return 64; case 38: return 65; case 39: return 66; case 40: return 67; case 41: return 68; case 42: return 69; case 43: return 70; case 44: return 71; case 45: return 72; case 46: return 73; case 47: return 74; case 58: return 75; case 59: return 76; case 60: return 77; case 61: return 78; case 62: return 79; case 63: return 80; case 64: return 81; case 91: return 82; case 92: return 83; case 93: return 84; case 94: return 85; case 95: return 86; case 96: return 87; case 127: return 88; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 10: case 11: case 14: case 15: case 16: case 17: case 18: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 28: case 29: case 30: case 31: case 37: case 65: case 66: case 67: case 68: case 69: case 70: case 71: case 72: case 73: case 74: case 75: case 76: case 77: case 78: case 79: case 80: case 81: case 82: case 83: case 84: case 85: case 86: case 87: case 88: case 89: case 90: case 123: case 124: case 125: case 126: break; } return -1; } } internal class ModdedInputBank : MonoBehaviour { public PlayerCharacterMasterController pcmc; public Dictionary<ModKeybind, ButtonState> ButtonStates = new Dictionary<ModKeybind, ButtonState>(); public static Dictionary<InputBankTest, ModdedInputBank> BankMap = new Dictionary<InputBankTest, ModdedInputBank>(); public void Start() { //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) foreach (ModKeybind keybind in RebindAPI.Keybinds) { ButtonStates.Add(keybind, default(ButtonState)); } BankMap.Add(((Component)this).GetComponent<InputBankTest>(), this); } public void OnDestroy() { BankMap.Remove(((Component)this).GetComponent<InputBankTest>()); } public void FixedUpdate() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) LocalUser val = default(LocalUser); Player val2 = default(Player); CameraRigController val3 = default(CameraRigController); bool flag = default(bool); if (!Object.op_Implicit((Object)(object)pcmc)) { CharacterBody component = ((Component)this).GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component)) { pcmc = (Object.op_Implicit((Object)(object)component.master) ? component.master.playerCharacterMasterController : null); } } else if (PlayerCharacterMasterController.CanSendBodyInput(pcmc.networkUser, ref val, ref val2, ref val3, ref flag)) { for (int i = 0; i < RebindAPI.Keybinds.Count; i++) { ModKeybind modKeybind = RebindAPI.Keybinds[i]; ButtonState value = ButtonStates[modKeybind]; ((ButtonState)(ref value)).PushState(val2.GetButton(modKeybind.Id)); ButtonStates[modKeybind] = value; } } } } [BepInPlugin("pseudopulse.Rebindables", "Rebindables", "1.0.4")] public class Rebindables : BaseUnityPlugin { public const string PluginGUID = "pseudopulse.Rebindables"; public const string PluginAuthor = "pseudopulse"; public const string PluginName = "Rebindables"; public const string PluginVersion = "1.0.4"; public static ManualLogSource ModLogger; public static string RebindablesSaveInfoPath; public void Awake() { ModLogger = ((BaseUnityPlugin)this).Logger; RebindAPI.ApplyHooks(); VerifyFile(); } public static void VerifyFile() { RebindablesSaveInfoPath = Path.Combine(Application.persistentDataPath, "RebindablesInfo"); try { if (!File.Exists(RebindablesSaveInfoPath)) { File.CreateText(RebindablesSaveInfoPath).Close(); } } catch { RebindablesSaveInfoPath = Assembly.GetExecutingAssembly().Location.Replace("Rebindables.dll", "RebindablesInfo"); if (!File.Exists(RebindablesSaveInfoPath)) { File.CreateText(RebindablesSaveInfoPath).Close(); } } } public static int ReadID(string internalName) { string text = File.ReadAllText(RebindablesSaveInfoPath); List<string> list = text.Split("|").ToList(); int num = list.IndexOf(internalName); if (num == -1) { return -1; } if (num > list.Count || num + 1 > list.Count) { return -1; } return int.Parse(list[num + 1]); } public static bool CheckIDExists(int id) { string text = File.ReadAllText(RebindablesSaveInfoPath); List<string> list = text.Split("|").ToList(); for (int i = 0; i < list.Count; i++) { if (i % 2 != 0 && int.TryParse(list[i], out var result) && result == id) { return true; } } return false; } public static void WriteID(string internalName, int id) { string text = File.ReadAllText(RebindablesSaveInfoPath); int num = ReadID(internalName); if (num != -1) { text = text.Replace($"{internalName}|{num}|", ""); } text += $"{internalName}|{id}|"; File.WriteAllText(RebindablesSaveInfoPath, text); } } }