Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of KeyboardInventory v0.0.1
BackendIain.LC.KeyboardInventory.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BackendIain.LC.KeyboardInventory.Models; using BackendIain.LC.KeyboardInventory.Patches; using BackendIain.LC.KeyboardInventory.UI; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("BackendIain.LC.KeyboardInventory")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Tweaks keybinds so that the number keys will change the current item held by the player.My very first modding shitpost")] [assembly: AssemblyFileVersion("0.1.0.0")] [assembly: AssemblyInformationalVersion("0.1.0+bbff4d481ec8a18de721bd348137c22a370886c3")] [assembly: AssemblyProduct("BackendIain.LC.KeyboardInventory")] [assembly: AssemblyTitle("BackendIain.LC.KeyboardInventory")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] 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 BackendIain.LC.KeyboardInventory { [BepInPlugin("BackendIain.LC.KeyboardInventory", "Keyboard Inventory", "0.1.0")] public class KeyboardInventoryModBase : BaseUnityPlugin { internal const string ModGuid = "BackendIain.LC.KeyboardInventory"; internal const string ModName = "Keyboard Inventory"; internal const string ModVersion = "0.1.0"; private readonly Harmony _harmony = new Harmony("BackendIain.LC.KeyboardInventory"); internal static KeyboardInventoryModBase Instance; internal static ManualLogSource _mls; internal static bool _isHost; private static ConfigEntry<bool> _enableNumKeyInventoryBindings; internal static GUILoader _myGUI; private static bool _hasGUISynced; internal static PlayerControllerB _playerRef; internal static ConfigEntry<bool> EnableNumKeyInventoryBindings => _enableNumKeyInventoryBindings; private void Awake() { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_006b: 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) if ((Object)(object)Instance == (Object)null) { Instance = this; } _mls = Logger.CreateLogSource("BackendIain.LC.KeyboardInventory"); _mls.LogInfo((object)"Loaded Keyboard Inventory. Patching..."); _harmony.PatchAll(typeof(KeyboardInventoryModBase)); _harmony.PatchAll(typeof(PlayerControllerBPatch)); GameObject val = new GameObject("GUILoader"); Object.DontDestroyOnLoad((Object)val); ((Object)val).hideFlags = (HideFlags)61; val.AddComponent<GUILoader>(); _myGUI = val.GetComponent<GUILoader>(); SetBindings(); SetGUIVars(); SetupKeyBindings(); } private void Update() { } private void SetBindings() { _enableNumKeyInventoryBindings = ((BaseUnityPlugin)this).Config.Bind<bool>("General Settings", "Enable num key inventory bindings?", false, "Enable num key inventory bindings?"); } private void SetGUIVars() { _myGUI.GuiEnableNumKeyInventoryBindings = _enableNumKeyInventoryBindings.Value; } internal void UpdateCFGVarsFromGUI() { if (!_hasGUISynced) { SetGUIVars(); } _enableNumKeyInventoryBindings.Value = _myGUI.GuiEnableNumKeyInventoryBindings; } private void SetupKeyBindings() { ((Component)this).GetComponent<GUILoader>(); } [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPrefix] private static void SetIsHost() { _mls.LogInfo((object)("Host Status: " + ((NetworkBehaviour)RoundManager.Instance).NetworkManager.IsHost)); _isHost = ((NetworkBehaviour)RoundManager.Instance).NetworkManager.IsHost; } } } namespace BackendIain.LC.KeyboardInventory.UI { internal class GUILoader : MonoBehaviour { private KeyboardShortcut _openCloseMenu; internal bool _wasKeyDown; private bool _isMenuOpen; private int _toolbarInt; private string[] _toolbarStrings = new string[1] { "General Settings" }; private int MENUWIDTH = 600; private int MENUHEIGHT = 800; private int MENUX; private int MENUY; private int ITEMWIDTH = 300; private int CENTERX; private GUIStyle _menuStyle; private GUIStyle _buttonStyle; private GUIStyle _labelStyle; private GUIStyle _toggleStyle; private GUIStyle _hScrollStyle; internal ManualLogSource _mls; public bool GuiEnableNumKeyInventoryBindings; public bool GuiIsHost; private void Awake() { //IL_002b: 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) _mls = Logger.CreateLogSource("BackendIain.LC.KeyboardInventory"); _mls.LogInfo((object)"GUILoader loaded."); _openCloseMenu = new KeyboardShortcut((KeyCode)268, Array.Empty<KeyCode>()); _isMenuOpen = false; MENUX = Screen.width / 2; MENUY = Screen.height / 2; CENTERX = MENUX + (MENUWIDTH / 2 - ITEMWIDTH / 2); _mls.LogInfo((object)$"MENUX: {MENUX}, MENUY: {MENUY}, CENTERX: {CENTERX}, ITEMWIDTH: {ITEMWIDTH}"); } private void IntitializeMenu() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) if (_menuStyle == null) { _mls.LogInfo((object)"Initializing menu..."); _menuStyle = new GUIStyle(GUI.skin.box); _buttonStyle = new GUIStyle(GUI.skin.button); _labelStyle = new GUIStyle(GUI.skin.label); _toggleStyle = new GUIStyle(GUI.skin.toggle); _hScrollStyle = new GUIStyle(GUI.skin.horizontalSlider); _menuStyle.normal.textColor = Color.white; _menuStyle.normal.background = MakeTex(2, 2, new Color(0.01f, 0.01f, 0.1f, 0.9f)); _menuStyle.fontSize = 18; ((Object)_menuStyle.normal.background).hideFlags = (HideFlags)61; _buttonStyle.normal.textColor = Color.white; _buttonStyle.fontSize = 18; _labelStyle.normal.textColor = Color.white; _labelStyle.normal.background = MakeTex(2, 2, new Color(0.01f, 0.01f, 0.1f, 0.9f)); _labelStyle.fontSize = 18; _labelStyle.alignment = (TextAnchor)4; ((Object)_labelStyle.normal.background).hideFlags = (HideFlags)61; _toggleStyle.normal.textColor = Color.white; _toggleStyle.fontSize = 18; _hScrollStyle.normal.textColor = Color.white; _hScrollStyle.normal.background = MakeTex(2, 2, new Color(0f, 0f, 0.2f, 0.9f)); ((Object)_hScrollStyle.normal.background).hideFlags = (HideFlags)61; } } private Texture2D MakeTex(int width, int height, Color col) { //IL_000f: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < array.Length; i++) { array[i] = col; } Texture2D val = new Texture2D(width, height); val.SetPixels(array); val.Apply(); return val; } public void OnDestroy() { _mls.LogInfo((object)"The GUILoader was destroyed :("); } public void Update() { if (((KeyboardShortcut)(ref _openCloseMenu)).IsDown() && !_wasKeyDown) { _wasKeyDown = true; } if (((KeyboardShortcut)(ref _openCloseMenu)).IsUp() && _wasKeyDown) { _mls.LogInfo((object)"Update - Menu Is Up and Key Was Not Down"); _wasKeyDown = false; _isMenuOpen = !_isMenuOpen; if (_isMenuOpen) { _mls.LogInfo((object)"Menu was open"); Cursor.visible = true; Cursor.lockState = (CursorLockMode)2; } else { _mls.LogInfo((object)"Menu was not open"); Cursor.visible = false; } } } public void OnGUI() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) if (_menuStyle == null) { IntitializeMenu(); } if (_isMenuOpen) { GUI.Box(new Rect((float)MENUX, (float)MENUY, (float)MENUWIDTH, (float)MENUHEIGHT), "Inventory Keyboard Bindings", _menuStyle); _toolbarInt = GUI.Toolbar(new Rect((float)MENUX, (float)(MENUY - 30), (float)MENUWIDTH, 30f), _toolbarInt, _toolbarStrings, _buttonStyle); if (_toolbarInt == 0) { GuiEnableNumKeyInventoryBindings = GUI.Toggle(new Rect((float)CENTERX, (float)(MENUY + 440), (float)ITEMWIDTH, 30f), GuiEnableNumKeyInventoryBindings, "Enable num key inventory bindings?", _toggleStyle); } } } } } namespace BackendIain.LC.KeyboardInventory.Patches { [HarmonyPatch(typeof(PlayerControllerB))] public class PlayerControllerBPatch { private static readonly IDictionary<string, MethodInfo> _methodCache = new Dictionary<string, MethodInfo>(); private static readonly object[] _backwardsParam = new object[1] { false }; private static readonly object[] _forwardsParam = new object[1] { true }; internal static ControlActionState _itemSlot1Action; internal static ControlActionState _itemSlot2Action; internal static ControlActionState _itemSlot3Action; internal static ControlActionState _itemSlot4Action; internal static ControlActionState _emote1Action; internal static ControlActionState _emote2Action; internal static ControllerState _allActions; internal static ControllerState _itemSlotActions; internal static ControllerState _emoteActions; [HarmonyPatch("Start")] [HarmonyPrefix] public static void PatchStart(ref PlayerControllerB __instance) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) if (__instance.isHostPlayerObject) { KeyboardInventoryModBase._playerRef = __instance; } ControlActionState itemSlot1Action = default(ControlActionState); itemSlot1Action.Key = new KeyboardShortcut((KeyCode)49, Array.Empty<KeyCode>()); itemSlot1Action.Description = "Item slot 1"; itemSlot1Action.ItemSlotIndex = 0; _itemSlot1Action = itemSlot1Action; itemSlot1Action = default(ControlActionState); itemSlot1Action.Key = new KeyboardShortcut((KeyCode)50, Array.Empty<KeyCode>()); itemSlot1Action.Description = "Item slot 2"; itemSlot1Action.ItemSlotIndex = 1; _itemSlot2Action = itemSlot1Action; itemSlot1Action = default(ControlActionState); itemSlot1Action.Key = new KeyboardShortcut((KeyCode)51, Array.Empty<KeyCode>()); itemSlot1Action.Description = "Item slot 3"; itemSlot1Action.ItemSlotIndex = 2; _itemSlot3Action = itemSlot1Action; itemSlot1Action = default(ControlActionState); itemSlot1Action.Key = new KeyboardShortcut((KeyCode)52, Array.Empty<KeyCode>()); itemSlot1Action.Description = "Item slot 4"; itemSlot1Action.ItemSlotIndex = 3; _itemSlot4Action = itemSlot1Action; ControllerState itemSlotActions = default(ControllerState); itemSlotActions.Inputs = new ControlActionState[4] { _itemSlot1Action, _itemSlot2Action, _itemSlot3Action, _itemSlot4Action }; _itemSlotActions = itemSlotActions; itemSlot1Action = default(ControlActionState); itemSlot1Action.Key = new KeyboardShortcut((KeyCode)45, Array.Empty<KeyCode>()); itemSlot1Action.Description = "Emote 1"; itemSlot1Action.ItemSlotIndex = 4; _emote1Action = itemSlot1Action; itemSlot1Action = default(ControlActionState); itemSlot1Action.Key = new KeyboardShortcut((KeyCode)61, Array.Empty<KeyCode>()); itemSlot1Action.Description = "Emote 2"; itemSlot1Action.ItemSlotIndex = 5; _emote2Action = itemSlot1Action; itemSlotActions = default(ControllerState); itemSlotActions.Inputs = new ControlActionState[2] { _emote1Action, _emote2Action }; _emoteActions = itemSlotActions; itemSlotActions = default(ControllerState); itemSlotActions.Inputs = _itemSlotActions.Inputs.Concat(_emoteActions.Inputs); _allActions = itemSlotActions; } [HarmonyPatch("Update")] [HarmonyPrefix] public static void PatchUpdate(ref PlayerControllerB __instance, ref float ___timeSinceSwitchingSlots, ref bool ___throwingObject) { KeyboardInventoryModBase._myGUI.GuiIsHost = KeyboardInventoryModBase._isHost; KeyboardInventoryModBase.Instance.UpdateCFGVarsFromGUI(); if (!KeyboardInventoryModBase.EnableNumKeyInventoryBindings.Value || ((!((NetworkBehaviour)__instance).IsOwner || !__instance.isPlayerControlled || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject)) && !__instance.isTestingPlayer) || _allActions.Inputs == null || !_allActions.Inputs.Any(delegate(ControlActionState x) { //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) KeyboardShortcut key = x.Key; return ((KeyboardShortcut)(ref key)).IsDown(); })) { return; } foreach (ControlActionState input in _allActions.Inputs) { HandleActionInput(input, ref __instance, ref ___timeSinceSwitchingSlots, ref ___throwingObject); } } private static ControlActionState HandleActionInput(ControlActionState action, ref PlayerControllerB __instance, ref float __timeSinceSwitchingSlots, ref bool __throwingObject) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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_0046: 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_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Invalid comparison between Unknown and I4 KeyboardShortcut key = action.Key; if (((KeyboardShortcut)(ref key)).IsDown() && !action.EndedDown) { action.EndedDown = true; } key = action.Key; if (((KeyboardShortcut)(ref key)).IsUp() && action.EndedDown) { action.EndedDown = false; } if (action.EndedDown && _emoteActions.Inputs.Any(delegate(ControlActionState x) { //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_000a: 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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut key2 = x.Key; KeyCode mainKey = ((KeyboardShortcut)(ref key2)).MainKey; key2 = action.Key; return mainKey == ((KeyboardShortcut)(ref key2)).MainKey; })) { key = action.Key; PerformEmote(ref __instance, ((int)((KeyboardShortcut)(ref key)).MainKey == 45) ? 1 : 2); return action; } if (action.EndedDown && CanSwitchItem(__instance, __timeSinceSwitchingSlots, __throwingObject)) { StopAllEmotes(ref __instance, __timeSinceSwitchingSlots, __throwingObject); SwitchItemSlot(__instance, action.ItemSlotIndex, __timeSinceSwitchingSlots, __throwingObject); __timeSinceSwitchingSlots = 0f; } return action; } private static bool SwitchItemSlot(PlayerControllerB instance, int slotIndex, float timeSinceSwitchingSlots, bool isThrowingObject) { if (!CanSwitchItem(instance, timeSinceSwitchingSlots, isThrowingObject) || instance.currentItemSlot == slotIndex) { return false; } int num = instance.currentItemSlot - slotIndex; bool flag = num > 0; if (Math.Abs(num) != instance.ItemSlots.Length - 1) { object[] parameters = (flag ? _backwardsParam : _forwardsParam); do { InvokePrivateMethod(instance, "SwitchItemSlotsServerRpc", parameters); num += ((!flag) ? 1 : (-1)); } while (num != 0); } ShipBuildModeManager.Instance.CancelBuildMode(true); instance.playerBodyAnimator.SetBool("GrabValidated", false); InvokePrivateMethod(instance, "SwitchToItemSlot", new object[2] { slotIndex, null }); if ((Object)(object)instance.currentlyHeldObjectServer != (Object)null) { ((Component)instance.currentlyHeldObjectServer).gameObject.GetComponent<AudioSource>().PlayOneShot(instance.currentlyHeldObjectServer.itemProperties.grabSFX, 0.6f); } return true; } private static bool CanSwitchItem(PlayerControllerB instance, float timeSinceSwitchingSlots, bool isThrowingObject) { if (!((double)timeSinceSwitchingSlots < 0.01 || instance.inTerminalMenu || instance.isGrabbingObjectAnimation || instance.inSpecialInteractAnimation || isThrowingObject) && !instance.isTypingChat && !instance.twoHanded && !instance.activatingItem && !instance.jetpackControls) { return !instance.disablingJetpackControls; } return false; } private static void PerformEmote(ref PlayerControllerB __instance, int emoteId) { __instance.timeSinceStartingEmote = 0f; __instance.performingEmote = true; __instance.playerBodyAnimator.SetInteger("emoteNumber", emoteId); __instance.StartPerformingEmoteServerRpc(); } private static void StopAllEmotes(ref PlayerControllerB __instance, float timeSinceSwitchingSlots, bool isThrowingObject) { __instance.performingEmote = false; __instance.timeSinceStartingEmote = 0f; __instance.StopPerformingEmoteServerRpc(); } private static object InvokePrivateMethod(PlayerControllerB instance, string methodName, object[] parameters = null) { _methodCache.TryGetValue(methodName, out var value); if ((object)value == null) { value = typeof(PlayerControllerB).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); } _methodCache[methodName] = value; return value?.Invoke(instance, parameters); } } } namespace BackendIain.LC.KeyboardInventory.Models { internal struct ControlActionState { public KeyboardShortcut Key { get; internal set; } public bool EndedDown { get; internal set; } public string Description { get; internal set; } public int ItemSlotIndex { get; internal set; } } internal struct ControllerState { public IEnumerable<ControlActionState> Inputs { get; set; } } }