diff --git a/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java b/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java index c7bfd2de6..1ed559b60 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java +++ b/src/main/java/com/sk89q/worldedit/blocks/BaseBlock.java @@ -34,7 +34,7 @@ public class BaseBlock { /** * BaseBlock data. */ - private byte data = 0; + private short data = 0; /** * Construct the block with its type. @@ -53,7 +53,7 @@ public class BaseBlock { */ public BaseBlock(int type, int data) { this.type = (short) type; - this.data = (byte) data; + this.data = (short) data; } /** @@ -81,7 +81,7 @@ public class BaseBlock { * @param data the data to set */ public void setData(int data) { - this.data = (byte) data; + this.data = (short) data; } /** @@ -98,7 +98,7 @@ public class BaseBlock { */ public int rotate90() { int newData = BlockData.rotate90(type, data); - this.data = (byte) newData; + this.data = (short) newData; return data; } @@ -107,7 +107,7 @@ public class BaseBlock { */ public int rotate90Reverse() { int newData = BlockData.rotate90Reverse(type, data); - this.data = (byte) newData; + this.data = (short) newData; return newData; } @@ -119,7 +119,7 @@ public class BaseBlock { */ public int cycleData(int increment) { int newData = BlockData.cycle(this.type, this.data, increment); - this.data = (byte) newData; + this.data = (short) newData; return newData; } @@ -127,7 +127,7 @@ public class BaseBlock { * Flip this block. */ public BaseBlock flip() { - data = (byte) BlockData.flip(type, data); + data = (short) BlockData.flip(type, data); return this; } @@ -136,7 +136,7 @@ public class BaseBlock { * @param direction */ public BaseBlock flip(FlipDirection direction) { - data = (byte) BlockData.flip(type, data, direction); + data = (short) BlockData.flip(type, data, direction); return this; } diff --git a/src/main/java/com/sk89q/worldedit/schematic/MCEditSchematicFormat.java b/src/main/java/com/sk89q/worldedit/schematic/MCEditSchematicFormat.java index 96766dc2a..6b05f52ad 100644 --- a/src/main/java/com/sk89q/worldedit/schematic/MCEditSchematicFormat.java +++ b/src/main/java/com/sk89q/worldedit/schematic/MCEditSchematicFormat.java @@ -107,8 +107,19 @@ public class MCEditSchematicFormat extends SchematicFormat { } // Get blocks - byte[] blocks = getChildTag(schematic, "Blocks", ByteArrayTag.class).getValue(); + byte[] rawBlocks = getChildTag(schematic, "Blocks", ByteArrayTag.class).getValue(); byte[] blockData = getChildTag(schematic, "Data", ByteArrayTag.class).getValue(); + short[] blocks = new short[rawBlocks.length]; + + if (schematic.containsKey("AddBlocks")) { + byte[] addBlockIds = getChildTag(schematic, "AddBlocks", ByteArrayTag.class).getValue(); + for (int i = 0, index = 0; i < addBlockIds.length && index < blocks.length; ++i) { + blocks[index] = (short) (addBlockIds[i] & 0xF << 8 + rawBlocks[index++]); + if (index < blocks.length) { + blocks[index] = (short) (((addBlockIds[i] << 4) & 0xF) << 8 + rawBlocks[index++]); + } + } + } // Need to pull out tile entities List tileEntities = getChildTag(schematic, "TileEntities", ListTag.class) @@ -201,6 +212,7 @@ public class MCEditSchematicFormat extends SchematicFormat { // Copy byte[] blocks = new byte[width * height * length]; + byte[] addBlocks = null; byte[] blockData = new byte[width * height * length]; ArrayList tileEntities = new ArrayList(); @@ -209,6 +221,15 @@ public class MCEditSchematicFormat extends SchematicFormat { for (int z = 0; z < length; ++z) { int index = y * width * length + z * width + x; BaseBlock block = clipboard.getPoint(new BlockVector(x, y, z)); + if (block.getType() > 255) { + if (addBlocks == null) { + addBlocks = new byte[blocks.length >> 1]; + } + addBlocks[index >> 1] = (byte) (((index & 1) == 0) ? + addBlocks[index >> 1] & 0xF0 | (block.getType() >> 8) & 0xF + : addBlocks[index >> 1] & 0xF | ((block.getType() >> 8) & 0xF) << 4); + } + blocks[index] = (byte) block.getType(); blockData[index] = (byte) block.getData(); @@ -238,6 +259,9 @@ public class MCEditSchematicFormat extends SchematicFormat { schematic.put("Data", new ByteArrayTag("Data", blockData)); schematic.put("Entities", new ListTag("Entities", CompoundTag.class, new ArrayList())); schematic.put("TileEntities", new ListTag("TileEntities", CompoundTag.class, tileEntities)); + if (addBlocks != null) { + schematic.put("AddBlocks", new ByteArrayTag("AddBlocks", addBlocks)); + } // Build and output CompoundTag schematicTag = new CompoundTag("Schematic", schematic);