minecraft-src/net/minecraft/advancements/critereon/InputPredicate.java
2025-07-04 02:49:36 +03:00

43 lines
1.6 KiB
Java

package net.minecraft.advancements.critereon;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.Optional;
import net.minecraft.world.entity.player.Input;
public record InputPredicate(
Optional<Boolean> forward,
Optional<Boolean> backward,
Optional<Boolean> left,
Optional<Boolean> right,
Optional<Boolean> jump,
Optional<Boolean> sneak,
Optional<Boolean> sprint
) {
public static final Codec<InputPredicate> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
Codec.BOOL.optionalFieldOf("forward").forGetter(InputPredicate::forward),
Codec.BOOL.optionalFieldOf("backward").forGetter(InputPredicate::backward),
Codec.BOOL.optionalFieldOf("left").forGetter(InputPredicate::left),
Codec.BOOL.optionalFieldOf("right").forGetter(InputPredicate::right),
Codec.BOOL.optionalFieldOf("jump").forGetter(InputPredicate::jump),
Codec.BOOL.optionalFieldOf("sneak").forGetter(InputPredicate::sneak),
Codec.BOOL.optionalFieldOf("sprint").forGetter(InputPredicate::sprint)
)
.apply(instance, InputPredicate::new)
);
public boolean matches(Input input) {
return this.matches(this.forward, input.forward())
&& this.matches(this.backward, input.backward())
&& this.matches(this.left, input.left())
&& this.matches(this.right, input.right())
&& this.matches(this.jump, input.jump())
&& this.matches(this.sneak, input.shift())
&& this.matches(this.sprint, input.sprint());
}
private boolean matches(Optional<Boolean> input, boolean expectedValue) {
return (Boolean)input.map(boolean_ -> boolean_ == expectedValue).orElse(true);
}
}