Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-12-25 02:20:07 +01:00
Reduced indentation level in some methods in WorldEdit.java and made WorldEdit.getBlock less confusing.
Dieser Commit ist enthalten in:
Ursprung
3acc82e97b
Commit
8dbabe344d
@ -391,10 +391,13 @@ public class WorldEdit {
|
||||
String[] blockAndExtraData = arg.split("\\|");
|
||||
String[] typeAndData = blockAndExtraData[0].split(":", 2);
|
||||
String testID = typeAndData[0];
|
||||
|
||||
int blockId = -1;
|
||||
|
||||
int data = -1;
|
||||
|
||||
boolean parseDataValue = true;
|
||||
|
||||
// Attempt to parse the item ID or otherwise resolve an item/block
|
||||
// name to its numeric ID
|
||||
try {
|
||||
@ -414,13 +417,15 @@ public class WorldEdit {
|
||||
if (blockId == -1 && blockType == null) {
|
||||
// Maybe it's a cloth
|
||||
ClothColor col = ClothColor.lookup(testID);
|
||||
|
||||
if (col != null) {
|
||||
blockType = BlockType.CLOTH;
|
||||
data = col.getID();
|
||||
} else {
|
||||
if (col == null) {
|
||||
throw new UnknownItemException(arg);
|
||||
}
|
||||
|
||||
blockType = BlockType.CLOTH;
|
||||
data = col.getID();
|
||||
|
||||
// Prevent overriding the data value
|
||||
parseDataValue = false;
|
||||
}
|
||||
|
||||
// Read block ID
|
||||
@ -432,167 +437,177 @@ public class WorldEdit {
|
||||
throw new UnknownItemException(arg);
|
||||
}
|
||||
|
||||
if (data == -1) { // Block data not yet detected
|
||||
if (!allowNoData && data == -1) {
|
||||
// No wildcards allowed => eliminate them.
|
||||
data = 0;
|
||||
}
|
||||
|
||||
if (parseDataValue) { // Block data not yet detected
|
||||
// Parse the block data (optional)
|
||||
try {
|
||||
data = (typeAndData.length > 1 && typeAndData[1].length() > 0) ? Integer.parseInt(typeAndData[1]) : (allowNoData ? -1 : 0);
|
||||
if (data > 15 || (data < 0 && !(allAllowed && data == -1))) {
|
||||
if (typeAndData.length > 1 && typeAndData[1].length() > 0) {
|
||||
data = Integer.parseInt(typeAndData[1]);
|
||||
}
|
||||
|
||||
if (data > 15) {
|
||||
throw new InvalidItemException(arg, "Unknown invalid data value '" + typeAndData[1] + "'");
|
||||
}
|
||||
|
||||
if (data < 0 && !(allAllowed && data == -1)) {
|
||||
data = 0;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
if (blockType != null) {
|
||||
switch (blockType) {
|
||||
case CLOTH:
|
||||
case STAINED_CLAY:
|
||||
case CARPET:
|
||||
ClothColor col = ClothColor.lookup(typeAndData[1]);
|
||||
|
||||
if (col != null) {
|
||||
data = col.getID();
|
||||
} else {
|
||||
throw new InvalidItemException(arg, "Unknown cloth color '" + typeAndData[1] + "'");
|
||||
}
|
||||
break;
|
||||
|
||||
case STEP:
|
||||
case DOUBLE_STEP:
|
||||
BlockType dataType = BlockType.lookup(typeAndData[1]);
|
||||
|
||||
if (dataType != null) {
|
||||
switch (dataType) {
|
||||
case STONE:
|
||||
data = 0;
|
||||
break;
|
||||
case SANDSTONE:
|
||||
data = 1;
|
||||
break;
|
||||
case WOOD:
|
||||
data = 2;
|
||||
break;
|
||||
case COBBLESTONE:
|
||||
data = 3;
|
||||
break;
|
||||
case BRICK:
|
||||
data = 4;
|
||||
break;
|
||||
case STONE_BRICK:
|
||||
data = 5;
|
||||
break;
|
||||
case NETHER_BRICK:
|
||||
data = 6;
|
||||
break;
|
||||
case QUARTZ_BLOCK:
|
||||
data = 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidItemException(arg, "Invalid step type '" + typeAndData[1] + "'");
|
||||
}
|
||||
} else {
|
||||
throw new InvalidItemException(arg, "Unknown step type '" + typeAndData[1] + "'");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidItemException(arg, "Unknown data value '" + typeAndData[1] + "'");
|
||||
}
|
||||
} else {
|
||||
if (blockType == null) {
|
||||
throw new InvalidItemException(arg, "Unknown data value '" + typeAndData[1] + "'");
|
||||
}
|
||||
|
||||
switch (blockType) {
|
||||
case CLOTH:
|
||||
case STAINED_CLAY:
|
||||
case CARPET:
|
||||
ClothColor col = ClothColor.lookup(typeAndData[1]);
|
||||
if (col == null) {
|
||||
throw new InvalidItemException(arg, "Unknown cloth color '" + typeAndData[1] + "'");
|
||||
}
|
||||
|
||||
data = col.getID();
|
||||
break;
|
||||
|
||||
case STEP:
|
||||
case DOUBLE_STEP:
|
||||
BlockType dataType = BlockType.lookup(typeAndData[1]);
|
||||
|
||||
if (dataType == null) {
|
||||
throw new InvalidItemException(arg, "Unknown step type '" + typeAndData[1] + "'");
|
||||
}
|
||||
|
||||
switch (dataType) {
|
||||
case STONE:
|
||||
data = 0;
|
||||
break;
|
||||
case SANDSTONE:
|
||||
data = 1;
|
||||
break;
|
||||
case WOOD:
|
||||
data = 2;
|
||||
break;
|
||||
case COBBLESTONE:
|
||||
data = 3;
|
||||
break;
|
||||
case BRICK:
|
||||
data = 4;
|
||||
break;
|
||||
case STONE_BRICK:
|
||||
data = 5;
|
||||
break;
|
||||
case NETHER_BRICK:
|
||||
data = 6;
|
||||
break;
|
||||
case QUARTZ_BLOCK:
|
||||
data = 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidItemException(arg, "Invalid step type '" + typeAndData[1] + "'");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new InvalidItemException(arg, "Unknown data value '" + typeAndData[1] + "'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the item is allowed
|
||||
if (allAllowed || player.hasPermission("worldedit.anyblock") || !config.disallowedBlocks.contains(blockId)) {
|
||||
if (blockType != null) {
|
||||
switch (blockType) {
|
||||
case SIGN_POST:
|
||||
case WALL_SIGN:
|
||||
// Allow special sign text syntax
|
||||
String[] text = new String[4];
|
||||
text[0] = blockAndExtraData.length > 1 ? blockAndExtraData[1] : "";
|
||||
text[1] = blockAndExtraData.length > 2 ? blockAndExtraData[2] : "";
|
||||
text[2] = blockAndExtraData.length > 3 ? blockAndExtraData[3] : "";
|
||||
text[3] = blockAndExtraData.length > 4 ? blockAndExtraData[4] : "";
|
||||
return new SignBlock(blockType.getID(), data, text);
|
||||
|
||||
case MOB_SPAWNER:
|
||||
// Allow setting mob spawn type
|
||||
if (blockAndExtraData.length > 1) {
|
||||
String mobName = blockAndExtraData[1];
|
||||
for (MobType mobType : MobType.values()) {
|
||||
if (mobType.getName().toLowerCase().equals(mobName.toLowerCase())) {
|
||||
mobName = mobType.getName();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!server.isValidMobType(mobName)) {
|
||||
throw new InvalidItemException(arg, "Unknown mob type '" + mobName + "'");
|
||||
}
|
||||
return new MobSpawnerBlock(data, mobName);
|
||||
} else {
|
||||
return new MobSpawnerBlock(data, MobType.PIG.getName());
|
||||
}
|
||||
|
||||
case NOTE_BLOCK:
|
||||
// Allow setting note
|
||||
if (blockAndExtraData.length > 1) {
|
||||
byte note = Byte.parseByte(blockAndExtraData[1]);
|
||||
if (note < 0 || note > 24) {
|
||||
throw new InvalidItemException(arg, "Out of range note value: '" + blockAndExtraData[1] + "'");
|
||||
} else {
|
||||
return new NoteBlock(data, note);
|
||||
}
|
||||
} else {
|
||||
return new NoteBlock(data, (byte) 0);
|
||||
}
|
||||
|
||||
case HEAD:
|
||||
// allow setting type/player/rotation
|
||||
if (blockAndExtraData.length > 1) {
|
||||
// and thus, the format shall be "|type|rotation" or "|type" or "|rotation"
|
||||
byte rot = 0;
|
||||
String type = "";
|
||||
try {
|
||||
rot = Byte.parseByte(blockAndExtraData[1]);
|
||||
} catch (NumberFormatException e) {
|
||||
type = blockAndExtraData[1];
|
||||
if (blockAndExtraData.length > 2) {
|
||||
try {
|
||||
rot = Byte.parseByte(blockAndExtraData[2]);
|
||||
} catch (NumberFormatException e2) {
|
||||
throw new InvalidItemException(arg, "Second part of skull metadata should be a number.");
|
||||
}
|
||||
}
|
||||
}
|
||||
byte skullType = 0;
|
||||
// type is either the mob type or the player name
|
||||
// sorry for the four minecraft accounts named "skeleton", "wither", "zombie", or "creeper"
|
||||
if (!type.isEmpty()) {
|
||||
if (type.equalsIgnoreCase("skeleton")) skullType = 0;
|
||||
else if (type.equalsIgnoreCase("wither")) skullType = 1;
|
||||
else if (type.equalsIgnoreCase("zombie")) skullType = 2;
|
||||
else if (type.equalsIgnoreCase("creeper")) skullType = 4;
|
||||
else skullType = 3;
|
||||
}
|
||||
if (skullType == 3) {
|
||||
return new SkullBlock(data, rot, type.replace(" ", "_")); // valid MC usernames
|
||||
} else {
|
||||
return new SkullBlock(data, skullType, rot);
|
||||
}
|
||||
} else {
|
||||
return new SkullBlock(data);
|
||||
}
|
||||
|
||||
default:
|
||||
return new BaseBlock(blockId, data);
|
||||
}
|
||||
} else {
|
||||
return new BaseBlock(blockId, data);
|
||||
}
|
||||
if (!allAllowed && !player.hasPermission("worldedit.anyblock") && config.disallowedBlocks.contains(blockId)) {
|
||||
throw new DisallowedItemException(arg);
|
||||
}
|
||||
|
||||
throw new DisallowedItemException(arg);
|
||||
if (blockType == null) {
|
||||
return new BaseBlock(blockId, data);
|
||||
}
|
||||
|
||||
switch (blockType) {
|
||||
case SIGN_POST:
|
||||
case WALL_SIGN:
|
||||
// Allow special sign text syntax
|
||||
String[] text = new String[4];
|
||||
text[0] = blockAndExtraData.length > 1 ? blockAndExtraData[1] : "";
|
||||
text[1] = blockAndExtraData.length > 2 ? blockAndExtraData[2] : "";
|
||||
text[2] = blockAndExtraData.length > 3 ? blockAndExtraData[3] : "";
|
||||
text[3] = blockAndExtraData.length > 4 ? blockAndExtraData[4] : "";
|
||||
return new SignBlock(blockType.getID(), data, text);
|
||||
|
||||
case MOB_SPAWNER:
|
||||
// Allow setting mob spawn type
|
||||
if (blockAndExtraData.length > 1) {
|
||||
String mobName = blockAndExtraData[1];
|
||||
for (MobType mobType : MobType.values()) {
|
||||
if (mobType.getName().toLowerCase().equals(mobName.toLowerCase())) {
|
||||
mobName = mobType.getName();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!server.isValidMobType(mobName)) {
|
||||
throw new InvalidItemException(arg, "Unknown mob type '" + mobName + "'");
|
||||
}
|
||||
return new MobSpawnerBlock(data, mobName);
|
||||
} else {
|
||||
return new MobSpawnerBlock(data, MobType.PIG.getName());
|
||||
}
|
||||
|
||||
case NOTE_BLOCK:
|
||||
// Allow setting note
|
||||
if (blockAndExtraData.length <= 1) {
|
||||
return new NoteBlock(data, (byte) 0);
|
||||
}
|
||||
|
||||
byte note = Byte.parseByte(blockAndExtraData[1]);
|
||||
if (note < 0 || note > 24) {
|
||||
throw new InvalidItemException(arg, "Out of range note value: '" + blockAndExtraData[1] + "'");
|
||||
}
|
||||
|
||||
return new NoteBlock(data, note);
|
||||
|
||||
case HEAD:
|
||||
// allow setting type/player/rotation
|
||||
if (blockAndExtraData.length <= 1) {
|
||||
return new SkullBlock(data);
|
||||
}
|
||||
|
||||
byte rot = 0;
|
||||
String type = "";
|
||||
try {
|
||||
rot = Byte.parseByte(blockAndExtraData[1]);
|
||||
} catch (NumberFormatException e) {
|
||||
type = blockAndExtraData[1];
|
||||
if (blockAndExtraData.length > 2) {
|
||||
try {
|
||||
rot = Byte.parseByte(blockAndExtraData[2]);
|
||||
} catch (NumberFormatException e2) {
|
||||
throw new InvalidItemException(arg, "Second part of skull metadata should be a number.");
|
||||
}
|
||||
}
|
||||
}
|
||||
byte skullType = 0;
|
||||
// type is either the mob type or the player name
|
||||
// sorry for the four minecraft accounts named "skeleton", "wither", "zombie", or "creeper"
|
||||
if (!type.isEmpty()) {
|
||||
if (type.equalsIgnoreCase("skeleton")) skullType = 0;
|
||||
else if (type.equalsIgnoreCase("wither")) skullType = 1;
|
||||
else if (type.equalsIgnoreCase("zombie")) skullType = 2;
|
||||
else if (type.equalsIgnoreCase("creeper")) skullType = 4;
|
||||
else skullType = 3;
|
||||
}
|
||||
if (skullType == 3) {
|
||||
return new SkullBlock(data, rot, type.replace(" ", "_")); // valid MC usernames
|
||||
} else {
|
||||
return new SkullBlock(data, skullType, rot);
|
||||
}
|
||||
|
||||
default:
|
||||
return new BaseBlock(blockId, data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -646,21 +661,18 @@ public class WorldEdit {
|
||||
|
||||
// Handle special block pattern types
|
||||
if (patternString.charAt(0) == '#') {
|
||||
if (patternString.equals("#clipboard") || patternString.equals("#copy")) {
|
||||
LocalSession session = getSession(player);
|
||||
CuboidClipboard clipboard;
|
||||
|
||||
try {
|
||||
clipboard = session.getClipboard();
|
||||
} catch (EmptyClipboardException e) {
|
||||
player.printError("Copy a selection first with //copy.");
|
||||
throw new UnknownItemException("#clipboard");
|
||||
}
|
||||
|
||||
return new ClipboardPattern(clipboard);
|
||||
} else {
|
||||
if (!patternString.equals("#clipboard") && !patternString.equals("#copy")) {
|
||||
throw new UnknownItemException(patternString);
|
||||
}
|
||||
|
||||
LocalSession session = getSession(player);
|
||||
|
||||
try {
|
||||
return new ClipboardPattern(session.getClipboard());
|
||||
} catch (EmptyClipboardException e) {
|
||||
player.printError("Copy a selection first with //copy.");
|
||||
throw new UnknownItemException("#clipboard");
|
||||
}
|
||||
}
|
||||
|
||||
// If it's only one block, then just return that single one
|
||||
@ -902,25 +914,25 @@ public class WorldEdit {
|
||||
public int getMaximumPolygonalPoints(LocalPlayer player) {
|
||||
if (player.hasPermission("worldedit.limit.unrestricted") || config.maxPolygonalPoints < 0) {
|
||||
return config.defaultMaxPolygonalPoints;
|
||||
} else {
|
||||
if (config.defaultMaxPolygonalPoints < 0) {
|
||||
return config.maxPolygonalPoints;
|
||||
}
|
||||
return Math.min(config.defaultMaxPolygonalPoints,
|
||||
config.maxPolygonalPoints);
|
||||
}
|
||||
|
||||
if (config.defaultMaxPolygonalPoints < 0) {
|
||||
return config.maxPolygonalPoints;
|
||||
}
|
||||
|
||||
return Math.min(config.defaultMaxPolygonalPoints, config.maxPolygonalPoints);
|
||||
}
|
||||
|
||||
public int getMaximumPolyhedronPoints(LocalPlayer player) {
|
||||
if (player.hasPermission("worldedit.limit.unrestricted") || config.maxPolyhedronPoints < 0) {
|
||||
return config.defaultMaxPolyhedronPoints;
|
||||
} else {
|
||||
if (config.defaultMaxPolyhedronPoints < 0) {
|
||||
return config.maxPolyhedronPoints;
|
||||
}
|
||||
return Math.min(config.defaultMaxPolyhedronPoints,
|
||||
config.maxPolyhedronPoints);
|
||||
}
|
||||
|
||||
if (config.defaultMaxPolyhedronPoints < 0) {
|
||||
return config.maxPolyhedronPoints;
|
||||
}
|
||||
|
||||
return Math.min(config.defaultMaxPolyhedronPoints, config.maxPolyhedronPoints);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -958,9 +970,9 @@ public class WorldEdit {
|
||||
File f = new File(path);
|
||||
if (f.isAbsolute()) {
|
||||
return f;
|
||||
} else {
|
||||
return new File(config.getWorkingDirectory(), path);
|
||||
}
|
||||
|
||||
return new File(config.getWorkingDirectory(), path);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren