Code/net/minecraft/advancements/critereon/MovementPredicate.java

96 lines
3.9 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.advancements.critereon;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import net.minecraft.util.Mth;
public record MovementPredicate(
MinMaxBounds.Doubles x,
MinMaxBounds.Doubles y,
MinMaxBounds.Doubles z,
MinMaxBounds.Doubles speed,
MinMaxBounds.Doubles horizontalSpeed,
MinMaxBounds.Doubles verticalSpeed,
MinMaxBounds.Doubles fallDistance
) {
public static final Codec<MovementPredicate> CODEC = RecordCodecBuilder.create(
p_345285_ -> p_345285_.group(
MinMaxBounds.Doubles.CODEC.optionalFieldOf("x", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::x),
MinMaxBounds.Doubles.CODEC.optionalFieldOf("y", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::y),
MinMaxBounds.Doubles.CODEC.optionalFieldOf("z", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::z),
MinMaxBounds.Doubles.CODEC.optionalFieldOf("speed", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::speed),
MinMaxBounds.Doubles.CODEC.optionalFieldOf("horizontal_speed", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::horizontalSpeed),
MinMaxBounds.Doubles.CODEC.optionalFieldOf("vertical_speed", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::verticalSpeed),
MinMaxBounds.Doubles.CODEC.optionalFieldOf("fall_distance", MinMaxBounds.Doubles.ANY).forGetter(MovementPredicate::fallDistance)
)
.apply(p_345285_, MovementPredicate::new)
);
public static MovementPredicate speed(MinMaxBounds.Doubles p_344237_) {
return new MovementPredicate(
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
p_344237_,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY
);
}
public static MovementPredicate horizontalSpeed(MinMaxBounds.Doubles p_343918_) {
return new MovementPredicate(
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
p_343918_,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY
);
}
public static MovementPredicate verticalSpeed(MinMaxBounds.Doubles p_342210_) {
return new MovementPredicate(
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
p_342210_,
MinMaxBounds.Doubles.ANY
);
}
public static MovementPredicate fallDistance(MinMaxBounds.Doubles p_344473_) {
return new MovementPredicate(
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
MinMaxBounds.Doubles.ANY,
p_344473_
);
}
public boolean matches(double p_342615_, double p_343015_, double p_344849_, double p_344583_) {
if (this.x.matches(p_342615_) && this.y.matches(p_343015_) && this.z.matches(p_344849_)) {
double d0 = Mth.lengthSquared(p_342615_, p_343015_, p_344849_);
if (!this.speed.matchesSqr(d0)) {
return false;
} else {
double d1 = Mth.lengthSquared(p_342615_, p_344849_);
if (!this.horizontalSpeed.matchesSqr(d1)) {
return false;
} else {
double d2 = Math.abs(p_343015_);
return !this.verticalSpeed.matches(d2) ? false : this.fallDistance.matches(p_344583_);
}
}
} else {
return false;
}
}
}