Update item matcher

This commit is contained in:
Len 2023-11-24 10:28:18 +01:00
parent eb81e65212
commit 27d67d67c9

View File

@ -8,22 +8,17 @@ import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.*;
import org.bukkit.block.BlockState;
import org.bukkit.block.ShulkerBox;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.inventory.meta.*;
import org.bukkit.map.MapView;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
public class ShopUtil {
@ -59,37 +54,69 @@ public class ShopUtil {
return false; // One of them is null (Can't be both, see above)
if (stack1.getType() != stack2.getType())
return false; // Not the same material
if (stack1.getDurability() != stack2.getDurability())
return false; // Not the same durability
if (!(stack1.hasItemMeta() && stack2.hasItemMeta())) {
return false; // Only one of the items has item meta
}
if (stack1.hasItemMeta() && stack2.hasItemMeta()) {
ItemMeta itemMeta1 = stack1.getItemMeta();
ItemMeta itemMeta2 = stack2.getItemMeta();
if ((itemMeta1.hasDisplayName() != itemMeta2.hasDisplayName())) {
return false; // Only one has a display name
}
if (!itemMeta1.getDisplayName().equals(itemMeta2.getDisplayName())) {
return false; // items have different display name
}
// This is where the heavy checks are :/
if (itemMeta1 instanceof Damageable damageable1 && itemMeta2 instanceof Damageable damageable2) {
if (damageable1.getDamage() != damageable2.getDamage())
return false; // Not the same durability
}
// We need this check now because mapart stores data in the map NBT
if (itemMeta1 instanceof MapMeta mapMeta1 && itemMeta2 instanceof MapMeta mapMeta2) {
MapView mapView1 = mapMeta1.getMapView();
MapView mapView2 = mapMeta2.getMapView();
if (mapView1 == null || mapView2 == null)
return false; // at least one is null
if (mapView1.getId() != mapView2.getId())
return false; // ID does not match
}
if (itemMeta1 instanceof BlockStateMeta blockStateMeta1 && itemMeta2 instanceof BlockStateMeta blockStateMeta2) {
// extra heavy - Banners, Shulkerboxes, beehive and more?
BlockState blockState1 = blockStateMeta1.getBlockState();
BlockState blockState2 = blockStateMeta2.getBlockState();
if (blockState1 instanceof ShulkerBox shulkerBox1 && blockState2 instanceof ShulkerBox shulkerBox2) {
if (shulkerBox1.getColor() != shulkerBox2.getColor()) {
return false; // not the same color
}
// Do we need all of the above checks inside the shulker?
if (!Arrays.equals(shulkerBox1.getInventory().getContents(), shulkerBox2.getInventory().getContents())) {
return false; // not the same content
}
}
}
try {
Class.forName("org.bukkit.inventory.meta.EnchantmentStorageMeta");
boolean book1 = itemMeta1 instanceof EnchantmentStorageMeta;
boolean book2 = itemMeta2 instanceof EnchantmentStorageMeta;
if (book1 != book2)
return false;// One has enchantment meta, the other does not.
if (book1 == true) { // They are the same here (both true or both false). So if one is true, the other is true.
Map<Enchantment, Integer> ench1 = ((EnchantmentStorageMeta) itemMeta1).getStoredEnchants();
Map<Enchantment, Integer> ench2 = ((EnchantmentStorageMeta) itemMeta2).getStoredEnchants();
if (!ench1.equals(ench2))
return false; // Enchants aren't the same.
}
} catch (ClassNotFoundException ignored) {
}
}
if (!stack1.getEnchantments().equals(stack2.getEnchantments()))
return false; // They have the same enchants
if (!stack1.getItemMeta().equals(stack2.getItemMeta()))
return false; // They have the same enchants
if (stack1.getItemMeta().hasDisplayName() || stack2.getItemMeta().hasDisplayName()) {
if (stack1.getItemMeta().hasDisplayName() && stack2.getItemMeta().hasDisplayName()) {
if (!stack1.getItemMeta().getDisplayName().equals(stack2.getItemMeta().getDisplayName())) {
return false; // items have different display name
}
} else {
return false; // one of the item stacks have a display name
}
}
try {
Class.forName("org.bukkit.inventory.meta.EnchantmentStorageMeta");
boolean book1 = stack1.getItemMeta() instanceof EnchantmentStorageMeta;
boolean book2 = stack2.getItemMeta() instanceof EnchantmentStorageMeta;
if (book1 != book2)
return false;// One has enchantment meta, the other does not.
if (book1 == true) { // They are the same here (both true or both
// false). So if one is true, the other is
// true.
Map<Enchantment, Integer> ench1 = ((EnchantmentStorageMeta) stack1.getItemMeta()).getStoredEnchants();
Map<Enchantment, Integer> ench2 = ((EnchantmentStorageMeta) stack2.getItemMeta()).getStoredEnchants();
if (!ench1.equals(ench2))
return false; // Enchants aren't the same.
}
} catch (ClassNotFoundException e) {
}
// if (!stack1.getItemMeta().equals(stack2.getItemMeta()))
// return false; // They have the same enchants
return true;
}