Added polygonal regions.

This commit is contained in:
sk89q
2011-02-19 17:44:39 -08:00
parent 9667e92d66
commit 97529abaca
17 changed files with 1184 additions and 208 deletions

View File

@ -70,7 +70,7 @@ public class ChunkCommands {
LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException {
Set<Vector2D> chunks = session.getRegion().getChunks();
Set<Vector2D> chunks = session.getSelection(player.getWorld()).getChunks();
for (Vector2D chunk : chunks) {
player.print(NestedFileChunkStore.getFilename(chunk));
@ -91,7 +91,7 @@ public class ChunkCommands {
LocalConfiguration config = we.getConfiguration();
Set<Vector2D> chunks = session.getRegion().getChunks();
Set<Vector2D> chunks = session.getSelection(player.getWorld()).getChunks();
FileOutputStream out = null;
if (config.shellSaveType == null) {

View File

@ -47,7 +47,7 @@ public class ClipboardCommands {
LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException {
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
Vector min = region.getMinimumPoint();
Vector max = region.getMaximumPoint();
Vector pos = player.getBlockIn();
@ -79,7 +79,7 @@ public class ClipboardCommands {
block = we.getBlock(player, args.getString(0));
}
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
Vector min = region.getMinimumPoint();
Vector max = region.getMaximumPoint();
Vector pos = player.getBlockIn();
@ -90,7 +90,7 @@ public class ClipboardCommands {
clipboard.copy(editSession);
session.setClipboard(clipboard);
editSession.setBlocks(session.getRegion(), block);
editSession.setBlocks(session.getSelection(player.getWorld()), block);
player.print("Block(s) cut.");
}

View File

@ -53,10 +53,10 @@ public class RegionCommands {
int affected;
if (pattern instanceof SingleBlockPattern) {
affected = editSession.setBlocks(session.getRegion(),
affected = editSession.setBlocks(session.getSelection(player.getWorld()),
((SingleBlockPattern)pattern).getBlock());
} else {
affected = editSession.setBlocks(session.getRegion(), pattern);
affected = editSession.setBlocks(session.getSelection(player.getWorld()), pattern);
}
player.print(affected + " block(s) have been changed.");
@ -86,10 +86,10 @@ public class RegionCommands {
int affected = 0;
if (to instanceof SingleBlockPattern) {
affected = editSession.replaceBlocks(session.getRegion(), from,
affected = editSession.replaceBlocks(session.getSelection(player.getWorld()), from,
((SingleBlockPattern)to).getBlock());
} else {
affected = editSession.replaceBlocks(session.getRegion(), from, to);
affected = editSession.replaceBlocks(session.getSelection(player.getWorld()), from, to);
}
player.print(affected + " block(s) have been replaced.");
@ -109,7 +109,7 @@ public class RegionCommands {
Pattern pat = we.getBlockPattern(player, args.getString(0));
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
int affected = 0;
if (pat instanceof SingleBlockPattern) {
affected = editSession.overlayCuboidBlocks(region,
@ -133,7 +133,7 @@ public class RegionCommands {
throws WorldEditException {
BaseBlock block = we.getBlock(player, args.getString(0));
int affected = editSession.makeCuboidWalls(session.getRegion(), block);
int affected = editSession.makeCuboidWalls(session.getSelection(player.getWorld()), block);
player.print(affected + " block(s) have been changed.");
}
@ -151,7 +151,7 @@ public class RegionCommands {
throws WorldEditException {
BaseBlock block = we.getBlock(player, args.getString(0));
int affected = editSession.makeCuboidFaces(session.getRegion(), block);
int affected = editSession.makeCuboidFaces(session.getSelection(player.getWorld()), block);
player.print(affected + " block(s) have been changed.");
}
@ -172,7 +172,7 @@ public class RegionCommands {
iterations = args.getInteger(0);
}
HeightMap heightMap = new HeightMap(editSession, session.getRegion());
HeightMap heightMap = new HeightMap(editSession, session.getSelection(player.getWorld()));
HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
int affected = heightMap.applyFilter(filter, iterations);
player.print("Terrain's height map smoothed. " + affected + " block(s) changed.");
@ -203,7 +203,7 @@ public class RegionCommands {
replace = new BaseBlock(0);
}
int affected = editSession.moveCuboidRegion(session.getRegion(),
int affected = editSession.moveCuboidRegion(session.getSelection(player.getWorld()),
dir, count, true, replace);
player.print(affected + " blocks moved.");
}
@ -226,7 +226,7 @@ public class RegionCommands {
Vector dir = we.getDirection(player,
args.argsLength() > 1 ? args.getString(1).toLowerCase() : "me");
int affected = editSession.stackCuboidRegion(session.getRegion(),
int affected = editSession.stackCuboidRegion(session.getSelection(player.getWorld()),
dir, count, !args.hasFlag('a'));
player.print(affected + " blocks changed. Undo with //undo");
}

View File

@ -27,7 +27,10 @@ import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.data.ChunkStore;
import com.sk89q.worldedit.regions.CuboidRegionSelector;
import com.sk89q.worldedit.regions.Polygonal2DRegionSelector;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.blocks.*;
/**
@ -48,14 +51,14 @@ public class SelectionCommands {
LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException {
session.setPos1(player.getBlockIn());
if (session.isRegionDefined()) {
player.print("First position set to " + player.getBlockIn()
+ " (" + session.getRegion().getSize() + ").");
} else {
player.print("First position set to " + player.getBlockIn() + ".");
if (!session.getRegionSelector(player.getWorld())
.selectPrimary(player.getBlockIn())) {
player.printError("Position already set.");
return;
}
session.getRegionSelector(player.getWorld())
.explainPrimarySelection(player, player.getBlockIn());
}
@Command(
@ -69,15 +72,16 @@ public class SelectionCommands {
public static void pos2(CommandContext args, WorldEdit we,
LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException {
session.setPos2(player.getBlockIn());
if (session.isRegionDefined()) {
player.print("Second position set to " + player.getBlockIn()
+ " (" + session.getRegion().getSize() + ").");
} else {
player.print("Second position set to " + player.getBlockIn() + ".");
if (!session.getRegionSelector(player.getWorld())
.selectSecondary(player.getBlockIn())) {
player.printError("Position already set.");
return;
}
session.getRegionSelector(player.getWorld())
.explainSecondarySelection(player, player.getBlockIn());
}
@Command(
@ -95,13 +99,14 @@ public class SelectionCommands {
Vector pos = player.getBlockTrace(300);
if (pos != null) {
session.setPos1(pos);
if (session.isRegionDefined()) {
player.print("First position set to " + pos
+ " (" + session.getRegion().getSize() + ").");
} else {
player.print("First position set to " + pos.toString() + " .");
if (!session.getRegionSelector(player.getWorld())
.selectPrimary(pos)) {
player.printError("Position already set.");
return;
}
session.getRegionSelector(player.getWorld())
.explainPrimarySelection(player, pos);
} else {
player.printError("No block in sight!");
}
@ -122,14 +127,14 @@ public class SelectionCommands {
Vector pos = player.getBlockTrace(300);
if (pos != null) {
session.setPos2(pos);
if (session.isRegionDefined()) {
player.print("Second position set to " + pos
+ " (" + session.getRegion().getSize() + ").");
} else {
player.print("Second position set to " + pos.toString() + " .");
if (!session.getRegionSelector(player.getWorld())
.selectSecondary(pos)) {
player.printError("Position already set.");
return;
}
session.getRegionSelector(player.getWorld())
.explainSecondarySelection(player, pos);
} else {
player.printError("No block in sight!");
}
@ -151,8 +156,10 @@ public class SelectionCommands {
Vector min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
Vector max = min.add(15, 127, 15);
session.setPos1(min);
session.setPos2(max);
CuboidRegionSelector selector = new CuboidRegionSelector();
selector.selectPrimary(min);
selector.selectSecondary(max);
session.setRegionSelector(player.getWorld(), selector);
player.print("Chunk selected: "
+ min2D.getBlockX() + ", " + min2D.getBlockZ());
@ -213,14 +220,18 @@ public class SelectionCommands {
// sky and bedrock.
if (args.getString(0).equalsIgnoreCase("vert")
|| args.getString(0).equalsIgnoreCase("vertical")) {
Region region = session.getRegion();
int oldSize = region.getSize();
region.expand(new Vector(0, 128, 0));
region.expand(new Vector(0, -128, 0));
session.learnRegionChanges();
int newSize = region.getSize();
player.print("Region expanded " + (newSize - oldSize)
+ " blocks [top-to-bottom].");
Region region = session.getSelection(player.getWorld());
try {
int oldSize = region.getArea();
region.expand(new Vector(0, 128, 0));
region.expand(new Vector(0, -128, 0));
session.getRegionSelector().learnChanges();
int newSize = region.getArea();
player.print("Region expanded " + (newSize - oldSize)
+ " blocks [top-to-bottom].");
} catch (RegionOperationException e) {
player.printError(e.getMessage());
}
return;
}
@ -246,16 +257,16 @@ public class SelectionCommands {
dir = we.getDirection(player, "me");
}
Region region = session.getRegion();
int oldSize = region.getSize();
Region region = session.getSelection(player.getWorld());
int oldSize = region.getArea();
region.expand(dir.multiply(change));
if (reverseChange != 0) {
region.expand(dir.multiply(reverseChange));
}
session.learnRegionChanges();
int newSize = region.getSize();
session.getRegionSelector().learnChanges();
int newSize = region.getArea();
player.print("Region expanded " + (newSize - oldSize) + " blocks.");
}
@ -294,16 +305,20 @@ public class SelectionCommands {
dir = we.getDirection(player, "me");
}
Region region = session.getRegion();
int oldSize = region.getSize();
region.contract(dir.multiply(change));
if (reverseChange != 0) {
region.contract(dir.multiply(reverseChange));
try {
Region region = session.getSelection(player.getWorld());
int oldSize = region.getArea();
region.contract(dir.multiply(change));
if (reverseChange != 0) {
region.contract(dir.multiply(reverseChange));
}
session.getRegionSelector().learnChanges();
int newSize = region.getArea();
player.print("Region contracted " + (oldSize - newSize) + " blocks.");
} catch (RegionOperationException e) {
player.printError(e.getMessage());
}
session.learnRegionChanges();
int newSize = region.getSize();
player.print("Region contracted " + (oldSize - newSize) + " blocks.");
}
@Command(
@ -327,12 +342,16 @@ public class SelectionCommands {
dir = we.getDirection(player, "me");
}
Region region = session.getRegion();
region.expand(dir.multiply(change));
region.contract(dir.multiply(change));
session.learnRegionChanges();
player.print("Region shifted.");
try {
Region region = session.getSelection(player.getWorld());
region.expand(dir.multiply(change));
region.contract(dir.multiply(change));
session.getRegionSelector().learnChanges();
player.print("Region shifted.");
} catch (RegionOperationException e) {
player.printError(e.getMessage());
}
}
@Command(
@ -349,23 +368,27 @@ public class SelectionCommands {
throws WorldEditException {
int change = args.getInteger(0);
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
if (!args.hasFlag('h')) {
region.expand((new Vector(0, 1, 0)).multiply(change));
region.expand((new Vector(0, -1, 0)).multiply(change));
try {
if (!args.hasFlag('h')) {
region.expand((new Vector(0, 1, 0)).multiply(change));
region.expand((new Vector(0, -1, 0)).multiply(change));
}
if (!args.hasFlag('v')) {
region.expand((new Vector(1, 0, 0)).multiply(change));
region.expand((new Vector(-1, 0, 0)).multiply(change));
region.expand((new Vector(0, 0, 1)).multiply(change));
region.expand((new Vector(0, 0, -1)).multiply(change));
}
session.getRegionSelector().learnChanges();
player.print("Region outset.");
} catch (RegionOperationException e) {
player.printError(e.getMessage());
}
if (!args.hasFlag('v')) {
region.expand((new Vector(1, 0, 0)).multiply(change));
region.expand((new Vector(-1, 0, 0)).multiply(change));
region.expand((new Vector(0, 0, 1)).multiply(change));
region.expand((new Vector(0, 0, -1)).multiply(change));
}
session.learnRegionChanges();
player.print("Region outset.");
}
@Command(
@ -382,7 +405,7 @@ public class SelectionCommands {
throws WorldEditException {
int change = args.getInteger(0);
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
if (!args.hasFlag('h')) {
region.contract((new Vector(0, 1, 0)).multiply(change));
@ -395,14 +418,14 @@ public class SelectionCommands {
region.contract((new Vector(0, 0, 1)).multiply(change));
region.contract((new Vector(0, 0, -1)).multiply(change));
}
session.learnRegionChanges();
session.getRegionSelector().learnChanges();
player.print("Region inset.");
}
@Command(
aliases = {"/size"},
aliases = {"/m", "//size"},
usage = "",
desc = "Get information about the selection",
min = 0,
@ -412,17 +435,21 @@ public class SelectionCommands {
public static void size(CommandContext args, WorldEdit we,
LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException {
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
Vector size = region.getMaximumPoint()
.subtract(region.getMinimumPoint())
.add(1, 1, 1);
player.print("Type: " + session.getRegionSelector().getTypeName());
for (String line : session.getRegionSelector().getInformationLines()) {
player.print(line);
}
player.print("First position: " + session.getPos1());
player.print("Second position: " + session.getPos2());
player.print("Size: " + size);
player.print("Distance: " + region.getMaximumPoint().distance(region.getMinimumPoint()));
player.print("# of blocks: " + region.getSize());
player.print("Cuboid distance: " + region.getMaximumPoint().distance(region.getMinimumPoint()));
player.print("# of blocks: " + region.getArea());
}
@Command(
@ -440,7 +467,7 @@ public class SelectionCommands {
Set<Integer> searchIDs = we.getBlockIDs(player,
args.getString(0), true);
player.print("Counted: " +
editSession.countBlocks(session.getRegion(), searchIDs));
editSession.countBlocks(session.getSelection(player.getWorld()), searchIDs));
}
@Command(
@ -457,12 +484,12 @@ public class SelectionCommands {
throws WorldEditException {
List<Countable<Integer>> distribution =
editSession.getBlockDistribution(session.getRegion());
editSession.getBlockDistribution(session.getSelection(player.getWorld()));
Logger logger = Logger.getLogger("Minecraft.WorldEdit");
if (distribution.size() > 0) { // *Should* always be true
int size = session.getRegion().getSize();
int size = session.getSelection(player.getWorld()).getArea();
player.print("# total blocks: " + size);
@ -486,4 +513,27 @@ public class SelectionCommands {
player.printError("No blocks counted.");
}
}
@Command(
aliases = {"/sel", ","},
usage = "[type]",
desc = "Choose a region selector",
min = 1,
max = 1
)
public static void select(CommandContext args, WorldEdit we,
LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException {
String typeName = args.getString(0);
if (typeName.equalsIgnoreCase("cuboid")) {
session.setRegionSelector(player.getWorld(), new CuboidRegionSelector());
player.print("Cuboid: left click for point 1, right click for point 2");
} else if (typeName.equalsIgnoreCase("poly")) {
session.setRegionSelector(player.getWorld(), new Polygonal2DRegionSelector());
player.print("2D polygon selector: Left/right click to add a point.");
} else {
player.printError("Only 'cuboid' and 'poly' are accepted.");
}
}
}

View File

@ -71,7 +71,7 @@ public class SnapshotUtilCommands {
return;
}
Region region = session.getRegion();
Region region = session.getSelection(player.getWorld());
Snapshot snapshot;
if (args.argsLength() > 0) {