diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/EntityUtils.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/EntityUtils.java index f77b224..e4f4d27 100644 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/EntityUtils.java +++ b/nmsutils-core/src/main/java/de/cubeside/nmsutils/EntityUtils.java @@ -225,7 +225,7 @@ default public boolean isCamelSitting(Camel camel) { */ default public CompoundTag getNbt(Entity entity) { getNMSUtils().getPlugin().getLogger().log(Level.SEVERE, "Call to unimplemented method", new RuntimeException()); - return new CompoundTag(); + return null; } /** diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/NMSUtils.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/NMSUtils.java index e720f83..d21155c 100644 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/NMSUtils.java +++ b/nmsutils-core/src/main/java/de/cubeside/nmsutils/NMSUtils.java @@ -1,6 +1,5 @@ package de.cubeside.nmsutils; -import de.cubeside.nmsutils.nbt.NbtUtils; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.plugin.Plugin; diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/NbtUtils.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/NbtUtils.java similarity index 74% rename from nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/NbtUtils.java rename to nmsutils-core/src/main/java/de/cubeside/nmsutils/NbtUtils.java index 1965d3f..763ccf2 100644 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/NbtUtils.java +++ b/nmsutils-core/src/main/java/de/cubeside/nmsutils/NbtUtils.java @@ -1,4 +1,6 @@ -package de.cubeside.nmsutils.nbt; +package de.cubeside.nmsutils; + +import de.cubeside.nmsutils.nbt.CompoundTag; public interface NbtUtils { public CompoundTag parseBinary(byte[] in); diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ByteArrayTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ByteArrayTag.java deleted file mode 100644 index b09c37c..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ByteArrayTag.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -import com.google.common.base.Preconditions; -import java.util.Arrays; - -public final class ByteArrayTag extends Tag { - private byte[] value; - - public ByteArrayTag(byte[] value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - @Override - public TagType getType() { - return TagType.BYTE_ARRAY; - } - - @Override - public int hashCode() { - return Arrays.hashCode(this.value); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ByteArrayTag o && Arrays.equals(value, o.value); - } -} \ No newline at end of file diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ByteTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ByteTag.java deleted file mode 100644 index 7fce4dd..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ByteTag.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public final class ByteTag extends Tag implements NumericTag { - private byte value; - - public ByteTag(byte value) { - this.value = value; - } - - public byte getValue() { - return value; - } - - public void setValue(byte value) { - this.value = value; - } - - @Override - public int getValueAsInt() { - return value; - } - - @Override - public long getValueAsLong() { - return value; - } - - @Override - public double getValueAsDouble() { - return value; - } - - @Override - public TagType getType() { - return TagType.BYTE; - } - - @Override - public int hashCode() { - return this.value; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ByteTag o && value == o.value; - } -} \ No newline at end of file diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/CompoundTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/CompoundTag.java index 4850d4d..4953874 100644 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/CompoundTag.java +++ b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/CompoundTag.java @@ -1,304 +1,98 @@ package de.cubeside.nmsutils.nbt; -import com.google.common.base.Preconditions; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; +import java.util.Set; import java.util.UUID; -public final class CompoundTag extends Tag { - private final Map value = new HashMap<>(); - private Map unmodifiableValue; - - public CompoundTag() { - } - - public CompoundTag(Map value) { - for (Entry e : value.entrySet()) { - String key = Preconditions.checkNotNull(e.getKey()); - Tag v = Preconditions.checkNotNull(e.getValue()); - this.value.put(key, v); - } - } - - public boolean containsKey(String key) { - return value.containsKey(key); - } - - public boolean containsKey(String key, TagType type) { - Tag t = value.get(key); - return t == null ? false : t.getType() == type; - } - - public boolean containsNumeric(String key) { - Tag entry = value.get(key); - return entry instanceof NumericTag; - } - - public int getNumericAsInt(String key) { - Tag entry = value.get(key); - if (!(entry instanceof NumericTag t)) { - throw new IllegalArgumentException("Tag is not numeric"); - } - return t.getValueAsInt(); - } - - public long getNumericAsLong(String key) { - Tag entry = value.get(key); - if (!(entry instanceof NumericTag t)) { - throw new IllegalArgumentException("Tag is not numeric"); - } - return t.getValueAsLong(); - } - - public double getNumericAsDouble(String key) { - Tag entry = value.get(key); - if (!(entry instanceof NumericTag t)) { - throw new IllegalArgumentException("Tag is not numeric"); - } - return t.getValueAsDouble(); - } - - public void clear() { - value.clear(); - } - - public void remove(String string) { - value.remove(string); - } - - public Tag get(String name) { - return value.get(name); - } - - public CompoundTag getCompound(String name) { - return (CompoundTag) value.get(name); - } - - public CompoundTag setCompound(String name) { - Preconditions.checkNotNull(name); - CompoundTag tag = new CompoundTag(); - setCompound(name, tag); - return tag; - } - - public void setCompound(String name, CompoundTag c) { - Preconditions.checkNotNull(name); - value.put(name, c); - } - - public ListTag getList(String name) { - return (ListTag) value.get(name); - } - - public ListTag setList(String name) { - ListTag tag = new ListTag(); - setList(name, tag); - return tag; - } - - public void setList(String name, ListTag l) { - Preconditions.checkNotNull(name); - value.put(name, l); - } - - public byte getByte(String name) { - ByteTag tag = (ByteTag) value.get(name); - return tag == null ? 0 : tag.getValue(); - } - - public byte getByte(String name, byte defaultValue) { - Tag tag = value.get(name); - return tag instanceof ByteTag t ? t.getValue() : defaultValue; - } - - public void setByte(String name, byte b) { - Preconditions.checkNotNull(name); - value.put(name, new ByteTag(b)); - } - - public short getShort(String name) { - ShortTag tag = (ShortTag) value.get(name); - return tag == null ? 0 : tag.getValue(); - } - - public short getShort(String name, short defaultValue) { - Tag tag = value.get(name); - return tag instanceof ShortTag t ? t.getValue() : defaultValue; - } - - public void setShort(String name, short s) { - Preconditions.checkNotNull(name); - value.put(name, new ShortTag(s)); - } - - public int getInt(String name) { - IntTag tag = (IntTag) value.get(name); - return tag == null ? 0 : tag.getValue(); - } - - public int getInt(String name, int defaultValue) { - Tag tag = value.get(name); - return tag instanceof IntTag t ? t.getValue() : defaultValue; - } - - public void setInt(String name, int v) { - Preconditions.checkNotNull(name); - value.put(name, new IntTag(v)); - } - - public long getLong(String name) { - LongTag tag = (LongTag) value.get(name); - return tag == null ? 0 : tag.getValue(); - } - - public long getLong(String name, long defaultValue) { - Tag tag = value.get(name); - return tag instanceof LongTag t ? t.getValue() : defaultValue; - } - - public void setLong(String name, long l) { - Preconditions.checkNotNull(name); - value.put(name, new LongTag(l)); - } - - public float getFloat(String name) { - FloatTag tag = (FloatTag) value.get(name); - return tag == null ? 0 : tag.getValue(); - } - - public float getFloat(String name, float defaultValue) { - Tag tag = value.get(name); - return tag instanceof FloatTag t ? t.getValue() : defaultValue; - } - - public void setFloat(String name, float f) { - Preconditions.checkNotNull(name); - value.put(name, new FloatTag(f)); - } - - public double getDouble(String name) { - DoubleTag tag = (DoubleTag) value.get(name); - return tag == null ? 0 : tag.getValue(); - } - - public double getDouble(String name, double defaultValue) { - Tag tag = value.get(name); - return tag instanceof DoubleTag t ? t.getValue() : defaultValue; - } - - public void setDouble(String name, double d) { - Preconditions.checkNotNull(name); - value.put(name, new DoubleTag(d)); - } - - public byte[] getByteArray(String name) { - ByteArrayTag tag = (ByteArrayTag) value.get(name); - return tag == null ? null : tag.getValue(); - } - - public byte[] getByteArray(String name, byte[] defaultValue) { - Tag tag = value.get(name); - return tag instanceof ByteArrayTag t ? t.getValue() : defaultValue; - } - - public void setByteArray(String name, byte[] b) { - Preconditions.checkNotNull(name); - value.put(name, new ByteArrayTag(b)); - } - - public int[] getIntArray(String name) { - IntArrayTag tag = (IntArrayTag) value.get(name); - return tag == null ? null : tag.getValue(); - } - - public int[] getIntArray(String name, int[] defaultValue) { - Tag tag = value.get(name); - return tag instanceof IntArrayTag t ? t.getValue() : defaultValue; - } - - public void setIntArray(String name, int[] v) { - Preconditions.checkNotNull(name); - value.put(name, new IntArrayTag(v)); - } - - public long[] getLongArray(String name) { - LongArrayTag tag = (LongArrayTag) value.get(name); - return tag == null ? null : tag.getValue(); - } - - public long[] getLongArray(String name, long[] defaultValue) { - Tag tag = value.get(name); - return tag instanceof LongArrayTag t ? t.getValue() : defaultValue; - } - - public void setLongArray(String name, long[] v) { - Preconditions.checkNotNull(name); - value.put(name, new LongArrayTag(v)); - } - - public String getString(String name) { - StringTag tag = (StringTag) value.get(name); - return tag == null ? null : tag.getValue(); - } - - public String getString(String name, String defaultValue) { - Tag tag = value.get(name); - return tag instanceof StringTag t ? t.getValue() : defaultValue; - } - - public void setString(String name, String v) { - Preconditions.checkNotNull(name); - value.put(name, new StringTag(v)); - } - - public void setUUID(String name, UUID value) { - long uuidMost = value.getMostSignificantBits(); - long uuidLeast = value.getLeastSignificantBits(); - setIntArray(name, new int[] { (int) (uuidMost >> 32), (int) uuidMost, (int) (uuidLeast >> 32), (int) uuidLeast }); - } - - public UUID getUUID(String name) { - int[] array = this.getIntArray(name, null); - if (array == null) { - if (this.containsNumeric(name + "Most") && this.containsNumeric(name + "Least")) { - return new UUID(this.getNumericAsLong(name + "Most"), this.getNumericAsLong(name + "Least")); - } - } else if (array.length == 4) { - return new UUID((long) array[0] << 32 | (array[1] & 0xFFFF_FFFFL), (long) array[2] << 32 | (array[3] & 0xFFFF_FFFFL)); - } - return null; - } - - public boolean containsUUID(String name) { - int[] array = this.getIntArray(name, null); - if (array == null) { - return this.containsNumeric(name + "Most") && this.containsNumeric(name + "Least"); - } else { - return array.length == 4; - } - } - - public Map getValue() { - if (unmodifiableValue == null) { - unmodifiableValue = Collections.unmodifiableMap(this.value); - } - return unmodifiableValue; - } +public interface CompoundTag { - @Override - public TagType getType() { - return TagType.COMPOUND; - } + boolean containsKey(String key); + + boolean containsKey(String key, TagType type); + + void clear(); + + void remove(String string); + + Set getAllKeys(); + + void size(); + + CompoundTag getCompound(String name); + + CompoundTag getCompound(String name, boolean createIfMissing); + + ListTag getList(String name); + + ListTag getList(String name, boolean createIfMissing); + + byte getByte(String name); + + byte getByte(String name, byte defaultValue); + + void setByte(String name, byte b); + + short getShort(String name); + + short getShort(String name, short defaultValue); + + void setShort(String name, short s); + + int getInt(String name); + + int getInt(String name, int defaultValue); + + void setInt(String name, int v); + + long getLong(String name); + + long getLong(String name, long defaultValue); + + void setLong(String name, long l); + + float getFloat(String name); + + float getFloat(String name, float defaultValue); + + void setFloat(String name, float f); + + double getDouble(String name); + + double getDouble(String name, double defaultValue); + + void setDouble(String name, double d); + + byte[] getByteArray(String name); + + byte[] getByteArray(String name, byte[] defaultValue); + + void setByteArray(String name, byte[] b); + + int[] getIntArray(String name); + + int[] getIntArray(String name, int[] defaultValue); + + void setIntArray(String name, int[] v); + + long[] getLongArray(String name); + + long[] getLongArray(String name, long[] defaultValue); + + void setLongArray(String name, long[] v); + + String getString(String name); + + String getString(String name, String defaultValue); + + void setString(String name, String v); + + UUID getUUID(String name); + + void setUUID(String name, UUID value); @Override - public int hashCode() { - return value.hashCode(); - } + int hashCode(); @Override - public boolean equals(Object obj) { - return obj instanceof CompoundTag o && value.equals(o.value); - } -} + boolean equals(Object obj); + +} \ No newline at end of file diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/DoubleTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/DoubleTag.java deleted file mode 100644 index 8f83e80..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/DoubleTag.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public final class DoubleTag extends Tag implements NumericTag { - private double value; - - public DoubleTag(double value) { - this.value = value; - } - - public double getValue() { - return value; - } - - public void setValue(double value) { - this.value = value; - } - - @Override - public int getValueAsInt() { - return (int) value; - } - - @Override - public long getValueAsLong() { - return (long) value; - } - - @Override - public double getValueAsDouble() { - return value; - } - - @Override - public TagType getType() { - return TagType.DOUBLE; - } - - @Override - public int hashCode() { - return Double.hashCode(this.value); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof DoubleTag o && Double.doubleToLongBits(value) == Double.doubleToLongBits(o.value); - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/FloatTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/FloatTag.java deleted file mode 100644 index bf0c1d0..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/FloatTag.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public final class FloatTag extends Tag implements NumericTag { - private float value; - - public FloatTag(float value) { - this.value = value; - } - - public float getValue() { - return value; - } - - public void setValue(float value) { - this.value = value; - } - - @Override - public int getValueAsInt() { - return (int) value; - } - - @Override - public long getValueAsLong() { - return (long) value; - } - - @Override - public double getValueAsDouble() { - return value; - } - - @Override - public TagType getType() { - return TagType.FLOAT; - } - - @Override - public int hashCode() { - return Float.hashCode(this.value); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof FloatTag o && Float.floatToIntBits(value) == Float.floatToIntBits(o.value); - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/IntArrayTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/IntArrayTag.java deleted file mode 100644 index ec1f6b7..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/IntArrayTag.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -import com.google.common.base.Preconditions; -import java.util.Arrays; - -public final class IntArrayTag extends Tag { - private int[] value; - - public IntArrayTag(int[] value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - public int[] getValue() { - return value; - } - - public void setValue(int[] value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - @Override - public TagType getType() { - return TagType.INT_ARRAY; - } - - @Override - public int hashCode() { - return Arrays.hashCode(this.value); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof IntArrayTag o && Arrays.equals(value, o.value); - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/IntTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/IntTag.java deleted file mode 100644 index 78e1448..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/IntTag.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public final class IntTag extends Tag implements NumericTag { - private int value; - - public IntTag(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public void setValue(int value) { - this.value = value; - } - - @Override - public int getValueAsInt() { - return value; - } - - @Override - public long getValueAsLong() { - return value; - } - - @Override - public double getValueAsDouble() { - return value; - } - - @Override - public TagType getType() { - return TagType.INT; - } - - @Override - public int hashCode() { - return this.value; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof IntTag o && value == o.value; - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ListTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ListTag.java index 9b563d6..f941795 100644 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ListTag.java +++ b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ListTag.java @@ -1,96 +1,85 @@ package de.cubeside.nmsutils.nbt; -import com.google.common.base.Preconditions; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public final class ListTag extends Tag { - private final ArrayList value = new ArrayList<>(); - private List unmodifiableValue; - - public ListTag() { - } - - public ListTag(Tag[] value) { - if (value.length > 0) { - TagType type = value[0].getType(); - this.value.add(value[0]); - for (int i = 1; i < value.length; i++) { - if (value[i].getType() != type) { - throw new IllegalArgumentException("All list elements must have the same type."); - } - this.value.add(value[i]); - } - } - } - - public int size() { - return value.size(); - } - - public boolean isEmpty() { - return value.isEmpty(); - } - - public List getValue() { - if (unmodifiableValue == null) { - unmodifiableValue = Collections.unmodifiableList(value); - } - return unmodifiableValue; - } - - public TagType getListType() { - return value.isEmpty() ? null : value.get(0).getType(); - } - - public Tag getElement(int i) { - return value.get(i); - } - - public Tag setElement(int i, Tag tag) { - if (tag.getType() != getListType()) { - throw new IllegalArgumentException("All list elements must have the same type."); - } - return value.set(i, tag); - } - - public void addElement(Tag tag) { - Preconditions.checkNotNull(tag); - if (!isEmpty() && tag.getType() != getListType()) { - throw new IllegalArgumentException("All list elements must have the same type."); - } - value.add(tag); - } - - public void addElement(int i, Tag tag) { - Preconditions.checkNotNull(tag); - if (!isEmpty() && (i != 0 || size() != 1) && tag.getType() != getListType()) { - throw new IllegalArgumentException("All list elements must have the same type."); - } - value.add(i, tag); - } - - public Tag removeElement(int i) { - return value.remove(i); - } - - public void clearElements() { - value.clear(); - } - - @Override - public TagType getType() { - return TagType.LIST; - } - - @Override - public int hashCode() { - return value.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ListTag o && value.equals(o.value); - } +public interface ListTag { + int size(); + + boolean isEmpty(); + + TagType getElementType(); + + CompoundTag getCompound(int index); + + CompoundTag addCompound(); + + CompoundTag addCompound(int index); + + CompoundTag setCompound(int index); + + ListTag getList(int index); + + ListTag addList(); + + ListTag addList(int index); + + ListTag setList(int index); + + byte getByte(int index); + + byte getByte(int index, byte defaultValue); + + boolean addByte(byte v); + + boolean addByte(int index, byte v); + + boolean setByte(int index, byte v); + + short getShort(int index); + + short getShort(int index, short defaultValue); + + boolean addShort(short v); + + boolean addShort(int index, short v); + + boolean setShort(int index, short v); + + int getInt(int index); + + int getInt(int index, int defaultValue); + + boolean addInt(int v); + + boolean addInt(int index, int v); + + boolean setInt(int index, int v); + + long getLong(int index); + + long getLong(int index, long defaultValue); + + boolean addLong(long v); + + boolean addLong(int index, long v); + + boolean setLong(int index, long v); + + float getFloat(int index); + + float getFloat(int index, float defaultValue); + + boolean addFloat(float v); + + boolean addFloat(int index, float v); + + boolean setFloat(int index, float v); + + double getDouble(int index); + + double getDouble(int index, double defaultValue); + + boolean addDouble(double v); + + boolean addDouble(int index, double v); + + boolean setDouble(int index, double v); } diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/LongArrayTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/LongArrayTag.java deleted file mode 100644 index d4ad69d..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/LongArrayTag.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -import com.google.common.base.Preconditions; -import java.util.Arrays; - -public final class LongArrayTag extends Tag { - private long[] value; - - public LongArrayTag(long[] value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - public long[] getValue() { - return value; - } - - public void setValue(long[] value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - @Override - public TagType getType() { - return TagType.LONG_ARRAY; - } - - @Override - public int hashCode() { - return Arrays.hashCode(this.value); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof LongArrayTag o && Arrays.equals(value, o.value); - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/LongTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/LongTag.java deleted file mode 100644 index d04f2ad..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/LongTag.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public final class LongTag extends Tag implements NumericTag { - private long value; - - public LongTag(long value) { - this.value = value; - } - - public long getValue() { - return value; - } - - public void setValue(long value) { - this.value = value; - } - - @Override - public int getValueAsInt() { - return (int) value; - } - - @Override - public long getValueAsLong() { - return value; - } - - @Override - public double getValueAsDouble() { - return value; - } - - @Override - public TagType getType() { - return TagType.LONG; - } - - @Override - public int hashCode() { - return Long.hashCode(this.value); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof LongTag o && value == o.value; - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/NumericTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/NumericTag.java deleted file mode 100644 index 92b12a2..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/NumericTag.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public interface NumericTag { - int getValueAsInt(); - - long getValueAsLong(); - - double getValueAsDouble(); -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ShortTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ShortTag.java deleted file mode 100644 index 667c67b..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/ShortTag.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public final class ShortTag extends Tag implements NumericTag { - private short value; - - public ShortTag(short value) { - this.value = value; - } - - public short getValue() { - return value; - } - - public void setValue(short value) { - this.value = value; - } - - @Override - public int getValueAsInt() { - return value; - } - - @Override - public long getValueAsLong() { - return value; - } - - @Override - public double getValueAsDouble() { - return value; - } - - @Override - public TagType getType() { - return TagType.SHORT; - } - - @Override - public int hashCode() { - return this.value; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ShortTag o && value == o.value; - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/StringTag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/StringTag.java deleted file mode 100644 index 17fadd6..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/StringTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -import com.google.common.base.Preconditions; - -public final class StringTag extends Tag { - private String value; - - public StringTag(String value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - Preconditions.checkNotNull(value); - this.value = value; - } - - @Override - public TagType getType() { - return TagType.STRING; - } - - @Override - public int hashCode() { - return value.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof StringTag o && value.equals(o.value); - } -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/Tag.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/Tag.java deleted file mode 100644 index 8e71898..0000000 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/Tag.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.cubeside.nmsutils.nbt; - -public abstract class Tag { - Tag() { - } - - public abstract TagType getType(); -} diff --git a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/TagType.java b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/TagType.java index 8906630..1090a32 100644 --- a/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/TagType.java +++ b/nmsutils-core/src/main/java/de/cubeside/nmsutils/nbt/TagType.java @@ -1,16 +1,40 @@ package de.cubeside.nmsutils.nbt; public enum TagType { - BYTE, - SHORT, - INT, - LONG, - FLOAT, - DOUBLE, - BYTE_ARRAY, - STRING, - LIST, - COMPOUND, - INT_ARRAY, - LONG_ARRAY + BYTE(1), + SHORT(2), + INT(3), + LONG(4), + FLOAT(5), + DOUBLE(6), + BYTE_ARRAY(7), + STRING(8), + LIST(9), + COMPOUND(10), + INT_ARRAY(11), + LONG_ARRAY(12), + ANY_NUMERIC(99), + UUID(-1); + + private final int internalId; + private static final TagType[] byInternal = new TagType[12]; + static { + for (TagType t : values()) { + if (t.internalId >= 0 && t.internalId < byInternal.length) { + byInternal[t.internalId] = t; + } + } + } + + TagType(int internalId) { + this.internalId = internalId; + } + + public int internalId() { + return internalId; + } + + public static TagType ofInternal(int id) { + return id >= 0 && id < byInternal.length ? byInternal[id] : null; + } } diff --git a/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/EntityUtilsImpl.java b/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/EntityUtilsImpl.java index ca02473..1a1f130 100644 --- a/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/EntityUtilsImpl.java +++ b/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/EntityUtilsImpl.java @@ -355,12 +355,12 @@ public boolean isCamelSitting(org.bukkit.entity.Camel entity) { public CompoundTag getNbt(org.bukkit.entity.Entity entity) { Entity nmsEntity = ((CraftEntity) entity).getHandle(); net.minecraft.nbt.CompoundTag compoundTag = nmsEntity.saveWithoutId(new net.minecraft.nbt.CompoundTag()); - return nmsUtils.getNbtUtils().fromNativeCompound(compoundTag); + return new CompoundTagImpl(compoundTag); } @Override public void setNbt(org.bukkit.entity.Entity entity, CompoundTag nbt) { - net.minecraft.nbt.CompoundTag nativeNbt = nmsUtils.getNbtUtils().toNativeCompound(nbt); + net.minecraft.nbt.CompoundTag nativeNbt = ((CompoundTagImpl) nbt).handle; Entity nmsEntity = ((CraftEntity) entity).getHandle(); UUID uuid = nmsEntity.getUUID(); @@ -370,7 +370,7 @@ public void setNbt(org.bukkit.entity.Entity entity, CompoundTag nbt) { @Override public void mergeNbt(org.bukkit.entity.Entity entity, CompoundTag nbt) { - net.minecraft.nbt.CompoundTag nativeNbt = nmsUtils.getNbtUtils().toNativeCompound(nbt); + net.minecraft.nbt.CompoundTag nativeNbt = ((CompoundTagImpl) nbt).handle; Entity nmsEntity = ((CraftEntity) entity).getHandle(); net.minecraft.nbt.CompoundTag oldNbt = nmsEntity.saveWithoutId(new net.minecraft.nbt.CompoundTag()); diff --git a/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/NbtUtilsImpl.java b/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/NbtUtilsImpl.java index 808d180..d9995c5 100644 --- a/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/NbtUtilsImpl.java +++ b/nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/NbtUtilsImpl.java @@ -1,27 +1,12 @@ package de.cubeside.nmsutils.v1_20_R1; -import de.cubeside.nmsutils.nbt.ByteArrayTag; -import de.cubeside.nmsutils.nbt.ByteTag; +import de.cubeside.nmsutils.NbtUtils; import de.cubeside.nmsutils.nbt.CompoundTag; -import de.cubeside.nmsutils.nbt.DoubleTag; -import de.cubeside.nmsutils.nbt.FloatTag; -import de.cubeside.nmsutils.nbt.IntArrayTag; -import de.cubeside.nmsutils.nbt.IntTag; -import de.cubeside.nmsutils.nbt.ListTag; -import de.cubeside.nmsutils.nbt.LongArrayTag; -import de.cubeside.nmsutils.nbt.LongTag; -import de.cubeside.nmsutils.nbt.NbtUtils; -import de.cubeside.nmsutils.nbt.ShortTag; -import de.cubeside.nmsutils.nbt.StringTag; -import de.cubeside.nmsutils.nbt.Tag; -import de.cubeside.nmsutils.nbt.TagType; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; public class NbtUtilsImpl implements NbtUtils { // private final NMSUtilsImpl nmsUtils; @@ -33,7 +18,7 @@ public NbtUtilsImpl(NMSUtilsImpl nmsUtils) { @Override public CompoundTag parseBinary(byte[] in) { try { - return fromNativeCompound(net.minecraft.nbt.NbtIo.read(new DataInputStream(new ByteArrayInputStream(in)))); + return new CompoundTagImpl(net.minecraft.nbt.NbtIo.read(new DataInputStream(new ByteArrayInputStream(in)))); } catch (IOException e) { throw new RuntimeException("invalid nbt"); } @@ -43,7 +28,7 @@ public CompoundTag parseBinary(byte[] in) { public byte[] writeBinary(CompoundTag in) { ByteArrayOutputStream os = new ByteArrayOutputStream(); try { - net.minecraft.nbt.NbtIo.write(toNativeCompound(in), new DataOutputStream(os)); + net.minecraft.nbt.NbtIo.write(((CompoundTagImpl) in).handle, new DataOutputStream(os)); } catch (IOException e) { throw new RuntimeException("could not serialize nbt"); } @@ -53,7 +38,7 @@ public byte[] writeBinary(CompoundTag in) { @Override public CompoundTag parseString(String in) { try { - return fromNativeCompound(net.minecraft.nbt.NbtUtils.snbtToStructure(in)); + return new CompoundTagImpl(net.minecraft.nbt.NbtUtils.snbtToStructure(in)); } catch (Exception e) { throw new IllegalArgumentException("Could not parse snbt string", e); } @@ -61,212 +46,6 @@ public CompoundTag parseString(String in) { @Override public String writeString(CompoundTag in) { - return net.minecraft.nbt.NbtUtils.structureToSnbt(toNativeCompound(in)); - } - - net.minecraft.nbt.CompoundTag toNativeCompound(CompoundTag tag) { - net.minecraft.nbt.CompoundTag result = new net.minecraft.nbt.CompoundTag(); - for (Map.Entry e : tag.getValue().entrySet()) { - net.minecraft.nbt.Tag nativeTag; - Tag t = e.getValue(); - switch (t.getType()) { - case BYTE: - nativeTag = net.minecraft.nbt.ByteTag.valueOf(((ByteTag) t).getValue()); - break; - case BYTE_ARRAY: - nativeTag = new net.minecraft.nbt.ByteArrayTag(((ByteArrayTag) t).getValue()); - break; - case COMPOUND: - nativeTag = toNativeCompound((CompoundTag) t); - break; - case DOUBLE: - nativeTag = net.minecraft.nbt.DoubleTag.valueOf(((DoubleTag) t).getValue()); - break; - case FLOAT: - nativeTag = net.minecraft.nbt.FloatTag.valueOf(((FloatTag) t).getValue()); - break; - case INT: - nativeTag = net.minecraft.nbt.IntTag.valueOf(((IntTag) t).getValue()); - break; - case INT_ARRAY: - nativeTag = new net.minecraft.nbt.IntArrayTag(((IntArrayTag) t).getValue()); - break; - case LIST: - nativeTag = toNativeList((ListTag) t); - break; - case LONG: - nativeTag = net.minecraft.nbt.LongTag.valueOf(((LongTag) t).getValue()); - break; - case SHORT: - nativeTag = net.minecraft.nbt.ShortTag.valueOf(((ShortTag) t).getValue()); - break; - case STRING: - nativeTag = net.minecraft.nbt.StringTag.valueOf(((StringTag) t).getValue()); - break; - case LONG_ARRAY: - nativeTag = new net.minecraft.nbt.LongArrayTag(((LongArrayTag) t).getValue()); - break; - default: - throw new IllegalArgumentException("impossible?"); - } - result.put(e.getKey(), nativeTag); - } - return result; - } - - net.minecraft.nbt.ListTag toNativeList(ListTag tag) { - net.minecraft.nbt.ListTag result = new net.minecraft.nbt.ListTag(); - switch (tag.getListType()) { - case BYTE: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.ByteTag.valueOf(((ByteTag) t).getValue())); - } - break; - case BYTE_ARRAY: - for (Tag t : tag.getValue()) { - result.add(new net.minecraft.nbt.ByteArrayTag(((ByteArrayTag) t).getValue())); - } - break; - case COMPOUND: - for (Tag t : tag.getValue()) { - result.add(toNativeCompound((CompoundTag) t)); - } - break; - case DOUBLE: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.DoubleTag.valueOf(((DoubleTag) t).getValue())); - } - break; - case FLOAT: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.FloatTag.valueOf(((FloatTag) t).getValue())); - } - break; - case INT: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.IntTag.valueOf(((IntTag) t).getValue())); - } - break; - case INT_ARRAY: - for (Tag t : tag.getValue()) { - result.add(new net.minecraft.nbt.IntArrayTag(((IntArrayTag) t).getValue())); - } - break; - case LIST: - for (Tag t : tag.getValue()) { - result.add(toNativeList((ListTag) t)); - } - case LONG: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.LongTag.valueOf(((LongTag) t).getValue())); - } - break; - case SHORT: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.ShortTag.valueOf(((ShortTag) t).getValue())); - } - break; - case STRING: - for (Tag t : tag.getValue()) { - result.add(net.minecraft.nbt.StringTag.valueOf(((StringTag) t).getValue())); - } - break; - case LONG_ARRAY: - for (Tag t : tag.getValue()) { - result.add(new net.minecraft.nbt.LongArrayTag(((LongArrayTag) t).getValue())); - } - break; - } - return result; - } - - CompoundTag fromNativeCompound(net.minecraft.nbt.CompoundTag tag) { - Map result = new HashMap<>(); - for (String name : tag.getAllKeys()) { - net.minecraft.nbt.Tag nativeTag = tag.get(name); - switch (TagType.values()[nativeTag.getId()]) { - case BYTE: - result.put(name, new ByteTag(((net.minecraft.nbt.ByteTag) nativeTag).getAsByte())); - break; - case BYTE_ARRAY: - result.put(name, new ByteArrayTag(((net.minecraft.nbt.ByteArrayTag) nativeTag).getAsByteArray())); - break; - case COMPOUND: - result.put(name, fromNativeCompound((net.minecraft.nbt.CompoundTag) nativeTag)); - break; - case DOUBLE: - result.put(name, new DoubleTag(((net.minecraft.nbt.DoubleTag) nativeTag).getAsDouble())); - break; - case FLOAT: - result.put(name, new FloatTag(((net.minecraft.nbt.FloatTag) nativeTag).getAsFloat())); - break; - case INT: - result.put(name, new IntTag(((net.minecraft.nbt.IntTag) nativeTag).getAsInt())); - break; - case INT_ARRAY: - result.put(name, new IntArrayTag(((net.minecraft.nbt.IntArrayTag) nativeTag).getAsIntArray())); - break; - case LIST: - result.put(name, fromNativeList((net.minecraft.nbt.ListTag) nativeTag)); - break; - case LONG: - result.put(name, new LongTag(((net.minecraft.nbt.LongTag) nativeTag).getAsLong())); - break; - case SHORT: - result.put(name, new ShortTag(((net.minecraft.nbt.ShortTag) nativeTag).getAsShort())); - break; - case STRING: - result.put(name, new StringTag(((net.minecraft.nbt.StringTag) nativeTag).getAsString())); - break; - case LONG_ARRAY: - result.put(name, new LongArrayTag(((net.minecraft.nbt.LongArrayTag) nativeTag).getAsLongArray())); - break; - } - } - return new CompoundTag(result); - } - - ListTag fromNativeList(net.minecraft.nbt.ListTag tag) { - ListTag result = new ListTag(); - TagType type = TagType.values()[tag.getElementType()]; - switch (type) { - case BYTE: - tag.forEach((t) -> result.addElement(new ByteTag(((net.minecraft.nbt.ByteTag) t).getAsByte()))); - break; - case BYTE_ARRAY: - tag.forEach((t) -> result.addElement(new ByteArrayTag(((net.minecraft.nbt.ByteArrayTag) t).getAsByteArray()))); - break; - case COMPOUND: - tag.forEach((t) -> result.addElement(fromNativeCompound((net.minecraft.nbt.CompoundTag) t))); - break; - case DOUBLE: - tag.forEach((t) -> result.addElement(new DoubleTag(((net.minecraft.nbt.DoubleTag) t).getAsDouble()))); - break; - case FLOAT: - tag.forEach((t) -> result.addElement(new FloatTag(((net.minecraft.nbt.FloatTag) t).getAsFloat()))); - break; - case INT: - tag.forEach((t) -> result.addElement(new IntTag(((net.minecraft.nbt.IntTag) t).getAsInt()))); - break; - case INT_ARRAY: - tag.forEach((t) -> result.addElement(new IntArrayTag(((net.minecraft.nbt.IntArrayTag) t).getAsIntArray()))); - break; - case LIST: - tag.forEach((t) -> result.addElement(fromNativeList((net.minecraft.nbt.ListTag) t))); - break; - case LONG: - tag.forEach((t) -> result.addElement(new LongTag(((net.minecraft.nbt.LongTag) t).getAsLong()))); - break; - case SHORT: - tag.forEach((t) -> result.addElement(new ShortTag(((net.minecraft.nbt.ShortTag) t).getAsShort()))); - break; - case STRING: - tag.forEach((t) -> result.addElement(new StringTag(((net.minecraft.nbt.StringTag) t).getAsString()))); - break; - case LONG_ARRAY: - tag.forEach((t) -> result.addElement(new LongArrayTag(((net.minecraft.nbt.LongArrayTag) t).getAsLongArray()))); - break; - } - return result; + return net.minecraft.nbt.NbtUtils.structureToSnbt(((CompoundTagImpl) in).handle); } }