From 2b0c525ca29b443f72fe919e822d123f3962458f Mon Sep 17 00:00:00 2001 From: themode Date: Fri, 2 Apr 2021 19:10:46 +0200 Subject: [PATCH] Implement ItemStack#equals & use a soft reference to store meta cached NBT --- .../net/minestom/server/item/ItemMeta.java | 11 ++++--- .../net/minestom/server/item/ItemStack.java | 31 +++++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/item/ItemMeta.java b/src/main/java/net/minestom/server/item/ItemMeta.java index 06c64bf71..aa7176f84 100644 --- a/src/main/java/net/minestom/server/item/ItemMeta.java +++ b/src/main/java/net/minestom/server/item/ItemMeta.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.NBTCompound; +import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -29,7 +30,7 @@ public class ItemMeta implements Cloneable { private final int customModelData; - private NBTCompound cache = null; + private SoftReference cache; protected ItemMeta(@NotNull ItemMetaBuilder metaBuilder) { this.builder = metaBuilder.clone(); @@ -85,10 +86,12 @@ public class ItemMeta implements Cloneable { } public @NotNull NBTCompound toNBT() { - if (cache == null) { - this.cache = NBTUtils.metaToNBT(this); + var nbt = cache != null ? cache.get() : null; + if (nbt == null) { + nbt = NBTUtils.metaToNBT(this); + cache = new SoftReference<>(nbt); } - return cache; + return nbt; } @Override diff --git a/src/main/java/net/minestom/server/item/ItemStack.java b/src/main/java/net/minestom/server/item/ItemStack.java index ee8cfa692..a0124c31d 100644 --- a/src/main/java/net/minestom/server/item/ItemStack.java +++ b/src/main/java/net/minestom/server/item/ItemStack.java @@ -111,21 +111,48 @@ public class ItemStack { return withLore(loreUnaryOperator.apply(getLore())); } + @Contract(pure = true) public @NotNull StackingRule getStackingRule() { return stackingRule; } + @Contract(pure = true) public @NotNull ItemMeta getMeta() { return meta; } + @Contract(pure = true) + public boolean isAir() { + return equals(AIR); + } + + @Contract(pure = true) public boolean isSimilar(@NotNull ItemStack itemStack) { return material.equals(itemStack.material) && meta.equals(itemStack.meta); } - public boolean isAir() { - return equals(AIR); + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ItemStack itemStack = (ItemStack) o; + if (uuid.equals(itemStack.uuid)) return true; + + if (amount != itemStack.amount) return false; + if (!stackingRule.equals(itemStack.stackingRule)) return false; + if (material != itemStack.material) return false; + return meta.equals(itemStack.meta); + } + + @Override + public int hashCode() { + int result = stackingRule.hashCode(); + result = 31 * result + material.hashCode(); + result = 31 * result + amount; + result = 31 * result + meta.hashCode(); + return result; } @Contract(value = "-> new", pure = true)