geforkt von Mirrors/FastAsyncWorldEdit
Moved shape generation to EditSession.
Also refactored it to get rid of the 3 different anonymous classes.
Dieser Commit ist enthalten in:
Ursprung
c5c68f481b
Commit
a5e5880064
@ -34,6 +34,9 @@ import com.sk89q.worldedit.regions.*;
|
|||||||
import com.sk89q.worldedit.util.TreeGenerator;
|
import com.sk89q.worldedit.util.TreeGenerator;
|
||||||
import com.sk89q.worldedit.bags.*;
|
import com.sk89q.worldedit.bags.*;
|
||||||
import com.sk89q.worldedit.blocks.*;
|
import com.sk89q.worldedit.blocks.*;
|
||||||
|
import com.sk89q.worldedit.expression.Expression;
|
||||||
|
import com.sk89q.worldedit.expression.ExpressionException;
|
||||||
|
import com.sk89q.worldedit.expression.runtime.RValue;
|
||||||
import com.sk89q.worldedit.masks.Mask;
|
import com.sk89q.worldedit.masks.Mask;
|
||||||
import com.sk89q.worldedit.patterns.*;
|
import com.sk89q.worldedit.patterns.*;
|
||||||
|
|
||||||
@ -2611,4 +2614,32 @@ public class EditSession {
|
|||||||
|
|
||||||
return distribution;
|
return distribution;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int makeShape(final Region region, final Vector zero, final Vector unit, final Pattern pattern, final String expressionString, final boolean hollow) throws ExpressionException, MaxChangedBlocksException {
|
||||||
|
final Expression expression = Expression.compile(expressionString, "x", "y", "z", "type", "data");
|
||||||
|
expression.optimize();
|
||||||
|
|
||||||
|
final RValue typeVariable = expression.getVariable("type");
|
||||||
|
final RValue dataVariable = expression.getVariable("data");
|
||||||
|
|
||||||
|
final ArbitraryShape shape = new ArbitraryShape(region) {
|
||||||
|
@Override
|
||||||
|
protected BaseBlock getMaterial(int x, int y, int z, BaseBlock defaultMaterial) {
|
||||||
|
final Vector scaled = new Vector(x, y, z).subtract(zero).divide(unit);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (expression.evaluate(scaled.getX(), scaled.getY(), scaled.getZ(), defaultMaterial.getType(), defaultMaterial.getData()) <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BaseBlock((int)typeVariable.getValue(), (int)dataVariable.getValue());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return shape.generate(this, pattern, hollow);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,10 +25,7 @@ import com.sk89q.minecraft.util.commands.CommandPermissions;
|
|||||||
import com.sk89q.minecraft.util.commands.Logging;
|
import com.sk89q.minecraft.util.commands.Logging;
|
||||||
import static com.sk89q.minecraft.util.commands.Logging.LogMode.*;
|
import static com.sk89q.minecraft.util.commands.Logging.LogMode.*;
|
||||||
import com.sk89q.worldedit.*;
|
import com.sk89q.worldedit.*;
|
||||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
|
||||||
import com.sk89q.worldedit.expression.Expression;
|
|
||||||
import com.sk89q.worldedit.expression.ExpressionException;
|
import com.sk89q.worldedit.expression.ExpressionException;
|
||||||
import com.sk89q.worldedit.expression.runtime.LValue;
|
|
||||||
import com.sk89q.worldedit.patterns.Pattern;
|
import com.sk89q.worldedit.patterns.Pattern;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
import com.sk89q.worldedit.util.TreeGenerator;
|
import com.sk89q.worldedit.util.TreeGenerator;
|
||||||
@ -320,95 +317,33 @@ public class GenerationCommands {
|
|||||||
final Pattern pattern = we.getBlockPattern(player, args.getString(0));
|
final Pattern pattern = we.getBlockPattern(player, args.getString(0));
|
||||||
final Region region = session.getSelection(player.getWorld());
|
final Region region = session.getSelection(player.getWorld());
|
||||||
|
|
||||||
final Expression expression;
|
final boolean hollow = args.hasFlag('h');
|
||||||
try {
|
|
||||||
expression = Expression.compile(args.getJoinedStrings(1), "x", "y", "z", "type", "data");
|
|
||||||
expression.optimize();
|
|
||||||
} catch (ExpressionException e) {
|
|
||||||
player.printError(e.getMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final LValue typeVariable = (LValue) expression.getVariable("type");
|
final String expression = args.getJoinedStrings(1);
|
||||||
final LValue dataVariable = (LValue) expression.getVariable("data");
|
|
||||||
|
|
||||||
final ArbitraryShape shape;
|
final Vector zero;
|
||||||
|
final Vector unit;
|
||||||
|
|
||||||
if (args.hasFlag('r')) {
|
if (args.hasFlag('r')) {
|
||||||
shape = new ArbitraryShape(region) {
|
zero = new Vector(0,0,0);
|
||||||
@Override
|
unit = new Vector(1,1,1);
|
||||||
protected BaseBlock getMaterial(int x, int y, int z, BaseBlock defaultMaterial) {
|
|
||||||
try {
|
|
||||||
typeVariable.assign(defaultMaterial.getType());
|
|
||||||
dataVariable.assign(defaultMaterial.getData());
|
|
||||||
|
|
||||||
if (expression.evaluate(x, y, z) <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BaseBlock((int)typeVariable.getValue(), (int)dataVariable.getValue());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else if (args.hasFlag('o')) {
|
} else if (args.hasFlag('o')) {
|
||||||
final Vector placement = session.getPlacementPosition(player);
|
zero = session.getPlacementPosition(player);
|
||||||
|
unit = new Vector(1,1,1);
|
||||||
final double placementX = placement.getX();
|
|
||||||
final double placementY = placement.getY();
|
|
||||||
final double placementZ = placement.getZ();
|
|
||||||
|
|
||||||
shape = new ArbitraryShape(region) {
|
|
||||||
@Override
|
|
||||||
protected BaseBlock getMaterial(int x, int y, int z, BaseBlock defaultMaterial) {
|
|
||||||
try {
|
|
||||||
typeVariable.assign(defaultMaterial.getType());
|
|
||||||
dataVariable.assign(defaultMaterial.getData());
|
|
||||||
|
|
||||||
if (expression.evaluate(x - placementX, y - placementY, z - placementZ) <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BaseBlock((int)typeVariable.getValue(), (int)dataVariable.getValue());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
final Vector min = region.getMinimumPoint();
|
final Vector min = region.getMinimumPoint();
|
||||||
final Vector max = region.getMaximumPoint();
|
final Vector max = region.getMaximumPoint();
|
||||||
final Vector center = max.add(min).multiply(0.5);
|
|
||||||
final Vector stretch = max.subtract(center);
|
|
||||||
shape = new ArbitraryShape(region) {
|
|
||||||
@Override
|
|
||||||
protected BaseBlock getMaterial(int x, int y, int z, BaseBlock defaultMaterial) {
|
|
||||||
final Vector scaled = new Vector(x, y, z).subtract(center).divide(stretch);
|
|
||||||
|
|
||||||
try {
|
zero = max.add(min).multiply(0.5);
|
||||||
typeVariable.assign(defaultMaterial.getType());
|
unit = max.subtract(zero);
|
||||||
dataVariable.assign(defaultMaterial.getData());
|
|
||||||
|
|
||||||
if (expression.evaluate(scaled.getX(), scaled.getY(), scaled.getZ()) <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BaseBlock((int)typeVariable.getValue(), (int)dataVariable.getValue());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean hollow = args.hasFlag('h');
|
try {
|
||||||
int affected = shape.generate(editSession, pattern, hollow);
|
final int affected = editSession.makeShape(region, zero, unit, pattern, expression, hollow);
|
||||||
|
player.findFreePosition();
|
||||||
player.findFreePosition();
|
player.print(affected + " block(s) have been created.");
|
||||||
player.print(affected + " block(s) have been created.");
|
} catch (ExpressionException e) {
|
||||||
|
player.printError(e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren