From 137c266e3a55d5132ed3d623d9949ed9a4ad4af8 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 6 Feb 2021 20:23:29 +1000 Subject: [PATCH 01/10] Migrate to adventure-nbt --- buildSrc/src/main/kotlin/LibsConfig.kt | 3 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 2 +- .../sk89q/worldedit/bukkit/BukkitWorld.java | 8 +- .../worldedit/blocks/MobSpawnerBlock.java | 120 ++++++++-------- .../com/sk89q/worldedit/blocks/SignBlock.java | 19 +-- .../sk89q/worldedit/blocks/SkullBlock.java | 18 +-- .../com/sk89q/jnbt/AdventureNBTConverter.java | 132 ++++++++++++++++++ .../java/com/sk89q/jnbt/ByteArrayTag.java | 29 ++-- .../src/main/java/com/sk89q/jnbt/ByteTag.java | 21 ++- .../main/java/com/sk89q/jnbt/CompoundTag.java | 28 ++-- .../com/sk89q/jnbt/CompoundTagBuilder.java | 3 + .../main/java/com/sk89q/jnbt/DoubleTag.java | 22 ++- .../src/main/java/com/sk89q/jnbt/EndTag.java | 10 +- .../main/java/com/sk89q/jnbt/FloatTag.java | 22 ++- .../main/java/com/sk89q/jnbt/IntArrayTag.java | 30 ++-- .../src/main/java/com/sk89q/jnbt/IntTag.java | 22 ++- .../src/main/java/com/sk89q/jnbt/ListTag.java | 45 ++++-- .../java/com/sk89q/jnbt/ListTagBuilder.java | 3 + .../java/com/sk89q/jnbt/LongArrayTag.java | 30 ++-- .../src/main/java/com/sk89q/jnbt/LongTag.java | 22 ++- .../java/com/sk89q/jnbt/NBTConstants.java | 6 +- .../java/com/sk89q/jnbt/NBTInputStream.java | 3 + .../java/com/sk89q/jnbt/NBTOutputStream.java | 3 + .../main/java/com/sk89q/jnbt/NBTUtils.java | 4 +- .../main/java/com/sk89q/jnbt/NamedTag.java | 3 + .../main/java/com/sk89q/jnbt/ShortTag.java | 22 ++- .../main/java/com/sk89q/jnbt/StringTag.java | 22 ++- .../src/main/java/com/sk89q/jnbt/Tag.java | 11 +- .../com/sk89q/worldedit/LocalSession.java | 14 +- .../com/sk89q/worldedit/blocks/BaseItem.java | 39 +++++- .../sk89q/worldedit/blocks/BaseItemStack.java | 15 ++ .../sk89q/worldedit/entity/BaseEntity.java | 25 +++- .../factory/parser/DefaultItemParser.java | 84 ++++++++--- .../extent/world/SurvivalModeExtent.java | 3 +- .../function/block/ExtentBlockCopy.java | 20 +-- .../internal/cui/ServerCUIHandler.java | 53 ++++--- .../com/sk89q/worldedit/util/NbtUtils.java | 49 +++++++ .../util/collection/Int2BaseBlockMap.java | 2 +- .../com/sk89q/worldedit/world/NbtValued.java | 77 +++++++++- .../worldedit/world/block/BaseBlock.java | 79 +++++++---- .../worldedit/world/block/BlockState.java | 10 ++ .../world/block/BlockStateHolder.java | 14 ++ .../worldedit/world/chunk/AnvilChunk.java | 101 ++++++++------ .../worldedit/world/chunk/AnvilChunk13.java | 88 +++++++----- .../worldedit/world/chunk/AnvilChunk16.java | 13 ++ .../sk89q/worldedit/world/chunk/OldChunk.java | 78 ++++++----- .../src/main/resources/lang/strings.json | 2 + worldedit-libs/core/build.gradle.kts | 1 + .../sk89q/worldedit/sponge/SpongeWorld.java | 4 +- 49 files changed, 1019 insertions(+), 415 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index 29c5bfa3a8..959b39f9cd 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -28,7 +28,8 @@ fun Project.applyLibrariesConfiguration() { val relocations = mapOf( "net.kyori.text" to "com.sk89q.worldedit.util.formatting.text", - "net.kyori.minecraft" to "com.sk89q.worldedit.util.kyori" + "net.kyori.minecraft" to "com.sk89q.worldedit.util.kyori", + "net.kyori.adventure.nbt" to "com.sk89q.worldedit.util.nbt" ) tasks.register("jar") { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index a5f5d615a9..5f44d3ea0e 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -295,7 +295,7 @@ public > void sendFakeBlock(BlockVector3 pos, B bl player.sendBlockChange(loc, player.getWorld().getBlockAt(loc).getBlockData()); } else { player.sendBlockChange(loc, BukkitAdapter.adapt(block)); - if (block instanceof BaseBlock && ((BaseBlock) block).hasNbtData()) { + if (block instanceof BaseBlock && ((BaseBlock) block).hasNbt()) { BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); if (adapter != null) { if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK) { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 4d6edd2616..720ff750b1 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -149,8 +149,8 @@ public com.sk89q.worldedit.entity.Entity createEntity(com.sk89q.worldedit.util.L } } catch (Exception e) { logger.warn("Corrupt entity found when creating: " + entity.getType().getId()); - if (entity.getNbtData() != null) { - logger.warn(entity.getNbtData().toString()); + if (entity.getNbt() != null) { + logger.warn(entity.getNbt().toString()); } e.printStackTrace(); return null; @@ -457,9 +457,9 @@ public > boolean setBlock(BlockVector3 position, B try { return worldNativeAccess.setBlock(position, block, sideEffects); } catch (Exception e) { - if (block instanceof BaseBlock && ((BaseBlock) block).getNbtData() != null) { + if (block instanceof BaseBlock && ((BaseBlock) block).getNbt() != null) { logger.warn("Tried to set a corrupt tile entity at " + position.toString() - + ": " + ((BaseBlock) block).getNbtData(), e); + + ": " + ((BaseBlock) block).getNbt(), e); } else { logger.warn("Failed to set block via adapter, falling back to generic", e); } diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java index a43ef366d5..d88852f8ac 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java @@ -21,20 +21,18 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.NBTUtils; -import com.sk89q.jnbt.ShortTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.util.NbtUtils; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.storage.InvalidFormatException; -import java.util.HashMap; -import java.util.Map; - /** * A mob spawner block. */ @@ -46,8 +44,8 @@ public class MobSpawnerBlock extends BaseBlock { // advanced mob spawner features private short spawnCount = 4; private short spawnRange = 4; - private CompoundTag spawnData; - private ListTag spawnPotentials; + private CompoundBinaryTag spawnData; + private ListBinaryTag spawnPotentials; private short minSpawnDelay = 200; private short maxSpawnDelay = 800; private short maxNearbyEntities = 6; @@ -110,7 +108,7 @@ public void setDelay(short delay) { } @Override - public boolean hasNbtData() { + public boolean hasNbt() { return true; } @@ -120,50 +118,52 @@ public String getNbtId() { } @Override - public CompoundTag getNbtData() { - Map values = new HashMap<>(); - values.put("Delay", new ShortTag(delay)); - values.put("SpawnCount", new ShortTag(spawnCount)); - values.put("SpawnRange", new ShortTag(spawnRange)); - values.put("MinSpawnDelay", new ShortTag(minSpawnDelay)); - values.put("MaxSpawnDelay", new ShortTag(maxSpawnDelay)); - values.put("MaxNearbyEntities", new ShortTag(maxNearbyEntities)); - values.put("RequiredPlayerRange", new ShortTag(requiredPlayerRange)); + public CompoundBinaryTag getNbt() { + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); + values.put("Delay", ShortBinaryTag.of(delay)); + values.put("SpawnCount", ShortBinaryTag.of(spawnCount)); + values.put("SpawnRange", ShortBinaryTag.of(spawnRange)); + values.put("MinSpawnDelay", ShortBinaryTag.of(minSpawnDelay)); + values.put("MaxSpawnDelay", ShortBinaryTag.of(maxSpawnDelay)); + values.put("MaxNearbyEntities", ShortBinaryTag.of(maxNearbyEntities)); + values.put("RequiredPlayerRange", ShortBinaryTag.of(requiredPlayerRange)); if (spawnData == null) { - values.put("SpawnData", new CompoundTag(ImmutableMap.of("id", new StringTag(mobType)))); + values.put("SpawnData", CompoundBinaryTag.builder().put("id", StringBinaryTag.of(mobType)).build()); } else { - values.put("SpawnData", new CompoundTag(spawnData.getValue())); + values.put("SpawnData", spawnData); } if (spawnPotentials == null) { - values.put("SpawnPotentials", new ListTag(CompoundTag.class, ImmutableList.of( - new CompoundTag(ImmutableMap.of("Weight", new IntTag(1), "Entity", - new CompoundTag(ImmutableMap.of("id", new StringTag(mobType)))))))); + values.put("SpawnPotentials", ListBinaryTag.of( + BinaryTagTypes.COMPOUND, + ImmutableList.of(CompoundBinaryTag.from(ImmutableMap.of( + "Weight", IntBinaryTag.of(1), + "Entity", CompoundBinaryTag.from(ImmutableMap.of("id", StringBinaryTag.of(mobType))) + ))) + )); } else { - values.put("SpawnPotentials", new ListTag(CompoundTag.class, spawnPotentials.getValue())); + values.put("SpawnPotentials", spawnPotentials); } - return new CompoundTag(values); + return values.build(); } @Override - public void setNbtData(CompoundTag rootTag) { + public void setNbt(CompoundBinaryTag rootTag) { if (rootTag == null) { return; } - Map values = rootTag.getValue(); - - Tag t = values.get("id"); - if (!(t instanceof StringTag) || !((StringTag) t).getValue().equals(getNbtId())) { + BinaryTag t = rootTag.get("id"); + if (!(t instanceof StringBinaryTag) || !((StringBinaryTag) t).value().equals(getNbtId())) { throw new RuntimeException(String.format("'%s' tile entity expected", getNbtId())); } - CompoundTag spawnDataTag; + CompoundBinaryTag spawnDataTag; String mobType; - ShortTag delayTag; + ShortBinaryTag delayTag; try { - spawnDataTag = NBTUtils.getChildTag(values, "SpawnData", CompoundTag.class); + spawnDataTag = NbtUtils.getChildTag(rootTag, "SpawnData", CompoundBinaryTag.class); mobType = spawnDataTag.getString("id"); if (mobType.equals("")) { throw new InvalidFormatException("No spawn id."); @@ -174,68 +174,68 @@ public void setNbtData(CompoundTag rootTag) { throw new RuntimeException("Invalid mob spawner data: no SpawnData and/or no Delay"); } try { - delayTag = NBTUtils.getChildTag(values, "Delay", ShortTag.class); - this.delay = delayTag.getValue(); + delayTag = NbtUtils.getChildTag(rootTag, "Delay", ShortBinaryTag.class); + this.delay = delayTag.value(); } catch (InvalidFormatException ignored) { this.delay = -1; } - ShortTag spawnCountTag = null; - ShortTag spawnRangeTag = null; - ShortTag minSpawnDelayTag = null; - ShortTag maxSpawnDelayTag = null; - ShortTag maxNearbyEntitiesTag = null; - ShortTag requiredPlayerRangeTag = null; - ListTag spawnPotentialsTag = null; + ShortBinaryTag spawnCountTag = null; + ShortBinaryTag spawnRangeTag = null; + ShortBinaryTag minSpawnDelayTag = null; + ShortBinaryTag maxSpawnDelayTag = null; + ShortBinaryTag maxNearbyEntitiesTag = null; + ShortBinaryTag requiredPlayerRangeTag = null; + ListBinaryTag spawnPotentialsTag = null; try { - spawnCountTag = NBTUtils.getChildTag(values, "SpawnCount", ShortTag.class); + spawnCountTag = NbtUtils.getChildTag(rootTag, "SpawnCount", ShortBinaryTag.class); } catch (InvalidFormatException ignored) { } try { - spawnRangeTag = NBTUtils.getChildTag(values, "SpawnRange", ShortTag.class); + spawnRangeTag = NbtUtils.getChildTag(rootTag, "SpawnRange", ShortBinaryTag.class); } catch (InvalidFormatException ignored) { } try { - minSpawnDelayTag = NBTUtils.getChildTag(values, "MinSpawnDelay", ShortTag.class); + minSpawnDelayTag = NbtUtils.getChildTag(rootTag, "MinSpawnDelay", ShortBinaryTag.class); } catch (InvalidFormatException ignored) { } try { - maxSpawnDelayTag = NBTUtils.getChildTag(values, "MaxSpawnDelay", ShortTag.class); + maxSpawnDelayTag = NbtUtils.getChildTag(rootTag, "MaxSpawnDelay", ShortBinaryTag.class); } catch (InvalidFormatException ignored) { } try { - maxNearbyEntitiesTag = NBTUtils.getChildTag(values, "MaxNearbyEntities", ShortTag.class); + maxNearbyEntitiesTag = NbtUtils.getChildTag(rootTag, "MaxNearbyEntities", ShortBinaryTag.class); } catch (InvalidFormatException ignored) { } try { - requiredPlayerRangeTag = NBTUtils.getChildTag(values, "RequiredPlayerRange", ShortTag.class); + requiredPlayerRangeTag = NbtUtils.getChildTag(rootTag, "RequiredPlayerRange", ShortBinaryTag.class); } catch (InvalidFormatException ignored) { } try { - spawnPotentialsTag = NBTUtils.getChildTag(values, "SpawnPotentials", ListTag.class); + spawnPotentialsTag = NbtUtils.getChildTag(rootTag, "SpawnPotentials", ListBinaryTag.class); } catch (InvalidFormatException ignored) { } if (spawnCountTag != null) { - this.spawnCount = spawnCountTag.getValue(); + this.spawnCount = spawnCountTag.value(); } if (spawnRangeTag != null) { - this.spawnRange = spawnRangeTag.getValue(); + this.spawnRange = spawnRangeTag.value(); } if (minSpawnDelayTag != null) { - this.minSpawnDelay = minSpawnDelayTag.getValue(); + this.minSpawnDelay = minSpawnDelayTag.value(); } if (maxSpawnDelayTag != null) { - this.maxSpawnDelay = maxSpawnDelayTag.getValue(); + this.maxSpawnDelay = maxSpawnDelayTag.value(); } if (maxNearbyEntitiesTag != null) { - this.maxNearbyEntities = maxNearbyEntitiesTag.getValue(); + this.maxNearbyEntities = maxNearbyEntitiesTag.value(); } if (requiredPlayerRangeTag != null) { - this.requiredPlayerRange = requiredPlayerRangeTag.getValue(); + this.requiredPlayerRange = requiredPlayerRangeTag.value(); } if (spawnPotentialsTag != null) { - this.spawnPotentials = new ListTag(CompoundTag.class, spawnPotentialsTag.getValue()); + this.spawnPotentials = spawnPotentialsTag; } } diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java index db8c4b2be9..a52442285e 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java @@ -23,10 +23,11 @@ import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.util.gson.GsonUtil; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; -import java.util.HashMap; import java.util.Map; /** @@ -82,7 +83,7 @@ public void setText(String[] text) { } @Override - public boolean hasNbtData() { + public boolean hasNbt() { return true; } @@ -92,13 +93,13 @@ public String getNbtId() { } @Override - public CompoundTag getNbtData() { - Map values = new HashMap<>(); - values.put("Text1", new StringTag(text[0])); - values.put("Text2", new StringTag(text[1])); - values.put("Text3", new StringTag(text[2])); - values.put("Text4", new StringTag(text[3])); - return new CompoundTag(values); + public CompoundBinaryTag getNbt() { + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); + values.put("Text1", StringBinaryTag.of(text[0])); + values.put("Text2", StringBinaryTag.of(text[1])); + values.put("Text3", StringBinaryTag.of(text[2])); + values.put("Text4", StringBinaryTag.of(text[3])); + return values.build(); } @Override diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java index e754fb4536..e33b7fe830 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java @@ -19,14 +19,16 @@ package com.sk89q.worldedit.blocks; +import com.google.common.collect.ImmutableMap; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.internal.util.DeprecationUtil; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; -import java.util.HashMap; import java.util.Map; /** @@ -81,7 +83,7 @@ public String getOwner() { } @Override - public boolean hasNbtData() { + public boolean hasNbt() { return true; } @@ -91,12 +93,12 @@ public String getNbtId() { } @Override - public CompoundTag getNbtData() { - Map values = new HashMap<>(); - Map inner = new HashMap<>(); - inner.put("Name", new StringTag(owner)); - values.put(DeprecationUtil.getHeadOwnerKey(), new CompoundTag(inner)); - return new CompoundTag(values); + public CompoundBinaryTag getNbt() { + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); + values.put(DeprecationUtil.getHeadOwnerKey(), CompoundBinaryTag.from( + ImmutableMap.of("Name", StringBinaryTag.of(owner)) + )); + return values.build(); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java b/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java new file mode 100644 index 0000000000..407bcb0099 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java @@ -0,0 +1,132 @@ +/* + * 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 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.jnbt; + +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; +import com.sk89q.worldedit.util.nbt.EndBinaryTag; +import com.sk89q.worldedit.util.nbt.FloatBinaryTag; +import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.LongBinaryTag; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; + +/** + * Converts between JNBT and Adventure-NBT classes. + * + * @deprecated JNBT is being removed in WE8. + */ +@Deprecated +public class AdventureNBTConverter { + + private AdventureNBTConverter() { + + } + + public static Tag fromAdventure(BinaryTag other) { + if (other instanceof IntArrayBinaryTag) { + return fromAdventure((IntArrayBinaryTag) other); + } else if (other instanceof ListBinaryTag) { + return fromAdventure((ListBinaryTag) other); + } else if (other instanceof EndBinaryTag) { + return fromAdventure(); + } else if (other instanceof LongBinaryTag) { + return fromAdventure((LongBinaryTag) other); + } else if (other instanceof LongArrayBinaryTag) { + return fromAdventure((LongArrayBinaryTag) other); + } else if (other instanceof StringBinaryTag) { + return fromAdventure((StringBinaryTag) other); + } else if (other instanceof IntBinaryTag) { + return fromAdventure((IntBinaryTag) other); + } else if (other instanceof ByteBinaryTag) { + return fromAdventure((ByteBinaryTag) other); + } else if (other instanceof ByteArrayBinaryTag) { + return fromAdventure((ByteArrayBinaryTag) other); + } else if (other instanceof CompoundBinaryTag) { + return fromAdventure((CompoundBinaryTag) other); + } else if (other instanceof FloatBinaryTag) { + return fromAdventure((FloatBinaryTag) other); + } else if (other instanceof ShortBinaryTag) { + return fromAdventure((ShortBinaryTag) other); + } else if (other instanceof DoubleBinaryTag) { + return fromAdventure((DoubleBinaryTag) other); + } else { + throw new IllegalArgumentException("Can't convert other of type " + other.getClass().getCanonicalName()); + } + } + + public static DoubleTag fromAdventure(DoubleBinaryTag other) { + return new DoubleTag(other); + } + + public static ShortTag fromAdventure(ShortBinaryTag other) { + return new ShortTag(other); + } + + public static FloatTag fromAdventure(FloatBinaryTag other) { + return new FloatTag(other); + } + + public static CompoundTag fromAdventure(CompoundBinaryTag other) { + return new CompoundTag(other); + } + + public static ByteArrayTag fromAdventure(ByteArrayBinaryTag other) { + return new ByteArrayTag(other); + } + + public static ByteTag fromAdventure(ByteBinaryTag other) { + return new ByteTag(other); + } + + public static IntTag fromAdventure(IntBinaryTag other) { + return new IntTag(other); + } + + public static StringTag fromAdventure(StringBinaryTag other) { + return new StringTag(other); + } + + public static LongArrayTag fromAdventure(LongArrayBinaryTag other) { + return new LongArrayTag(other); + } + + public static LongTag fromAdventure(LongBinaryTag other) { + return new LongTag(other); + } + + public static EndTag fromAdventure() { + return new EndTag(); + } + + public static ListTag fromAdventure(ListBinaryTag other) { + return new ListTag(other); + } + + public static IntArrayTag fromAdventure(IntArrayBinaryTag other) { + return new IntArrayTag(other); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java index 78a9d7521b..6c511e63c3 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java @@ -19,14 +19,19 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; + import java.util.Locale; /** * The {@code TAG_Byte_Array} tag. + * + * @deprecated Use {@link ByteArrayBinaryTag}. */ +@Deprecated public final class ByteArrayTag extends Tag { - private final byte[] value; + private final ByteArrayBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,25 +40,21 @@ public final class ByteArrayTag extends Tag { */ public ByteArrayTag(byte[] value) { super(); - this.value = value; + this.innerTag = ByteArrayBinaryTag.of(value); + } + + ByteArrayTag(ByteArrayBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override public byte[] getValue() { - return value; + return innerTag.value(); } @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (byte b : value) { - String hexDigits = Integer.toHexString(b).toUpperCase(Locale.ROOT); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - return "TAG_Byte_Array(" + hex + ")"; + public ByteArrayBinaryTag asBinaryTag() { + return innerTag; } - } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java index e7fe1cc407..834f1ba7e4 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java @@ -19,12 +19,17 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; + /** * The {@code TAG_Byte} tag. + * + * @deprecated Use {@link ByteBinaryTag}. */ +@Deprecated public final class ByteTag extends Tag { - private final byte value; + private final ByteBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -33,17 +38,21 @@ public final class ByteTag extends Tag { */ public ByteTag(byte value) { super(); - this.value = value; + this.innerTag = ByteBinaryTag.of(value); + } + + ByteTag(ByteBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override public Byte getValue() { - return value; + return innerTag.value(); } @Override - public String toString() { - return "TAG_Byte(" + value + ")"; + public ByteBinaryTag asBinaryTag() { + return innerTag; } - } 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 3a382effec..c2e02b3585 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java @@ -19,14 +19,20 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; + import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * The {@code TAG_Compound} tag. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.CompoundBinaryTag}. */ +@Deprecated public final class CompoundTag extends Tag { private final Map value; @@ -41,6 +47,15 @@ public CompoundTag(Map value) { this.value = Collections.unmodifiableMap(value); } + CompoundTag(CompoundBinaryTag adventureTag) { + Set tags = adventureTag.keySet(); + Map map = new HashMap<>(); + for (String tagName : tags) { + map.put(tagName, AdventureNBTConverter.fromAdventure(adventureTag.get(tagName))); + } + this.value = Collections.unmodifiableMap(map); + } + /** * Returns whether this compound tag contains the given key. * @@ -425,14 +440,11 @@ public String getString(String key) { } @Override - public String toString() { - StringBuilder bldr = new StringBuilder(); - bldr.append("TAG_Compound").append(": ").append(value.size()).append(" entries\r\n{\r\n"); - for (Map.Entry entry : value.entrySet()) { - bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); + public CompoundBinaryTag asBinaryTag() { + CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder(); + for (Map.Entry child : getValue().entrySet()) { + builder.put(child.getKey(), child.getValue().asBinaryTag()); } - bldr.append("}"); - return bldr.toString(); + return builder.build(); } - } 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 7267a72e0a..941fe9fa71 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java @@ -26,7 +26,10 @@ /** * Helps create compound tags. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.CompoundBinaryTag.Builder}. */ +@Deprecated public class CompoundTagBuilder { private final Map entries; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java index b579308571..769cee761b 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java @@ -19,12 +19,17 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; + /** * The {@code TAG_Double} tag. + * + * @deprecated Use {@link DoubleBinaryTag}. */ +@Deprecated public final class DoubleTag extends Tag { - private final double value; + private final DoubleBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -33,17 +38,22 @@ public final class DoubleTag extends Tag { */ public DoubleTag(double value) { super(); - this.value = value; + this.innerTag = DoubleBinaryTag.of(value); + } + + DoubleTag(DoubleBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public Double getValue() { - return value; + public DoubleBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - return "TAG_Double(" + value + ")"; + public Double getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java index c6fc635983..3f179e54fd 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java @@ -19,9 +19,14 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.EndBinaryTag; + /** * The {@code TAG_End} tag. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.EndBinaryTag}. */ +@Deprecated public final class EndTag extends Tag { @Override @@ -30,8 +35,7 @@ public Object getValue() { } @Override - public String toString() { - return "TAG_End"; + public EndBinaryTag asBinaryTag() { + return EndBinaryTag.get(); } - } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java index e1281ea131..2477caa93d 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java @@ -19,12 +19,17 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.FloatBinaryTag; + /** * The {@code TAG_Float} tag. + * + * @deprecated Use {@link FloatBinaryTag}. */ +@Deprecated public final class FloatTag extends Tag { - private final float value; + private final FloatBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -33,17 +38,22 @@ public final class FloatTag extends Tag { */ public FloatTag(float value) { super(); - this.value = value; + this.innerTag = FloatBinaryTag.of(value); + } + + FloatTag(FloatBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public Float getValue() { - return value; + public FloatBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - return "TAG_Float(" + value + ")"; + public Float getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java index 39c6217359..1146ac1e66 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java @@ -19,16 +19,19 @@ package com.sk89q.jnbt; -import java.util.Locale; +import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; import static com.google.common.base.Preconditions.checkNotNull; /** * The {@code TAG_Int_Array} tag. + * + * @deprecated Use {@link IntArrayBinaryTag}. */ +@Deprecated public final class IntArrayTag extends Tag { - private final int[] value; + private final IntArrayBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -38,25 +41,22 @@ public final class IntArrayTag extends Tag { public IntArrayTag(int[] value) { super(); checkNotNull(value); - this.value = value; + this.innerTag = IntArrayBinaryTag.of(value); + } + + IntArrayTag(IntArrayBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public int[] getValue() { - return value; + public IntArrayBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (int b : value) { - String hexDigits = Integer.toHexString(b).toUpperCase(Locale.ROOT); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - return "TAG_Int_Array(" + hex + ")"; + public int[] getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java index 359cf85b9b..8583579c03 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java @@ -19,12 +19,17 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; + /** * The {@code TAG_Int} tag. + * + * @deprecated Use {@link IntBinaryTag}. */ +@Deprecated public final class IntTag extends Tag { - private final int value; + private final IntBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -33,17 +38,22 @@ public final class IntTag extends Tag { */ public IntTag(int value) { super(); - this.value = value; + this.innerTag = IntBinaryTag.of(value); + } + + IntTag(IntBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public Integer getValue() { - return value; + public IntBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - return "TAG_Int(" + value + ")"; + public Integer getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java index 8134a3f74e..39023d0226 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java @@ -19,6 +19,10 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; + +import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; @@ -27,7 +31,10 @@ /** * The {@code TAG_List} tag. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.ListBinaryTag}. */ +@Deprecated public final class ListTag extends Tag { private final Class type; @@ -46,6 +53,33 @@ public ListTag(Class type, List value) { this.value = Collections.unmodifiableList(value); } + ListTag(ListBinaryTag adventureTag) { + super(); + List list = new ArrayList<>(); + Class listClass = StringTag.class; + int tags = adventureTag.size(); + for (int i = 0; i < tags; i++) { + Tag child = AdventureNBTConverter.fromAdventure(adventureTag.get(0)); + list.add(child); + listClass = child.getClass(); + } + + this.type = listClass; + this.value = Collections.unmodifiableList(list); + } + + @Override + public ListBinaryTag asBinaryTag() { + ListBinaryTag.Builder builder = ListBinaryTag.builder(); + for (Tag child : getValue()) { + if (child instanceof EndTag) { + continue; + } + builder.add(child.asBinaryTag()); + } + return builder.build(); + } + /** * Gets the type of item in this list. * @@ -415,15 +449,4 @@ public String getString(int index) { } } - @Override - public String toString() { - StringBuilder bldr = new StringBuilder(); - bldr.append("TAG_List").append(": ").append(value.size()).append(" entries of type ").append(NBTUtils.getTypeName(type)).append("\r\n{\r\n"); - for (Tag t : value) { - bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); - } - bldr.append("}"); - return bldr.toString(); - } - } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java index b98c667e50..ad3a6e25cf 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java @@ -28,7 +28,10 @@ /** * Helps create list tags. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.ListBinaryTag.Builder}. */ +@Deprecated public class ListTagBuilder { private final Class type; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java index c2e9688d08..7ca5df0dc2 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java @@ -19,16 +19,19 @@ package com.sk89q.jnbt; -import java.util.Locale; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; import static com.google.common.base.Preconditions.checkNotNull; /** * The {@code TAG_Long_Array} tag. + * + * @deprecated Use {@link LongArrayBinaryTag}. */ +@Deprecated public class LongArrayTag extends Tag { - private final long[] value; + private final LongArrayBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -38,25 +41,22 @@ public class LongArrayTag extends Tag { public LongArrayTag(long[] value) { super(); checkNotNull(value); - this.value = value; + this.innerTag = LongArrayBinaryTag.of(value); + } + + LongArrayTag(LongArrayBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public long[] getValue() { - return value; + public LongArrayBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (long b : value) { - String hexDigits = Long.toHexString(b).toUpperCase(Locale.ROOT); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - return "TAG_Long_Array(" + hex + ")"; + public long[] getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java index 8f894520a2..aa7e74f10d 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java @@ -19,12 +19,17 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.LongBinaryTag; + /** * The {@code TAG_Long} tag. + * + * @deprecated Use {@link LongBinaryTag}. */ +@Deprecated public final class LongTag extends Tag { - private final long value; + private final LongBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -33,17 +38,22 @@ public final class LongTag extends Tag { */ public LongTag(long value) { super(); - this.value = value; + this.innerTag = LongBinaryTag.of(value); + } + + LongTag(LongBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public Long getValue() { - return value; + public LongBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - return "TAG_Long(" + value + ")"; + public Long getValue() { + return innerTag.value(); } } 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 db6689cb52..9d65f5e79d 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java @@ -20,13 +20,17 @@ package com.sk89q.jnbt; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; /** * A class which holds constant values. + * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTConstants { - public static final Charset CHARSET = Charset.forName("UTF-8"); + public static final Charset CHARSET = StandardCharsets.UTF_8; public static final int TYPE_END = 0; public static final int TYPE_BYTE = 1; 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 35a0bb62e1..1b41180851 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java @@ -38,7 +38,10 @@ * found at * https://minecraft.gamepedia.com/NBT_format. *

+ * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTInputStream implements Closeable { private final DataInputStream is; 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 98ccb72db0..ae92946ae0 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java @@ -37,7 +37,10 @@ * found at * https://minecraft.gamepedia.com/NBT_format. *

+ * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTOutputStream implements Closeable { /** 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 c6e53e598c..52d21ca451 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java @@ -29,7 +29,9 @@ /** * A class which contains NBT-related utility methods. * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTUtils { /** @@ -72,7 +74,7 @@ public static String getTypeName(Class clazz) { } else if (clazz.equals(LongArrayTag.class)) { return "TAG_Long_Array"; } else { - throw new IllegalArgumentException("Invalid tag classs (" + throw new IllegalArgumentException("Invalid tag class (" + clazz.getName() + ")."); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java index c7089e3f48..80742783c8 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java @@ -23,7 +23,10 @@ /** * A tag that has a name. + * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public class NamedTag { private final String name; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java index f8224ab0ed..486ae69a67 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java @@ -19,12 +19,17 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; + /** * The {@code TAG_Short} tag. + * + * @deprecated Use {@link ShortBinaryTag}. */ +@Deprecated public final class ShortTag extends Tag { - private final short value; + private final ShortBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -33,17 +38,22 @@ public final class ShortTag extends Tag { */ public ShortTag(short value) { super(); - this.value = value; + this.innerTag = ShortBinaryTag.of(value); + } + + ShortTag(ShortBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public Short getValue() { - return value; + public ShortBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - return "TAG_Short(" + value + ")"; + public Short getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java index 3727f8d8e1..124f72f48b 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java @@ -19,14 +19,19 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; + import static com.google.common.base.Preconditions.checkNotNull; /** * The {@code TAG_String} tag. + * + * @deprecated Use {@link StringBinaryTag}. */ +@Deprecated public final class StringTag extends Tag { - private final String value; + private final StringBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -36,17 +41,22 @@ public final class StringTag extends Tag { public StringTag(String value) { super(); checkNotNull(value); - this.value = value; + this.innerTag = StringBinaryTag.of(value); + } + + StringTag(StringBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override - public String getValue() { - return value; + public StringBinaryTag asBinaryTag() { + return this.innerTag; } @Override - public String toString() { - return "TAG_String(" + value + ")"; + public String getValue() { + return innerTag.value(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java index a94b3b3bb3..5a3bd1d484 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java @@ -19,10 +19,15 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.BinaryTagLike; + /** * Represents a NBT tag. + * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ -public abstract class Tag { +@Deprecated +public abstract class Tag implements BinaryTagLike { /** * Gets the value of this tag. @@ -31,4 +36,8 @@ public abstract class Tag { */ public abstract Object getValue(); + @Override + public String toString() { + return asBinaryTag().toString(); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index 837db9498c..f83815225f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -23,8 +23,7 @@ import com.sk89q.jchronic.Options; import com.sk89q.jchronic.utils.Span; import com.sk89q.jchronic.utils.Time; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.Tag; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.worldedit.command.tool.BlockTool; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.command.tool.InvalidToolBindException; @@ -51,6 +50,7 @@ import com.sk89q.worldedit.util.Countable; import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -803,13 +803,13 @@ public void updateServerCUI(Actor actor) { } BaseBlock block = ServerCUIHandler.createStructureBlock(player); - if (block != null) { + if (block != null && block.hasNbt()) { // If it's null, we don't need to do anything. The old was already removed. - Map tags = block.getNbtData().getValue(); + CompoundBinaryTag tags = block.getNbt(); BlockVector3 tempCuiTemporaryBlock = BlockVector3.at( - ((IntTag) tags.get("x")).getValue(), - ((IntTag) tags.get("y")).getValue(), - ((IntTag) tags.get("z")).getValue() + tags.getInt("x"), + tags.getInt("y"), + tags.getInt("z") ); if (cuiTemporaryBlock != null && !tempCuiTemporaryBlock.equals(cuiTemporaryBlock)) { // Update the existing block if it's the same location diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java index a365bc4b14..c6ad28b38d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java @@ -20,9 +20,13 @@ package com.sk89q.worldedit.blocks; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.TagStringIO; import com.sk89q.worldedit.world.NbtValued; import com.sk89q.worldedit.world.item.ItemType; +import java.io.IOException; import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; @@ -37,7 +41,7 @@ public class BaseItem implements NbtValued { private ItemType itemType; @Nullable - private CompoundTag nbtData; + private CompoundBinaryTag nbtData; /** * Construct the object. @@ -49,13 +53,24 @@ public BaseItem(ItemType itemType) { this.itemType = itemType; } + /** + * Construct the object. + * + * @param itemType Type of the item + * @param nbtData NBT Compound tag + */ + @Deprecated + public BaseItem(ItemType itemType, CompoundTag nbtData) { + this(itemType, checkNotNull(nbtData).asBinaryTag()); + } + /** * Construct the object. * * @param itemType Type of the item * @param tag NBT Compound tag */ - public BaseItem(ItemType itemType, @Nullable CompoundTag tag) { + public BaseItem(ItemType itemType, @Nullable CompoundBinaryTag tag) { checkNotNull(itemType); this.itemType = itemType; this.nbtData = tag; @@ -80,18 +95,32 @@ public void setType(ItemType itemType) { } @Override - public boolean hasNbtData() { + public boolean hasNbt() { return this.nbtData != null; } @Nullable @Override - public CompoundTag getNbtData() { + public CompoundBinaryTag getNbt() { return this.nbtData; } @Override - public void setNbtData(@Nullable CompoundTag nbtData) { + public void setNbt(@Nullable CompoundBinaryTag nbtData) { this.nbtData = nbtData; } + + @Override + public String toString() { + String nbtString = ""; + if (hasNbt()) { + try { + nbtString = TagStringIO.get().asString(nbtData); + } catch (IOException e) { + WorldEdit.logger.error("Failed to parse NBT of Item", e); + } + } + + return getType().getId() + nbtString; + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java index 10655963a0..461dc31dfc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.item.ItemType; /** @@ -60,12 +61,26 @@ public BaseItemStack(ItemType itemType, int amount) { * @param id The item type * @param tag Tag value * @param amount amount in the stack + * @deprecated Use {@link #BaseItemStack(ItemType, CompoundBinaryTag, int)} */ + @Deprecated public BaseItemStack(ItemType id, CompoundTag tag, int amount) { super(id, tag); this.amount = amount; } + /** + * Construct the object. + * + * @param id The item type + * @param tag Tag value + * @param amount amount in the stack + */ + public BaseItemStack(ItemType id, CompoundBinaryTag tag, int amount) { + super(id, tag); + this.amount = amount; + } + /** * Get the number of items in the stack. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java index 393023df81..ef26da7b80 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.entity; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.NbtValued; import com.sk89q.worldedit.world.entity.EntityType; @@ -43,19 +44,33 @@ public class BaseEntity implements NbtValued { private final EntityType type; - private CompoundTag nbtData; + @Nullable + private CompoundBinaryTag nbtData; /** * Create a new base entity. * * @param type the entity type * @param nbtData NBT data + * @deprecated Use {@link BaseEntity#BaseEntity(EntityType, CompoundBinaryTag)} */ + @Deprecated public BaseEntity(EntityType type, CompoundTag nbtData) { this(type); setNbtData(nbtData); } + /** + * Create a new base entity. + * + * @param type the entity type + * @param nbtData NBT data + */ + public BaseEntity(EntityType type, CompoundBinaryTag nbtData) { + this(type); + setNbt(nbtData); + } + /** * Create a new base entity with no NBT data. * @@ -73,22 +88,22 @@ public BaseEntity(EntityType type) { public BaseEntity(BaseEntity other) { checkNotNull(other); this.type = other.getType(); - setNbtData(other.getNbtData()); + setNbt(other.getNbt()); } @Override - public boolean hasNbtData() { + public boolean hasNbt() { return true; } @Nullable @Override - public CompoundTag getNbtData() { + public CompoundBinaryTag getNbt() { return nbtData; } @Override - public void setNbtData(@Nullable CompoundTag nbtData) { + public void setNbt(@Nullable CompoundBinaryTag nbtData) { this.nbtData = nbtData; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java index 186fff5560..2a9d3bf8fc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java @@ -32,10 +32,13 @@ import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.TagStringIO; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.registry.LegacyMapper; +import java.io.IOException; import java.util.Locale; import java.util.stream.Stream; @@ -52,44 +55,87 @@ public Stream getSuggestions(String input) { @Override public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException { + ItemType itemType; + CompoundBinaryTag itemNbtData = null; + BaseItem item = null; + // Legacy matcher if (context.isTryingLegacy()) { try { String[] split = input.split(":"); - ItemType type; if (split.length == 0) { throw new InputParseException(TranslatableComponent.of("worldedit.error.parser.invalid-colon")); } else if (split.length == 1) { - type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0])); + itemType = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0])); } else { - type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]), Integer.parseInt(split[1])); + itemType = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]), Integer.parseInt(split[1])); } - if (type != null) { - item = new BaseItem(type); + if (itemType != null) { + item = new BaseItem(itemType); } } catch (NumberFormatException ignored) { } } - if ("hand".equalsIgnoreCase(input)) { - return getItemInHand(context.requireActor(), HandSide.MAIN_HAND); - } else if ("offhand".equalsIgnoreCase(input)) { - return getItemInHand(context.requireActor(), HandSide.OFF_HAND); - } - if (item == null) { - ItemType type = ItemTypes.get(input.toLowerCase(Locale.ROOT)); - if (type != null) { - item = new BaseItem(type); + String typeString; + String nbtString = null; + int nbtStart = input.indexOf('{'); + + if (nbtStart == -1) { + typeString = input; + } else { + typeString = input.substring(0, nbtStart); + if (nbtStart + 1 >= input.length()) { + throw new InputParseException(TranslatableComponent.of("worldedit.error.parser.hanging-lbracket", TextComponent.of(nbtStart))); + } + int stateEnd = input.lastIndexOf('}'); + if (stateEnd < 0) { + throw new InputParseException(TranslatableComponent.of("worldedit.error.parser.missing-rbracket")); + } + nbtString = input.substring(nbtStart); } - } - if (item == null) { - throw new NoMatchException(TranslatableComponent.of("worldedit.error.no-match", TextComponent.of(input))); - } else { - return item; + if ("hand".equalsIgnoreCase(typeString)) { + BaseItemStack heldItem = getItemInHand(context.requireActor(), HandSide.MAIN_HAND); + itemType = heldItem.getType(); + itemNbtData = heldItem.getNbt(); + } else if ("offhand".equalsIgnoreCase(typeString)) { + BaseItemStack heldItem = getItemInHand(context.requireActor(), HandSide.OFF_HAND); + itemType = heldItem.getType(); + itemNbtData = heldItem.getNbt(); + } else { + itemType = ItemTypes.get(typeString.toLowerCase(Locale.ROOT)); + } + + if (itemType == null) { + throw new NoMatchException(TranslatableComponent.of("worldedit.error.unknown-item", TextComponent.of(input))); + } + + if (nbtString != null) { + try { + CompoundBinaryTag otherTag = TagStringIO.get().asCompound(nbtString); + if (itemNbtData == null) { + itemNbtData = otherTag; + } else { + for (String key : otherTag.keySet()) { + itemNbtData.put(key, otherTag.get(key)); + } + } + } catch (IOException e) { + throw new NoMatchException(TranslatableComponent.of( + "worldedit.error.invalid-nbt", + TextComponent.of(input), + TextComponent.of(e.getMessage()) + )); + } + } + + item = new BaseItem(itemType, itemNbtData); } + + return item; } private BaseItemStack getItemInHand(Actor actor, HandSide handSide) throws InputParseException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java index 2cb6b02c82..21c287cd79 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -95,7 +96,7 @@ public > boolean setBlock(BlockVector3 location, B } else { // Can't be an inlined check due to inconsistent generic return type if (stripNbt) { - return super.setBlock(location, block.toBaseBlock(null)); + return super.setBlock(location, block.toBaseBlock((CompoundBinaryTag) null)); } else { return super.setBlock(location, block); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java index 7f56aed565..56ae3ed10e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.function.block; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.CompoundTagBuilder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; @@ -30,6 +28,9 @@ import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Direction.Flag; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import static com.google.common.base.Preconditions.checkNotNull; @@ -87,12 +88,13 @@ public boolean apply(BlockVector3 position) throws WorldEditException { * @return a new state or the existing one */ private BaseBlock transformNbtData(BaseBlock state) { - CompoundTag tag = state.getNbtData(); + CompoundBinaryTag tag = state.getNbt(); if (tag != null) { // Handle blocks which store their rotation in NBT - if (tag.containsKey("Rot")) { - int rot = tag.asInt("Rot"); + BinaryTag rotTag = tag.get("Rot"); + if (rotTag instanceof IntBinaryTag) { + int rot = ((IntBinaryTag) rotTag).value(); Direction direction = MCDirections.fromRotation(rot); @@ -101,11 +103,9 @@ private BaseBlock transformNbtData(BaseBlock state) { Direction newDirection = Direction.findClosest(vector, Flag.CARDINAL | Flag.ORDINAL | Flag.SECONDARY_ORDINAL); if (newDirection != null) { - CompoundTagBuilder builder = tag.createBuilder(); - - builder.putByte("Rot", (byte) MCDirections.toRotation(newDirection)); - - return state.toBaseBlock(builder.build()); + return state.toBaseBlock( + tag.putByte("Rot", (byte) MCDirections.toRotation(newDirection)) + ); } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java index 591dcca399..1624254215 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java @@ -19,11 +19,6 @@ package com.sk89q.worldedit.internal.cui; -import com.sk89q.jnbt.ByteTag; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; @@ -33,11 +28,13 @@ import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockTypes; -import java.util.HashMap; -import java.util.Map; import javax.annotation.Nullable; /** @@ -126,7 +123,7 @@ public static BaseBlock createStructureBlock(Player player) { int z = (int) (location.getZ() - (xz * Math.cos(Math.toRadians(rotX))) * 12); int y = Math.max(0, Math.min(Math.min(255, posY + 32), posY + 3)); - Map structureTag = new HashMap<>(); + CompoundBinaryTag.Builder structureTag = CompoundBinaryTag.builder(); posX -= x; posY -= y; @@ -137,25 +134,25 @@ public static BaseBlock createStructureBlock(Player player) { return null; } - structureTag.put("name", new StringTag("worldedit:" + player.getName())); - structureTag.put("author", new StringTag(player.getName())); - structureTag.put("metadata", new StringTag("")); - structureTag.put("x", new IntTag(x)); - structureTag.put("y", new IntTag(y)); - structureTag.put("z", new IntTag(z)); - structureTag.put("posX", new IntTag(posX)); - structureTag.put("posY", new IntTag(posY)); - structureTag.put("posZ", new IntTag(posZ)); - structureTag.put("sizeX", new IntTag(width)); - structureTag.put("sizeY", new IntTag(height)); - structureTag.put("sizeZ", new IntTag(length)); - structureTag.put("rotation", new StringTag("NONE")); - structureTag.put("mirror", new StringTag("NONE")); - structureTag.put("mode", new StringTag("SAVE")); - structureTag.put("ignoreEntities", new ByteTag((byte) 1)); - structureTag.put("showboundingbox", new ByteTag((byte) 1)); - structureTag.put("id", new StringTag(BlockTypes.STRUCTURE_BLOCK.getId())); - - return BlockTypes.STRUCTURE_BLOCK.getDefaultState().toBaseBlock(new CompoundTag(structureTag)); + structureTag.put("name", StringBinaryTag.of("worldedit:" + player.getName())); + structureTag.put("author", StringBinaryTag.of(player.getName())); + structureTag.put("metadata", StringBinaryTag.of("")); + structureTag.put("x", IntBinaryTag.of(x)); + structureTag.put("y", IntBinaryTag.of(y)); + structureTag.put("z", IntBinaryTag.of(z)); + structureTag.put("posX", IntBinaryTag.of(posX)); + structureTag.put("posY", IntBinaryTag.of(posY)); + structureTag.put("posZ", IntBinaryTag.of(posZ)); + structureTag.put("sizeX", IntBinaryTag.of(width)); + structureTag.put("sizeY", IntBinaryTag.of(height)); + structureTag.put("sizeZ", IntBinaryTag.of(length)); + structureTag.put("rotation", StringBinaryTag.of("NONE")); + structureTag.put("mirror", StringBinaryTag.of("NONE")); + structureTag.put("mode", StringBinaryTag.of("SAVE")); + structureTag.put("ignoreEntities", ByteBinaryTag.of((byte) 1)); + structureTag.put("showboundingbox", ByteBinaryTag.of((byte) 1)); + structureTag.put("id", StringBinaryTag.of(BlockTypes.STRUCTURE_BLOCK.getId())); + + return BlockTypes.STRUCTURE_BLOCK.getDefaultState().toBaseBlock(structureTag.build()); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java new file mode 100644 index 0000000000..17be01289b --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java @@ -0,0 +1,49 @@ +/* + * 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 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.util; + +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.world.storage.InvalidFormatException; + +public class NbtUtils { + + /** + * Get child tag of a NBT structure. + * + * @param tag the tag to read from + * @param key the key to look for + * @param expected the expected NBT class type + * @return child tag + * @throws InvalidFormatException if the format of the items is invalid + */ + public static T getChildTag(CompoundBinaryTag tag, String key, Class expected) throws InvalidFormatException { + BinaryTag childTag = tag.get(key); + if (childTag == null) { + throw new InvalidFormatException("Missing a \"" + key + "\" tag"); + } + + if (!expected.isInstance(childTag)) { + throw new InvalidFormatException(key + " tag is not of tag type " + expected.getName()); + } + return expected.cast(childTag); + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java index ee571c6436..21d480d692 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java @@ -50,7 +50,7 @@ class Int2BaseBlockMap extends AbstractInt2ObjectMap { * @return the internal ID, or {@link BlockStateIdAccess#invalidId()} if not useful */ private static int optimizedInternalId(BaseBlock block) { - if (block.hasNbtData()) { + if (block.hasNbt()) { return BlockStateIdAccess.invalidId(); } return BlockStateIdAccess.getBlockStateId(block.toImmutableState()); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java index 86ea9b454b..b2f6ae5423 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -19,7 +19,11 @@ package com.sk89q.worldedit.world; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.internal.util.DeprecationUtil; +import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import javax.annotation.Nullable; @@ -35,8 +39,12 @@ public interface NbtValued { * must not return null if this method returns true. * * @return true if there is NBT data + * @deprecated See {@link #hasNbt()} */ - boolean hasNbtData(); + @Deprecated + default boolean hasNbtData() { + return hasNbt(); + } /** * Get the object's NBT data (tile entity data). The returned tag, if @@ -49,15 +57,78 @@ public interface NbtValued { * not return null.

* * @return compound tag, or null + * @deprecated See {@link #getNbt()} */ + @Deprecated @Nullable - CompoundTag getNbtData(); + default CompoundTag getNbtData() { + return AdventureNBTConverter.fromAdventure(getNbt()); + } /** * Set the object's NBT data (tile entity data). * * @param nbtData NBT data, or null if no data + * @deprecated See {@link #setNbt(CompoundBinaryTag)} */ - void setNbtData(@Nullable CompoundTag nbtData); + @Deprecated + default void setNbtData(@Nullable CompoundTag nbtData) { + setNbt(nbtData == null ? null : nbtData.asBinaryTag()); + } + + /** + * Returns whether the block contains NBT data. {@link #getNbt()} ()} + * must not return null if this method returns true. + * + * @return true if there is NBT data + */ + @NonAbstractForCompatibility( + delegateName = "hasNbtData", + delegateParams = { } + ) + default boolean hasNbt() { + DeprecationUtil.checkDelegatingOverride(getClass()); + + return hasNbtData(); + } + + /** + * Get the object's NBT data (tile entity data). The returned tag, if + * modified in any way, should be sent to {@link #setNbt(CompoundBinaryTag)} + * so that the instance knows of the changes. Making changes without + * calling {@link #setNbt(CompoundBinaryTag)} could have unintended + * consequences. + * + *

{@link #hasNbt()} must return true if and only if method does + * not return null.

+ * + * @return compound tag, or null + */ + @NonAbstractForCompatibility( + delegateName = "getNbtData", + delegateParams = { } + ) + @Nullable + default CompoundBinaryTag getNbt() { + DeprecationUtil.checkDelegatingOverride(getClass()); + + CompoundTag nbtData = getNbtData(); + return nbtData == null ? null : nbtData.asBinaryTag(); + } + + /** + * Set the object's NBT data (tile entity data). + * + * @param nbtData NBT data, or null if no data + */ + @NonAbstractForCompatibility( + delegateName = "setNbtData", + delegateParams = { CompoundTag.class } + ) + default void setNbt(@Nullable CompoundBinaryTag nbtData) { + DeprecationUtil.checkDelegatingOverride(getClass()); + + setNbtData(nbtData == null ? null : AdventureNBTConverter.fromAdventure(nbtData)); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java index a7d50f6b1c..a488f59057 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java @@ -20,11 +20,13 @@ package com.sk89q.worldedit.world.block; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.TagStringIO; +import java.io.IOException; import java.util.Map; import java.util.Objects; import javax.annotation.Nullable; @@ -44,7 +46,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { private final BlockState blockState; @Nullable - private final CompoundTag nbtData; + private final CompoundBinaryTag nbtData; /** * Construct a block with a state. @@ -62,7 +64,19 @@ protected BaseBlock(BlockState blockState) { * @param state The block state * @param nbtData NBT data, which must be provided */ + @Deprecated protected BaseBlock(BlockState state, CompoundTag nbtData) { + this(state, checkNotNull(nbtData).asBinaryTag()); + } + + + /** + * Construct a block with the given ID, data value and NBT data structure. + * + * @param state The block state + * @param nbtData NBT data, which must be provided + */ + protected BaseBlock(BlockState state, CompoundBinaryTag nbtData) { checkNotNull(nbtData); this.blockState = state; this.nbtData = nbtData; @@ -85,7 +99,7 @@ public BlockType getBlockType() { @Override public BaseBlock with(Property property, V value) { - return this.blockState.with(property, value).toBaseBlock(getNbtData()); + return this.blockState.with(property, value).toBaseBlock(getNbt()); } /** @@ -99,33 +113,28 @@ public V getState(Property property) { return this.blockState.getState(property); } - @Override - public boolean hasNbtData() { - return getNbtData() != null; - } - @Override public String getNbtId() { - CompoundTag nbtData = getNbtData(); + CompoundBinaryTag nbtData = this.nbtData; if (nbtData == null) { return ""; } - Tag idTag = nbtData.getValue().get("id"); - if (idTag instanceof StringTag) { - return ((StringTag) idTag).getValue(); - } else { - return ""; - } + return nbtData.getString("id"); + } + + @Override + public boolean hasNbt() { + return this.nbtData != null; } @Nullable @Override - public CompoundTag getNbtData() { + public CompoundBinaryTag getNbt() { return this.nbtData; } @Override - public void setNbtData(@Nullable CompoundTag nbtData) { + public void setNbt(@Nullable CompoundBinaryTag nbtData) { throw new UnsupportedOperationException("This class is immutable."); } @@ -135,7 +144,7 @@ public void setNbtData(@Nullable CompoundTag nbtData) { @Override public boolean equals(Object o) { if (!(o instanceof BaseBlock)) { - if (!hasNbtData() && o instanceof BlockStateHolder) { + if (!hasNbt() && o instanceof BlockStateHolder) { return Objects.equals(toImmutableState(), ((BlockStateHolder) o).toImmutableState()); } return false; @@ -143,7 +152,7 @@ public boolean equals(Object o) { final BaseBlock otherBlock = (BaseBlock) o; - return this.blockState.equalsFuzzy(otherBlock.blockState) && Objects.equals(getNbtData(), otherBlock.getNbtData()); + return this.blockState.equalsFuzzy(otherBlock.blockState) && Objects.equals(getNbt(), otherBlock.getNbt()); } /** @@ -167,8 +176,22 @@ public BaseBlock toBaseBlock() { return this; } + @Deprecated @Override public BaseBlock toBaseBlock(CompoundTag compoundTag) { + if (compoundTag == null) { + return this.blockState.toBaseBlock(); + } else if (compoundTag.asBinaryTag() == this.nbtData) { + // The above reference equality check is fine, as JNBT classes contain an internal + // Adventure reference. + return this; + } else { + return new BaseBlock(this.blockState, compoundTag); + } + } + + @Override + public BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { if (compoundTag == null) { return this.blockState.toBaseBlock(); } else if (compoundTag == this.nbtData) { @@ -181,16 +204,24 @@ public BaseBlock toBaseBlock(CompoundTag compoundTag) { @Override public int hashCode() { int ret = toImmutableState().hashCode() << 3; - if (hasNbtData()) { - ret += getNbtData().hashCode(); + if (hasNbt()) { + ret += getNbt().hashCode(); } return ret; } @Override public String toString() { - // TODO use a json serializer for the NBT data - return blockState.getAsString() + (hasNbtData() ? "{hasNbt}" : ""); + String nbtString = ""; + if (hasNbt()) { + try { + nbtString = TagStringIO.get().asString(getNbt()); + } catch (IOException e) { + WorldEdit.logger.error("Failed to parse NBT of Block", e); + } + } + + return blockState.getAsString() + nbtString; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index fdbdd92d42..be4584b03b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -28,6 +28,7 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import java.util.Collections; import java.util.Comparator; @@ -210,6 +211,7 @@ public BaseBlock toBaseBlock() { return this.emptyBaseBlock; } + @Deprecated @Override public BaseBlock toBaseBlock(CompoundTag compoundTag) { if (compoundTag == null) { @@ -218,6 +220,14 @@ public BaseBlock toBaseBlock(CompoundTag compoundTag) { return new BaseBlock(this, compoundTag); } + @Override + public BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { + if (compoundTag == null) { + return toBaseBlock(); + } + return new BaseBlock(this, compoundTag); + } + /** * Internal method used for creating the initial BlockState. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java index 93aaa55ed4..875da7895d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java @@ -19,10 +19,12 @@ package com.sk89q.worldedit.world.block; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import java.util.Locale; import java.util.Map; @@ -88,9 +90,21 @@ public interface BlockStateHolder> extends Pattern * * @param compoundTag The NBT Data to apply * @return The BaseBlock + * @deprecated Use {@link BlockStateHolder#toBaseBlock(CompoundBinaryTag)}. */ + @Deprecated BaseBlock toBaseBlock(CompoundTag compoundTag); + /** + * Gets a {@link BaseBlock} from this BlockStateHolder. + * + * @param compoundTag The NBT Data to apply + * @return The BaseBlock + */ + default BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { + return toBaseBlock(AdventureNBTConverter.fromAdventure(compoundTag)); + } + @Override default BaseBlock applyBlock(BlockVector3 position) { return toBaseBlock(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java index dd8e407b94..8ecd71034d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java @@ -19,15 +19,16 @@ package com.sk89q.worldedit.world.chunk; -import com.sk89q.jnbt.ByteArrayTag; -import com.sk89q.jnbt.ByteTag; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.NBTUtils; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.NbtUtils; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -36,63 +37,74 @@ import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; public class AnvilChunk implements Chunk { - private final CompoundTag rootTag; + private final CompoundBinaryTag rootTag; private final byte[][] blocks; private final byte[][] blocksAdd; private final byte[][] data; private final int rootX; private final int rootZ; - private Map> tileEntities; + private Map tileEntities; + /** * Construct the chunk with a compound tag. * * @param tag the tag to read * @throws DataException on a data error + * @deprecated Use {@link #AnvilChunk(CompoundBinaryTag)} */ public AnvilChunk(CompoundTag tag) throws DataException { + this(tag.asBinaryTag()); + } + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + */ + public AnvilChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; - rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); - rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", IntBinaryTag.class).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", IntBinaryTag.class).value(); blocks = new byte[16][16 * 16 * 16]; blocksAdd = new byte[16][16 * 16 * 8]; data = new byte[16][16 * 16 * 8]; - List sections = NBTUtils.getChildTag(rootTag.getValue(), "Sections", ListTag.class).getValue(); + ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", ListBinaryTag.class); - for (Tag rawSectionTag : sections) { - if (!(rawSectionTag instanceof CompoundTag)) { + for (BinaryTag rawSectionTag : sections) { + if (!(rawSectionTag instanceof CompoundBinaryTag)) { continue; } - CompoundTag sectionTag = (CompoundTag) rawSectionTag; - if (!sectionTag.getValue().containsKey("Y")) { + CompoundBinaryTag sectionTag = (CompoundBinaryTag) rawSectionTag; + if (sectionTag.get("Y") == null) { continue; // Empty section. } - int y = NBTUtils.getChildTag(sectionTag.getValue(), "Y", ByteTag.class).getValue(); + int y = NbtUtils.getChildTag(sectionTag, "Y", ByteBinaryTag.class).value(); if (y < 0 || y >= 16) { continue; } - blocks[y] = NBTUtils.getChildTag(sectionTag.getValue(), - "Blocks", ByteArrayTag.class).getValue(); - data[y] = NBTUtils.getChildTag(sectionTag.getValue(), "Data", - ByteArrayTag.class).getValue(); + blocks[y] = NbtUtils.getChildTag(sectionTag, + "Blocks", ByteArrayBinaryTag.class).value(); + data[y] = NbtUtils.getChildTag(sectionTag, "Data", + ByteArrayBinaryTag.class).value(); // 4096 ID block support - if (sectionTag.getValue().containsKey("Add")) { - blocksAdd[y] = NBTUtils.getChildTag(sectionTag.getValue(), - "Add", ByteArrayTag.class).getValue(); + if (sectionTag.get("Add") != null) { + blocksAdd[y] = NbtUtils.getChildTag(sectionTag, + "Add", ByteArrayBinaryTag.class).value(); } } @@ -179,50 +191,49 @@ private int getBlockData(BlockVector3 position) throws DataException { * Used to load the tile entities. */ private void populateTileEntities() throws DataException { - List tags = NBTUtils.getChildTag(rootTag.getValue(), - "TileEntities", ListTag.class).getValue(); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", ListBinaryTag.class); tileEntities = new HashMap<>(); - for (Tag tag : tags) { - if (!(tag instanceof CompoundTag)) { + for (BinaryTag tag : tags) { + if (!(tag instanceof CompoundBinaryTag)) { throw new InvalidFormatException("CompoundTag expected in TileEntities"); } - CompoundTag t = (CompoundTag) tag; + CompoundBinaryTag t = (CompoundBinaryTag) tag; int x = 0; int y = 0; int z = 0; - Map values = new HashMap<>(); + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - for (Map.Entry entry : t.getValue().entrySet()) { - switch (entry.getKey()) { + for (String key : t.keySet()) { + BinaryTag value = t.get(key); + switch (key) { case "x": - if (entry.getValue() instanceof IntTag) { - x = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + x = ((IntBinaryTag) value).value(); } break; case "y": - if (entry.getValue() instanceof IntTag) { - y = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + y = ((IntBinaryTag) value).value(); } break; case "z": - if (entry.getValue() instanceof IntTag) { - z = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + z = ((IntBinaryTag) value).value(); } break; default: break; } - values.put(entry.getKey(), entry.getValue()); + values.put(key, value); } - BlockVector3 vec = BlockVector3.at(x, y, z); - tileEntities.put(vec, values); + tileEntities.put(vec, values.build()); } } @@ -236,17 +247,17 @@ private void populateTileEntities() throws DataException { * @throws DataException thrown if there is a data error */ @Nullable - private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); } - Map values = tileEntities.get(position); + CompoundBinaryTag values = tileEntities.get(position); if (values == null) { return null; } - return new CompoundTag(values); + return values; } @Override @@ -259,7 +270,7 @@ public BaseBlock getBlock(BlockVector3 position) throws DataException { WorldEdit.logger.warn("Unknown legacy block " + id + ":" + data + " found when loading legacy anvil chunk."); return BlockTypes.AIR.getDefaultState().toBaseBlock(); } - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundBinaryTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java index 512649c45a..dd3bfdbe6d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java @@ -19,15 +19,17 @@ package com.sk89q.worldedit.world.chunk; -import com.sk89q.jnbt.ByteTag; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.LongArrayTag; -import com.sk89q.jnbt.NBTUtils; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.NbtUtils; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -36,7 +38,6 @@ import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -45,62 +46,75 @@ */ public class AnvilChunk13 implements Chunk { - private final CompoundTag rootTag; + private final CompoundBinaryTag rootTag; private final BlockState[][] blocks; private final int rootX; private final int rootZ; - private Map> tileEntities; + private Map tileEntities; + /** * Construct the chunk with a compound tag. * * @param tag the tag to read * @throws DataException on a data error + * @deprecated Use {@link #AnvilChunk13(CompoundBinaryTag)} */ + @Deprecated public AnvilChunk13(CompoundTag tag) throws DataException { + this(tag.asBinaryTag()); + } + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + */ + public AnvilChunk13(CompoundBinaryTag tag) throws DataException { rootTag = tag; - rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); - rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", IntBinaryTag.class).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", IntBinaryTag.class).value(); blocks = new BlockState[16][]; - List sections = NBTUtils.getChildTag(rootTag.getValue(), "Sections", ListTag.class).getValue(); + ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", ListBinaryTag.class); - for (Tag rawSectionTag : sections) { - if (!(rawSectionTag instanceof CompoundTag)) { + for (BinaryTag rawSectionTag : sections) { + if (!(rawSectionTag instanceof CompoundBinaryTag)) { continue; } - CompoundTag sectionTag = (CompoundTag) rawSectionTag; - if (!sectionTag.getValue().containsKey("Y")) { + CompoundBinaryTag sectionTag = (CompoundBinaryTag) rawSectionTag; + if (sectionTag.get("Y") == null) { continue; // Empty section. } - int y = NBTUtils.getChildTag(sectionTag.getValue(), "Y", ByteTag.class).getValue(); + int y = NbtUtils.getChildTag(sectionTag, "Y", ByteBinaryTag.class).value(); if (y < 0 || y >= 16) { continue; } // parse palette - List paletteEntries = sectionTag.getList("Palette", CompoundTag.class); + ListBinaryTag paletteEntries = sectionTag.getList("Palette", BinaryTagTypes.COMPOUND); int paletteSize = paletteEntries.size(); if (paletteSize == 0) { continue; } BlockState[] palette = new BlockState[paletteSize]; for (int paletteEntryId = 0; paletteEntryId < paletteSize; paletteEntryId++) { - CompoundTag paletteEntry = paletteEntries.get(paletteEntryId); + CompoundBinaryTag paletteEntry = (CompoundBinaryTag) paletteEntries.get(paletteEntryId); BlockType type = BlockTypes.get(paletteEntry.getString("Name")); if (type == null) { throw new InvalidFormatException("Invalid block type: " + paletteEntry.getString("Name")); } BlockState blockState = type.getDefaultState(); - if (paletteEntry.containsKey("Properties")) { - CompoundTag properties = NBTUtils.getChildTag(paletteEntry.getValue(), "Properties", CompoundTag.class); + if (paletteEntry.get("Properties") != null) { + CompoundBinaryTag properties = NbtUtils.getChildTag(paletteEntry, "Properties", CompoundBinaryTag.class); for (Property property : blockState.getStates().keySet()) { - if (properties.containsKey(property.getName())) { + if (properties.get(property.getName()) != null) { String value = properties.getString(property.getName()); try { blockState = getBlockStateWith(blockState, property, value); @@ -114,7 +128,7 @@ public AnvilChunk13(CompoundTag tag) throws DataException { } // parse block states - long[] blockStatesSerialized = NBTUtils.getChildTag(sectionTag.getValue(), "BlockStates", LongArrayTag.class).getValue(); + long[] blockStatesSerialized = NbtUtils.getChildTag(sectionTag, "BlockStates", LongArrayBinaryTag.class).value(); BlockState[] chunkSectionBlocks = new BlockState[16 * 16 * 16]; blocks[y] = chunkSectionBlocks; @@ -166,26 +180,24 @@ private BlockState getBlockStateWith(BlockState source, Property property */ private void populateTileEntities() throws DataException { tileEntities = new HashMap<>(); - if (!rootTag.getValue().containsKey("TileEntities")) { + if (rootTag.get("TileEntities") == null) { return; } - List tags = NBTUtils.getChildTag(rootTag.getValue(), - "TileEntities", ListTag.class).getValue(); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", ListBinaryTag.class); - for (Tag tag : tags) { - if (!(tag instanceof CompoundTag)) { + for (BinaryTag tag : tags) { + if (!(tag instanceof CompoundBinaryTag)) { throw new InvalidFormatException("CompoundTag expected in TileEntities"); } - CompoundTag t = (CompoundTag) tag; + CompoundBinaryTag t = (CompoundBinaryTag) tag; - Map values = new HashMap<>(t.getValue()); - int x = ((IntTag) values.get("x")).getValue(); - int y = ((IntTag) values.get("y")).getValue(); - int z = ((IntTag) values.get("z")).getValue(); + int x = ((IntBinaryTag) t.get("x")).value(); + int y = ((IntBinaryTag) t.get("y")).value(); + int z = ((IntBinaryTag) t.get("z")).value(); BlockVector3 vec = BlockVector3.at(x, y, z); - tileEntities.put(vec, values); + tileEntities.put(vec, t); } } @@ -199,17 +211,17 @@ private void populateTileEntities() throws DataException { * @throws DataException thrown if there is a data error */ @Nullable - private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); } - Map values = tileEntities.get(position); + CompoundBinaryTag values = tileEntities.get(position); if (values == null) { return null; } - return new CompoundTag(values); + return values; } @Override @@ -228,7 +240,7 @@ public BaseBlock getBlock(BlockVector3 position) throws DataException { BlockState[] sectionBlocks = blocks[section]; BlockState state = sectionBlocks != null ? sectionBlocks[(yIndex << 8) | (z << 4) | x] : BlockTypes.AIR.getDefaultState(); - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundBinaryTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java index bd9d5e08a5..13e69458ae 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.world.chunk; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.storage.InvalidFormatException; @@ -34,11 +35,23 @@ public class AnvilChunk16 extends AnvilChunk13 { * * @param tag the tag to read * @throws DataException on a data error + * @deprecated Use {@link #AnvilChunk16(CompoundBinaryTag)} */ + @Deprecated public AnvilChunk16(CompoundTag tag) throws DataException { super(tag); } + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + */ + public AnvilChunk16(CompoundBinaryTag tag) throws DataException { + super(tag); + } + @Override protected void readBlockStates(BlockState[] palette, long[] blockStatesSerialized, BlockState[] chunkSectionBlocks) throws InvalidFormatException { PackedIntArrayReader reader = new PackedIntArrayReader(blockStatesSerialized); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java index 8f5665c449..fa4288885b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java @@ -19,14 +19,15 @@ package com.sk89q.worldedit.world.chunk; -import com.sk89q.jnbt.ByteArrayTag; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.NBTUtils; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.NbtUtils; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -35,7 +36,6 @@ import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -43,27 +43,40 @@ */ public class OldChunk implements Chunk { - private final CompoundTag rootTag; + private final CompoundBinaryTag rootTag; private final byte[] blocks; private final byte[] data; private final int rootX; private final int rootZ; - private Map> tileEntities; + private Map tileEntities; + /** * Construct the chunk with a compound tag. * * @param tag the tag * @throws DataException if there is an error getting the chunk data + * @deprecated Use {@link #OldChunk(CompoundBinaryTag)} */ + @Deprecated public OldChunk(CompoundTag tag) throws DataException { + this(tag.asBinaryTag()); + } + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag + * @throws DataException if there is an error getting the chunk data + */ + public OldChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; - blocks = NBTUtils.getChildTag(rootTag.getValue(), "Blocks", ByteArrayTag.class).getValue(); - data = NBTUtils.getChildTag(rootTag.getValue(), "Data", ByteArrayTag.class).getValue(); - rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); - rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + blocks = NbtUtils.getChildTag(rootTag, "Blocks", ByteArrayBinaryTag.class).value(); + data = NbtUtils.getChildTag(rootTag, "Data", ByteArrayBinaryTag.class).value(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", IntBinaryTag.class).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", IntBinaryTag.class).value(); int size = 16 * 16 * 128; if (blocks.length != size) { @@ -83,51 +96,50 @@ public OldChunk(CompoundTag tag) throws DataException { * @throws DataException if there is an error getting the chunk data */ private void populateTileEntities() throws DataException { - List tags = NBTUtils.getChildTag( - rootTag.getValue(), "TileEntities", ListTag.class) - .getValue(); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", ListBinaryTag.class); tileEntities = new HashMap<>(); - for (Tag tag : tags) { - if (!(tag instanceof CompoundTag)) { + for (BinaryTag tag : tags) { + if (!(tag instanceof CompoundBinaryTag)) { throw new InvalidFormatException("CompoundTag expected in TileEntities"); } - CompoundTag t = (CompoundTag) tag; + CompoundBinaryTag t = (CompoundBinaryTag) tag; int x = 0; int y = 0; int z = 0; - Map values = new HashMap<>(); + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - for (Map.Entry entry : t.getValue().entrySet()) { - switch (entry.getKey()) { + for (String key : t.keySet()) { + BinaryTag value = t.get(key); + switch (key) { case "x": - if (entry.getValue() instanceof IntTag) { - x = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + x = ((IntBinaryTag) value).value(); } break; case "y": - if (entry.getValue() instanceof IntTag) { - y = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + y = ((IntBinaryTag) value).value(); } break; case "z": - if (entry.getValue() instanceof IntTag) { - z = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + z = ((IntBinaryTag) value).value(); } break; default: break; } - values.put(entry.getKey(), entry.getValue()); + values.put(key, value); } BlockVector3 vec = BlockVector3.at(x, y, z); - tileEntities.put(vec, values); + tileEntities.put(vec, values.build()); } } @@ -140,16 +152,16 @@ private void populateTileEntities() throws DataException { * @return a tag * @throws DataException if there is an error getting the chunk data */ - private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); } - Map values = tileEntities.get(position); + CompoundBinaryTag values = tileEntities.get(position); if (values == null) { return null; } - return new CompoundTag(values); + return values; } @Override @@ -189,7 +201,7 @@ public BaseBlock getBlock(BlockVector3 position) throws DataException { return BlockTypes.AIR.getDefaultState().toBaseBlock(); } - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundBinaryTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index 2ed98270c1..a48412d5d7 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -331,6 +331,7 @@ "worldedit.error.invalid-number.matches": "Number expected; string \"{0}\" given.", "worldedit.error.incomplete-region": "Make a region selection first.", "worldedit.error.unknown-block": "Block name '{0}' was not recognized.", + "worldedit.error.unknown-item": "Item name '{0}' was not recognized.", "worldedit.error.unknown-entity": "Entity name '{0}' was not recognized.", "worldedit.error.unknown-mob": "Mob name '{0}' was not recognized.", "worldedit.error.unknown-biome": "Biome name '{0}' was not recognized.", @@ -372,6 +373,7 @@ "worldedit.error.parser.missing-random-type": "Missing the type after the % symbol for '{0}'", "worldedit.error.parser.clipboard.missing-coordinates": "Clipboard offset needs x,y,z coordinates.", "worldedit.error.parser.player-only": "Input '{0}' requires a player!", + "worldedit.error.parser.invalid-nbt": "Invalid NBT Data in input: '{0}'. Error: {1}", "worldedit.error.disabled": "This functionality is disabled (see WorldEdit configuration).", "worldedit.error.unknown": "Unknown error occurred: {0}", "worldedit.error.missing-extent": "No Extent is known", diff --git a/worldedit-libs/core/build.gradle.kts b/worldedit-libs/core/build.gradle.kts index d669216d6d..26fdba8be4 100644 --- a/worldedit-libs/core/build.gradle.kts +++ b/worldedit-libs/core/build.gradle.kts @@ -13,4 +13,5 @@ dependencies { "shade"("org.enginehub.piston:core:${Versions.PISTON}") "shade"("org.enginehub.piston.core-ap:runtime:${Versions.PISTON}") "shade"("org.enginehub.piston:default-impl:${Versions.PISTON}") + "shade"("net.kyori:adventure-nbt:4.4.0") } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java index c37535160c..540808475d 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java @@ -168,7 +168,7 @@ public > boolean setBlock(BlockVector3 position, B snapshot.restore(true, notifyAndLight ? BlockChangeFlags.ALL : BlockChangeFlags.NONE); // Create the TileEntity - if (block instanceof BaseBlock && ((BaseBlock) block).hasNbtData()) { + if (block instanceof BaseBlock && ((BaseBlock) block).hasNbt()) { // Kill the old TileEntity world.getTileEntity(pos).ifPresent(tileEntity -> applyTileEntityData(tileEntity, (BaseBlock) block)); } @@ -301,7 +301,7 @@ public Entity createEntity(Location location, BaseEntity entity) { Vector3d pos = new Vector3d(location.getX(), location.getY(), location.getZ()); org.spongepowered.api.entity.Entity newEnt = world.createEntity(entityType, pos); - if (entity.hasNbtData()) { + if (entity.hasNbt()) { applyEntityData(newEnt, entity); } From 85c150e017fb79d93e903ab72c0b5789efddd96f Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sat, 6 Feb 2021 02:51:44 -0800 Subject: [PATCH 02/10] =?UTF-8?q?assorted=20changes=E2=84=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sk89q/jnbt/NBTInputStream.java | 120 +-------- .../java/com/sk89q/jnbt/NBTOutputStream.java | 239 +----------------- 2 files changed, 17 insertions(+), 342 deletions(-) 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 1b41180851..3c9d701e9e 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java @@ -19,13 +19,14 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.BinaryTagIO; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; + import java.io.Closeable; +import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -63,115 +64,10 @@ public NBTInputStream(InputStream is) { * @throws IOException if an I/O error occurs. */ public NamedTag readNamedTag() throws IOException { - return readNamedTag(0); - } - - /** - * Reads an NBT from the stream. - * - * @param depth the depth of this tag - * @return The tag that was read. - * @throws IOException if an I/O error occurs. - */ - private NamedTag readNamedTag(int depth) throws IOException { - int type = is.readByte() & 0xFF; - - String name; - if (type != NBTConstants.TYPE_END) { - int nameLength = is.readShort() & 0xFFFF; - byte[] nameBytes = new byte[nameLength]; - is.readFully(nameBytes); - name = new String(nameBytes, NBTConstants.CHARSET); - } else { - name = ""; - } - - return new NamedTag(name, readTagPayload(type, depth)); - } - - /** - * Reads the payload of a tag given the type. - * - * @param type the type - * @param depth the depth - * @return the tag - * @throws IOException if an I/O error occurs. - */ - private Tag readTagPayload(int type, int depth) throws IOException { - switch (type) { - case NBTConstants.TYPE_END: - if (depth == 0) { - throw new IOException( - "TAG_End found without a TAG_Compound/TAG_List tag preceding it."); - } else { - return new EndTag(); - } - case NBTConstants.TYPE_BYTE: - return new ByteTag(is.readByte()); - case NBTConstants.TYPE_SHORT: - return new ShortTag(is.readShort()); - case NBTConstants.TYPE_INT: - return new IntTag(is.readInt()); - case NBTConstants.TYPE_LONG: - return new LongTag(is.readLong()); - case NBTConstants.TYPE_FLOAT: - return new FloatTag(is.readFloat()); - case NBTConstants.TYPE_DOUBLE: - return new DoubleTag(is.readDouble()); - case NBTConstants.TYPE_BYTE_ARRAY: - int length = is.readInt(); - byte[] bytes = new byte[length]; - is.readFully(bytes); - return new ByteArrayTag(bytes); - case NBTConstants.TYPE_STRING: - length = is.readShort(); - bytes = new byte[length]; - is.readFully(bytes); - return new StringTag(new String(bytes, NBTConstants.CHARSET)); - case NBTConstants.TYPE_LIST: - int childType = is.readByte(); - length = is.readInt(); - - List tagList = new ArrayList<>(); - for (int i = 0; i < length; ++i) { - Tag tag = readTagPayload(childType, depth + 1); - if (tag instanceof EndTag) { - throw new IOException("TAG_End not permitted in a list."); - } - tagList.add(tag); - } - - return new ListTag(NBTUtils.getTypeClass(childType), tagList); - case NBTConstants.TYPE_COMPOUND: - Map tagMap = new HashMap<>(); - while (true) { - NamedTag namedTag = readNamedTag(depth + 1); - Tag tag = namedTag.getTag(); - if (tag instanceof EndTag) { - break; - } else { - tagMap.put(namedTag.getName(), tag); - } - } - - return new CompoundTag(tagMap); - case NBTConstants.TYPE_INT_ARRAY: - length = is.readInt(); - int[] data = new int[length]; - for (int i = 0; i < length; i++) { - 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 + "."); - } + Map.Entry named = BinaryTagIO.reader().readNamed( + (DataInput) this.is + ); + return new NamedTag(named.getKey(), new CompoundTag(named.getValue())); } @Override 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 ae92946ae0..59fc92bc31 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java @@ -19,7 +19,12 @@ package com.sk89q.jnbt; +import com.google.common.collect.Maps; +import com.sk89q.worldedit.util.nbt.BinaryTagIO; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; + import java.io.Closeable; +import java.io.DataOutput; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -70,236 +75,10 @@ public NBTOutputStream(OutputStream os) throws IOException { * if an I/O error occurs. */ public void writeNamedTag(String name, Tag tag) throws IOException { - checkNotNull(name); - checkNotNull(tag); - - int type = NBTUtils.getTypeCode(tag.getClass()); - byte[] nameBytes = name.getBytes(NBTConstants.CHARSET); - - os.writeByte(type); - os.writeShort(nameBytes.length); - os.write(nameBytes); - - if (type == NBTConstants.TYPE_END) { - throw new IOException("Named TAG_End not permitted."); - } - - writeTagPayload(tag); - } - - /** - * Writes tag payload. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeTagPayload(Tag tag) throws IOException { - int type = NBTUtils.getTypeCode(tag.getClass()); - switch (type) { - case NBTConstants.TYPE_END: - writeEndTagPayload((EndTag) tag); - break; - case NBTConstants.TYPE_BYTE: - writeByteTagPayload((ByteTag) tag); - break; - case NBTConstants.TYPE_SHORT: - writeShortTagPayload((ShortTag) tag); - break; - case NBTConstants.TYPE_INT: - writeIntTagPayload((IntTag) tag); - break; - case NBTConstants.TYPE_LONG: - writeLongTagPayload((LongTag) tag); - break; - case NBTConstants.TYPE_FLOAT: - writeFloatTagPayload((FloatTag) tag); - break; - case NBTConstants.TYPE_DOUBLE: - writeDoubleTagPayload((DoubleTag) tag); - break; - case NBTConstants.TYPE_BYTE_ARRAY: - writeByteArrayTagPayload((ByteArrayTag) tag); - break; - case NBTConstants.TYPE_STRING: - writeStringTagPayload((StringTag) tag); - break; - case NBTConstants.TYPE_LIST: - writeListTagPayload((ListTag) tag); - break; - case NBTConstants.TYPE_COMPOUND: - writeCompoundTagPayload((CompoundTag) tag); - break; - 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 + "."); - } - } - - /** - * Writes a {@code TAG_Byte} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeByteTagPayload(ByteTag tag) throws IOException { - os.writeByte(tag.getValue()); - } - - /** - * Writes a {@code TAG_Byte_Array} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeByteArrayTagPayload(ByteArrayTag tag) throws IOException { - byte[] bytes = tag.getValue(); - os.writeInt(bytes.length); - os.write(bytes); - } - - /** - * Writes a {@code TAG_Compound} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeCompoundTagPayload(CompoundTag tag) throws IOException { - for (Map.Entry entry : tag.getValue().entrySet()) { - writeNamedTag(entry.getKey(), entry.getValue()); - } - os.writeByte((byte) 0); // end tag - better way? - } - - /** - * Writes a {@code TAG_List} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeListTagPayload(ListTag tag) throws IOException { - Class clazz = tag.getType(); - List tags = tag.getValue(); - int size = tags.size(); - - os.writeByte(NBTUtils.getTypeCode(clazz)); - os.writeInt(size); - for (Tag tag1 : tags) { - writeTagPayload(tag1); - } - } - - /** - * Writes a {@code TAG_String} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeStringTagPayload(StringTag tag) throws IOException { - byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET); - os.writeShort(bytes.length); - os.write(bytes); - } - - /** - * Writes a {@code TAG_Double} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeDoubleTagPayload(DoubleTag tag) throws IOException { - os.writeDouble(tag.getValue()); - } - - /** - * Writes a {@code TAG_Float} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeFloatTagPayload(FloatTag tag) throws IOException { - os.writeFloat(tag.getValue()); - } - - /** - * Writes a {@code TAG_Long} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeLongTagPayload(LongTag tag) throws IOException { - os.writeLong(tag.getValue()); - } - - /** - * Writes a {@code TAG_Int} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeIntTagPayload(IntTag tag) throws IOException { - os.writeInt(tag.getValue()); - } - - /** - * Writes a {@code TAG_Short} tag. - * - * @param tag - * The tag. - * @throws IOException - * if an I/O error occurs. - */ - private void writeShortTagPayload(ShortTag tag) throws IOException { - os.writeShort(tag.getValue()); - } - - /** - * Writes a {@code TAG_Empty} tag. - * - * @param tag the tag - */ - private void writeEndTagPayload(EndTag tag) { - /* empty */ - } - - private void writeIntArrayTagPayload(IntArrayTag tag) throws IOException { - int[] data = tag.getValue(); - os.writeInt(data.length); - for (int aData : data) { - os.writeInt(aData); - } - } - - private void writeLongArrayTagPayload(LongArrayTag tag) throws IOException { - long[] data = tag.getValue(); - os.writeInt(data.length); - for (long aData : data) { - os.writeLong(aData); - } + BinaryTagIO.writer().writeNamed( + Maps.immutableEntry(name, (CompoundBinaryTag) tag.asBinaryTag()), + (DataOutput) this.os + ); } @Override From 4ac2bb3e2573db0ae63eea388da97e33837260e2 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 8 Feb 2021 21:48:59 +1000 Subject: [PATCH 03/10] Further work on migrating to Adventure NBT --- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 2 +- .../bukkit/adapter/BukkitImplAdapter.java | 4 +- .../src/main/resources/worldedit-adapters.jar | Bin 669759 -> 440499 bytes .../com/sk89q/worldedit/blocks/BaseItem.java | 4 +- .../internal/wna/WorldNativeAccess.java | 22 +- .../com/sk89q/worldedit/world/NbtValued.java | 3 +- .../sk89q/worldedit/fabric/FabricAdapter.java | 18 +- .../worldedit/fabric/FabricDataFixer.java | 14 +- .../sk89q/worldedit/fabric/FabricPlayer.java | 5 +- .../sk89q/worldedit/fabric/FabricWorld.java | 8 +- .../internal/FabricWorldNativeAccess.java | 3 +- .../fabric/internal/NBTConverter.java | 201 +++++++++--------- .../sk89q/worldedit/forge/ForgeAdapter.java | 18 +- .../sk89q/worldedit/forge/ForgeDataFixer.java | 14 +- .../sk89q/worldedit/forge/ForgePlayer.java | 4 +- .../com/sk89q/worldedit/forge/ForgeWorld.java | 8 +- .../internal/ForgeWorldNativeAccess.java | 4 +- .../forge/internal/NBTConverter.java | 197 +++++++++-------- 18 files changed, 260 insertions(+), 269 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 5f44d3ea0e..487dfb804a 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -299,7 +299,7 @@ public > void sendFakeBlock(BlockVector3 pos, B bl BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); if (adapter != null) { if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK) { - adapter.sendFakeNBT(player, pos, ((BaseBlock) block).getNbtData()); + adapter.sendFakeNBT(player, pos, ((BaseBlock) block).getNbt()); adapter.sendFakeOP(player); } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index f3d46ebb22..c9e0743d31 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.bukkit.adapter; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; @@ -31,6 +30,7 @@ import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.block.BaseBlock; @@ -151,7 +151,7 @@ default void tickWatchdog() { * @param pos The position * @param nbtData The NBT Data */ - void sendFakeNBT(Player player, BlockVector3 pos, CompoundTag nbtData); + void sendFakeNBT(Player player, BlockVector3 pos, CompoundBinaryTag nbtData); /** * Make the client think it has operator status. diff --git a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar index 31237d7c4686f7f1921bfd6b84402a310e708ab7..5f9fa5a89b84b266e88a53e9f2cccf18e3ff502a 100644 GIT binary patch delta 142673 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%0Dv;iLK4YeL@i+Xubb=?Z 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 z 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 H#DD(>q;;G+ delta 315224 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

H(bz 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

H7eCJ*(f*yn{52!E3dJt4rj&8oGDoua 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

$=!ty0laC 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

OIf_;Xj|uy#(q*8i8dzo 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

B~Sr~JgYslL?9VKLC|j6EQjm` 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 z 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 XC}_mkxr3R4nI^AMDCz<5Adm7tc;@JW diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java index c6ad28b38d..180e80c903 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java @@ -60,8 +60,8 @@ public BaseItem(ItemType itemType) { * @param nbtData NBT Compound tag */ @Deprecated - public BaseItem(ItemType itemType, CompoundTag nbtData) { - this(itemType, checkNotNull(nbtData).asBinaryTag()); + public BaseItem(ItemType itemType, @Nullable CompoundTag nbtData) { + this(itemType, nbtData == null ? null : nbtData.asBinaryTag()); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java index 042385c64b..ee91f9a644 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java @@ -19,11 +19,14 @@ package com.sk89q.worldedit.internal.wna; -import com.sk89q.jnbt.CompoundTag; +import com.google.common.collect.ImmutableMap; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -66,14 +69,15 @@ default > boolean setBlock(BlockVector3 position, if (successful || old == newState) { if (block instanceof BaseBlock) { BaseBlock baseBlock = (BaseBlock) block; - CompoundTag tag = baseBlock.getNbtData(); + CompoundBinaryTag tag = baseBlock.getNbt(); if (tag != null) { - tag = tag.createBuilder() - .putString("id", baseBlock.getNbtId()) - .putInt("x", position.getX()) - .putInt("y", position.getY()) - .putInt("z", position.getZ()) - .build(); + tag = tag.put(ImmutableMap.of( + "id", StringBinaryTag.of(baseBlock.getNbtId()), + "x", IntBinaryTag.of(position.getX()), + "y", IntBinaryTag.of(position.getY()), + "z", IntBinaryTag.of(position.getZ()) + )); + // update if TE changed as well successful = updateTileEntity(pos, tag); } @@ -136,7 +140,7 @@ default void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { void updateLightingForBlock(NP position); - boolean updateTileEntity(NP position, CompoundTag tag); + boolean updateTileEntity(NP position, CompoundBinaryTag tag); void notifyBlockUpdate(NP position, NBS oldState, NBS newState); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java index b2f6ae5423..a26632e718 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -62,7 +62,8 @@ default boolean hasNbtData() { @Deprecated @Nullable default CompoundTag getNbtData() { - return AdventureNBTConverter.fromAdventure(getNbt()); + CompoundBinaryTag tag = getNbt(); + return tag == null ? null : AdventureNBTConverter.fromAdventure(tag); } /** diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java index 53b74c3f73..21d050b26a 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java @@ -20,8 +20,6 @@ package com.sk89q.worldedit.fabric; import com.google.common.collect.ImmutableList; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.fabric.internal.NBTConverter; import com.sk89q.worldedit.math.BlockVector3; @@ -32,6 +30,8 @@ import com.sk89q.worldedit.registry.state.IntegerProperty; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; @@ -228,8 +228,8 @@ public static ItemType adapt(Item item) { public static ItemStack adapt(BaseItemStack baseItemStack) { net.minecraft.nbt.CompoundTag fabricCompound = null; - if (baseItemStack.getNbtData() != null) { - fabricCompound = NBTConverter.toNative(baseItemStack.getNbtData()); + if (baseItemStack.getNbt() != null) { + fabricCompound = NBTConverter.toNative(baseItemStack.getNbt()); } final ItemStack itemStack = new ItemStack(adapt(baseItemStack.getType()), baseItemStack.getAmount()); itemStack.setTag(fabricCompound); @@ -237,13 +237,13 @@ public static ItemStack adapt(BaseItemStack baseItemStack) { } public static BaseItemStack adapt(ItemStack itemStack) { - CompoundTag tag = NBTConverter.fromNative(itemStack.toTag(new net.minecraft.nbt.CompoundTag())); - if (tag.getValue().isEmpty()) { + CompoundBinaryTag tag = NBTConverter.fromNative(itemStack.toTag(new net.minecraft.nbt.CompoundTag())); + if (tag.keySet().isEmpty()) { tag = null; } else { - final Tag tagTag = tag.getValue().get("tag"); - if (tagTag instanceof CompoundTag) { - tag = ((CompoundTag) tagTag); + final BinaryTag tagTag = tag.get("tag"); + if (tagTag instanceof CompoundBinaryTag) { + tag = ((CompoundBinaryTag) tagTag); } else { tag = null; } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java index e59956df3a..f2aab20d51 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java @@ -35,8 +35,8 @@ import com.mojang.datafixers.DataFixerBuilder; import com.mojang.datafixers.schemas.Schema; import com.mojang.serialization.Dynamic; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.fabric.internal.NBTConverter; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import net.minecraft.datafixer.Schemas; import net.minecraft.datafixer.TypeReferences; import net.minecraft.nbt.FloatTag; @@ -92,11 +92,11 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo @Override public T fixUp(FixType type, T original, int srcVer) { if (type == FixTypes.CHUNK) { - return (T) fixChunk((CompoundTag) original, srcVer); + return (T) fixChunk((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.BLOCK_ENTITY) { - return (T) fixBlockEntity((CompoundTag) original, srcVer); + return (T) fixBlockEntity((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.ENTITY) { - return (T) fixEntity((CompoundTag) original, srcVer); + return (T) fixEntity((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.BLOCK_STATE) { return (T) fixBlockState((String) original, srcVer); } else if (type == FixTypes.ITEM_TYPE) { @@ -107,19 +107,19 @@ public T fixUp(FixType type, T original, int srcVer) { return original; } - private CompoundTag fixChunk(CompoundTag originalChunk, int srcVer) { + private CompoundBinaryTag fixChunk(CompoundBinaryTag originalChunk, int srcVer) { net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(originalChunk); net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.CHUNK, tag, srcVer); return NBTConverter.fromNative(fixed); } - private CompoundTag fixBlockEntity(CompoundTag origTileEnt, int srcVer) { + private CompoundBinaryTag fixBlockEntity(CompoundBinaryTag origTileEnt, int srcVer) { net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(origTileEnt); net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.BLOCK_ENTITY, tag, srcVer); return NBTConverter.fromNative(fixed); } - private CompoundTag fixEntity(CompoundTag origEnt, int srcVer) { + private CompoundBinaryTag fixEntity(CompoundBinaryTag origEnt, int srcVer) { net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(origEnt); net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.ENTITY, tag, srcVer); return NBTConverter.fromNative(fixed); diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java index 7240aa589d..cd34ca1646 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.fabric; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.util.StringUtil; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; @@ -38,6 +37,7 @@ import com.sk89q.worldedit.util.formatting.component.TextUtils; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -55,7 +55,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import java.io.IOException; @@ -243,7 +242,7 @@ public > void sendFakeBlock(BlockVector3 pos, B bl player.networkHandler.sendPacket(packetOut); if (block instanceof BaseBlock && block.getBlockType().equals(BlockTypes.STRUCTURE_BLOCK)) { final BaseBlock baseBlock = (BaseBlock) block; - final CompoundTag nbtData = baseBlock.getNbtData(); + final CompoundBinaryTag nbtData = baseBlock.getNbt(); if (nbtData != null) { player.networkHandler.sendPacket(new BlockEntityUpdateS2CPacket( new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()), diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index c4fb5cd6fd..5bf412edc9 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -28,7 +28,6 @@ import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; import com.mojang.serialization.Dynamic; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; @@ -53,6 +52,7 @@ import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.TreeGenerator.TreeType; import com.sk89q.worldedit.util.io.file.SafeFiles; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.AbstractWorld; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; @@ -248,7 +248,7 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { @Override public boolean useItem(BlockVector3 position, BaseItem item, Direction face) { - ItemStack stack = FabricAdapter.adapt(new BaseItemStack(item.getType(), item.getNbtData(), 1)); + ItemStack stack = FabricAdapter.adapt(new BaseItemStack(item.getType(), item.getNbt(), 1)); ServerWorld world = (ServerWorld) getWorld(); final WorldEditFakePlayer fakePlayer; try { @@ -667,9 +667,9 @@ public Entity createEntity(Location location, BaseEntity entity) { } net.minecraft.entity.Entity createdEntity = entityType.get().create(world); if (createdEntity != null) { - CompoundTag nativeTag = entity.getNbtData(); + CompoundBinaryTag nativeTag = entity.getNbt(); if (nativeTag != null) { - net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(entity.getNbtData()); + net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(nativeTag); for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { tag.remove(name); } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java index 62b3f92df9..5fbc89fb51 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java @@ -24,6 +24,7 @@ import com.sk89q.worldedit.internal.wna.WorldNativeAccess; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; @@ -103,7 +104,7 @@ public void updateLightingForBlock(BlockPos position) { } @Override - public boolean updateTileEntity(BlockPos position, com.sk89q.jnbt.CompoundTag tag) { + public boolean updateTileEntity(BlockPos position, CompoundBinaryTag tag) { CompoundTag nativeTag = NBTConverter.toNative(tag); BlockEntity tileEntity = getWorld().getWorldChunk(position).getBlockEntity(position); if (tileEntity == null) { diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/NBTConverter.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/NBTConverter.java index d915dce7bf..418b90b46a 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/NBTConverter.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/NBTConverter.java @@ -19,27 +19,22 @@ package com.sk89q.worldedit.fabric.internal; -import com.sk89q.jnbt.ByteArrayTag; -import com.sk89q.jnbt.ByteTag; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.DoubleTag; -import com.sk89q.jnbt.EndTag; -import com.sk89q.jnbt.FloatTag; -import com.sk89q.jnbt.IntArrayTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.LongArrayTag; -import com.sk89q.jnbt.LongTag; -import com.sk89q.jnbt.ShortTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; - -import java.util.ArrayList; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; +import com.sk89q.worldedit.util.nbt.EndBinaryTag; +import com.sk89q.worldedit.util.nbt.FloatBinaryTag; +import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.LongBinaryTag; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; + import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; /** @@ -50,56 +45,56 @@ public final class NBTConverter { private NBTConverter() { } - public static net.minecraft.nbt.Tag toNative(Tag tag) { - if (tag instanceof IntArrayTag) { - return toNative((IntArrayTag) tag); + public static net.minecraft.nbt.Tag toNative(BinaryTag tag) { + if (tag instanceof IntArrayBinaryTag) { + return toNative((IntArrayBinaryTag) tag); - } else if (tag instanceof ListTag) { - return toNative((ListTag) tag); + } else if (tag instanceof ListBinaryTag) { + return toNative((ListBinaryTag) tag); - } else if (tag instanceof LongTag) { - return toNative((LongTag) tag); + } else if (tag instanceof LongBinaryTag) { + return toNative((LongBinaryTag) tag); - } else if (tag instanceof LongArrayTag) { - return toNative((LongArrayTag) tag); + } else if (tag instanceof LongArrayBinaryTag) { + return toNative((LongArrayBinaryTag) tag); - } else if (tag instanceof StringTag) { - return toNative((StringTag) tag); + } else if (tag instanceof StringBinaryTag) { + return toNative((StringBinaryTag) tag); - } else if (tag instanceof IntTag) { - return toNative((IntTag) tag); + } else if (tag instanceof IntBinaryTag) { + return toNative((IntBinaryTag) tag); - } else if (tag instanceof ByteTag) { - return toNative((ByteTag) tag); + } else if (tag instanceof ByteBinaryTag) { + return toNative((ByteBinaryTag) tag); - } else if (tag instanceof ByteArrayTag) { - return toNative((ByteArrayTag) tag); + } else if (tag instanceof ByteArrayBinaryTag) { + return toNative((ByteArrayBinaryTag) tag); - } else if (tag instanceof CompoundTag) { - return toNative((CompoundTag) tag); + } else if (tag instanceof CompoundBinaryTag) { + return toNative((CompoundBinaryTag) tag); - } else if (tag instanceof FloatTag) { - return toNative((FloatTag) tag); + } else if (tag instanceof FloatBinaryTag) { + return toNative((FloatBinaryTag) tag); - } else if (tag instanceof ShortTag) { - return toNative((ShortTag) tag); + } else if (tag instanceof ShortBinaryTag) { + return toNative((ShortBinaryTag) tag); - } else if (tag instanceof DoubleTag) { - return toNative((DoubleTag) tag); + } else if (tag instanceof DoubleBinaryTag) { + return toNative((DoubleBinaryTag) tag); } else { throw new IllegalArgumentException("Can't convert tag of type " + tag.getClass().getCanonicalName()); } } - public static net.minecraft.nbt.IntArrayTag toNative(IntArrayTag tag) { - int[] value = tag.getValue(); + public static net.minecraft.nbt.IntArrayTag toNative(IntArrayBinaryTag tag) { + int[] value = tag.value(); return new net.minecraft.nbt.IntArrayTag(Arrays.copyOf(value, value.length)); } - public static net.minecraft.nbt.ListTag toNative(ListTag tag) { + public static net.minecraft.nbt.ListTag toNative(ListBinaryTag tag) { net.minecraft.nbt.ListTag list = new net.minecraft.nbt.ListTag(); - for (Tag child : tag.getValue()) { - if (child instanceof EndTag) { + for (BinaryTag child : tag) { + if (child instanceof EndBinaryTag) { continue; } list.add(toNative(child)); @@ -107,51 +102,51 @@ public static net.minecraft.nbt.ListTag toNative(ListTag tag) { return list; } - public static net.minecraft.nbt.LongTag toNative(LongTag tag) { - return net.minecraft.nbt.LongTag.of(tag.getValue()); + public static net.minecraft.nbt.LongTag toNative(LongBinaryTag tag) { + return net.minecraft.nbt.LongTag.of(tag.value()); } - public static net.minecraft.nbt.LongArrayTag toNative(LongArrayTag tag) { - return new net.minecraft.nbt.LongArrayTag(tag.getValue().clone()); + public static net.minecraft.nbt.LongArrayTag toNative(LongArrayBinaryTag tag) { + return new net.minecraft.nbt.LongArrayTag(tag.value().clone()); } - public static net.minecraft.nbt.StringTag toNative(StringTag tag) { - return net.minecraft.nbt.StringTag.of(tag.getValue()); + public static net.minecraft.nbt.StringTag toNative(StringBinaryTag tag) { + return net.minecraft.nbt.StringTag.of(tag.value()); } - public static net.minecraft.nbt.IntTag toNative(IntTag tag) { - return net.minecraft.nbt.IntTag.of(tag.getValue()); + public static net.minecraft.nbt.IntTag toNative(IntBinaryTag tag) { + return net.minecraft.nbt.IntTag.of(tag.value()); } - public static net.minecraft.nbt.ByteTag toNative(ByteTag tag) { - return net.minecraft.nbt.ByteTag.of(tag.getValue()); + public static net.minecraft.nbt.ByteTag toNative(ByteBinaryTag tag) { + return net.minecraft.nbt.ByteTag.of(tag.value()); } - public static net.minecraft.nbt.ByteArrayTag toNative(ByteArrayTag tag) { - return new net.minecraft.nbt.ByteArrayTag(tag.getValue().clone()); + public static net.minecraft.nbt.ByteArrayTag toNative(ByteArrayBinaryTag tag) { + return new net.minecraft.nbt.ByteArrayTag(tag.value().clone()); } - public static net.minecraft.nbt.CompoundTag toNative(CompoundTag tag) { + public static net.minecraft.nbt.CompoundTag toNative(CompoundBinaryTag tag) { net.minecraft.nbt.CompoundTag compound = new net.minecraft.nbt.CompoundTag(); - for (Entry child : tag.getValue().entrySet()) { - compound.put(child.getKey(), toNative(child.getValue())); + for (String key : tag.keySet()) { + compound.put(key, toNative(tag.get(key))); } return compound; } - public static net.minecraft.nbt.FloatTag toNative(FloatTag tag) { - return net.minecraft.nbt.FloatTag.of(tag.getValue()); + public static net.minecraft.nbt.FloatTag toNative(FloatBinaryTag tag) { + return net.minecraft.nbt.FloatTag.of(tag.value()); } - public static net.minecraft.nbt.ShortTag toNative(ShortTag tag) { - return net.minecraft.nbt.ShortTag.of(tag.getValue()); + public static net.minecraft.nbt.ShortTag toNative(ShortBinaryTag tag) { + return net.minecraft.nbt.ShortTag.of(tag.value()); } - public static net.minecraft.nbt.DoubleTag toNative(DoubleTag tag) { - return net.minecraft.nbt.DoubleTag.of(tag.getValue()); + public static net.minecraft.nbt.DoubleTag toNative(DoubleBinaryTag tag) { + return net.minecraft.nbt.DoubleTag.of(tag.value()); } - public static Tag fromNative(net.minecraft.nbt.Tag other) { + public static BinaryTag fromNative(net.minecraft.nbt.Tag other) { if (other instanceof net.minecraft.nbt.IntArrayTag) { return fromNative((net.minecraft.nbt.IntArrayTag) other); @@ -195,71 +190,69 @@ public static Tag fromNative(net.minecraft.nbt.Tag other) { } } - public static IntArrayTag fromNative(net.minecraft.nbt.IntArrayTag other) { + public static IntArrayBinaryTag fromNative(net.minecraft.nbt.IntArrayTag other) { int[] value = other.getIntArray(); - return new IntArrayTag(Arrays.copyOf(value, value.length)); + return IntArrayBinaryTag.of(Arrays.copyOf(value, value.length)); } - public static ListTag fromNative(net.minecraft.nbt.ListTag other) { + public static ListBinaryTag fromNative(net.minecraft.nbt.ListTag other) { other = other.copy(); - List list = new ArrayList<>(); - Class listClass = StringTag.class; + ListBinaryTag.Builder list = ListBinaryTag.builder(); int tags = other.size(); for (int i = 0; i < tags; i++) { - Tag child = fromNative(other.remove(0)); + BinaryTag child = fromNative(other.remove(0)); list.add(child); - listClass = child.getClass(); } - return new ListTag(listClass, list); + return list.build(); } - public static EndTag fromNative(net.minecraft.nbt.EndTag other) { - return new EndTag(); + public static EndBinaryTag fromNative(net.minecraft.nbt.EndTag other) { + return EndBinaryTag.get(); } - public static LongTag fromNative(net.minecraft.nbt.LongTag other) { - return new LongTag(other.getLong()); + public static LongBinaryTag fromNative(net.minecraft.nbt.LongTag other) { + return LongBinaryTag.of(other.getLong()); } - public static LongArrayTag fromNative(net.minecraft.nbt.LongArrayTag other) { - return new LongArrayTag(other.getLongArray().clone()); + public static LongArrayBinaryTag fromNative(net.minecraft.nbt.LongArrayTag other) { + return LongArrayBinaryTag.of(other.getLongArray().clone()); } - public static StringTag fromNative(net.minecraft.nbt.StringTag other) { - return new StringTag(other.asString()); + public static StringBinaryTag fromNative(net.minecraft.nbt.StringTag other) { + return StringBinaryTag.of(other.asString()); } - public static IntTag fromNative(net.minecraft.nbt.IntTag other) { - return new IntTag(other.getInt()); + public static IntBinaryTag fromNative(net.minecraft.nbt.IntTag other) { + return IntBinaryTag.of(other.getInt()); } - public static ByteTag fromNative(net.minecraft.nbt.ByteTag other) { - return new ByteTag(other.getByte()); + public static ByteBinaryTag fromNative(net.minecraft.nbt.ByteTag other) { + return ByteBinaryTag.of(other.getByte()); } - public static ByteArrayTag fromNative(net.minecraft.nbt.ByteArrayTag other) { - return new ByteArrayTag(other.getByteArray().clone()); + public static ByteArrayBinaryTag fromNative(net.minecraft.nbt.ByteArrayTag other) { + return ByteArrayBinaryTag.of(other.getByteArray().clone()); } - public static CompoundTag fromNative(net.minecraft.nbt.CompoundTag other) { + public static CompoundBinaryTag fromNative(net.minecraft.nbt.CompoundTag other) { Set tags = other.getKeys(); - Map map = new HashMap<>(); + CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder(); for (String tagName : tags) { - map.put(tagName, fromNative(other.get(tagName))); + builder.put(tagName, fromNative(other.get(tagName))); } - return new CompoundTag(map); + return builder.build(); } - public static FloatTag fromNative(net.minecraft.nbt.FloatTag other) { - return new FloatTag(other.getFloat()); + public static FloatBinaryTag fromNative(net.minecraft.nbt.FloatTag other) { + return FloatBinaryTag.of(other.getFloat()); } - public static ShortTag fromNative(net.minecraft.nbt.ShortTag other) { - return new ShortTag(other.getShort()); + public static ShortBinaryTag fromNative(net.minecraft.nbt.ShortTag other) { + return ShortBinaryTag.of(other.getShort()); } - public static DoubleTag fromNative(net.minecraft.nbt.DoubleTag other) { - return new DoubleTag(other.getDouble()); + public static DoubleBinaryTag fromNative(net.minecraft.nbt.DoubleTag other) { + return DoubleBinaryTag.of(other.getDouble()); } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java index 840eb04547..ba02cfa1a0 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java @@ -20,8 +20,6 @@ package com.sk89q.worldedit.forge; import com.google.common.collect.ImmutableList; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.forge.internal.NBTConverter; import com.sk89q.worldedit.math.BlockVector3; @@ -32,6 +30,8 @@ import com.sk89q.worldedit.registry.state.IntegerProperty; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; @@ -224,8 +224,8 @@ public static ItemType adapt(Item item) { public static ItemStack adapt(BaseItemStack baseItemStack) { CompoundNBT forgeCompound = null; - if (baseItemStack.getNbtData() != null) { - forgeCompound = NBTConverter.toNative(baseItemStack.getNbtData()); + if (baseItemStack.getNbt() != null) { + forgeCompound = NBTConverter.toNative(baseItemStack.getNbt()); } final ItemStack itemStack = new ItemStack(adapt(baseItemStack.getType()), baseItemStack.getAmount()); itemStack.setTag(forgeCompound); @@ -233,13 +233,13 @@ public static ItemStack adapt(BaseItemStack baseItemStack) { } public static BaseItemStack adapt(ItemStack itemStack) { - CompoundTag tag = NBTConverter.fromNative(itemStack.serializeNBT()); - if (tag.getValue().isEmpty()) { + CompoundBinaryTag tag = NBTConverter.fromNative(itemStack.serializeNBT()); + if (tag.keySet().isEmpty()) { tag = null; } else { - final Tag tagTag = tag.getValue().get("tag"); - if (tagTag instanceof CompoundTag) { - tag = ((CompoundTag) tagTag); + final BinaryTag tagTag = tag.get("tag"); + if (tagTag instanceof CompoundBinaryTag) { + tag = ((CompoundBinaryTag) tagTag); } else { tag = null; } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeDataFixer.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeDataFixer.java index 7eebd7dc5b..0c5edd609c 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeDataFixer.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeDataFixer.java @@ -34,8 +34,8 @@ import com.mojang.datafixers.DataFixerBuilder; import com.mojang.datafixers.schemas.Schema; import com.mojang.serialization.Dynamic; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.forge.internal.NBTConverter; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import net.minecraft.item.DyeColor; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.FloatNBT; @@ -94,11 +94,11 @@ class ForgeDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wor @Override public T fixUp(FixType type, T original, int srcVer) { if (type == FixTypes.CHUNK) { - return (T) fixChunk((CompoundTag) original, srcVer); + return (T) fixChunk((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.BLOCK_ENTITY) { - return (T) fixBlockEntity((CompoundTag) original, srcVer); + return (T) fixBlockEntity((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.ENTITY) { - return (T) fixEntity((CompoundTag) original, srcVer); + return (T) fixEntity((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.BLOCK_STATE) { return (T) fixBlockState((String) original, srcVer); } else if (type == FixTypes.ITEM_TYPE) { @@ -109,19 +109,19 @@ public T fixUp(FixType type, T original, int srcVer) { return original; } - private CompoundTag fixChunk(CompoundTag originalChunk, int srcVer) { + private CompoundBinaryTag fixChunk(CompoundBinaryTag originalChunk, int srcVer) { CompoundNBT tag = NBTConverter.toNative(originalChunk); CompoundNBT fixed = convert(LegacyType.CHUNK, tag, srcVer); return NBTConverter.fromNative(fixed); } - private CompoundTag fixBlockEntity(CompoundTag origTileEnt, int srcVer) { + private CompoundBinaryTag fixBlockEntity(CompoundBinaryTag origTileEnt, int srcVer) { CompoundNBT tag = NBTConverter.toNative(origTileEnt); CompoundNBT fixed = convert(LegacyType.BLOCK_ENTITY, tag, srcVer); return NBTConverter.fromNative(fixed); } - private CompoundTag fixEntity(CompoundTag origEnt, int srcVer) { + private CompoundBinaryTag fixEntity(CompoundBinaryTag origEnt, int srcVer) { CompoundNBT tag = NBTConverter.toNative(origEnt); CompoundNBT fixed = convert(LegacyType.ENTITY, tag, srcVer); return NBTConverter.fromNative(fixed); diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java index 2151d98454..41e08e9559 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.forge; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.util.StringUtil; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; @@ -36,6 +35,7 @@ import com.sk89q.worldedit.util.formatting.component.TextUtils; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -244,7 +244,7 @@ public > void sendFakeBlock(BlockVector3 pos, B bl player.connection.sendPacket(packetOut); if (block instanceof BaseBlock && block.getBlockType().equals(BlockTypes.STRUCTURE_BLOCK)) { final BaseBlock baseBlock = (BaseBlock) block; - final CompoundTag nbtData = baseBlock.getNbtData(); + final CompoundBinaryTag nbtData = baseBlock.getNbt(); if (nbtData != null) { player.connection.sendPacket(new SUpdateTileEntityPacket( new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()), diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java index e54caa1a43..2eb64dede1 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java @@ -29,7 +29,6 @@ import com.google.common.util.concurrent.Futures; import com.mojang.serialization.Codec; import com.mojang.serialization.Dynamic; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; @@ -53,6 +52,7 @@ import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.TreeGenerator.TreeType; import com.sk89q.worldedit.util.io.file.SafeFiles; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.AbstractWorld; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; @@ -253,7 +253,7 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { @Override public boolean useItem(BlockVector3 position, BaseItem item, Direction face) { - ItemStack stack = ForgeAdapter.adapt(new BaseItemStack(item.getType(), item.getNbtData(), 1)); + ItemStack stack = ForgeAdapter.adapt(new BaseItemStack(item.getType(), item.getNbt(), 1)); ServerWorld world = (ServerWorld) getWorld(); final WorldEditFakePlayer fakePlayer; try { @@ -677,9 +677,9 @@ public Entity createEntity(Location location, BaseEntity entity) { } net.minecraft.entity.Entity createdEntity = entityType.get().create(world); if (createdEntity != null) { - CompoundTag nativeTag = entity.getNbtData(); + CompoundBinaryTag nativeTag = entity.getNbt(); if (nativeTag != null) { - CompoundNBT tag = NBTConverter.toNative(entity.getNbtData()); + CompoundNBT tag = NBTConverter.toNative(nativeTag); for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { tag.remove(name); } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java index 94f491b9f0..1080994a89 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java @@ -19,12 +19,12 @@ package com.sk89q.worldedit.forge.internal; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.forge.ForgeAdapter; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; import com.sk89q.worldedit.internal.wna.WorldNativeAccess; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; @@ -98,7 +98,7 @@ public void updateLightingForBlock(BlockPos position) { } @Override - public boolean updateTileEntity(BlockPos position, CompoundTag tag) { + public boolean updateTileEntity(BlockPos position, CompoundBinaryTag tag) { CompoundNBT nativeTag = NBTConverter.toNative(tag); return TileEntityUtils.setTileEntity(getWorld(), position, nativeTag); } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java index 64532b6fb0..4f76306bc3 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java @@ -19,20 +19,20 @@ package com.sk89q.worldedit.forge.internal; -import com.sk89q.jnbt.ByteArrayTag; -import com.sk89q.jnbt.ByteTag; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.DoubleTag; -import com.sk89q.jnbt.EndTag; -import com.sk89q.jnbt.FloatTag; -import com.sk89q.jnbt.IntArrayTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.LongArrayTag; -import com.sk89q.jnbt.LongTag; -import com.sk89q.jnbt.ShortTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; +import com.sk89q.worldedit.util.nbt.EndBinaryTag; +import com.sk89q.worldedit.util.nbt.FloatBinaryTag; +import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.LongBinaryTag; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import net.minecraft.nbt.ByteArrayNBT; import net.minecraft.nbt.ByteNBT; import net.minecraft.nbt.CompoundNBT; @@ -48,12 +48,7 @@ import net.minecraft.nbt.ShortNBT; import net.minecraft.nbt.StringNBT; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; /** @@ -64,56 +59,56 @@ public final class NBTConverter { private NBTConverter() { } - public static INBT toNative(Tag tag) { - if (tag instanceof IntArrayTag) { - return toNative((IntArrayTag) tag); + public static INBT toNative(BinaryTag tag) { + if (tag instanceof IntArrayBinaryTag) { + return toNative((IntArrayBinaryTag) tag); - } else if (tag instanceof ListTag) { - return toNative((ListTag) tag); + } else if (tag instanceof ListBinaryTag) { + return toNative((ListBinaryTag) tag); - } else if (tag instanceof LongTag) { - return toNative((LongTag) tag); + } else if (tag instanceof LongBinaryTag) { + return toNative((LongBinaryTag) tag); - } else if (tag instanceof LongArrayTag) { - return toNative((LongArrayTag) tag); + } else if (tag instanceof LongArrayBinaryTag) { + return toNative((LongArrayBinaryTag) tag); - } else if (tag instanceof StringTag) { - return toNative((StringTag) tag); + } else if (tag instanceof StringBinaryTag) { + return toNative((StringBinaryTag) tag); - } else if (tag instanceof IntTag) { - return toNative((IntTag) tag); + } else if (tag instanceof IntBinaryTag) { + return toNative((IntBinaryTag) tag); - } else if (tag instanceof ByteTag) { - return toNative((ByteTag) tag); + } else if (tag instanceof ByteBinaryTag) { + return toNative((ByteBinaryTag) tag); - } else if (tag instanceof ByteArrayTag) { - return toNative((ByteArrayTag) tag); + } else if (tag instanceof ByteArrayBinaryTag) { + return toNative((ByteArrayBinaryTag) tag); - } else if (tag instanceof CompoundTag) { - return toNative((CompoundTag) tag); + } else if (tag instanceof CompoundBinaryTag) { + return toNative((CompoundBinaryTag) tag); - } else if (tag instanceof FloatTag) { - return toNative((FloatTag) tag); + } else if (tag instanceof FloatBinaryTag) { + return toNative((FloatBinaryTag) tag); - } else if (tag instanceof ShortTag) { - return toNative((ShortTag) tag); + } else if (tag instanceof ShortBinaryTag) { + return toNative((ShortBinaryTag) tag); - } else if (tag instanceof DoubleTag) { - return toNative((DoubleTag) tag); + } else if (tag instanceof DoubleBinaryTag) { + return toNative((DoubleBinaryTag) tag); } else { throw new IllegalArgumentException("Can't convert tag of type " + tag.getClass().getCanonicalName()); } } - public static IntArrayNBT toNative(IntArrayTag tag) { - int[] value = tag.getValue(); + public static IntArrayNBT toNative(IntArrayBinaryTag tag) { + int[] value = tag.value(); return new IntArrayNBT(Arrays.copyOf(value, value.length)); } - public static ListNBT toNative(ListTag tag) { + public static ListNBT toNative(ListBinaryTag tag) { ListNBT list = new ListNBT(); - for (Tag child : tag.getValue()) { - if (child instanceof EndTag) { + for (BinaryTag child : tag) { + if (child instanceof EndBinaryTag) { continue; } list.add(toNative(child)); @@ -121,51 +116,51 @@ public static ListNBT toNative(ListTag tag) { return list; } - public static LongNBT toNative(LongTag tag) { - return LongNBT.valueOf(tag.getValue()); + public static LongNBT toNative(LongBinaryTag tag) { + return LongNBT.valueOf(tag.value()); } - public static LongArrayNBT toNative(LongArrayTag tag) { - return new LongArrayNBT(tag.getValue().clone()); + public static LongArrayNBT toNative(LongArrayBinaryTag tag) { + return new LongArrayNBT(tag.value().clone()); } - public static StringNBT toNative(StringTag tag) { - return StringNBT.valueOf(tag.getValue()); + public static StringNBT toNative(StringBinaryTag tag) { + return StringNBT.valueOf(tag.value()); } - public static IntNBT toNative(IntTag tag) { - return IntNBT.valueOf(tag.getValue()); + public static IntNBT toNative(IntBinaryTag tag) { + return IntNBT.valueOf(tag.value()); } - public static ByteNBT toNative(ByteTag tag) { - return ByteNBT.valueOf(tag.getValue()); + public static ByteNBT toNative(ByteBinaryTag tag) { + return ByteNBT.valueOf(tag.value()); } - public static ByteArrayNBT toNative(ByteArrayTag tag) { - return new ByteArrayNBT(tag.getValue().clone()); + public static ByteArrayNBT toNative(ByteArrayBinaryTag tag) { + return new ByteArrayNBT(tag.value().clone()); } - public static CompoundNBT toNative(CompoundTag tag) { + public static CompoundNBT toNative(CompoundBinaryTag tag) { CompoundNBT compound = new CompoundNBT(); - for (Entry child : tag.getValue().entrySet()) { - compound.put(child.getKey(), toNative(child.getValue())); + for (String key : tag.keySet()) { + compound.put(key, toNative(tag.get(key))); } return compound; } - public static FloatNBT toNative(FloatTag tag) { - return FloatNBT.valueOf(tag.getValue()); + public static FloatNBT toNative(FloatBinaryTag tag) { + return FloatNBT.valueOf(tag.value()); } - public static ShortNBT toNative(ShortTag tag) { - return ShortNBT.valueOf(tag.getValue()); + public static ShortNBT toNative(ShortBinaryTag tag) { + return ShortNBT.valueOf(tag.value()); } - public static DoubleNBT toNative(DoubleTag tag) { - return DoubleNBT.valueOf(tag.getValue()); + public static DoubleNBT toNative(DoubleBinaryTag tag) { + return DoubleNBT.valueOf(tag.value()); } - public static Tag fromNative(INBT other) { + public static BinaryTag fromNative(INBT other) { if (other instanceof IntArrayNBT) { return fromNative((IntArrayNBT) other); @@ -209,71 +204,69 @@ public static Tag fromNative(INBT other) { } } - public static IntArrayTag fromNative(IntArrayNBT other) { + public static IntArrayBinaryTag fromNative(IntArrayNBT other) { int[] value = other.getIntArray(); - return new IntArrayTag(Arrays.copyOf(value, value.length)); + return IntArrayBinaryTag.of(Arrays.copyOf(value, value.length)); } - public static ListTag fromNative(ListNBT other) { + public static ListBinaryTag fromNative(ListNBT other) { other = other.copy(); - List list = new ArrayList<>(); - Class listClass = StringTag.class; + ListBinaryTag.Builder list = ListBinaryTag.builder(); int tags = other.size(); for (int i = 0; i < tags; i++) { - Tag child = fromNative(other.remove(0)); + BinaryTag child = fromNative(other.remove(0)); list.add(child); - listClass = child.getClass(); } - return new ListTag(listClass, list); + return list.build(); } - public static EndTag fromNative(EndNBT other) { - return new EndTag(); + public static EndBinaryTag fromNative(EndNBT other) { + return EndBinaryTag.get(); } - public static LongTag fromNative(LongNBT other) { - return new LongTag(other.getLong()); + public static LongBinaryTag fromNative(LongNBT other) { + return LongBinaryTag.of(other.getLong()); } - public static LongArrayTag fromNative(LongArrayNBT other) { - return new LongArrayTag(other.getAsLongArray().clone()); + public static LongArrayBinaryTag fromNative(LongArrayNBT other) { + return LongArrayBinaryTag.of(other.getAsLongArray().clone()); } - public static StringTag fromNative(StringNBT other) { - return new StringTag(other.getString()); + public static StringBinaryTag fromNative(StringNBT other) { + return StringBinaryTag.of(other.getString()); } - public static IntTag fromNative(IntNBT other) { - return new IntTag(other.getInt()); + public static IntBinaryTag fromNative(IntNBT other) { + return IntBinaryTag.of(other.getInt()); } - public static ByteTag fromNative(ByteNBT other) { - return new ByteTag(other.getByte()); + public static ByteBinaryTag fromNative(ByteNBT other) { + return ByteBinaryTag.of(other.getByte()); } - public static ByteArrayTag fromNative(ByteArrayNBT other) { - return new ByteArrayTag(other.getByteArray().clone()); + public static ByteArrayBinaryTag fromNative(ByteArrayNBT other) { + return ByteArrayBinaryTag.of(other.getByteArray().clone()); } - public static CompoundTag fromNative(CompoundNBT other) { + public static CompoundBinaryTag fromNative(CompoundNBT other) { Set tags = other.keySet(); - Map map = new HashMap<>(); + CompoundBinaryTag.Builder map = CompoundBinaryTag.builder(); for (String tagName : tags) { map.put(tagName, fromNative(other.get(tagName))); } - return new CompoundTag(map); + return map.build(); } - public static FloatTag fromNative(FloatNBT other) { - return new FloatTag(other.getFloat()); + public static FloatBinaryTag fromNative(FloatNBT other) { + return FloatBinaryTag.of(other.getFloat()); } - public static ShortTag fromNative(ShortNBT other) { - return new ShortTag(other.getShort()); + public static ShortBinaryTag fromNative(ShortNBT other) { + return ShortBinaryTag.of(other.getShort()); } - public static DoubleTag fromNative(DoubleNBT other) { - return new DoubleTag(other.getDouble()); + public static DoubleBinaryTag fromNative(DoubleNBT other) { + return DoubleBinaryTag.of(other.getDouble()); } } From 628c3f2ca17c3810e028986250c48bb2c884acae Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 9 Feb 2021 20:41:47 +1000 Subject: [PATCH 04/10] Fix a few issues (and pretend 4.5.0 exists) --- .../java/com/sk89q/worldedit/LocalSession.java | 1 - .../worldedit/world/block/BlockStateHolder.java | 14 ++++++++++++-- worldedit-libs/core/build.gradle.kts | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index f83815225f..3b865ad80a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -23,7 +23,6 @@ import com.sk89q.jchronic.Options; import com.sk89q.jchronic.utils.Span; import com.sk89q.jchronic.utils.Time; -import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.worldedit.command.tool.BlockTool; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.command.tool.InvalidToolBindException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java index 875da7895d..cd908e1e6e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java @@ -22,6 +22,8 @@ import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.internal.util.DeprecationUtil; +import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; @@ -93,7 +95,9 @@ public interface BlockStateHolder> extends Pattern * @deprecated Use {@link BlockStateHolder#toBaseBlock(CompoundBinaryTag)}. */ @Deprecated - BaseBlock toBaseBlock(CompoundTag compoundTag); + default BaseBlock toBaseBlock(CompoundTag compoundTag) { + return toBaseBlock(compoundTag == null ? null : compoundTag.asBinaryTag()); + } /** * Gets a {@link BaseBlock} from this BlockStateHolder. @@ -101,8 +105,14 @@ public interface BlockStateHolder> extends Pattern * @param compoundTag The NBT Data to apply * @return The BaseBlock */ + @NonAbstractForCompatibility( + delegateName = "toBaseBlock", + delegateParams = { CompoundTag.class } + ) default BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { - return toBaseBlock(AdventureNBTConverter.fromAdventure(compoundTag)); + DeprecationUtil.checkDelegatingOverride(getClass()); + + return toBaseBlock(compoundTag == null ? null : AdventureNBTConverter.fromAdventure(compoundTag)); } @Override diff --git a/worldedit-libs/core/build.gradle.kts b/worldedit-libs/core/build.gradle.kts index 26fdba8be4..84714e5eb7 100644 --- a/worldedit-libs/core/build.gradle.kts +++ b/worldedit-libs/core/build.gradle.kts @@ -13,5 +13,5 @@ dependencies { "shade"("org.enginehub.piston:core:${Versions.PISTON}") "shade"("org.enginehub.piston.core-ap:runtime:${Versions.PISTON}") "shade"("org.enginehub.piston:default-impl:${Versions.PISTON}") - "shade"("net.kyori:adventure-nbt:4.4.0") + "shade"("net.kyori:adventure-nbt:4.5.0") } From 3b25230f191b5b7ba6fd6b34877f08ff92c5c7ac Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sun, 14 Feb 2021 21:31:04 -0800 Subject: [PATCH 05/10] Finish reimplementing everything in adventure-nbt --- .../com/sk89q/jnbt/AdventureNBTConverter.java | 153 ++++----- .../java/com/sk89q/jnbt/ByteArrayTag.java | 2 +- .../src/main/java/com/sk89q/jnbt/ByteTag.java | 2 +- .../main/java/com/sk89q/jnbt/CompoundTag.java | 209 +++---------- .../com/sk89q/jnbt/CompoundTagBuilder.java | 53 ++-- .../main/java/com/sk89q/jnbt/DoubleTag.java | 2 +- .../main/java/com/sk89q/jnbt/FloatTag.java | 2 +- .../main/java/com/sk89q/jnbt/IntArrayTag.java | 2 +- .../src/main/java/com/sk89q/jnbt/IntTag.java | 2 +- .../src/main/java/com/sk89q/jnbt/ListTag.java | 292 +++++++----------- .../java/com/sk89q/jnbt/ListTagBuilder.java | 22 +- .../java/com/sk89q/jnbt/LongArrayTag.java | 2 +- .../src/main/java/com/sk89q/jnbt/LongTag.java | 2 +- .../java/com/sk89q/jnbt/NBTConstants.java | 5 - .../main/java/com/sk89q/jnbt/NBTUtils.java | 31 +- .../main/java/com/sk89q/jnbt/ShortTag.java | 2 +- .../main/java/com/sk89q/jnbt/StringTag.java | 2 +- .../com/sk89q/worldedit/world/NbtValued.java | 12 +- .../world/block/BlockStateHolder.java | 4 +- 19 files changed, 292 insertions(+), 509 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java b/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java index 407bcb0099..13c58e6931 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java @@ -19,20 +19,18 @@ package com.sk89q.jnbt; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableMap; import com.sk89q.worldedit.util.nbt.BinaryTag; -import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; -import com.sk89q.worldedit.util.nbt.ByteBinaryTag; -import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; -import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; -import com.sk89q.worldedit.util.nbt.EndBinaryTag; -import com.sk89q.worldedit.util.nbt.FloatBinaryTag; -import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; -import com.sk89q.worldedit.util.nbt.IntBinaryTag; -import com.sk89q.worldedit.util.nbt.ListBinaryTag; -import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; -import com.sk89q.worldedit.util.nbt.LongBinaryTag; -import com.sk89q.worldedit.util.nbt.ShortBinaryTag; -import com.sk89q.worldedit.util.nbt.StringBinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagType; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; /** * Converts between JNBT and Adventure-NBT classes. @@ -41,92 +39,67 @@ */ @Deprecated public class AdventureNBTConverter { - - private AdventureNBTConverter() { - - } - - public static Tag fromAdventure(BinaryTag other) { - if (other instanceof IntArrayBinaryTag) { - return fromAdventure((IntArrayBinaryTag) other); - } else if (other instanceof ListBinaryTag) { - return fromAdventure((ListBinaryTag) other); - } else if (other instanceof EndBinaryTag) { - return fromAdventure(); - } else if (other instanceof LongBinaryTag) { - return fromAdventure((LongBinaryTag) other); - } else if (other instanceof LongArrayBinaryTag) { - return fromAdventure((LongArrayBinaryTag) other); - } else if (other instanceof StringBinaryTag) { - return fromAdventure((StringBinaryTag) other); - } else if (other instanceof IntBinaryTag) { - return fromAdventure((IntBinaryTag) other); - } else if (other instanceof ByteBinaryTag) { - return fromAdventure((ByteBinaryTag) other); - } else if (other instanceof ByteArrayBinaryTag) { - return fromAdventure((ByteArrayBinaryTag) other); - } else if (other instanceof CompoundBinaryTag) { - return fromAdventure((CompoundBinaryTag) other); - } else if (other instanceof FloatBinaryTag) { - return fromAdventure((FloatBinaryTag) other); - } else if (other instanceof ShortBinaryTag) { - return fromAdventure((ShortBinaryTag) other); - } else if (other instanceof DoubleBinaryTag) { - return fromAdventure((DoubleBinaryTag) other); - } else { - throw new IllegalArgumentException("Can't convert other of type " + other.getClass().getCanonicalName()); + private static final BiMap, BinaryTagType> TAG_TYPES = + new ImmutableBiMap.Builder, BinaryTagType>() + .put(ByteArrayTag.class, BinaryTagTypes.BYTE_ARRAY) + .put(ByteTag.class, BinaryTagTypes.BYTE) + .put(CompoundTag.class, BinaryTagTypes.COMPOUND) + .put(DoubleTag.class, BinaryTagTypes.DOUBLE) + .put(EndTag.class, BinaryTagTypes.END) + .put(FloatTag.class, BinaryTagTypes.FLOAT) + .put(IntArrayTag.class, BinaryTagTypes.INT_ARRAY) + .put(IntTag.class, BinaryTagTypes.INT) + .put(ListTag.class, BinaryTagTypes.LIST) + .put(LongArrayTag.class, BinaryTagTypes.LONG_ARRAY) + .put(LongTag.class, BinaryTagTypes.LONG) + .put(ShortTag.class, BinaryTagTypes.SHORT) + .put(StringTag.class, BinaryTagTypes.STRING) + .build(); + + private static final Map, Function> CONVERSION; + + static { + ImmutableMap.Builder, Function> conversion = + ImmutableMap.builder(); + + for (Map.Entry, BinaryTagType> tag : TAG_TYPES.entrySet()) { + Constructor[] constructors = tag.getKey().getConstructors(); + for (Constructor c : constructors) { + if (c.getParameterCount() == 1 && BinaryTag.class.isAssignableFrom(c.getParameterTypes()[0])) { + conversion.put(tag.getValue(), binaryTag -> { + try { + return (Tag) c.newInstance(binaryTag); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalStateException(e); + } catch (InvocationTargetException e) { + // I assume this is always a RuntimeException since we control the ctor + throw (RuntimeException) e.getCause(); + } + }); + break; + } + } } - } - - public static DoubleTag fromAdventure(DoubleBinaryTag other) { - return new DoubleTag(other); - } - - public static ShortTag fromAdventure(ShortBinaryTag other) { - return new ShortTag(other); - } - - public static FloatTag fromAdventure(FloatBinaryTag other) { - return new FloatTag(other); - } - public static CompoundTag fromAdventure(CompoundBinaryTag other) { - return new CompoundTag(other); + CONVERSION = conversion.build(); } - public static ByteArrayTag fromAdventure(ByteArrayBinaryTag other) { - return new ByteArrayTag(other); + public static BinaryTagType getAdventureType(Class type) { + return Objects.requireNonNull(TAG_TYPES.get(type), () -> "Missing entry for " + type); } - public static ByteTag fromAdventure(ByteBinaryTag other) { - return new ByteTag(other); + public static Class getJNBTType(BinaryTagType type) { + return Objects.requireNonNull(TAG_TYPES.inverse().get(type), () -> "Missing entry for " + type); } - public static IntTag fromAdventure(IntBinaryTag other) { - return new IntTag(other); - } - - public static StringTag fromAdventure(StringBinaryTag other) { - return new StringTag(other); - } - - public static LongArrayTag fromAdventure(LongArrayBinaryTag other) { - return new LongArrayTag(other); - } - - public static LongTag fromAdventure(LongBinaryTag other) { - return new LongTag(other); - } - - public static EndTag fromAdventure() { - return new EndTag(); - } - - public static ListTag fromAdventure(ListBinaryTag other) { - return new ListTag(other); + private AdventureNBTConverter() { } - public static IntArrayTag fromAdventure(IntArrayBinaryTag other) { - return new IntArrayTag(other); + public static Tag fromAdventure(BinaryTag other) { + Function conversion = CONVERSION.get(other.type()); + if (conversion == null) { + throw new IllegalArgumentException("Can't convert other of type " + other.getClass().getCanonicalName()); + } + return conversion.apply(other); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java index 6c511e63c3..279e7a71a7 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java @@ -43,7 +43,7 @@ public ByteArrayTag(byte[] value) { this.innerTag = ByteArrayBinaryTag.of(value); } - ByteArrayTag(ByteArrayBinaryTag adventureTag) { + public ByteArrayTag(ByteArrayBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java index 834f1ba7e4..2a804a1f24 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java @@ -41,7 +41,7 @@ public ByteTag(byte value) { this.innerTag = ByteBinaryTag.of(value); } - ByteTag(ByteBinaryTag adventureTag) { + public ByteTag(ByteBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } 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 c2e02b3585..247d6eaee8 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java @@ -19,13 +19,16 @@ package com.sk89q.jnbt; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagLike; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.NumberBinaryTag; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; /** * The {@code TAG_Compound} tag. @@ -35,7 +38,7 @@ @Deprecated public final class CompoundTag extends Tag { - private final Map value; + private final CompoundBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -43,17 +46,13 @@ public final class CompoundTag extends Tag { * @param value the value of the tag */ public CompoundTag(Map value) { - super(); - this.value = Collections.unmodifiableMap(value); + this(CompoundBinaryTag.builder() + .put(Maps.transformValues(value, BinaryTagLike::asBinaryTag)) + .build()); } - CompoundTag(CompoundBinaryTag adventureTag) { - Set tags = adventureTag.keySet(); - Map map = new HashMap<>(); - for (String tagName : tags) { - map.put(tagName, AdventureNBTConverter.fromAdventure(adventureTag.get(tagName))); - } - this.value = Collections.unmodifiableMap(map); + public CompoundTag(CompoundBinaryTag adventureTag) { + this.innerTag = adventureTag; } /** @@ -63,12 +62,16 @@ public CompoundTag(Map value) { * @return true if the tag contains the given key */ public boolean containsKey(String key) { - return value.containsKey(key); + return innerTag.keySet().contains(key); } @Override public Map getValue() { - return value; + ImmutableMap.Builder map = ImmutableMap.builder(); + for (String key : innerTag.keySet()) { + map.put(key, AdventureNBTConverter.fromAdventure(innerTag.get(key))); + } + return map.build(); } /** @@ -87,7 +90,7 @@ public CompoundTag setValue(Map value) { * @return the builder */ public CompoundTagBuilder createBuilder() { - return new CompoundTagBuilder(new HashMap<>(value)); + return new CompoundTagBuilder(innerTag); } /** @@ -100,12 +103,7 @@ public CompoundTagBuilder createBuilder() { * @return a byte array */ public byte[] getByteArray(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteArrayTag) { - return ((ByteArrayTag) tag).getValue(); - } else { - return new byte[0]; - } + return this.innerTag.getByteArray(key); } /** @@ -118,12 +116,7 @@ public byte[] getByteArray(String key) { * @return a byte */ public byte getByte(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else { - return (byte) 0; - } + return this.innerTag.getByte(key); } /** @@ -136,12 +129,7 @@ public byte getByte(String key) { * @return a double */ public double getDouble(String key) { - Tag tag = value.get(key); - if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getDouble(key); } /** @@ -155,28 +143,11 @@ public double getDouble(String key) { * @return a double */ public double asDouble(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - - } else { - return 0; + BinaryTag tag = this.innerTag.get(key); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).doubleValue(); } + return 0; } /** @@ -189,12 +160,7 @@ public double asDouble(String key) { * @return a float */ public float getFloat(String key) { - Tag tag = value.get(key); - if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getFloat(key); } /** @@ -207,12 +173,7 @@ public float getFloat(String key) { * @return an int array */ public int[] getIntArray(String key) { - Tag tag = value.get(key); - if (tag instanceof IntArrayTag) { - return ((IntArrayTag) tag).getValue(); - } else { - return new int[0]; - } + return this.innerTag.getIntArray(key); } /** @@ -225,12 +186,7 @@ public int[] getIntArray(String key) { * @return an int */ public int getInt(String key) { - Tag tag = value.get(key); - if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getInt(key); } /** @@ -244,28 +200,11 @@ public int getInt(String key) { * @return an int */ public int asInt(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue().intValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().intValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().intValue(); - - } else { - return 0; + BinaryTag tag = this.innerTag.get(key); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).intValue(); } + return 0; } /** @@ -278,12 +217,7 @@ public int asInt(String key) { * @return a list of tags */ public List getList(String key) { - Tag tag = value.get(key); - if (tag instanceof ListTag) { - return ((ListTag) tag).getValue(); - } else { - return Collections.emptyList(); - } + return getListTag(key).getValue(); } /** @@ -296,12 +230,7 @@ public List getList(String key) { * @return a tag list instance */ public ListTag getListTag(String key) { - Tag tag = value.get(key); - if (tag instanceof ListTag) { - return (ListTag) tag; - } else { - return new ListTag(StringTag.class, Collections.emptyList()); - } + return new ListTag(this.innerTag.getList(key)); } /** @@ -319,14 +248,9 @@ public ListTag getListTag(String key) { */ @SuppressWarnings("unchecked") public List getList(String key, Class listType) { - Tag tag = value.get(key); - if (tag instanceof ListTag) { - ListTag listTag = (ListTag) tag; - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } + ListTag listTag = getListTag(key); + if (listTag.getType().equals(listType)) { + return (List) listTag.getValue(); } else { return Collections.emptyList(); } @@ -342,12 +266,7 @@ public List getList(String key, Class listType) { * @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]; - } + return this.innerTag.getLongArray(key); } /** @@ -360,12 +279,7 @@ public long[] getLongArray(String key) { * @return a long */ public long getLong(String key) { - Tag tag = value.get(key); - if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else { - return 0L; - } + return this.innerTag.getLong(key); } /** @@ -379,28 +293,11 @@ public long getLong(String key) { * @return a long */ public long asLong(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().longValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().longValue(); - - } else { - return 0L; + BinaryTag tag = this.innerTag.get(key); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).longValue(); } + return 0; } /** @@ -413,12 +310,7 @@ public long asLong(String key) { * @return a short */ public short getShort(String key) { - Tag tag = value.get(key); - if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getShort(key); } /** @@ -431,20 +323,11 @@ public short getShort(String key) { * @return a string */ public String getString(String key) { - Tag tag = value.get(key); - if (tag instanceof StringTag) { - return ((StringTag) tag).getValue(); - } else { - return ""; - } + return this.innerTag.getString(key); } @Override public CompoundBinaryTag asBinaryTag() { - CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder(); - for (Map.Entry child : getValue().entrySet()) { - builder.put(child.getKey(), child.getValue().asBinaryTag()); - } - return builder.build(); + return this.innerTag; } } 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 941fe9fa71..198176916b 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java @@ -19,8 +19,10 @@ package com.sk89q.jnbt; -import java.util.HashMap; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; + import java.util.Map; +import java.util.Objects; import static com.google.common.base.Preconditions.checkNotNull; @@ -32,23 +34,24 @@ @Deprecated public class CompoundTagBuilder { - private final Map entries; + private final CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder(); /** * Create a new instance. */ CompoundTagBuilder() { - this.entries = new HashMap<>(); } /** * Create a new instance and use the given map (which will be modified). * - * @param value the value + * @param source the value */ - CompoundTagBuilder(Map value) { - checkNotNull(value); - this.entries = value; + CompoundTagBuilder(CompoundBinaryTag source) { + checkNotNull(source); + for (String key : source.keySet()) { + this.builder.put(key, Objects.requireNonNull(source.get(key))); + } } /** @@ -61,7 +64,7 @@ public class CompoundTagBuilder { public CompoundTagBuilder put(String key, Tag value) { checkNotNull(key); checkNotNull(value); - entries.put(key, value); + this.builder.put(key, value.asBinaryTag()); return this; } @@ -74,7 +77,8 @@ public CompoundTagBuilder put(String key, Tag value) { * @return this object */ public CompoundTagBuilder putByteArray(String key, byte[] value) { - return put(key, new ByteArrayTag(value)); + this.builder.putByteArray(key, value); + return this; } /** @@ -86,7 +90,8 @@ public CompoundTagBuilder putByteArray(String key, byte[] value) { * @return this object */ public CompoundTagBuilder putByte(String key, byte value) { - return put(key, new ByteTag(value)); + this.builder.putByte(key, value); + return this; } /** @@ -98,7 +103,8 @@ public CompoundTagBuilder putByte(String key, byte value) { * @return this object */ public CompoundTagBuilder putDouble(String key, double value) { - return put(key, new DoubleTag(value)); + this.builder.putDouble(key, value); + return this; } /** @@ -110,7 +116,8 @@ public CompoundTagBuilder putDouble(String key, double value) { * @return this object */ public CompoundTagBuilder putFloat(String key, float value) { - return put(key, new FloatTag(value)); + this.builder.putFloat(key, value); + return this; } /** @@ -122,7 +129,8 @@ public CompoundTagBuilder putFloat(String key, float value) { * @return this object */ public CompoundTagBuilder putIntArray(String key, int[] value) { - return put(key, new IntArrayTag(value)); + this.builder.putIntArray(key, value); + return this; } /** @@ -133,7 +141,8 @@ public CompoundTagBuilder putIntArray(String key, int[] value) { * @return this object */ public CompoundTagBuilder putInt(String key, int value) { - return put(key, new IntTag(value)); + this.builder.putInt(key, value); + return this; } /** @@ -145,7 +154,8 @@ public CompoundTagBuilder putInt(String key, int value) { * @return this object */ public CompoundTagBuilder putLongArray(String key, long[] value) { - return put(key, new LongArrayTag(value)); + this.builder.putLongArray(key, value); + return this; } /** @@ -157,7 +167,8 @@ public CompoundTagBuilder putLongArray(String key, long[] value) { * @return this object */ public CompoundTagBuilder putLong(String key, long value) { - return put(key, new LongTag(value)); + this.builder.putLong(key, value); + return this; } /** @@ -169,7 +180,8 @@ public CompoundTagBuilder putLong(String key, long value) { * @return this object */ public CompoundTagBuilder putShort(String key, short value) { - return put(key, new ShortTag(value)); + this.builder.putShort(key, value); + return this; } /** @@ -181,7 +193,8 @@ public CompoundTagBuilder putShort(String key, short value) { * @return this object */ public CompoundTagBuilder putString(String key, String value) { - return put(key, new StringTag(value)); + this.builder.putString(key, value); + return this; } /** @@ -192,7 +205,7 @@ public CompoundTagBuilder putString(String key, String value) { */ public CompoundTagBuilder remove(String key) { checkNotNull(key); - entries.remove(key); + this.builder.remove(key); return this; } @@ -216,7 +229,7 @@ public CompoundTagBuilder putAll(Map value) { * @return the new compound tag */ public CompoundTag build() { - return new CompoundTag(new HashMap<>(entries)); + return new CompoundTag(this.builder.build()); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java index 769cee761b..12cc99f1c4 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java @@ -41,7 +41,7 @@ public DoubleTag(double value) { this.innerTag = DoubleBinaryTag.of(value); } - DoubleTag(DoubleBinaryTag adventureTag) { + public DoubleTag(DoubleBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java index 2477caa93d..80ebbd7cd3 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java @@ -41,7 +41,7 @@ public FloatTag(float value) { this.innerTag = FloatBinaryTag.of(value); } - FloatTag(FloatBinaryTag adventureTag) { + public FloatTag(FloatBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java index 1146ac1e66..86bb182a9b 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java @@ -44,7 +44,7 @@ public IntArrayTag(int[] value) { this.innerTag = IntArrayBinaryTag.of(value); } - IntArrayTag(IntArrayBinaryTag adventureTag) { + public IntArrayTag(IntArrayBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java index 8583579c03..fd7076eb27 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java @@ -41,7 +41,7 @@ public IntTag(int value) { this.innerTag = IntBinaryTag.of(value); } - IntTag(IntBinaryTag adventureTag) { + public IntTag(IntBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java index 39023d0226..15bc76afb7 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java @@ -20,15 +20,17 @@ package com.sk89q.jnbt; import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagLike; import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NumberBinaryTag; -import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.IntFunction; +import java.util.function.Supplier; +import java.util.stream.Collectors; import javax.annotation.Nullable; -import static com.google.common.base.Preconditions.checkNotNull; - /** * The {@code TAG_List} tag. * @@ -37,8 +39,7 @@ @Deprecated public final class ListTag extends Tag { - private final Class type; - private final List value; + private final ListBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -47,37 +48,19 @@ public final class ListTag extends Tag { * @param value the value of the tag */ public ListTag(Class type, List value) { - super(); - checkNotNull(value); - this.type = type; - this.value = Collections.unmodifiableList(value); + this(ListBinaryTag.of( + AdventureNBTConverter.getAdventureType(type), + value.stream().map(BinaryTagLike::asBinaryTag).collect(Collectors.toList()) + )); } - ListTag(ListBinaryTag adventureTag) { - super(); - List list = new ArrayList<>(); - Class listClass = StringTag.class; - int tags = adventureTag.size(); - for (int i = 0; i < tags; i++) { - Tag child = AdventureNBTConverter.fromAdventure(adventureTag.get(0)); - list.add(child); - listClass = child.getClass(); - } - - this.type = listClass; - this.value = Collections.unmodifiableList(list); + public ListTag(ListBinaryTag adventureTag) { + this.innerTag = adventureTag; } @Override public ListBinaryTag asBinaryTag() { - ListBinaryTag.Builder builder = ListBinaryTag.builder(); - for (Tag child : getValue()) { - if (child instanceof EndTag) { - continue; - } - builder.add(child.asBinaryTag()); - } - return builder.build(); + return this.innerTag; } /** @@ -86,12 +69,14 @@ public ListBinaryTag asBinaryTag() { * @return The type of item in this list. */ public Class getType() { - return type; + return AdventureNBTConverter.getJNBTType(this.innerTag.elementType()); } @Override public List getValue() { - return value; + return this.innerTag.stream() + .map(AdventureNBTConverter::fromAdventure) + .collect(Collectors.toList()); } /** @@ -104,6 +89,13 @@ public ListTag setValue(List list) { return new ListTag(getType(), list); } + private T accessIfExists(int index, Supplier defaultValue, IntFunction accessor) { + if (index >= this.innerTag.size()) { + return defaultValue.get(); + } + return accessor.apply(index); + } + /** * Get the tag if it exists at the given index. * @@ -112,10 +104,11 @@ public ListTag setValue(List list) { */ @Nullable public Tag getIfExists(int index) { - if (index >= value.size()) { - return null; - } - return value.get(index); + return accessIfExists( + index, + () -> null, + i -> AdventureNBTConverter.fromAdventure(this.innerTag.get(i)) + ); } /** @@ -128,12 +121,11 @@ public Tag getIfExists(int index) { * @return a byte array */ public byte[] getByteArray(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteArrayTag) { - return ((ByteArrayTag) tag).getValue(); - } else { - return new byte[0]; - } + return accessIfExists( + index, + () -> new byte[0], + this.innerTag::getByteArray + ); } /** @@ -146,12 +138,11 @@ public byte[] getByteArray(int index) { * @return a byte */ public byte getByte(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else { - return (byte) 0; - } + return accessIfExists( + index, + () -> (byte) 0, + this.innerTag::getByte + ); } /** @@ -164,12 +155,11 @@ public byte getByte(int index) { * @return a double */ public double getDouble(int index) { - Tag tag = getIfExists(index); - if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> 0.0, + this.innerTag::getDouble + ); } /** @@ -183,28 +173,17 @@ public double getDouble(int index) { * @return a double */ public double asDouble(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - - } else { - return 0; - } + return accessIfExists( + index, + () -> 0.0, + i -> { + BinaryTag tag = this.innerTag.get(i); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).doubleValue(); + } + return 0.0; + } + ); } /** @@ -217,12 +196,11 @@ public double asDouble(int index) { * @return a float */ public float getFloat(int index) { - Tag tag = getIfExists(index); - if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> 0.0f, + this.innerTag::getFloat + ); } /** @@ -235,12 +213,11 @@ public float getFloat(int index) { * @return an int array */ public int[] getIntArray(int index) { - Tag tag = getIfExists(index); - if (tag instanceof IntArrayTag) { - return ((IntArrayTag) tag).getValue(); - } else { - return new int[0]; - } + return accessIfExists( + index, + () -> new int[0], + this.innerTag::getIntArray + ); } /** @@ -253,12 +230,11 @@ public int[] getIntArray(int index) { * @return an int */ public int getInt(int index) { - Tag tag = getIfExists(index); - if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> 0, + this.innerTag::getInt + ); } /** @@ -272,28 +248,17 @@ public int getInt(int index) { * @return an int */ public int asInt(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue().intValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().intValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().intValue(); - - } else { - return 0; - } + return accessIfExists( + index, + () -> 0, + i -> { + BinaryTag tag = this.innerTag.get(i); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).intValue(); + } + return 0; + } + ); } /** @@ -306,12 +271,7 @@ public int asInt(int index) { * @return a list of tags */ public List getList(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - return ((ListTag) tag).getValue(); - } else { - return Collections.emptyList(); - } + return getListTag(index).getValue(); } /** @@ -324,12 +284,11 @@ public List getList(int index) { * @return a tag list instance */ public ListTag getListTag(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - return (ListTag) tag; - } else { - return new ListTag(StringTag.class, Collections.emptyList()); - } + return new ListTag(accessIfExists( + index, + ListBinaryTag::empty, + this.innerTag::getList + )); } /** @@ -347,14 +306,9 @@ public ListTag getListTag(int index) { */ @SuppressWarnings("unchecked") public List getList(int index, Class listType) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - ListTag listTag = (ListTag) tag; - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } + ListTag listTag = getListTag(index); + if (listTag.getType().equals(listType)) { + return (List) listTag.getValue(); } else { return Collections.emptyList(); } @@ -370,12 +324,11 @@ public List getList(int index, Class listType) { * @return a long */ public long getLong(int index) { - Tag tag = getIfExists(index); - if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else { - return 0L; - } + return accessIfExists( + index, + () -> 0L, + this.innerTag::getLong + ); } /** @@ -389,28 +342,17 @@ public long getLong(int index) { * @return a long */ public long asLong(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().longValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().longValue(); - - } else { - return 0; - } + return accessIfExists( + index, + () -> 0L, + i -> { + BinaryTag tag = this.innerTag.get(i); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).longValue(); + } + return 0L; + } + ); } /** @@ -423,12 +365,11 @@ public long asLong(int index) { * @return a short */ public short getShort(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> (short) 0, + this.innerTag::getShort + ); } /** @@ -441,12 +382,11 @@ public short getShort(int index) { * @return a string */ public String getString(int index) { - Tag tag = getIfExists(index); - if (tag instanceof StringTag) { - return ((StringTag) tag).getValue(); - } else { - return ""; - } + return accessIfExists( + index, + () -> "", + this.innerTag::getString + ); } } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java index ad3a6e25cf..df19227036 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java @@ -19,10 +19,12 @@ package com.sk89q.jnbt; -import java.util.ArrayList; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagType; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; + import java.util.Arrays; import java.util.Collection; -import java.util.List; import static com.google.common.base.Preconditions.checkNotNull; @@ -34,18 +36,19 @@ @Deprecated public class ListTagBuilder { - private final Class type; - private final List entries; + private final ListBinaryTag.Builder builder; /** * Create a new instance. * * @param type of tag contained in this list */ + @SuppressWarnings("unchecked") ListTagBuilder(Class type) { checkNotNull(type); - this.type = type; - this.entries = new ArrayList<>(); + this.builder = type != EndTag.class + ? ListBinaryTag.builder((BinaryTagType) AdventureNBTConverter.getAdventureType(type)) + : ListBinaryTag.builder(); } /** @@ -56,10 +59,7 @@ public class ListTagBuilder { */ public ListTagBuilder add(Tag value) { checkNotNull(value); - if (!type.isInstance(value)) { - throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + type.getCanonicalName()); - } - entries.add(value); + builder.add(value.asBinaryTag()); return this; } @@ -83,7 +83,7 @@ public ListTagBuilder addAll(Collection value) { * @return the new list tag */ public ListTag build() { - return new ListTag(type, new ArrayList<>(entries)); + return new ListTag(this.builder.build()); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java index 7ca5df0dc2..cd177c8601 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java @@ -44,7 +44,7 @@ public LongArrayTag(long[] value) { this.innerTag = LongArrayBinaryTag.of(value); } - LongArrayTag(LongArrayBinaryTag adventureTag) { + public LongArrayTag(LongArrayBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java index aa7e74f10d..35c6b0fe58 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java @@ -41,7 +41,7 @@ public LongTag(long value) { this.innerTag = LongBinaryTag.of(value); } - LongTag(LongBinaryTag adventureTag) { + public LongTag(LongBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } 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 9d65f5e79d..dc6a7125f9 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java @@ -19,9 +19,6 @@ package com.sk89q.jnbt; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - /** * A class which holds constant values. * @@ -30,8 +27,6 @@ @Deprecated public final class NBTConstants { - public static final Charset CHARSET = StandardCharsets.UTF_8; - public static final int TYPE_END = 0; public static final int TYPE_BYTE = 1; public static final int TYPE_SHORT = 2; 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 52d21ca451..46a11ee202 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java @@ -87,36 +87,7 @@ public static String getTypeName(Class clazz) { * @throws IllegalArgumentException if the tag class is invalid. */ public static int getTypeCode(Class clazz) { - if (clazz.equals(ByteArrayTag.class)) { - return NBTConstants.TYPE_BYTE_ARRAY; - } else if (clazz.equals(ByteTag.class)) { - return NBTConstants.TYPE_BYTE; - } else if (clazz.equals(CompoundTag.class)) { - return NBTConstants.TYPE_COMPOUND; - } else if (clazz.equals(DoubleTag.class)) { - return NBTConstants.TYPE_DOUBLE; - } else if (clazz.equals(EndTag.class)) { - return NBTConstants.TYPE_END; - } else if (clazz.equals(FloatTag.class)) { - return NBTConstants.TYPE_FLOAT; - } else if (clazz.equals(IntTag.class)) { - return NBTConstants.TYPE_INT; - } else if (clazz.equals(ListTag.class)) { - return NBTConstants.TYPE_LIST; - } else if (clazz.equals(LongTag.class)) { - return NBTConstants.TYPE_LONG; - } else if (clazz.equals(ShortTag.class)) { - return NBTConstants.TYPE_SHORT; - } else if (clazz.equals(StringTag.class)) { - 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() + ")."); - } + return AdventureNBTConverter.getAdventureType(clazz).id(); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java index 486ae69a67..b045f231b0 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java @@ -41,7 +41,7 @@ public ShortTag(short value) { this.innerTag = ShortBinaryTag.of(value); } - ShortTag(ShortBinaryTag adventureTag) { + public ShortTag(ShortBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java index 124f72f48b..7c5bb3aa52 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java @@ -44,7 +44,7 @@ public StringTag(String value) { this.innerTag = StringBinaryTag.of(value); } - StringTag(StringBinaryTag adventureTag) { + public StringTag(StringBinaryTag adventureTag) { super(); this.innerTag = adventureTag; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java index a26632e718..c07d23e1bb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -63,7 +63,7 @@ default boolean hasNbtData() { @Nullable default CompoundTag getNbtData() { CompoundBinaryTag tag = getNbt(); - return tag == null ? null : AdventureNBTConverter.fromAdventure(tag); + return tag == null ? null : new CompoundTag(tag); } /** @@ -78,10 +78,12 @@ default void setNbtData(@Nullable CompoundTag nbtData) { } /** - * Returns whether the block contains NBT data. {@link #getNbt()} ()} + * Returns whether the block contains NBT data. {@link #getNbt()} * must not return null if this method returns true. * * @return true if there is NBT data + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details */ @NonAbstractForCompatibility( delegateName = "hasNbtData", @@ -104,6 +106,8 @@ default boolean hasNbt() { * not return null.

* * @return compound tag, or null + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details */ @NonAbstractForCompatibility( delegateName = "getNbtData", @@ -121,6 +125,8 @@ default CompoundBinaryTag getNbt() { * Set the object's NBT data (tile entity data). * * @param nbtData NBT data, or null if no data + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details */ @NonAbstractForCompatibility( delegateName = "setNbtData", @@ -129,7 +135,7 @@ default CompoundBinaryTag getNbt() { default void setNbt(@Nullable CompoundBinaryTag nbtData) { DeprecationUtil.checkDelegatingOverride(getClass()); - setNbtData(nbtData == null ? null : AdventureNBTConverter.fromAdventure(nbtData)); + setNbtData(nbtData == null ? null : new CompoundTag(nbtData)); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java index cd908e1e6e..0c11bb8331 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java @@ -104,6 +104,8 @@ default BaseBlock toBaseBlock(CompoundTag compoundTag) { * * @param compoundTag The NBT Data to apply * @return The BaseBlock + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details */ @NonAbstractForCompatibility( delegateName = "toBaseBlock", @@ -112,7 +114,7 @@ default BaseBlock toBaseBlock(CompoundTag compoundTag) { default BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { DeprecationUtil.checkDelegatingOverride(getClass()); - return toBaseBlock(compoundTag == null ? null : AdventureNBTConverter.fromAdventure(compoundTag)); + return toBaseBlock(compoundTag == null ? null : new CompoundTag(compoundTag)); } @Override From e1cc6bc9485a9af71fd5c1b69a0b1fad8fa5779b Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sun, 14 Feb 2021 22:32:51 -0800 Subject: [PATCH 06/10] Revert changes to legacy files, deprecate --- .../worldedit/blocks/MobSpawnerBlock.java | 124 +++++++++--------- .../com/sk89q/worldedit/blocks/SignBlock.java | 23 ++-- .../sk89q/worldedit/blocks/SkullBlock.java | 22 ++-- .../com/sk89q/worldedit/util/NbtUtils.java | 12 +- 4 files changed, 97 insertions(+), 84 deletions(-) diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java index d88852f8ac..eadad40842 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java @@ -21,21 +21,27 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.sk89q.worldedit.util.NbtUtils; -import com.sk89q.worldedit.util.nbt.BinaryTag; -import com.sk89q.worldedit.util.nbt.BinaryTagTypes; -import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; -import com.sk89q.worldedit.util.nbt.IntBinaryTag; -import com.sk89q.worldedit.util.nbt.ListBinaryTag; -import com.sk89q.worldedit.util.nbt.ShortBinaryTag; -import com.sk89q.worldedit.util.nbt.StringBinaryTag; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.IntTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.NBTUtils; +import com.sk89q.jnbt.ShortTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.storage.InvalidFormatException; +import java.util.HashMap; +import java.util.Map; + /** * A mob spawner block. + * + * @deprecated WorldEdit does not handle interpreting NBT, + * deprecated for removal without replacement */ +@Deprecated public class MobSpawnerBlock extends BaseBlock { private String mobType; @@ -44,8 +50,8 @@ public class MobSpawnerBlock extends BaseBlock { // advanced mob spawner features private short spawnCount = 4; private short spawnRange = 4; - private CompoundBinaryTag spawnData; - private ListBinaryTag spawnPotentials; + private CompoundTag spawnData; + private ListTag spawnPotentials; private short minSpawnDelay = 200; private short maxSpawnDelay = 800; private short maxNearbyEntities = 6; @@ -108,7 +114,7 @@ public void setDelay(short delay) { } @Override - public boolean hasNbt() { + public boolean hasNbtData() { return true; } @@ -118,52 +124,50 @@ public String getNbtId() { } @Override - public CompoundBinaryTag getNbt() { - CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - values.put("Delay", ShortBinaryTag.of(delay)); - values.put("SpawnCount", ShortBinaryTag.of(spawnCount)); - values.put("SpawnRange", ShortBinaryTag.of(spawnRange)); - values.put("MinSpawnDelay", ShortBinaryTag.of(minSpawnDelay)); - values.put("MaxSpawnDelay", ShortBinaryTag.of(maxSpawnDelay)); - values.put("MaxNearbyEntities", ShortBinaryTag.of(maxNearbyEntities)); - values.put("RequiredPlayerRange", ShortBinaryTag.of(requiredPlayerRange)); + public CompoundTag getNbtData() { + Map values = new HashMap<>(); + values.put("Delay", new ShortTag(delay)); + values.put("SpawnCount", new ShortTag(spawnCount)); + values.put("SpawnRange", new ShortTag(spawnRange)); + values.put("MinSpawnDelay", new ShortTag(minSpawnDelay)); + values.put("MaxSpawnDelay", new ShortTag(maxSpawnDelay)); + values.put("MaxNearbyEntities", new ShortTag(maxNearbyEntities)); + values.put("RequiredPlayerRange", new ShortTag(requiredPlayerRange)); if (spawnData == null) { - values.put("SpawnData", CompoundBinaryTag.builder().put("id", StringBinaryTag.of(mobType)).build()); + values.put("SpawnData", new CompoundTag(ImmutableMap.of("id", new StringTag(mobType)))); } else { - values.put("SpawnData", spawnData); + values.put("SpawnData", new CompoundTag(spawnData.getValue())); } if (spawnPotentials == null) { - values.put("SpawnPotentials", ListBinaryTag.of( - BinaryTagTypes.COMPOUND, - ImmutableList.of(CompoundBinaryTag.from(ImmutableMap.of( - "Weight", IntBinaryTag.of(1), - "Entity", CompoundBinaryTag.from(ImmutableMap.of("id", StringBinaryTag.of(mobType))) - ))) - )); + values.put("SpawnPotentials", new ListTag(CompoundTag.class, ImmutableList.of( + new CompoundTag(ImmutableMap.of("Weight", new IntTag(1), "Entity", + new CompoundTag(ImmutableMap.of("id", new StringTag(mobType)))))))); } else { - values.put("SpawnPotentials", spawnPotentials); + values.put("SpawnPotentials", new ListTag(CompoundTag.class, spawnPotentials.getValue())); } - return values.build(); + return new CompoundTag(values); } @Override - public void setNbt(CompoundBinaryTag rootTag) { + public void setNbtData(CompoundTag rootTag) { if (rootTag == null) { return; } - BinaryTag t = rootTag.get("id"); - if (!(t instanceof StringBinaryTag) || !((StringBinaryTag) t).value().equals(getNbtId())) { + Map values = rootTag.getValue(); + + Tag t = values.get("id"); + if (!(t instanceof StringTag) || !((StringTag) t).getValue().equals(getNbtId())) { throw new RuntimeException(String.format("'%s' tile entity expected", getNbtId())); } - CompoundBinaryTag spawnDataTag; + CompoundTag spawnDataTag; String mobType; - ShortBinaryTag delayTag; + ShortTag delayTag; try { - spawnDataTag = NbtUtils.getChildTag(rootTag, "SpawnData", CompoundBinaryTag.class); + spawnDataTag = NBTUtils.getChildTag(values, "SpawnData", CompoundTag.class); mobType = spawnDataTag.getString("id"); if (mobType.equals("")) { throw new InvalidFormatException("No spawn id."); @@ -174,68 +178,68 @@ public void setNbt(CompoundBinaryTag rootTag) { throw new RuntimeException("Invalid mob spawner data: no SpawnData and/or no Delay"); } try { - delayTag = NbtUtils.getChildTag(rootTag, "Delay", ShortBinaryTag.class); - this.delay = delayTag.value(); + delayTag = NBTUtils.getChildTag(values, "Delay", ShortTag.class); + this.delay = delayTag.getValue(); } catch (InvalidFormatException ignored) { this.delay = -1; } - ShortBinaryTag spawnCountTag = null; - ShortBinaryTag spawnRangeTag = null; - ShortBinaryTag minSpawnDelayTag = null; - ShortBinaryTag maxSpawnDelayTag = null; - ShortBinaryTag maxNearbyEntitiesTag = null; - ShortBinaryTag requiredPlayerRangeTag = null; - ListBinaryTag spawnPotentialsTag = null; + ShortTag spawnCountTag = null; + ShortTag spawnRangeTag = null; + ShortTag minSpawnDelayTag = null; + ShortTag maxSpawnDelayTag = null; + ShortTag maxNearbyEntitiesTag = null; + ShortTag requiredPlayerRangeTag = null; + ListTag spawnPotentialsTag = null; try { - spawnCountTag = NbtUtils.getChildTag(rootTag, "SpawnCount", ShortBinaryTag.class); + spawnCountTag = NBTUtils.getChildTag(values, "SpawnCount", ShortTag.class); } catch (InvalidFormatException ignored) { } try { - spawnRangeTag = NbtUtils.getChildTag(rootTag, "SpawnRange", ShortBinaryTag.class); + spawnRangeTag = NBTUtils.getChildTag(values, "SpawnRange", ShortTag.class); } catch (InvalidFormatException ignored) { } try { - minSpawnDelayTag = NbtUtils.getChildTag(rootTag, "MinSpawnDelay", ShortBinaryTag.class); + minSpawnDelayTag = NBTUtils.getChildTag(values, "MinSpawnDelay", ShortTag.class); } catch (InvalidFormatException ignored) { } try { - maxSpawnDelayTag = NbtUtils.getChildTag(rootTag, "MaxSpawnDelay", ShortBinaryTag.class); + maxSpawnDelayTag = NBTUtils.getChildTag(values, "MaxSpawnDelay", ShortTag.class); } catch (InvalidFormatException ignored) { } try { - maxNearbyEntitiesTag = NbtUtils.getChildTag(rootTag, "MaxNearbyEntities", ShortBinaryTag.class); + maxNearbyEntitiesTag = NBTUtils.getChildTag(values, "MaxNearbyEntities", ShortTag.class); } catch (InvalidFormatException ignored) { } try { - requiredPlayerRangeTag = NbtUtils.getChildTag(rootTag, "RequiredPlayerRange", ShortBinaryTag.class); + requiredPlayerRangeTag = NBTUtils.getChildTag(values, "RequiredPlayerRange", ShortTag.class); } catch (InvalidFormatException ignored) { } try { - spawnPotentialsTag = NbtUtils.getChildTag(rootTag, "SpawnPotentials", ListBinaryTag.class); + spawnPotentialsTag = NBTUtils.getChildTag(values, "SpawnPotentials", ListTag.class); } catch (InvalidFormatException ignored) { } if (spawnCountTag != null) { - this.spawnCount = spawnCountTag.value(); + this.spawnCount = spawnCountTag.getValue(); } if (spawnRangeTag != null) { - this.spawnRange = spawnRangeTag.value(); + this.spawnRange = spawnRangeTag.getValue(); } if (minSpawnDelayTag != null) { - this.minSpawnDelay = minSpawnDelayTag.value(); + this.minSpawnDelay = minSpawnDelayTag.getValue(); } if (maxSpawnDelayTag != null) { - this.maxSpawnDelay = maxSpawnDelayTag.value(); + this.maxSpawnDelay = maxSpawnDelayTag.getValue(); } if (maxNearbyEntitiesTag != null) { - this.maxNearbyEntities = maxNearbyEntitiesTag.value(); + this.maxNearbyEntities = maxNearbyEntitiesTag.getValue(); } if (requiredPlayerRangeTag != null) { - this.requiredPlayerRange = requiredPlayerRangeTag.value(); + this.requiredPlayerRange = requiredPlayerRangeTag.getValue(); } if (spawnPotentialsTag != null) { - this.spawnPotentials = spawnPotentialsTag; + this.spawnPotentials = new ListTag(CompoundTag.class, spawnPotentialsTag.getValue()); } } diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java index a52442285e..070df964ff 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java @@ -23,16 +23,19 @@ import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.util.gson.GsonUtil; -import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; -import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; +import java.util.HashMap; import java.util.Map; /** * Represents a sign block. + * + * @deprecated WorldEdit does not handle interpreting NBT, + * deprecated for removal without replacement */ +@Deprecated public class SignBlock extends BaseBlock { private String[] text; @@ -83,7 +86,7 @@ public void setText(String[] text) { } @Override - public boolean hasNbt() { + public boolean hasNbtData() { return true; } @@ -93,13 +96,13 @@ public String getNbtId() { } @Override - public CompoundBinaryTag getNbt() { - CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - values.put("Text1", StringBinaryTag.of(text[0])); - values.put("Text2", StringBinaryTag.of(text[1])); - values.put("Text3", StringBinaryTag.of(text[2])); - values.put("Text4", StringBinaryTag.of(text[3])); - return values.build(); + public CompoundTag getNbtData() { + Map values = new HashMap<>(); + values.put("Text1", new StringTag(text[0])); + values.put("Text2", new StringTag(text[1])); + values.put("Text3", new StringTag(text[2])); + values.put("Text4", new StringTag(text[3])); + return new CompoundTag(values); } @Override diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java index e33b7fe830..88d0fe593a 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java @@ -19,21 +19,23 @@ package com.sk89q.worldedit.blocks; -import com.google.common.collect.ImmutableMap; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.internal.util.DeprecationUtil; -import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; -import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; +import java.util.HashMap; import java.util.Map; /** * A skull block. + * + * @deprecated WorldEdit does not handle interpreting NBT, + * deprecated for removal without replacement */ +@Deprecated public class SkullBlock extends BaseBlock { private String owner = ""; // notchian @@ -83,7 +85,7 @@ public String getOwner() { } @Override - public boolean hasNbt() { + public boolean hasNbtData() { return true; } @@ -93,12 +95,12 @@ public String getNbtId() { } @Override - public CompoundBinaryTag getNbt() { - CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - values.put(DeprecationUtil.getHeadOwnerKey(), CompoundBinaryTag.from( - ImmutableMap.of("Name", StringBinaryTag.of(owner)) - )); - return values.build(); + public CompoundTag getNbtData() { + Map values = new HashMap<>(); + Map inner = new HashMap<>(); + inner.put("Name", new StringTag(owner)); + values.put(DeprecationUtil.getHeadOwnerKey(), new CompoundTag(inner)); + return new CompoundTag(values); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java index 17be01289b..190526bed1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.util; import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagType; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.storage.InvalidFormatException; @@ -34,16 +35,19 @@ public class NbtUtils { * @return child tag * @throws InvalidFormatException if the format of the items is invalid */ - public static T getChildTag(CompoundBinaryTag tag, String key, Class expected) throws InvalidFormatException { + public static T getChildTag(CompoundBinaryTag tag, String key, BinaryTagType expected) throws InvalidFormatException { BinaryTag childTag = tag.get(key); if (childTag == null) { throw new InvalidFormatException("Missing a \"" + key + "\" tag"); } - if (!expected.isInstance(childTag)) { - throw new InvalidFormatException(key + " tag is not of tag type " + expected.getName()); + if (childTag.type().id() != expected.id()) { + throw new InvalidFormatException(key + " tag is not of tag type " + expected.toString()); } - return expected.cast(childTag); + // SAFETY: same binary tag type checked above + @SuppressWarnings("unchecked") + T childTagCast = (T) childTag; + return childTagCast; } } From 23a4e2d6fd8936aeeb3fa4e6ec3f8549f2402e27 Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Mon, 15 Feb 2021 01:49:49 -0800 Subject: [PATCH 07/10] Lazily compute NBT --- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 12 ++-- .../com/sk89q/worldedit/LocalSession.java | 9 ++- .../com/sk89q/worldedit/blocks/BaseItem.java | 23 ++++--- .../sk89q/worldedit/blocks/BaseItemStack.java | 5 +- .../sk89q/worldedit/entity/BaseEntity.java | 20 +++---- .../factory/parser/DefaultItemParser.java | 3 +- .../internal/cui/ServerCUIHandler.java | 1 + .../util/collection/Int2BaseBlockMap.java | 2 +- .../util/concurrency/LazyReference.java | 15 +++++ .../worldedit/util/{ => nbt}/NbtUtils.java | 5 +- .../com/sk89q/worldedit/world/NbtValued.java | 60 ++++++++++--------- .../worldedit/world/block/BaseBlock.java | 50 ++++++---------- .../worldedit/world/block/BlockState.java | 13 +--- .../world/block/BlockStateHolder.java | 20 +++++-- .../worldedit/world/chunk/AnvilChunk.java | 21 ++++--- .../worldedit/world/chunk/AnvilChunk13.java | 18 +++--- .../sk89q/worldedit/world/chunk/OldChunk.java | 14 ++--- .../sk89q/worldedit/fabric/FabricAdapter.java | 19 ++++-- .../sk89q/worldedit/fabric/FabricEntity.java | 3 +- .../sk89q/worldedit/fabric/FabricWorld.java | 2 +- .../sk89q/worldedit/forge/ForgeAdapter.java | 19 +++--- .../sk89q/worldedit/forge/ForgeEntity.java | 6 +- .../com/sk89q/worldedit/forge/ForgeWorld.java | 2 +- .../forge/internal/NBTConverter.java | 2 +- .../sk89q/worldedit/sponge/SpongeWorld.java | 12 ++-- 25 files changed, 187 insertions(+), 169 deletions(-) rename worldedit-core/src/main/java/com/sk89q/worldedit/util/{ => nbt}/NbtUtils.java (90%) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 487dfb804a..95dd3216ff 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -39,6 +39,7 @@ import com.sk89q.worldedit.util.formatting.text.adapter.bukkit.TextAdapter; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.format.TextColor; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -295,11 +296,12 @@ public > void sendFakeBlock(BlockVector3 pos, B bl player.sendBlockChange(loc, player.getWorld().getBlockAt(loc).getBlockData()); } else { player.sendBlockChange(loc, BukkitAdapter.adapt(block)); - if (block instanceof BaseBlock && ((BaseBlock) block).hasNbt()) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - if (adapter != null) { - if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK) { - adapter.sendFakeNBT(player, pos, ((BaseBlock) block).getNbt()); + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter != null) { + if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK && block instanceof BaseBlock) { + CompoundBinaryTag nbt = ((BaseBlock) block).getNbt(); + if (nbt != null) { + adapter.sendFakeNBT(player, pos, nbt); adapter.sendFakeOP(player); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index 3b865ad80a..aeda2d98d7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -48,6 +48,7 @@ import com.sk89q.worldedit.session.request.Request; import com.sk89q.worldedit.util.Countable; import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; @@ -802,14 +803,16 @@ public void updateServerCUI(Actor actor) { } BaseBlock block = ServerCUIHandler.createStructureBlock(player); - if (block != null && block.hasNbt()) { - // If it's null, we don't need to do anything. The old was already removed. - CompoundBinaryTag tags = block.getNbt(); + if (block != null) { + CompoundBinaryTag tags = Objects.requireNonNull( + block.getNbt(), "createStructureBlock should return nbt" + ); BlockVector3 tempCuiTemporaryBlock = BlockVector3.at( tags.getInt("x"), tags.getInt("y"), tags.getInt("z") ); + // If it's null, we don't need to do anything. The old was already removed. if (cuiTemporaryBlock != null && !tempCuiTemporaryBlock.equals(cuiTemporaryBlock)) { // Update the existing block if it's the same location player.sendFakeBlock(cuiTemporaryBlock, null); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java index 180e80c903..16b979725b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java @@ -21,6 +21,7 @@ import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.TagStringIO; import com.sk89q.worldedit.world.NbtValued; @@ -41,7 +42,7 @@ public class BaseItem implements NbtValued { private ItemType itemType; @Nullable - private CompoundBinaryTag nbtData; + private LazyReference nbtData; /** * Construct the object. @@ -61,7 +62,7 @@ public BaseItem(ItemType itemType) { */ @Deprecated public BaseItem(ItemType itemType, @Nullable CompoundTag nbtData) { - this(itemType, nbtData == null ? null : nbtData.asBinaryTag()); + this(itemType, nbtData == null ? null : LazyReference.from(nbtData::asBinaryTag)); } /** @@ -70,7 +71,7 @@ public BaseItem(ItemType itemType, @Nullable CompoundTag nbtData) { * @param itemType Type of the item * @param tag NBT Compound tag */ - public BaseItem(ItemType itemType, @Nullable CompoundBinaryTag tag) { + public BaseItem(ItemType itemType, @Nullable LazyReference tag) { checkNotNull(itemType); this.itemType = itemType; this.nbtData = tag; @@ -94,30 +95,26 @@ public void setType(ItemType itemType) { this.itemType = itemType; } - @Override - public boolean hasNbt() { - return this.nbtData != null; - } - @Nullable @Override - public CompoundBinaryTag getNbt() { + public LazyReference getNbtReference() { return this.nbtData; } @Override - public void setNbt(@Nullable CompoundBinaryTag nbtData) { + public void setNbtReference(@Nullable LazyReference nbtData) { this.nbtData = nbtData; } @Override public String toString() { String nbtString = ""; - if (hasNbt()) { + LazyReference nbtData = this.nbtData; + if (nbtData != null) { try { - nbtString = TagStringIO.get().asString(nbtData); + nbtString = TagStringIO.get().asString(nbtData.getValue()); } catch (IOException e) { - WorldEdit.logger.error("Failed to parse NBT of Item", e); + WorldEdit.logger.error("Failed to serialize NBT of Item", e); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java index 461dc31dfc..8d9e4ab07d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java @@ -22,6 +22,7 @@ import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.item.ItemType; @@ -61,7 +62,7 @@ public BaseItemStack(ItemType itemType, int amount) { * @param id The item type * @param tag Tag value * @param amount amount in the stack - * @deprecated Use {@link #BaseItemStack(ItemType, CompoundBinaryTag, int)} + * @deprecated Use {@link #BaseItemStack(ItemType, LazyReference, int)} */ @Deprecated public BaseItemStack(ItemType id, CompoundTag tag, int amount) { @@ -76,7 +77,7 @@ public BaseItemStack(ItemType id, CompoundTag tag, int amount) { * @param tag Tag value * @param amount amount in the stack */ - public BaseItemStack(ItemType id, CompoundBinaryTag tag, int amount) { + public BaseItemStack(ItemType id, LazyReference tag, int amount) { super(id, tag); this.amount = amount; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java index ef26da7b80..ae6d856686 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.entity; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.NbtValued; import com.sk89q.worldedit.world.entity.EntityType; @@ -45,14 +46,14 @@ public class BaseEntity implements NbtValued { private final EntityType type; @Nullable - private CompoundBinaryTag nbtData; + private LazyReference nbtData; /** * Create a new base entity. * * @param type the entity type * @param nbtData NBT data - * @deprecated Use {@link BaseEntity#BaseEntity(EntityType, CompoundBinaryTag)} + * @deprecated Use {@link BaseEntity#BaseEntity(EntityType, LazyReference)} */ @Deprecated public BaseEntity(EntityType type, CompoundTag nbtData) { @@ -66,9 +67,9 @@ public BaseEntity(EntityType type, CompoundTag nbtData) { * @param type the entity type * @param nbtData NBT data */ - public BaseEntity(EntityType type, CompoundBinaryTag nbtData) { + public BaseEntity(EntityType type, LazyReference nbtData) { this(type); - setNbt(nbtData); + setNbtReference(nbtData); } /** @@ -88,22 +89,17 @@ public BaseEntity(EntityType type) { public BaseEntity(BaseEntity other) { checkNotNull(other); this.type = other.getType(); - setNbt(other.getNbt()); - } - - @Override - public boolean hasNbt() { - return true; + setNbtReference(other.getNbtReference()); } @Nullable @Override - public CompoundBinaryTag getNbt() { + public LazyReference getNbtReference() { return nbtData; } @Override - public void setNbt(@Nullable CompoundBinaryTag nbtData) { + public void setNbtReference(@Nullable LazyReference nbtData) { this.nbtData = nbtData; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java index 2a9d3bf8fc..fb7616394f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java @@ -30,6 +30,7 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.util.HandSide; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; @@ -132,7 +133,7 @@ public BaseItem parseFromInput(String input, ParserContext context) throws Input } } - item = new BaseItem(itemType, itemNbtData); + item = new BaseItem(itemType, itemNbtData == null ? null : LazyReference.computed(itemNbtData)); } return item; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java index 1624254215..20d52e013b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java @@ -28,6 +28,7 @@ import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.ByteBinaryTag; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java index 21d480d692..e3203d28cc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java @@ -50,7 +50,7 @@ class Int2BaseBlockMap extends AbstractInt2ObjectMap { * @return the internal ID, or {@link BlockStateIdAccess#invalidId()} if not useful */ private static int optimizedInternalId(BaseBlock block) { - if (block.hasNbt()) { + if (block.getNbtReference() != null) { return BlockStateIdAccess.invalidId(); } return BlockStateIdAccess.getBlockStateId(block.toImmutableState()); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java index f755b3fa02..8463cac91e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java @@ -32,6 +32,17 @@ public static LazyReference from(Supplier valueComputation) { return new LazyReference<>(valueComputation); } + /** + * Pre-computed reference, for setting a lazy reference field with a known value. + * + * @param value the value of the reference + * @param the type of the value + * @return the new reference + */ + public static LazyReference computed(T value) { + return new LazyReference<>(value); + } + // Memory saving technique: hold the computation info in the same reference field that we'll // put the value into, so the memory possibly retained by those parts is GC'able as soon as // it's no longer needed. @@ -51,6 +62,10 @@ private LazyReference(Supplier valueComputation) { this.value = new RefInfo<>(valueComputation); } + private LazyReference(T value) { + this.value = value; + } + // casts are safe, value is either RefInfo or T @SuppressWarnings("unchecked") public T getValue() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java similarity index 90% rename from worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java index 190526bed1..2c032e8bce 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/NbtUtils.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java @@ -17,11 +17,8 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.util; +package com.sk89q.worldedit.util.nbt; -import com.sk89q.worldedit.util.nbt.BinaryTag; -import com.sk89q.worldedit.util.nbt.BinaryTagType; -import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.storage.InvalidFormatException; public class NbtUtils { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java index c07d23e1bb..198a786308 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -19,10 +19,10 @@ package com.sk89q.worldedit.world; -import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import javax.annotation.Nullable; @@ -39,11 +39,11 @@ public interface NbtValued { * must not return null if this method returns true. * * @return true if there is NBT data - * @deprecated See {@link #hasNbt()} + * @deprecated See {@link #getNbt()} */ @Deprecated default boolean hasNbtData() { - return hasNbt(); + return getNbt() != null; } /** @@ -70,55 +70,48 @@ default CompoundTag getNbtData() { * Set the object's NBT data (tile entity data). * * @param nbtData NBT data, or null if no data - * @deprecated See {@link #setNbt(CompoundBinaryTag)} + * @deprecated See {@link #setNbtReference(LazyReference)} */ @Deprecated default void setNbtData(@Nullable CompoundTag nbtData) { - setNbt(nbtData == null ? null : nbtData.asBinaryTag()); + setNbtReference(nbtData == null ? null : LazyReference.from(nbtData::asBinaryTag)); } /** - * Returns whether the block contains NBT data. {@link #getNbt()} - * must not return null if this method returns true. + * Get the object's NBT data (tile entity data). * - * @return true if there is NBT data + *

+ * This only needs to be used if you don't want to immediately resolve the data. + * Otherwise, you probably want {@link #getNbt()}. + *

+ * + * @return compound tag, or null * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} * for details */ @NonAbstractForCompatibility( - delegateName = "hasNbtData", + delegateName = "getNbtData", delegateParams = { } ) - default boolean hasNbt() { + @Nullable + default LazyReference getNbtReference() { DeprecationUtil.checkDelegatingOverride(getClass()); - return hasNbtData(); + CompoundTag nbtData = getNbtData(); + return nbtData == null ? null : LazyReference.from(nbtData::asBinaryTag); } /** - * Get the object's NBT data (tile entity data). The returned tag, if - * modified in any way, should be sent to {@link #setNbt(CompoundBinaryTag)} - * so that the instance knows of the changes. Making changes without - * calling {@link #setNbt(CompoundBinaryTag)} could have unintended - * consequences. - * - *

{@link #hasNbt()} must return true if and only if method does - * not return null.

+ * Get the object's NBT data (tile entity data). * * @return compound tag, or null * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} * for details */ - @NonAbstractForCompatibility( - delegateName = "getNbtData", - delegateParams = { } - ) @Nullable default CompoundBinaryTag getNbt() { - DeprecationUtil.checkDelegatingOverride(getClass()); - - CompoundTag nbtData = getNbtData(); - return nbtData == null ? null : nbtData.asBinaryTag(); + LazyReference ref = getNbtReference(); + return ref == null ? null : ref.getValue(); } /** @@ -132,10 +125,19 @@ default CompoundBinaryTag getNbt() { delegateName = "setNbtData", delegateParams = { CompoundTag.class } ) - default void setNbt(@Nullable CompoundBinaryTag nbtData) { + default void setNbtReference(@Nullable LazyReference nbtData) { DeprecationUtil.checkDelegatingOverride(getClass()); - setNbtData(nbtData == null ? null : new CompoundTag(nbtData)); + setNbtData(nbtData == null ? null : new CompoundTag(nbtData.getValue())); + } + + /** + * Set the object's NBT data (tile entity data). + * + * @param nbtData NBT data, or null if no data + */ + default void setNbt(@Nullable CompoundBinaryTag nbtData) { + setNbtReference(nbtData == null ? null : LazyReference.computed(nbtData)); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java index a488f59057..f0d2adee68 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.TagStringIO; @@ -46,7 +47,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { private final BlockState blockState; @Nullable - private final CompoundBinaryTag nbtData; + private final LazyReference nbtData; /** * Construct a block with a state. @@ -66,7 +67,7 @@ protected BaseBlock(BlockState blockState) { */ @Deprecated protected BaseBlock(BlockState state, CompoundTag nbtData) { - this(state, checkNotNull(nbtData).asBinaryTag()); + this(state, LazyReference.from(checkNotNull(nbtData)::asBinaryTag)); } @@ -76,7 +77,7 @@ protected BaseBlock(BlockState state, CompoundTag nbtData) { * @param state The block state * @param nbtData NBT data, which must be provided */ - protected BaseBlock(BlockState state, CompoundBinaryTag nbtData) { + protected BaseBlock(BlockState state, LazyReference nbtData) { checkNotNull(nbtData); this.blockState = state; this.nbtData = nbtData; @@ -115,26 +116,21 @@ public V getState(Property property) { @Override public String getNbtId() { - CompoundBinaryTag nbtData = this.nbtData; + LazyReference nbtData = this.nbtData; if (nbtData == null) { return ""; } - return nbtData.getString("id"); - } - - @Override - public boolean hasNbt() { - return this.nbtData != null; + return nbtData.getValue().getString("id"); } @Nullable @Override - public CompoundBinaryTag getNbt() { + public LazyReference getNbtReference() { return this.nbtData; } @Override - public void setNbt(@Nullable CompoundBinaryTag nbtData) { + public void setNbtReference(@Nullable LazyReference nbtData) { throw new UnsupportedOperationException("This class is immutable."); } @@ -144,7 +140,7 @@ public void setNbt(@Nullable CompoundBinaryTag nbtData) { @Override public boolean equals(Object o) { if (!(o instanceof BaseBlock)) { - if (!hasNbt() && o instanceof BlockStateHolder) { + if (nbtData == null && o instanceof BlockStateHolder) { return Objects.equals(toImmutableState(), ((BlockStateHolder) o).toImmutableState()); } return false; @@ -176,22 +172,8 @@ public BaseBlock toBaseBlock() { return this; } - @Deprecated - @Override - public BaseBlock toBaseBlock(CompoundTag compoundTag) { - if (compoundTag == null) { - return this.blockState.toBaseBlock(); - } else if (compoundTag.asBinaryTag() == this.nbtData) { - // The above reference equality check is fine, as JNBT classes contain an internal - // Adventure reference. - return this; - } else { - return new BaseBlock(this.blockState, compoundTag); - } - } - @Override - public BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { + public BaseBlock toBaseBlock(LazyReference compoundTag) { if (compoundTag == null) { return this.blockState.toBaseBlock(); } else if (compoundTag == this.nbtData) { @@ -204,8 +186,9 @@ public BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { @Override public int hashCode() { int ret = toImmutableState().hashCode() << 3; - if (hasNbt()) { - ret += getNbt().hashCode(); + CompoundBinaryTag nbtData = getNbt(); + if (nbtData != null) { + ret += nbtData.hashCode(); } return ret; } @@ -213,11 +196,12 @@ public int hashCode() { @Override public String toString() { String nbtString = ""; - if (hasNbt()) { + CompoundBinaryTag nbtData = getNbt(); + if (nbtData != null) { try { - nbtString = TagStringIO.get().asString(getNbt()); + nbtString = TagStringIO.get().asString(nbtData); } catch (IOException e) { - WorldEdit.logger.error("Failed to parse NBT of Block", e); + WorldEdit.logger.error("Failed to serialize NBT of Block", e); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index be4584b03b..61ece44397 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -24,10 +24,10 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Table; -import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import java.util.Collections; @@ -211,17 +211,8 @@ public BaseBlock toBaseBlock() { return this.emptyBaseBlock; } - @Deprecated @Override - public BaseBlock toBaseBlock(CompoundTag compoundTag) { - if (compoundTag == null) { - return toBaseBlock(); - } - return new BaseBlock(this, compoundTag); - } - - @Override - public BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { + public BaseBlock toBaseBlock(LazyReference compoundTag) { if (compoundTag == null) { return toBaseBlock(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java index 0c11bb8331..e45544101f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java @@ -19,13 +19,13 @@ package com.sk89q.worldedit.world.block; -import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import java.util.Locale; @@ -92,11 +92,11 @@ public interface BlockStateHolder> extends Pattern * * @param compoundTag The NBT Data to apply * @return The BaseBlock - * @deprecated Use {@link BlockStateHolder#toBaseBlock(CompoundBinaryTag)}. + * @deprecated Use {@link BlockStateHolder#toBaseBlock(LazyReference)}. */ @Deprecated default BaseBlock toBaseBlock(CompoundTag compoundTag) { - return toBaseBlock(compoundTag == null ? null : compoundTag.asBinaryTag()); + return toBaseBlock(compoundTag == null ? null : LazyReference.from(compoundTag::asBinaryTag)); } /** @@ -111,10 +111,22 @@ default BaseBlock toBaseBlock(CompoundTag compoundTag) { delegateName = "toBaseBlock", delegateParams = { CompoundTag.class } ) + default BaseBlock toBaseBlock(LazyReference compoundTag) { + DeprecationUtil.checkDelegatingOverride(getClass()); + + return toBaseBlock(compoundTag == null ? null : new CompoundTag(compoundTag.getValue())); + } + + /** + * Gets a {@link BaseBlock} from this BlockStateHolder. + * + * @param compoundTag The NBT Data to apply + * @return The BaseBlock + */ default BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { DeprecationUtil.checkDelegatingOverride(getClass()); - return toBaseBlock(compoundTag == null ? null : new CompoundTag(compoundTag)); + return toBaseBlock(compoundTag == null ? null : LazyReference.computed(compoundTag)); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java index 8ecd71034d..f45f0eb91d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java @@ -22,13 +22,12 @@ import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.util.NbtUtils; import com.sk89q.worldedit.util.nbt.BinaryTag; -import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; -import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -72,14 +71,14 @@ public AnvilChunk(CompoundTag tag) throws DataException { public AnvilChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; - rootX = NbtUtils.getChildTag(rootTag, "xPos", IntBinaryTag.class).value(); - rootZ = NbtUtils.getChildTag(rootTag, "zPos", IntBinaryTag.class).value(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value(); blocks = new byte[16][16 * 16 * 16]; blocksAdd = new byte[16][16 * 16 * 8]; data = new byte[16][16 * 16 * 8]; - ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", ListBinaryTag.class); + ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST); for (BinaryTag rawSectionTag : sections) { if (!(rawSectionTag instanceof CompoundBinaryTag)) { @@ -91,20 +90,20 @@ public AnvilChunk(CompoundBinaryTag tag) throws DataException { continue; // Empty section. } - int y = NbtUtils.getChildTag(sectionTag, "Y", ByteBinaryTag.class).value(); + int y = NbtUtils.getChildTag(sectionTag, "Y", BinaryTagTypes.BYTE).value(); if (y < 0 || y >= 16) { continue; } blocks[y] = NbtUtils.getChildTag(sectionTag, - "Blocks", ByteArrayBinaryTag.class).value(); + "Blocks", BinaryTagTypes.BYTE_ARRAY).value(); data[y] = NbtUtils.getChildTag(sectionTag, "Data", - ByteArrayBinaryTag.class).value(); + BinaryTagTypes.BYTE_ARRAY).value(); // 4096 ID block support if (sectionTag.get("Add") != null) { blocksAdd[y] = NbtUtils.getChildTag(sectionTag, - "Add", ByteArrayBinaryTag.class).value(); + "Add", BinaryTagTypes.BYTE_ARRAY).value(); } } @@ -191,7 +190,7 @@ private int getBlockData(BlockVector3 position) throws DataException { * Used to load the tile entities. */ private void populateTileEntities() throws DataException { - ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", ListBinaryTag.class); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); tileEntities = new HashMap<>(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java index dd3bfdbe6d..cb94791350 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java @@ -22,14 +22,12 @@ import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.util.NbtUtils; import com.sk89q.worldedit.util.nbt.BinaryTag; import com.sk89q.worldedit.util.nbt.BinaryTagTypes; -import com.sk89q.worldedit.util.nbt.ByteBinaryTag; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.util.nbt.ListBinaryTag; -import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -75,12 +73,12 @@ public AnvilChunk13(CompoundTag tag) throws DataException { public AnvilChunk13(CompoundBinaryTag tag) throws DataException { rootTag = tag; - rootX = NbtUtils.getChildTag(rootTag, "xPos", IntBinaryTag.class).value(); - rootZ = NbtUtils.getChildTag(rootTag, "zPos", IntBinaryTag.class).value(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value(); blocks = new BlockState[16][]; - ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", ListBinaryTag.class); + ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST); for (BinaryTag rawSectionTag : sections) { if (!(rawSectionTag instanceof CompoundBinaryTag)) { @@ -92,7 +90,7 @@ public AnvilChunk13(CompoundBinaryTag tag) throws DataException { continue; // Empty section. } - int y = NbtUtils.getChildTag(sectionTag, "Y", ByteBinaryTag.class).value(); + int y = NbtUtils.getChildTag(sectionTag, "Y", BinaryTagTypes.BYTE).value(); if (y < 0 || y >= 16) { continue; } @@ -112,7 +110,7 @@ public AnvilChunk13(CompoundBinaryTag tag) throws DataException { } BlockState blockState = type.getDefaultState(); if (paletteEntry.get("Properties") != null) { - CompoundBinaryTag properties = NbtUtils.getChildTag(paletteEntry, "Properties", CompoundBinaryTag.class); + CompoundBinaryTag properties = NbtUtils.getChildTag(paletteEntry, "Properties", BinaryTagTypes.COMPOUND); for (Property property : blockState.getStates().keySet()) { if (properties.get(property.getName()) != null) { String value = properties.getString(property.getName()); @@ -128,7 +126,7 @@ public AnvilChunk13(CompoundBinaryTag tag) throws DataException { } // parse block states - long[] blockStatesSerialized = NbtUtils.getChildTag(sectionTag, "BlockStates", LongArrayBinaryTag.class).value(); + long[] blockStatesSerialized = NbtUtils.getChildTag(sectionTag, "BlockStates", BinaryTagTypes.LONG_ARRAY).value(); BlockState[] chunkSectionBlocks = new BlockState[16 * 16 * 16]; blocks[y] = chunkSectionBlocks; @@ -183,7 +181,7 @@ private void populateTileEntities() throws DataException { if (rootTag.get("TileEntities") == null) { return; } - ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", ListBinaryTag.class); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); for (BinaryTag tag : tags) { if (!(tag instanceof CompoundBinaryTag)) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java index fa4288885b..83f695ed15 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java @@ -22,12 +22,12 @@ import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.util.NbtUtils; import com.sk89q.worldedit.util.nbt.BinaryTag; -import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.util.nbt.IntBinaryTag; import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -73,10 +73,10 @@ public OldChunk(CompoundTag tag) throws DataException { public OldChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; - blocks = NbtUtils.getChildTag(rootTag, "Blocks", ByteArrayBinaryTag.class).value(); - data = NbtUtils.getChildTag(rootTag, "Data", ByteArrayBinaryTag.class).value(); - rootX = NbtUtils.getChildTag(rootTag, "xPos", IntBinaryTag.class).value(); - rootZ = NbtUtils.getChildTag(rootTag, "zPos", IntBinaryTag.class).value(); + blocks = NbtUtils.getChildTag(rootTag, "Blocks", BinaryTagTypes.BYTE_ARRAY).value(); + data = NbtUtils.getChildTag(rootTag, "Data", BinaryTagTypes.BYTE_ARRAY).value(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value(); int size = 16 * 16 * 128; if (blocks.length != size) { @@ -96,7 +96,7 @@ public OldChunk(CompoundBinaryTag tag) throws DataException { * @throws DataException if there is an error getting the chunk data */ private void populateTileEntities() throws DataException { - ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", ListBinaryTag.class); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); tileEntities = new HashMap<>(); diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java index 21d050b26a..4823eb8062 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java @@ -30,6 +30,7 @@ import com.sk89q.worldedit.registry.state.IntegerProperty; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.nbt.BinaryTag; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; @@ -43,6 +44,8 @@ import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.state.StateManager; @@ -237,18 +240,22 @@ public static ItemStack adapt(BaseItemStack baseItemStack) { } public static BaseItemStack adapt(ItemStack itemStack) { - CompoundBinaryTag tag = NBTConverter.fromNative(itemStack.toTag(new net.minecraft.nbt.CompoundTag())); - if (tag.keySet().isEmpty()) { + CompoundTag tag = itemStack.toTag(new CompoundTag()); + if (tag.isEmpty()) { tag = null; } else { - final BinaryTag tagTag = tag.get("tag"); - if (tagTag instanceof CompoundBinaryTag) { - tag = ((CompoundBinaryTag) tagTag); + final Tag tagTag = tag.get("tag"); + if (tagTag instanceof CompoundTag) { + tag = ((CompoundTag) tagTag); } else { tag = null; } } - return new BaseItemStack(adapt(itemStack.getItem()), tag, itemStack.getCount()); + CompoundTag finalTag = tag; + return new BaseItemStack( + adapt(itemStack.getItem()), + finalTag == null ? null : LazyReference.from(() -> NBTConverter.fromNative(finalTag)), + itemStack.getCount()); } /** diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java index 02ac3a4a8d..cd88c721dd 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.fabric.internal.NBTConverter; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.world.NullWorld; import com.sk89q.worldedit.world.entity.EntityTypes; import net.minecraft.nbt.CompoundTag; @@ -53,7 +54,7 @@ public BaseEntity getState() { Identifier id = Registry.ENTITY_TYPE.getId(entity.getType()); CompoundTag tag = new CompoundTag(); entity.toTag(tag); - return new BaseEntity(EntityTypes.get(id.toString()), NBTConverter.fromNative(tag)); + return new BaseEntity(EntityTypes.get(id.toString()), LazyReference.from(() -> NBTConverter.fromNative(tag))); } else { return null; } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index 5bf412edc9..f2958f3258 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -248,7 +248,7 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { @Override public boolean useItem(BlockVector3 position, BaseItem item, Direction face) { - ItemStack stack = FabricAdapter.adapt(new BaseItemStack(item.getType(), item.getNbt(), 1)); + ItemStack stack = FabricAdapter.adapt(new BaseItemStack(item.getType(), item.getNbtReference(), 1)); ServerWorld world = (ServerWorld) getWorld(); final WorldEditFakePlayer fakePlayer; try { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java index ba02cfa1a0..c18a39202c 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java @@ -30,8 +30,7 @@ import com.sk89q.worldedit.registry.state.IntegerProperty; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.Direction; -import com.sk89q.worldedit.util.nbt.BinaryTag; -import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; @@ -45,6 +44,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; import net.minecraft.state.DirectionProperty; import net.minecraft.state.StateContainer; import net.minecraft.util.IStringSerializable; @@ -233,18 +233,23 @@ public static ItemStack adapt(BaseItemStack baseItemStack) { } public static BaseItemStack adapt(ItemStack itemStack) { - CompoundBinaryTag tag = NBTConverter.fromNative(itemStack.serializeNBT()); + CompoundNBT tag = itemStack.serializeNBT(); if (tag.keySet().isEmpty()) { tag = null; } else { - final BinaryTag tagTag = tag.get("tag"); - if (tagTag instanceof CompoundBinaryTag) { - tag = ((CompoundBinaryTag) tagTag); + final INBT tagTag = tag.get("tag"); + if (tagTag instanceof CompoundNBT) { + tag = ((CompoundNBT) tagTag); } else { tag = null; } } - return new BaseItemStack(adapt(itemStack.getItem()), tag, itemStack.getCount()); + CompoundNBT finalTag = tag; + return new BaseItemStack( + adapt(itemStack.getItem()), + finalTag == null ? null : LazyReference.from(() -> NBTConverter.fromNative(finalTag)), + itemStack.getCount() + ); } /** diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java index 521835dcc4..623e5a30d3 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.forge.internal.NBTConverter; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.world.NullWorld; import com.sk89q.worldedit.world.entity.EntityTypes; import net.minecraft.nbt.CompoundNBT; @@ -53,7 +54,10 @@ public BaseEntity getState() { if (id != null) { CompoundNBT tag = new CompoundNBT(); entity.writeWithoutTypeId(tag); - return new BaseEntity(EntityTypes.get(id.toString()), NBTConverter.fromNative(tag)); + return new BaseEntity( + EntityTypes.get(id.toString()), + LazyReference.from(() -> NBTConverter.fromNative(tag)) + ); } else { return null; } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java index 2eb64dede1..ccdc813a3a 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java @@ -253,7 +253,7 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { @Override public boolean useItem(BlockVector3 position, BaseItem item, Direction face) { - ItemStack stack = ForgeAdapter.adapt(new BaseItemStack(item.getType(), item.getNbt(), 1)); + ItemStack stack = ForgeAdapter.adapt(new BaseItemStack(item.getType(), item.getNbtReference(), 1)); ServerWorld world = (ServerWorld) getWorld(); final WorldEditFakePlayer fakePlayer; try { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java index 4f76306bc3..693369a71f 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/NBTConverter.java @@ -211,7 +211,7 @@ public static IntArrayBinaryTag fromNative(IntArrayNBT other) { public static ListBinaryTag fromNative(ListNBT other) { other = other.copy(); - ListBinaryTag.Builder list = ListBinaryTag.builder(); + ListBinaryTag.Builder list = ListBinaryTag.builder(); int tags = other.size(); for (int i = 0; i < tags; i++) { BinaryTag child = fromNative(other.remove(0)); diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java index 540808475d..8aead8e81e 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java @@ -21,7 +21,6 @@ import com.flowpowered.math.vector.Vector3d; import com.flowpowered.math.vector.Vector3i; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; @@ -168,9 +167,12 @@ public > boolean setBlock(BlockVector3 position, B snapshot.restore(true, notifyAndLight ? BlockChangeFlags.ALL : BlockChangeFlags.NONE); // Create the TileEntity - if (block instanceof BaseBlock && ((BaseBlock) block).hasNbt()) { - // Kill the old TileEntity - world.getTileEntity(pos).ifPresent(tileEntity -> applyTileEntityData(tileEntity, (BaseBlock) block)); + if (block instanceof BaseBlock) { + BaseBlock baseBlock = (BaseBlock) block; + if (baseBlock.getNbtReference() != null) { + // Kill the old TileEntity + world.getTileEntity(pos).ifPresent(tileEntity -> applyTileEntityData(tileEntity, baseBlock)); + } } return true; @@ -301,7 +303,7 @@ public Entity createEntity(Location location, BaseEntity entity) { Vector3d pos = new Vector3d(location.getX(), location.getY(), location.getZ()); org.spongepowered.api.entity.Entity newEnt = world.createEntity(entityType, pos); - if (entity.hasNbt()) { + if (entity.getNbtReference() != null) { applyEntityData(newEnt, entity); } From fb5d7f8af5b89a23826b2bfeb72fd6bff035aa37 Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Mon, 15 Feb 2021 01:53:45 -0800 Subject: [PATCH 08/10] Revert to old behavior of coercing --- .../com/sk89q/worldedit/function/block/ExtentBlockCopy.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java index 56ae3ed10e..cfa2445447 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java @@ -30,7 +30,7 @@ import com.sk89q.worldedit.util.Direction.Flag; import com.sk89q.worldedit.util.nbt.BinaryTag; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; -import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.NumberBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import static com.google.common.base.Preconditions.checkNotNull; @@ -93,8 +93,8 @@ private BaseBlock transformNbtData(BaseBlock state) { if (tag != null) { // Handle blocks which store their rotation in NBT BinaryTag rotTag = tag.get("Rot"); - if (rotTag instanceof IntBinaryTag) { - int rot = ((IntBinaryTag) rotTag).value(); + if (rotTag instanceof NumberBinaryTag) { + int rot = ((NumberBinaryTag) rotTag).intValue(); Direction direction = MCDirections.fromRotation(rot); From b67fff66621c3b9bc183eafe0b803f4e6be692bd Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Mon, 15 Feb 2021 01:56:06 -0800 Subject: [PATCH 09/10] Use the convience methods for assembly --- .../internal/cui/ServerCUIHandler.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java index 20d52e013b..c979bf0dcc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java @@ -28,11 +28,7 @@ import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.util.Location; -import com.sk89q.worldedit.util.concurrency.LazyReference; -import com.sk89q.worldedit.util.nbt.ByteBinaryTag; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; -import com.sk89q.worldedit.util.nbt.IntBinaryTag; -import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockTypes; @@ -135,24 +131,24 @@ public static BaseBlock createStructureBlock(Player player) { return null; } - structureTag.put("name", StringBinaryTag.of("worldedit:" + player.getName())); - structureTag.put("author", StringBinaryTag.of(player.getName())); - structureTag.put("metadata", StringBinaryTag.of("")); - structureTag.put("x", IntBinaryTag.of(x)); - structureTag.put("y", IntBinaryTag.of(y)); - structureTag.put("z", IntBinaryTag.of(z)); - structureTag.put("posX", IntBinaryTag.of(posX)); - structureTag.put("posY", IntBinaryTag.of(posY)); - structureTag.put("posZ", IntBinaryTag.of(posZ)); - structureTag.put("sizeX", IntBinaryTag.of(width)); - structureTag.put("sizeY", IntBinaryTag.of(height)); - structureTag.put("sizeZ", IntBinaryTag.of(length)); - structureTag.put("rotation", StringBinaryTag.of("NONE")); - structureTag.put("mirror", StringBinaryTag.of("NONE")); - structureTag.put("mode", StringBinaryTag.of("SAVE")); - structureTag.put("ignoreEntities", ByteBinaryTag.of((byte) 1)); - structureTag.put("showboundingbox", ByteBinaryTag.of((byte) 1)); - structureTag.put("id", StringBinaryTag.of(BlockTypes.STRUCTURE_BLOCK.getId())); + structureTag.putString("name", "worldedit:" + player.getName()); + structureTag.putString("author", player.getName()); + structureTag.putString("metadata", ""); + structureTag.putInt("x", x); + structureTag.putInt("y", y); + structureTag.putInt("z", z); + structureTag.putInt("posX", posX); + structureTag.putInt("posY", posY); + structureTag.putInt("posZ", posZ); + structureTag.putInt("sizeX", width); + structureTag.putInt("sizeY", height); + structureTag.putInt("sizeZ", length); + structureTag.putString("rotation", "NONE"); + structureTag.putString("mirror", "NONE"); + structureTag.putString("mode", "SAVE"); + structureTag.putByte("ignoreEntities", (byte) 1); + structureTag.putByte("showboundingbox", (byte) 1); + structureTag.putString("id", BlockTypes.STRUCTURE_BLOCK.getId()); return BlockTypes.STRUCTURE_BLOCK.getDefaultState().toBaseBlock(structureTag.build()); } From b7880c2f4a0b7bb5df3b6076a956f7fe40dbff42 Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Mon, 15 Feb 2021 02:02:14 -0800 Subject: [PATCH 10/10] Lazify some more conversions --- .../java/com/sk89q/worldedit/world/block/BaseBlock.java | 2 +- .../main/java/com/sk89q/worldedit/fabric/FabricWorld.java | 5 +++-- .../main/java/com/sk89q/worldedit/forge/ForgeWorld.java | 8 ++++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java index f0d2adee68..f7f79a66e5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java @@ -100,7 +100,7 @@ public BlockType getBlockType() { @Override public BaseBlock with(Property property, V value) { - return this.blockState.with(property, value).toBaseBlock(getNbt()); + return this.blockState.with(property, value).toBaseBlock(getNbtReference()); } /** diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index f2958f3258..07e1a3e1c0 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -51,6 +51,7 @@ import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.TreeGenerator.TreeType; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.io.file.SafeFiles; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.AbstractWorld; @@ -426,7 +427,7 @@ private void regenForWorld(Region region, Extent extent, ServerWorld serverWorld if (blockEntity != null) { net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); blockEntity.toTag(tag); - state = state.toBaseBlock(NBTConverter.fromNative(tag)); + state = state.toBaseBlock(LazyReference.from(() -> NBTConverter.fromNative(tag))); } extent.setBlock(vec, state.toBaseBlock()); @@ -602,7 +603,7 @@ public BaseBlock getFullBlock(BlockVector3 position) { if (tile != null) { net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); tile.toTag(tag); - return getBlock(position).toBaseBlock(NBTConverter.fromNative(tag)); + return getBlock(position).toBaseBlock(LazyReference.from(() -> NBTConverter.fromNative(tag))); } else { return getBlock(position).toBaseBlock(); } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java index ccdc813a3a..fdef1811da 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java @@ -51,6 +51,7 @@ import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.TreeGenerator.TreeType; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.io.file.SafeFiles; import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.AbstractWorld; @@ -437,7 +438,7 @@ private void regenForWorld(Region region, Extent extent, ServerWorld serverWorld if (blockEntity != null) { CompoundNBT tag = new CompoundNBT(); blockEntity.write(tag); - state = state.toBaseBlock(NBTConverter.fromNative(tag)); + state = state.toBaseBlock(LazyReference.from(() -> NBTConverter.fromNative(tag))); } extent.setBlock(vec, state.toBaseBlock()); @@ -610,7 +611,10 @@ public BaseBlock getFullBlock(BlockVector3 position) { TileEntity tile = getWorld().getChunk(pos).getTileEntity(pos); if (tile != null) { - return getBlock(position).toBaseBlock(NBTConverter.fromNative(TileEntityUtils.copyNbtData(tile))); + CompoundNBT tag = TileEntityUtils.copyNbtData(tile); + return getBlock(position).toBaseBlock( + LazyReference.from(() -> NBTConverter.fromNative(tag)) + ); } else { return getBlock(position).toBaseBlock(); }