mirror of
https://github.com/EngineHub/WorldEdit.git
synced 2024-12-21 04:49:51 +08:00
Added pasting at origin and saving origin to the .schematic.
This commit is contained in:
parent
162fd11d40
commit
7585cccccb
@ -155,7 +155,7 @@ public void copy(EditSession editSession) {
|
||||
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 void saveSchematic(String path) throws IOException, DataException {
|
||||
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 static CuboidClipboard loadSchematic(String path)
|
||||
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 static CuboidClipboard loadSchematic(String path)
|
||||
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 static CuboidClipboard loadSchematic(String path)
|
||||
|
||||
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 @@ private static Tag getChildTag(Map<String,Tag> items, String key, Class expected
|
||||
}
|
||||
return tag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the origin
|
||||
*/
|
||||
public Vector getOrigin() {
|
||||
return origin;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param origin the origin to set
|
||||
*/
|
||||
public void setOrigin(Vector origin) {
|
||||
this.origin = origin;
|
||||
}
|
||||
}
|
||||
|
@ -140,8 +140,8 @@ public WorldEditListener() {
|
||||
commands.put("/removenear", "<ID> <Size> - 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", "<AtOrigin?> - Pastes the clipboard");
|
||||
commands.put("//pasteair", "<AtOrigin?> - Pastes the clipboard (with air)");
|
||||
commands.put("//move", "<Count> <Dir> <LeaveID> - Move the selection");
|
||||
commands.put("//moveair", "<Count> <Dir> <LeaveID> - Move the selection (with air)");
|
||||
commands.put("//stack", "<Count> <Dir> - Stacks the selection");
|
||||
@ -599,11 +599,24 @@ public boolean performCommand(WorldEditPlayer player,
|
||||
// Paste
|
||||
} else if (split[0].equalsIgnoreCase("//pasteair") ||
|
||||
split[0].equalsIgnoreCase("//paste")) {
|
||||
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. Undo with //undo");
|
||||
player.print("Pasted relative to you. Undo with //undo");
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user