minecraft-src/net/minecraft/client/model/WardenModel.java
2025-07-04 03:15:13 +03:00

176 lines
8 KiB
Java

package net.minecraft.client.model;
import com.google.common.collect.ImmutableList;
import java.util.List;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.animation.definitions.WardenAnimation;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.state.WardenRenderState;
import net.minecraft.util.Mth;
@Environment(EnvType.CLIENT)
public class WardenModel extends EntityModel<WardenRenderState> {
private static final float DEFAULT_ARM_X_Y = 13.0F;
private static final float DEFAULT_ARM_Z = 1.0F;
protected final ModelPart bone;
protected final ModelPart body;
protected final ModelPart head;
protected final ModelPart rightTendril;
protected final ModelPart leftTendril;
protected final ModelPart leftLeg;
protected final ModelPart leftArm;
protected final ModelPart leftRibcage;
protected final ModelPart rightArm;
protected final ModelPart rightLeg;
protected final ModelPart rightRibcage;
private final List<ModelPart> tendrilsLayerModelParts;
private final List<ModelPart> heartLayerModelParts;
private final List<ModelPart> bioluminescentLayerModelParts;
private final List<ModelPart> pulsatingSpotsLayerModelParts;
public WardenModel(ModelPart root) {
super(root, RenderType::entityCutoutNoCull);
this.bone = root.getChild("bone");
this.body = this.bone.getChild("body");
this.head = this.body.getChild("head");
this.rightLeg = this.bone.getChild("right_leg");
this.leftLeg = this.bone.getChild("left_leg");
this.rightArm = this.body.getChild("right_arm");
this.leftArm = this.body.getChild("left_arm");
this.rightTendril = this.head.getChild("right_tendril");
this.leftTendril = this.head.getChild("left_tendril");
this.rightRibcage = this.body.getChild("right_ribcage");
this.leftRibcage = this.body.getChild("left_ribcage");
this.tendrilsLayerModelParts = ImmutableList.of(this.leftTendril, this.rightTendril);
this.heartLayerModelParts = ImmutableList.of(this.body);
this.bioluminescentLayerModelParts = ImmutableList.of(this.head, this.leftArm, this.rightArm, this.leftLeg, this.rightLeg);
this.pulsatingSpotsLayerModelParts = ImmutableList.of(this.body, this.head, this.leftArm, this.rightArm, this.leftLeg, this.rightLeg);
}
public static LayerDefinition createBodyLayer() {
MeshDefinition meshDefinition = new MeshDefinition();
PartDefinition partDefinition = meshDefinition.getRoot();
PartDefinition partDefinition2 = partDefinition.addOrReplaceChild("bone", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F));
PartDefinition partDefinition3 = partDefinition2.addOrReplaceChild(
"body", CubeListBuilder.create().texOffs(0, 0).addBox(-9.0F, -13.0F, -4.0F, 18.0F, 21.0F, 11.0F), PartPose.offset(0.0F, -21.0F, 0.0F)
);
partDefinition3.addOrReplaceChild(
"right_ribcage", CubeListBuilder.create().texOffs(90, 11).addBox(-2.0F, -11.0F, -0.1F, 9.0F, 21.0F, 0.0F), PartPose.offset(-7.0F, -2.0F, -4.0F)
);
partDefinition3.addOrReplaceChild(
"left_ribcage",
CubeListBuilder.create().texOffs(90, 11).mirror().addBox(-7.0F, -11.0F, -0.1F, 9.0F, 21.0F, 0.0F).mirror(false),
PartPose.offset(7.0F, -2.0F, -4.0F)
);
PartDefinition partDefinition4 = partDefinition3.addOrReplaceChild(
"head", CubeListBuilder.create().texOffs(0, 32).addBox(-8.0F, -16.0F, -5.0F, 16.0F, 16.0F, 10.0F), PartPose.offset(0.0F, -13.0F, 0.0F)
);
partDefinition4.addOrReplaceChild(
"right_tendril", CubeListBuilder.create().texOffs(52, 32).addBox(-16.0F, -13.0F, 0.0F, 16.0F, 16.0F, 0.0F), PartPose.offset(-8.0F, -12.0F, 0.0F)
);
partDefinition4.addOrReplaceChild(
"left_tendril", CubeListBuilder.create().texOffs(58, 0).addBox(0.0F, -13.0F, 0.0F, 16.0F, 16.0F, 0.0F), PartPose.offset(8.0F, -12.0F, 0.0F)
);
partDefinition3.addOrReplaceChild(
"right_arm", CubeListBuilder.create().texOffs(44, 50).addBox(-4.0F, 0.0F, -4.0F, 8.0F, 28.0F, 8.0F), PartPose.offset(-13.0F, -13.0F, 1.0F)
);
partDefinition3.addOrReplaceChild(
"left_arm", CubeListBuilder.create().texOffs(0, 58).addBox(-4.0F, 0.0F, -4.0F, 8.0F, 28.0F, 8.0F), PartPose.offset(13.0F, -13.0F, 1.0F)
);
partDefinition2.addOrReplaceChild(
"right_leg", CubeListBuilder.create().texOffs(76, 48).addBox(-3.1F, 0.0F, -3.0F, 6.0F, 13.0F, 6.0F), PartPose.offset(-5.9F, -13.0F, 0.0F)
);
partDefinition2.addOrReplaceChild(
"left_leg", CubeListBuilder.create().texOffs(76, 76).addBox(-2.9F, 0.0F, -3.0F, 6.0F, 13.0F, 6.0F), PartPose.offset(5.9F, -13.0F, 0.0F)
);
return LayerDefinition.create(meshDefinition, 128, 128);
}
public void setupAnim(WardenRenderState wardenRenderState) {
super.setupAnim(wardenRenderState);
this.animateHeadLookTarget(wardenRenderState.yRot, wardenRenderState.xRot);
this.animateWalk(wardenRenderState.walkAnimationPos, wardenRenderState.walkAnimationSpeed);
this.animateIdlePose(wardenRenderState.ageInTicks);
this.animateTendrils(wardenRenderState, wardenRenderState.ageInTicks);
this.animate(wardenRenderState.attackAnimationState, WardenAnimation.WARDEN_ATTACK, wardenRenderState.ageInTicks);
this.animate(wardenRenderState.sonicBoomAnimationState, WardenAnimation.WARDEN_SONIC_BOOM, wardenRenderState.ageInTicks);
this.animate(wardenRenderState.diggingAnimationState, WardenAnimation.WARDEN_DIG, wardenRenderState.ageInTicks);
this.animate(wardenRenderState.emergeAnimationState, WardenAnimation.WARDEN_EMERGE, wardenRenderState.ageInTicks);
this.animate(wardenRenderState.roarAnimationState, WardenAnimation.WARDEN_ROAR, wardenRenderState.ageInTicks);
this.animate(wardenRenderState.sniffAnimationState, WardenAnimation.WARDEN_SNIFF, wardenRenderState.ageInTicks);
}
private void animateHeadLookTarget(float yaw, float pitch) {
this.head.xRot = pitch * (float) (Math.PI / 180.0);
this.head.yRot = yaw * (float) (Math.PI / 180.0);
}
private void animateIdlePose(float ageInTicks) {
float f = ageInTicks * 0.1F;
float g = Mth.cos(f);
float h = Mth.sin(f);
this.head.zRot += 0.06F * g;
this.head.xRot += 0.06F * h;
this.body.zRot += 0.025F * h;
this.body.xRot += 0.025F * g;
}
private void animateWalk(float limbSwing, float limbSwingAmount) {
float f = Math.min(0.5F, 3.0F * limbSwingAmount);
float g = limbSwing * 0.8662F;
float h = Mth.cos(g);
float i = Mth.sin(g);
float j = Math.min(0.35F, f);
this.head.zRot += 0.3F * i * f;
this.head.xRot = this.head.xRot + 1.2F * Mth.cos(g + (float) (Math.PI / 2)) * j;
this.body.zRot = 0.1F * i * f;
this.body.xRot = 1.0F * h * j;
this.leftLeg.xRot = 1.0F * h * f;
this.rightLeg.xRot = 1.0F * Mth.cos(g + (float) Math.PI) * f;
this.leftArm.xRot = -(0.8F * h * f);
this.leftArm.zRot = 0.0F;
this.rightArm.xRot = -(0.8F * i * f);
this.rightArm.zRot = 0.0F;
this.resetArmPoses();
}
private void resetArmPoses() {
this.leftArm.yRot = 0.0F;
this.leftArm.z = 1.0F;
this.leftArm.x = 13.0F;
this.leftArm.y = -13.0F;
this.rightArm.yRot = 0.0F;
this.rightArm.z = 1.0F;
this.rightArm.x = -13.0F;
this.rightArm.y = -13.0F;
}
private void animateTendrils(WardenRenderState renderState, float ageInTicks) {
float f = renderState.tendrilAnimation * (float)(Math.cos(ageInTicks * 2.25) * Math.PI * 0.1F);
this.leftTendril.xRot = f;
this.rightTendril.xRot = -f;
}
public List<ModelPart> getTendrilsLayerModelParts(WardenRenderState renderState) {
return this.tendrilsLayerModelParts;
}
public List<ModelPart> getHeartLayerModelParts(WardenRenderState renderState) {
return this.heartLayerModelParts;
}
public List<ModelPart> getBioluminescentLayerModelParts(WardenRenderState renderState) {
return this.bioluminescentLayerModelParts;
}
public List<ModelPart> getPulsatingSpotsLayerModelParts(WardenRenderState renderState) {
return this.pulsatingSpotsLayerModelParts;
}
}