package net.minecraft.client.renderer.entity.layers; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import java.util.Map; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.Model; import net.minecraft.client.model.WolfModel; import net.minecraft.client.model.geom.EntityModelSet; 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.RenderLayerParent; import net.minecraft.client.renderer.entity.state.WolfRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.EquipmentClientInfo; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Crackiness; import net.minecraft.world.entity.Crackiness.Level; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.equipment.EquipmentAsset; import net.minecraft.world.item.equipment.Equippable; @Environment(EnvType.CLIENT) public class WolfArmorLayer extends RenderLayer { private final WolfModel adultModel; private final WolfModel babyModel; private final EquipmentLayerRenderer equipmentRenderer; private static final Map ARMOR_CRACK_LOCATIONS = Map.of( Level.LOW, ResourceLocation.withDefaultNamespace("textures/entity/wolf/wolf_armor_crackiness_low.png"), Level.MEDIUM, ResourceLocation.withDefaultNamespace("textures/entity/wolf/wolf_armor_crackiness_medium.png"), Level.HIGH, ResourceLocation.withDefaultNamespace("textures/entity/wolf/wolf_armor_crackiness_high.png") ); public WolfArmorLayer(RenderLayerParent renderer, EntityModelSet entityModels, EquipmentLayerRenderer equipmentRenderer) { super(renderer); this.adultModel = new WolfModel(entityModels.bakeLayer(ModelLayers.WOLF_ARMOR)); this.babyModel = new WolfModel(entityModels.bakeLayer(ModelLayers.WOLF_BABY_ARMOR)); this.equipmentRenderer = equipmentRenderer; } public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, WolfRenderState wolfRenderState, float f, float g) { ItemStack itemStack = wolfRenderState.bodyArmorItem; Equippable equippable = itemStack.get(DataComponents.EQUIPPABLE); if (equippable != null && !equippable.assetId().isEmpty()) { WolfModel wolfModel = wolfRenderState.isBaby ? this.babyModel : this.adultModel; wolfModel.setupAnim(wolfRenderState); this.equipmentRenderer .renderLayers( EquipmentClientInfo.LayerType.WOLF_BODY, (ResourceKey)equippable.assetId().get(), wolfModel, itemStack, poseStack, multiBufferSource, i ); this.maybeRenderCracks(poseStack, multiBufferSource, i, itemStack, wolfModel); } } private void maybeRenderCracks(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, ItemStack armorItem, Model model) { Level level = Crackiness.WOLF_ARMOR.byDamage(armorItem); if (level != Level.NONE) { ResourceLocation resourceLocation = (ResourceLocation)ARMOR_CRACK_LOCATIONS.get(level); VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.armorTranslucent(resourceLocation)); model.renderToBuffer(poseStack, vertexConsumer, packedLight, OverlayTexture.NO_OVERLAY); } } }