diff --git a/SpigotCore_10/src/de/steamwar/sql/Schematic_10.java b/SpigotCore_10/src/de/steamwar/sql/Schematic_10.java index 4afcc91..b130602 100644 --- a/SpigotCore_10/src/de/steamwar/sql/Schematic_10.java +++ b/SpigotCore_10/src/de/steamwar/sql/Schematic_10.java @@ -13,11 +13,11 @@ class Schematic_10 { return Schematic_8.getPlayerClipboard(player); } - static void setPlayerClipboard(Player player, InputStream is) throws IOException { - Schematic_8.setPlayerClipboard(player, is); + static void setPlayerClipboard(Player player, InputStream is, boolean schemVersion) throws IOException { + Schematic_8.setPlayerClipboard(player, is, schemVersion); } - static Clipboard getClipboard(InputStream is) throws IOException { - return Schematic_8.getClipboard(is); + static Clipboard getClipboard(InputStream is, boolean schemVersion) throws IOException { + return Schematic_8.getClipboard(is, schemVersion); } } diff --git a/SpigotCore_12/src/de/steamwar/sql/Schematic_12.java b/SpigotCore_12/src/de/steamwar/sql/Schematic_12.java index ef79b28..95c626e 100644 --- a/SpigotCore_12/src/de/steamwar/sql/Schematic_12.java +++ b/SpigotCore_12/src/de/steamwar/sql/Schematic_12.java @@ -32,11 +32,11 @@ class Schematic_12 { return outputStream.toByteArray(); } - static void setPlayerClipboard(Player player, InputStream is) throws IOException { - Schematic_8.setPlayerClipboard(player, is); + static void setPlayerClipboard(Player player, InputStream is, boolean schemVersion) throws IOException { + Schematic_8.setPlayerClipboard(player, is, schemVersion); } - static Clipboard getClipboard(InputStream is) throws IOException { - return Schematic_8.getClipboard(is); + static Clipboard getClipboard(InputStream is, boolean schemVersion) throws IOException { + return Schematic_8.getClipboard(is, schemVersion); } } diff --git a/SpigotCore_8/src/de/steamwar/sql/Schematic_8.java b/SpigotCore_8/src/de/steamwar/sql/Schematic_8.java index f9f7266..3a0c209 100644 --- a/SpigotCore_8/src/de/steamwar/sql/Schematic_8.java +++ b/SpigotCore_8/src/de/steamwar/sql/Schematic_8.java @@ -7,7 +7,6 @@ import com.sk89q.worldedit.*; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; @@ -18,6 +17,7 @@ import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.world.registry.WorldData; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; import javax.annotation.Nullable; @@ -29,6 +29,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.zip.GZIPInputStream; class Schematic_8 { private Schematic_8(){} @@ -50,16 +51,19 @@ class Schematic_8 { return outputStream.toByteArray(); } - static void setPlayerClipboard(Player player, InputStream is) throws IOException { + static void setPlayerClipboard(Player player, InputStream is, boolean schemFormat) throws IOException { WorldData world = new BukkitWorld(player.getWorld()).getWorldData(); - Clipboard clipboard = getClipboard(is); + Clipboard clipboard = getClipboard(is, schemFormat); Actor actor = getWorldEditPlugin().wrapCommandSender(player); getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard, world)); } - static Clipboard getClipboard(InputStream is) throws IOException { - return ClipboardFormat.SCHEMATIC.getReader(is).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); + static Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException { + if(schemFormat) + return new SpongeSchematicReader(new NBTInputStream(new GZIPInputStream(is))).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); + else + return ClipboardFormat.SCHEMATIC.getReader(is).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); } private static WorldEditPlugin getWorldEditPlugin() { @@ -70,7 +74,7 @@ class Schematic_8 { private final NBTInputStream inputStream; private int schematicVersion = -1; - public SpongeSchematicReader(NBTInputStream inputStream) { + SpongeSchematicReader(NBTInputStream inputStream) { Preconditions.checkNotNull(inputStream); this.inputStream = inputStream; } @@ -79,9 +83,9 @@ class Schematic_8 { public Clipboard read(WorldData worldData) throws IOException { CompoundTag schematicTag = this.getBaseTag(); if (this.schematicVersion == 1) { - return this.readVersion1(schematicTag); + return this.readSchematic(schematicTag); } else if (this.schematicVersion == 2) { - return this.readVersion1(schematicTag); + return this.readSchematic(schematicTag); } else { throw new IOException("This schematic version is currently not supported"); } @@ -99,7 +103,8 @@ class Schematic_8 { } } - private BlockArrayClipboard readVersion1(CompoundTag schematicTag) throws IOException { + @SuppressWarnings("deprecation") + private BlockArrayClipboard readSchematic(CompoundTag schematicTag) throws IOException { Map schematic = schematicTag.getValue(); int width = (requireTag(schematic, "Width", ShortTag.class)).getValue(); int height = (requireTag(schematic, "Height", ShortTag.class)).getValue(); @@ -108,9 +113,8 @@ class Schematic_8 { int[] offsetParts; if (offsetTag != null) { offsetParts = offsetTag.getValue(); - if (offsetParts.length != 3) { + if (offsetParts.length != 3) throw new IOException("Invalid offset specified in schematic."); - } } else { offsetParts = new int[]{0, 0, 0}; } @@ -134,98 +138,99 @@ class Schematic_8 { IntTag paletteMaxTag = getTag(schematic, "PaletteMax", IntTag.class); Map paletteObject = requireTag(schematic, "Palette", CompoundTag.class).getValue(); - if (paletteMaxTag != null && paletteObject.size() != paletteMaxTag.getValue()) { + if (paletteMaxTag != null && paletteObject.size() != paletteMaxTag.getValue()) throw new IOException("Block palette size does not match expected size."); - } else { - Map palette = new HashMap<>(); //TODO not base blocks - ParserContext parserContext = new ParserContext(); - parserContext.setRestricted(false); - parserContext.setPreferringWildcard(false); - int id; - BaseBlock state; - for(Iterator var36 = paletteObject.keySet().iterator(); var36.hasNext(); palette.put(id, state)) { - String palettePart = (String)var36.next(); - id = requireTag(paletteObject, palettePart, IntTag.class).getValue(); + Map palette = new HashMap<>(); + ParserContext parserContext = new ParserContext(); + parserContext.setRestricted(false); + parserContext.setPreferringWildcard(false); - try { - //TODO Parse id to base block - throw new InputParseException("TODO"); - } catch (InputParseException var31) { - state = new BaseBlock(0); //AIR - } + int id; + BaseBlock state; + for(Iterator iterator = paletteObject.keySet().iterator(); iterator.hasNext(); palette.put(id, state)) { + String palettePart = (String)iterator.next(); + id = requireTag(paletteObject, palettePart, IntTag.class).getValue(); + + String matName = palettePart.split(":")[1].split("\\[")[0]; + Material material = Material.getMaterial(matName); + if(material == null){ + state = new BaseBlock(0); //AIR + continue; } - byte[] blocks = requireTag(schematic, "BlockData", ByteArrayTag.class).getValue(); - Map> tileEntitiesMap = new HashMap<>(); - ListTag tileEntities = getTag(schematic, "BlockEntities", ListTag.class); - if (tileEntities == null) { - tileEntities = getTag(schematic, "TileEntities", ListTag.class); - } - - if (tileEntities != null) { - List> tileEntityTags = tileEntities.getValue().stream().map((tag) -> - (CompoundTag)tag - ).map(CompoundTag::getValue).collect(Collectors.toList()); - - BlockVector pt; - Map tileEntity; - for(Iterator> var20 = tileEntityTags.iterator(); var20.hasNext(); tileEntitiesMap.put(pt, tileEntity)) { - tileEntity = var20.next(); - int[] pos = requireTag(tileEntity, "Pos", IntArrayTag.class).getValue(); - pt = new BlockVector(pos[0], pos[1], pos[2]); - Map values = Maps.newHashMap(tileEntity); - values.put("x", new IntTag(pt.getBlockX())); - values.put("y", new IntTag(pt.getBlockY())); - values.put("z", new IntTag(pt.getBlockZ())); - values.put("id", values.get("Id")); - values.remove("Id"); - values.remove("Pos"); - tileEntity = values; - } - } - - BlockArrayClipboard clipboard = new BlockArrayClipboard(region); - clipboard.setOrigin(origin); - int index = 0; - - for(int i = 0; i < blocks.length; ++index) { - int value = 0; - int varintLength = 0; - - while(true) { - value |= (blocks[i] & 127) << varintLength++ * 7; - if (varintLength > 5) { - throw new IOException("VarInt too big (probably corrupted data)"); - } - - if ((blocks[i] & 128) != 128) { - ++i; - int y = index / (width * length); - int z = index % (width * length) / width; - int x = index % (width * length) % width; - BaseBlock block = palette.get(value); - BlockVector pt = new BlockVector(x, y, z); - - try { - if (tileEntitiesMap.containsKey(pt)) { - block.setNbtData(new CompoundTag(tileEntitiesMap.get(pt))); - clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block); - } else { - clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block); - } - break; - } catch (WorldEditException var30) { - throw new IOException("Failed to load a block in the schematic"); - } - } - - ++i; - } - } - - return clipboard; + state = new BaseBlock(material.getId()); } + + byte[] blocks = requireTag(schematic, "BlockData", ByteArrayTag.class).getValue(); + Map> tileEntitiesMap = new HashMap<>(); + ListTag tileEntities = getTag(schematic, "BlockEntities", ListTag.class); + if (tileEntities == null) { + tileEntities = getTag(schematic, "TileEntities", ListTag.class); + } + + if (tileEntities != null) { + List> tileEntityTags = tileEntities.getValue().stream().map((tag) -> + (CompoundTag)tag + ).map(CompoundTag::getValue).collect(Collectors.toList()); + + BlockVector pt; + Map tileEntity; + for(Iterator> var20 = tileEntityTags.iterator(); var20.hasNext(); tileEntitiesMap.put(pt, tileEntity)) { + tileEntity = var20.next(); + int[] pos = requireTag(tileEntity, "Pos", IntArrayTag.class).getValue(); + pt = new BlockVector(pos[0], pos[1], pos[2]); + Map values = Maps.newHashMap(tileEntity); + values.put("x", new IntTag(pt.getBlockX())); + values.put("y", new IntTag(pt.getBlockY())); + values.put("z", new IntTag(pt.getBlockZ())); + values.put("id", values.get("Id")); + values.remove("Id"); + values.remove("Pos"); + tileEntity = values; + } + } + + BlockArrayClipboard clipboard = new BlockArrayClipboard(region); + clipboard.setOrigin(origin); + int index = 0; + + for(int i = 0; i < blocks.length; ++index) { + int value = 0; + int varintLength = 0; + + while(true) { + value |= (blocks[i] & 127) << varintLength++ * 7; + if (varintLength > 5) { + throw new IOException("VarInt too big (probably corrupted data)"); + } + + if ((blocks[i] & 128) != 128) { + ++i; + int y = index / (width * length); + int z = index % (width * length) / width; + int x = index % (width * length) % width; + BaseBlock block = palette.get(value); + BlockVector pt = new BlockVector(x, y, z); + + try { + if (tileEntitiesMap.containsKey(pt)) { + block.setNbtData(new CompoundTag(tileEntitiesMap.get(pt))); + clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block); + } else { + clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block); + } + break; + } catch (WorldEditException var30) { + throw new IOException("Failed to load a block in the schematic"); + } + } + + ++i; + } + } + + return clipboard; } private static T requireTag(Map items, String key, Class expected) throws IOException { diff --git a/SpigotCore_9/src/de/steamwar/sql/Schematic_9.java b/SpigotCore_9/src/de/steamwar/sql/Schematic_9.java index 9a541de..6f27fb7 100644 --- a/SpigotCore_9/src/de/steamwar/sql/Schematic_9.java +++ b/SpigotCore_9/src/de/steamwar/sql/Schematic_9.java @@ -13,11 +13,11 @@ class Schematic_9 { return Schematic_8.getPlayerClipboard(player); } - static void setPlayerClipboard(Player player, InputStream is) throws IOException { - Schematic_8.setPlayerClipboard(player, is); + static void setPlayerClipboard(Player player, InputStream is, boolean schemVersion) throws IOException { + Schematic_8.setPlayerClipboard(player, is, schemVersion); } - static Clipboard getClipboard(InputStream is) throws IOException { - return Schematic_8.getClipboard(is); + static Clipboard getClipboard(InputStream is, boolean schemVersion) throws IOException { + return Schematic_8.getClipboard(is, schemVersion); } } diff --git a/SpigotCore_Main/src/de/steamwar/sql/Schematic.java b/SpigotCore_Main/src/de/steamwar/sql/Schematic.java index 9954681..51c22ad 100644 --- a/SpigotCore_Main/src/de/steamwar/sql/Schematic.java +++ b/SpigotCore_Main/src/de/steamwar/sql/Schematic.java @@ -152,10 +152,7 @@ public class Schematic { return Core.getVersion() > 12 || !schemFormat; } - public Clipboard load() throws WrongVersionException, IOException, NoClipboardException { - if(Core.getVersion() <= 12 && schemFormat) - throw new WrongVersionException(); - + public Clipboard load() throws IOException, NoClipboardException { ResultSet rs = SQL.select("SELECT SchemData FROM Schematic WHERE SchemID = " + schemID); try { rs.next(); @@ -165,26 +162,24 @@ public class Schematic { InputStream is = schemData.getBinaryStream(); switch(Core.getVersion()){ case 8: - return Schematic_8.getClipboard(is); + return Schematic_8.getClipboard(is, schemFormat); case 9: - return Schematic_9.getClipboard(is); + return Schematic_9.getClipboard(is, schemFormat); case 10: - return Schematic_10.getClipboard(is); + return Schematic_10.getClipboard(is, schemFormat); case 14: return Schematic_14.getClipboard(is, schemFormat); case 15: return Schematic_15.getClipboard(is, schemFormat); default: - return Schematic_12.getClipboard(is); + return Schematic_12.getClipboard(is, schemFormat); } } catch (SQLException e) { throw new IOException(e); } } - public void loadToPlayer(Player player) throws IOException, NoClipboardException, WrongVersionException { - if(Core.getVersion() <= 12 && schemFormat) - throw new WrongVersionException(); + public void loadToPlayer(Player player) throws IOException, NoClipboardException { ResultSet rs = SQL.select("SELECT SchemData FROM Schematic WHERE SchemID = " + schemID); try { @@ -192,13 +187,13 @@ public class Schematic { InputStream is = rs.getBlob("SchemData").getBinaryStream(); switch(Core.getVersion()){ case 8: - Schematic_8.setPlayerClipboard(player, is); + Schematic_8.setPlayerClipboard(player, is, schemFormat); break; case 9: - Schematic_9.setPlayerClipboard(player, is); + Schematic_9.setPlayerClipboard(player, is, schemFormat); break; case 10: - Schematic_10.setPlayerClipboard(player, is); + Schematic_10.setPlayerClipboard(player, is, schemFormat); break; case 14: Schematic_14.setPlayerClipboard(player, is, schemFormat); @@ -207,7 +202,7 @@ public class Schematic { Schematic_15.setPlayerClipboard(player, is, schemFormat); break; default: - Schematic_12.setPlayerClipboard(player, is); + Schematic_12.setPlayerClipboard(player, is, schemFormat); } } catch (SQLException e) { throw new IOException(e);