minecraft-src/net/minecraft/client/renderer/block/model/multipart/CombinedCondition.java
2025-09-18 12:27:44 +00:00

50 lines
1.6 KiB
Java

package net.minecraft.client.renderer.block.model.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;
import net.minecraft.util.StringRepresentable;
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<Condition> terms) implements Condition {
@Override
public <O, S extends StateHolder<O, S>> Predicate<S> instantiate(StateDefinition<O, S> stateDefinition) {
return this.operation.apply(Lists.transform(this.terms, condition -> condition.instantiate(stateDefinition)));
}
@Environment(EnvType.CLIENT)
public static enum Operation implements StringRepresentable {
AND("AND") {
@Override
public <V> Predicate<V> apply(List<Predicate<V>> conditions) {
return Util.allOf(conditions);
}
},
OR("OR") {
@Override
public <V> Predicate<V> apply(List<Predicate<V>> conditions) {
return Util.anyOf(conditions);
}
};
public static final Codec<CombinedCondition.Operation> CODEC = StringRepresentable.fromEnum(CombinedCondition.Operation::values);
private final String name;
Operation(final String name) {
this.name = name;
}
@Override
public String getSerializedName() {
return this.name;
}
public abstract <V> Predicate<V> apply(List<Predicate<V>> conditions);
}
}