diff --git a/src/main/kotlin/net/axay/kspigot/annotations/KSpigotAnnotations.kt b/src/main/kotlin/net/axay/kspigot/annotations/KSpigotAnnotations.kt index 6208e14a..c71a5ea2 100644 --- a/src/main/kotlin/net/axay/kspigot/annotations/KSpigotAnnotations.kt +++ b/src/main/kotlin/net/axay/kspigot/annotations/KSpigotAnnotations.kt @@ -16,4 +16,16 @@ annotation class UnsafeImplementation * unstable and should be checked every time * with a version change. */ -annotation class NMS_1_16_1 \ No newline at end of file +annotation class NMS_1_16_1 + +/** + * This element uses [net.minecraft.server] + * in some way. Because of that, it is + * unstable and should be checked every time + * with a version change. + * + * This element uses some part of NMS + * which is more likely to stay the same + * over a long period of time. + */ +annotation class NMS_General \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/nbt/NBTData.kt b/src/main/kotlin/net/axay/kspigot/nbt/NBTData.kt new file mode 100644 index 00000000..0c4aff60 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/nbt/NBTData.kt @@ -0,0 +1,79 @@ +package net.axay.kspigot.nbt + +import net.axay.kspigot.annotations.NMS_General +import net.minecraft.server.v1_16_R1.* + +@NMS_General +class NBTData { + + val nbtTagCompound: NBTTagCompound + + constructor(nbtTagCompound: NBTTagCompound?) { + this.nbtTagCompound = nbtTagCompound ?: NBTTagCompound() + } + + constructor(nbtString: String) : this(MojangsonParser.parse(nbtString)) + + fun serialize() = nbtTagCompound.toString() + + /** + * This method gets the value + * at the given [key]. The returned type + * must be specified. + * The returned value is null, if it + * was not possible to find any value at + * the specified location, or if the type + * is not the one which was specified. + */ + operator fun get(key: String): T? { + val value = nbtTagCompound.get(key) + return if (value != null) { + val loadedValue = when (value) { + is NBTTagCompound -> NBTData(value) + is NBTTagByte -> value.asByte() + is NBTTagByteArray -> value.bytes + is NBTTagDouble -> value.asDouble() + is NBTTagFloat -> value.asFloat() + is NBTTagInt -> value.asInt() + is NBTTagIntArray -> value.ints + is NBTTagList -> value + is NBTTagLong -> value.asLong() + is NBTTagLongArray -> value.longs + is NBTTagShort -> value.asShort() + is NBTTagString -> value.asString() + else -> null + } + return loadedValue as? T + } else null + } + + /** + * This method sets some [value] + * at the position of the given [key]. + */ + operator fun set(key: String, value: T): Boolean { + when (value) { + is NBTData -> nbtTagCompound.set(key, value.nbtTagCompound) + is Byte -> nbtTagCompound.setByte(key, value) + is ByteArray -> nbtTagCompound.setByteArray(key, value) + is Double -> nbtTagCompound.setDouble(key, value) + is Float -> nbtTagCompound.setFloat(key, value) + is Int -> nbtTagCompound.setInt(key, value) + is IntArray -> nbtTagCompound.setIntArray(key, value) + is List<*> -> nbtTagCompound.set(key, value as NBTList<*>) + is Long -> nbtTagCompound.setLong(key, value) + is LongArray -> nbtTagCompound.set(key, NBTTagLongArray(value)) + is Short -> nbtTagCompound.setShort(key, value) + is String -> nbtTagCompound.setString(key, value) + else -> return false + } + return true + } + + companion object { + + fun deserialize(nbtString: String) = NBTData(nbtString) + + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/nbt/NBTDataLoader.kt b/src/main/kotlin/net/axay/kspigot/nbt/NBTDataLoader.kt new file mode 100644 index 00000000..ed7ef79a --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/nbt/NBTDataLoader.kt @@ -0,0 +1,18 @@ +package net.axay.kspigot.nbt + +import net.axay.kspigot.annotations.NMS_General +import net.minecraft.server.v1_16_R1.NBTTagCompound +import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity +import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack +import org.bukkit.entity.Entity +import org.bukkit.inventory.ItemStack + +@NMS_General +val Entity.nbtData: NBTData get() { + val nbtTagCompound = NBTTagCompound() + (this as CraftEntity).handle.load(nbtTagCompound) + return NBTData(nbtTagCompound) +} + +@NMS_General +val ItemStack.nbtData: NBTData get() = NBTData(CraftItemStack.asNMSCopy(this).tag) \ No newline at end of file