package net.minecraft.client.resources.model; import com.google.common.collect.Lists; import java.util.Collections; import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.util.random.WeightedEntry; import net.minecraft.util.random.WeightedRandom; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class WeightedBakedModel implements BakedModel { private final int totalWeight; private final List> list; private final BakedModel wrapped; public WeightedBakedModel(List> list) { this.list = list; this.totalWeight = WeightedRandom.getTotalWeight(list); this.wrapped = (BakedModel)((WeightedEntry.Wrapper)list.get(0)).data(); } @Override public List getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) { return (List)WeightedRandom.getWeightedItem(this.list, Math.abs((int)random.nextLong()) % this.totalWeight) .map(wrapper -> ((BakedModel)wrapper.data()).getQuads(state, direction, random)) .orElse(Collections.emptyList()); } @Override public boolean useAmbientOcclusion() { return this.wrapped.useAmbientOcclusion(); } @Override public boolean isGui3d() { return this.wrapped.isGui3d(); } @Override public boolean usesBlockLight() { return this.wrapped.usesBlockLight(); } @Override public boolean isCustomRenderer() { return this.wrapped.isCustomRenderer(); } @Override public TextureAtlasSprite getParticleIcon() { return this.wrapped.getParticleIcon(); } @Override public ItemTransforms getTransforms() { return this.wrapped.getTransforms(); } @Override public ItemOverrides getOverrides() { return this.wrapped.getOverrides(); } @Environment(EnvType.CLIENT) public static class Builder { private final List> list = Lists.>newArrayList(); public WeightedBakedModel.Builder add(@Nullable BakedModel model, int weight) { if (model != null) { this.list.add(WeightedEntry.wrap(model, weight)); } return this; } @Nullable public BakedModel build() { if (this.list.isEmpty()) { return null; } else { return (BakedModel)(this.list.size() == 1 ? (BakedModel)((WeightedEntry.Wrapper)this.list.get(0)).data() : new WeightedBakedModel(this.list)); } } } }