minecraft-src/net/minecraft/client/renderer/block/model/multipart/Condition.java
2025-07-04 03:45:38 +03:00

46 lines
2 KiB
Java

package net.minecraft.client.renderer.block.model.multipart;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Predicate;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.StateHolder;
@FunctionalInterface
@Environment(EnvType.CLIENT)
public interface Condition {
Codec<Condition> CODEC = Codec.recursive(
"condition",
codec -> {
Codec<CombinedCondition> codec2 = Codec.simpleMap(
CombinedCondition.Operation.CODEC, codec.listOf(), StringRepresentable.keys(CombinedCondition.Operation.values())
)
.codec()
.comapFlatMap(map -> {
if (map.size() != 1) {
return DataResult.error(() -> "Invalid map size for combiner condition, expected exactly one element");
} else {
Entry<CombinedCondition.Operation, List<Condition>> entry = (Entry<CombinedCondition.Operation, List<Condition>>)map.entrySet().iterator().next();
return DataResult.success(new CombinedCondition((CombinedCondition.Operation)entry.getKey(), (List<Condition>)entry.getValue()));
}
}, combinedCondition -> Map.of(combinedCondition.operation(), combinedCondition.terms()));
return Codec.either(codec2, KeyValueCondition.CODEC)
.flatComapMap(either -> either.map(combinedCondition -> combinedCondition, keyValueCondition -> keyValueCondition), condition -> {
return switch (condition) {
case CombinedCondition combinedCondition -> DataResult.success(Either.left(combinedCondition));
case KeyValueCondition keyValueCondition -> DataResult.success(Either.right(keyValueCondition));
default -> DataResult.error(() -> "Unrecognized condition");
};
});
}
);
<O, S extends StateHolder<O, S>> Predicate<S> instantiate(StateDefinition<O, S> stateDefinition);
}