minecraft-src/net/minecraft/client/renderer/block/model/MultiVariant.java
2025-07-04 02:00:41 +03:00

82 lines
2.9 KiB
Java

package net.minecraft.client.renderer.block.model;
import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.List;
import java.util.function.Function;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.client.resources.model.WeightedBakedModel;
import net.minecraft.util.random.SimpleWeightedRandomList;
import net.minecraft.util.random.SimpleWeightedRandomList.Builder;
import net.minecraft.world.level.block.state.BlockState;
@Environment(EnvType.CLIENT)
public record MultiVariant(List<Variant> variants) implements UnbakedBlockStateModel {
public MultiVariant(List<Variant> variants) {
if (variants.isEmpty()) {
throw new IllegalArgumentException("Variant list must contain at least one element");
} else {
this.variants = variants;
}
}
@Override
public Object visualEqualityGroup(BlockState blockState) {
return this;
}
@Override
public void resolveDependencies(UnbakedModel.Resolver resolver) {
this.variants.forEach(variant -> resolver.resolve(variant.getModelLocation()));
}
@Override
public BakedModel bake(ModelBaker baker, Function<Material, TextureAtlasSprite> spriteGetter, ModelState state) {
if (this.variants.size() == 1) {
Variant variant = (Variant)this.variants.getFirst();
return baker.bake(variant.getModelLocation(), variant);
} else {
Builder<BakedModel> builder = SimpleWeightedRandomList.builder();
for (Variant variant2 : this.variants) {
BakedModel bakedModel = baker.bake(variant2.getModelLocation(), variant2);
builder.add(bakedModel, variant2.getWeight());
}
return new WeightedBakedModel(builder.build());
}
}
@Environment(EnvType.CLIENT)
public static class Deserializer implements JsonDeserializer<MultiVariant> {
public MultiVariant deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
List<Variant> list = Lists.<Variant>newArrayList();
if (json.isJsonArray()) {
JsonArray jsonArray = json.getAsJsonArray();
if (jsonArray.isEmpty()) {
throw new JsonParseException("Empty variant array");
}
for (JsonElement jsonElement : jsonArray) {
list.add((Variant)context.deserialize(jsonElement, Variant.class));
}
} else {
list.add((Variant)context.deserialize(json, Variant.class));
}
return new MultiVariant(list);
}
}
}