From 334143357a78b6b0afe0677d6e8531ff59ab5b2d Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sun, 5 Aug 2018 13:36:53 +1000 Subject: [PATCH] Added LongArrayTag support to NBT --- .../bukkit/adapter/impl/Spigot_v1_13_R1.class | Bin 20082 -> 20278 bytes .../main/java/com/sk89q/jnbt/CompoundTag.java | 18 ++++++ .../com/sk89q/jnbt/CompoundTagBuilder.java | 12 ++++ .../java/com/sk89q/jnbt/LongArrayTag.java | 60 ++++++++++++++++++ .../java/com/sk89q/jnbt/NBTConstants.java | 4 +- .../java/com/sk89q/jnbt/NBTInputStream.java | 7 ++ .../java/com/sk89q/jnbt/NBTOutputStream.java | 11 ++++ .../main/java/com/sk89q/jnbt/NBTUtils.java | 6 ++ .../worldedit/command/SchematicCommands.java | 2 +- .../clipboard/io/BuiltInClipboardFormat.java | 4 +- .../clipboard/io/SpongeSchematicReader.java | 6 ++ .../clipboard/io/SpongeSchematicWriter.java | 12 +++- 12 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java diff --git a/worldedit-bukkit/src/main/resources/com/sk89q/worldedit/bukkit/adapter/impl/Spigot_v1_13_R1.class b/worldedit-bukkit/src/main/resources/com/sk89q/worldedit/bukkit/adapter/impl/Spigot_v1_13_R1.class index ccf0a882df1066b7906adcb9a49c20fd6acbe1f3..7c2a08996b441690aa6af476fa803a41ae5eda9c 100644 GIT binary patch delta 6401 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 diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java index 8f1a7793c..2c439e11b 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java @@ -317,6 +317,24 @@ public final class CompoundTag extends Tag { } } + /** + * Get a {@code long[]} named with the given key. + * + *

If the key does not exist or its value is not an long array tag, + * then an empty array will be returned.

+ * + * @param key the key + * @return an int array + */ + public long[] getLongArray(String key) { + Tag tag = value.get(key); + if (tag instanceof LongArrayTag) { + return ((LongArrayTag) tag).getValue(); + } else { + return new long[0]; + } + } + /** * Get a long named with the given key. * diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java index c6d8fe9e8..b0e873c0d 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java @@ -133,6 +133,18 @@ public class CompoundTagBuilder { return put(key, new IntTag(value)); } + /** + * Put the given key and value into the compound tag as a + * {@code LongArrayTag}. + * + * @param key they key + * @param value the value + * @return this object + */ + public CompoundTagBuilder putLongArray(String key, long[] value) { + return put(key, new LongArrayTag(value)); + } + /** * Put the given key and value into the compound tag as a * {@code LongTag}. diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java new file mode 100644 index 000000000..30dad0cc3 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java @@ -0,0 +1,60 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.jnbt; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * The {@code TAG_Long_Array} tag. + */ +public class LongArrayTag extends Tag { + + private final long[] value; + + /** + * Creates the tag with an empty name. + * + * @param value the value of the tag + */ + public LongArrayTag(long[] value) { + super(); + checkNotNull(value); + this.value = value; + } + + @Override + public long[] getValue() { + return value; + } + + @Override + public String toString() { + StringBuilder hex = new StringBuilder(); + for (long b : value) { + String hexDigits = Long.toHexString(b).toUpperCase(); + if (hexDigits.length() == 1) { + hex.append("0"); + } + hex.append(hexDigits).append(" "); + } + return "TAG_Long_Array(" + hex + ")"; + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java index 2ff2768ac..1cbff362d 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java @@ -31,7 +31,7 @@ public final class NBTConstants { public static final int TYPE_END = 0, TYPE_BYTE = 1, TYPE_SHORT = 2, TYPE_INT = 3, TYPE_LONG = 4, TYPE_FLOAT = 5, TYPE_DOUBLE = 6, TYPE_BYTE_ARRAY = 7, TYPE_STRING = 8, TYPE_LIST = 9, - TYPE_COMPOUND = 10, TYPE_INT_ARRAY = 11; + TYPE_COMPOUND = 10, TYPE_INT_ARRAY = 11, TYPE_LONG_ARRAY = 12; /** * Default private constructor. @@ -73,6 +73,8 @@ public final class NBTConstants { return CompoundTag.class; case TYPE_INT_ARRAY: return IntArrayTag.class; + case TYPE_LONG_ARRAY: + return LongArrayTag.class; default: throw new IllegalArgumentException("Unknown tag type ID of " + id); } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java index bd6a1f9f2..b6096a163 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java @@ -158,6 +158,13 @@ public final class NBTInputStream implements Closeable { data[i] = is.readInt(); } return new IntArrayTag(data); + case NBTConstants.TYPE_LONG_ARRAY: + length = is.readInt(); + long[] longData = new long[length]; + for (int i = 0; i < length; i++) { + longData[i] = is.readLong(); + } + return new LongArrayTag(longData); default: throw new IOException("Invalid tag type: " + type + "."); } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java index ddf1168be..5bed0297f 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java @@ -129,6 +129,9 @@ public final class NBTOutputStream implements Closeable { case NBTConstants.TYPE_INT_ARRAY: writeIntArrayTagPayload((IntArrayTag) tag); break; + case NBTConstants.TYPE_LONG_ARRAY: + writeLongArrayTagPayload((LongArrayTag) tag); + break; default: throw new IOException("Invalid tag type: " + type + "."); } @@ -286,6 +289,14 @@ public final class NBTOutputStream implements Closeable { } } + private void writeLongArrayTagPayload(LongArrayTag tag) throws IOException { + long[] data = tag.getValue(); + os.writeInt(data.length); + for (long aData : data) { + os.writeLong(aData); + } + } + @Override public void close() throws IOException { os.close(); diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java index 440738c4e..e44262911 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java @@ -69,6 +69,8 @@ public final class NBTUtils { return "TAG_String"; } else if (clazz.equals(IntArrayTag.class)) { return "TAG_Int_Array"; + } else if (clazz.equals(LongArrayTag.class)) { + return "TAG_Long_Array"; } else { throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ")."); @@ -107,6 +109,8 @@ public final class NBTUtils { return NBTConstants.TYPE_STRING; } else if (clazz.equals(IntArrayTag.class)) { return NBTConstants.TYPE_INT_ARRAY; + } else if (clazz.equals(LongArrayTag.class)) { + return NBTConstants.TYPE_LONG_ARRAY; } else { throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ")."); @@ -146,6 +150,8 @@ public final class NBTUtils { return CompoundTag.class; case NBTConstants.TYPE_INT_ARRAY: return IntArrayTag.class; + case NBTConstants.TYPE_LONG_ARRAY: + return LongArrayTag.class; default: throw new IllegalArgumentException("Invalid tag type : " + type + "."); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index cc8df7c24..b007ea2eb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -89,7 +89,7 @@ public class SchematicCommands { ) @Deprecated @CommandPermissions({ "worldedit.clipboard.load", "worldedit.schematic.load" }) - public void load(Player player, LocalSession session, @Optional("schematic") String formatName, String filename) throws FilenameException { + public void load(Player player, LocalSession session, @Optional("sponge") String formatName, String filename) throws FilenameException { LocalConfiguration config = worldEdit.getConfiguration(); File dir = worldEdit.getWorkingDirectoryFile(config.saveDir); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java index 3f3063032..103a795f6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java @@ -76,7 +76,7 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { if (!schematic.containsKey("Materials")) { return false; } - } catch (IOException e) { + } catch (Exception e) { return false; } return true; @@ -115,7 +115,7 @@ public enum BuiltInClipboardFormat implements ClipboardFormat { if (!schematic.containsKey("Version")) { return false; } - } catch (IOException e) { + } catch (Exception e) { return false; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java index 73f0cee8c..7b582203d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java @@ -202,6 +202,12 @@ public class SpongeSchematicReader extends NBTSchematicReader { handler.updateNBT(state, values); } } + values.put("x", new IntTag(pt.getBlockX())); + values.put("y", new IntTag(pt.getBlockY())); + values.put("z", new IntTag(pt.getBlockZ())); + values.put("id", values.get("Id")); + values.remove("Id"); + values.remove("Pos"); clipboard.setBlock(pt, new BaseBlock(state, new CompoundTag(values))); } else { clipboard.setBlock(pt, state); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java index e93b498e3..bf42c5a75 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java @@ -117,7 +117,7 @@ public class SpongeSchematicWriter implements ClipboardWriter { int paletteMax = 0; Map palette = new HashMap<>(); - List tileEntities = new ArrayList<>(); + List tileEntities = new ArrayList<>(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(width * height * length); @@ -135,6 +135,13 @@ public class SpongeSchematicWriter implements ClipboardWriter { values.put(entry.getKey(), entry.getValue()); } + values.remove("id"); // Remove 'id' if it exists. We want 'Id' + + // Positions are kept in NBT, we don't want that. + values.remove("x"); + values.remove("y"); + values.remove("z"); + values.put("Id", new StringTag(block.getNbtId())); values.put("Pos", new IntArrayTag(new int[]{ x, @@ -142,8 +149,7 @@ public class SpongeSchematicWriter implements ClipboardWriter { z })); - CompoundTag tileEntityTag = new CompoundTag(values); - tileEntities.add(tileEntityTag); + tileEntities.add(new CompoundTag(values)); } String blockKey = block.toImmutableState().getAsString();