package net.minecraft.client.renderer.entity; import com.mojang.blaze3d.vertex.PoseStack; import java.util.function.UnaryOperator; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.Model; import net.minecraft.client.model.Model.Simple; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; import net.minecraft.client.renderer.entity.state.BoatRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; @Environment(EnvType.CLIENT) public class BoatRenderer extends AbstractBoatRenderer { private final Model waterPatchModel; private final ResourceLocation texture; private final EntityModel model; public BoatRenderer(Context context, ModelLayerLocation modelLayer) { super(context); this.texture = modelLayer.model().withPath((UnaryOperator)(string -> "textures/entity/" + string + ".png")); this.waterPatchModel = new Simple(context.bakeLayer(ModelLayers.BOAT_WATER_PATCH), resourceLocation -> RenderType.waterMask()); this.model = new BoatModel(context.bakeLayer(modelLayer)); } @Override protected EntityModel model() { return this.model; } @Override protected RenderType renderType() { return this.model.renderType(this.texture); } @Override protected void renderTypeAdditions(BoatRenderState renderState, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { if (!renderState.isUnderWater) { this.waterPatchModel .renderToBuffer(poseStack, bufferSource.getBuffer(this.waterPatchModel.renderType(this.texture)), packedLight, OverlayTexture.NO_OVERLAY); } } }