Added convenience methods to convert ItemStack to/from NBTCompound

This commit is contained in:
jglrxavpok 2020-07-13 14:36:39 +02:00
parent 2cff307a20
commit b2f4c8654d
2 changed files with 33 additions and 3 deletions

View File

@ -7,7 +7,10 @@ import net.minestom.server.data.DataContainer;
import net.minestom.server.item.attribute.ItemAttribute;
import net.minestom.server.item.rule.VanillaStackingRule;
import net.minestom.server.potion.PotionType;
import net.minestom.server.registry.Registries;
import net.minestom.server.utils.NBTUtils;
import net.minestom.server.utils.validate.Check;
import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import java.util.*;
@ -590,4 +593,31 @@ public class ItemStack implements DataContainer {
private byte getBitModifier(ItemFlag hideFlag) {
return (byte) (1 << hideFlag.ordinal());
}
public NBTCompound toNBT() {
NBTCompound compound = new NBTCompound()
.setByte("Count", amount)
.setString("id", Material.fromId(materialId).getName());
if(hasNbtTag()) {
NBTCompound additionalTag = new NBTCompound();
NBTUtils.saveDataIntoNBT(this, additionalTag);
compound.set("tag", additionalTag);
}
return compound;
}
public static ItemStack fromNBT(NBTCompound nbt) {
if(!nbt.containsKey("id") || !nbt.containsKey("Count"))
throw new IllegalArgumentException("Invalid item NBT, must at least contain 'id' and 'Count' tags");
short materialID = Registries.getMaterial(nbt.getString("id")).getId();
byte count = nbt.getByte("Count");
ItemStack s = new ItemStack(materialID, count);
NBTCompound tag = nbt.getCompound("tag");
if(tag != null) {
NBTUtils.loadDataIntoItem(s, tag);
}
return s;
}
}

View File

@ -25,7 +25,7 @@ import java.util.*;
// for lack of a better name
public class NBTUtils {
private final static Logger LOGGER = LoggerFactory.getLogger(Utils.class);
private final static Logger LOGGER = LoggerFactory.getLogger(NBTUtils.class);
/**
* Loads all the items from the 'items' list into the given inventory
@ -109,7 +109,7 @@ public class NBTUtils {
return item;
}
private static void loadDataIntoItem(ItemStack item, NBTCompound nbt) {
public static void loadDataIntoItem(ItemStack item, NBTCompound nbt) {
if (nbt.containsKey("Damage")) item.setDamage(nbt.getInt("Damage"));
if (nbt.containsKey("Unbreakable")) item.setUnbreakable(nbt.getInt("Unbreakable") == 1);
if (nbt.containsKey("HideFlags")) item.setHideFlag(nbt.getInt("HideFlags"));
@ -209,7 +209,7 @@ public class NBTUtils {
}
}
private static void saveDataIntoNBT(ItemStack itemStack, NBTCompound itemNBT) {
public static void saveDataIntoNBT(ItemStack itemStack, NBTCompound itemNBT) {
// Unbreakable
if (itemStack.isUnbreakable()) {
itemNBT.setInt("Unbreakable", 1);