91 lines
4.6 KiB
Java
91 lines
4.6 KiB
Java
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<T extends Mob, S extends HumanoidRenderState, M extends HumanoidModel<S>> extends AgeableMobRenderer<T, S, M> {
|
|
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();
|
|
}
|
|
}
|