package net.minecraft.client.renderer.block.dispatch; import java.util.List; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ResolvableModel.Resolver; import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.client.resources.model.sprite.Material.Baked; import net.minecraft.util.RandomSource; import net.minecraft.util.random.Weighted; import net.minecraft.util.random.WeightedList; public class WeightedVariants implements BlockStateModel { private final WeightedList list; private final Baked particleMaterial; @BakedQuad.MaterialFlags private final int materialFlags; public WeightedVariants(final WeightedList list) { this.list = list; BlockStateModel firstModel = (BlockStateModel)((Weighted)list.unwrap().getFirst()).value(); this.particleMaterial = firstModel.particleMaterial(); this.materialFlags = computeMaterialFlags(list); } @BakedQuad.MaterialFlags private static int computeMaterialFlags(final WeightedList list) { int flags = 0; for (Weighted entry : list.unwrap()) { flags |= ((BlockStateModel)entry.value()).materialFlags(); } return flags; } @Override public Baked particleMaterial() { return this.particleMaterial; } @BakedQuad.MaterialFlags @Override public int materialFlags() { return this.materialFlags; } @Override public void collectParts(final RandomSource random, final List output) { ((BlockStateModel)this.list.getRandomOrThrow(random)).collectParts(random, output); } public record Unbaked(WeightedList entries) implements BlockStateModel.Unbaked { @Override public BlockStateModel bake(final ModelBaker modelBakery) { return new WeightedVariants(this.entries.map(m -> m.bake(modelBakery))); } @Override public void resolveDependencies(final Resolver resolver) { this.entries.unwrap().forEach(v -> ((BlockStateModel.Unbaked)v.value()).resolveDependencies(resolver)); } } }