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 ComfyQuickSlots v1.9.0
ComfyQuickSlots.dll
Decompiled 6 months agousing System; 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.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ComfyLib; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ComfyQuickSlots")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ComfyQuickSlots")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("08d30e30-98ba-4364-8410-f0d2534129ba")] [assembly: AssemblyFileVersion("1.9.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.9.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 ComfyQuickSlots { [BepInPlugin("com.bruce.valheim.comfyquickslots", "ComfyQuickSlots", "1.9.0")] public sealed class ComfyQuickSlots : BaseUnityPlugin { public const string PluginGuid = "com.bruce.valheim.comfyquickslots"; public const string PluginName = "ComfyQuickSlots"; public const string PluginVersion = "1.9.0"; private static ManualLogSource _logger; private void Awake() { _logger = ((BaseUnityPlugin)this).Logger; PluginConfig.BindConfig(((BaseUnityPlugin)this).Config); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.bruce.valheim.comfyquickslots"); } public static void LogInfo(object obj) { _logger.LogInfo((object)$"[{DateTime.Now.ToString(DateTimeFormatInfo.InvariantInfo)}] {obj}"); } private void Update() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if (Object.op_Implicit((Object)(object)localPlayer) && PluginConfig.EnableQuickslots.Value && ((Character)localPlayer).TakeInput()) { ItemData val = null; if (ZInput.GetKeyDown(PluginConfig.QuickSlot3.Value, true)) { val = ((Humanoid)localPlayer).GetInventory().GetItemAt(7, 4); } if (ZInput.GetKeyDown(PluginConfig.QuickSlot2.Value, true)) { val = ((Humanoid)localPlayer).GetInventory().GetItemAt(6, 4); } if (ZInput.GetKeyDown(PluginConfig.QuickSlot1.Value, true)) { val = ((Humanoid)localPlayer).GetInventory().GetItemAt(5, 4); } if (val != null && !localPlayer.IsEquipActionQueued(val)) { ((Humanoid)localPlayer).UseItem((Inventory)null, val, false); } } } } public sealed class PluginConfig { public static ConfigEntry<bool> IsModEnabled { get; private set; } public static ConfigEntry<bool> EnableQuickslots { get; private set; } public static ConfigEntry<KeyCode> QuickSlot1 { get; private set; } public static ConfigEntry<KeyCode> QuickSlot2 { get; private set; } public static ConfigEntry<KeyCode> QuickSlot3 { get; private set; } public static ConfigEntry<TextAnchor> QuickSlotsAnchor { get; private set; } public static ConfigEntry<Vector2> QuickSlotsPosition { get; private set; } public static ConfigEntry<Vector2> ContainerInventoryGridAnchoredPosition { get; private set; } public static ConfigEntry<string> LogFilesPath { get; private set; } public static void BindConfig(ConfigFile config) { //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) IsModEnabled = config.BindInOrder("_Global", "isModEnabled", defaultValue: true, "Globally enable or disable this mod."); EnableQuickslots = config.BindInOrder("QuickSlotToggles", "quickSlotEnable", defaultValue: true, "Enables or disables quickslots."); QuickSlot1 = config.BindInOrder<KeyCode>("QuickSlotBinding", "quickSlot1Use", (KeyCode)122, "Hot key for item use in quick slot 1"); QuickSlot1.OnSettingChanged<KeyCode>(QuickSlotsManager.RefreshBindings); QuickSlot2 = config.BindInOrder<KeyCode>("QuickSlotBinding", "quickSlot2Use", (KeyCode)118, "Hot key for item use in quick slot 2"); QuickSlot2.OnSettingChanged<KeyCode>(QuickSlotsManager.RefreshBindings); QuickSlot3 = config.BindInOrder<KeyCode>("QuickSlotBinding", "quickSlot3Use", (KeyCode)98, "Hot key for item use in quick slot 3"); QuickSlot3.OnSettingChanged<KeyCode>(QuickSlotsManager.RefreshBindings); QuickSlotsAnchor = config.BindInOrder<TextAnchor>("QuickSlotsAnchor", "quickSlotsAnchor", (TextAnchor)6, "The point on the HUD to anchor the Quick Slots bar.\nChanging this also changes the pivot of the Quick Slots to that corner."); QuickSlotsPosition = config.BindInOrder<Vector2>("QuickSlotsOffset", "quickSlotsOffset", new Vector2(216f, 150f), "The position offset from the Quick Slots Anchor at which to place the QuickSlots."); ContainerInventoryGridAnchoredPosition = config.BindInOrder<Vector2>("Container.InventoryGrid", "anchoredPosition", new Vector2(40f, -437f), "The anchoredPosition for the the Container.InventoryGrid panel."); LogFilesPath = config.BindInOrder("Logging", "logFilesPath", "ItemsOnDeath/", "Path to where logging of items on death are saved."); Directory.CreateDirectory(LogFilesPath.Value); } } public sealed class ConfigPositionedElement : MonoBehaviour { public ConfigEntry<TextAnchor> AnchorConfig; public ConfigEntry<Vector2> PositionConfig; private RectTransform _rt; private TextAnchor _currentAnchor; private void Awake() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown _rt = (RectTransform)((Component)this).transform; EnsureCorrectPosition(); } private void Update() { EnsureCorrectPosition(); } public void EnsureCorrectPosition() { //IL_0011: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected I4, but got Unknown //IL_0029: 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) //IL_00ab: 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) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: 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_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: 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) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: 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_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) if (AnchorConfig != null && PositionConfig != null && (_currentAnchor != AnchorConfig.Value || !(_rt.anchoredPosition == PositionConfig.Value))) { _currentAnchor = AnchorConfig.Value; TextAnchor currentAnchor = _currentAnchor; Vector2 val = default(Vector2); switch ((int)currentAnchor) { case 0: { RectTransform rt25 = _rt; RectTransform rt26 = _rt; RectTransform rt27 = _rt; ((Vector2)(ref val))..ctor(0f, 1f); rt27.anchorMax = val; Vector2 pivot = (rt26.anchorMin = val); rt25.pivot = pivot; break; } case 1: { RectTransform rt22 = _rt; RectTransform rt23 = _rt; RectTransform rt24 = _rt; ((Vector2)(ref val))..ctor(0.5f, 1f); rt24.anchorMax = val; Vector2 pivot = (rt23.anchorMin = val); rt22.pivot = pivot; break; } case 2: { RectTransform rt19 = _rt; RectTransform rt20 = _rt; RectTransform rt21 = _rt; ((Vector2)(ref val))..ctor(1f, 1f); rt21.anchorMax = val; Vector2 pivot = (rt20.anchorMin = val); rt19.pivot = pivot; break; } case 3: { RectTransform rt16 = _rt; RectTransform rt17 = _rt; RectTransform rt18 = _rt; ((Vector2)(ref val))..ctor(0f, 0.5f); rt18.anchorMax = val; Vector2 pivot = (rt17.anchorMin = val); rt16.pivot = pivot; break; } case 4: { RectTransform rt13 = _rt; RectTransform rt14 = _rt; RectTransform rt15 = _rt; ((Vector2)(ref val))..ctor(0.5f, 0.5f); rt15.anchorMax = val; Vector2 pivot = (rt14.anchorMin = val); rt13.pivot = pivot; break; } case 5: { RectTransform rt10 = _rt; RectTransform rt11 = _rt; RectTransform rt12 = _rt; ((Vector2)(ref val))..ctor(1f, 0.5f); rt12.anchorMax = val; Vector2 pivot = (rt11.anchorMin = val); rt10.pivot = pivot; break; } case 6: { RectTransform rt7 = _rt; RectTransform rt8 = _rt; RectTransform rt9 = _rt; ((Vector2)(ref val))..ctor(0f, 0f); rt9.anchorMax = val; Vector2 pivot = (rt8.anchorMin = val); rt7.pivot = pivot; break; } case 7: { RectTransform rt4 = _rt; RectTransform rt5 = _rt; RectTransform rt6 = _rt; ((Vector2)(ref val))..ctor(0.5f, 0f); rt6.anchorMax = val; Vector2 pivot = (rt5.anchorMin = val); rt4.pivot = pivot; break; } case 8: { RectTransform rt = _rt; RectTransform rt2 = _rt; RectTransform rt3 = _rt; ((Vector2)(ref val))..ctor(1f, 0f); rt3.anchorMax = val; Vector2 pivot = (rt2.anchorMin = val); rt.pivot = pivot; break; } } _rt.anchoredPosition = PositionConfig.Value; } } } public static class QuickSlotsManager { public const string PlayerInventoryName = "ComfyQuickSlotsInventory"; public const int Rows = 5; public const int Columns = 8; public const string PlayerDataKey = "ComfyQuickSlotsInventory"; public const int QuickSlotsCount = 3; public static readonly List<ItemType> ArmorSlotTypes = new List<ItemType>(5) { (ItemType)6, (ItemType)7, (ItemType)11, (ItemType)17, (ItemType)18 }; public static bool FirstLoad = false; public static List<ItemData> InitialEquippedArmor = new List<ItemData>(); public static Vector2i HelmetSlot = new Vector2i(0, 4); public static Vector2i ChestSlot = new Vector2i(1, 4); public static Vector2i LegsSlot = new Vector2i(2, 4); public static Vector2i ShoulderSlot = new Vector2i(3, 4); public static Vector2i UtilitySlot = new Vector2i(4, 4); public static Vector2i QuickSlot1 = new Vector2i(5, 4); public static Vector2i QuickSlot2 = new Vector2i(6, 4); public static Vector2i QuickSlot3 = new Vector2i(7, 4); public static List<Vector2i> ArmorSlots = new List<Vector2i>(5) { HelmetSlot, ChestSlot, LegsSlot, ShoulderSlot, UtilitySlot }; public static List<Vector2i> QuickSlots = new List<Vector2i>(3) { QuickSlot1, QuickSlot2, QuickSlot3 }; public static bool OnMenuLoad = false; public static bool ShouldRefreshPlayerGrid { get; set; } public static void SetupPlayerInventory(Inventory inventory) { inventory.m_name = "ComfyQuickSlotsInventory"; inventory.m_height = 5; inventory.m_width = 8; } public static void RefreshBindings() { ShouldRefreshPlayerGrid = true; } public static bool AddItemToExistingStacks(Inventory inventory, ItemData item) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) int i = 0; if (item.m_shared.m_maxStackSize > 1) { for (; i < item.m_stack; i++) { ItemData val = inventory.FindFreeStackItem(item.m_shared.m_name, item.m_quality, (float)item.m_worldLevel); if (val != null) { val.m_stack++; continue; } item.m_stack -= i; Vector2i emptyInventorySlot = GetEmptyInventorySlot(inventory, topFirst: true); if (emptyInventorySlot.x >= 0) { item.m_gridPos = emptyInventorySlot; inventory.m_inventory.Add(item); return true; } return false; } } return false; } public static bool AddItemToSlot(Humanoid humanoid, ItemData item, int x, int y) { //IL_0014: 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) humanoid.GetInventory().m_inventory.Add(item); item.m_gridPos = new Vector2i(x, y); return true; } public static void EquipAndAddItem(Humanoid humanoid, ItemData item) { humanoid.m_inventory.AddItem(item); EquipItem(humanoid, item); } public static bool EquipArmorInArmorSlots(Player player) { for (int i = 0; i < 5; i++) { if (((Humanoid)player).GetInventory().GetItemAt(i, 4) != null) { EquipItem((Humanoid)(object)player, ((Humanoid)player).GetInventory().GetItemAt(i, 4)); } } return true; } public static void EquipItem(Humanoid humanoid, ItemData item) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Invalid comparison between Unknown and I4 //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Invalid comparison between Unknown and I4 //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Invalid comparison between Unknown and I4 if ((int)item.m_shared.m_itemType == 6) { humanoid.m_helmetItem = item; } else if ((int)item.m_shared.m_itemType == 7) { humanoid.m_chestItem = item; } else if ((int)item.m_shared.m_itemType == 11) { humanoid.m_legItem = item; } else if ((int)item.m_shared.m_itemType == 17) { humanoid.m_shoulderItem = item; } else if ((int)item.m_shared.m_itemType == 18) { humanoid.m_utilityItem = item; } item.m_equipped = true; humanoid.SetupEquipment(); humanoid.TriggerEquipEffect(item); } public static void GetAllArmorFirst(Player player) { if (((Humanoid)player).m_helmetItem != null) { InitialEquippedArmor.Add(((Humanoid)player).m_helmetItem); } if (((Humanoid)player).m_chestItem != null) { InitialEquippedArmor.Add(((Humanoid)player).m_chestItem); } if (((Humanoid)player).m_legItem != null) { InitialEquippedArmor.Add(((Humanoid)player).m_legItem); } if (((Humanoid)player).m_shoulderItem != null) { InitialEquippedArmor.Add(((Humanoid)player).m_shoulderItem); } if (((Humanoid)player).m_utilityItem != null) { InitialEquippedArmor.Add(((Humanoid)player).m_utilityItem); } } public static ItemData GetArmorItemToSwap(Humanoid humanoid, ItemData item) { //IL_0006: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 ItemType itemType = item.m_shared.m_itemType; if ((int)itemType <= 7) { if ((int)itemType == 6) { return humanoid.m_helmetItem; } if ((int)itemType == 7) { return humanoid.m_chestItem; } } else { if ((int)itemType == 11) { return humanoid.m_legItem; } if ((int)itemType == 17) { return humanoid.m_shoulderItem; } if ((int)itemType == 18) { return humanoid.m_utilityItem; } } return null; } public static Vector2i GetArmorSlot(ItemData item) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return ArmorSlots[GetArmorTypeIndex(item)]; } public static int GetArmorSlotIndex(Vector2i loc) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return ArmorSlots.IndexOf(loc); } public static int GetArmorTypeIndex(ItemData item) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return ArmorSlotTypes.IndexOf(item.m_shared.m_itemType); } public static Vector2i GetEmptyInventorySlot(Inventory inventory, bool topFirst) { //IL_0097: 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_001b: 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_0035: Unknown result type (might be due to invalid IL or missing references) if (topFirst) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 8; j++) { if (inventory.GetItemAt(j, i) == null && i != 4) { return new Vector2i(j, i); } if (j > 4 && i == 4 && inventory.GetItemAt(j, i) == null) { return new Vector2i(j, i); } } } } else { for (int num = 4; num >= 0; num--) { for (int k = 0; k < 8; k++) { if (inventory.GetItemAt(k, num) == null && num != 4) { return new Vector2i(k, num); } if (k > 4 && num == 4 && inventory.GetItemAt(k, num) == null) { return new Vector2i(k, num); } } } } return new Vector2i(-1, -1); } public static bool HaveEmptyInventorySlot(Inventory inventory) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 5; j++) { if (inventory.GetItemAt(i, j) == null && j != 4) { return true; } if (i > 4 && j == 4 && inventory.GetItemAt(i, j) == null) { return true; } } } return false; } public static bool IsArmor(ItemData item) { //IL_0006: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 ItemType itemType = item.m_shared.m_itemType; if ((int)itemType <= 7) { if ((int)itemType == 6) { return true; } if ((int)itemType == 7) { return true; } } else { if ((int)itemType == 11) { return true; } if ((int)itemType == 17) { return true; } if ((int)itemType == 18) { return true; } } return false; } public static bool IsArmorSlot(Vector2i loc) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) if (ArmorSlots.Contains(loc)) { return true; } return false; } public static bool IsArmorTypeEquipped(Humanoid humanoid, ItemData item) { //IL_0006: 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) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 ItemType itemType = item.m_shared.m_itemType; if ((int)itemType <= 7) { if ((int)itemType == 6) { return humanoid.m_helmetItem != null; } if ((int)itemType == 7) { return humanoid.m_chestItem != null; } } else { if ((int)itemType == 11) { return humanoid.m_legItem != null; } if ((int)itemType == 17) { return humanoid.m_shoulderItem != null; } if ((int)itemType == 18) { return humanoid.m_utilityItem != null; } } return false; } public static bool IsQuickSlot(Vector2i loc) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) if (QuickSlots.Contains(loc)) { return true; } return false; } public static bool IsSimilarItemEquipped(ItemData item) { foreach (ItemData equippedItem in ((Humanoid)Player.m_localPlayer).GetInventory().GetEquippedItems()) { if (item.m_shared.m_name.Equals(equippedItem.m_shared.m_name)) { return true; } } return false; } public static int ItemCountInInventory(Inventory inventory, ItemData item) { string name = item.m_shared.m_name; int num = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 8; j++) { ItemData itemAt = inventory.GetItemAt(j, i); if (itemAt != null && itemAt.m_shared.m_name == name) { num++; } } } return num; } public static bool MoveArmorItemToSlot(Humanoid humanoid, ItemData item, int x, int y) { //IL_0028: 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) ItemData itemAt = humanoid.GetInventory().GetItemAt(x, y); if (itemAt != null && !((object)itemAt).Equals((object?)item)) { return SwapArmorItems(humanoid, item, itemAt, x, y); } item.m_gridPos = new Vector2i(x, y); if (!humanoid.GetInventory().m_inventory.Contains(item)) { humanoid.GetInventory().AddItem(item); humanoid.GetInventory().Changed(); return true; } return false; } public static bool Save(Player player) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown ZPackage val = new ZPackage(); ((Humanoid)player).GetInventory().Save(val); if (player.m_knownTexts.ContainsKey("ComfyQuickSlotsInventory")) { player.m_knownTexts["ComfyQuickSlotsInventory"] = val.GetBase64(); } else { player.m_knownTexts.Add("ComfyQuickSlotsInventory", val.GetBase64()); } return true; } public static bool SwapArmorItems(Humanoid humanoid, ItemData itemToMove, ItemData itemInArmorSlot, int armorSlotX, int armorSlotY) { //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_000b: 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_0016: 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) Vector2i gridPos = itemToMove.m_gridPos; itemToMove.m_gridPos = new Vector2i(armorSlotX, armorSlotY); itemInArmorSlot.m_gridPos = gridPos; humanoid.GetInventory().Changed(); return false; } public static bool UnequipAllArmor(Player player) { Inventory inventory = ((Humanoid)player).GetInventory(); for (int i = 0; i < 5; i++) { ItemData itemAt = inventory.GetItemAt(i, 4); if (itemAt != null) { UnequipItem((Humanoid)(object)player, itemAt); } } return true; } public static bool UnequipItem(Humanoid player, ItemData item) { if (player.m_helmetItem == item) { player.m_helmetItem = null; item.m_equipped = false; player.SetupEquipment(); player.TriggerEquipEffect(item); return true; } if (player.m_chestItem == item) { player.m_chestItem = null; item.m_equipped = false; player.SetupEquipment(); player.TriggerEquipEffect(item); return true; } if (player.m_legItem == item) { player.m_legItem = null; item.m_equipped = false; player.SetupEquipment(); player.TriggerEquipEffect(item); return true; } if (player.m_shoulderItem == item) { player.m_shoulderItem = null; item.m_equipped = false; player.SetupEquipment(); player.TriggerEquipEffect(item); return true; } if (player.m_utilityItem == item) { player.m_utilityItem = null; item.m_equipped = false; player.SetupEquipment(); player.TriggerEquipEffect(item); return true; } return false; } public static bool CanAddItem(Inventory inventory, ItemData item, int stack) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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_0050: Unknown result type (might be due to invalid IL or missing references) int num = inventory.m_width * inventory.m_height - 5; int num2 = 0; string name = item.m_shared.m_name; int worldLevel = item.m_worldLevel; foreach (ItemData item2 in inventory.m_inventory) { Vector2i gridPos = item2.m_gridPos; if (gridPos.y != 4 || gridPos.x > 4) { num--; if (item2.m_shared.m_name == name && item2.m_worldLevel == worldLevel) { num2 += item2.m_shared.m_maxStackSize - item2.m_stack; } } } if (stack <= 0) { stack = item.m_stack; } if (num <= 0) { return num2 + num * item.m_shared.m_maxStackSize >= stack; } return true; } public static bool HasEmptyNonEquipmentSlot(Inventory inventory) { //IL_0025: 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_002b: 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) int num = inventory.m_width * inventory.m_height - 5; foreach (ItemData item in inventory.m_inventory) { Vector2i gridPos = item.m_gridPos; if (gridPos.y != 4 || gridPos.x > 4) { num--; } } return num > 0; } public static int FindFreeNonEquipmentStackSpace(Inventory inventory, string itemName, int worldLevel) { //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_001f: 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) int num = 0; foreach (ItemData item in inventory.m_inventory) { Vector2i gridPos = item.m_gridPos; if ((gridPos.y != 4 || gridPos.x > 4) && item.m_shared.m_name == itemName && item.m_worldLevel == worldLevel) { num += item.m_shared.m_maxStackSize - item.m_stack; } } return num; } } public static class TombStoneManager { public static readonly int IsAdditionalTombStoneHash = StringExtensionMethods.GetStableHashCode("cqs.tombstone"); public static void CreateTombStone(Player player) { Inventory inventory = ((Humanoid)player).GetInventory(); inventory.m_height = 4; inventory.m_width = 8; InventoryLogger.LogInventoryToFile(inventory, Path.Combine(PluginConfig.LogFilesPath.Value, $"{player.GetPlayerID()}.csv")); GameObject obj = CreateAdditionalTombStone(player); SetupAdditionalTombStone(obj.GetComponent<TombStone>()); Inventory inventory2 = obj.GetComponent<Container>().GetInventory(); if (!ZoneSystem.instance.GetGlobalKey((GlobalKeys)15)) { QuickSlotsManager.UnequipAllArmor(player); ((Humanoid)player).UnequipAllItems(); } foreach (ItemData item in inventory.GetAllItems().ToList()) { if (item.m_gridPos.y >= 4 && !item.m_equipped) { inventory2.AddItem(item); inventory.RemoveItem(item); } } } private static GameObject CreateAdditionalTombStone(Player player) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_001b: 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_0037: 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_0050: Unknown result type (might be due to invalid IL or missing references) GameObject obj = Object.Instantiate<GameObject>(player.m_tombstone, ((Character)player).GetCenterPoint() + Vector3.up * 1.25f, ((Component)player).transform.rotation); Transform transform = obj.transform; transform.localScale -= new Vector3(0.5f, 0.5f, 0.5f); return obj; } private static void SetupAdditionalTombStone(TombStone tombStone) { PlayerProfile playerProfile = Game.instance.GetPlayerProfile(); ZDO zdo = tombStone.m_nview.m_zdo; zdo.Set(ZDOVars.s_owner, playerProfile.GetPlayerID()); zdo.Set(ZDOVars.s_ownerName, playerProfile.GetName()); zdo.Set(IsAdditionalTombStoneHash, true); } public static bool IsAdditionalTombStone(TombStone tombStone) { return tombStone.m_nview.m_zdo.GetBool(IsAdditionalTombStoneHash, false); } } public static class InventoryLogger { public static readonly string InventoryCsvHeaderRow = string.Join(",", "name", "crafterId", "crafterName", "gridpos.x", "gridpos.y", "quality", "stack", "variant"); public static void LogInventoryToFile(Inventory inventory, string filename) { using StreamWriter streamWriter = File.CreateText(filename); streamWriter.AutoFlush = true; streamWriter.WriteLine(InventoryCsvHeaderRow); foreach (ItemData item in inventory.m_inventory) { streamWriter.WriteLine(ItemToCsvRow(item)); } } private static string ItemToCsvRow(ItemData item) { return string.Join(",", EscapeCsvField(item.m_shared.m_name), item.m_crafterID, EscapeCsvField(item.m_crafterName), item.m_gridPos.x, item.m_gridPos.y, item.m_quality, item.m_stack, item.m_variant); } private static string EscapeCsvField(string valueToEscape) { if (valueToEscape.Contains(",")) { return "\"" + valueToEscape + "\""; } return valueToEscape; } } public static class KeyCodeUtils { public static readonly Dictionary<KeyCode, string> KeyCodeToShortText = new Dictionary<KeyCode, string> { { (KeyCode)97, "A" }, { (KeyCode)98, "B" }, { (KeyCode)99, "C" }, { (KeyCode)100, "D" }, { (KeyCode)101, "E" }, { (KeyCode)102, "F" }, { (KeyCode)103, "G" }, { (KeyCode)104, "H" }, { (KeyCode)105, "I" }, { (KeyCode)106, "J" }, { (KeyCode)107, "K" }, { (KeyCode)108, "L" }, { (KeyCode)109, "M" }, { (KeyCode)110, "N" }, { (KeyCode)111, "O" }, { (KeyCode)112, "P" }, { (KeyCode)113, "Q" }, { (KeyCode)114, "R" }, { (KeyCode)115, "S" }, { (KeyCode)116, "T" }, { (KeyCode)117, "U" }, { (KeyCode)118, "V" }, { (KeyCode)119, "W" }, { (KeyCode)120, "X" }, { (KeyCode)121, "Y" }, { (KeyCode)122, "Z" }, { (KeyCode)257, "kp1" }, { (KeyCode)258, "kp2" }, { (KeyCode)259, "kp3" }, { (KeyCode)260, "kp4" }, { (KeyCode)261, "kp5" }, { (KeyCode)262, "kp6" }, { (KeyCode)263, "kp7" }, { (KeyCode)264, "kp8" }, { (KeyCode)265, "kp9" }, { (KeyCode)256, "kp10" }, { (KeyCode)33, "!" }, { (KeyCode)34, "\"" }, { (KeyCode)35, "#" }, { (KeyCode)36, "$" }, { (KeyCode)38, "&" }, { (KeyCode)39, "'" }, { (KeyCode)40, "(" }, { (KeyCode)41, ")" }, { (KeyCode)42, "*" }, { (KeyCode)43, "+" }, { (KeyCode)44, "," }, { (KeyCode)45, "-" }, { (KeyCode)46, "." }, { (KeyCode)47, "/" }, { (KeyCode)58, ":" }, { (KeyCode)59, ";" }, { (KeyCode)60, "<" }, { (KeyCode)61, "=" }, { (KeyCode)62, ">" }, { (KeyCode)63, "?" }, { (KeyCode)64, "@" }, { (KeyCode)91, "[" }, { (KeyCode)92, "\\" }, { (KeyCode)93, "]" }, { (KeyCode)94, "^" }, { (KeyCode)95, "_" }, { (KeyCode)96, "`" }, { (KeyCode)49, "1" }, { (KeyCode)50, "2" }, { (KeyCode)51, "3" }, { (KeyCode)52, "4" }, { (KeyCode)53, "5" }, { (KeyCode)54, "6" }, { (KeyCode)55, "7" }, { (KeyCode)56, "8" }, { (KeyCode)57, "9" }, { (KeyCode)48, "0" }, { (KeyCode)266, "kp ." }, { (KeyCode)267, "kp //" }, { (KeyCode)268, "kp *" }, { (KeyCode)269, "kp -" }, { (KeyCode)270, "kp +" }, { (KeyCode)272, "kp =" } }; public static string ToShortString(this KeyCode keyCode) { //IL_0005: 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) if (!KeyCodeToShortText.ContainsKey(keyCode)) { return ((object)(KeyCode)(ref keyCode)).ToString(); } return KeyCodeToShortText[keyCode]; } public static string ToShortString(this KeyboardShortcut keyboardShortcut) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) return string.Join(" + ", ((KeyboardShortcut)(ref keyboardShortcut)).Modifiers.Concat(Enumerable.Repeat<KeyCode>(((KeyboardShortcut)(ref keyboardShortcut)).MainKey, 1)).Select(ToShortString)); } } [HarmonyPatch(typeof(FejdStartup))] internal static class FejdStartupPatch { [HarmonyPrefix] [HarmonyPatch("SetupCharacterPreview")] private static void SetupCharacterPreviewPrefix() { QuickSlotsManager.InitialEquippedArmor.Clear(); QuickSlotsManager.FirstLoad = false; } } [HarmonyPatch(typeof(HotkeyBar))] internal static class HotkeyBarPatch { public static GameObject QuickSlotsHotkeyBar; public static int SelectedHotkeyBarIndex = -1; public static int[] HotkeyIndices = new int[3] { 37, 38, 39 }; public static string[] HotkeyTexts = new string[3] { PluginConfig.QuickSlot1.Value.ToShortString(), PluginConfig.QuickSlot2.Value.ToShortString(), PluginConfig.QuickSlot3.Value.ToShortString() }; [HarmonyPrefix] [HarmonyPatch("UpdateIcons")] private static bool HotkeyBarPrefix(HotkeyBar __instance, Player player) { //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: 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_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0399: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) if (((Object)__instance).name != "QuickSlotsHotkeyBar") { return true; } if (__instance.m_elements == null) { return false; } foreach (ElementData element in __instance.m_elements) { Object.Destroy((Object)(object)element.m_go); } __instance.m_elements.Clear(); if ((Object)(object)player == (Object)null || ((Character)player).IsDead() || !PluginConfig.EnableQuickslots.Value || __instance.m_items == null) { return false; } HotkeyTexts = new string[3] { PluginConfig.QuickSlot1.Value.ToShortString(), PluginConfig.QuickSlot2.Value.ToShortString(), PluginConfig.QuickSlot3.Value.ToShortString() }; __instance.m_items.Clear(); for (int i = 5; i < 8; i++) { if (((Humanoid)player).GetInventory().GetItemAt(i, 4) != null) { __instance.m_items.Add(((Humanoid)player).GetInventory().GetItemAt(i, 4)); } } for (int j = 0; j < 3; j++) { ElementData val = new ElementData { m_go = Object.Instantiate<GameObject>(__instance.m_elementPrefab, ((Component)__instance).transform) }; val.m_go.transform.localPosition = new Vector3((float)j * __instance.m_elementSpace, 0f, 0f); val.m_icon = ((Component)((Component)val.m_go.transform).transform.Find("icon")).GetComponent<Image>(); val.m_durability = ((Component)val.m_go.transform.Find("durability")).GetComponent<GuiBar>(); val.m_amount = ((Component)val.m_go.transform.Find("amount")).GetComponent<TMP_Text>(); val.m_equiped = ((Component)val.m_go.transform.Find("equiped")).gameObject; val.m_queued = ((Component)val.m_go.transform.Find("queued")).gameObject; val.m_selection = ((Component)val.m_go.transform.Find("selected")).gameObject; TMP_Text component = ((Component)val.m_go.transform.Find("binding")).GetComponent<TMP_Text>(); ((Behaviour)component).enabled = true; component.text = HotkeyTexts[j]; __instance.m_elements.Add(val); } foreach (ElementData element2 in __instance.m_elements) { element2.m_used = false; } bool flag = ZInput.IsGamepadActive(); foreach (ItemData item in __instance.m_items) { ElementData val2 = __instance.m_elements[item.m_gridPos.x - 5]; val2.m_used = true; ((Component)val2.m_icon).gameObject.SetActive(true); val2.m_icon.sprite = item.GetIcon(); ((Component)val2.m_durability).gameObject.SetActive(item.m_shared.m_useDurability); if (item.m_shared.m_useDurability) { if ((double)item.m_durability <= 0.0) { val2.m_durability.SetValue(1f); val2.m_durability.SetColor((Color)(((double)Mathf.Sin(Time.time * 10f) > 0.0) ? Color.red : new Color(0f, 0f, 0f, 0f))); } else { val2.m_durability.SetValue(item.GetDurabilityPercentage()); val2.m_durability.ResetColor(); } } val2.m_equiped.SetActive(item.m_equipped); val2.m_queued.SetActive(player.IsEquipActionQueued(item)); if (item.m_shared.m_maxStackSize > 1) { ((Component)val2.m_amount).gameObject.SetActive(true); val2.m_amount.text = item.m_stack + "/" + item.m_shared.m_maxStackSize; } else { ((Component)val2.m_amount).gameObject.SetActive(false); } } for (int k = 0; k < __instance.m_elements.Count; k++) { ElementData val3 = __instance.m_elements[k]; val3.m_selection.SetActive(flag && k == __instance.m_selected); if (!val3.m_used) { ((Component)val3.m_icon).gameObject.SetActive(false); ((Component)val3.m_durability).gameObject.SetActive(false); val3.m_equiped.SetActive(false); val3.m_queued.SetActive(false); ((Component)val3.m_amount).gameObject.SetActive(false); } } return false; } } [HarmonyPatch(typeof(Hud))] internal static class HudPatch { private static HotkeyBar hotkeyBar; [HarmonyPostfix] [HarmonyPatch("Awake")] private static void AwakePostfix(Hud __instance) { hotkeyBar = ((Component)__instance).GetComponentInChildren<HotkeyBar>(); if (PluginConfig.IsModEnabled.Value && !Object.op_Implicit((Object)(object)HotkeyBarPatch.QuickSlotsHotkeyBar) && PluginConfig.EnableQuickslots.Value) { HotkeyBarPatch.QuickSlotsHotkeyBar = Object.Instantiate<GameObject>(((Component)hotkeyBar).gameObject, __instance.m_rootObject.transform, true); ((Object)HotkeyBarPatch.QuickSlotsHotkeyBar).name = "QuickSlotsHotkeyBar"; HotkeyBarPatch.QuickSlotsHotkeyBar.GetComponent<HotkeyBar>().m_selected = -1; ConfigPositionedElement configPositionedElement = HotkeyBarPatch.QuickSlotsHotkeyBar.AddComponent<ConfigPositionedElement>(); configPositionedElement.PositionConfig = PluginConfig.QuickSlotsPosition; configPositionedElement.AnchorConfig = PluginConfig.QuickSlotsAnchor; configPositionedElement.EnsureCorrectPosition(); } } [HarmonyPostfix] [HarmonyPatch("Update")] private static void UpdatePostfix(Hud __instance) { if (!PluginConfig.IsModEnabled.Value || Object.op_Implicit((Object)(object)HotkeyBarPatch.QuickSlotsHotkeyBar) || !PluginConfig.EnableQuickslots.Value) { return; } HotkeyBarPatch.QuickSlotsHotkeyBar = Object.Instantiate<GameObject>(((Component)hotkeyBar).gameObject, __instance.m_rootObject.transform, true); ((Object)HotkeyBarPatch.QuickSlotsHotkeyBar).name = "QuickSlotsHotkeyBar"; HotkeyBar component = HotkeyBarPatch.QuickSlotsHotkeyBar.GetComponent<HotkeyBar>(); component.m_selected = -1; ConfigPositionedElement configPositionedElement = HotkeyBarPatch.QuickSlotsHotkeyBar.AddComponent<ConfigPositionedElement>(); configPositionedElement.PositionConfig = PluginConfig.QuickSlotsPosition; configPositionedElement.AnchorConfig = PluginConfig.QuickSlotsAnchor; configPositionedElement.EnsureCorrectPosition(); component.m_items.Clear(); foreach (ElementData element in component.m_elements) { Object.Destroy((Object)(object)element.m_go); } component.m_elements.Clear(); } } [HarmonyPatch(typeof(Humanoid))] internal static class HumanoidPatch { [HarmonyPrefix] [HarmonyPatch("EquipItem")] private static bool EquipItemPrefix(Humanoid __instance, ref bool __result, ItemData item) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) if (QuickSlotsManager.IsArmor(item)) { Vector2i armorSlot = QuickSlotsManager.GetArmorSlot(item); if (QuickSlotsManager.IsArmorTypeEquipped(__instance, item)) { ItemData armorItemToSwap = QuickSlotsManager.GetArmorItemToSwap(__instance, item); QuickSlotsManager.UnequipItem(__instance, armorItemToSwap); QuickSlotsManager.EquipItem(__instance, item); QuickSlotsManager.MoveArmorItemToSlot(__instance, item, armorSlot.x, armorSlot.y); __result = true; return false; } QuickSlotsManager.EquipItem(__instance, item); if (item.m_gridPos.x != armorSlot.x || item.m_gridPos.y != armorSlot.y) { QuickSlotsManager.MoveArmorItemToSlot(__instance, item, armorSlot.x, armorSlot.y); } __result = true; return false; } return true; } [HarmonyPostfix] [HarmonyPatch("EquipItem")] private static void EquipItemPostfix(Humanoid __instance, ItemData item) { if ((Object)(object)__instance != (Object)null && item != null) { __instance.GetInventory().Changed(); } } [HarmonyPrefix] [HarmonyPatch("UnequipItem")] private static bool UnequipItemPrefix(Humanoid __instance, ItemData item, bool triggerEquipEffects) { //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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) if (item == null) { return true; } if (QuickSlotsManager.IsArmor(item) && item.m_equipped) { if (!QuickSlotsManager.HasEmptyNonEquipmentSlot(__instance.GetInventory())) { ((Character)__instance).Message((MessageType)2, "Inventory full. Item not unequipped.", 0, (Sprite)null); return false; } QuickSlotsManager.UnequipItem(__instance, item); Vector2i emptyInventorySlot = QuickSlotsManager.GetEmptyInventorySlot(__instance.GetInventory(), topFirst: true); QuickSlotsManager.MoveArmorItemToSlot(__instance, item, emptyInventorySlot.x, emptyInventorySlot.y); return false; } return true; } } [HarmonyPatch(typeof(InventoryGrid))] internal static class InventoryGridPatch { [HarmonyPostfix] [HarmonyPatch("UpdateInventory")] private static void UpdateInventoryPostfix(InventoryGrid __instance) { if ((Object)(object)__instance == (Object)(object)InventoryGui.m_instance.m_playerGrid && QuickSlotsManager.ShouldRefreshPlayerGrid) { UpdatePlayerGrid(__instance); } } private static void UpdatePlayerGrid(InventoryGrid inventoryGrid) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) QuickSlotsManager.ShouldRefreshPlayerGrid = false; int num = 1; float num2 = -35f * (float)num; RectTransform orCreateBackground = GetOrCreateBackground(inventoryGrid, "ExtInvGrid"); orCreateBackground.anchoredPosition = new Vector2(0f, num2); orCreateBackground.SetSizeWithCurrentAnchors((Axis)0, 590f); orCreateBackground.SetSizeWithCurrentAnchors((Axis)1, 300f + 75f * (float)num); SetupBindingLabel(inventoryGrid.m_elements[32], "Head"); SetupBindingLabel(inventoryGrid.m_elements[33], "Chest"); SetupBindingLabel(inventoryGrid.m_elements[34], "Legs"); SetupBindingLabel(inventoryGrid.m_elements[35], "Cape"); SetupBindingLabel(inventoryGrid.m_elements[36], "Util"); if (PluginConfig.EnableQuickslots.Value) { SetupBindingLabel(inventoryGrid.m_elements[37], PluginConfig.QuickSlot1.Value.ToShortString()); SetupBindingLabel(inventoryGrid.m_elements[38], PluginConfig.QuickSlot2.Value.ToShortString()); SetupBindingLabel(inventoryGrid.m_elements[39], PluginConfig.QuickSlot3.Value.ToShortString()); } else { SetupBindingLabel(inventoryGrid.m_elements[37], string.Empty, enabled: false); SetupBindingLabel(inventoryGrid.m_elements[38], string.Empty, enabled: false); SetupBindingLabel(inventoryGrid.m_elements[39], string.Empty, enabled: false); } } private static RectTransform GetOrCreateBackground(InventoryGrid inventoryGrid, string name) { Transform val = ((Component)inventoryGrid).transform.parent.Find(name); if (!Object.op_Implicit((Object)(object)val)) { Transform val2 = ((Component)inventoryGrid).transform.parent.Find("Bkg"); GameObject obj = Object.Instantiate<GameObject>(((Component)val2).gameObject, val2.parent); ((Object)obj).name = name; val = obj.transform; val.SetSiblingIndex(val2.GetSiblingIndex() + 1); } return (RectTransform)(object)((val is RectTransform) ? val : null); } private static void SetupBindingLabel(Element element, string text, bool enabled = true) { Transform val = element.m_go.transform.Find("binding"); TMP_Text val2 = default(TMP_Text); if (Object.op_Implicit((Object)(object)val) && ((Component)val).TryGetComponent<TMP_Text>(ref val2)) { val2.text = text; ((Behaviour)val2).enabled = enabled; val2.fontSize = 12f; val2.alignment = (TextAlignmentOptions)257; val2.overflowMode = (TextOverflowModes)0; val2.textWrappingMode = (TextWrappingModes)0; } } } [HarmonyPatch(typeof(InventoryGui))] internal static class InventoryGuiPatch { [HarmonyPostfix] [HarmonyPatch("Show")] private static void ShowPostfix(InventoryGui __instance) { if (Object.op_Implicit((Object)(object)__instance.m_currentContainer)) { SetContainerGridAnchoredPosition(__instance); } QuickSlotsManager.ShouldRefreshPlayerGrid = true; } private static void SetContainerGridAnchoredPosition(InventoryGui inventoryGui) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) RectTransform val = default(RectTransform); if (((Component)((Component)inventoryGui.m_containerGrid).transform.parent).TryGetComponent<RectTransform>(ref val)) { val.anchoredPosition = PluginConfig.ContainerInventoryGridAnchoredPosition.Value; } } [HarmonyPrefix] [HarmonyPatch("OnSelectedItem")] private static bool OnSelectedItemPrefix(InventoryGrid grid, ItemData item, Vector2i pos) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (QuickSlotsManager.IsArmorSlot(pos)) { return false; } if (Player.m_localPlayer.IsEquipActionQueued(item)) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("OnCraftPressed")] private static bool OnCraftPressedPrefix(InventoryGui __instance) { ItemData itemData = ((RecipeDataPair)(ref __instance.m_selectedRecipe)).ItemData; if (itemData != null && itemData.m_equipped && !QuickSlotsManager.HasEmptyNonEquipmentSlot(((Humanoid)Player.m_localPlayer).GetInventory()) && QuickSlotsManager.ItemCountInInventory(((Humanoid)Player.m_localPlayer).GetInventory(), itemData) >= 1) { ((Character)Player.m_localPlayer).Message((MessageType)2, "Inventory full. Make room to upgrade equipped item.", 0, (Sprite)null); return false; } return true; } } [HarmonyPatch(typeof(Inventory))] internal static class InventoryPatch { [HarmonyPrefix] [HarmonyPatch("AddItem", new Type[] { typeof(ItemData), typeof(int), typeof(int), typeof(int) })] private static bool AddItemPrefix(Inventory __instance, ItemData item, int amount, int x, int y) { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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_0086: Unknown result type (might be due to invalid IL or missing references) if (item == null) { return true; } if (__instance.m_name == "ComfyQuickSlotsInventory") { if (QuickSlotsManager.FirstLoad && QuickSlotsManager.IsArmor(item) && item.m_equipped) { if (!QuickSlotsManager.InitialEquippedArmor.Contains(item)) { QuickSlotsManager.InitialEquippedArmor.Add(item); } return false; } if (item.m_equipped && QuickSlotsManager.IsArmor(item) && (Object)(object)Player.m_localPlayer != (Object)null) { QuickSlotsManager.UnequipItem((Humanoid)(object)Player.m_localPlayer, item); Vector2i armorSlot = QuickSlotsManager.GetArmorSlot(item); if (x == armorSlot.x && y == armorSlot.y) { return true; } return false; } if ((Object)(object)Player.m_localPlayer == (Object)null) { return true; } if (x < 5 && y == 4) { return false; } } return true; } [HarmonyPrefix] [HarmonyPatch("AddItem", new Type[] { typeof(string), typeof(int), typeof(int), typeof(int), typeof(long), typeof(string), typeof(Vector2i), typeof(bool) })] private static void AddItemStringIntIntIntLongStringVector2iBoolPrefix(Inventory __instance, ref Vector2i position) { //IL_0027: 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) if (__instance.m_name == "ComfyQuickSlotsInventory" && position.x < 5 && position.y == 4) { position = new Vector2i(-1, -1); } } [HarmonyPrefix] [HarmonyPatch("MoveItemToThis", new Type[] { typeof(Inventory), typeof(ItemData), typeof(int), typeof(int), typeof(int) })] private static bool MoveItemToThisPrefix(Inventory __instance, ref bool __result, int x, int y) { if (__instance.m_name == "ComfyQuickSlotsInventory" && x < 5 && y == 4) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("FindEmptySlot")] private static bool FindEmptySlotPrefix(Inventory __instance, ref Vector2i __result, bool topFirst) { //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) if (__instance.m_name == "ComfyQuickSlotsInventory") { __result = QuickSlotsManager.GetEmptyInventorySlot(__instance, topFirst); return false; } return true; } [HarmonyPrefix] [HarmonyPatch("HaveEmptySlot")] private static bool HaveEmptySlotPrefix(Inventory __instance, ref bool __result) { if (__instance.m_name == "ComfyQuickSlotsInventory") { __result = QuickSlotsManager.HasEmptyNonEquipmentSlot(__instance); return false; } return true; } [HarmonyPrefix] [HarmonyPatch("CanAddItem", new Type[] { typeof(ItemData), typeof(int) })] private static bool CanAddItemPrefix(Inventory __instance, ItemData item, int stack, ref bool __result) { if (__instance == ((Humanoid)Player.m_localPlayer).m_inventory) { __result = QuickSlotsManager.CanAddItem(__instance, item, stack); return false; } return true; } [HarmonyPrefix] [HarmonyPatch("FindFreeStackSpace")] private static bool FindFreeStackSpacePrefix(Inventory __instance, string name, float worldLevel, ref int __result) { if (__instance == ((Humanoid)Player.m_localPlayer).m_inventory) { __result = QuickSlotsManager.FindFreeNonEquipmentStackSpace(__instance, name, Mathf.RoundToInt(worldLevel)); return false; } return true; } } [HarmonyPatch(typeof(Player))] internal static class PlayerPatch { [HarmonyPrefix] [HarmonyPatch("Awake")] private static void AwakePrefix(Player __instance) { QuickSlotsManager.SetupPlayerInventory(((Humanoid)__instance).m_inventory); } [HarmonyPostfix] [HarmonyPatch("Load")] private static void LoadPostFix(Player __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: 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_0093: Unknown result type (might be due to invalid IL or missing references) if (__instance.m_knownTexts.ContainsKey("ComfyQuickSlotsInventory")) { ZPackage val = new ZPackage(__instance.m_knownTexts["ComfyQuickSlotsInventory"]); ((Humanoid)__instance).GetInventory().Load(val); QuickSlotsManager.EquipArmorInArmorSlots(__instance); ((Humanoid)__instance).GetInventory().Changed(); } else { QuickSlotsManager.FirstLoad = true; foreach (ItemData item in QuickSlotsManager.InitialEquippedArmor) { QuickSlotsManager.UnequipItem((Humanoid)(object)__instance, item); ((Humanoid)__instance).GetInventory().AddItem(item); ((Humanoid)__instance).EquipItem(item, true); Vector2i armorSlot = QuickSlotsManager.GetArmorSlot(item); QuickSlotsManager.MoveArmorItemToSlot((Humanoid)(object)__instance, item, armorSlot.x, armorSlot.y); ((Humanoid)__instance).GetInventory().Changed(); } QuickSlotsManager.InitialEquippedArmor.Clear(); } foreach (ItemData item2 in ((Humanoid)__instance).GetInventory().m_inventory) { if (item2.IsEquipable() && !QuickSlotsManager.IsArmor(item2) && item2.m_equipped) { ((Humanoid)__instance).EquipItem(item2, true); } } } [HarmonyPrefix] [HarmonyPatch("Save")] private static bool SavePrefix(Player __instance) { QuickSlotsManager.FirstLoad = false; return QuickSlotsManager.Save(__instance); } [HarmonyPrefix] [HarmonyPatch("UseHotbarItem")] private static bool UseHotbarItemPrefix(Player __instance, int index) { ItemData itemAt = ((Humanoid)__instance).m_inventory.GetItemAt(index - 1, 0); if (__instance.IsEquipActionQueued(itemAt)) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("CreateTombStone")] private static void CreateTombStonePrefix(Player __instance) { TombStoneManager.CreateTombStone(__instance); } [HarmonyPostfix] [HarmonyPatch("CreateTombStone")] private static void CreateTombStonePostfix(Player __instance) { Inventory inventory = ((Humanoid)__instance).GetInventory(); inventory.m_height = 5; inventory.m_width = 8; } } [HarmonyPatch(typeof(TombStone))] internal static class TombStonePatch { [HarmonyPrefix] [HarmonyPatch("GiveBoost")] private static bool GiveBoostPrefix(TombStone __instance) { if (TombStoneManager.IsAdditionalTombStone(__instance)) { return false; } return true; } } } namespace ComfyLib { public static class ConfigFileExtensions { internal sealed class ConfigurationManagerAttributes { public Action<ConfigEntryBase> CustomDrawer; public bool? Browsable; public bool? HideDefaultButton; public bool? HideSettingName; public bool? IsAdvanced; public int? Order; public bool? ReadOnly; } private static readonly Dictionary<string, int> _sectionToSettingOrder = new Dictionary<string, int>(); private static int GetSettingOrder(string section) { if (!_sectionToSettingOrder.TryGetValue(section, out var value)) { value = 0; } _sectionToSettingOrder[section] = value - 1; return value; } public static ConfigEntry<T> BindInOrder<T>(this ConfigFile config, string section, string key, T defaultValue, string description, AcceptableValueBase acceptableValues, bool browsable = true, bool hideDefaultButton = false, bool hideSettingName = false, bool isAdvanced = false, bool readOnly = false) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown return config.Bind<T>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, new object[1] { new ConfigurationManagerAttributes { Browsable = browsable, CustomDrawer = null, HideDefaultButton = hideDefaultButton, HideSettingName = hideSettingName, IsAdvanced = isAdvanced, Order = GetSettingOrder(section), ReadOnly = readOnly } })); } public static ConfigEntry<T> BindInOrder<T>(this ConfigFile config, string section, string key, T defaultValue, string description, Action<ConfigEntryBase> customDrawer = null, bool browsable = true, bool hideDefaultButton = false, bool hideSettingName = false, bool isAdvanced = false, bool readOnly = false) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown return config.Bind<T>(section, key, defaultValue, new ConfigDescription(description, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Browsable = browsable, CustomDrawer = customDrawer, HideDefaultButton = hideDefaultButton, HideSettingName = hideSettingName, IsAdvanced = isAdvanced, Order = GetSettingOrder(section), ReadOnly = readOnly } })); } public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action settingChangedHandler) { configEntry.SettingChanged += delegate { settingChangedHandler(); }; } public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action<T> settingChangedHandler) { configEntry.SettingChanged += delegate(object _, EventArgs eventArgs) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) settingChangedHandler((T)((SettingChangedEventArgs)eventArgs).ChangedSetting.BoxedValue); }; } public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action<ConfigEntry<T>> settingChangedHandler) { configEntry.SettingChanged += delegate(object _, EventArgs eventArgs) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) settingChangedHandler((ConfigEntry<T>)(object)((SettingChangedEventArgs)eventArgs).ChangedSetting); }; } } }