diff --git a/src/CuboidClipboard.java b/src/CuboidClipboard.java index bb76f72bf..df1b22ba8 100644 --- a/src/CuboidClipboard.java +++ b/src/CuboidClipboard.java @@ -155,7 +155,7 @@ public class CuboidClipboard { for (int y = 0; y < size.getBlockY(); y++) { for (int z = 0; z < size.getBlockZ(); z++) { data[x][y][z] = - editSession.getBlock(new Vector(x, y, z).add(origin)); + editSession.getBlock(new Vector(x, y, z).add(getOrigin())); } } } @@ -224,6 +224,9 @@ public class CuboidClipboard { schematic.put("Length", new ShortTag("Length", (short)length)); schematic.put("Height", new ShortTag("Height", (short)height)); schematic.put("Materials", new StringTag("Materials", "Alpha")); + schematic.put("WEOriginX", new IntTag("WEOriginX", getOrigin().getBlockX())); + schematic.put("WEOriginY", new IntTag("WEOriginY", getOrigin().getBlockY())); + schematic.put("WEOriginZ", new IntTag("WEOriginZ", getOrigin().getBlockZ())); // Copy byte[] blocks = new byte[width * height * length]; @@ -285,6 +288,8 @@ public class CuboidClipboard { FileInputStream stream = new FileInputStream(path); NBTInputStream nbtStream = new NBTInputStream(stream); + Vector origin = new Vector(); + // Schematic tag CompoundTag schematicTag = (CompoundTag)nbtStream.readTag(); if (!schematicTag.getName().equals("Schematic")) { @@ -302,6 +307,15 @@ public class CuboidClipboard { short length = (Short)getChildTag(schematic, "Length", ShortTag.class).getValue(); short height = (Short)getChildTag(schematic, "Height", ShortTag.class).getValue(); + try { + int originX = (Integer)getChildTag(schematic, "WEOriginX", IntTag.class).getValue(); + int originY = (Integer)getChildTag(schematic, "WEOriginY", IntTag.class).getValue(); + int originZ = (Integer)getChildTag(schematic, "WEOriginZ", IntTag.class).getValue(); + origin = new Vector(originX, originY, originZ); + } catch (DataException e) { + // No origin data + } + // Check type of Schematic String materials = (String)getChildTag(schematic, "Materials", StringTag.class).getValue(); if (!materials.equals("Alpha")) { @@ -352,6 +366,7 @@ public class CuboidClipboard { Vector size = new Vector(width, height, length); CuboidClipboard clipboard = new CuboidClipboard(size); + clipboard.setOrigin(origin); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { @@ -405,4 +420,18 @@ public class CuboidClipboard { } return tag; } + + /** + * @return the origin + */ + public Vector getOrigin() { + return origin; + } + + /** + * @param origin the origin to set + */ + public void setOrigin(Vector origin) { + this.origin = origin; + } } diff --git a/src/WorldEditListener.java b/src/WorldEditListener.java index 50bd0e7d0..509fe65ee 100644 --- a/src/WorldEditListener.java +++ b/src/WorldEditListener.java @@ -140,8 +140,8 @@ public class WorldEditListener extends PluginListener { commands.put("/removenear", " - Remove blocks near you"); commands.put("//copy", "Copies the currently selected region"); commands.put("//cut", "Cuts the currently selected region"); - commands.put("//paste", "Pastes the clipboard"); - commands.put("//pasteair", "Pastes the clipboard (with air)"); + commands.put("//paste", " - Pastes the clipboard"); + commands.put("//pasteair", " - Pastes the clipboard (with air)"); commands.put("//move", " - Move the selection"); commands.put("//moveair", " - Move the selection (with air)"); commands.put("//stack", " - Stacks the selection"); @@ -599,11 +599,24 @@ public class WorldEditListener extends PluginListener { // Paste } else if (split[0].equalsIgnoreCase("//pasteair") || split[0].equalsIgnoreCase("//paste")) { - Vector pos = session.getPlacementPosition(player); - session.getClipboard().paste(editSession, pos, - split[0].equalsIgnoreCase("//paste")); - player.findFreePosition(); - player.print("Pasted. Undo with //undo"); + checkArgs(split, 0, 1, split[0]); + boolean atOrigin = split.length > 1 + ? (split[1].equalsIgnoreCase("true") + || split[1].equalsIgnoreCase("yes")) + : false; + if (atOrigin) { + Vector pos = session.getClipboard().getOrigin(); + session.getClipboard().place(editSession, pos, + split[0].equalsIgnoreCase("//paste")); + player.findFreePosition(); + player.print("Pasted to copy origin. Undo with //undo"); + } else { + Vector pos = session.getPlacementPosition(player); + session.getClipboard().paste(editSession, pos, + split[0].equalsIgnoreCase("//paste")); + player.findFreePosition(); + player.print("Pasted relative to you. Undo with //undo"); + } return true;