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);
}
}引用的其他类
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
PartPose.offset(), PartPose.offsetAndRotation()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
CubeListBuilder.create()
- 引用位置:
-
- 引用位置:
方法调用/返回值 - 关联成员:
LayerDefinition.create()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
MeshDefinition()
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
MeshTransformer.scaling()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.cos(), Mth.sin(), Mth.sqrt()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
Vec3()
- 引用位置: