GuardianModel.java

net.minecraft.client.model.monster.guardian.GuardianModel

信息

  • 全限定名:net.minecraft.client.model.monster.guardian.GuardianModel
  • 类型:public class
  • 包:net.minecraft.client.model.monster.guardian
  • 源码路径:src/main/java/net/minecraft/client/model/monster/guardian/GuardianModel.java
  • 起始行号:L18
  • 继承:EntityModel
  • 职责:

    TODO

字段/常量

  • ELDER_GUARDIAN_SCALE

    • 类型: MeshTransformer
    • 修饰符: public static final
    • 源码定位: L19
    • 说明:

      TODO

  • SPIKE_X_ROT

    • 类型: float[]
    • 修饰符: private static final
    • 源码定位: L20
    • 说明:

      TODO

  • SPIKE_Y_ROT

    • 类型: float[]
    • 修饰符: private static final
    • 源码定位: L21
    • 说明:

      TODO

  • SPIKE_Z_ROT

    • 类型: float[]
    • 修饰符: private static final
    • 源码定位: L22
    • 说明:

      TODO

  • SPIKE_X

    • 类型: float[]
    • 修饰符: private static final
    • 源码定位: L23
    • 说明:

      TODO

  • SPIKE_Y

    • 类型: float[]
    • 修饰符: private static final
    • 源码定位: L24
    • 说明:

      TODO

  • SPIKE_Z

    • 类型: float[]
    • 修饰符: private static final
    • 源码定位: L25
    • 说明:

      TODO

  • EYE

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L26
    • 说明:

      TODO

  • TAIL_0

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L27
    • 说明:

      TODO

  • TAIL_1

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L28
    • 说明:

      TODO

  • TAIL_2

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L29
    • 说明:

      TODO

  • head

    • 类型: ModelPart
    • 修饰符: private final
    • 源码定位: L30
    • 说明:

      TODO

  • eye

    • 类型: ModelPart
    • 修饰符: private final
    • 源码定位: L31
    • 说明:

      TODO

  • spikeParts

    • 类型: ModelPart[]
    • 修饰符: private final
    • 源码定位: L32
    • 说明:

      TODO

  • tailParts

    • 类型: ModelPart[]
    • 修饰符: private final
    • 源码定位: L33
    • 说明:

      TODO

内部类/嵌套类型

构造器

public GuardianModel(ModelPart root) @ L35

  • 构造器名:GuardianModel
  • 源码定位:L35
  • 修饰符:public

参数:

  • root: ModelPart

说明:

TODO

方法

下面的方法块按源码顺序生成。

private static String createSpikeName(int i) @ L50

  • 方法名:createSpikeName
  • 源码定位:L50
  • 返回类型:String
  • 修饰符:private static

参数:

  • i: int

说明:

TODO

public static LayerDefinition createBodyLayer() @ L54

  • 方法名:createBodyLayer
  • 源码定位:L54
  • 返回类型:LayerDefinition
  • 修饰符:public static

参数:

说明:

TODO

public static LayerDefinition createElderGuardianLayer() @ L99

  • 方法名:createElderGuardianLayer
  • 源码定位:L99
  • 返回类型:LayerDefinition
  • 修饰符:public static

参数:

说明:

TODO

public void setupAnim(GuardianRenderState state) @ L103

  • 方法名:setupAnim
  • 源码定位:L103
  • 返回类型:void
  • 修饰符:public

参数:

  • state: GuardianRenderState

说明:

TODO

private void setupSpikes(float ageInTicks, float withdrawal) @ L133

  • 方法名:setupSpikes
  • 源码定位:L133
  • 返回类型:void
  • 修饰符:private

参数:

  • ageInTicks: float
  • withdrawal: float

说明:

TODO

private static float getSpikeOffset(int spike, float ageInTicks, float withdrawal) @ L141

  • 方法名:getSpikeOffset
  • 源码定位:L141
  • 返回类型:float
  • 修饰符:private static

参数:

  • spike: int
  • ageInTicks: float
  • withdrawal: float

说明:

TODO

private static float getSpikeX(int spike, float ageInTicks, float withdrawal) @ L145

  • 方法名:getSpikeX
  • 源码定位:L145
  • 返回类型:float
  • 修饰符:private static

参数:

  • spike: int
  • ageInTicks: float
  • withdrawal: float

说明:

TODO

private static float getSpikeY(int spike, float ageInTicks, float withdrawal) @ L149

  • 方法名:getSpikeY
  • 源码定位:L149
  • 返回类型:float
  • 修饰符:private static

参数:

  • spike: int
  • ageInTicks: float
  • withdrawal: float

说明:

TODO

private static float getSpikeZ(int spike, float ageInTicks, float withdrawal) @ L153

  • 方法名:getSpikeZ
  • 源码定位:L153
  • 返回类型:float
  • 修饰符:private static

