diff --git a/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt b/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt index 69552ac0..386966a8 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt @@ -88,8 +88,6 @@ class NodeData(id: EntityID): CompositeEntity(id) { schemData.inputStream.let { if(decompress) GZIPInputStream(it) else it } } - fun schemData() = schemData(true) - override fun delete() = useDb { super.delete() } enum class SchematicFormat(val fileEnding: String) { diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java index cbb79a5e..2e2aa21c 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java @@ -36,7 +36,6 @@ import de.steamwar.fightsystem.fight.FreezeWorld; import de.steamwar.fightsystem.listener.FightScoreboard; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.utils.*; -import de.steamwar.sql.SchematicData; import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.Team; @@ -520,12 +519,12 @@ public class PacketProcessor implements Listener { private void pasteEmbeddedSchem(FightTeam team) throws IOException { int schemId = source.readInt(); - Clipboard clipboard = SchematicData.clipboardFromStream(new FilterInputStream(source) { + Clipboard clipboard = WorldEditWrapper.impl.getClipboard(new FilterInputStream(source) { @Override public void close() { // FAWE 1.12 calls close... } - }, WorldEditWrapper.impl.getNativeFormat()); + }); execSync(() -> team.pasteSchem(schemId, clipboard)); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index f4267b49..25f67457 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -283,7 +283,7 @@ public interface Recorder { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try{ - copy(NodeData.getLatest(SchematicNode.getSchematicNode(schemId)).schemData(), buffer); + copy(NodeData.getLatest(SchematicNode.getSchematicNode(schemId)).schemData(true), buffer); }catch (EOFException e) { Bukkit.getLogger().log(Level.INFO, "EOFException ignored"); } catch (IOException e) { diff --git a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index 60e4758d..b0f0238e 100644 --- a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -67,36 +67,31 @@ public class WorldEditWrapper14 implements WorldEditWrapper { } @Override - public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { - Clipboard clipboard = null; - try { - clipboard = getClipboard(is, schemFormat); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } - - if (clipboard == null) - throw new NoClipboardException(); - + public void setPlayerClipboard(Player player, Clipboard clipboard) { Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); } @Override - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException { - try { + public Clipboard getClipboard(NodeData data) throws IOException { + InputStream is = data.schemData(true); + return readClipboard(is, data.getNodeFormat()); + } - switch (schemFormat) { - case SPONGE_V2: - case SPONGE_V3: - return new SpongeSchematicReader(new NBTInputStream(is), this).read(); - case MCEDIT: - return new MCEditSchematicReader(new NBTInputStream(is)).read(); - default: - throw new IOException("This schematic format is currently not supported"); - } - } catch (NullPointerException e) { - throw new NoClipboardException(); + @Override + public Clipboard getClipboard(InputStream inputStream) throws IOException { + return readClipboard(inputStream, getNativeFormat()); + } + + private Clipboard readClipboard(InputStream is, NodeData.SchematicFormat format) throws IOException { + switch (format) { + case SPONGE_V2: + case SPONGE_V3: + return new SpongeSchematicReader(new NBTInputStream(is), this).read(); + case MCEDIT: + return new MCEditSchematicReader(new NBTInputStream(is)).read(); + default: + throw new IOException("This schematic format is currently not supported"); } } diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index 35fda421..d823ef80 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -20,15 +20,12 @@ package de.steamwar.core; import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; -import com.fastasyncworldedit.core.jnbt.NBTException; -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.MCEditSchematicReader; -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; @@ -36,13 +33,13 @@ 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; public class WorldEditWrapper21 implements WorldEditWrapper { @@ -56,57 +53,48 @@ public class WorldEditWrapper21 implements WorldEditWrapper { } @Override - public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { - Clipboard clipboard = null; - try { - clipboard = getClipboard(is, schemFormat); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } - - if (clipboard == null) - throw new SecurityException("Clipboard is null"); - + public void setPlayerClipboard(Player player, Clipboard clipboard) { Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); } @Override - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat directFormat) throws IOException { - ResetableInputStream ris = new ResetableInputStream(is); - try { - return loadSchematic(ris, directFormat); - } catch (Exception e) { - ris.reset(); - } - for (NodeData.SchematicFormat schemFormat : NodeData.SchematicFormat.values()) { - if (schemFormat == directFormat) continue; - try { - return loadSchematic(ris, schemFormat); - } catch (Exception e) { - ris.reset(); - } - } - try { - return new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); - } catch (Exception e) { - ris.close(); + public Clipboard getClipboard(NodeData data) throws IOException { + ResetableInputStream is = new ResetableInputStream(data.schemData(false)); + for (ClipboardFormat clipboardFormat : ClipboardFormats.getAll()) { + FilterInputStream fis = new FilterInputStream(is) { + @Override + public void close() throws IOException { + // Ignore close call! + } + }; + boolean canBeRead = clipboardFormat.isFormat(fis); + is.reset(); + if (!canBeRead) continue; + return clipboardFormat.load(is); } throw new IOException("No clipboard found"); } - @SuppressWarnings("removal") - private Clipboard loadSchematic(ResetableInputStream ris, NodeData.SchematicFormat format) throws IOException { - Clipboard clipboard = switch (format) { - case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(ris)).read(); - case SPONGE_V2 -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); - case SPONGE_V3 -> new FastSchematicReaderV3(ris).read(); - }; - ris.close(); - return clipboard; + @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(); + } + is.close(); + throw new IOException("No clipboard found"); } - private class ResetableInputStream extends InputStream { + private static class ResetableInputStream extends InputStream { private InputStream inputStream; private int pointer = 0; diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index cc021f19..4f45729d 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -22,7 +22,10 @@ package de.steamwar.core; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.sk89q.jnbt.*; -import com.sk89q.worldedit.*; +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.extension.input.ParserContext; @@ -57,22 +60,25 @@ public class WorldEditWrapper8 implements WorldEditWrapper { } @Override - public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { + public void setPlayerClipboard(Player player, Clipboard clipboard) { WorldData world = new BukkitWorld(player.getWorld()).getWorldData(); - Clipboard clipboard; - try { - clipboard = getClipboard(is, schemFormat); - } catch (IOException e) { - throw new RuntimeException(e); - } - Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard, world)); } @Override - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException { - switch (schemFormat) { + public Clipboard getClipboard(NodeData data) throws IOException { + InputStream is = data.schemData(true); + return readClipboard(is, data.getNodeFormat()); + } + + @Override + public Clipboard getClipboard(InputStream inputStream) throws IOException { + return readClipboard(inputStream, getNativeFormat()); + } + + private Clipboard readClipboard(InputStream is, NodeData.SchematicFormat format) throws IOException { + switch (format) { case MCEDIT: return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); case SPONGE_V2: diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index f3b0accc..724f8184 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -22,10 +22,10 @@ package de.steamwar.core; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.session.ClipboardHolder; -import de.steamwar.sql.NoClipboardException; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.session.ClipboardHolder; +import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.NodeData; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -38,8 +38,10 @@ public interface WorldEditWrapper { WorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); InputStream getPlayerClipboard(Player player); - void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat); - Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException; + + void setPlayerClipboard(Player player, Clipboard clipboard); + Clipboard getClipboard(NodeData data) throws IOException; + Clipboard getClipboard(InputStream inputStream) throws IOException; Vector getOrigin(Clipboard clipboard); Vector getMinimum(Region region); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java index 72fd070f..f83e5a78 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java @@ -29,14 +29,6 @@ import java.io.InputStream; public class SchematicData { - public static Clipboard clipboardFromStream(InputStream is, NodeData.SchematicFormat schemFormat) { - try { - return WorldEditWrapper.impl.getClipboard(is, schemFormat); - } catch (IOException e) { - throw new SecurityException("Could not read schem", e); - } - } - private final NodeData data; public SchematicData(SchematicNode node) { @@ -60,11 +52,11 @@ public class SchematicData { } public Clipboard load() throws IOException, NoClipboardException { - return WorldEditWrapper.impl.getClipboard(data.schemData(), data.getNodeFormat()); + return WorldEditWrapper.impl.getClipboard(data); } public void loadToPlayer(Player player) throws IOException, NoClipboardException { - WorldEditWrapper.impl.setPlayerClipboard(player, data.schemData(), data.getNodeFormat()); + WorldEditWrapper.impl.setPlayerClipboard(player, WorldEditWrapper.impl.getClipboard(data)); } public static void saveFromPlayer(Player player, SchematicNode node) throws IOException, NoClipboardException {