From 0f1c985123baedefcc13beec58f7340bcdeb9ae2 Mon Sep 17 00:00:00 2001 From: XM666-Dev Date: Wed, 11 Feb 2026 23:22:19 +0800 Subject: [PATCH] Add SlidingAnimator end transition Fix JumpChargingAnimator choppy at end --- .../animation/impl/JumpChargingAnimator.java | 19 +++++++----- .../animation/impl/SlidingAnimator.java | 31 ++++++++++++------- .../common/action/impl/ChargeJump.java | 4 +++ .../parcool/common/action/impl/Slide.java | 8 +++++ .../resources/META-INF/accesstransformer.cfg | 2 ++ 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/alrex/parcool/client/animation/impl/JumpChargingAnimator.java b/src/main/java/com/alrex/parcool/client/animation/impl/JumpChargingAnimator.java index b5a2eda7..d3cd5ed4 100644 --- a/src/main/java/com/alrex/parcool/client/animation/impl/JumpChargingAnimator.java +++ b/src/main/java/com/alrex/parcool/client/animation/impl/JumpChargingAnimator.java @@ -17,10 +17,7 @@ public boolean shouldRemoved(Player player, Parkourability parkourability) { @Override public boolean animatePre(Player player, Parkourability parkourability, PlayerModelTransformer transformer) { - float transitionPhase = Math.min(1f, (parkourability.get(ChargeJump.class).getChargingTick() + transformer.getPartialTick()) / ChargeJump.JUMP_MAX_CHARGE_TICK); - float animFactor = new Easing(transitionPhase) - .sinInOut(0, 1, 0, 1) - .get(); + float animFactor = getAnimFactor(parkourability, transformer.getPartialTick()); transformer .translateLeftLeg( 0, @@ -53,14 +50,20 @@ public boolean animatePre(Player player, Parkourability parkourability, PlayerMo @Override public boolean rotatePre(Player player, Parkourability parkourability, PlayerModelRotator rotator) { - float transitionPhase = Math.min(1f, (parkourability.get(ChargeJump.class).getChargingTick() + rotator.getPartialTick()) / ChargeJump.JUMP_MAX_CHARGE_TICK); - float animFactor = new Easing(transitionPhase) - .sinInOut(0, 1, 0, 1) - .get(); + float animFactor = getAnimFactor(parkourability, rotator.getPartialTick()); rotator .rotateYawRightward(180f + rotator.getYRot()) .translate(0, 0f, 0.3f * animFactor) .rotatePitchFrontward(25 * animFactor); return true; } + + private float getAnimFactor(Parkourability parkourability, float partialTick) { + partialTick *= (parkourability.get(ChargeJump.class).getNotChargingTick() == 0 ? 1 : -1); + float transitionPhase = Math.min(1f, (parkourability.get(ChargeJump.class).getChargingTick() + partialTick) / ChargeJump.JUMP_MAX_CHARGE_TICK); + float animFactor = new Easing(transitionPhase) + .sinInOut(0, 1, 0, 1) + .get(); + return animFactor; + } } diff --git a/src/main/java/com/alrex/parcool/client/animation/impl/SlidingAnimator.java b/src/main/java/com/alrex/parcool/client/animation/impl/SlidingAnimator.java index 7b56f813..727c2dda 100644 --- a/src/main/java/com/alrex/parcool/client/animation/impl/SlidingAnimator.java +++ b/src/main/java/com/alrex/parcool/client/animation/impl/SlidingAnimator.java @@ -14,16 +14,13 @@ public class SlidingAnimator extends Animator { private static final int MAX_TRANSITION_TICK = 5; @Override public boolean shouldRemoved(Player player, Parkourability parkourability) { - return !parkourability.get(Slide.class).isDoing(); + Slide slide = parkourability.get(Slide.class); + return !slide.isDoing() && slide.getNotDoingTick() >= MAX_TRANSITION_TICK; } @Override public void animatePost(Player player, Parkourability parkourability, PlayerModelTransformer transformer) { - float animFactor = (getTick() + transformer.getPartialTick()) / MAX_TRANSITION_TICK; - if (animFactor > 1) animFactor = 1; - animFactor = new Easing(animFactor) - .sinInOut(0, 1, 0, 1) - .get(); + float animFactor = getAnimFactor(parkourability, transformer.getPartialTick()); transformer .translateLeftLeg( @@ -53,12 +50,8 @@ public void animatePost(Player player, Parkourability parkourability, PlayerMode public boolean rotatePre(Player player, Parkourability parkourability, PlayerModelRotator rotator) { Vec3 vec = parkourability.get(Slide.class).getSlidingVector(); if (vec == null) return false; - float animFactor = (getTick() + rotator.getPartialTick()) / MAX_TRANSITION_TICK; - float yRot = (float) VectorUtil.toYawDegree(vec); - if (animFactor > 1) animFactor = 1; - animFactor = new Easing(animFactor) - .sinInOut(0, 1, 0, 1) - .get(); + float animFactor = getAnimFactor(parkourability, rotator.getPartialTick()); + float yRot = parkourability.get(Slide.class).isDoing() ? (float) VectorUtil.toYawDegree(vec) : rotator.getYRot(); rotator .rotateYawRightward(180f + yRot) .rotatePitchFrontward(-55f * animFactor) @@ -67,4 +60,18 @@ public boolean rotatePre(Player player, Parkourability parkourability, PlayerMod .translate(0, -0.7f * animFactor, -0.3f * animFactor); return true; } + + private float getAnimFactor(Parkourability parkourability, float partialTick) { + Slide slide = parkourability.get(Slide.class); + boolean doing = slide.isDoing(); + int tick = doing ? getTick() : slide.getNotDoingTick(); + float animFactor = Math.min((tick + partialTick) / MAX_TRANSITION_TICK, 1); + if (!doing) { + animFactor = 1 - animFactor; + } + animFactor = new Easing(animFactor) + .sinInOut(0, 1, 0, 1) + .get(); + return animFactor; + } } diff --git a/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java b/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java index 7e331226..4ff2fd98 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/ChargeJump.java @@ -175,4 +175,8 @@ public boolean isCharging() { public int getChargingTick() { return chargeTick; } + + public int getNotChargingTick() { + return notChargeTick; + } } diff --git a/src/main/java/com/alrex/parcool/common/action/impl/Slide.java b/src/main/java/com/alrex/parcool/common/action/impl/Slide.java index e78c3f92..027ee9f2 100644 --- a/src/main/java/com/alrex/parcool/common/action/impl/Slide.java +++ b/src/main/java/com/alrex/parcool/common/action/impl/Slide.java @@ -101,6 +101,10 @@ public void onStopInLocalClient(Player player) { if (animation != null && !animation.hasAnimator()) { animation.setAnimator(new CrawlAnimator()); } + if (!Parkourability.get(player).get(Crawl.class).isDoing()) { + player.swimAmount = 0; + player.swimAmountO = 0; + } } @Override @@ -109,6 +113,10 @@ public void onStopInOtherClient(Player player) { if (animation != null && !animation.hasAnimator()) { animation.setAnimator(new CrawlAnimator()); } + if (!Parkourability.get(player).get(Crawl.class).isDoing()) { + player.swimAmount = 0; + player.swimAmountO = 0; + } } @Nullable diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index f2973e84..699da9a9 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -7,3 +7,5 @@ public net.minecraft.client.renderer.RenderStateShard f_173075_ # RENDERTYPE_LEA public net.minecraft.world.entity.Entity onGround # onGround public net.minecraft.world.damagesource.DamageSources *() public net.minecraft.world.entity.player.Player canPlayerFitWithinBlocksAndEntitiesWhen(Lnet/minecraft/world/entity/Pose;)Z # canPlayerFitWithinBlocksAndEntitiesWhen +public net.minecraft.world.entity.LivingEntity swimAmount +public net.minecraft.world.entity.LivingEntity swimAmountO