package net.minecraft.client.renderer.special; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.ShulkerBoxRenderer; import net.minecraft.client.resources.model.Material; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemDisplayContext; @Environment(EnvType.CLIENT) public class ShulkerBoxSpecialRenderer implements NoDataSpecialModelRenderer { private final ShulkerBoxRenderer shulkerBoxRenderer; private final float openness; private final Direction orientation; private final Material material; public ShulkerBoxSpecialRenderer(ShulkerBoxRenderer shulkerBoxRenderer, float openness, Direction orientation, Material material) { this.shulkerBoxRenderer = shulkerBoxRenderer; this.openness = openness; this.orientation = orientation; this.material = material; } @Override public void render( ItemDisplayContext displayContext, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay, boolean hasFoilType ) { this.shulkerBoxRenderer.render(poseStack, bufferSource, packedLight, packedOverlay, this.orientation, this.openness, this.material); } @Environment(EnvType.CLIENT) public record Unbaked(ResourceLocation texture, float openness, Direction orientation) implements net.minecraft.client.renderer.special.SpecialModelRenderer.Unbaked { public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( ResourceLocation.CODEC.fieldOf("texture").forGetter(ShulkerBoxSpecialRenderer.Unbaked::texture), Codec.FLOAT.optionalFieldOf("openness", 0.0F).forGetter(ShulkerBoxSpecialRenderer.Unbaked::openness), Direction.CODEC.optionalFieldOf("orientation", Direction.UP).forGetter(ShulkerBoxSpecialRenderer.Unbaked::orientation) ) .apply(instance, ShulkerBoxSpecialRenderer.Unbaked::new) ); public Unbaked() { this(ResourceLocation.withDefaultNamespace("shulker"), 0.0F, Direction.UP); } public Unbaked(DyeColor color) { this(Sheets.colorToShulkerMaterial(color), 0.0F, Direction.UP); } @Override public MapCodec type() { return MAP_CODEC; } @Override public SpecialModelRenderer bake(EntityModelSet modelSet) { return new ShulkerBoxSpecialRenderer(new ShulkerBoxRenderer(modelSet), this.openness, this.orientation, Sheets.SHULKER_MAPPER.apply(this.texture)); } } }