package net.minecraft.advancements.predicates; 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 forward, Optional backward, Optional left, Optional right, Optional jump, Optional sneak, Optional sprint ) { public static final Codec CODEC = RecordCodecBuilder.create( i -> i.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(i, InputPredicate::new) ); public boolean matches(final 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(final Optional match, final boolean value) { return (Boolean)match.map(b -> b == value).orElse(true); } }