Code/net/minecraft/commands/arguments/coordinates/WorldCoordinate.java

97 lines
3.5 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.commands.arguments.coordinates;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import net.minecraft.network.chat.Component;
public class WorldCoordinate {
private static final char PREFIX_RELATIVE = '~';
public static final SimpleCommandExceptionType ERROR_EXPECTED_DOUBLE = new SimpleCommandExceptionType(Component.translatable("argument.pos.missing.double"));
public static final SimpleCommandExceptionType ERROR_EXPECTED_INT = new SimpleCommandExceptionType(Component.translatable("argument.pos.missing.int"));
private final boolean relative;
private final double value;
public WorldCoordinate(boolean p_120864_, double p_120865_) {
this.relative = p_120864_;
this.value = p_120865_;
}
public double get(double p_120868_) {
return this.relative ? this.value + p_120868_ : this.value;
}
public static WorldCoordinate parseDouble(StringReader p_120872_, boolean p_120873_) throws CommandSyntaxException {
if (p_120872_.canRead() && p_120872_.peek() == '^') {
throw Vec3Argument.ERROR_MIXED_TYPE.createWithContext(p_120872_);
} else if (!p_120872_.canRead()) {
throw ERROR_EXPECTED_DOUBLE.createWithContext(p_120872_);
} else {
boolean flag = isRelative(p_120872_);
int i = p_120872_.getCursor();
double d0 = p_120872_.canRead() && p_120872_.peek() != ' ' ? p_120872_.readDouble() : 0.0;
String s = p_120872_.getString().substring(i, p_120872_.getCursor());
if (flag && s.isEmpty()) {
return new WorldCoordinate(true, 0.0);
} else {
if (!s.contains(".") && !flag && p_120873_) {
d0 += 0.5;
}
return new WorldCoordinate(flag, d0);
}
}
}
public static WorldCoordinate parseInt(StringReader p_120870_) throws CommandSyntaxException {
if (p_120870_.canRead() && p_120870_.peek() == '^') {
throw Vec3Argument.ERROR_MIXED_TYPE.createWithContext(p_120870_);
} else if (!p_120870_.canRead()) {
throw ERROR_EXPECTED_INT.createWithContext(p_120870_);
} else {
boolean flag = isRelative(p_120870_);
double d0;
if (p_120870_.canRead() && p_120870_.peek() != ' ') {
d0 = flag ? p_120870_.readDouble() : p_120870_.readInt();
} else {
d0 = 0.0;
}
return new WorldCoordinate(flag, d0);
}
}
public static boolean isRelative(StringReader p_120875_) {
boolean flag;
if (p_120875_.peek() == '~') {
flag = true;
p_120875_.skip();
} else {
flag = false;
}
return flag;
}
@Override
public boolean equals(Object p_120877_) {
if (this == p_120877_) {
return true;
} else if (!(p_120877_ instanceof WorldCoordinate worldcoordinate)) {
return false;
} else {
return this.relative != worldcoordinate.relative ? false : Double.compare(worldcoordinate.value, this.value) == 0;
}
}
@Override
public int hashCode() {
int i = this.relative ? 1 : 0;
long j = Double.doubleToLongBits(this.value);
return 31 * i + (int)(j ^ j >>> 32);
}
public boolean isRelative() {
return this.relative;
}
}