package net.minecraft.client.renderer.block.dispatch.multipart; import com.google.common.collect.Lists; import com.mojang.serialization.Codec; import java.util.List; import java.util.function.Predicate; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.util.StringRepresentable; import net.minecraft.util.Util; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.StateHolder; @Environment(EnvType.CLIENT) public record CombinedCondition(CombinedCondition.Operation operation, List terms) implements Condition { @Override public > Predicate instantiate(final StateDefinition definition) { return this.operation.apply(Lists.transform(this.terms, c -> c.instantiate(definition))); } @Environment(EnvType.CLIENT) public static enum Operation implements StringRepresentable { AND("AND") { @Override public Predicate apply(final List> terms) { return Util.allOf(terms); } }, OR("OR") { @Override public Predicate apply(final List> terms) { return Util.anyOf(terms); } }; public static final Codec CODEC = StringRepresentable.fromEnum(CombinedCondition.Operation::values); private final String name; private Operation(final String name) { this.name = name; } @Override public String getSerializedName() { return this.name; } public abstract Predicate apply(List> terms); } }