Added block damage support to //replace and //replacenear

This commit is contained in:
zml2008 2011-08-28 23:57:07 -07:00
parent d83fed13fb
commit 1562f17540
5 changed files with 55 additions and 20 deletions

View File

@ -999,7 +999,7 @@ public class EditSession {
* @return number of blocks affected * @return number of blocks affected
* @throws MaxChangedBlocksException * @throws MaxChangedBlocksException
*/ */
public int replaceBlocks(Region region, Set<Integer> fromBlockTypes, public int replaceBlocks(Region region, Set<BaseBlock> fromBlockTypes,
BaseBlock toBlock) throws MaxChangedBlocksException { BaseBlock toBlock) throws MaxChangedBlocksException {
int affected = 0; int affected = 0;
@ -1019,11 +1019,10 @@ public class EditSession {
for (int y = minY; y <= maxY; ++y) { for (int y = minY; y <= maxY; ++y) {
for (int z = minZ; z <= maxZ; ++z) { for (int z = minZ; z <= maxZ; ++z) {
Vector pt = new Vector(x, y, z); Vector pt = new Vector(x, y, z);
int curBlockType = getBlockType(pt); BaseBlock curBlockType = getBlock(pt);
if ((fromBlockTypes == null && curBlockType != 0) if ((fromBlockTypes == null && !curBlockType.isAir())
|| (fromBlockTypes != null && fromBlockTypes || (fromBlockTypes != null && curBlockType.inIterable(fromBlockTypes))) {
.contains(curBlockType))) {
if (setBlock(pt, toBlock)) { if (setBlock(pt, toBlock)) {
++affected; ++affected;
} }
@ -1033,10 +1032,10 @@ public class EditSession {
} }
} else { } else {
for (Vector pt : region) { for (Vector pt : region) {
int curBlockType = getBlockType(pt); BaseBlock curBlockType = getBlock(pt);
if (fromBlockTypes == null && curBlockType != 0 if (fromBlockTypes == null && !curBlockType.isAir()
|| fromBlockTypes.contains(curBlockType)) { || fromBlockTypes != null && curBlockType.inIterable(fromBlockTypes)) {
if (setBlock(pt, toBlock)) { if (setBlock(pt, toBlock)) {
++affected; ++affected;
} }
@ -1056,7 +1055,7 @@ public class EditSession {
* @return number of blocks affected * @return number of blocks affected
* @throws MaxChangedBlocksException * @throws MaxChangedBlocksException
*/ */
public int replaceBlocks(Region region, Set<Integer> fromBlockTypes, public int replaceBlocks(Region region, Set<BaseBlock> fromBlockTypes,
Pattern pattern) throws MaxChangedBlocksException { Pattern pattern) throws MaxChangedBlocksException {
int affected = 0; int affected = 0;
@ -1076,11 +1075,10 @@ public class EditSession {
for (int y = minY; y <= maxY; ++y) { for (int y = minY; y <= maxY; ++y) {
for (int z = minZ; z <= maxZ; ++z) { for (int z = minZ; z <= maxZ; ++z) {
Vector pt = new Vector(x, y, z); Vector pt = new Vector(x, y, z);
int curBlockType = getBlockType(pt); BaseBlock curBlockType = getBlock(pt);
if ((fromBlockTypes == null && curBlockType != 0) if ((fromBlockTypes == null && !curBlockType.isAir())
|| (fromBlockTypes != null && fromBlockTypes || (fromBlockTypes != null && curBlockType.inIterable(fromBlockTypes))) {
.contains(curBlockType))) {
if (setBlock(pt, pattern.next(pt))) { if (setBlock(pt, pattern.next(pt))) {
++affected; ++affected;
} }
@ -1090,10 +1088,10 @@ public class EditSession {
} }
} else { } else {
for (Vector pt : region) { for (Vector pt : region) {
int curBlockType = getBlockType(pt); BaseBlock curBlockType = getBlock(pt);
if (fromBlockTypes == null && curBlockType != 0 if (fromBlockTypes == null && !curBlockType.isAir()
|| fromBlockTypes.contains(curBlockType)) { || curBlockType.inIterable(fromBlockTypes)) {
if (setBlock(pt, pattern.next(pt))) { if (setBlock(pt, pattern.next(pt))) {
++affected; ++affected;
} }

View File

@ -400,6 +400,21 @@ public class WorldEdit {
return getBlock(player, id, false); return getBlock(player, id, false);
} }
public Set<BaseBlock> getBlocks (LocalPlayer player, String list, boolean allAllowed)
throws DisallowedItemException, UnknownItemException {
String[] items = list.split(",");
Set<BaseBlock> blocks = new HashSet<BaseBlock>();
for (String id : items) {
blocks.add(getBlock(player, id, allAllowed));
}
return blocks;
}
public Set<BaseBlock> getBlocks(LocalPlayer player, String list)
throws DisallowedItemException, UnknownItemException {
return getBlocks(player, list, false);
}
/** /**
* Get a list of blocks as a set. This returns a Pattern. * Get a list of blocks as a set. This returns a Pattern.
* *

View File

@ -115,4 +115,26 @@ public class BaseBlock {
public void flip(FlipDirection direction) { public void flip(FlipDirection direction) {
data = (char)BlockData.flip(type, data, direction); data = (char)BlockData.flip(type, data, direction);
} }
@Override
public boolean equals(Object o) {
if (!(o instanceof BaseBlock)) {
return false;
}
return (type == ((BaseBlock)o).type) && (data == ((BaseBlock)o).data);
}
@Override
public String toString() {
return "BaseBlock id: " + getType() + " with damage: " + getData();
}
public boolean inIterable(Iterable<BaseBlock> iter) {
for (BaseBlock block : iter) {
if (block.equals(this)) {
return true;
}
}
return false;
}
} }

View File

@ -81,13 +81,13 @@ public class RegionCommands {
LocalSession session, LocalPlayer player, EditSession editSession) LocalSession session, LocalPlayer player, EditSession editSession)
throws WorldEditException { throws WorldEditException {
Set<Integer> from; Set<BaseBlock> from;
Pattern to; Pattern to;
if (args.argsLength() == 1) { if (args.argsLength() == 1) {
from = null; from = null;
to = we.getBlockPattern(player, args.getString(0)); to = we.getBlockPattern(player, args.getString(0));
} else { } else {
from = we.getBlockIDs(player, args.getString(0), true); from = we.getBlocks(player, args.getString(0), true);
to = we.getBlockPattern(player, args.getString(1)); to = we.getBlockPattern(player, args.getString(1));
} }

View File

@ -239,13 +239,13 @@ public class UtilityCommands {
int size = Math.max(1, args.getInteger(0)); int size = Math.max(1, args.getInteger(0));
int affected; int affected;
Set<Integer> from; Set<BaseBlock> from;
Pattern to; Pattern to;
if (args.argsLength() == 2) { if (args.argsLength() == 2) {
from = null; from = null;
to = we.getBlockPattern(player, args.getString(1)); to = we.getBlockPattern(player, args.getString(1));
} else { } else {
from = we.getBlockIDs(player, args.getString(1), true); from = we.getBlocks(player, args.getString(1), true);
to = we.getBlockPattern(player, args.getString(2)); to = we.getBlockPattern(player, args.getString(2));
} }