diff --git a/src/WorldEdit.java b/src/WorldEdit.java
index 0fabd0353..63fb109d8 100644
--- a/src/WorldEdit.java
+++ b/src/WorldEdit.java
@@ -94,6 +94,8 @@ public class WorldEdit {
commands.put("/editexpand", "
[Num] - Expands the selection");
commands.put("/editcontract", " [Num] - Contracts the selection");
commands.put("/unstuck", "Go up to the first free spot");
+ commands.put("/ascend", "Go up one level");
+ commands.put("/descend", "Go dowm one level");
}
/**
@@ -202,6 +204,26 @@ public class WorldEdit {
player.findFreePosition();
return true;
+ // Ascend a level
+ } else if(split[0].equalsIgnoreCase("/ascend")) {
+ checkArgs(split, 0, 0, split[0]);
+ if (player.ascendLevel()) {
+ player.print("Ascended a level.");
+ } else {
+ player.printError("No free spot above you found.");
+ }
+ return true;
+
+ // Descend a level
+ } else if(split[0].equalsIgnoreCase("/descend")) {
+ checkArgs(split, 0, 0, split[0]);
+ if (player.descendLevel()) {
+ player.print("Descended a level.");
+ } else {
+ player.printError("No free spot below you found.");
+ }
+ return true;
+
// Set edit position #1
} else if (split[0].equalsIgnoreCase("/editpos1")) {
checkArgs(split, 0, 0, split[0]);
diff --git a/src/WorldEditPlayer.java b/src/WorldEditPlayer.java
index 45141d54b..11ffa6b81 100644
--- a/src/WorldEditPlayer.java
+++ b/src/WorldEditPlayer.java
@@ -133,7 +133,7 @@ public class WorldEditPlayer {
/**
* Move the player.
- *
+ *
* @param pos
* @param pitch
* @param yaw
@@ -148,6 +148,21 @@ public class WorldEditPlayer {
player.teleportTo(loc);
}
+ /**
+ * Move the player.
+ *
+ * @param pos
+ */
+ public void setPosition(Vector pos) {
+ Location loc = new Location();
+ loc.x = pos.getX();
+ loc.y = pos.getY();
+ loc.z = pos.getZ();
+ loc.rotX = (float)getYaw();
+ loc.rotY = (float)getPitch();
+ player.teleportTo(loc);
+ }
+
/**
* Find a position for the player to stand that is not inside a block.
* Blocks above the player will be iteratively tested until there is
@@ -186,6 +201,73 @@ public class WorldEditPlayer {
}
}
+ /**
+ * Go up one level to the next free space above.
+ *
+ * @return true if a spot was found
+ */
+ public boolean ascendLevel() {
+ int x = (int)Math.floor(player.getX());
+ int y = (int)Math.floor(player.getY());
+ int z = (int)Math.floor(player.getZ());
+
+ byte free = 0;
+ byte spots = 0;
+ boolean inFree = false;
+
+ while (y <= 129) {
+ if (etc.getServer().getBlockIdAt(x, y, z) == 0) {
+ free++;
+ } else {
+ free = 0;
+ inFree = false;
+ }
+
+ if (free == 2 && inFree == false) {
+ inFree = true;
+ spots++;
+ if (y >= 129 || spots == 2) {
+ setPosition(new Vector(x + 0.5, y - 1, z + 0.5));
+ return true;
+ }
+ }
+
+ y++;
+ }
+
+ return false;
+ }
+
+ /**
+ * Go up one level to the next free space above.
+ *
+ * @return true if a spot was found
+ */
+ public boolean descendLevel() {
+ int x = (int)Math.floor(player.getX());
+ int y = (int)Math.floor(player.getY()) - 1;
+ int z = (int)Math.floor(player.getZ());
+
+ byte free = 0;
+
+ while (y >= 0) {
+ if (etc.getServer().getBlockIdAt(x, y, z) == 0) {
+ free++;
+ } else {
+ free = 0;
+ }
+
+ if (free == 2) {
+ setPosition(new Vector(x + 0.5, y, z + 0.5));
+ return true;
+ }
+
+ y--;
+ }
+
+ return false;
+ }
+
/**
* Gives the player an item.
*