164 lines
6.3 KiB
Java
164 lines
6.3 KiB
Java
package net.minecraft.advancements.critereon;
|
|
|
|
import com.google.gson.JsonElement;
|
|
import com.google.gson.JsonNull;
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.JsonPrimitive;
|
|
import com.mojang.brigadier.StringReader;
|
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
|
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
|
import java.util.function.Function;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.network.chat.Component;
|
|
import net.minecraft.util.GsonHelper;
|
|
|
|
public record WrappedMinMaxBounds(@Nullable Float min, @Nullable Float max) {
|
|
public static final WrappedMinMaxBounds ANY = new WrappedMinMaxBounds(null, null);
|
|
public static final SimpleCommandExceptionType ERROR_INTS_ONLY = new SimpleCommandExceptionType(Component.translatable("argument.range.ints"));
|
|
|
|
public static WrappedMinMaxBounds exactly(float p_164403_) {
|
|
return new WrappedMinMaxBounds(p_164403_, p_164403_);
|
|
}
|
|
|
|
public static WrappedMinMaxBounds between(float p_164405_, float p_164406_) {
|
|
return new WrappedMinMaxBounds(p_164405_, p_164406_);
|
|
}
|
|
|
|
public static WrappedMinMaxBounds atLeast(float p_164415_) {
|
|
return new WrappedMinMaxBounds(p_164415_, null);
|
|
}
|
|
|
|
public static WrappedMinMaxBounds atMost(float p_164418_) {
|
|
return new WrappedMinMaxBounds(null, p_164418_);
|
|
}
|
|
|
|
public boolean matches(float p_164420_) {
|
|
if (this.min != null && this.max != null && this.min > this.max && this.min > p_164420_ && this.max < p_164420_) {
|
|
return false;
|
|
} else {
|
|
return this.min != null && this.min > p_164420_ ? false : this.max == null || !(this.max < p_164420_);
|
|
}
|
|
}
|
|
|
|
public boolean matchesSqr(double p_164401_) {
|
|
if (this.min != null
|
|
&& this.max != null
|
|
&& this.min > this.max
|
|
&& this.min * this.min > p_164401_
|
|
&& this.max * this.max < p_164401_) {
|
|
return false;
|
|
} else {
|
|
return this.min != null && this.min * this.min > p_164401_
|
|
? false
|
|
: this.max == null || !(this.max * this.max < p_164401_);
|
|
}
|
|
}
|
|
|
|
public JsonElement serializeToJson() {
|
|
if (this == ANY) {
|
|
return JsonNull.INSTANCE;
|
|
} else if (this.min != null && this.max != null && this.min.equals(this.max)) {
|
|
return new JsonPrimitive(this.min);
|
|
} else {
|
|
JsonObject jsonobject = new JsonObject();
|
|
if (this.min != null) {
|
|
jsonobject.addProperty("min", this.min);
|
|
}
|
|
|
|
if (this.max != null) {
|
|
jsonobject.addProperty("max", this.min);
|
|
}
|
|
|
|
return jsonobject;
|
|
}
|
|
}
|
|
|
|
public static WrappedMinMaxBounds fromJson(@Nullable JsonElement p_164408_) {
|
|
if (p_164408_ == null || p_164408_.isJsonNull()) {
|
|
return ANY;
|
|
} else if (GsonHelper.isNumberValue(p_164408_)) {
|
|
float f2 = GsonHelper.convertToFloat(p_164408_, "value");
|
|
return new WrappedMinMaxBounds(f2, f2);
|
|
} else {
|
|
JsonObject jsonobject = GsonHelper.convertToJsonObject(p_164408_, "value");
|
|
Float f = jsonobject.has("min") ? GsonHelper.getAsFloat(jsonobject, "min") : null;
|
|
Float f1 = jsonobject.has("max") ? GsonHelper.getAsFloat(jsonobject, "max") : null;
|
|
return new WrappedMinMaxBounds(f, f1);
|
|
}
|
|
}
|
|
|
|
public static WrappedMinMaxBounds fromReader(StringReader p_164410_, boolean p_164411_) throws CommandSyntaxException {
|
|
return fromReader(p_164410_, p_164411_, p_164413_ -> p_164413_);
|
|
}
|
|
|
|
public static WrappedMinMaxBounds fromReader(StringReader p_75360_, boolean p_75361_, Function<Float, Float> p_75362_) throws CommandSyntaxException {
|
|
if (!p_75360_.canRead()) {
|
|
throw MinMaxBounds.ERROR_EMPTY.createWithContext(p_75360_);
|
|
} else {
|
|
int i = p_75360_.getCursor();
|
|
Float f = optionallyFormat(readNumber(p_75360_, p_75361_), p_75362_);
|
|
Float f1;
|
|
if (p_75360_.canRead(2) && p_75360_.peek() == '.' && p_75360_.peek(1) == '.') {
|
|
p_75360_.skip();
|
|
p_75360_.skip();
|
|
f1 = optionallyFormat(readNumber(p_75360_, p_75361_), p_75362_);
|
|
if (f == null && f1 == null) {
|
|
p_75360_.setCursor(i);
|
|
throw MinMaxBounds.ERROR_EMPTY.createWithContext(p_75360_);
|
|
}
|
|
} else {
|
|
if (!p_75361_ && p_75360_.canRead() && p_75360_.peek() == '.') {
|
|
p_75360_.setCursor(i);
|
|
throw ERROR_INTS_ONLY.createWithContext(p_75360_);
|
|
}
|
|
|
|
f1 = f;
|
|
}
|
|
|
|
if (f == null && f1 == null) {
|
|
p_75360_.setCursor(i);
|
|
throw MinMaxBounds.ERROR_EMPTY.createWithContext(p_75360_);
|
|
} else {
|
|
return new WrappedMinMaxBounds(f, f1);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
private static Float readNumber(StringReader p_75368_, boolean p_75369_) throws CommandSyntaxException {
|
|
int i = p_75368_.getCursor();
|
|
|
|
while (p_75368_.canRead() && isAllowedNumber(p_75368_, p_75369_)) {
|
|
p_75368_.skip();
|
|
}
|
|
|
|
String s = p_75368_.getString().substring(i, p_75368_.getCursor());
|
|
if (s.isEmpty()) {
|
|
return null;
|
|
} else {
|
|
try {
|
|
return Float.parseFloat(s);
|
|
} catch (NumberFormatException numberformatexception) {
|
|
if (p_75369_) {
|
|
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidDouble().createWithContext(p_75368_, s);
|
|
} else {
|
|
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidInt().createWithContext(p_75368_, s);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static boolean isAllowedNumber(StringReader p_75371_, boolean p_75372_) {
|
|
char c0 = p_75371_.peek();
|
|
if ((c0 < '0' || c0 > '9') && c0 != '-') {
|
|
return p_75372_ && c0 == '.' ? !p_75371_.canRead(2) || p_75371_.peek(1) != '.' : false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
private static Float optionallyFormat(@Nullable Float p_75364_, Function<Float, Float> p_75365_) {
|
|
return p_75364_ == null ? null : p_75365_.apply(p_75364_);
|
|
}
|
|
} |