From 23e0b0ef02e57ba4c96759f3027433b73ef016d0 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Fri, 1 Nov 2019 22:26:39 +0100 Subject: [PATCH] Update SpongeSchematicReader.java --- .../clipboard/io/SpongeSchematicReader.java | 64 +++++++++++++++---- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java index 36ad577b6..f80aea697 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java @@ -60,6 +60,7 @@ import net.jpountz.lz4.LZ4BlockOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.DataInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -228,6 +229,17 @@ public class SpongeSchematicReader extends NBTSchematicReader { }); return root; } + + private BlockState getBlockState(int id) { + return BlockTypes.states[palette[id]]; + } + + private BiomeType getBiomeType(FaweInputStream fis) throws IOException { + char biomeId = biomePalette[fis.readVarInt()]; + BiomeType biome = BiomeTypes.get(biomeId); + return biome; + } + @Override public Clipboard read(UUID uuid, Function createOutput) throws IOException { StreamDelegate root = createDelegate(); @@ -236,32 +248,58 @@ public class SpongeSchematicReader extends NBTSchematicReader { Clipboard clipboard = createOutput.apply(dimensions); BlockVector3 origin = min; - CuboidRegion region; if (offsetX != Integer.MIN_VALUE && offsetY != Integer.MIN_VALUE && offsetZ != Integer.MIN_VALUE) { origin = origin.subtract(BlockVector3.at(offsetX, offsetY, offsetZ)); } - region = new CuboidRegion(min, min.add(width, height, length).subtract(BlockVector3.ONE)); if (blocksOut.getSize() != 0) { try (FaweInputStream fis = new FaweInputStream(new LZ4BlockInputStream(new FastByteArraysInputStream(blocksOut.toByteArrays())))) { - int volume = width * height * length; - if (palette.length < 128) { - for (int index = 0; index < volume; index++) { - BlockState state = BlockTypes.states[palette[fis.read()]]; - clipboard.setBlock(index, state); + if (clipboard instanceof LinearClipboard) { + LinearClipboard linear = (LinearClipboard) clipboard; + int volume = width * height * length; + if (palette.length < 128) { + for (int index = 0; index < volume; index++) { + linear.setBlock(index, getBlockState(fis.read())); + } + } else { + for (int index = 0; index < volume; index++) { + linear.setBlock(index, getBlockState(fis.readVarInt())); + } } } else { - for (int index = 0; index < volume; index++) { - BlockState state = BlockTypes.states[palette[fis.readVarInt()]]; - clipboard.setBlock(index, state); + if (palette.length < 128) { + for (int y = 0; y < height; y++) { + for (int z = 0; z < length; z++) { + for (int x = 0; x < width; x++) { + clipboard.setBlock(x, y, z, getBlockState(fis.read())); + } + } + } + } else { + for (int y = 0; y < height; y++) { + for (int z = 0; z < length; z++) { + for (int x = 0; x < width; x++) { + clipboard.setBlock(x, y, z, getBlockState(fis.readVarInt())); + } + } + } } } } } if (biomesOut.getSize() != 0) { try (FaweInputStream fis = new FaweInputStream(new LZ4BlockInputStream(new FastByteArraysInputStream(biomesOut.toByteArrays())))) { - int volume = width * length; - for (int index = 0; index < volume; index++) { - clipboard.setBiome(index, BiomeTypes.get(fis.read())); + if (clipboard instanceof LinearClipboard) { + LinearClipboard linear = (LinearClipboard) clipboard; + int volume = width * length; + for (int index = 0; index < volume; index++) { + linear.setBiome(index, getBiomeType(fis)); + } + } else { + for (int z = 0; z < length; z++) { + for (int x = 0; x < width; x++) { + clipboard.setBiome(x, 0, z, getBiomeType(fis)); + } + } } } }