package net.minecraft.client.renderer.entity; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.entity.layers.CustomHeadLayer; import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; import net.minecraft.client.renderer.entity.layers.WingsLayer; import net.minecraft.client.renderer.entity.state.ArmedEntityRenderState; import net.minecraft.client.renderer.entity.state.HumanoidRenderState; import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.item.CrossbowItem; import net.minecraft.world.item.ItemStack; @Environment(EnvType.CLIENT) public abstract class HumanoidMobRenderer> extends AgeableMobRenderer { public HumanoidMobRenderer(EntityRendererProvider.Context context, M model, float shadowRadius) { this(context, model, model, shadowRadius); } public HumanoidMobRenderer(EntityRendererProvider.Context context, M adultModel, M babyModel, float shadowRadius) { this(context, adultModel, babyModel, shadowRadius, CustomHeadLayer.Transforms.DEFAULT); } public HumanoidMobRenderer(EntityRendererProvider.Context context, M adultModel, M babyModel, float shadowRadius, CustomHeadLayer.Transforms transforms) { super(context, adultModel, babyModel, shadowRadius); this.addLayer(new CustomHeadLayer<>(this, context.getModelSet(), transforms)); this.addLayer(new WingsLayer<>(this, context.getModelSet(), context.getEquipmentRenderer())); this.addLayer(new ItemInHandLayer<>(this)); } protected HumanoidModel.ArmPose getArmPose(T mob, HumanoidArm arm) { return HumanoidModel.ArmPose.EMPTY; } public void extractRenderState(T mob, S humanoidRenderState, float f) { super.extractRenderState(mob, humanoidRenderState, f); extractHumanoidRenderState(mob, humanoidRenderState, f, this.itemModelResolver); humanoidRenderState.leftArmPose = this.getArmPose(mob, HumanoidArm.LEFT); humanoidRenderState.rightArmPose = this.getArmPose(mob, HumanoidArm.RIGHT); } public static void extractHumanoidRenderState(LivingEntity entity, HumanoidRenderState reusedState, float partialTick, ItemModelResolver itemModelResolver) { ArmedEntityRenderState.extractArmedEntityRenderState(entity, reusedState, itemModelResolver); reusedState.isCrouching = entity.isCrouching(); reusedState.isFallFlying = entity.isFallFlying(); reusedState.isVisuallySwimming = entity.isVisuallySwimming(); reusedState.isPassenger = entity.isPassenger(); reusedState.speedValue = 1.0F; if (reusedState.isFallFlying) { reusedState.speedValue = (float)entity.getDeltaMovement().lengthSqr(); reusedState.speedValue /= 0.2F; reusedState.speedValue = reusedState.speedValue * (reusedState.speedValue * reusedState.speedValue); } if (reusedState.speedValue < 1.0F) { reusedState.speedValue = 1.0F; } reusedState.attackTime = entity.getAttackAnim(partialTick); reusedState.swimAmount = entity.getSwimAmount(partialTick); reusedState.attackArm = getAttackArm(entity); reusedState.useItemHand = entity.getUsedItemHand(); reusedState.maxCrossbowChargeDuration = CrossbowItem.getChargeDuration(entity.getUseItem(), entity); reusedState.ticksUsingItem = entity.getTicksUsingItem(); reusedState.isUsingItem = entity.isUsingItem(); reusedState.elytraRotX = entity.elytraAnimationState.getRotX(partialTick); reusedState.elytraRotY = entity.elytraAnimationState.getRotY(partialTick); reusedState.elytraRotZ = entity.elytraAnimationState.getRotZ(partialTick); reusedState.headEquipment = getEquipmentIfRenderable(entity, EquipmentSlot.HEAD); reusedState.chestEquipment = getEquipmentIfRenderable(entity, EquipmentSlot.CHEST); reusedState.legsEquipment = getEquipmentIfRenderable(entity, EquipmentSlot.LEGS); reusedState.feetEquipment = getEquipmentIfRenderable(entity, EquipmentSlot.FEET); } private static ItemStack getEquipmentIfRenderable(LivingEntity entity, EquipmentSlot slot) { ItemStack itemStack = entity.getItemBySlot(slot); return HumanoidArmorLayer.shouldRender(itemStack, slot) ? itemStack.copy() : ItemStack.EMPTY; } private static HumanoidArm getAttackArm(LivingEntity entity) { HumanoidArm humanoidArm = entity.getMainArm(); return entity.swingingArm == InteractionHand.MAIN_HAND ? humanoidArm : humanoidArm.getOpposite(); } }