diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index d823ef80..326bcd95 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -19,13 +19,15 @@ package de.steamwar.core; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV2; import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; +import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.sk89q.worldedit.extent.clipboard.io.*; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV1Reader; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV2Reader; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV3Reader; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; @@ -33,13 +35,15 @@ import com.sk89q.worldedit.session.ClipboardHolder; import de.steamwar.sql.NodeData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import org.enginehub.linbus.stream.LinBinaryIO; +import java.io.DataInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import java.util.zip.GZIPInputStream; +import java.util.function.Function; public class WorldEditWrapper21 implements WorldEditWrapper { @@ -76,19 +80,37 @@ public class WorldEditWrapper21 implements WorldEditWrapper { throw new IOException("No clipboard found"); } + private static final Function FastV3 = FastSchematicReaderV3::new; + private static final Function FastV2 = inputStream -> new FastSchematicReaderV2(new NBTInputStream(inputStream)); + private static final Function McEdit = inputStream -> new MCEditSchematicReader(new NBTInputStream(inputStream)); + private static final Function SpongeV3 = inputStream -> new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(inputStream))); + private static final Function SpongeV2 = inputStream -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(inputStream))); + private static final Function SpongeV1 = inputStream -> new SpongeSchematicV1Reader(LinBinaryIO.read(new DataInputStream(inputStream))); + + private static final Function[] READERS = new Function[]{ + FastV3, + FastV2, + SpongeV3, + SpongeV2, + SpongeV1, + McEdit + }; + @Override public Clipboard getClipboard(InputStream inputStream) throws IOException { - // Only supports getNativeFormat() both with GZIP as well as without! ResetableInputStream is = new ResetableInputStream(inputStream); - try { - return new FastSchematicReaderV3(inputStream).read(); - } catch (Exception e) { - is.reset(); - } - try { - return new FastSchematicReaderV3(new GZIPInputStream(is)).read(); - } catch (Exception e) { - is.reset(); + for (Function reader : READERS) { + FilterInputStream fis = new FilterInputStream(is) { + @Override + public void close() throws IOException { + // Ignore close call! + } + }; + try { + return reader.apply(fis).read(); + } catch (Exception e) { + is.reset(); + } } is.close(); throw new IOException("No clipboard found");