diff --git a/Patches/StackFirItemsPatch.cs b/Patches/StackFirItemsPatch.cs index 810feea..f1b8e04 100644 --- a/Patches/StackFirItemsPatch.cs +++ b/Patches/StackFirItemsPatch.cs @@ -8,55 +8,93 @@ using System.Reflection; namespace UIFixes { - public class StackFirItemsPatch : ModulePatch + public static class StackFirItemsPatches { - private static Type MergeableItemType; - - protected override MethodBase GetTargetMethod() + public static void Enable() { - MethodInfo method = AccessTools.Method(typeof(InteractionsHandlerClass), nameof(InteractionsHandlerClass.smethod_0)); - MergeableItemType = method.GetParameters()[2].ParameterType.GetElementType(); // parameter is a ref type, get underlying type - return method; + new ContainerStackPatch().Enable(); + new TopUpStackPatch().Enable(); } - // Reimplementing this entire method to ignore SpawnedInSession for certain types - [PatchPrefix] - public static bool Prefix(IEnumerable gridsToPut, Item itemToMerge, ref object mergeableItem, int overrideCount, ref bool __result) + public class ContainerStackPatch : ModulePatch { - if (!MergeableItemType.IsInstanceOfType(itemToMerge)) + private static Type MergeableItemType; + + protected override MethodBase GetTargetMethod() { - mergeableItem = null; - __result = false; + MethodInfo method = AccessTools.Method(typeof(InteractionsHandlerClass), nameof(InteractionsHandlerClass.smethod_0)); + MergeableItemType = method.GetParameters()[2].ParameterType.GetElementType(); // parameter is a ref type, get underlying type + return method; } - if (overrideCount <= 0) + // Reimplementing this entire method to ignore SpawnedInSession for certain types + [PatchPrefix] + public static bool Prefix(IEnumerable gridsToPut, Item itemToMerge, ref object mergeableItem, int overrideCount, ref bool __result) { - overrideCount = itemToMerge.StackObjectsCount; + if (!MergeableItemType.IsInstanceOfType(itemToMerge)) + { + mergeableItem = null; + __result = false; + } + + if (overrideCount <= 0) + { + overrideCount = itemToMerge.StackObjectsCount; + } + + bool ignoreSpawnedInSession; + if (itemToMerge.Template is MoneyClass) + { + ignoreSpawnedInSession = Settings.MergeFIRMoney.Value; + } + else if (itemToMerge.Template is AmmoTemplate) + { + ignoreSpawnedInSession = Settings.MergeFIRAmmo.Value; + } + else + { + ignoreSpawnedInSession = Settings.MergeFIROther.Value; + } + + mergeableItem = gridsToPut.SelectMany(x => x.Items).Where(x => MergeableItemType.IsInstanceOfType(x)) + .Where(x => x != itemToMerge) + .Where(x => x.TemplateId == itemToMerge.TemplateId) + .Where(x => ignoreSpawnedInSession || x.SpawnedInSession == itemToMerge.SpawnedInSession) + .Where(x => x.StackObjectsCount < x.StackMaxSize) + .FirstOrDefault(x => overrideCount <= x.StackMaxSize - x.StackObjectsCount); + + __result = mergeableItem != null; + return false; + } + } + + public class TopUpStackPatch : ModulePatch + { + protected override MethodBase GetTargetMethod() + { + return AccessTools.Method(typeof(Item), nameof(Item.IsSameItem)); } - bool ignoreSpawnedInSession; - if (itemToMerge.Template is MoneyClass) + [PatchPrefix] + public static bool Prefix(Item __instance, Item other, ref bool __result) { - ignoreSpawnedInSession = Settings.MergeFIRMoney.Value; - } - else if (itemToMerge.Template is AmmoTemplate) - { - ignoreSpawnedInSession = Settings.MergeFIRAmmo.Value; - } - else - { - ignoreSpawnedInSession = Settings.MergeFIROther.Value; - } + bool ignoreSpawnedInSession; + if (__instance.Template is MoneyClass) + { + ignoreSpawnedInSession = Settings.MergeFIRMoney.Value; + } + else if (__instance.Template is AmmoTemplate) + { + ignoreSpawnedInSession = Settings.MergeFIRAmmo.Value; + } + else + { + ignoreSpawnedInSession = Settings.MergeFIROther.Value; + } - mergeableItem = gridsToPut.SelectMany(x => x.Items).Where(x => MergeableItemType.IsInstanceOfType(x)) - .Where(x => x != itemToMerge) - .Where(x => x.TemplateId == itemToMerge.TemplateId) - .Where(x => ignoreSpawnedInSession || x.SpawnedInSession == itemToMerge.SpawnedInSession) - .Where(x => x.StackObjectsCount < x.StackMaxSize) - .FirstOrDefault(x => overrideCount <= x.StackMaxSize - x.StackObjectsCount); - - __result = mergeableItem != null; - return false; + __result = __instance.TemplateId == other.TemplateId && __instance.Id != other.Id && (ignoreSpawnedInSession || __instance.SpawnedInSession == other.SpawnedInSession); + return false; + } } } } diff --git a/Plugin.cs b/Plugin.cs index 549e9db..f082f0a 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -24,7 +24,7 @@ namespace UIFixes InspectWindowStatsPatches.Enable(); new RemoveDoorActionsPatch().Enable(); ScrollPatches.Enable(); - new StackFirItemsPatch().Enable(); + StackFirItemsPatches.Enable(); SwapPatches.Enable(); SyncScrollPositionPatches.Enable(); new TransferConfirmPatch().Enable();