diff --git a/src/main/java/com/io/yutian/aulib/util/InventoryUtil.java b/src/main/java/com/io/yutian/aulib/util/InventoryUtil.java new file mode 100644 index 0000000..028be51 --- /dev/null +++ b/src/main/java/com/io/yutian/aulib/util/InventoryUtil.java @@ -0,0 +1,28 @@ +package com.io.yutian.aulib.util; + +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +public class InventoryUtil { + + public static void takeItemStack(Inventory inventory, ItemStack itemStack, int amount) { + int index = -1; + int nowAmount = amount; + while (index < inventory.getSize() && nowAmount > 0) { + ++index; + ItemStack i = inventory.getItem(index); + if (i != null && ItemStackUtil.matches(itemStack, i)) { + int k = i.getAmount(); + if (k < nowAmount) { + i.setType(Material.AIR); + } else { + int l = k - nowAmount; + i.setAmount(l); + } + nowAmount -= k; + } + } + } + +} diff --git a/src/main/java/com/io/yutian/aulib/util/ItemStackUtil.java b/src/main/java/com/io/yutian/aulib/util/ItemStackUtil.java new file mode 100644 index 0000000..63b4d82 --- /dev/null +++ b/src/main/java/com/io/yutian/aulib/util/ItemStackUtil.java @@ -0,0 +1,99 @@ +package com.io.yutian.aulib.util; + +import com.io.yutian.aulib.nbt.NBTCompound; +import com.io.yutian.aulib.nbt.NBTItem; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class ItemStackUtil { + + public static List mergeItems(ItemStack item, int amount) { + int maxStackSize = item.getMaxStackSize(); + int totalAmount = amount; + int remainder = totalAmount % maxStackSize; + int quotient = totalAmount / maxStackSize; + List items = new ArrayList<>(); + for (int i = 0; i < quotient; i++) { + ItemStack itemStack = item.clone(); + itemStack.setAmount(maxStackSize); + items.add(itemStack); + } + ItemStack itemStack = item.clone(); + itemStack.setAmount(remainder); + items.add(itemStack); + return items; + } + + public static boolean matches(@Nullable ItemStack original, @Nullable ItemStack tester) { + if (original == null || tester == null) { + return false; + } + original = original.clone(); + original.setAmount(1); + tester = tester.clone(); + tester.setAmount(1); + Material comparisonType = original.getType().isLegacy() ? Bukkit.getUnsafe().fromLegacy(original.getData(), true) : original.getType(); + boolean flag = comparisonType == tester.getType() && original.getDurability() == tester.getDurability() && original.hasItemMeta() == tester.hasItemMeta() && (!original.hasItemMeta() || Bukkit.getItemFactory().equals(original.getItemMeta(), tester.getItemMeta())); + if (!flag) { + return false; + } + NBTItem nbtOriginal = new NBTItem(original); + NBTItem nbtTester = new NBTItem(tester); + NBTCompound nbtCompound0 = nbtOriginal.getTag(); + NBTCompound nbtCompound1 = nbtTester.getTag(); + return nbtCompound0.equals(nbtCompound1); + } + + public static int countItems(Inventory inventory, @NotNull ItemStack item) { + if (inventory == null) { + return 0; + } + int count = 0; + for (ItemStack itemStack : inventory) { + if (itemStack == null || itemStack.getType() == Material.AIR) { + continue; + } + if (matches(item, itemStack)) { + count+= itemStack.getAmount(); + } + } + return count; + } + + public static int countSpace(Inventory inventory, @NotNull ItemStack item) { + if (inventory == null) { + return 0; + } + int count = 0; + int itemMaxStackSize = item.getMaxStackSize(); + for (ItemStack itemStack : inventory) { + if (itemStack == null || itemStack.getType() == Material.AIR) { + count+=itemMaxStackSize; + } else if (matches(item, itemStack)) { + count+=itemStack.getAmount() >= itemMaxStackSize ? 0 : itemMaxStackSize - itemStack.getAmount(); + } + } + return count; + } + + public static String getItemName(ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + if (meta != null && meta.hasDisplayName()) { + return meta.getDisplayName(); + } + Material material = itemStack.getType(); + String id = material.name().toLowerCase(); + boolean isBlock = material.isBlock(); + String prefix = isBlock ? "block" : "item"; + return LangUtil.getLang(prefix+".minecraft."+id); + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 109b955..5bb62e5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: AuLib main: com.io.yutian.aulib.AuLib -version: 1.7.3 +version: 1.8 api-version: 1.18 author: SuperYuTian \ No newline at end of file