Please disclose if your mod was created primarily 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 MouseTweaks v1.0.2
MouseTweaks.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("MouseTweaks")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Azumatt")] [assembly: AssemblyProduct("MouseTweaks")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")] [assembly: AssemblyFileVersion("1.0.2")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.2.0")] [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; } } } namespace MouseTweaks { [HarmonyPatch(typeof(InventoryGrid), "GetHoveredElement")] internal static class InventoryGridGetHoveredElementPatch { private static void Postfix(InventoryGrid __instance, ref Element __result) { //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_000d: 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_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut value = MouseTweaksPlugin.MoveNDrop.Value; if ((int)((KeyboardShortcut)(ref value)).MainKey == 0) { value = MouseTweaksPlugin.MoveNDrop2.Value; if ((int)((KeyboardShortcut)(ref value)).MainKey == 0) { return; } } if ((MouseTweaksPlugin.MoveNDrop.Value.IsKeyHeld() || MouseTweaksPlugin.MoveNDrop2.Value.IsKeyHeld()) && __result != null && Input.GetKey((KeyCode)323) && __instance.m_onSelected != null) { ItemData itemAt = __instance.GetInventory().GetItemAt(__instance.GetButtonPos(__result.m_go).x, __instance.GetButtonPos(__result.m_go).y); if (itemAt != null) { __instance.m_onSelected(__instance, itemAt, __result.m_pos, (Modifier)2); } } } } [BepInPlugin("Azumatt.MouseTweaks", "MouseTweaks", "1.0.2")] public class MouseTweaksPlugin : BaseUnityPlugin { internal const string ModName = "MouseTweaks"; internal const string ModVersion = "1.0.2"; internal const string Author = "Azumatt"; private const string ModGUID = "Azumatt.MouseTweaks"; private static string ConfigFileName = "Azumatt.MouseTweaks.cfg"; private static string ConfigFileFullPath; private readonly Harmony _harmony = new Harmony("Azumatt.MouseTweaks"); public static readonly ManualLogSource MouseTweaksLogger; internal static ConfigEntry<KeyboardShortcut> InventoryUseItemKeyCodeConfig; internal static ConfigEntry<KeyboardShortcut> MoveNDrop; internal static ConfigEntry<KeyboardShortcut> MoveNDrop2; public void Awake() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) InventoryUseItemKeyCodeConfig = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("1 - Input", "InventoryUseItem", new KeyboardShortcut((KeyCode)324, Array.Empty<KeyCode>()), "Keybinding for using/consuming/equipping an item in the inventory (Mouse1 = right mouse button).\nIf this is set to anything other than Mouse1, you no longer have to hold shift to split a stack when right clicking.\nAvailable KeyCodes can be found here: https://docs.unity3d.com/ScriptReference/KeyCode.html"); MoveNDrop = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("1 - Input", "Move & Drop Key1", new KeyboardShortcut((KeyCode)306, Array.Empty<KeyCode>()), "Keybinding that is held down to quick move or drop items from the player inventory.\nIf this is blank (None), the behaviour will not run and moving/dropping items quickly won't happen.\nAvailable KeyCodes can be found here: https://docs.unity3d.com/ScriptReference/KeyCode.html"); MoveNDrop2 = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("1 - Input", "Move & Drop Key2", new KeyboardShortcut((KeyCode)305, Array.Empty<KeyCode>()), "Alternative Keybinding that is held down to quick move or drop items from the player inventory. This is just defining a secondary key that you can also hold down.\nIf this is blank (None), the behaviour will not run and moving/dropping items quickly won't happen.\nAvailable KeyCodes can be found here: https://docs.unity3d.com/ScriptReference/KeyCode.html"); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); SetupWatcher(); } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } private void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName); fileSystemWatcher.Changed += ReadConfigValues; fileSystemWatcher.Created += ReadConfigValues; fileSystemWatcher.Renamed += ReadConfigValues; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } private void ReadConfigValues(object sender, FileSystemEventArgs e) { if (!File.Exists(ConfigFileFullPath)) { return; } try { MouseTweaksLogger.LogDebug((object)"ReadConfigValues called"); ((BaseUnityPlugin)this).Config.Reload(); } catch { MouseTweaksLogger.LogError((object)("There was an issue loading your " + ConfigFileName)); MouseTweaksLogger.LogError((object)"Please check your config entries for spelling and format!"); } } static MouseTweaksPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; MouseTweaksLogger = Logger.CreateLogSource("MouseTweaks"); InventoryUseItemKeyCodeConfig = null; MoveNDrop = null; MoveNDrop2 = null; } } public static class KeyboardExtensions { public static bool IsKeyDown(this KeyboardShortcut shortcut) { //IL_0002: 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) if ((int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey)) { return ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); } return false; } public static bool IsKeyHeld(this KeyboardShortcut shortcut) { //IL_0002: 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) if ((int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey)) { return ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); } return false; } } } namespace MouseTweaks.DropSingleItem { [HarmonyPatch(typeof(InventoryGui), "UpdateItemDrag")] internal class InventoryGui_UpdateItemDrag { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown MethodInfo method = typeof(ZInput).GetMethod("GetMouseButton", new Type[1] { typeof(int) }); List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 1; i < list.Count; i++) { if (list[i - 1].opcode == OpCodes.Ldc_I4_1 && CodeInstructionExtensions.Calls(list[i], method)) { list[i - 1] = new CodeInstruction(OpCodes.Nop, (object)null); list[i] = new CodeInstruction(OpCodes.Ldc_I4_S, (object)0); } } return list.AsEnumerable(); } } [HarmonyPatch(typeof(InventoryGui), "OnRightClickItem")] internal class InventoryGui_OnRightClickItem { public static bool Prefix(InventoryGui __instance, ref int ___m_dragAmount, InventoryGrid grid, ItemData item, Vector2i pos) { //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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_009f: Unknown result type (might be due to invalid IL or missing references) bool flag = (Object)(object)__instance.m_dragGo != (Object)null; KeyboardShortcut value = MouseTweaksPlugin.InventoryUseItemKeyCodeConfig.Value; bool flag2 = (int)((KeyboardShortcut)(ref value)).MainKey == 324; bool flag3 = flag2 && Input.GetKey((KeyCode)304); if (!flag2 || flag3) { if (!flag && item != null && item.m_stack > 1) { __instance.SetupDragItem(item, grid.GetInventory(), item.m_stack / 2); return false; } if (flag3) { return false; } } if (!flag) { return flag2; } ItemData dragItem = __instance.m_dragItem; if (!Utils.CanStackItem(dragItem, item)) { return false; } Inventory dragInventory = __instance.m_dragInventory; int dragAmount = __instance.m_dragAmount; int stack = dragItem.m_stack; ___m_dragAmount = 1; __instance.OnSelectedItem(grid, item, pos, (Modifier)0); int num = dragAmount - (stack - dragItem.m_stack); if (num > 0) { __instance.SetupDragItem(dragItem, dragInventory, num); } return false; } } [HarmonyPatch(typeof(InventoryGui), "Awake")] internal class InventoryGui_Awake { public static void Postfix(InventoryGui __instance, Button ___m_dropButton) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown InventoryGui __instance2 = __instance; ((UnityEvent)((Component)___m_dropButton).gameObject.AddComponent<RightClickButtonComponent>().OnRightClick).AddListener((UnityAction)delegate { OnDropSingleOutside(__instance2); }); } private static void OnDropSingleOutside(InventoryGui __instance) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)__instance.m_dragGo)) { return; } ItemData dragItem = __instance.m_dragItem; Inventory dragInventory = __instance.m_dragInventory; int dragAmount = __instance.m_dragAmount; int stack = dragItem.m_stack; MouseTweaksPlugin.MouseTweaksLogger.LogDebug((object)("Drop single item " + dragItem.m_shared.m_name)); if (!dragInventory.ContainsItem(dragItem)) { __instance.SetupDragItem((ItemData)null, (Inventory)null, 1); } else if (((Humanoid)Player.m_localPlayer).DropItem(dragInventory, dragItem, 1)) { __instance.m_moveItemEffects.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); int num = dragAmount - (stack - dragItem.m_stack); if (dragInventory.ContainsItem(dragItem) && num > 0) { __instance.SetupDragItem(dragItem, dragInventory, num); } else { __instance.SetupDragItem((ItemData)null, (Inventory)null, 1); } __instance.UpdateCraftingPanel(false); } } } [HarmonyPatch(typeof(InventoryGrid), "UpdateInventory")] internal class InventoryGrid_UpdateInventory { public static void Postfix(InventoryGrid __instance, Inventory inventory, ItemData dragItem) { //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_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut value = MouseTweaksPlugin.InventoryUseItemKeyCodeConfig.Value; if ((int)((KeyboardShortcut)(ref value)).MainKey != 324 && dragItem == null && MouseTweaksPlugin.InventoryUseItemKeyCodeConfig.Value.IsKeyDown()) { ItemData item = __instance.GetItem(new Vector2i(Input.mousePosition)); if (item != null && Object.op_Implicit((Object)(object)Player.m_localPlayer)) { ((Humanoid)Player.m_localPlayer).UseItem(inventory, item, true); } } } } [HarmonyPatch(typeof(InventoryGrid), "OnLeftClick")] internal class InventoryGrid_OnLeftClick { public struct State { public bool DoubleClicked; } private const float DoubleClickThreshold = 0.2f; private static float LastItemClickedTime; public static bool Prefix(ref State __state) { __state.DoubleClicked = (double)Time.unscaledTime - (double)LastItemClickedTime < 0.200000002980232; LastItemClickedTime = Time.unscaledTime; InventoryGui instance = InventoryGui.instance; if (!__state.DoubleClicked || !Object.op_Implicit((Object)(object)instance.m_dragGo)) { return true; } __state.DoubleClicked = false; GrabFullStackItemDrag(instance); return false; } public static void Postfix(State __state) { InventoryGui instance = InventoryGui.instance; if (__state.DoubleClicked && Object.op_Implicit((Object)(object)instance.m_dragGo)) { GrabFullStackItemDrag(instance); } } private static void GrabFullStackItemDrag(InventoryGui __instance) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) int dragAmount = __instance.m_dragAmount; Container currentContainer = __instance.m_currentContainer; if ((Object)(object)currentContainer != (Object)null) { GrabFullStackItemDrag(__instance, currentContainer.GetInventory()); } GrabFullStackItemDrag(__instance, ((Humanoid)Player.m_localPlayer).GetInventory()); ItemData dragItem = __instance.m_dragItem; int stack = dragItem.m_stack; if (dragAmount != stack) { __instance.m_moveItemEffects.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); __instance.SetupDragItem(dragItem, __instance.m_dragInventory, dragItem.m_stack); __instance.UpdateCraftingPanel(false); } } private static void GrabFullStackItemDrag(InventoryGui __instance, Inventory inventory) { ItemData dragItem = __instance.m_dragItem; Inventory dragInventory = __instance.m_dragInventory; List<ItemData> list = new List<ItemData>(); inventory.GetAllItems(dragItem.m_shared.m_name, list); while (list.Any() && dragItem.m_stack < dragItem.m_shared.m_maxStackSize) { ItemData val = list.Last(); list.RemoveAt(list.Count - 1); if (Utils.CanStackItem(dragItem, val)) { dragInventory.MoveItemToThis(inventory, val, val.m_stack, dragItem.m_gridPos.x, dragItem.m_gridPos.y); } } } } [HarmonyPatch(typeof(Button), "OnPointerClick")] internal class Button_OnPointerClick { public static void Postfix(Button __instance, PointerEventData eventData) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)eventData.button == 1 && ((UIBehaviour)__instance).IsActive() && ((Selectable)__instance).IsInteractable()) { RightClickButtonComponent component = ((Component)__instance).GetComponent<RightClickButtonComponent>(); if (Object.op_Implicit((Object)(object)component)) { ((UnityEvent)component.OnRightClick).Invoke(); } } } } internal static class InventoryGui_Extensions { public static void SetupDragItem(this InventoryGui instance, ItemData item, Inventory inventory, int amount) { Traverse.Create((object)instance).Method("SetupDragItem", new Type[3] { typeof(ItemData), typeof(Inventory), typeof(int) }, (object[])null).GetValue(new object[3] { item, inventory, amount }); } public static void UpdateCraftingPanel(this InventoryGui instance, bool focusView = false) { Traverse.Create((object)instance).Method("UpdateCraftingPanel", new Type[1] { typeof(bool) }, (object[])null).GetValue(new object[1] { focusView }); } public static void OnSelectedItem(this InventoryGui instance, InventoryGrid grid, ItemData item, Vector2i pos, Modifier mod) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) Traverse.Create((object)instance).Method("OnSelectedItem", new Type[4] { typeof(InventoryGrid), typeof(ItemData), typeof(Vector2i), typeof(Modifier) }, (object[])null).GetValue(new object[4] { grid, item, pos, mod }); } } internal class RightClickButtonComponent : MonoBehaviour { public ButtonClickedEvent OnRightClick = new ButtonClickedEvent(); } internal class Utils { public static bool CanStackItem(ItemData a, ItemData b) { if (a != null && b != null) { if (a != b && !(a.m_shared.m_name != b.m_shared.m_name) && a.m_shared.m_maxStackSize != 1 && b.m_shared.m_maxStackSize != 1) { if (a.m_shared.m_maxQuality > 1 || b.m_shared.m_maxQuality > 1) { return a.m_quality == b.m_quality; } return true; } return false; } return true; } } }