Ensure that the meta is new when instantiating from NBT

This commit is contained in:
themode 2021-04-02 22:40:24 +02:00
parent 8d8a22f209
commit 4a075da3e0
5 changed files with 21 additions and 12 deletions

View File

@ -41,7 +41,7 @@ public class ItemBuilder {
@Contract(value = "_ -> this") @Contract(value = "_ -> this")
public @NotNull ItemBuilder meta(@NotNull UnaryOperator<@NotNull ItemMetaBuilder> itemMetaConsumer) { public @NotNull ItemBuilder meta(@NotNull UnaryOperator<@NotNull ItemMetaBuilder> itemMetaConsumer) {
itemMetaConsumer.apply(metaBuilder); this.metaBuilder = itemMetaConsumer.apply(metaBuilder);
return this; return this;
} }

View File

@ -3,11 +3,13 @@ package net.minestom.server.item;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.item.attribute.ItemAttribute; import net.minestom.server.item.attribute.ItemAttribute;
import net.minestom.server.utils.NBTUtils; import net.minestom.server.utils.NBTUtils;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import java.util.*; import java.util.*;
import java.util.function.Supplier;
public abstract class ItemMetaBuilder implements Cloneable { public abstract class ItemMetaBuilder implements Cloneable {
@ -22,9 +24,6 @@ public abstract class ItemMetaBuilder implements Cloneable {
protected NBTCompound originalNBT; protected NBTCompound originalNBT;
protected ItemMetaBuilder() {
}
public @NotNull ItemMetaBuilder damage(int damage) { public @NotNull ItemMetaBuilder damage(int damage) {
this.damage = damage; this.damage = damage;
return this; return this;
@ -88,10 +87,14 @@ public abstract class ItemMetaBuilder implements Cloneable {
protected abstract void deepClone(@NotNull ItemMetaBuilder metaBuilder); protected abstract void deepClone(@NotNull ItemMetaBuilder metaBuilder);
public static @NotNull ItemMetaBuilder fromNBT(@NotNull ItemMetaBuilder metaBuilder, @NotNull NBTCompound nbtCompound) { protected abstract @NotNull Supplier<@NotNull ItemMetaBuilder> getSupplier();
NBTUtils.loadDataIntoMeta(metaBuilder, nbtCompound);
metaBuilder.originalNBT = nbtCompound; @Contract(value = "_, _ -> new", pure = true)
return metaBuilder; 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 @Override

View File

@ -11,6 +11,7 @@ import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier;
public class CompassMeta extends ItemMeta implements ItemMetaBuilder.Provider<CompassMeta.Builder> { public class CompassMeta extends ItemMeta implements ItemMetaBuilder.Provider<CompassMeta.Builder> {
@ -143,5 +144,10 @@ public class CompassMeta extends ItemMeta implements ItemMetaBuilder.Provider<Co
compassBuilder.lodestoneDimension = lodestoneDimension; compassBuilder.lodestoneDimension = lodestoneDimension;
compassBuilder.lodestonePosition = lodestonePosition; compassBuilder.lodestonePosition = lodestonePosition;
} }
@Override
protected @NotNull Supplier<ItemMetaBuilder> getSupplier() {
return Builder::new;
}
} }
} }

View File

@ -142,7 +142,7 @@ public final class NBTUtils {
return loadItem(material, count, nbtCompound); 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) return ItemStack.builder(material)
.amount(count) .amount(count)
.meta(metaBuilder -> { .meta(metaBuilder -> {

View File

@ -222,19 +222,19 @@ public class PlayerInit {
globalEventHandler.addEventCallback(PlayerSpawnEvent.class, event -> { globalEventHandler.addEventCallback(PlayerSpawnEvent.class, event -> {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
player.setGameMode(GameMode.SURVIVAL); player.setGameMode(GameMode.CREATIVE);
player.setPermissionLevel(4); player.setPermissionLevel(4);
PlayerInventory inventory = player.getInventory(); PlayerInventory inventory = player.getInventory();
ItemStack itemStack = ItemStack.of(Material.STONE, 64); ItemStack itemStack = ItemStack.of(Material.STONE, 64);
inventory.addItemStack(itemStack); //inventory.addItemStack(itemStack);
{ {
ItemStack item = ItemStack.builder(Material.DIAMOND_CHESTPLATE) ItemStack item = ItemStack.builder(Material.DIAMOND_CHESTPLATE)
.displayName(Component.text("test")) .displayName(Component.text("test"))
.build(); .build();
inventory.setChestplate(item); //inventory.setChestplate(item);
} }
//player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 32)); //player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 32));