minecraft-src/net/minecraft/client/resources/model/WeightedBakedModel.java
2025-07-04 01:41:11 +03:00

94 lines
2.8 KiB
Java

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<WeightedEntry.Wrapper<BakedModel>> list;
private final BakedModel wrapped;
public WeightedBakedModel(List<WeightedEntry.Wrapper<BakedModel>> list) {
this.list = list;
this.totalWeight = WeightedRandom.getTotalWeight(list);
this.wrapped = (BakedModel)((WeightedEntry.Wrapper)list.get(0)).data();
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) {
return (List<BakedQuad>)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<WeightedEntry.Wrapper<BakedModel>> list = Lists.<WeightedEntry.Wrapper<BakedModel>>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));
}
}
}
}