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.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; public record EntityFlagsPredicate( Optional isOnGround, Optional isOnFire, Optional isCrouching, Optional isSprinting, Optional isSwimming, Optional isFlying, Optional isBaby ) { public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( Codec.BOOL.optionalFieldOf("is_on_ground").forGetter(EntityFlagsPredicate::isOnGround), Codec.BOOL.optionalFieldOf("is_on_fire").forGetter(EntityFlagsPredicate::isOnFire), Codec.BOOL.optionalFieldOf("is_sneaking").forGetter(EntityFlagsPredicate::isCrouching), Codec.BOOL.optionalFieldOf("is_sprinting").forGetter(EntityFlagsPredicate::isSprinting), Codec.BOOL.optionalFieldOf("is_swimming").forGetter(EntityFlagsPredicate::isSwimming), Codec.BOOL.optionalFieldOf("is_flying").forGetter(EntityFlagsPredicate::isFlying), Codec.BOOL.optionalFieldOf("is_baby").forGetter(EntityFlagsPredicate::isBaby) ) .apply(instance, EntityFlagsPredicate::new) ); public boolean matches(Entity entity) { if (this.isOnGround.isPresent() && entity.onGround() != (Boolean)this.isOnGround.get()) { return false; } else if (this.isOnFire.isPresent() && entity.isOnFire() != (Boolean)this.isOnFire.get()) { return false; } else if (this.isCrouching.isPresent() && entity.isCrouching() != (Boolean)this.isCrouching.get()) { return false; } else if (this.isSprinting.isPresent() && entity.isSprinting() != (Boolean)this.isSprinting.get()) { return false; } else if (this.isSwimming.isPresent() && entity.isSwimming() != (Boolean)this.isSwimming.get()) { return false; } else { if (this.isFlying.isPresent()) { boolean bl = entity instanceof LivingEntity livingEntity && (livingEntity.isFallFlying() || livingEntity instanceof Player player && player.getAbilities().flying); if (bl != (Boolean)this.isFlying.get()) { return false; } } return !(this.isBaby.isPresent() && entity instanceof LivingEntity livingEntity2) || livingEntity2.isBaby() == (Boolean)this.isBaby.get(); } } public static class Builder { private Optional isOnGround = Optional.empty(); private Optional isOnFire = Optional.empty(); private Optional isCrouching = Optional.empty(); private Optional isSprinting = Optional.empty(); private Optional isSwimming = Optional.empty(); private Optional isFlying = Optional.empty(); private Optional isBaby = Optional.empty(); public static EntityFlagsPredicate.Builder flags() { return new EntityFlagsPredicate.Builder(); } public EntityFlagsPredicate.Builder setOnGround(Boolean onGround) { this.isOnGround = Optional.of(onGround); return this; } public EntityFlagsPredicate.Builder setOnFire(Boolean onFire) { this.isOnFire = Optional.of(onFire); return this; } public EntityFlagsPredicate.Builder setCrouching(Boolean isCrouching) { this.isCrouching = Optional.of(isCrouching); return this; } public EntityFlagsPredicate.Builder setSprinting(Boolean isSprinting) { this.isSprinting = Optional.of(isSprinting); return this; } public EntityFlagsPredicate.Builder setSwimming(Boolean isSwimming) { this.isSwimming = Optional.of(isSwimming); return this; } public EntityFlagsPredicate.Builder setIsFlying(Boolean isFlying) { this.isFlying = Optional.of(isFlying); return this; } public EntityFlagsPredicate.Builder setIsBaby(Boolean isBaby) { this.isBaby = Optional.of(isBaby); return this; } public EntityFlagsPredicate build() { return new EntityFlagsPredicate(this.isOnGround, this.isOnFire, this.isCrouching, this.isSprinting, this.isSwimming, this.isFlying, this.isBaby); } } }