74 lines
3.7 KiB
Java
74 lines
3.7 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.ItemInHandLayer;
|
|
import net.minecraft.client.renderer.entity.layers.WingsLayer;
|
|
import net.minecraft.client.renderer.entity.state.HumanoidRenderState;
|
|
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;
|
|
|
|
@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, context.getItemRenderer()));
|
|
this.addLayer(new WingsLayer<>(this, context.getModelSet(), context.getEquipmentRenderer()));
|
|
this.addLayer(new ItemInHandLayer<>(this, context.getItemRenderer()));
|
|
}
|
|
|
|
public void extractRenderState(T entity, S reusedState, float partialTick) {
|
|
super.extractRenderState(entity, reusedState, partialTick);
|
|
extractHumanoidRenderState(entity, reusedState, partialTick);
|
|
}
|
|
|
|
public static void extractHumanoidRenderState(LivingEntity entity, HumanoidRenderState reusedState, float partialTick) {
|
|
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.chestItem = entity.getItemBySlot(EquipmentSlot.CHEST).copy();
|
|
reusedState.legsItem = entity.getItemBySlot(EquipmentSlot.LEGS).copy();
|
|
reusedState.feetItem = entity.getItemBySlot(EquipmentSlot.FEET).copy();
|
|
}
|
|
|
|
private static HumanoidArm getAttackArm(LivingEntity entity) {
|
|
HumanoidArm humanoidArm = entity.getMainArm();
|
|
return entity.swingingArm == InteractionHand.MAIN_HAND ? humanoidArm : humanoidArm.getOpposite();
|
|
}
|
|
}
|