package net.minecraft.client.data.models.blockstates; import com.mojang.datafixers.util.Function3; import com.mojang.datafixers.util.Function4; import com.mojang.datafixers.util.Function5; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Stream; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.data.models.MultiVariant; import net.minecraft.client.renderer.block.model.VariantMutator; import net.minecraft.world.level.block.state.properties.Property; @Environment(EnvType.CLIENT) public abstract class PropertyDispatch { private final Map values = new HashMap(); protected void putValue(PropertyValueList properties, V value) { V object = (V)this.values.put(properties, value); if (object != null) { throw new IllegalStateException("Value " + properties + " is already defined"); } } Map getEntries() { this.verifyComplete(); return Map.copyOf(this.values); } private void verifyComplete() { List> list = this.getDefinedProperties(); Stream stream = Stream.of(PropertyValueList.EMPTY); for (Property property : list) { stream = stream.flatMap(propertyValueList -> property.getAllValues().map(propertyValueList::extend)); } List list2 = stream.filter(propertyValueList -> !this.values.containsKey(propertyValueList)).toList(); if (!list2.isEmpty()) { throw new IllegalStateException("Missing definition for properties: " + list2); } } abstract List> getDefinedProperties(); public static > PropertyDispatch.C1 initial(Property property) { return new PropertyDispatch.C1<>(property); } public static , T2 extends Comparable> PropertyDispatch.C2 initial( Property property1, Property property2 ) { return new PropertyDispatch.C2<>(property1, property2); } public static , T2 extends Comparable, T3 extends Comparable> PropertyDispatch.C3 initial( Property property1, Property property2, Property property3 ) { return new PropertyDispatch.C3<>(property1, property2, property3); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable> PropertyDispatch.C4 initial( Property property1, Property property2, Property property3, Property property4 ) { return new PropertyDispatch.C4<>(property1, property2, property3, property4); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable, T5 extends Comparable> PropertyDispatch.C5 initial( Property property1, Property property2, Property property3, Property property4, Property property5 ) { return new PropertyDispatch.C5<>(property1, property2, property3, property4, property5); } public static > PropertyDispatch.C1 modify(Property property) { return new PropertyDispatch.C1<>(property); } public static , T2 extends Comparable> PropertyDispatch.C2 modify( Property property1, Property property2 ) { return new PropertyDispatch.C2<>(property1, property2); } public static , T2 extends Comparable, T3 extends Comparable> PropertyDispatch.C3 modify( Property property1, Property property2, Property property3 ) { return new PropertyDispatch.C3<>(property1, property2, property3); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable> PropertyDispatch.C4 modify( Property property1, Property property2, Property property3, Property property4 ) { return new PropertyDispatch.C4<>(property1, property2, property3, property4); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable, T5 extends Comparable> PropertyDispatch.C5 modify( Property property1, Property property2, Property property3, Property property4, Property property5 ) { return new PropertyDispatch.C5<>(property1, property2, property3, property4, property5); } @Environment(EnvType.CLIENT) public static class C1> extends PropertyDispatch { private final Property property1; C1(Property property1) { this.property1 = property1; } @Override public List> getDefinedProperties() { return List.of(this.property1); } public PropertyDispatch.C1 select(T1 property, V value) { PropertyValueList propertyValueList = PropertyValueList.of(this.property1.value(property)); this.putValue(propertyValueList, value); return this; } public PropertyDispatch generate(Function generator) { this.property1.getPossibleValues().forEach(comparable -> this.select((T1)comparable, (V)generator.apply(comparable))); return this; } } @Environment(EnvType.CLIENT) public static class C2, T2 extends Comparable> extends PropertyDispatch { private final Property property1; private final Property property2; C2(Property property1, Property property2) { this.property1 = property1; this.property2 = property2; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2); } public PropertyDispatch.C2 select(T1 property1, T2 property2, V value) { PropertyValueList propertyValueList = PropertyValueList.of(this.property1.value(property1), this.property2.value(property2)); this.putValue(propertyValueList, value); return this; } public PropertyDispatch generate(BiFunction generator) { this.property1 .getPossibleValues() .forEach( comparable -> this.property2 .getPossibleValues() .forEach(comparable2 -> this.select((T1)comparable, (T2)comparable2, (V)generator.apply(comparable, comparable2))) ); return this; } } @Environment(EnvType.CLIENT) public static class C3, T2 extends Comparable, T3 extends Comparable> extends PropertyDispatch { private final Property property1; private final Property property2; private final Property property3; C3(Property property1, Property property2, Property property3) { this.property1 = property1; this.property2 = property2; this.property3 = property3; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2, this.property3); } public PropertyDispatch.C3 select(T1 property1, T2 property2, T3 property3, V value) { PropertyValueList propertyValueList = PropertyValueList.of(this.property1.value(property1), this.property2.value(property2), this.property3.value(property3)); this.putValue(propertyValueList, value); return this; } public PropertyDispatch generate(Function3 generator) { this.property1 .getPossibleValues() .forEach( comparable -> this.property2 .getPossibleValues() .forEach( comparable2 -> this.property3 .getPossibleValues() .forEach( comparable3 -> this.select((T1)comparable, (T2)comparable2, (T3)comparable3, generator.apply((T1)comparable, (T2)comparable2, (T3)comparable3)) ) ) ); return this; } } @Environment(EnvType.CLIENT) public static class C4, T2 extends Comparable, T3 extends Comparable, T4 extends Comparable> extends PropertyDispatch { private final Property property1; private final Property property2; private final Property property3; private final Property property4; C4(Property property1, Property property2, Property property3, Property property4) { this.property1 = property1; this.property2 = property2; this.property3 = property3; this.property4 = property4; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2, this.property3, this.property4); } public PropertyDispatch.C4 select(T1 property1, T2 property2, T3 property3, T4 property4, V value) { PropertyValueList propertyValueList = PropertyValueList.of( this.property1.value(property1), this.property2.value(property2), this.property3.value(property3), this.property4.value(property4) ); this.putValue(propertyValueList, value); return this; } public PropertyDispatch generate(Function4 generator) { this.property1 .getPossibleValues() .forEach( comparable -> this.property2 .getPossibleValues() .forEach( comparable2 -> this.property3 .getPossibleValues() .forEach( comparable3 -> this.property4 .getPossibleValues() .forEach( comparable4 -> this.select( (T1)comparable, (T2)comparable2, (T3)comparable3, (T4)comparable4, generator.apply((T1)comparable, (T2)comparable2, (T3)comparable3, (T4)comparable4) ) ) ) ) ); return this; } } @Environment(EnvType.CLIENT) public static class C5, T2 extends Comparable, T3 extends Comparable, T4 extends Comparable, T5 extends Comparable> extends PropertyDispatch { private final Property property1; private final Property property2; private final Property property3; private final Property property4; private final Property property5; C5(Property property1, Property property2, Property property3, Property property4, Property property5) { this.property1 = property1; this.property2 = property2; this.property3 = property3; this.property4 = property4; this.property5 = property5; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2, this.property3, this.property4, this.property5); } public PropertyDispatch.C5 select(T1 property1, T2 property2, T3 property3, T4 property4, T5 property5, V value) { PropertyValueList propertyValueList = PropertyValueList.of( this.property1.value(property1), this.property2.value(property2), this.property3.value(property3), this.property4.value(property4), this.property5.value(property5) ); this.putValue(propertyValueList, value); return this; } public PropertyDispatch generate(Function5 generator) { this.property1 .getPossibleValues() .forEach( comparable -> this.property2 .getPossibleValues() .forEach( comparable2 -> this.property3 .getPossibleValues() .forEach( comparable3 -> this.property4 .getPossibleValues() .forEach( comparable4 -> this.property5 .getPossibleValues() .forEach( comparable5 -> this.select( (T1)comparable, (T2)comparable2, (T3)comparable3, (T4)comparable4, (T5)comparable5, generator.apply((T1)comparable, (T2)comparable2, (T3)comparable3, (T4)comparable4, (T5)comparable5) ) ) ) ) ) ); return this; } } }