diff --git a/pom.xml b/pom.xml index 78d6c6d..341fd3f 100644 --- a/pom.xml +++ b/pom.xml @@ -42,13 +42,25 @@ org.spigotmc spigot-api - 1.16.1-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT provided com.sk89q.worldedit worldedit-bukkit - 7.1.0-SNAPSHOT + 7.3.0-SNAPSHOT + provided + + + com.sk89q.worldedit + worldedit-core + 7.3.0-SNAPSHOT + provided + + + com.sk89q.worldedit.worldedit-libs + core + 7.3.0-SNAPSHOT provided diff --git a/src/main/java/de/diddiz/worldedit/WorldEditHelper.java b/src/main/java/de/diddiz/worldedit/WorldEditHelper.java index b24413e..4edb767 100644 --- a/src/main/java/de/diddiz/worldedit/WorldEditHelper.java +++ b/src/main/java/de/diddiz/worldedit/WorldEditHelper.java @@ -4,8 +4,9 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.Method; +import java.util.AbstractMap; import java.util.Arrays; -import java.util.LinkedHashMap; +import java.util.Map.Entry; import java.util.UUID; import java.util.logging.Level; @@ -17,15 +18,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.util.BlockVector; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.DoubleTag; -import com.sk89q.jnbt.FloatTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.NBTInputStream; -import com.sk89q.jnbt.NBTOutputStream; -import com.sk89q.jnbt.NamedTag; -import com.sk89q.jnbt.ShortTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.bukkit.BukkitAdapter; @@ -33,6 +25,12 @@ import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagIO; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; import de.diddiz.LogBlock.LogBlock; import de.diddiz.util.CuboidRegion; @@ -107,16 +105,14 @@ public class WorldEditHelper { com.sk89q.worldedit.world.entity.EntityType weType = BukkitAdapter.adapt(type); com.sk89q.worldedit.util.Location weLocation = BukkitAdapter.adapt(location); try { - NBTInputStream nbtis = new NBTInputStream(new ByteArrayInputStream(serialized)); - NamedTag namedTag = nbtis.readNamedTag(); - nbtis.close(); + Entry namedTag = BinaryTagIO.unlimitedReader().readNamed(new ByteArrayInputStream(serialized)); UUID newUUID = null; - if (namedTag.getName().equals("entity") && namedTag.getTag() instanceof CompoundTag) { - CompoundTag serializedState = (CompoundTag) namedTag.getTag(); - BaseEntity state = new BaseEntity(weType, serializedState); + if (namedTag.getKey().equals("entity")) { + CompoundBinaryTag serializedState = namedTag.getValue(); + BaseEntity state = new BaseEntity(weType, LazyReference.computed(serializedState)); com.sk89q.worldedit.entity.Entity weEntity = weLocation.getExtent().createEntity(weLocation, state); if (weEntity != null) { - CompoundTag newNbt = weEntity.getState().getNbtData(); + CompoundBinaryTag newNbt = weEntity.getState().getNbt(); int[] uuidInts = newNbt.getIntArray("UUID"); if (uuidInts != null && uuidInts.length >= 4) { newUUID = new UUID(((long) uuidInts[0] << 32) | (uuidInts[1] & 0xFFFFFFFFL), ((long) uuidInts[2] << 32) | (uuidInts[3] & 0xFFFFFFFFL)); @@ -136,16 +132,14 @@ public class WorldEditHelper { BaseEntity state = weEntity.getState(); if (state != null) { try { + CompoundBinaryTag nbt = state.getNbt(); + nbt = nbt.putFloat("Health", 20.0f); + nbt = nbt.put("Motion", ListBinaryTag.from(Arrays.asList(new BinaryTag[] { DoubleBinaryTag.of(0.0), DoubleBinaryTag.of(0.0), DoubleBinaryTag.of(0.0) }))); + nbt = nbt.putShort("Fire", (short) -20); + nbt = nbt.putShort("HurtTime", (short) 0); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); - NBTOutputStream nbtos = new NBTOutputStream(baos); - CompoundTag nbt = state.getNbtData(); - LinkedHashMap value = new LinkedHashMap<>(nbt.getValue()); - value.put("Health", new FloatTag(20.0f)); - value.put("Motion", new ListTag(DoubleTag.class, Arrays.asList(new DoubleTag[] { new DoubleTag(0), new DoubleTag(0), new DoubleTag(0) }))); - value.put("Fire", new ShortTag((short) -20)); - value.put("HurtTime", new ShortTag((short) 0)); - nbtos.writeNamedTag("entity", new CompoundTag(value)); - nbtos.close(); + BinaryTagIO.writer().writeNamed(new AbstractMap.SimpleImmutableEntry<>("entity", nbt), baos); return baos.toByteArray(); } catch (IOException e) { throw new RuntimeException("This IOException should be impossible", e);