diff --git a/src/main/java/net/minestom/server/item/ItemBuilder.java b/src/main/java/net/minestom/server/item/ItemBuilder.java index d31704fe0..506107fdd 100644 --- a/src/main/java/net/minestom/server/item/ItemBuilder.java +++ b/src/main/java/net/minestom/server/item/ItemBuilder.java @@ -41,7 +41,7 @@ public class ItemBuilder { @Contract(value = "_ -> this") public @NotNull ItemBuilder meta(@NotNull UnaryOperator<@NotNull ItemMetaBuilder> itemMetaConsumer) { - itemMetaConsumer.apply(metaBuilder); + this.metaBuilder = itemMetaConsumer.apply(metaBuilder); return this; } diff --git a/src/main/java/net/minestom/server/item/ItemMetaBuilder.java b/src/main/java/net/minestom/server/item/ItemMetaBuilder.java index 0964c52aa..844e59c7f 100644 --- a/src/main/java/net/minestom/server/item/ItemMetaBuilder.java +++ b/src/main/java/net/minestom/server/item/ItemMetaBuilder.java @@ -3,11 +3,13 @@ package net.minestom.server.item; import net.kyori.adventure.text.Component; import net.minestom.server.item.attribute.ItemAttribute; import net.minestom.server.utils.NBTUtils; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.NBTCompound; import java.util.*; +import java.util.function.Supplier; public abstract class ItemMetaBuilder implements Cloneable { @@ -22,9 +24,6 @@ public abstract class ItemMetaBuilder implements Cloneable { protected NBTCompound originalNBT; - protected ItemMetaBuilder() { - } - public @NotNull ItemMetaBuilder damage(int damage) { this.damage = damage; return this; @@ -88,10 +87,14 @@ public abstract class ItemMetaBuilder implements Cloneable { protected abstract void deepClone(@NotNull ItemMetaBuilder metaBuilder); - public static @NotNull ItemMetaBuilder fromNBT(@NotNull ItemMetaBuilder metaBuilder, @NotNull NBTCompound nbtCompound) { - NBTUtils.loadDataIntoMeta(metaBuilder, nbtCompound); - metaBuilder.originalNBT = nbtCompound; - return metaBuilder; + protected abstract @NotNull Supplier<@NotNull ItemMetaBuilder> getSupplier(); + + @Contract(value = "_, _ -> new", pure = true) + public static @NotNull ItemMetaBuilder fromNBT(@NotNull ItemMetaBuilder src, @NotNull NBTCompound nbtCompound) { + ItemMetaBuilder dest = src.getSupplier().get(); + NBTUtils.loadDataIntoMeta(dest, nbtCompound); + dest.originalNBT = nbtCompound; + return dest; } @Override diff --git a/src/main/java/net/minestom/server/item/meta/CompassMeta.java b/src/main/java/net/minestom/server/item/meta/CompassMeta.java index b68233a34..fa7fcdc87 100644 --- a/src/main/java/net/minestom/server/item/meta/CompassMeta.java +++ b/src/main/java/net/minestom/server/item/meta/CompassMeta.java @@ -11,6 +11,7 @@ import org.jglrxavpok.hephaistos.nbt.NBTCompound; import java.util.List; import java.util.Map; +import java.util.function.Supplier; public class CompassMeta extends ItemMeta implements ItemMetaBuilder.Provider { @@ -143,5 +144,10 @@ public class CompassMeta extends ItemMeta implements ItemMetaBuilder.Provider getSupplier() { + return Builder::new; + } } } diff --git a/src/main/java/net/minestom/server/utils/NBTUtils.java b/src/main/java/net/minestom/server/utils/NBTUtils.java index 48e865020..ac86eab65 100644 --- a/src/main/java/net/minestom/server/utils/NBTUtils.java +++ b/src/main/java/net/minestom/server/utils/NBTUtils.java @@ -142,7 +142,7 @@ public final class NBTUtils { return loadItem(material, count, nbtCompound); } - public static @NotNull ItemStack loadItem(@NotNull Material material, int count, NBTCompound nbtCompound) { + public static @NotNull ItemStack loadItem(@NotNull Material material, int count, @Nullable NBTCompound nbtCompound) { return ItemStack.builder(material) .amount(count) .meta(metaBuilder -> { diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index a4f9d6ac8..f4ebbf4ce 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -222,19 +222,19 @@ public class PlayerInit { globalEventHandler.addEventCallback(PlayerSpawnEvent.class, event -> { final Player player = event.getPlayer(); - player.setGameMode(GameMode.SURVIVAL); + player.setGameMode(GameMode.CREATIVE); player.setPermissionLevel(4); PlayerInventory inventory = player.getInventory(); ItemStack itemStack = ItemStack.of(Material.STONE, 64); - inventory.addItemStack(itemStack); + //inventory.addItemStack(itemStack); { ItemStack item = ItemStack.builder(Material.DIAMOND_CHESTPLATE) .displayName(Component.text("test")) .build(); - inventory.setChestplate(item); + //inventory.setChestplate(item); } //player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 32));