-
-
Notifications
You must be signed in to change notification settings - Fork 204
/
ExpressionPattern.java
66 lines (57 loc) · 2.23 KB
/
ExpressionPattern.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.fastasyncworldedit.core.function.pattern;
import com.sk89q.worldedit.function.pattern.AbstractPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.expression.EvaluationException;
import com.sk89q.worldedit.internal.expression.Expression;
import com.sk89q.worldedit.internal.expression.ExpressionException;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypes;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* A mask that evaluates an expression.
* <p>
* <p>Expressions are evaluated as {@code true} if they return a value
* greater than {@code 0}.</p>
*/
public class ExpressionPattern extends AbstractPattern {
private final Expression expression;
/**
* Create a new instance.
*
* @param input the expression
* @throws ExpressionException thrown if there is an error with the expression
*/
public ExpressionPattern(String input) throws ExpressionException {
checkNotNull(input);
this.expression = Expression.compile(input, "x", "y", "z");
}
/**
* Create a new instance.
*
* @param expression the expression
*/
public ExpressionPattern(Expression expression) {
checkNotNull(expression);
this.expression = expression;
}
@Override
public BaseBlock applyBlock(BlockVector3 vector) {
try {
if (expression.getEnvironment() instanceof WorldEditExpressionEnvironment) {
((WorldEditExpressionEnvironment) expression.getEnvironment()).setCurrentBlock(vector.toVector3());
}
double combined = expression.evaluate(vector.getX(), vector.getY(), vector.getZ());
return BlockState.getFromOrdinal((int) combined).toBaseBlock();
} catch (EvaluationException e) {
e.printStackTrace();
return BlockTypes.AIR.getDefaultState().toBaseBlock();
}
}
@Override
public Pattern fork() {
return new ExpressionPattern(this.expression.clone());
}
}