diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java index 0902ca1..498fcac 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java @@ -326,7 +326,7 @@ public abstract class BaseGUI implements GUI, Controllable { } private int putIntoFirstVirtualInventory(UpdateReason updateReason, ItemStack itemStack, VirtualInventory... ignored) { - List inventories = getAllVirtualInventories(ignored); + LinkedHashSet inventories = getAllVirtualInventories(ignored); int originalAmount = itemStack.getAmount(); if (inventories.size() > 0) { @@ -340,19 +340,15 @@ public abstract class BaseGUI implements GUI, Controllable { return originalAmount; } - private List getAllVirtualInventories(VirtualInventory... ignored) { - List virtualInventories = new ArrayList<>(); - Arrays.stream(slotElements) + private LinkedHashSet getAllVirtualInventories(VirtualInventory... ignored) { + return Arrays.stream(slotElements) .filter(Objects::nonNull) .map(SlotElement::getHoldingElement) .filter(element -> element instanceof VISlotElement) .map(element -> ((VISlotElement) element).getVirtualInventory()) .filter(vi -> Arrays.stream(ignored).noneMatch(vi::equals)) - .forEach(vi -> { - if (!virtualInventories.contains(vi)) virtualInventories.add(vi); - }); - - return virtualInventories; + .sorted((vi1, vi2) -> -Integer.compare(vi1.getGuiShiftPriority(), vi2.getGuiShiftPriority())) + .collect(Collectors.toCollection(LinkedHashSet::new)); } // endregion diff --git a/InvUI/src/main/java/de/studiocode/invui/virtualinventory/VirtualInventory.java b/InvUI/src/main/java/de/studiocode/invui/virtualinventory/VirtualInventory.java index 2354706..3f3694f 100644 --- a/InvUI/src/main/java/de/studiocode/invui/virtualinventory/VirtualInventory.java +++ b/InvUI/src/main/java/de/studiocode/invui/virtualinventory/VirtualInventory.java @@ -1,6 +1,7 @@ package de.studiocode.invui.virtualinventory; import de.studiocode.invui.InvUI; +import de.studiocode.invui.gui.GUI; import de.studiocode.invui.util.ArrayUtils; import de.studiocode.invui.virtualinventory.event.ItemUpdateEvent; import de.studiocode.invui.virtualinventory.event.UpdateReason; @@ -30,6 +31,7 @@ public class VirtualInventory implements ConfigurationSerializable { private int[] stackSizes; private final Set windows = new HashSet<>(); private Consumer itemUpdateHandler; + private int guiShiftPriority = 0; /** * Constructs a new {@link VirtualInventory} @@ -160,6 +162,28 @@ public class VirtualInventory implements ConfigurationSerializable { this.itemUpdateHandler = itemUpdateHandler; } + /** + * Sets the priority for shift-clicking {@link ItemStack ItemStatcks} into a {@link GUI} + * with multiple {@link VirtualInventory}. + * Not serialized with {@link VirtualInventoryManager#serializeInventory(VirtualInventory, OutputStream)}. + * + * @param guiShiftPriority The priority for shift-clicking, {@link VirtualInventory VirtualInventories} with + * a higher priority get prioritized. + */ + public void setGuiShiftPriority(int guiShiftPriority) { + this.guiShiftPriority = guiShiftPriority; + } + + /** + * Gets the priority for shift-clicking {@link ItemStack ItemStatcks} into a {@link GUI} + * + * @return The priority for shift-clicking, {@link VirtualInventory VirtualInventories} with + * a higher priority get prioritized. + */ + public int getGuiShiftPriority() { + return guiShiftPriority; + } + /** * Gets the {@link UUID} of this {@link VirtualInventory}. *