Made /up and /ceil benefit from fly mode.

This avoids littering the world with floating glass blocks when possible.
This commit is contained in:
TomyLobo 2013-10-23 19:03:09 +02:00
parent 90e1788781
commit dcd1c7cee8
3 changed files with 43 additions and 5 deletions

View File

@ -236,6 +236,17 @@ public abstract class LocalPlayer {
* @return whether the player was moved * @return whether the player was moved
*/ */
public boolean ascendToCeiling(int clearance) { public boolean ascendToCeiling(int clearance) {
return ascendToCeiling(clearance, true);
}
/**
* Ascend to the ceiling above.
*
* @param clearance How many blocks to leave above the player's head
* @param alwaysGlass Always put glass under the player
* @return whether the player was moved
*/
public boolean ascendToCeiling(int clearance, boolean alwaysGlass) {
Vector pos = getBlockIn(); Vector pos = getBlockIn();
int x = pos.getBlockX(); int x = pos.getBlockX();
int initialY = Math.max(0, pos.getBlockY()); int initialY = Math.max(0, pos.getBlockY());
@ -252,7 +263,7 @@ public abstract class LocalPlayer {
// Found a ceiling! // Found a ceiling!
if (!BlockType.canPassThrough(world.getBlock(new Vector(x, y, z)))) { if (!BlockType.canPassThrough(world.getBlock(new Vector(x, y, z)))) {
int platformY = Math.max(initialY, y - 3 - clearance); int platformY = Math.max(initialY, y - 3 - clearance);
floatAt(x, platformY + 1, z); floatAt(x, platformY + 1, z, alwaysGlass);
return true; return true;
} }
@ -269,6 +280,17 @@ public abstract class LocalPlayer {
* @return whether the player was moved * @return whether the player was moved
*/ */
public boolean ascendUpwards(int distance) { public boolean ascendUpwards(int distance) {
return ascendUpwards(distance, true);
}
/**
* Just go up.
*
* @param distance How far up to teleport
* @param alwaysGlass Always put glass under the player
* @return whether the player was moved
*/
public boolean ascendUpwards(int distance, boolean alwaysGlass) {
final Vector pos = getBlockIn(); final Vector pos = getBlockIn();
final int x = pos.getBlockX(); final int x = pos.getBlockX();
final int initialY = Math.max(0, pos.getBlockY()); final int initialY = Math.max(0, pos.getBlockY());
@ -283,7 +305,7 @@ public abstract class LocalPlayer {
} else if (y > maxY + 1) { } else if (y > maxY + 1) {
break; break;
} else if (y == maxY + 1) { } else if (y == maxY + 1) {
floatAt(x, y - 1, z); floatAt(x, y - 1, z, alwaysGlass);
return true; return true;
} }
@ -300,7 +322,7 @@ public abstract class LocalPlayer {
* @param y The Y coordinate of the block to float in * @param y The Y coordinate of the block to float in
* @param z The Z coordinate of the block to float in * @param z The Z coordinate of the block to float in
*/ */
private void floatAt(int x, int y, int z) { public void floatAt(int x, int y, int z, boolean alwaysGlass) {
getPosition().getWorld().setBlockType(new Vector(x, y - 1, z), BlockID.GLASS); getPosition().getWorld().setBlockType(new Vector(x, y - 1, z), BlockID.GLASS);
setPosition(new Vector(x + 0.5, y, z + 0.5)); setPosition(new Vector(x + 0.5, y, z + 0.5));
} }

View File

@ -19,6 +19,7 @@
package com.sk89q.worldedit.bukkit; package com.sk89q.worldedit.bukkit;
import com.sk89q.worldedit.blocks.BlockID;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -150,4 +151,15 @@ public class BukkitPlayer extends LocalPlayer {
public boolean hasCreativeMode() { public boolean hasCreativeMode() {
return player.getGameMode() == GameMode.CREATIVE; return player.getGameMode() == GameMode.CREATIVE;
} }
@Override
public void floatAt(int x, int y, int z, boolean alwaysGlass) {
if (alwaysGlass || !player.getAllowFlight()) {
super.floatAt(x, y, z, alwaysGlass);
return;
}
setPosition(new Vector(x + 0.5, y, z + 0.5));
player.setFlying(true);
}
} }

View File

@ -118,6 +118,7 @@ public class NavigationCommands {
aliases = { "ceil" }, aliases = { "ceil" },
usage = "[clearance]", usage = "[clearance]",
desc = "Go to the celing", desc = "Go to the celing",
flags = "g",
min = 0, min = 0,
max = 1 max = 1
) )
@ -129,7 +130,8 @@ public class NavigationCommands {
int clearence = args.argsLength() > 0 ? int clearence = args.argsLength() > 0 ?
Math.max(0, args.getInteger(0)) : 0; Math.max(0, args.getInteger(0)) : 0;
if (player.ascendToCeiling(clearence)) { final boolean alwaysGlass = args.hasFlag('g');
if (player.ascendToCeiling(clearence, alwaysGlass)) {
player.print("Whoosh!"); player.print("Whoosh!");
} else { } else {
player.printError("No free spot above you found."); player.printError("No free spot above you found.");
@ -177,6 +179,7 @@ public class NavigationCommands {
aliases = { "up" }, aliases = { "up" },
usage = "<block>", usage = "<block>",
desc = "Go upwards some distance", desc = "Go upwards some distance",
flags = "g",
min = 1, min = 1,
max = 1 max = 1
) )
@ -187,7 +190,8 @@ public class NavigationCommands {
int distance = args.getInteger(0); int distance = args.getInteger(0);
if (player.ascendUpwards(distance)) { final boolean alwaysGlass = args.hasFlag('g');
if (player.ascendUpwards(distance, alwaysGlass)) {
player.print("Whoosh!"); player.print("Whoosh!");
} else { } else {
player.printError("You would hit something above you."); player.printError("You would hit something above you.");