diff --git a/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java b/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java index 11d7ead1..7e1a4fda 100644 --- a/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java +++ b/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java @@ -23,6 +23,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.WorldSaveEvent; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; import java.util.logging.Level; import java.util.stream.Collectors; @@ -55,7 +56,8 @@ public class BukkitEventListener extends EventListener implements Listener { final OnlineUser user = BukkitPlayer.adapt(player); if (plugin.getDataEditor().isEditingInventoryData(user)) { try { - BukkitSerializer.serializeItemStackArray(event.getInventory().getContents()).thenAccept( + BukkitSerializer.serializeItemStackArray(Arrays.copyOf(event.getInventory().getContents(), + event.getPlayer().getInventory().getSize())).thenAccept( serializedInventory -> super.handleMenuClose(user, new ItemData(serializedInventory))); } catch (DataSerializationException e) { plugin.getLoggingAdapter().log(Level.SEVERE, diff --git a/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java b/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java index 583b665b..c15010af 100644 --- a/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java +++ b/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java @@ -452,12 +452,13 @@ public class BukkitPlayer extends OnlineUser { final Inventory inventory = Bukkit.createInventory(player, menu.slotCount, BaseComponent.toLegacyText(menu.menuTitle.toComponent())); inventory.setContents(inventoryContents); - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { - player.closeInventory(); - player.openInventory(inventory); - }); + Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> player.openInventory(inventory)); }); + } + @Override + public void closeOpenInventories() { + Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), player::closeInventory); } @Override diff --git a/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java b/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java index 16aa8e7a..b071c44d 100644 --- a/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java +++ b/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java @@ -65,17 +65,18 @@ public class EnderChestCommand extends CommandBase implements TabCompletable { DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault()) .format(userDataSnapshot.versionTimestamp())) .ifPresent(player::sendMessage); - final ItemData enderChestDataOnClose = plugin.getDataEditor().openItemEditorMenu(player, menu).join(); - if (!menu.canEdit) { - return; - } - final UserData updatedUserData = new UserData(data.getStatusData(), data.getInventoryData(), - enderChestDataOnClose, data.getPotionEffectsData(), data.getAdvancementData(), - data.getStatisticsData(), data.getLocationData(), - data.getPersistentDataContainerData(), - plugin.getMinecraftVersion().toString()); - plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.ENDERCHEST_COMMAND).join(); - plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); + plugin.getDataEditor().openItemEditorMenu(player, menu).thenAccept(enderChestDataOnClose -> { + if (!menu.canEdit) { + return; + } + final UserData updatedUserData = new UserData(data.getStatusData(), data.getInventoryData(), + enderChestDataOnClose, data.getPotionEffectsData(), data.getAdvancementData(), + data.getStatisticsData(), data.getLocationData(), + data.getPersistentDataContainerData(), + plugin.getMinecraftVersion().toString()); + plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.ENDERCHEST_COMMAND).join(); + plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); + }); }); } diff --git a/common/src/main/java/net/william278/husksync/command/InventoryCommand.java b/common/src/main/java/net/william278/husksync/command/InventoryCommand.java index 78ea60c1..e294fa28 100644 --- a/common/src/main/java/net/william278/husksync/command/InventoryCommand.java +++ b/common/src/main/java/net/william278/husksync/command/InventoryCommand.java @@ -65,17 +65,18 @@ public class InventoryCommand extends CommandBase implements TabCompletable { DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault()) .format(userDataSnapshot.versionTimestamp())) .ifPresent(player::sendMessage); - final ItemData inventoryDataOnClose = plugin.getDataEditor().openItemEditorMenu(player, menu).join(); - if (!menu.canEdit) { - return; - } - final UserData updatedUserData = new UserData(data.getStatusData(), inventoryDataOnClose, - data.getEnderChestData(), data.getPotionEffectsData(), data.getAdvancementData(), - data.getStatisticsData(), data.getLocationData(), - data.getPersistentDataContainerData(), - plugin.getMinecraftVersion().toString()); - plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND).join(); - plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); + plugin.getDataEditor().openItemEditorMenu(player, menu).thenAccept(inventoryDataOnClose -> { + if (!menu.canEdit) { + return; + } + final UserData updatedUserData = new UserData(data.getStatusData(), inventoryDataOnClose, + data.getEnderChestData(), data.getPotionEffectsData(), data.getAdvancementData(), + data.getStatisticsData(), data.getLocationData(), + data.getPersistentDataContainerData(), + plugin.getMinecraftVersion().toString()); + plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND).join(); + plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); + }); }); } diff --git a/common/src/main/java/net/william278/husksync/editor/DataEditor.java b/common/src/main/java/net/william278/husksync/editor/DataEditor.java index 1179a29e..1fa8d803 100644 --- a/common/src/main/java/net/william278/husksync/editor/DataEditor.java +++ b/common/src/main/java/net/william278/husksync/editor/DataEditor.java @@ -42,6 +42,7 @@ public class DataEditor { */ public CompletableFuture openItemEditorMenu(@NotNull OnlineUser user, @NotNull ItemEditorMenu itemEditorMenu) { + //user.closeOpenInventories(); this.openInventoryMenus.put(user.uuid, itemEditorMenu); return itemEditorMenu.showInventory(user); } @@ -54,6 +55,7 @@ public class DataEditor { */ public void closeInventoryMenu(@NotNull OnlineUser user, @NotNull ItemData itemData) { if (this.openInventoryMenus.containsKey(user.uuid)) { + System.out.println("Closing inventory menu for " + user.uuid); this.openInventoryMenus.get(user.uuid).closeInventory(itemData); } this.openInventoryMenus.remove(user.uuid); diff --git a/common/src/main/java/net/william278/husksync/player/OnlineUser.java b/common/src/main/java/net/william278/husksync/player/OnlineUser.java index 4daed578..9b3f0906 100644 --- a/common/src/main/java/net/william278/husksync/player/OnlineUser.java +++ b/common/src/main/java/net/william278/husksync/player/OnlineUser.java @@ -258,6 +258,11 @@ public abstract class OnlineUser extends User { */ public abstract void showMenu(@NotNull ItemEditorMenu menu); + /** + * Close inventories the player currently has open + */ + public abstract void closeOpenInventories(); + /** * Get the player's current {@link UserData} * diff --git a/common/src/test/java/net/william278/husksync/player/DummyPlayer.java b/common/src/test/java/net/william278/husksync/player/DummyPlayer.java index 5ba1eba8..a22f922d 100644 --- a/common/src/test/java/net/william278/husksync/player/DummyPlayer.java +++ b/common/src/test/java/net/william278/husksync/player/DummyPlayer.java @@ -160,4 +160,9 @@ public class DummyPlayer extends OnlineUser { // do nothing } + @Override + public void closeOpenInventories() { + // do nothing + } + }