2025-11-24 22:52:51 +03:00

106 lines
5.5 KiB
Java

/*
* Decompiled with CFR 0.152.
*/
package net.minecraft.client.renderer.entity;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.renderer.entity.AgeableMobRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
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.core.component.DataComponents;
import net.minecraft.tags.ItemTags;
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;
import net.minecraft.world.item.SwingAnimationType;
import net.minecraft.world.item.component.SwingAnimation;
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 shadow) {
this(context, model, model, shadow);
}
public HumanoidMobRenderer(EntityRendererProvider.Context context, M model, M babyModel, float shadow) {
this(context, model, babyModel, shadow, CustomHeadLayer.Transforms.DEFAULT);
}
public HumanoidMobRenderer(EntityRendererProvider.Context context, M model, M babyModel, float shadow, CustomHeadLayer.Transforms customHeadTransforms) {
super(context, model, babyModel, shadow);
this.addLayer(new CustomHeadLayer(this, context.getModelSet(), context.getPlayerSkinRenderCache(), customHeadTransforms));
this.addLayer(new WingsLayer(this, context.getModelSet(), context.getEquipmentRenderer()));
this.addLayer(new ItemInHandLayer(this));
}
protected HumanoidModel.ArmPose getArmPose(T mob, HumanoidArm arm) {
ItemStack itemHeldByArm = ((LivingEntity)mob).getItemHeldByArm(arm);
SwingAnimation anim = itemHeldByArm.get(DataComponents.SWING_ANIMATION);
if (anim != null && anim.type() == SwingAnimationType.STAB && ((Mob)mob).swinging) {
return HumanoidModel.ArmPose.SPEAR;
}
if (itemHeldByArm.is(ItemTags.SPEARS)) {
return HumanoidModel.ArmPose.SPEAR;
}
return HumanoidModel.ArmPose.EMPTY;
}
@Override
public void extractRenderState(T entity, S state, float partialTicks) {
super.extractRenderState(entity, state, partialTicks);
HumanoidMobRenderer.extractHumanoidRenderState(entity, state, partialTicks, this.itemModelResolver);
((HumanoidRenderState)state).leftArmPose = this.getArmPose(entity, HumanoidArm.LEFT);
((HumanoidRenderState)state).rightArmPose = this.getArmPose(entity, HumanoidArm.RIGHT);
}
public static void extractHumanoidRenderState(LivingEntity entity, HumanoidRenderState state, float partialTicks, ItemModelResolver itemModelResolver) {
ArmedEntityRenderState.extractArmedEntityRenderState(entity, state, itemModelResolver, partialTicks);
state.isCrouching = entity.isCrouching();
state.isFallFlying = entity.isFallFlying();
state.isVisuallySwimming = entity.isVisuallySwimming();
state.isPassenger = entity.isPassenger();
state.speedValue = 1.0f;
if (state.isFallFlying) {
state.speedValue = (float)entity.getDeltaMovement().lengthSqr();
state.speedValue /= 0.2f;
state.speedValue *= state.speedValue * state.speedValue;
}
if (state.speedValue < 1.0f) {
state.speedValue = 1.0f;
}
state.swimAmount = entity.getSwimAmount(partialTicks);
state.attackArm = HumanoidMobRenderer.getAttackArm(entity);
state.useItemHand = entity.getUsedItemHand();
state.maxCrossbowChargeDuration = CrossbowItem.getChargeDuration(entity.getUseItem(), entity);
state.ticksUsingItem = entity.getTicksUsingItem(partialTicks);
state.isUsingItem = entity.isUsingItem();
state.elytraRotX = entity.elytraAnimationState.getRotX(partialTicks);
state.elytraRotY = entity.elytraAnimationState.getRotY(partialTicks);
state.elytraRotZ = entity.elytraAnimationState.getRotZ(partialTicks);
state.headEquipment = HumanoidMobRenderer.getEquipmentIfRenderable(entity, EquipmentSlot.HEAD);
state.chestEquipment = HumanoidMobRenderer.getEquipmentIfRenderable(entity, EquipmentSlot.CHEST);
state.legsEquipment = HumanoidMobRenderer.getEquipmentIfRenderable(entity, EquipmentSlot.LEGS);
state.feetEquipment = HumanoidMobRenderer.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 mainArm = entity.getMainArm();
return entity.swingingArm == InteractionHand.MAIN_HAND ? mainArm : mainArm.getOpposite();
}
}