From 798caeb28e9de707933c1d84984779e24c216ee2 Mon Sep 17 00:00:00 2001 From: DungeonDev Date: Thu, 23 Mar 2023 02:20:50 +0100 Subject: [PATCH 1/2] Fix inventory desync by waiting 1 tick. --- .../bsbrewritten/listeners/InteractListener.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java b/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java index 840b1ac..0165a97 100644 --- a/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java +++ b/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java @@ -3,6 +3,7 @@ import dev.martinl.bsbrewritten.BSBRewritten; import dev.martinl.bsbrewritten.manager.SlotType; import dev.martinl.bsbrewritten.util.MaterialUtil; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -66,7 +67,14 @@ public void onClick(InventoryClickEvent e) { } if(!isShulker) return; e.setCancelled(true); - instance.getShulkerManager().openShulkerBoxInventory(player, clicked, SlotType.INVENTORY, e.getRawSlot()); - + ItemStack oldItem = clicked.clone(); + // Run the handler in 1 tick to not desync the inventory. + Bukkit.getScheduler().runTask(instance, () -> + { + // Make sure the item has not changed since the click. + if (oldItem.equals(clicked)) { + instance.getShulkerManager().openShulkerBoxInventory(player, clicked, SlotType.INVENTORY, e.getRawSlot()); + } + }); } } From 6be94f102439ae95c90206903367b1044b9c946e Mon Sep 17 00:00:00 2001 From: DungeonDev Date: Thu, 23 Mar 2023 04:13:29 +0100 Subject: [PATCH 2/2] Re-get the ItemStack from the clickedInventory on the tick, as the "clicked" ItemStack is not consistent. --- .../bsbrewritten/listeners/InteractListener.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java b/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java index 0165a97..4977901 100644 --- a/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java +++ b/src/main/java/dev/martinl/bsbrewritten/listeners/InteractListener.java @@ -69,12 +69,12 @@ public void onClick(InventoryClickEvent e) { e.setCancelled(true); ItemStack oldItem = clicked.clone(); // Run the handler in 1 tick to not desync the inventory. - Bukkit.getScheduler().runTask(instance, () -> - { - // Make sure the item has not changed since the click. - if (oldItem.equals(clicked)) { - instance.getShulkerManager().openShulkerBoxInventory(player, clicked, SlotType.INVENTORY, e.getRawSlot()); - } - }); + Bukkit.getScheduler().runTask(instance, () -> { + ItemStack currentItem = clickedInventory.getItem(e.getSlot()); + // Make sure the item has not changed since the click. + if (oldItem.equals(currentItem)) { + instance.getShulkerManager().openShulkerBoxInventory(player, currentItem, SlotType.INVENTORY, e.getRawSlot()); + } + }); } }