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 BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using SSSGame; using SandSailorStudio.Inventory; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("blacks7ar")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.6")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ExpandedBuildingStorage")] [assembly: AssemblyTitle("ExpandedBuildingStorage")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.6.0")] [module: UnverifiableCode] namespace ExpandedBuildingStorage; [BepInPlugin("blacks7ar.ExpandedBuildingStorage", "ExpandedBuildingStorage", "1.0.6")] public class Plugin : BasePlugin { [HarmonyPatch] private static class Patches { private static readonly Dictionary LastAppliedCount = new Dictionary(); private static readonly Dictionary OriginalQuantity = new Dictionary(); [HarmonyPostfix] [HarmonyPatch(typeof(ItemContainer), "GetStackSize", new Type[] { typeof(ItemInfo) })] private static void ItemContainer_GetStackSize_Postfix(ItemContainer __instance, ref int __result) { if (((__instance != null) ? __instance.Inventory : null) != null && !((Object)(object)__instance.itemConfig == (Object)null)) { __result = Helper.ApplyMultiplier(__instance, __result); } } [HarmonyPostfix] [HarmonyPatch(typeof(HarvestInteraction), "add_OnHarvestDamageTaken")] private static void OnHarvestDamageTaken_Postfix(HarvestInteraction __instance) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown ItemComponent componentInChildren = ((Component)__instance).GetComponentInChildren(true); if ((Object)(object)__instance._itemComponent == (Object)null || __instance._itemComponent.ItemInstance == null || !((Object)(object)componentInChildren != (Object)null)) { return; } int count = __instance._itemComponent.ItemInstance.count; IntPtr pointer = ((Il2CppObjectBase)__instance).Pointer; if (!OriginalQuantity.TryGetValue(pointer, out var value)) { value = componentInChildren.data.quantity; OriginalQuantity[pointer] = value; } if (!LastAppliedCount.TryGetValue(pointer, out var value2) || value2 != count) { int quantity = ((count != 1) ? (value * count) : value); componentInChildren.data.quantity = quantity; LastAppliedCount[pointer] = count; ManualLogSource eLogger = ELogger; bool flag = default(bool); BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(19, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(((Object)__instance._itemComponent.ItemInstance.info).name); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" count: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(count); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" / "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(((Object)componentInChildren.data.itemInfo).name); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" count: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(componentInChildren.data.quantity); } eLogger.LogDebug(val); } } [HarmonyPrefix] [HarmonyPatch(typeof(LootSpawner), "SpawnLootStack")] private static void SpawnLootStack_Postfix(LootSpawner __instance, LootData loot, int stackIndex) { if (loot == null) { return; } loot.spawnChance = 1f; HarvestInteraction harvestInteraction = __instance.harvestInteraction; if ((Object)(object)harvestInteraction == (Object)null || (Object)(object)harvestInteraction._itemComponent == (Object)null || harvestInteraction._itemComponent.ItemInstance == null) { return; } int count = harvestInteraction._itemComponent.ItemInstance.count; IntPtr pointer = ((Il2CppObjectBase)loot).Pointer; Il2CppStructArray stacks = loot.stacks; if (stacks == null || ((Il2CppArrayBase)(object)stacks).Count == 0) { return; } Il2CppStructArray val = new Il2CppStructArray((long)((Il2CppArrayBase)(object)stacks).Length); for (int i = 0; i < ((Il2CppArrayBase)(object)stacks).Length; i++) { if (!OriginalQuantity.TryGetValue(pointer, out var value)) { value = ((Il2CppArrayBase)(object)stacks)[i]; OriginalQuantity[pointer] = value; } if (LastAppliedCount.TryGetValue(pointer, out var value2) && value2 == count) { return; } int num = ((count != 1) ? (value * count) : value); ((Il2CppArrayBase)(object)val)[i] = num; } LastAppliedCount[pointer] = count; loot.stacks = val; } } private static class Helper { public static int ApplyMultiplier(ItemContainer container, int baseStack) { if (((container != null) ? container.Inventory : null) == null) { return baseStack; } if (IsSmallItemsSingle(container)) { return baseStack + 10 * _smallMultiplier.Value; } if (IsSmallItems(container)) { return baseStack * _smallMultiplier.Value; } if (IsMediumItems(container)) { return baseStack * _mediumMultiplier.Value; } if (!IsLargeItems(container)) { return baseStack; } return baseStack * _largeMultiplier.Value; } private static bool IsMediumItems(ItemContainer container) { string name = ((Object)container.itemConfig).name; int num; switch (name) { default: num = ((!(name == "Storage_WorkshopLinen")) ? 1 : 0); break; case "Storage_Wood_Bark": case "Storage_Wood_Sticks": case "Storage_Wood_Firewood": case "Storage_Wood_Thatch": case "Storage_Wood_LongSticks": case "Fishing_WoodRodFishes": case "Storage_FurnitureFireWood": case "Storage_Horns": case "Storage_Leather_HidePelt_T2": case "Storage_Food_SmolkrPenHorns": case "Storage_Arrows": case "Storage_ClothingMaterials": case "Storage_WorkshopMediumItems_L1": case "Storage_Leather_HidePelt_T1": case "Storage_Leather_CuredHidePeltT1": case "Storage_Leather_CuredHidePeltT2": num = 0; break; } return num == 0; } private static bool IsSmallItems(ItemContainer container) { string name = ((Object)container.itemConfig).name; int num; switch (name) { default: num = ((!(name == "Storage_StoneAndMetalAndBlood_Small")) ? 1 : 0); break; case "Storage_Seeds": case "Storage_FoodFarm": case "Storage_Wood_Fibers": case "Fishing_Baits": case "Storage_FoodAll": case "Storage_AllNonFood": case "Storage_WorkshopSmallItems": case "Storage_Vegetables": case "Storage_Fruits": case "Storage_GathererMaterials": case "Storage_Leather_Scraps": case "Storage_Food_RawRedMeat_Bone": case "Storage_WarehouseResin": case "Storage_StoneAndMetal_Small": case "Storage_Food_WarehouseCheese": case "Storage_CoalMakerPile_Output": case "Storage_Food_Cooked": case "Storage_WarehouseCrawlerResources": case "Storage_WarehouseDye": case "Storage_WarehouseSmallCraftingMaterials": case "Storage_WarehouseFoodSilo": case "Storage_Wood_FibersResinConeReedsSeeds": case "Storage_WorkshopSmallItems_L1": case "Storage_WorkshopLinenThread": case "Storage_Crawler_Resources": num = 0; break; } return num == 0; } private static bool IsSmallItemsSingle(ItemContainer container) { string name = ((Object)container.itemConfig).name; int num; switch (name) { default: num = ((!(name == "Storage_Bloomery_Ore_L1")) ? 1 : 0); break; case "Storage_WarehouseJotunBlood": case "Warehouse_Storage_OreBloom": case "Storage_Carpenter_SmallOutput": num = 0; break; } return num == 0; } private static bool IsLargeItems(ItemContainer container) { string name = ((Object)container.itemConfig).name; int num; switch (name) { default: num = ((!(name == "Storage_Wood_HardWoodLongSticks")) ? 1 : 0); break; case "Storage_Food_DeerLeg": case "Storage_Stone_Raw": case "Storage_Carpenter_LargeOutput": case "Storage_Carpenter_LongOutput": case "Storage_ExplodingSack": case "Storage_Wood_Timber": case "Storage_Wood_LongSticks": case "Storage_Wood_LongSticksL0": case "Storage_Wood_HardWoodLog": num = 0; break; } return num == 0; } } private const string modGUID = "blacks7ar.ExpandedBuildingStorage"; public const string modName = "ExpandedBuildingStorage"; public const string modAuthor = "blacks7ar"; public const string modVersion = "1.0.6"; private static ManualLogSource ELogger; private static ConfigEntry _smallMultiplier; private static ConfigEntry _mediumMultiplier; private static ConfigEntry _largeMultiplier; public override void Load() { //IL_0080: Unknown result type (might be due to invalid IL or missing references) ELogger = ((BasePlugin)this).Log; ELogger.LogInfo((object)"Mod loaded!"); _smallMultiplier = ((BasePlugin)this).Config.Bind("General", "Small Items", 3, "Stack multiplier for small items."); _mediumMultiplier = ((BasePlugin)this).Config.Bind("General", "Medium Items", 10, "Stack multiplier for Medium items."); _largeMultiplier = ((BasePlugin)this).Config.Bind("General", "Large Items", 5, "Stack multiplier for large items."); new Harmony("blacks7ar.ExpandedBuildingStorage").PatchAll(); } }