Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-11-14 15:10:05 +01:00
Added support for mathematical expressions for numeric arguments in commands.
This only works for commands that have been ported over to the new command framework.
Dieser Commit ist enthalten in:
Ursprung
1f6e31dae8
Commit
6c4a321d61
@ -19,8 +19,16 @@
|
|||||||
|
|
||||||
package com.sk89q.worldedit.util.command.binding;
|
package com.sk89q.worldedit.util.command.binding;
|
||||||
|
|
||||||
import com.sk89q.worldedit.util.command.parametric.*;
|
import com.sk89q.worldedit.internal.expression.Expression;
|
||||||
|
import com.sk89q.worldedit.internal.expression.ExpressionException;
|
||||||
|
import com.sk89q.worldedit.internal.expression.runtime.EvaluationException;
|
||||||
|
import com.sk89q.worldedit.util.command.parametric.ArgumentStack;
|
||||||
|
import com.sk89q.worldedit.util.command.parametric.BindingBehavior;
|
||||||
|
import com.sk89q.worldedit.util.command.parametric.BindingHelper;
|
||||||
|
import com.sk89q.worldedit.util.command.parametric.BindingMatch;
|
||||||
|
import com.sk89q.worldedit.util.command.parametric.ParameterException;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,6 +92,35 @@ public final class PrimitiveBindings extends BindingHelper {
|
|||||||
return context.nextBoolean();
|
return context.nextBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to parse numeric input as either a number or a mathematical expression.
|
||||||
|
*
|
||||||
|
* @param input input
|
||||||
|
* @return a number
|
||||||
|
* @throws ParameterException thrown on parse error
|
||||||
|
*/
|
||||||
|
private @Nullable Double parseNumericInput(@Nullable String input) throws ParameterException {
|
||||||
|
if (input == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return Double.parseDouble(input);
|
||||||
|
} catch (NumberFormatException e1) {
|
||||||
|
try {
|
||||||
|
Expression expression = Expression.compile(input);
|
||||||
|
return expression.evaluate();
|
||||||
|
} catch (EvaluationException e) {
|
||||||
|
throw new ParameterException(String.format(
|
||||||
|
"Expected '%s' to be a valid number (or a valid mathematical expression)", input));
|
||||||
|
} catch (ExpressionException e) {
|
||||||
|
throw new ParameterException(String.format(
|
||||||
|
"Expected '%s' to be a number or valid math expression (error: %s)", input, e.getMessage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a type from a {@link ArgumentStack}.
|
* Gets a type from a {@link ArgumentStack}.
|
||||||
*
|
*
|
||||||
@ -96,13 +133,15 @@ public final class PrimitiveBindings extends BindingHelper {
|
|||||||
behavior = BindingBehavior.CONSUMES,
|
behavior = BindingBehavior.CONSUMES,
|
||||||
consumedCount = 1,
|
consumedCount = 1,
|
||||||
provideModifiers = true)
|
provideModifiers = true)
|
||||||
public Integer getInteger(ArgumentStack context, Annotation[] modifiers)
|
public Integer getInteger(ArgumentStack context, Annotation[] modifiers) throws ParameterException {
|
||||||
throws ParameterException {
|
Double v = parseNumericInput(context.next());
|
||||||
Integer v = context.nextInt();
|
|
||||||
if (v != null) {
|
if (v != null) {
|
||||||
validate(v, modifiers);
|
int intValue = v.intValue();
|
||||||
|
validate(intValue, modifiers);
|
||||||
|
return intValue;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -117,8 +156,7 @@ public final class PrimitiveBindings extends BindingHelper {
|
|||||||
behavior = BindingBehavior.CONSUMES,
|
behavior = BindingBehavior.CONSUMES,
|
||||||
consumedCount = 1,
|
consumedCount = 1,
|
||||||
provideModifiers = true)
|
provideModifiers = true)
|
||||||
public Short getShort(ArgumentStack context, Annotation[] modifiers)
|
public Short getShort(ArgumentStack context, Annotation[] modifiers) throws ParameterException {
|
||||||
throws ParameterException {
|
|
||||||
Integer v = getInteger(context, modifiers);
|
Integer v = getInteger(context, modifiers);
|
||||||
if (v != null) {
|
if (v != null) {
|
||||||
return v.shortValue();
|
return v.shortValue();
|
||||||
@ -138,13 +176,14 @@ public final class PrimitiveBindings extends BindingHelper {
|
|||||||
behavior = BindingBehavior.CONSUMES,
|
behavior = BindingBehavior.CONSUMES,
|
||||||
consumedCount = 1,
|
consumedCount = 1,
|
||||||
provideModifiers = true)
|
provideModifiers = true)
|
||||||
public Double getDouble(ArgumentStack context, Annotation[] modifiers)
|
public Double getDouble(ArgumentStack context, Annotation[] modifiers) throws ParameterException {
|
||||||
throws ParameterException {
|
Double v = parseNumericInput(context.next());
|
||||||
Double v = context.nextDouble();
|
|
||||||
if (v != null) {
|
if (v != null) {
|
||||||
validate(v, modifiers);
|
validate(v, modifiers);
|
||||||
|
return v;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -159,8 +198,7 @@ public final class PrimitiveBindings extends BindingHelper {
|
|||||||
behavior = BindingBehavior.CONSUMES,
|
behavior = BindingBehavior.CONSUMES,
|
||||||
consumedCount = 1,
|
consumedCount = 1,
|
||||||
provideModifiers = true)
|
provideModifiers = true)
|
||||||
public Float getFloat(ArgumentStack context, Annotation[] modifiers)
|
public Float getFloat(ArgumentStack context, Annotation[] modifiers) throws ParameterException {
|
||||||
throws ParameterException {
|
|
||||||
Double v = getDouble(context, modifiers);
|
Double v = getDouble(context, modifiers);
|
||||||
if (v != null) {
|
if (v != null) {
|
||||||
return v.floatValue();
|
return v.floatValue();
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren