package net.minecraft.client.renderer.blockentity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; import java.util.EnumSet; import java.util.Optional; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.client.model.geom.builders.LayerDefinition; import net.minecraft.client.model.geom.builders.MeshDefinition; import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.resources.model.Material; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.entity.DecoratedPotBlockEntity; import net.minecraft.world.level.block.entity.DecoratedPotPatterns; import net.minecraft.world.level.block.entity.PotDecorations; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class DecoratedPotRenderer implements BlockEntityRenderer { private static final String NECK = "neck"; private static final String FRONT = "front"; private static final String BACK = "back"; private static final String LEFT = "left"; private static final String RIGHT = "right"; private static final String TOP = "top"; private static final String BOTTOM = "bottom"; private final ModelPart neck; private final ModelPart frontSide; private final ModelPart backSide; private final ModelPart leftSide; private final ModelPart rightSide; private final ModelPart top; private final ModelPart bottom; private static final float WOBBLE_AMPLITUDE = 0.125F; public DecoratedPotRenderer(BlockEntityRendererProvider.Context p_272872_) { this(p_272872_.getModelSet()); } public DecoratedPotRenderer(EntityModelSet p_376368_) { ModelPart modelpart = p_376368_.bakeLayer(ModelLayers.DECORATED_POT_BASE); this.neck = modelpart.getChild("neck"); this.top = modelpart.getChild("top"); this.bottom = modelpart.getChild("bottom"); ModelPart modelpart1 = p_376368_.bakeLayer(ModelLayers.DECORATED_POT_SIDES); this.frontSide = modelpart1.getChild("front"); this.backSide = modelpart1.getChild("back"); this.leftSide = modelpart1.getChild("left"); this.rightSide = modelpart1.getChild("right"); } public static LayerDefinition createBaseLayer() { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); CubeDeformation cubedeformation = new CubeDeformation(0.2F); CubeDeformation cubedeformation1 = new CubeDeformation(-0.1F); partdefinition.addOrReplaceChild( "neck", CubeListBuilder.create() .texOffs(0, 0) .addBox(4.0F, 17.0F, 4.0F, 8.0F, 3.0F, 8.0F, cubedeformation1) .texOffs(0, 5) .addBox(5.0F, 20.0F, 5.0F, 6.0F, 1.0F, 6.0F, cubedeformation), PartPose.offsetAndRotation(0.0F, 37.0F, 16.0F, (float) Math.PI, 0.0F, 0.0F) ); CubeListBuilder cubelistbuilder = CubeListBuilder.create().texOffs(-14, 13).addBox(0.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F); partdefinition.addOrReplaceChild("top", cubelistbuilder, PartPose.offsetAndRotation(1.0F, 16.0F, 1.0F, 0.0F, 0.0F, 0.0F)); partdefinition.addOrReplaceChild("bottom", cubelistbuilder, PartPose.offsetAndRotation(1.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.0F)); return LayerDefinition.create(meshdefinition, 32, 32); } public static LayerDefinition createSidesLayer() { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); CubeListBuilder cubelistbuilder = CubeListBuilder.create() .texOffs(1, 0) .addBox(0.0F, 0.0F, 0.0F, 14.0F, 16.0F, 0.0F, EnumSet.of(Direction.NORTH)); partdefinition.addOrReplaceChild("back", cubelistbuilder, PartPose.offsetAndRotation(15.0F, 16.0F, 1.0F, 0.0F, 0.0F, (float) Math.PI)); partdefinition.addOrReplaceChild("left", cubelistbuilder, PartPose.offsetAndRotation(1.0F, 16.0F, 1.0F, 0.0F, (float) (-Math.PI / 2), (float) Math.PI)); partdefinition.addOrReplaceChild("right", cubelistbuilder, PartPose.offsetAndRotation(15.0F, 16.0F, 15.0F, 0.0F, (float) (Math.PI / 2), (float) Math.PI)); partdefinition.addOrReplaceChild("front", cubelistbuilder, PartPose.offsetAndRotation(1.0F, 16.0F, 15.0F, (float) Math.PI, 0.0F, 0.0F)); return LayerDefinition.create(meshdefinition, 16, 16); } private static Material getSideMaterial(Optional p_344130_) { if (p_344130_.isPresent()) { Material material = Sheets.getDecoratedPotMaterial(DecoratedPotPatterns.getPatternFromItem(p_344130_.get())); if (material != null) { return material; } } return Sheets.DECORATED_POT_SIDE; } public void render( DecoratedPotBlockEntity p_273776_, float p_273103_, PoseStack p_273455_, MultiBufferSource p_273010_, int p_273407_, int p_273059_, Vec3 p_392675_ ) { p_273455_.pushPose(); Direction direction = p_273776_.getDirection(); p_273455_.translate(0.5, 0.0, 0.5); p_273455_.mulPose(Axis.YP.rotationDegrees(180.0F - direction.toYRot())); p_273455_.translate(-0.5, 0.0, -0.5); DecoratedPotBlockEntity.WobbleStyle decoratedpotblockentity$wobblestyle = p_273776_.lastWobbleStyle; if (decoratedpotblockentity$wobblestyle != null && p_273776_.getLevel() != null) { float f = ((float)(p_273776_.getLevel().getGameTime() - p_273776_.wobbleStartedAtTick) + p_273103_) / decoratedpotblockentity$wobblestyle.duration; if (f >= 0.0F && f <= 1.0F) { if (decoratedpotblockentity$wobblestyle == DecoratedPotBlockEntity.WobbleStyle.POSITIVE) { float f1 = 0.015625F; float f2 = f * (float) (Math.PI * 2); float f3 = -1.5F * (Mth.cos(f2) + 0.5F) * Mth.sin(f2 / 2.0F); p_273455_.rotateAround(Axis.XP.rotation(f3 * 0.015625F), 0.5F, 0.0F, 0.5F); float f4 = Mth.sin(f2); p_273455_.rotateAround(Axis.ZP.rotation(f4 * 0.015625F), 0.5F, 0.0F, 0.5F); } else { float f5 = Mth.sin(-f * 3.0F * (float) Math.PI) * 0.125F; float f6 = 1.0F - f; p_273455_.rotateAround(Axis.YP.rotation(f5 * f6), 0.5F, 0.0F, 0.5F); } } } this.render(p_273455_, p_273010_, p_273407_, p_273059_, p_273776_.getDecorations()); p_273455_.popPose(); } public void renderInHand(PoseStack p_376090_, MultiBufferSource p_378049_, int p_376175_, int p_377059_, PotDecorations p_375435_) { this.render(p_376090_, p_378049_, p_376175_, p_377059_, p_375435_); } private void render(PoseStack p_375797_, MultiBufferSource p_375609_, int p_376933_, int p_376356_, PotDecorations p_376443_) { VertexConsumer vertexconsumer = Sheets.DECORATED_POT_BASE.buffer(p_375609_, RenderType::entitySolid); this.neck.render(p_375797_, vertexconsumer, p_376933_, p_376356_); this.top.render(p_375797_, vertexconsumer, p_376933_, p_376356_); this.bottom.render(p_375797_, vertexconsumer, p_376933_, p_376356_); this.renderSide(this.frontSide, p_375797_, p_375609_, p_376933_, p_376356_, getSideMaterial(p_376443_.front())); this.renderSide(this.backSide, p_375797_, p_375609_, p_376933_, p_376356_, getSideMaterial(p_376443_.back())); this.renderSide(this.leftSide, p_375797_, p_375609_, p_376933_, p_376356_, getSideMaterial(p_376443_.left())); this.renderSide(this.rightSide, p_375797_, p_375609_, p_376933_, p_376356_, getSideMaterial(p_376443_.right())); } private void renderSide(ModelPart p_273495_, PoseStack p_272899_, MultiBufferSource p_273582_, int p_273242_, int p_273108_, Material p_273173_) { p_273495_.render(p_272899_, p_273173_.buffer(p_273582_, RenderType::entitySolid), p_273242_, p_273108_); } }