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.minecraft.client.data.models.MultiVariant; import net.minecraft.client.renderer.block.model.VariantMutator; import net.minecraft.world.level.block.state.properties.Property; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public abstract class PropertyDispatch { private final Map values = new HashMap<>(); protected void putValue(PropertyValueList p_391165_, V p_391702_) { V v = this.values.put(p_391165_, p_391702_); if (v != null) { throw new IllegalStateException("Value " + p_391165_ + " 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(p_396264_ -> property.getAllValues().map(p_396264_::extend)); } List list1 = stream.filter(p_394003_ -> !this.values.containsKey(p_394003_)).toList(); if (!list1.isEmpty()) { throw new IllegalStateException("Missing definition for properties: " + list1); } } abstract List> getDefinedProperties(); public static > PropertyDispatch.C1 initial(Property p_375693_) { return new PropertyDispatch.C1<>(p_375693_); } public static , T2 extends Comparable> PropertyDispatch.C2 initial( Property p_378486_, Property p_376121_ ) { return new PropertyDispatch.C2<>(p_378486_, p_376121_); } public static , T2 extends Comparable, T3 extends Comparable> PropertyDispatch.C3 initial( Property p_394539_, Property p_393348_, Property p_396231_ ) { return new PropertyDispatch.C3<>(p_394539_, p_393348_, p_396231_); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable> PropertyDispatch.C4 initial( Property p_396442_, Property p_392333_, Property p_396555_, Property p_393660_ ) { return new PropertyDispatch.C4<>(p_396442_, p_392333_, p_396555_, p_393660_); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable, T5 extends Comparable> PropertyDispatch.C5 initial( Property p_378288_, Property p_376698_, Property p_375794_, Property p_377627_, Property p_377745_ ) { return new PropertyDispatch.C5<>(p_378288_, p_376698_, p_375794_, p_377627_, p_377745_); } public static > PropertyDispatch.C1 modify(Property p_392002_) { return new PropertyDispatch.C1<>(p_392002_); } public static , T2 extends Comparable> PropertyDispatch.C2 modify( Property p_391326_, Property p_393658_ ) { return new PropertyDispatch.C2<>(p_391326_, p_393658_); } public static , T2 extends Comparable, T3 extends Comparable> PropertyDispatch.C3 modify( Property p_378219_, Property p_376157_, Property p_377920_ ) { return new PropertyDispatch.C3<>(p_378219_, p_376157_, p_377920_); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable> PropertyDispatch.C4 modify( Property p_376975_, Property p_376597_, Property p_375517_, Property p_375767_ ) { return new PropertyDispatch.C4<>(p_376975_, p_376597_, p_375517_, p_375767_); } public static , T2 extends Comparable, T3 extends Comparable, T4 extends Comparable, T5 extends Comparable> PropertyDispatch.C5 modify( Property p_392424_, Property p_393722_, Property p_394175_, Property p_395776_, Property p_393427_ ) { return new PropertyDispatch.C5<>(p_392424_, p_393722_, p_394175_, p_395776_, p_393427_); } @OnlyIn(Dist.CLIENT) public static class C1> extends PropertyDispatch { private final Property property1; C1(Property p_377319_) { this.property1 = p_377319_; } @Override public List> getDefinedProperties() { return List.of(this.property1); } public PropertyDispatch.C1 select(T1 p_377138_, V p_391518_) { PropertyValueList propertyvaluelist = PropertyValueList.of(this.property1.value(p_377138_)); this.putValue(propertyvaluelist, p_391518_); return this; } public PropertyDispatch generate(Function p_376293_) { this.property1.getPossibleValues().forEach(p_389286_ -> this.select((T1)p_389286_, p_376293_.apply((T1)p_389286_))); return this; } } @OnlyIn(Dist.CLIENT) public static class C2, T2 extends Comparable> extends PropertyDispatch { private final Property property1; private final Property property2; C2(Property p_377098_, Property p_375939_) { this.property1 = p_377098_; this.property2 = p_375939_; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2); } public PropertyDispatch.C2 select(T1 p_375979_, T2 p_375490_, V p_392168_) { PropertyValueList propertyvaluelist = PropertyValueList.of(this.property1.value(p_375979_), this.property2.value(p_375490_)); this.putValue(propertyvaluelist, p_392168_); return this; } public PropertyDispatch generate(BiFunction p_376615_) { this.property1 .getPossibleValues() .forEach( p_377154_ -> this.property2 .getPossibleValues() .forEach(p_389289_ -> this.select((T1)p_377154_, (T2)p_389289_, p_376615_.apply((T1)p_377154_, (T2)p_389289_))) ); return this; } } @OnlyIn(Dist.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 p_378639_, Property p_378424_, Property p_376367_) { this.property1 = p_378639_; this.property2 = p_378424_; this.property3 = p_376367_; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2, this.property3); } public PropertyDispatch.C3 select(T1 p_375963_, T2 p_376963_, T3 p_376668_, V p_396210_) { PropertyValueList propertyvaluelist = PropertyValueList.of( this.property1.value(p_375963_), this.property2.value(p_376963_), this.property3.value(p_376668_) ); this.putValue(propertyvaluelist, p_396210_); return this; } public PropertyDispatch generate(Function3 p_392989_) { this.property1 .getPossibleValues() .forEach( p_377047_ -> this.property2 .getPossibleValues() .forEach( p_377231_ -> this.property3 .getPossibleValues() .forEach( p_389293_ -> this.select( (T1)p_377047_, (T2)p_377231_, (T3)p_389293_, p_392989_.apply((T1)p_377047_, (T2)p_377231_, (T3)p_389293_) ) ) ) ); return this; } } @OnlyIn(Dist.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 p_377852_, Property p_377209_, Property p_378386_, Property p_376113_) { this.property1 = p_377852_; this.property2 = p_377209_; this.property3 = p_378386_; this.property4 = p_376113_; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2, this.property3, this.property4); } public PropertyDispatch.C4 select(T1 p_378307_, T2 p_376465_, T3 p_377599_, T4 p_378302_, V p_395358_) { PropertyValueList propertyvaluelist = PropertyValueList.of( this.property1.value(p_378307_), this.property2.value(p_376465_), this.property3.value(p_377599_), this.property4.value(p_378302_) ); this.putValue(propertyvaluelist, p_395358_); return this; } public PropertyDispatch generate(Function4 p_392096_) { this.property1 .getPossibleValues() .forEach( p_376254_ -> this.property2 .getPossibleValues() .forEach( p_375541_ -> this.property3 .getPossibleValues() .forEach( p_376281_ -> this.property4 .getPossibleValues() .forEach( p_389298_ -> this.select( (T1)p_376254_, (T2)p_375541_, (T3)p_376281_, (T4)p_389298_, p_392096_.apply((T1)p_376254_, (T2)p_375541_, (T3)p_376281_, (T4)p_389298_) ) ) ) ) ); return this; } } @OnlyIn(Dist.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 p_375447_, Property p_377052_, Property p_378060_, Property p_376870_, Property p_375803_) { this.property1 = p_375447_; this.property2 = p_377052_; this.property3 = p_378060_; this.property4 = p_376870_; this.property5 = p_375803_; } @Override public List> getDefinedProperties() { return List.of(this.property1, this.property2, this.property3, this.property4, this.property5); } public PropertyDispatch.C5 select(T1 p_378643_, T2 p_377480_, T3 p_376302_, T4 p_375916_, T5 p_378810_, V p_393152_) { PropertyValueList propertyvaluelist = PropertyValueList.of( this.property1.value(p_378643_), this.property2.value(p_377480_), this.property3.value(p_376302_), this.property4.value(p_375916_), this.property5.value(p_378810_) ); this.putValue(propertyvaluelist, p_393152_); return this; } public PropertyDispatch generate(Function5 p_396465_) { this.property1 .getPossibleValues() .forEach( p_376257_ -> this.property2 .getPossibleValues() .forEach( p_378211_ -> this.property3 .getPossibleValues() .forEach( p_376810_ -> this.property4 .getPossibleValues() .forEach( p_378107_ -> this.property5 .getPossibleValues() .forEach( p_389304_ -> this.select( (T1)p_376257_, (T2)p_378211_, (T3)p_376810_, (T4)p_378107_, (T5)p_389304_, p_396465_.apply((T1)p_376257_, (T2)p_378211_, (T3)p_376810_, (T4)p_378107_, (T5)p_389304_) ) ) ) ) ) ); return this; } } }