From 62bfdd6042521679349678f5bf80f446bcae89fe Mon Sep 17 00:00:00 2001 From: Tyfon <29051038+tyfon7@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:52:35 -0700 Subject: [PATCH] block partial merges, keep ammo from merging on gridview accept --- MultiSelect.cs | 8 +++++- Patches/MultiSelectPatches.cs | 52 ++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/MultiSelect.cs b/MultiSelect.cs index 76739c1..1ed6324 100644 --- a/MultiSelect.cs +++ b/MultiSelect.cs @@ -61,7 +61,7 @@ namespace UIFixes if (itemView.IsSelectable() && !SelectedItemViews.ContainsKey(itemView) && !SecondaryItemViews.ContainsKey(itemView)) { - ItemContextClass itemContext = new(itemView.ItemContext, itemView.ItemRotation); + ItemContextClass itemContext = new MultiSelectItemContext(itemView.ItemContext, itemView.ItemRotation); itemContext.GClass2813_0.OnDisposed += RugPull; itemContext.OnDisposed += RugPull; @@ -194,6 +194,12 @@ namespace UIFixes } } + public class MultiSelectItemContext(ItemContextAbstractClass itemContext, ItemRotation rotation) : ItemContextClass(itemContext, rotation) + { + public override bool MergeAvailable => false; + public override bool SplitAvailable => false; + } + public static class MultiSelectExtensions { public static bool IsSelectable(this ItemView itemView) diff --git a/Patches/MultiSelectPatches.cs b/Patches/MultiSelectPatches.cs index 745e0aa..2c3d2f9 100644 --- a/Patches/MultiSelectPatches.cs +++ b/Patches/MultiSelectPatches.cs @@ -24,8 +24,11 @@ namespace UIFixes private static readonly List Previews = []; // Point that various QuickFindPlace overrides should start at - public static GClass2769 FindOrigin = null; - public static bool FindVerticalFirst = false; + private static GClass2769 FindOrigin = null; + private static bool FindVerticalFirst = false; + + // Prevents QuickFind from attempting a merge + private static bool DisableMerge = false; public static void Enable() { @@ -58,6 +61,7 @@ namespace UIFixes new FindSpotKeepRotationPatch().Enable(); new FindLocationForItemPatch().Enable(); new FindPlaceToPutPatch().Enable(); + new AdjustQuickFindFlagsPatch().Enable(); } public class InitializeCommonUIPatch : ModulePatch @@ -259,6 +263,8 @@ namespace UIFixes operation = default; __result = false; + HidePreviews(); + if (__instance.Grid == null || wrappedInstance.NonInteractable) { return false; @@ -289,8 +295,8 @@ namespace UIFixes return false; } - HidePreviews(); Item targetItem = __instance.method_8(targetItemContext); + DisableMerge = targetItem == null; bool showHighlights = targetItem == null; Stack operations = new(); @@ -329,6 +335,8 @@ namespace UIFixes targetItem ??= __instance.Grid.ParentItem; } + DisableMerge = false; + if (!__result) { HidePreviews(); @@ -376,6 +384,7 @@ namespace UIFixes } InPatch = true; + DisableMerge = targetItemContext == null; LocationInGrid hoveredLocation = __instance.CalculateItemLocation(itemContext); GClass2769 hoveredAddress = new(__instance.Grid, hoveredLocation); @@ -396,6 +405,7 @@ namespace UIFixes InPatch = false; FindOrigin = null; FindVerticalFirst = false; + DisableMerge = false; GridViewPickTargetPatch.FallbackResult = null; }); @@ -403,6 +413,35 @@ namespace UIFixes } } + public class AdjustQuickFindFlagsPatch : ModulePatch + { + // For reasons (???), BSG doesn't even define the second bit of this flags enum + private static InteractionsHandlerClass.EMoveItemOrder PartialMerge = (InteractionsHandlerClass.EMoveItemOrder)2; + + protected override MethodBase GetTargetMethod() + { + return AccessTools.Method(typeof(InteractionsHandlerClass), nameof(InteractionsHandlerClass.QuickFindAppropriatePlace)); + } + + [PatchPrefix] + public static void Prefix(ref InteractionsHandlerClass.EMoveItemOrder order) + { + if (!MultiSelect.Active) + { + return; + } + + // Multiselect always disables "Transfer", which is a partial merge + // It leaves things behind and that's not intuitive when multi-selecting + order &= ~PartialMerge; + + if (DisableMerge) + { + order &= ~InteractionsHandlerClass.EMoveItemOrder.TryMerge; + } + } + } + public class SelectMovedItemViewPatch : ModulePatch { protected override MethodBase GetTargetMethod() @@ -525,9 +564,14 @@ namespace UIFixes private static IEnumerable SortSelectedContexts( IEnumerable selectedContexts, ItemContextClass itemContext, bool prepend = true) { + static int gridOrder(LocationInGrid loc, StashGridClass grid) => grid.GridWidth.Value * loc.y + loc.x; + var result = selectedContexts .Where(ic => ic.Item != itemContext.Item) - .OrderByDescending(ic => itemContext.ItemAddress is GClass2769 originalDraggedAddress && ic.ItemAddress is GClass2769 selectedGridAddress && selectedGridAddress.Grid == originalDraggedAddress.Grid); + .OrderByDescending(ic => ic.ItemAddress is GClass2769) + .ThenByDescending(ic => itemContext.ItemAddress is GClass2769 originalDraggedAddress && ic.ItemAddress is GClass2769 selectedGridAddress && selectedGridAddress.Grid == originalDraggedAddress.Grid) + .ThenByDescending(ic => ic.ItemAddress is GClass2769 selectedGridAddress ? selectedGridAddress.Grid : null) + .ThenBy(ic => ic.ItemAddress is GClass2769 selectedGridAddress ? gridOrder(selectedGridAddress.LocationInGrid, selectedGridAddress.Grid) : 0); return prepend ? result.Prepend(itemContext) : result; }