From 895cfd9cb6a77186b8d81cde76d7d4ece4a94f38 Mon Sep 17 00:00:00 2001 From: bdew Date: Sun, 31 May 2015 15:40:08 +0300 Subject: [PATCH] Improved NBT constructor --- build.properties | 2 +- src/net/bdew/lib/nbt/NBT.scala | 34 ++++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/build.properties b/build.properties index 4f53722..e26fcfc 100644 --- a/build.properties +++ b/build.properties @@ -1,4 +1,4 @@ -bdlib.version=1.8.0 +bdlib.version=1.8.1 curseforge.id=70496 minecraft.version=1.7.10 diff --git a/src/net/bdew/lib/nbt/NBT.scala b/src/net/bdew/lib/nbt/NBT.scala index c664574..71dd1eb 100644 --- a/src/net/bdew/lib/nbt/NBT.scala +++ b/src/net/bdew/lib/nbt/NBT.scala @@ -9,7 +9,8 @@ package net.bdew.lib.nbt -import net.minecraft.nbt.{NBTBase, NBTTagCompound, NBTTagList} +import net.minecraft.item.ItemStack +import net.minecraft.nbt.{NBTBase, NBTTagByte, NBTTagCompound, NBTTagList} import scala.language.implicitConversions @@ -17,20 +18,33 @@ object NBT { class NBTSerialized(val value: NBTBase) extends AnyVal - implicit def serializeNbtPrimitive[T: Type](v: T): NBTSerialized = new NBTSerialized(Type[T].toNBT(v)) + object NBTSerialized { + implicit def serializeNbtPrimitive[T: Type](v: T): NBTSerialized = new NBTSerialized(Type[T].toNBT(v)) - implicit def serializeNbtList[T: Type](v: List[T]): NBTSerialized = { - val list = new NBTTagList - for (x <- v) list.appendTag(Type[T].toNBT(x)) - new NBTSerialized(list) + implicit def serializeNbtList[T: Type](v: Traversable[T]): NBTSerialized = { + val list = new NBTTagList + for (x <- v) list.appendTag(Type[T].toNBT(x)) + new NBTSerialized(list) + } + + // Boolean is special because it's represented as a byte in NBT + implicit def serializeBoolean(v: Boolean): NBTSerialized = new NBTSerialized(new NBTTagByte(if (v) 1 else 0)) + + // Itemstack serialization helpers + implicit def serializeItemStack(v: ItemStack): NBTSerialized = new NBTSerialized(NBT.from(v.writeToNBT _)) + implicit def serializeItemStackList(v: Traversable[ItemStack]): NBTSerialized = serializeNbtList(v map (x => NBT.from(x.writeToNBT _))) } - def apply(pairs: (String, NBTSerialized)*): NBTTagCompound = apply(pairs.toMap) - - def apply(m: Map[String, NBTSerialized]): NBTTagCompound = { + def apply(pairs: (String, NBTSerialized)*): NBTTagCompound = { val tag = new NBTTagCompound() - for ((k, v) <- m) + for ((k, v) <- pairs) tag.setTag(k, v.value) tag } + + def from(f: (NBTTagCompound) => _) = { + val v = new NBTTagCompound + f(v) + v + } }