From c6fb7fb10f5b6f567611715e79a78c1fd344db51 Mon Sep 17 00:00:00 2001 From: William Date: Fri, 2 Feb 2024 23:01:41 +0000 Subject: [PATCH] fix: preserve order of saved items to keep, close #186 --- .../husksync/listener/PaperEventListener.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/paper/src/main/java/net/william278/husksync/listener/PaperEventListener.java b/paper/src/main/java/net/william278/husksync/listener/PaperEventListener.java index a91ad92b..6b469d37 100644 --- a/paper/src/main/java/net/william278/husksync/listener/PaperEventListener.java +++ b/paper/src/main/java/net/william278/husksync/listener/PaperEventListener.java @@ -19,14 +19,17 @@ package net.william278.husksync.listener; +import com.google.common.collect.Lists; import net.william278.husksync.BukkitHuskSync; import net.william278.husksync.data.BukkitData; import net.william278.husksync.user.BukkitUser; import net.william278.husksync.user.OnlineUser; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; import org.jetbrains.annotations.NotNull; +import java.util.Iterator; import java.util.List; import static net.william278.husksync.config.Settings.SynchronizationSettings.SaveOnDeathSettings; @@ -57,7 +60,7 @@ public class PaperEventListener extends BukkitEventListener { final int maxInventorySize = BukkitData.Items.Inventory.INVENTORY_SLOT_COUNT; final List itemsToSave = switch (settings.getItemsToSave()) { case DROPS -> event.getDrops(); - case ITEMS_TO_KEEP -> event.getItemsToKeep(); + case ITEMS_TO_KEEP -> preserveOrder(event.getEntity().getInventory(), event.getItemsToKeep()); }; if (itemsToSave.size() > maxInventorySize) { itemsToSave.subList(maxInventorySize, itemsToSave.size()).clear(); @@ -65,4 +68,22 @@ public class PaperEventListener extends BukkitEventListener { super.saveOnPlayerDeath(user, BukkitData.Items.ItemArray.adapt(itemsToSave)); } + @NotNull + private List preserveOrder(@NotNull PlayerInventory inventory, @NotNull List toKeep) { + final List preserved = Lists.newArrayList(); + final List items = Lists.newArrayList(inventory.getContents()); + for (ItemStack item : toKeep) { + final Iterator iterator = items.iterator(); + while (iterator.hasNext()) { + final ItemStack originalItem = iterator.next(); + if (originalItem != null && originalItem.equals(item)) { + preserved.add(originalItem); + iterator.remove(); + break; + } + } + } + return preserved; + } + }