diff --git a/pom.xml b/pom.xml index f3d5fc0..1ceb02e 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ io.papermc.paper paper-api - 26.1.2.build.68-stable + 26.2-rc-2.build.9-alpha provided diff --git a/src/main/java/com/codingguru/inventorystacks/commands/StackCmd.java b/src/main/java/com/codingguru/inventorystacks/commands/StackCmd.java index bc06fa7..635f4fe 100644 --- a/src/main/java/com/codingguru/inventorystacks/commands/StackCmd.java +++ b/src/main/java/com/codingguru/inventorystacks/commands/StackCmd.java @@ -9,10 +9,11 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import com.codingguru.inventorystacks.InventoryStacks; -import com.codingguru.inventorystacks.handlers.ItemHandler; -import com.codingguru.inventorystacks.util.MessagesUtil; -import com.codingguru.inventorystacks.util.VersionUtil; +import com.codingguru.inventorystacks.InventoryStacks; +import com.codingguru.inventorystacks.handlers.ItemHandler; +import com.codingguru.inventorystacks.util.ItemStackComparisonUtil; +import com.codingguru.inventorystacks.util.MessagesUtil; +import com.codingguru.inventorystacks.util.VersionUtil; public class StackCmd implements CommandExecutor { @@ -98,10 +99,11 @@ private void stackHand(Player player) { if (foundItem == null || foundItem.getType() == Material.AIR || foundItem.getAmount() <= 0) continue; - if (foundItem.isSimilar(item) && slot != player.getInventory().getHeldItemSlot()) { - amount = amount + foundItem.getAmount(); - player.getInventory().clear(slot); - } + if (ItemStackComparisonUtil.isSimilarIgnoringMaxStackSize(foundItem, item) + && slot != player.getInventory().getHeldItemSlot()) { + amount = amount + foundItem.getAmount(); + player.getInventory().clear(slot); + } } if (amount <= maxAmount) { @@ -150,9 +152,9 @@ private void stackAllItems(Player player) { if (item2 == null || item2.getAmount() <= 0) continue; - if (item2.isSimilar(item)) { - if (item2.getAmount() > neededUntilMax) { - item.setAmount(max); + if (ItemStackComparisonUtil.isSimilarIgnoringMaxStackSize(item2, item)) { + if (item2.getAmount() > neededUntilMax) { + item.setAmount(max); item2.setAmount(item2.getAmount() - neededUntilMax); break; } else { @@ -196,4 +198,4 @@ private static StackType getStackTypeFromName(String name) { return null; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/codingguru/inventorystacks/handlers/ItemHandler.java b/src/main/java/com/codingguru/inventorystacks/handlers/ItemHandler.java index 9c85f62..4429732 100644 --- a/src/main/java/com/codingguru/inventorystacks/handlers/ItemHandler.java +++ b/src/main/java/com/codingguru/inventorystacks/handlers/ItemHandler.java @@ -103,7 +103,7 @@ private boolean setupServerVersion() { String majorMinor = parts[0] + "." + parts[1]; if (versionFound.equalsIgnoreCase("craftbukkit")) { - if (majorMinor.equals("26.1") || majorMinor.equals("1.26")) { + if (majorMinor.equals("26.2") || majorMinor.equals("26.1") || majorMinor.equals("1.26")) { serverVersion = VersionUtil.v1_26; return true; } @@ -464,14 +464,17 @@ private String resolveItemGroupPattern(String key) { case "BANNERS": case "BANNER": return "^.*_BANNER$"; - case "MUSIC_DISCS": - case "MUSIC_DISC": - case "DISCS": - case "DISC": - return "^MUSIC_DISC_.*$"; - case "SPAWN_EGGS": - case "SPAWN_EGG": - return "^.*_SPAWN_EGG$"; + case "MUSIC_DISCS": + case "MUSIC_DISC": + case "DISCS": + case "DISC": + return "^MUSIC_DISC_.*$"; + case "ENCHANTED_BOOKS": + case "ENCHANTED_BOOK": + return "^ENCHANTED_BOOK$"; + case "SPAWN_EGGS": + case "SPAWN_EGG": + return "^.*_SPAWN_EGG$"; case "ARROWS": case "ARROW": return "^(ARROW|SPECTRAL_ARROW|TIPPED_ARROW)$"; @@ -572,4 +575,4 @@ public VersionUtil getServerVersion() { public ServerTypeUtil getServerType() { return serverType; } -} \ No newline at end of file +} diff --git a/src/main/java/com/codingguru/inventorystacks/listeners/BlockDispense.java b/src/main/java/com/codingguru/inventorystacks/listeners/BlockDispense.java index a202139..8913903 100644 --- a/src/main/java/com/codingguru/inventorystacks/listeners/BlockDispense.java +++ b/src/main/java/com/codingguru/inventorystacks/listeners/BlockDispense.java @@ -1,7 +1,6 @@ package com.codingguru.inventorystacks.listeners; import java.util.Map; -import java.util.Objects; import org.bukkit.Material; import org.bukkit.block.Block; @@ -17,6 +16,7 @@ import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionType; +import com.codingguru.inventorystacks.util.ItemStackComparisonUtil; import com.codingguru.inventorystacks.util.VersionUtil; import com.codingguru.inventorystacks.util.XMaterialUtil; @@ -111,7 +111,7 @@ private int findMatchingSlot(Inventory inv, ItemStack needle) { if (s.getType() != needle.getType()) continue; - if (!Objects.equals(s.getItemMeta(), needle.getItemMeta())) + if (!ItemStackComparisonUtil.hasSameMetaIgnoringMaxStackSize(s, needle)) continue; return i; @@ -126,4 +126,4 @@ private BlockFace getDispenserFacing(Block block) { } return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/codingguru/inventorystacks/listeners/correction/BlockDispense.java b/src/main/java/com/codingguru/inventorystacks/listeners/correction/BlockDispense.java index 050ca31..cd278a4 100644 --- a/src/main/java/com/codingguru/inventorystacks/listeners/correction/BlockDispense.java +++ b/src/main/java/com/codingguru/inventorystacks/listeners/correction/BlockDispense.java @@ -1,9 +1,8 @@ package com.codingguru.inventorystacks.listeners.correction; -import java.util.Map; -import java.util.Objects; - -import org.bukkit.Material; +import java.util.Map; + +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Dispenser; @@ -14,11 +13,12 @@ import org.bukkit.event.block.BlockDispenseEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.PotionType; - -import com.codingguru.inventorystacks.util.VersionUtil; -import com.codingguru.inventorystacks.util.XMaterialUtil; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionType; + +import com.codingguru.inventorystacks.util.ItemStackComparisonUtil; +import com.codingguru.inventorystacks.util.VersionUtil; +import com.codingguru.inventorystacks.util.XMaterialUtil; public class BlockDispense implements Listener { @@ -109,8 +109,8 @@ private int findMatchingSlot(Inventory inv, ItemStack needle) { if (s.getType() != needle.getType()) continue; - if (!Objects.equals(s.getItemMeta(), needle.getItemMeta())) - continue; + if (!ItemStackComparisonUtil.hasSameMetaIgnoringMaxStackSize(s, needle)) + continue; return i; } @@ -124,4 +124,4 @@ private BlockFace getDispenserFacing(Block block) { } return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/codingguru/inventorystacks/listeners/general/DroppedItemMerge.java b/src/main/java/com/codingguru/inventorystacks/listeners/general/DroppedItemMerge.java index 8f6b078..f129d31 100644 --- a/src/main/java/com/codingguru/inventorystacks/listeners/general/DroppedItemMerge.java +++ b/src/main/java/com/codingguru/inventorystacks/listeners/general/DroppedItemMerge.java @@ -13,16 +13,16 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.ItemMergeEvent; -import org.bukkit.event.entity.ItemSpawnEvent; -import org.bukkit.event.inventory.InventoryPickupItemEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import com.codingguru.inventorystacks.InventoryStacks; -import com.codingguru.inventorystacks.scheduler.Schedule; -import com.codingguru.inventorystacks.util.ConsoleUtil; -import com.codingguru.inventorystacks.util.GroundStackUtil; +import org.bukkit.event.entity.ItemSpawnEvent; +import org.bukkit.event.inventory.InventoryPickupItemEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import com.codingguru.inventorystacks.InventoryStacks; +import com.codingguru.inventorystacks.scheduler.Schedule; +import com.codingguru.inventorystacks.util.ConsoleUtil; +import com.codingguru.inventorystacks.util.GroundStackUtil; +import com.codingguru.inventorystacks.util.ItemStackComparisonUtil; public class DroppedItemMerge implements Listener { @@ -352,10 +352,8 @@ private boolean isMergeCandidate(ItemStack base, ItemStack other) { if (other.getType().isAir()) return false; - ItemStack normalizedBase = normalizeForMerge(base); - ItemStack normalizedOther = normalizeForMerge(other); - return normalizedBase.isSimilar(normalizedOther); - } + return ItemStackComparisonUtil.isSimilarIgnoringMaxStackSize(base, other); + } private void debug(String format, Object... args) { if (!isDebugEnabled()) @@ -377,23 +375,4 @@ private String simpleItem(Item item) { + GroundStackUtil.getTotal(item) + ")"; } - private ItemStack normalizeForMerge(ItemStack original) { - ItemStack normalized = original.clone(); - - if (!normalized.hasItemMeta()) - return normalized; - - ItemMeta meta = normalized.getItemMeta(); - - if (meta == null) - return normalized; - - if (!meta.hasMaxStackSize()) - return normalized; - - meta.setMaxStackSize(null); - normalized.setItemMeta(meta); - return normalized; - } - -} \ No newline at end of file +} diff --git a/src/main/java/com/codingguru/inventorystacks/util/ItemStackComparisonUtil.java b/src/main/java/com/codingguru/inventorystacks/util/ItemStackComparisonUtil.java new file mode 100644 index 0000000..ffa3337 --- /dev/null +++ b/src/main/java/com/codingguru/inventorystacks/util/ItemStackComparisonUtil.java @@ -0,0 +1,50 @@ +package com.codingguru.inventorystacks.util; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import com.codingguru.inventorystacks.handlers.ItemHandler; + +public class ItemStackComparisonUtil { + + public static boolean isSimilarIgnoringMaxStackSize(ItemStack first, ItemStack second) { + if (first == null || second == null) + return false; + + if (!ItemHandler.getInstance().isUsingModernAPI()) + return first.isSimilar(second); + + return withoutMaxStackSize(first).isSimilar(withoutMaxStackSize(second)); + } + + public static boolean hasSameMetaIgnoringMaxStackSize(ItemStack first, ItemStack second) { + if (first == null || second == null) + return false; + + if (!ItemHandler.getInstance().isUsingModernAPI()) + return equals(first.getItemMeta(), second.getItemMeta()); + + return equals(withoutMaxStackSize(first).getItemMeta(), withoutMaxStackSize(second).getItemMeta()); + } + + private static boolean equals(ItemMeta first, ItemMeta second) { + return first == null ? second == null : first.equals(second); + } + + private static ItemStack withoutMaxStackSize(ItemStack original) { + ItemStack normalized = original.clone(); + + if (!normalized.hasItemMeta()) + return normalized; + + ItemMeta meta = normalized.getItemMeta(); + + if (meta == null || !meta.hasMaxStackSize()) + return normalized; + + meta.setMaxStackSize(null); + normalized.setItemMeta(meta); + return normalized; + } + +} diff --git a/src/main/java/com/codingguru/inventorystacks/util/ItemUtil.java b/src/main/java/com/codingguru/inventorystacks/util/ItemUtil.java index 28877a7..4a3fba6 100644 --- a/src/main/java/com/codingguru/inventorystacks/util/ItemUtil.java +++ b/src/main/java/com/codingguru/inventorystacks/util/ItemUtil.java @@ -1,10 +1,8 @@ package com.codingguru.inventorystacks.util; -import java.util.Objects; - -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; public class ItemUtil { @@ -38,8 +36,8 @@ public static boolean removeOneMatching(Inventory inv, ItemStack needle) { if (s.getType() != needle.getType()) continue; - if (!Objects.equals(s.getItemMeta(), needle.getItemMeta())) - continue; + if (!ItemStackComparisonUtil.hasSameMetaIgnoringMaxStackSize(s, needle)) + continue; if (s.getAmount() <= 1) { inv.setItem(i, null); @@ -82,4 +80,4 @@ private static void add(Player player, ItemStack item) { } } -} \ No newline at end of file +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c27ab42..8d51098 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -102,7 +102,7 @@ max-stack-for-all-items: # BEDS, POTIONS, STEWS, BUCKETS, BOATS, MINECARTS, TOOLS, WEAPONS, # ARMOR, HORSE_ARMOR, DYES, SIGNS, DOORS, TRAPDOORS, BUTTONS, # PRESSURE_PLATES, FENCES, SLABS, STAIRS, WALLS, CARPETS, BANNERS, -# MUSIC_DISCS, SPAWN_EGGS, ARROWS, FIREWORKS, FOOD +# MUSIC_DISCS, ENCHANTED_BOOKS, SPAWN_EGGS, ARROWS, FIREWORKS, FOOD # (This list of items will also work with max-stack-for-all-items if enabled) items: @@ -115,9 +115,10 @@ items: # MINECARTS: 16 # TOOLS: 1 # WEAPONS: 1 - # ARMOR: 1 - # MUSIC_DISCS: 16 - # SPAWN_EGGS: 16 + # ARMOR: 1 + # MUSIC_DISCS: 16 + # ENCHANTED_BOOKS: 16 + # SPAWN_EGGS: 16 # SPLASH_POTION: 16 ############################################################################ @@ -147,4 +148,4 @@ prevent-shift-combining-damageable-items: true # Make brewing stands not be able to stack potions (not required for 1.20.6+) # This makes it so brewing stands only allow 1 potion in the potion slot -one-potion-per-slot: true \ No newline at end of file +one-potion-per-slot: true