diff --git a/src/main/java/net/coreprotect/database/Rollback.java b/src/main/java/net/coreprotect/database/Rollback.java index 3eebde5..f186e29 100644 --- a/src/main/java/net/coreprotect/database/Rollback.java +++ b/src/main/java/net/coreprotect/database/Rollback.java @@ -1038,6 +1038,7 @@ public class Rollback extends Queue { } chunkChanges.clear(); + Map> sortPlayers = new HashMap<>(); Object container = null; Material containerType = null; boolean containerInit = false; @@ -1101,7 +1102,14 @@ public class Rollback extends Queue { if (rowAction == ItemLogger.ITEM_REMOVE_ENDER || rowAction == ItemLogger.ITEM_ADD_ENDER) { modifyContainerItems(containerType, player.getEnderChest(), (Integer) populatedStack[0], ((ItemStack) populatedStack[2]).clone(), action ^ 1); } - modifyContainerItems(containerType, player.getInventory(), (Integer) populatedStack[0], (ItemStack) populatedStack[2], action); + int modifiedArmor = modifyContainerItems(containerType, player.getInventory(), (Integer) populatedStack[0], (ItemStack) populatedStack[2], action); + if (modifiedArmor > -1) { + List currentSortList = sortPlayers.getOrDefault(player, new ArrayList<>()); + if (!currentSortList.contains(modifiedArmor)) { + currentSortList.add(modifiedArmor); + } + sortPlayers.put(player, currentSortList); + } itemCount1 = itemCount1 + rowAmount; ConfigHandler.rollbackHash.put(finalUserString, new int[] { itemCount1, blockCount1, entityCount1, 0 }); @@ -1186,6 +1194,11 @@ public class Rollback extends Queue { } itemData.clear(); + for (Entry> sortEntry : sortPlayers.entrySet()) { + sortContainerItems(sortEntry.getKey().getInventory(), sortEntry.getValue()); + } + sortPlayers.clear(); + int[] rollbackHashData1 = ConfigHandler.rollbackHash.get(finalUserString); int itemCount1 = rollbackHashData1[0]; int blockCount1 = rollbackHashData1[1]; @@ -1567,7 +1580,8 @@ public class Rollback extends Queue { } } - static void modifyContainerItems(Material type, Object container, int slot, ItemStack itemstack, int action) { + static int modifyContainerItems(Material type, Object container, int slot, ItemStack itemstack, int action) { + int modifiedArmor = -1; try { ItemStack[] contents = null; @@ -1629,7 +1643,9 @@ public class Rollback extends Queue { while (count < amount) { boolean addedItem = false; if (isPlayerInventory) { - addedItem = Util.setPlayerArmor((PlayerInventory) inventory, itemstack); + int setArmor = Util.setPlayerArmor((PlayerInventory) inventory, itemstack); + addedItem = (setArmor > -1); + modifiedArmor = addedItem ? setArmor : modifiedArmor; } if (!addedItem) { addedItem = (inventory.addItem(itemstack).size() == 0); @@ -1710,6 +1726,37 @@ public class Rollback extends Queue { catch (Exception e) { e.printStackTrace(); } + + return modifiedArmor; + } + + public static void sortContainerItems(PlayerInventory inventory, List modifiedArmorSlots) { + try { + ItemStack[] armorContents = inventory.getArmorContents(); + ItemStack[] storageContents = inventory.getStorageContents(); + + for (int armor = 0; armor < armorContents.length; armor++) { + ItemStack armorItem = armorContents[armor]; + if (armorItem == null || !modifiedArmorSlots.contains(armor)) { + continue; + } + + for (int storage = 0; storage < storageContents.length; storage++) { + ItemStack storageItem = storageContents[storage]; + if (storageItem == null) { + storageContents[storage] = armorItem; + armorContents[armor] = null; + break; + } + } + } + + inventory.setArmorContents(armorContents); + inventory.setStorageContents(storageContents); + } + catch (Exception e) { + e.printStackTrace(); + } } private static void buildFireworkEffect(Builder effectBuilder, Material rowType, ItemStack itemstack) { diff --git a/src/main/java/net/coreprotect/utility/Util.java b/src/main/java/net/coreprotect/utility/Util.java index f087f9e..9abfc0a 100755 --- a/src/main/java/net/coreprotect/utility/Util.java +++ b/src/main/java/net/coreprotect/utility/Util.java @@ -656,7 +656,7 @@ public class Util extends Queue { return artname; } - public static boolean setPlayerArmor(PlayerInventory inventory, ItemStack itemStack) { + public static int setPlayerArmor(PlayerInventory inventory, ItemStack itemStack) { String itemName = itemStack.getType().name(); boolean isHelmet = (itemName.endsWith("_HELMET") || itemName.endsWith("_HEAD") || itemName.endsWith("_SKULL") || itemName.endsWith("_PUMPKIN")); boolean isChestplate = (itemName.endsWith("_CHESTPLATE")); @@ -665,22 +665,22 @@ public class Util extends Queue { if (isHelmet && inventory.getHelmet() == null) { inventory.setHelmet(itemStack); - return true; + return 3; } else if (isChestplate && inventory.getChestplate() == null) { inventory.setChestplate(itemStack); - return true; + return 2; } else if (isLeggings && inventory.getLeggings() == null) { inventory.setLeggings(itemStack); - return true; + return 1; } else if (isBoots && inventory.getBoots() == null) { inventory.setBoots(itemStack); - return true; + return 0; } - return false; + return -1; } public static ItemStack[] getArmorStandContents(EntityEquipment equipment) {