using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; 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.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("Joive")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Storage quality-of-life changes for Burglin Gnomes.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BG Storage QoL")] [assembly: AssemblyTitle("BG-StorageQoL-Joive")] [assembly: AssemblyVersion("1.0.0.0")] [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 BGStorageQoLJoive { [BepInPlugin("joive.bg.storageqol", "BG Storage QoL", "1.0.0")] public sealed class StorageQoLPlugin : BaseUnityPlugin { private const string Version = "1.0.0"; private const int RemovedLimitStackSize = 60000; private static StorageQoLPlugin instance; private static ConfigEntry enableMod; private static ConfigEntry storageStackLimit; private static ConfigEntry removeStorageLimit; private static ConfigEntry allowPotionStorage; private static ConfigEntry depositPotionsWithResources; private static ConfigEntry debugLogs; private Harmony harmony; internal static bool Enabled { get { if (enableMod != null) { return enableMod.Value; } return false; } } internal static bool PotionStorageEnabled { get { if (Enabled && allowPotionStorage != null) { return allowPotionStorage.Value; } return false; } } internal static bool PotionDepositEnabled { get { if (PotionStorageEnabled && depositPotionsWithResources != null) { return depositPotionsWithResources.Value; } return false; } } internal static int EffectiveStackLimit { get { if (removeStorageLimit != null && removeStorageLimit.Value) { return 60000; } return Math.Max(1, Math.Min(60000, (storageStackLimit != null) ? storageStackLimit.Value : 9999)); } } private void Awake() { //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown instance = this; enableMod = ((BaseUnityPlugin)this).Config.Bind("General", "EnableMod", true, "Enable storage quality-of-life changes."); storageStackLimit = ((BaseUnityPlugin)this).Config.Bind("Storage", "StorageStackLimit", 9999, "Stack limit used by the home stockpile."); removeStorageLimit = ((BaseUnityPlugin)this).Config.Bind("Storage", "RemoveStorageLimit", false, "Use a very high stockpile stack limit."); allowPotionStorage = ((BaseUnityPlugin)this).Config.Bind("Potions", "AllowPotionStorage", true, "Allow crafted potions to be stored in the home stockpile."); depositPotionsWithResources = ((BaseUnityPlugin)this).Config.Bind("Potions", "DepositPotionsWithResources", true, "The Deposit Resources button also moves potions into the stockpile."); debugLogs = ((BaseUnityPlugin)this).Config.Bind("Debug", "DebugLogs", false, "Write storage changes to BepInEx LogOutput.log."); harmony = new Harmony("joive.bg.storageqol"); harmony.PatchAll(typeof(StorageQoLPlugin).Assembly); ((BaseUnityPlugin)this).Logger.LogInfo((object)"BG Storage QoL 1.0.0 loaded."); } private void OnDestroy() { Harmony obj = harmony; if (obj != null) { obj.UnpatchSelf(); } if ((Object)(object)instance == (Object)(object)this) { instance = null; } } internal static bool IsStockpileInventory(InventoryBase inventory) { if ((Object)(object)inventory == (Object)null) { return false; } try { GnomiumDeposit val = (((Object)(object)GameProgressionManager.Instance != (Object)null) ? GameProgressionManager.Instance.Deposit : null); return (Object)(object)val != (Object)null && (Object)(object)val.ResourceInventory == (Object)(object)inventory; } catch { return false; } } internal static bool IsPotion(ItemData item) { return item is PotionData; } internal static void ApplyStockpileLimit(InventoryBase inventory) { if (!Enabled || (Object)(object)inventory == (Object)null) { return; } try { inventory.SetMaxOverriddenStackSize(EffectiveStackLimit); Log("Stockpile stack limit set to " + EffectiveStackLimit + "."); } catch (Exception ex) { Log("Could not set stockpile stack limit: " + ex.Message); } } internal static int MovePotionsToStockpile(PlayerNetworking player, InventoryBase stockpile) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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) if (!PotionDepositEnabled || (Object)(object)player == (Object)null || (Object)(object)stockpile == (Object)null || (Object)(object)player.Inventory == (Object)null) { return 0; } int num = 0; InventoryBase inventory = (InventoryBase)(object)player.Inventory; for (int i = 0; i < inventory.SlotCount; i++) { InventoryItem itemInSlot = inventory.GetItemInSlot(i); if (((InventoryItem)(ref itemInSlot)).IsValidItem && IsPotion(inventory.GetItemData((int)((InventoryItem)(ref itemInSlot)).ItemIndex))) { int num2 = stockpile.TryAddItem(((InventoryItem)(ref itemInSlot)).InstanceData); if (num2 > 0) { inventory.RemoveFromSlot(i, num2); num += num2; } } } if (num > 0) { Log("Moved " + num + " potion item(s) to stockpile."); } return num; } internal static bool InventoryHasPotion(PlayerInventory inventory) { //IL_0018: 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) if (!PotionDepositEnabled || (Object)(object)inventory == (Object)null) { return false; } for (int i = 0; i < ((InventoryBase)inventory).SlotCount; i++) { InventoryItem itemInSlot = ((InventoryBase)inventory).GetItemInSlot(i); if (((InventoryItem)(ref itemInSlot)).IsValidItem && IsPotion(((InventoryBase)inventory).GetItemData((int)((InventoryItem)(ref itemInSlot)).ItemIndex))) { return true; } } return false; } internal static void Log(string message) { if (debugLogs != null && debugLogs.Value) { StorageQoLPlugin storageQoLPlugin = instance; if (storageQoLPlugin != null) { ((BaseUnityPlugin)storageQoLPlugin).Logger.LogInfo((object)message); } } } } [HarmonyPatch(typeof(HomeManager), "SpawnHome")] internal static class HomeManagerSpawnHomePatch { private static void Postfix(HomeManager __instance) { if (!((Object)(object)__instance == (Object)null) && ((NetworkBehaviour)__instance).IsServer) { GnomiumDeposit val = (((Object)(object)GameProgressionManager.Instance != (Object)null) ? GameProgressionManager.Instance.Deposit : null); StorageQoLPlugin.ApplyStockpileLimit(((Object)(object)val != (Object)null) ? val.ResourceInventory : null); } } } [HarmonyPatch(typeof(InventoryBase), "GetMaxStackSize")] internal static class InventoryBaseGetMaxStackSizePatch { private static void Postfix(InventoryBase __instance, ItemData item, ref int __result) { if (StorageQoLPlugin.Enabled && StorageQoLPlugin.IsStockpileInventory(__instance) && !((Object)(object)item == (Object)null)) { __result = Math.Max(__result, StorageQoLPlugin.EffectiveStackLimit); } } } [HarmonyPatch(typeof(InventoryBase), "CanContainItem")] internal static class InventoryBaseCanContainItemPatch { private static void Postfix(InventoryBase __instance, ItemData itemData, ref ItemContainmentResult __result) { if (StorageQoLPlugin.PotionStorageEnabled && StorageQoLPlugin.IsStockpileInventory(__instance) && StorageQoLPlugin.IsPotion(itemData)) { __result = (ItemContainmentResult)0; } } } [HarmonyPatch(typeof(InventoryBase), "GetHasDepositableResources")] internal static class InventoryBaseGetHasDepositableResourcesPatch { private static void Postfix(InventoryBase __instance, ref bool __result) { if (!__result) { PlayerInventory val = (PlayerInventory)(object)((__instance is PlayerInventory) ? __instance : null); if (val != null) { __result = StorageQoLPlugin.InventoryHasPotion(val); } } } } [HarmonyPatch(typeof(GnomiumDeposit), "DepositResourcesToStockpileRpc")] internal static class GnomiumDepositDepositResourcesPatch { private static void Postfix(GnomiumDeposit __instance, RpcParams rpcParams = default(RpcParams)) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance == (Object)null) && ((NetworkBehaviour)__instance).IsServer) { StorageQoLPlugin.MovePotionsToStockpile(ServerManager.GetPlayer(rpcParams.Receive.SenderClientId), __instance.ResourceInventory); } } } }