参数:

  • spike: int
  • ageInTicks: float
  • withdrawal: float

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class GuardianModel extends EntityModel<GuardianRenderState> {
    public static final MeshTransformer ELDER_GUARDIAN_SCALE = MeshTransformer.scaling(2.35F);
    private static final float[] SPIKE_X_ROT = new float[]{1.75F, 0.25F, 0.0F, 0.0F, 0.5F, 0.5F, 0.5F, 0.5F, 1.25F, 0.75F, 0.0F, 0.0F};
    private static final float[] SPIKE_Y_ROT = new float[]{0.0F, 0.0F, 0.0F, 0.0F, 0.25F, 1.75F, 1.25F, 0.75F, 0.0F, 0.0F, 0.0F, 0.0F};
    private static final float[] SPIKE_Z_ROT = new float[]{0.0F, 0.0F, 0.25F, 1.75F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.75F, 1.25F};
    private static final float[] SPIKE_X = new float[]{0.0F, 0.0F, 8.0F, -8.0F, -8.0F, 8.0F, 8.0F, -8.0F, 0.0F, 0.0F, 8.0F, -8.0F};
    private static final float[] SPIKE_Y = new float[]{-8.0F, -8.0F, -8.0F, -8.0F, 0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, 8.0F};
    private static final float[] SPIKE_Z = new float[]{8.0F, -8.0F, 0.0F, 0.0F, -8.0F, -8.0F, 8.0F, 8.0F, 8.0F, -8.0F, 0.0F, 0.0F};
    private static final String EYE = "eye";
    private static final String TAIL_0 = "tail0";
    private static final String TAIL_1 = "tail1";
    private static final String TAIL_2 = "tail2";
    private final ModelPart head;
    private final ModelPart eye;
    private final ModelPart[] spikeParts = new ModelPart[12];
    private final ModelPart[] tailParts;
 
    public GuardianModel(ModelPart root) {
        super(root);
        this.head = root.getChild("head");
 
        for (int i = 0; i < this.spikeParts.length; i++) {
            this.spikeParts[i] = this.head.getChild(createSpikeName(i));
        }
 
        this.eye = this.head.getChild("eye");
        this.tailParts = new ModelPart[3];
        this.tailParts[0] = this.head.getChild("tail0");
        this.tailParts[1] = this.tailParts[0].getChild("tail1");
        this.tailParts[2] = this.tailParts[1].getChild("tail2");
    }
 
    private static String createSpikeName(int i) {
        return "spike" + i;
    }
 
    public static LayerDefinition createBodyLayer() {
        MeshDefinition mesh = new MeshDefinition();
        PartDefinition root = mesh.getRoot();
        PartDefinition head = root.addOrReplaceChild(
            "head",
            CubeListBuilder.create()
                .texOffs(0, 0)
                .addBox(-6.0F, 10.0F, -8.0F, 12.0F, 12.0F, 16.0F)
                .texOffs(0, 28)
                .addBox(-8.0F, 10.0F, -6.0F, 2.0F, 12.0F, 12.0F)
                .texOffs(0, 28)
                .addBox(6.0F, 10.0F, -6.0F, 2.0F, 12.0F, 12.0F, true)
                .texOffs(16, 40)
                .addBox(-6.0F, 8.0F, -6.0F, 12.0F, 2.0F, 12.0F)
                .texOffs(16, 40)
                .addBox(-6.0F, 22.0F, -6.0F, 12.0F, 2.0F, 12.0F),
            PartPose.ZERO
        );
        CubeListBuilder spike = CubeListBuilder.create().texOffs(0, 0).addBox(-1.0F, -4.5F, -1.0F, 2.0F, 9.0F, 2.0F);
 
        for (int i = 0; i < 12; i++) {
            float x = getSpikeX(i, 0.0F, 0.0F);
            float y = getSpikeY(i, 0.0F, 0.0F);
            float z = getSpikeZ(i, 0.0F, 0.0F);
            float xRot = (float) Math.PI * SPIKE_X_ROT[i];
            float yRot = (float) Math.PI * SPIKE_Y_ROT[i];
            float zRot = (float) Math.PI * SPIKE_Z_ROT[i];
            head.addOrReplaceChild(createSpikeName(i), spike, PartPose.offsetAndRotation(x, y, z, xRot, yRot, zRot));
        }
 
        head.addOrReplaceChild("eye", CubeListBuilder.create().texOffs(8, 0).addBox(-1.0F, 15.0F, 0.0F, 2.0F, 2.0F, 1.0F), PartPose.offset(0.0F, 0.0F, -8.25F));
        PartDefinition tailPart0 = head.addOrReplaceChild(
            "tail0", CubeListBuilder.create().texOffs(40, 0).addBox(-2.0F, 14.0F, 7.0F, 4.0F, 4.0F, 8.0F), PartPose.ZERO
        );
        PartDefinition tailPart1 = tailPart0.addOrReplaceChild(
            "tail1", CubeListBuilder.create().texOffs(0, 54).addBox(0.0F, 14.0F, 0.0F, 3.0F, 3.0F, 7.0F), PartPose.offset(-1.5F, 0.5F, 14.0F)
        );
        tailPart1.addOrReplaceChild(
            "tail2",
            CubeListBuilder.create().texOffs(41, 32).addBox(0.0F, 14.0F, 0.0F, 2.0F, 2.0F, 6.0F).texOffs(25, 19).addBox(1.0F, 10.5F, 3.0F, 1.0F, 9.0F, 9.0F),
            PartPose.offset(0.5F, 0.5F, 6.0F)
        );
        return LayerDefinition.create(mesh, 64, 64);
    }
 
    public static LayerDefinition createElderGuardianLayer() {
        return createBodyLayer().apply(ELDER_GUARDIAN_SCALE);
    }
 
    public void setupAnim(GuardianRenderState state) {
        super.setupAnim(state);
        this.head.yRot = state.yRot * (float) (Math.PI / 180.0);
        this.head.xRot = state.xRot * (float) (Math.PI / 180.0);
        float withdrawal = (1.0F - state.spikesAnimation) * 0.55F;
        this.setupSpikes(state.ageInTicks, withdrawal);
        if (state.lookAtPosition != null && state.lookDirection != null) {
            double dy = state.lookAtPosition.y - state.eyePosition.y;
            if (dy > 0.0) {
                this.eye.y = 0.0F;
            } else {
                this.eye.y = 1.0F;
            }
 
            Vec3 viewVector = state.lookDirection;
            viewVector = new Vec3(viewVector.x, 0.0, viewVector.z);
            Vec3 delta = new Vec3(state.eyePosition.x - state.lookAtPosition.x, 0.0, state.eyePosition.z - state.lookAtPosition.z)
                .normalize()
                .yRot((float) (Math.PI / 2));
            double dot = viewVector.dot(delta);
            this.eye.x = Mth.sqrt((float)Math.abs(dot)) * 2.0F * (float)Math.signum(dot);
        }
 
        this.eye.visible = true;
        float swim = state.tailAnimation;
        this.tailParts[0].yRot = Mth.sin(swim) * (float) Math.PI * 0.05F;
        this.tailParts[1].yRot = Mth.sin(swim) * (float) Math.PI * 0.1F;
        this.tailParts[2].yRot = Mth.sin(swim) * (float) Math.PI * 0.15F;
    }
 
    private void setupSpikes(float ageInTicks, float withdrawal) {
        for (int i = 0; i < 12; i++) {
            this.spikeParts[i].x = getSpikeX(i, ageInTicks, withdrawal);
            this.spikeParts[i].y = getSpikeY(i, ageInTicks, withdrawal);
            this.spikeParts[i].z = getSpikeZ(i, ageInTicks, withdrawal);
        }
    }
 
    private static float getSpikeOffset(int spike, float ageInTicks, float withdrawal) {
        return 1.0F + Mth.cos(ageInTicks * 1.5F + spike) * 0.01F - withdrawal;
    }
 
    private static float getSpikeX(int spike, float ageInTicks, float withdrawal) {
        return SPIKE_X[spike] * getSpikeOffset(spike, ageInTicks, withdrawal);
    }
 
    private static float getSpikeY(int spike, float ageInTicks, float withdrawal) {
        return 16.0F + SPIKE_Y[spike] * getSpikeOffset(spike, ageInTicks, withdrawal);
    }
 
    private static float getSpikeZ(int spike, float ageInTicks, float withdrawal) {
        return SPIKE_Z[spike] * getSpikeOffset(spike, ageInTicks, withdrawal);
    }
}

引用的其他类

  • EntityModel

    • 引用位置: 继承
  • ModelPart

    • 引用位置: 参数/字段
  • PartPose

    • 引用位置: 方法调用
    • 关联成员: PartPose.offset(), PartPose.offsetAndRotation()
  • CubeListBuilder

    • 引用位置: 方法调用
    • 关联成员: CubeListBuilder.create()
  • LayerDefinition

    • 引用位置: 方法调用/返回值
    • 关联成员: LayerDefinition.create()
  • MeshDefinition

    • 引用位置: 构造调用
    • 关联成员: MeshDefinition()
  • MeshTransformer

    • 引用位置: 字段/方法调用
    • 关联成员: MeshTransformer.scaling()
  • GuardianRenderState

    • 引用位置: 参数
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.cos(), Mth.sin(), Mth.sqrt()
  • Vec3

    • 引用位置: 构造调用
    • 关联成员: Vec3()