SpearAnimations.java
net.minecraft.client.model.effects.SpearAnimations
信息
- 全限定名:net.minecraft.client.model.effects.SpearAnimations
- 类型:public class
- 包:net.minecraft.client.model.effects
- 源码路径:src/main/java/net/minecraft/client/model/effects/SpearAnimations.java
- 起始行号:L20
- 职责:
TODO
字段/常量
- 无
内部类/嵌套类型
net.minecraft.client.model.effects.SpearAnimations.UseParams- 类型:
record - 修饰符:
package-private - 源码定位:
L162 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
private static float progress(float time, float start, float end) @ L21
- 方法名:progress
- 源码定位:L21
- 返回类型:float
- 修饰符:private static
参数:
- time: float
- start: float
- end: float
说明:
TODO
public static <T extends HumanoidRenderState> void thirdPersonHandUse(ModelPart arm, ModelPart head, boolean holdingInRightArm, ItemStack item, T state) @ L25
- 方法名:thirdPersonHandUse
- 源码定位:L25
- 返回类型:
void - 修饰符:public static
参数:
- arm: ModelPart
- head: ModelPart
- holdingInRightArm: boolean
- item: ItemStack
- state: T
说明:
TODO
public static <S extends ArmedEntityRenderState> void thirdPersonUseItem(S state, PoseStack poseStack, float timeHeld, HumanoidArm arm, ItemStack actualItem) @ L56
- 方法名:thirdPersonUseItem
- 源码定位:L56
- 返回类型:
void - 修饰符:public static
参数:
- state: S
- poseStack: PoseStack
- timeHeld: float
- arm: HumanoidArm
- actualItem: ItemStack
说明:
TODO
public static <T extends HumanoidRenderState> void thirdPersonAttackHand(HumanoidModel<T> model, T state) @ L80
- 方法名:thirdPersonAttackHand
- 源码定位:L80
- 返回类型:
void - 修饰符:public static
参数:
- model: HumanoidModel
- state: T
说明:
TODO
public static <S extends ArmedEntityRenderState> void thirdPersonAttackItem(S state, PoseStack poseStack) @ L92
- 方法名:thirdPersonAttackItem
- 源码定位:L92
- 返回类型:
void - 修饰符:public static
参数:
- state: S
- poseStack: PoseStack
说明:
TODO
private static float hitFeedbackAmount(float ticksSinceFeedbackStart) @ L105
- 方法名:hitFeedbackAmount
- 源码定位:L105
- 返回类型:float
- 修饰符:private static
参数:
- ticksSinceFeedbackStart: float
说明:
TODO
public static void firstPersonUse(float ticksSinceKineticHitFeedback, PoseStack poseStack, float timeHeld, HumanoidArm arm, ItemStack itemStack) @ L109
- 方法名:firstPersonUse
- 源码定位:L109
- 返回类型:void
- 修饰符:public static
参数:
- ticksSinceKineticHitFeedback: float
- poseStack: PoseStack
- timeHeld: float
- arm: HumanoidArm
- itemStack: ItemStack
说明:
TODO
public static void firstPersonAttack(float attack, PoseStack poseStack, int invert, HumanoidArm arm) @ L152
- 方法名:firstPersonAttack
- 源码定位:L152
- 返回类型:void
- 修饰符:public static
参数:
- attack: float
- poseStack: PoseStack
- invert: int
- arm: HumanoidArm
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class SpearAnimations {
private static float progress(float time, float start, float end) {
return Mth.clamp(Mth.inverseLerp(time, start, end), 0.0F, 1.0F);
}
public static <T extends HumanoidRenderState> void thirdPersonHandUse(ModelPart arm, ModelPart head, boolean holdingInRightArm, ItemStack item, T state) {
int invert = holdingInRightArm ? 1 : -1;
arm.yRot = -0.1F * invert + head.yRot;
arm.xRot = (float) (-Math.PI / 2) + head.xRot + 0.8F;
if (state.isFallFlying || state.swimAmount > 0.0F) {
arm.xRot -= 0.9599311F;
}
arm.yRot = (float) (Math.PI / 180.0) * Math.clamp((180.0F / (float)Math.PI) * arm.yRot, -60.0F, 60.0F);
arm.xRot = (float) (Math.PI / 180.0) * Math.clamp((180.0F / (float)Math.PI) * arm.xRot, -120.0F, 30.0F);
if (!(state.ticksUsingItem <= 0.0F)
&& (!state.isUsingItem || state.useItemHand == (holdingInRightArm ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND))) {
KineticWeapon kineticWeapon = item.get(DataComponents.KINETIC_WEAPON);
if (kineticWeapon != null) {
SpearAnimations.UseParams params = SpearAnimations.UseParams.fromKineticWeapon(kineticWeapon, state.ticksUsingItem);
arm.yRot = arm.yRot + -invert * params.swayScaleFast() * (float) (Math.PI / 180.0) * params.swayIntensity() * 1.0F;
arm.zRot = arm.zRot + -invert * params.swayScaleSlow() * (float) (Math.PI / 180.0) * params.swayIntensity() * 0.5F;
arm.xRot = arm.xRot
+ (float) (Math.PI / 180.0)
* (
-40.0F * params.raiseProgressStart()
+ 30.0F * params.raiseProgressMiddle()
+ -20.0F * params.raiseProgressEnd()
+ 20.0F * params.lowerProgress()
+ 10.0F * params.raiseBackProgress()
+ 0.6F * params.swayScaleSlow() * params.swayIntensity()
);
}
}
}
public static <S extends ArmedEntityRenderState> void thirdPersonUseItem(
S state, PoseStack poseStack, float timeHeld, HumanoidArm arm, ItemStack actualItem
) {
KineticWeapon kineticWeapon = actualItem.get(DataComponents.KINETIC_WEAPON);
if (kineticWeapon != null && timeHeld != 0.0F) {
float attack = Ease.inQuad(progress(state.attackTime, 0.05F, 0.2F));
float retract = Ease.inOutExpo(progress(state.attackTime, 0.4F, 1.0F));
SpearAnimations.UseParams params = SpearAnimations.UseParams.fromKineticWeapon(kineticWeapon, timeHeld);
int invert = arm == HumanoidArm.RIGHT ? 1 : -1;
float raiseProgressModified = 1.0F - Ease.outBack(1.0F - params.raiseProgress());
float itemInHandDepth = 0.125F;
float hitFeedback = hitFeedbackAmount(state.ticksSinceKineticHitFeedback);
poseStack.translate(
0.0, -hitFeedback * 0.4, (double)(-kineticWeapon.forwardMovement() * (raiseProgressModified - params.raiseBackProgress()) + hitFeedback)
);
poseStack.rotateAround(
Axis.XN.rotationDegrees(70.0F * (params.raiseProgress() - params.raiseBackProgress()) - 40.0F * (attack - retract)), 0.0F, -0.03125F, 0.125F
);
poseStack.rotateAround(
Axis.YP.rotationDegrees(invert * 90 * (params.raiseProgress() - params.swayProgress() + 3.0F * retract + attack)), 0.0F, 0.0F, 0.125F
);
}
}
public static <T extends HumanoidRenderState> void thirdPersonAttackHand(HumanoidModel<T> model, T state) {
float attackTime = state.attackTime;
HumanoidArm arm = state.attackArm;
model.rightArm.yRot = model.rightArm.yRot - model.body.yRot;
model.leftArm.yRot = model.leftArm.yRot - model.body.yRot;
model.leftArm.xRot = model.leftArm.xRot - model.body.yRot;
float prepare = Ease.inOutSine(progress(attackTime, 0.0F, 0.05F));
float attack = Ease.inQuad(progress(attackTime, 0.05F, 0.2F));
float retract = Ease.inOutExpo(progress(attackTime, 0.4F, 1.0F));
model.getArm(arm).xRot += (90.0F * prepare - 120.0F * attack + 30.0F * retract) * (float) (Math.PI / 180.0);
}
public static <S extends ArmedEntityRenderState> void thirdPersonAttackItem(S state, PoseStack poseStack) {
if (!(state.attackTime <= 0.0F)) {
KineticWeapon kineticWeapon = state.getMainHandItemStack().get(DataComponents.KINETIC_WEAPON);
float jetForward = kineticWeapon != null ? kineticWeapon.forwardMovement() : 0.0F;
float itemInHandDepth = 0.125F;
float attackTime = state.attackTime;
float attack = Ease.inQuad(progress(attackTime, 0.05F, 0.2F));
float retract = Ease.inOutExpo(progress(attackTime, 0.4F, 1.0F));
poseStack.rotateAround(Axis.XN.rotationDegrees(70.0F * (attack - retract)), 0.0F, -0.125F, 0.125F);
poseStack.translate(0.0F, jetForward * (attack - retract), 0.0F);
}
}
private static float hitFeedbackAmount(float ticksSinceFeedbackStart) {
return 0.4F * (Ease.outQuart(progress(ticksSinceFeedbackStart, 1.0F, 3.0F)) - Ease.inOutSine(progress(ticksSinceFeedbackStart, 3.0F, 10.0F)));
}
public static void firstPersonUse(float ticksSinceKineticHitFeedback, PoseStack poseStack, float timeHeld, HumanoidArm arm, ItemStack itemStack) {
KineticWeapon kineticWeapon = itemStack.get(DataComponents.KINETIC_WEAPON);
if (kineticWeapon != null) {
SpearAnimations.UseParams params = SpearAnimations.UseParams.fromKineticWeapon(kineticWeapon, timeHeld);
int invert = arm == HumanoidArm.RIGHT ? 1 : -1;
poseStack.translate(
(double)(
invert
* (
params.raiseProgress() * 0.15F
+ params.raiseProgressEnd() * -0.05F
+ params.swayProgress() * -0.1F
+ params.swayScaleSlow() * 0.005F
)
),
(double)(params.raiseProgress() * -0.075F + params.raiseProgressMiddle() * 0.075F + params.swayScaleFast() * 0.01F),
params.raiseProgressStart() * 0.05 + params.raiseProgressEnd() * -0.05 + params.swayScaleSlow() * 0.005F
);
poseStack.rotateAround(
Axis.XP
.rotationDegrees(
-65.0F * Ease.inOutBack(params.raiseProgress())
- 35.0F * params.lowerProgress()
+ 100.0F * params.raiseBackProgress()
+ -0.5F * params.swayScaleFast()
),
0.0F,
0.1F,
0.0F
);
poseStack.rotateAround(
Axis.YN
.rotationDegrees(
invert * (-90.0F * progress(params.raiseProgress(), 0.5F, 0.55F) + 90.0F * params.swayProgress() + 2.0F * params.swayScaleSlow())
),
invert * 0.15F,
0.0F,
0.0F
);
poseStack.translate(0.0F, -hitFeedbackAmount(ticksSinceKineticHitFeedback), 0.0F);
}
}
public static void firstPersonAttack(float attack, PoseStack poseStack, int invert, HumanoidArm arm) {
float startingAmount = Ease.inOutSine(progress(attack, 0.0F, 0.05F));
float middleAmount = Ease.outBack(progress(attack, 0.05F, 0.2F));
float endingAmount = Ease.inOutExpo(progress(attack, 0.4F, 1.0F));
poseStack.translate(invert * 0.1F * (startingAmount - middleAmount), -0.075F * (startingAmount - endingAmount), 0.65F * (startingAmount - middleAmount));
poseStack.mulPose(Axis.XP.rotationDegrees(-70.0F * (startingAmount - endingAmount)));
poseStack.translate(0.0, 0.0, -0.25 * (endingAmount - middleAmount));
}
@OnlyIn(Dist.CLIENT)
record UseParams(
float raiseProgress,
float raiseProgressStart,
float raiseProgressMiddle,
float raiseProgressEnd,
float swayProgress,
float lowerProgress,
float raiseBackProgress,
float swayIntensity,
float swayScaleSlow,
float swayScaleFast
) {
public static SpearAnimations.UseParams fromKineticWeapon(KineticWeapon kineticWeapon, float time) {
int finishRaisingTick = kineticWeapon.delayTicks();
int finishSwayingTick = kineticWeapon.dismountConditions().map(KineticWeapon.Condition::maxDurationTicks).orElse(0) + finishRaisingTick;
int startSwayingTick = finishSwayingTick - 20;
int finishLoweringTick = kineticWeapon.knockbackConditions().map(KineticWeapon.Condition::maxDurationTicks).orElse(0) + finishRaisingTick;
int startLoweringTick = finishLoweringTick - 40;
int finishRaisingBackTick = kineticWeapon.damageConditions().map(KineticWeapon.Condition::maxDurationTicks).orElse(0) + finishRaisingTick;
float raiseProgress = SpearAnimations.progress(time, 0.0F, (float)finishRaisingTick);
float raiseProgressStart = SpearAnimations.progress(raiseProgress, 0.0F, 0.5F);
float raiseProgressMiddle = SpearAnimations.progress(raiseProgress, 0.5F, 0.8F);
float raiseProgressEnd = SpearAnimations.progress(raiseProgress, 0.8F, 1.0F);
float swayProgress = SpearAnimations.progress(time, (float)startSwayingTick, (float)finishSwayingTick);
float lowerProgress = Ease.outCubic(Ease.inOutElastic(SpearAnimations.progress(time - 20.0F, (float)startLoweringTick, (float)finishLoweringTick)));
float raiseBackProgress = SpearAnimations.progress(time, (float)(finishRaisingBackTick - 5), (float)finishRaisingBackTick);
float swayIntensity = 2.0F * Ease.outCirc(swayProgress) - 2.0F * Ease.inCirc(raiseBackProgress);
float swayScaleSlow = Mth.sin(time * 19.0F * (float) (Math.PI / 180.0)) * swayIntensity;
float swayScaleFast = Mth.sin(time * 30.0F * (float) (Math.PI / 180.0)) * swayIntensity;
return new SpearAnimations.UseParams(
raiseProgress,
raiseProgressStart,
raiseProgressMiddle,
raiseProgressEnd,
swayProgress,
lowerProgress,
raiseBackProgress,
swayIntensity,
swayScaleSlow,
swayScaleFast
);
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Ease.inCirc(), Ease.inOutBack(), Ease.inOutElastic(), Ease.inOutExpo(), Ease.inOutSine(), Ease.inQuad(), Ease.outBack(), Ease.outCirc(), Ease.outCubic(), Ease.outQuart()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.clamp(), Mth.inverseLerp(), Mth.sin()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: