From 2122685d5fff46692309296b8819ae9e972b7670 Mon Sep 17 00:00:00 2001 From: stefvanschie Date: Sun, 23 May 2021 21:42:16 +0200 Subject: [PATCH 1/4] Split dragging into separate left and right drags --- .../server/inventory/click/ClickType.java | 9 +++++++ .../click/InventoryClickProcessor.java | 25 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/ClickType.java b/src/main/java/net/minestom/server/inventory/click/ClickType.java index 2eb9b91d8..bc09da0f4 100644 --- a/src/main/java/net/minestom/server/inventory/click/ClickType.java +++ b/src/main/java/net/minestom/server/inventory/click/ClickType.java @@ -9,9 +9,18 @@ public enum ClickType { START_SHIFT_CLICK, SHIFT_CLICK, + @Deprecated START_DRAGGING, + + START_LEFT_DRAGGING, + START_RIGHT_DRAGGING, + + @Deprecated DRAGGING, + LEFT_DRAGGING, + RIGHT_DRAGGING, + START_DOUBLE_CLICK, DOUBLE_CLICK, diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index df23a86bf..b1fd60cc2 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -232,7 +232,7 @@ public class InventoryClickProcessor { @NotNull ItemStack clicked, @NotNull ItemStack cursor, @NotNull Int2ObjectFunction itemGetter, @NotNull BiConsumer itemSetter) { - InventoryClickResult clickResult = startCondition(inventory, player, slot, ClickType.START_DRAGGING, clicked, cursor); + InventoryClickResult clickResult = null; final StackingRule stackingRule = cursor.getStackingRule(); @@ -241,9 +241,13 @@ public class InventoryClickProcessor { if (button == 0) { // Start left this.leftDraggingMap.put(player, new IntOpenHashSet()); + + clickResult = startCondition(inventory, player, slot, ClickType.START_LEFT_DRAGGING, clicked, cursor); } else if (button == 4) { // Start right this.rightDraggingMap.put(player, new IntOpenHashSet()); + + clickResult = startCondition(inventory, player, slot, ClickType.START_RIGHT_DRAGGING, clicked, cursor); } else if (button == 2) { // End left if (!leftDraggingMap.containsKey(player)) @@ -257,10 +261,13 @@ public class InventoryClickProcessor { final int slotSize = (int) ((float) cursorAmount / (float) slotCount); int finalCursorAmount = cursorAmount; + // Set to a value in case there are no slots + clickResult = startCondition(inventory, player, slot, ClickType.START_LEFT_DRAGGING, clicked, cursor); + for (int s : slots) { ItemStack slotItem = itemGetter.apply(s); - clickResult = startCondition(inventory, player, s, ClickType.DRAGGING, slotItem, cursor); + clickResult = startCondition(inventory, player, s, ClickType.LEFT_DRAGGING, slotItem, cursor); if (clickResult.isCancel()) break; StackingRule slotItemRule = slotItem.getStackingRule(); @@ -282,7 +289,7 @@ public class InventoryClickProcessor { } itemSetter.accept(s, slotItem); - callClickEvent(player, inventory, s, ClickType.DRAGGING, slotItem, cursor); + callClickEvent(player, inventory, s, ClickType.LEFT_DRAGGING, slotItem, cursor); } cursor = stackingRule.apply(cursor, finalCursorAmount); clickResult.setCursor(cursor); @@ -297,11 +304,15 @@ public class InventoryClickProcessor { int cursorAmount = stackingRule.getAmount(cursor); if (size > cursorAmount) return null; + + // Set to a value in case there are no slots + clickResult = startCondition(inventory, player, slot, ClickType.START_RIGHT_DRAGGING, clicked, cursor); + for (int s : slots) { ItemStack draggedItem = cursor; ItemStack slotItem = itemGetter.apply(s); - clickResult = startCondition(inventory, player, s, ClickType.DRAGGING, slotItem, cursor); + clickResult = startCondition(inventory, player, s, ClickType.RIGHT_DRAGGING, slotItem, cursor); if (clickResult.isCancel()) break; @@ -319,7 +330,7 @@ public class InventoryClickProcessor { cursorAmount -= 1; } - callClickEvent(player, inventory, s, ClickType.DRAGGING, draggedItem, cursor); + callClickEvent(player, inventory, s, ClickType.RIGHT_DRAGGING, draggedItem, cursor); } cursor = stackingRule.apply(cursor, cursorAmount); clickResult.setCursor(cursor); @@ -335,11 +346,15 @@ public class InventoryClickProcessor { return null; leftDraggingMap.get(player).add(slot); + clickResult = startCondition(inventory, player, slot, ClickType.START_LEFT_DRAGGING, clicked, cursor); + } else if (button == 5) { // Add right slot if (!rightDraggingMap.containsKey(player)) return null; rightDraggingMap.get(player).add(slot); + + clickResult = startCondition(inventory, player, slot, ClickType.START_RIGHT_DRAGGING, clicked, cursor); } } From cb4ce09d85f74698445a17053475604f87ea888a Mon Sep 17 00:00:00 2001 From: Stef van Schie Date: Fri, 28 May 2021 20:24:02 +0200 Subject: [PATCH 2/4] Remove deprecated click types --- .../java/net/minestom/server/inventory/click/ClickType.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/ClickType.java b/src/main/java/net/minestom/server/inventory/click/ClickType.java index bc09da0f4..ae1a3f97e 100644 --- a/src/main/java/net/minestom/server/inventory/click/ClickType.java +++ b/src/main/java/net/minestom/server/inventory/click/ClickType.java @@ -9,15 +9,9 @@ public enum ClickType { START_SHIFT_CLICK, SHIFT_CLICK, - @Deprecated - START_DRAGGING, - START_LEFT_DRAGGING, START_RIGHT_DRAGGING, - @Deprecated - DRAGGING, - LEFT_DRAGGING, RIGHT_DRAGGING, From ddbd621535249fb59d731f0c2dfa5e5070272878 Mon Sep 17 00:00:00 2001 From: stefvanschie Date: Tue, 8 Jun 2021 19:55:11 +0200 Subject: [PATCH 3/4] Change dragging events Now fires a start dragging, then a dragging for each slot and then an end dragging. --- .../server/inventory/click/ClickType.java | 3 ++ .../click/InventoryClickProcessor.java | 30 ++++++++++--------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/ClickType.java b/src/main/java/net/minestom/server/inventory/click/ClickType.java index ae1a3f97e..c6fe8eda8 100644 --- a/src/main/java/net/minestom/server/inventory/click/ClickType.java +++ b/src/main/java/net/minestom/server/inventory/click/ClickType.java @@ -15,6 +15,9 @@ public enum ClickType { LEFT_DRAGGING, RIGHT_DRAGGING, + END_LEFT_DRAGGING, + END_RIGHT_DRAGGING, + START_DOUBLE_CLICK, DOUBLE_CLICK, diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index b1fd60cc2..a0bf5ff3d 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -261,9 +261,6 @@ public class InventoryClickProcessor { final int slotSize = (int) ((float) cursorAmount / (float) slotCount); int finalCursorAmount = cursorAmount; - // Set to a value in case there are no slots - clickResult = startCondition(inventory, player, slot, ClickType.START_LEFT_DRAGGING, clicked, cursor); - for (int s : slots) { ItemStack slotItem = itemGetter.apply(s); @@ -291,8 +288,14 @@ public class InventoryClickProcessor { callClickEvent(player, inventory, s, ClickType.LEFT_DRAGGING, slotItem, cursor); } - cursor = stackingRule.apply(cursor, finalCursorAmount); - clickResult.setCursor(cursor); + + // If no slots were dragged over, no need to apply any kind of stacking rules + if (clickResult != null) { + cursor = stackingRule.apply(cursor, finalCursorAmount); + clickResult.setCursor(cursor); + } + + clickResult = startCondition(inventory, player, slot, ClickType.END_LEFT_DRAGGING, clicked, cursor); leftDraggingMap.remove(player); } else if (button == 6) { @@ -305,9 +308,6 @@ public class InventoryClickProcessor { if (size > cursorAmount) return null; - // Set to a value in case there are no slots - clickResult = startCondition(inventory, player, slot, ClickType.START_RIGHT_DRAGGING, clicked, cursor); - for (int s : slots) { ItemStack draggedItem = cursor; ItemStack slotItem = itemGetter.apply(s); @@ -332,8 +332,14 @@ public class InventoryClickProcessor { callClickEvent(player, inventory, s, ClickType.RIGHT_DRAGGING, draggedItem, cursor); } - cursor = stackingRule.apply(cursor, cursorAmount); - clickResult.setCursor(cursor); + + // If no slots were dragged over, no need to apply any kind of stacking rules + if (clickResult != null) { + cursor = stackingRule.apply(cursor, cursorAmount); + clickResult.setCursor(cursor); + } + + clickResult = startCondition(inventory, player, slot, ClickType.END_RIGHT_DRAGGING, clicked, cursor); rightDraggingMap.remove(player); @@ -346,15 +352,11 @@ public class InventoryClickProcessor { return null; leftDraggingMap.get(player).add(slot); - clickResult = startCondition(inventory, player, slot, ClickType.START_LEFT_DRAGGING, clicked, cursor); - } else if (button == 5) { // Add right slot if (!rightDraggingMap.containsKey(player)) return null; rightDraggingMap.get(player).add(slot); - - clickResult = startCondition(inventory, player, slot, ClickType.START_RIGHT_DRAGGING, clicked, cursor); } } From 99855a3ea76621d88fcc2c48624ff1d1914a258b Mon Sep 17 00:00:00 2001 From: stefvanschie Date: Tue, 8 Jun 2021 21:27:34 +0200 Subject: [PATCH 4/4] Allow for cancelling at start and end of drag --- .../click/InventoryClickProcessor.java | 137 +++++++++++------- 1 file changed, 82 insertions(+), 55 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index a0bf5ff3d..6f2a834f8 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -240,14 +240,16 @@ public class InventoryClickProcessor { // Start or end left/right drag if (button == 0) { // Start left - this.leftDraggingMap.put(player, new IntOpenHashSet()); - clickResult = startCondition(inventory, player, slot, ClickType.START_LEFT_DRAGGING, clicked, cursor); + + if (!clickResult.isCancel()) + this.leftDraggingMap.put(player, new IntOpenHashSet()); } else if (button == 4) { // Start right - this.rightDraggingMap.put(player, new IntOpenHashSet()); - clickResult = startCondition(inventory, player, slot, ClickType.START_RIGHT_DRAGGING, clicked, cursor); + + if (!clickResult.isCancel()) + this.rightDraggingMap.put(player, new IntOpenHashSet()); } else if (button == 2) { // End left if (!leftDraggingMap.containsKey(player)) @@ -257,45 +259,58 @@ public class InventoryClickProcessor { final int cursorAmount = stackingRule.getAmount(cursor); if (slotCount > cursorAmount) return null; - // Should be size of each defined slot (if not full) - final int slotSize = (int) ((float) cursorAmount / (float) slotCount); - int finalCursorAmount = cursorAmount; + + boolean cancel = false; for (int s : slots) { ItemStack slotItem = itemGetter.apply(s); clickResult = startCondition(inventory, player, s, ClickType.LEFT_DRAGGING, slotItem, cursor); - if (clickResult.isCancel()) + + if (clickResult.isCancel()) { + cancel = true; + break; - StackingRule slotItemRule = slotItem.getStackingRule(); - - final int maxSize = stackingRule.getMaxSize(cursor); - if (stackingRule.canBeStacked(cursor, slotItem)) { - final int amount = slotItemRule.getAmount(slotItem); - if (stackingRule.canApply(slotItem, amount + slotSize)) { - slotItem = stackingRule.apply(slotItem, a -> a + slotSize); - finalCursorAmount -= slotSize; - } else { - final int removedAmount = maxSize - amount; - slotItem = stackingRule.apply(slotItem, maxSize); - finalCursorAmount -= removedAmount; - } - } else if (slotItem.isAir()) { - slotItem = stackingRule.apply(cursor, slotSize); - finalCursorAmount -= slotSize; } - itemSetter.accept(s, slotItem); - - callClickEvent(player, inventory, s, ClickType.LEFT_DRAGGING, slotItem, cursor); } - // If no slots were dragged over, no need to apply any kind of stacking rules - if (clickResult != null) { - cursor = stackingRule.apply(cursor, finalCursorAmount); - clickResult.setCursor(cursor); - } + cancel |= startCondition(inventory, player, slot, ClickType.END_LEFT_DRAGGING, clicked, cursor).isCancel(); - clickResult = startCondition(inventory, player, slot, ClickType.END_LEFT_DRAGGING, clicked, cursor); + // Should be size of each defined slot (if not full) + final int slotSize = (int) ((float) cursorAmount / (float) slotCount); + int finalCursorAmount = cursorAmount; + + if (!cancel) { + for (int s : slots) { + ItemStack slotItem = itemGetter.apply(s); + StackingRule slotItemRule = slotItem.getStackingRule(); + + final int maxSize = stackingRule.getMaxSize(cursor); + if (stackingRule.canBeStacked(cursor, slotItem)) { + final int amount = slotItemRule.getAmount(slotItem); + if (stackingRule.canApply(slotItem, amount + slotSize)) { + slotItem = stackingRule.apply(slotItem, a -> a + slotSize); + finalCursorAmount -= slotSize; + } else { + final int removedAmount = maxSize - amount; + slotItem = stackingRule.apply(slotItem, maxSize); + finalCursorAmount -= removedAmount; + } + } else if (slotItem.isAir()) { + slotItem = stackingRule.apply(cursor, slotSize); + finalCursorAmount -= slotSize; + } + itemSetter.accept(s, slotItem); + + callClickEvent(player, inventory, s, ClickType.LEFT_DRAGGING, slotItem, cursor); + } + + // If no slots were dragged over, no need to apply any kind of stacking rules + if (clickResult != null) { + cursor = stackingRule.apply(cursor, finalCursorAmount); + clickResult.setCursor(cursor); + } + } leftDraggingMap.remove(player); } else if (button == 6) { @@ -308,39 +323,51 @@ public class InventoryClickProcessor { if (size > cursorAmount) return null; + boolean cancel = false; + for (int s : slots) { - ItemStack draggedItem = cursor; ItemStack slotItem = itemGetter.apply(s); clickResult = startCondition(inventory, player, s, ClickType.RIGHT_DRAGGING, slotItem, cursor); - if (clickResult.isCancel()) - break; - StackingRule slotItemRule = slotItem.getStackingRule(); - if (stackingRule.canBeStacked(draggedItem, slotItem)) { - final int amount = slotItemRule.getAmount(slotItem) + 1; - if (stackingRule.canApply(slotItem, amount)) { - slotItem = stackingRule.apply(slotItem, amount); - itemSetter.accept(s, slotItem); + if (clickResult.isCancel()) { + cancel = true; + + break; + } + } + + cancel |= startCondition(inventory, player, slot, ClickType.END_RIGHT_DRAGGING, clicked, cursor).isCancel(); + + if (!cancel) { + for (int s : slots) { + ItemStack draggedItem = cursor; + ItemStack slotItem = itemGetter.apply(s); + + StackingRule slotItemRule = slotItem.getStackingRule(); + if (stackingRule.canBeStacked(draggedItem, slotItem)) { + final int amount = slotItemRule.getAmount(slotItem) + 1; + if (stackingRule.canApply(slotItem, amount)) { + slotItem = stackingRule.apply(slotItem, amount); + itemSetter.accept(s, slotItem); + cursorAmount -= 1; + } + } else if (slotItem.isAir()) { + draggedItem = stackingRule.apply(draggedItem, 1); + itemSetter.accept(s, draggedItem); cursorAmount -= 1; } - } else if (slotItem.isAir()) { - draggedItem = stackingRule.apply(draggedItem, 1); - itemSetter.accept(s, draggedItem); - cursorAmount -= 1; + + callClickEvent(player, inventory, s, ClickType.RIGHT_DRAGGING, draggedItem, cursor); } - callClickEvent(player, inventory, s, ClickType.RIGHT_DRAGGING, draggedItem, cursor); + // If no slots were dragged over, no need to apply any kind of stacking rules + if (clickResult != null) { + cursor = stackingRule.apply(cursor, cursorAmount); + clickResult.setCursor(cursor); + } } - // If no slots were dragged over, no need to apply any kind of stacking rules - if (clickResult != null) { - cursor = stackingRule.apply(cursor, cursorAmount); - clickResult.setCursor(cursor); - } - - clickResult = startCondition(inventory, player, slot, ClickType.END_RIGHT_DRAGGING, clicked, cursor); - rightDraggingMap.remove(player); }