diff --git a/libnbt-core/pom.xml b/libnbt-core/pom.xml
index 5b3193e..8185818 100644
--- a/libnbt-core/pom.xml
+++ b/libnbt-core/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-standalone/pom.xml b/libnbt-standalone/pom.xml
index 4415b12..6b0bd72 100644
--- a/libnbt-standalone/pom.xml
+++ b/libnbt-standalone/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_10_R1/pom.xml b/libnbt-v1_10_R1/pom.xml
index 90d81b1..9f70ef0 100644
--- a/libnbt-v1_10_R1/pom.xml
+++ b/libnbt-v1_10_R1/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_11_R1/pom.xml b/libnbt-v1_11_R1/pom.xml
index 963c1e7..22d796f 100644
--- a/libnbt-v1_11_R1/pom.xml
+++ b/libnbt-v1_11_R1/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_12_R1/pom.xml b/libnbt-v1_12_R1/pom.xml
index fa53634..038558f 100644
--- a/libnbt-v1_12_R1/pom.xml
+++ b/libnbt-v1_12_R1/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_12_R1_1/pom.xml b/libnbt-v1_12_R1_1/pom.xml
index a277b86..33b2a65 100644
--- a/libnbt-v1_12_R1_1/pom.xml
+++ b/libnbt-v1_12_R1_1/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_12_R1_2/pom.xml b/libnbt-v1_12_R1_2/pom.xml
index a82d173..ff85731 100644
--- a/libnbt-v1_12_R1_2/pom.xml
+++ b/libnbt-v1_12_R1_2/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_13_R1/pom.xml b/libnbt-v1_13_R1/pom.xml
index 674f62f..381da7a 100644
--- a/libnbt-v1_13_R1/pom.xml
+++ b/libnbt-v1_13_R1/pom.xml
@@ -5,7 +5,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_13_R2/pom.xml b/libnbt-v1_13_R2/pom.xml
index 513e54a..dd5c8d4 100644
--- a/libnbt-v1_13_R2/pom.xml
+++ b/libnbt-v1_13_R2/pom.xml
@@ -5,7 +5,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_13_R2_1/pom.xml b/libnbt-v1_13_R2_1/pom.xml
index 5f8d5c1..80de8e4 100644
--- a/libnbt-v1_13_R2_1/pom.xml
+++ b/libnbt-v1_13_R2_1/pom.xml
@@ -5,7 +5,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_14_R1/pom.xml b/libnbt-v1_14_R1/pom.xml
new file mode 100644
index 0000000..ffb8828
--- /dev/null
+++ b/libnbt-v1_14_R1/pom.xml
@@ -0,0 +1,41 @@
+
+ 4.0.0
+ org.cyberiantiger.minecraft
+ libnbt-v1_14_R1
+
+ org.cyberiantiger.minecraft
+ libnbt-parent
+ 2.11-SNAPSHOT
+
+
+ src/main/java
+
+
+ true
+ src/resources
+
+
+
+
+ maven-compiler-plugin
+ 3.0
+
+
+ 1.8
+
+
+
+
+
+
+ org.bukkit
+ craftbukkit
+ 1.14-pre5-SNAPSHOT
+
+
+ ${project.groupId}
+ libnbt-core
+ ${project.version}
+
+
+
diff --git a/libnbt-v1_14_R1/src/main/java/org/cyberiantiger/minecraft/unsafe/v1_14_R1/NBTTools.java b/libnbt-v1_14_R1/src/main/java/org/cyberiantiger/minecraft/unsafe/v1_14_R1/NBTTools.java
new file mode 100644
index 0000000..44e602a
--- /dev/null
+++ b/libnbt-v1_14_R1/src/main/java/org/cyberiantiger/minecraft/unsafe/v1_14_R1/NBTTools.java
@@ -0,0 +1,381 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.cyberiantiger.minecraft.unsafe.v1_14_R1;
+
+import java.lang.reflect.Array;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_14_R1.BlockPosition;
+import net.minecraft.server.v1_14_R1.IBlockData;
+import net.minecraft.server.v1_14_R1.NBTBase;
+import net.minecraft.server.v1_14_R1.NBTTagByte;
+import net.minecraft.server.v1_14_R1.NBTTagByteArray;
+import net.minecraft.server.v1_14_R1.NBTTagCompound;
+import net.minecraft.server.v1_14_R1.NBTTagDouble;
+import net.minecraft.server.v1_14_R1.NBTTagFloat;
+import net.minecraft.server.v1_14_R1.NBTTagInt;
+import net.minecraft.server.v1_14_R1.NBTTagIntArray;
+import net.minecraft.server.v1_14_R1.NBTTagList;
+import net.minecraft.server.v1_14_R1.NBTTagLong;
+import net.minecraft.server.v1_14_R1.NBTTagShort;
+import net.minecraft.server.v1_14_R1.NBTTagString;
+import net.minecraft.server.v1_14_R1.TileEntity;
+import net.minecraft.server.v1_14_R1.WorldServer;
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
+import org.bukkit.entity.Entity;
+import org.bukkit.inventory.ItemStack;
+import org.cyberiantiger.minecraft.nbt.ByteArrayTag;
+import org.cyberiantiger.minecraft.nbt.ByteTag;
+import org.cyberiantiger.minecraft.nbt.CompoundTag;
+import org.cyberiantiger.minecraft.nbt.DoubleTag;
+import org.cyberiantiger.minecraft.nbt.FloatTag;
+import org.cyberiantiger.minecraft.nbt.IntArrayTag;
+import org.cyberiantiger.minecraft.nbt.IntTag;
+import org.cyberiantiger.minecraft.nbt.ListTag;
+import org.cyberiantiger.minecraft.nbt.LongTag;
+import org.cyberiantiger.minecraft.nbt.ShortTag;
+import org.cyberiantiger.minecraft.nbt.StringTag;
+import org.cyberiantiger.minecraft.nbt.Tag;
+import org.cyberiantiger.minecraft.nbt.TagType;
+
+/**
+ *
+ * @author antony
+ */
+public final class NBTTools implements org.cyberiantiger.minecraft.unsafe.NBTTools {
+
+ public NBTTagCompound toNativeCompound(CompoundTag tag) {
+ NBTTagCompound result = new NBTTagCompound();
+ for (@SuppressWarnings("rawtypes")
+ Map.Entry e : tag.getValue().entrySet()) {
+ NBTBase base;
+ String name = e.getKey();
+ Tag> t = e.getValue();
+ switch (t.getType()) {
+ case BYTE:
+ base = new NBTTagByte(((ByteTag) t).getRawValue());
+ break;
+ case BYTE_ARRAY:
+ base = new NBTTagByteArray(((ByteArrayTag) t).getValue());
+ break;
+ case COMPOUND:
+ base = toNativeCompound((CompoundTag) t);
+ break;
+ case DOUBLE:
+ base = new NBTTagDouble(((DoubleTag) t).getRawValue());
+ break;
+ case FLOAT:
+ base = new NBTTagFloat(((FloatTag) t).getRawValue());
+ break;
+ case INT:
+ base = new NBTTagInt(((IntTag) t).getRawValue());
+ break;
+ case INT_ARRAY:
+ base = new NBTTagIntArray(((IntArrayTag) t).getValue());
+ break;
+ case LIST:
+ base = toNativeList((ListTag) t);
+ break;
+ case LONG:
+ base = new NBTTagLong(((LongTag) t).getRawValue());
+ break;
+ case SHORT:
+ base = new NBTTagShort(((ShortTag) t).getRawValue());
+ break;
+ case STRING:
+ base = new NBTTagString(((StringTag) t).getValue());
+ break;
+ default:
+ // Can't be reached.
+ throw new IllegalArgumentException();
+ }
+ result.set(name, base);
+ }
+ return result;
+ }
+
+ public NBTTagList toNativeList(ListTag tag) {
+ NBTTagList result = new NBTTagList();
+
+ switch (tag.getListType()) {
+ case BYTE:
+ for (ByteTag t : (ByteTag[]) tag.getValue()) {
+ result.add(new NBTTagByte(t.getRawValue()));
+ }
+ break;
+ case BYTE_ARRAY:
+ for (ByteArrayTag t : (ByteArrayTag[]) tag.getValue()) {
+ result.add(new NBTTagByteArray(t.getValue()));
+ }
+ break;
+ case COMPOUND:
+ for (CompoundTag t : (CompoundTag[]) tag.getValue()) {
+ result.add(toNativeCompound(t));
+ }
+ break;
+ case DOUBLE:
+ for (DoubleTag t : (DoubleTag[]) tag.getValue()) {
+ result.add(new NBTTagDouble(t.getRawValue()));
+ }
+ break;
+ case FLOAT:
+ for (FloatTag t : (FloatTag[]) tag.getValue()) {
+ result.add(new NBTTagFloat(t.getRawValue()));
+ }
+ break;
+ case INT:
+ for (IntTag t : (IntTag[]) tag.getValue()) {
+ result.add(new NBTTagInt(t.getRawValue()));
+ }
+ break;
+ case INT_ARRAY:
+ for (IntArrayTag t : (IntArrayTag[]) tag.getValue()) {
+ result.add(new NBTTagIntArray(t.getValue()));
+ }
+ break;
+ case LIST:
+ for (ListTag t : (ListTag[]) tag.getValue()) {
+ result.add(toNativeList(t));
+ }
+ case LONG:
+ for (LongTag t : (LongTag[]) tag.getValue()) {
+ result.add(new NBTTagLong(t.getRawValue()));
+ }
+ break;
+ case SHORT:
+ for (ShortTag t : (ShortTag[]) tag.getValue()) {
+ result.add(new NBTTagShort(t.getRawValue()));
+ }
+ break;
+ case STRING:
+ for (StringTag t : (StringTag[]) tag.getValue()) {
+ result.add(new NBTTagString(t.getValue()));
+ }
+ break;
+ case END:
+ break;
+ }
+
+ return result;
+ }
+
+ public CompoundTag fromNativeCompound(NBTTagCompound tag) {
+ try {
+ @SuppressWarnings("rawtypes")
+ Map result = new HashMap();
+ for (String name : tag.getKeys()) {
+ NBTBase b = tag.get(name);
+ switch (TagType.values()[b.getTypeId()]) {
+ case BYTE:
+ result.put(name, new ByteTag(((NBTTagByte) b).asByte()));
+ break;
+ case BYTE_ARRAY:
+ result.put(name, new ByteArrayTag(((NBTTagByteArray) b).getBytes()));
+ break;
+ case COMPOUND:
+ result.put(name, fromNativeCompound((NBTTagCompound) b));
+ break;
+ case DOUBLE:
+ result.put(name, new DoubleTag(((NBTTagDouble) b).asDouble()));
+ break;
+ case FLOAT:
+ result.put(name, new FloatTag(((NBTTagFloat) b).asFloat()));
+ break;
+ case INT:
+ result.put(name, new IntTag(((NBTTagInt) b).asInt()));
+ break;
+ case INT_ARRAY:
+ result.put(name, new IntArrayTag(((NBTTagIntArray) b).getInts()));
+ break;
+ case LIST:
+ result.put(name, fromNativeList((NBTTagList) b));
+ break;
+ case LONG:
+ result.put(name, new LongTag(((NBTTagLong) b).asLong()));
+ break;
+ case SHORT:
+ result.put(name, new ShortTag(((NBTTagShort) b).asShort()));
+ break;
+ case STRING:
+ result.put(name, new StringTag(((NBTTagString) b).asString()));
+ break;
+ case END:
+ break;
+ }
+ }
+ return new CompoundTag(result);
+ } catch (IllegalArgumentException ex) {
+ Logger.getLogger(NBTTools.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ return null;
+ }
+
+ public ListTag fromNativeList(NBTTagList tag) {
+ try {
+ TagType type = TagType.values()[tag.getTypeId()];
+ if (type == TagType.END) {
+ type = TagType.BYTE;
+ }
+ @SuppressWarnings("rawtypes")
+ Tag[] t = (Tag[]) Array.newInstance(type.getTagClass(), tag.size());
+ switch (type) {
+ case BYTE:
+ case END:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new ByteTag(((NBTTagByte) tag.get(i)).asByte());
+ }
+ break;
+ case BYTE_ARRAY:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new ByteArrayTag(((NBTTagByteArray) tag.get(i)).getBytes());
+ }
+ break;
+ case COMPOUND:
+ for (int i = 0; i < tag.size(); i++) {
+ if (tag.get(i) == null) {
+ t[i] = new CompoundTag();
+ } else {
+ t[i] = fromNativeCompound((NBTTagCompound) tag.get(i));
+ }
+ }
+ break;
+ case DOUBLE:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new DoubleTag(((NBTTagDouble) tag.get(i)).asDouble());
+ }
+ break;
+ case FLOAT:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new FloatTag(((NBTTagFloat) tag.get(i)).asFloat());
+ }
+ break;
+ case INT:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new IntTag(((NBTTagInt) tag.get(i)).asInt());
+ }
+ break;
+ case INT_ARRAY:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new IntArrayTag(((NBTTagIntArray) tag.get(i)).getInts());
+ }
+ break;
+ case LIST:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = fromNativeList((NBTTagList) tag.get(i));
+ }
+ break;
+ case LONG:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new LongTag(((NBTTagLong) tag.get(i)).asLong());
+ }
+ break;
+ case SHORT:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new ShortTag(((NBTTagShort) tag.get(i)).asShort());
+ }
+ break;
+ case STRING:
+ for (int i = 0; i < tag.size(); i++) {
+ t[i] = new StringTag(((NBTTagString) tag.get(i)).asString());
+ }
+ break;
+ }
+ return new ListTag(type, t);
+ } catch (IllegalArgumentException ex) {
+ Logger.getLogger(NBTTools.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void writeTileEntity(Block block, CompoundTag tag) {
+ CraftWorld craftWorld = (CraftWorld) block.getWorld();
+ TileEntity tileEntity = craftWorld.getHandle().getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
+ if (tileEntity == null) {
+ return;
+ }
+ tileEntity.save(toNativeCompound(tag));
+ tileEntity.update();
+ BlockPosition pos = new BlockPosition(block.getX(), block.getY(), block.getZ());
+ WorldServer handle = craftWorld.getHandle();
+ IBlockData blockData = handle.getType(pos);
+ craftWorld.getHandle().notify(new BlockPosition(block.getX(), block.getY(), block.getZ()), blockData, blockData, 3);
+ }
+
+ @Override
+ public CompoundTag readTileEntity(Block block) {
+ CraftWorld craftWorld = (CraftWorld) block.getWorld();
+ TileEntity tileEntity = craftWorld.getHandle().getTileEntity(new BlockPosition(block.getX(), block.getY(), block.getZ()));
+ if (tileEntity == null) {
+ return null;
+ }
+ NBTTagCompound tag = new NBTTagCompound();
+ tileEntity.load(tag);
+ return fromNativeCompound(tag);
+ }
+
+ @Override
+ public CompoundTag readItemStack(ItemStack stack) {
+ net.minecraft.server.v1_14_R1.ItemStack nativeStack = CraftItemStack.asNMSCopy(stack);
+ if (nativeStack == null) {
+ return null;
+ }
+ NBTTagCompound compound = new NBTTagCompound();
+ nativeStack.save(compound);
+ return fromNativeCompound(compound);
+ }
+
+ @Override
+ public ItemStack createItemStack(CompoundTag tag) {
+ net.minecraft.server.v1_14_R1.ItemStack nativeStack = net.minecraft.server.v1_14_R1.ItemStack.a(toNativeCompound(tag));
+ return CraftItemStack.asCraftMirror(nativeStack);
+ }
+
+ @Override
+ public CompoundTag readEntity(Entity e) {
+ net.minecraft.server.v1_14_R1.Entity handle = ((CraftEntity) e).getHandle();
+ NBTTagCompound compound = new NBTTagCompound();
+ handle.c(compound);
+ return fromNativeCompound(compound);
+ }
+
+ @Override
+ public void updateEntity(Entity entity, CompoundTag tag) {
+ CraftEntity craftEntity = (CraftEntity) entity;
+ craftEntity.getHandle().f(toNativeCompound(tag));
+ }
+
+ @Override
+ public Entity getEntityByUUID(World world, UUID id) {
+ CraftWorld craftWorld = (CraftWorld) world;
+ net.minecraft.server.v1_14_R1.Entity entity = craftWorld.getHandle().getEntity(id);
+ if (entity == null) {
+ return null;
+ }
+ return entity.getBukkitEntity();
+ }
+
+ @Override
+ public boolean isEntityByIdSupported() {
+ return false;
+ }
+
+ @Override
+ public boolean isEntityByUuidSupported() {
+ return true;
+ }
+
+ @Override
+ public Entity getEntityById(World world, int id) {
+ throw new UnsupportedOperationException("Not supported");
+ }
+}
diff --git a/libnbt-v1_9_R1/pom.xml b/libnbt-v1_9_R1/pom.xml
index 4da08d8..ca7dfe2 100644
--- a/libnbt-v1_9_R1/pom.xml
+++ b/libnbt-v1_9_R1/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt-v1_9_R2/pom.xml b/libnbt-v1_9_R2/pom.xml
index 6f72c69..825cd87 100644
--- a/libnbt-v1_9_R2/pom.xml
+++ b/libnbt-v1_9_R2/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
src/main/java
diff --git a/libnbt/pom.xml b/libnbt/pom.xml
index ca5f33a..e4f3069 100644
--- a/libnbt/pom.xml
+++ b/libnbt/pom.xml
@@ -4,7 +4,7 @@
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
@@ -91,5 +91,10 @@
libnbt-v1_13_R2_1
${project.version}
+
+ ${project.groupId}
+ libnbt-v1_14_R1
+ ${project.version}
+
diff --git a/pom.xml b/pom.xml
index 56c6c42..347bcf5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
org.cyberiantiger.minecraft
libnbt-parent
- 2.10-SNAPSHOT
+ 2.11-SNAPSHOT
pom
libnbt-standalone
@@ -17,6 +17,7 @@
libnbt-v1_13_R1
libnbt-v1_13_R2
libnbt-v1_13_R2_1
+ libnbt-v1_14_R1
libnbt