using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; 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(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyCompany("AltRowHotbarMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Supposedly swaps row of inventory with second row while holding alt")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("AltRowHotbarMod")] [assembly: AssemblyTitle("AltRowHotbarMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 AltRowHotbarMod { [BepInPlugin("com.cybin.altrowhotbar", "AltRowHotbar", "1.2.0")] public class AltRowHotbarPlugin : BaseUnityPlugin { [HarmonyPatch(typeof(HotkeyBar), "UpdateIcons")] public static class HotkeyBar_UpdateIcons_Patch { public static void Prefix(Player player) { if ((Object)(object)player == (Object)null || ((Humanoid)player).GetInventory() == null || !IsModifierActive()) { return; } Inventory inventory = ((Humanoid)player).GetInventory(); FieldInfo fieldInfo = AccessTools.Field(typeof(Inventory), "m_inventory"); if (fieldInfo == null || !(fieldInfo.GetValue(inventory) is List list)) { return; } foreach (ItemData item in list) { if (item.m_gridPos.y == 0) { item.m_gridPos.y = 99; } else if (item.m_gridPos.y == 1) { item.m_gridPos.y = 0; } } } public static void Postfix(Player player) { if ((Object)(object)player == (Object)null || ((Humanoid)player).GetInventory() == null || !IsModifierActive()) { return; } Inventory inventory = ((Humanoid)player).GetInventory(); FieldInfo fieldInfo = AccessTools.Field(typeof(Inventory), "m_inventory"); if (fieldInfo == null || !(fieldInfo.GetValue(inventory) is List list)) { return; } foreach (ItemData item in list) { if (item.m_gridPos.y == 0) { item.m_gridPos.y = 1; } else if (item.m_gridPos.y == 99) { item.m_gridPos.y = 0; } } } } [HarmonyPatch(typeof(Player), "UseHotbarItem")] public static class Player_UseHotbarItem_Patch { public static bool Prefix(Player __instance, int index) { if (!IsModifierActive()) { return true; } Inventory inventory = ((Humanoid)__instance).GetInventory(); if (inventory == null) { return true; } ItemData itemAt = inventory.GetItemAt(index - 1, 1); if (itemAt != null) { ((Humanoid)__instance).UseItem((Inventory)null, itemAt, false); } return false; } } private const string ModGUID = "com.cybin.altrowhotbar"; private const string ModName = "AltRowHotbar"; private const string ModVersion = "1.2.0"; private readonly Harmony harmony = new Harmony("com.cybin.altrowhotbar"); public static ConfigEntry HotbarModifierKey; public static ConfigEntry UseToggleBehavior; private static bool isToggleActive; private void Awake() { HotbarModifierKey = ((BaseUnityPlugin)this).Config.Bind("General", "ModifierKey", (KeyCode)308, "The key you interact with to display and use the second row of your inventory on your hotbar (e.g., LeftAlt, LeftControl, V, G)."); UseToggleBehavior = ((BaseUnityPlugin)this).Config.Bind("General", "UseAsToggle", false, "If set to true, pressing the modifier key once will permanently toggle the secondary hotbar row on or off. If false, you must hold the key down."); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"AltRowHotbar v1.2.0 initialized. Configurable holding/toggling mechanics active!"); } private void Update() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (InventoryGui.IsVisible() || Menu.IsVisible()) { isToggleActive = false; } else if (Input.GetKeyDown(HotbarModifierKey.Value) && UseToggleBehavior.Value) { isToggleActive = !isToggleActive; } } public static bool IsModifierActive() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (InventoryGui.IsVisible() || Menu.IsVisible()) { return false; } if (UseToggleBehavior.Value) { return isToggleActive; } return Input.GetKey(HotbarModifierKey.Value); } } }