package net.minecraft.client.renderer.item; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.resources.model.ResolvableModel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class CompositeModel implements ItemModel { private final List models; public CompositeModel(List models) { this.models = models; } @Override public void update( ItemStackRenderState renderState, ItemStack stack, ItemModelResolver itemModelResolver, ItemDisplayContext displayContext, @Nullable ClientLevel level, @Nullable LivingEntity entity, int seed ) { renderState.ensureCapacity(this.models.size()); for (ItemModel itemModel : this.models) { itemModel.update(renderState, stack, itemModelResolver, displayContext, level, entity, seed); } } @Environment(EnvType.CLIENT) public record Unbaked(List models) implements ItemModel.Unbaked { public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group(ItemModels.CODEC.listOf().fieldOf("models").forGetter(CompositeModel.Unbaked::models)) .apply(instance, CompositeModel.Unbaked::new) ); @Override public MapCodec type() { return MAP_CODEC; } @Override public void resolveDependencies(ResolvableModel.Resolver resolver) { for (ItemModel.Unbaked unbaked : this.models) { unbaked.resolveDependencies(resolver); } } @Override public ItemModel bake(ItemModel.BakingContext context) { return new CompositeModel(this.models.stream().map(unbaked -> unbaked.bake(context)).toList()); } } }