From eabc4009fd53227cdfb23903716d4dabe2703657 Mon Sep 17 00:00:00 2001 From: LostInLinearPast <1283411677@qq.com> Date: Thu, 11 Dec 2025 00:54:10 +0800 Subject: [PATCH] version 0.1.5 --- gradle.properties | 2 +- .../sccore/animation/data/AnimationData.java | 2 +- .../animation/event/client/CameraModify.java | 27 ++++++++++++++++--- .../sccore/mixin/animation/MixinEntity.java | 16 +++++++---- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/gradle.properties b/gradle.properties index 14060d3..148aca6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ mapping_version=2023.09.03-1.20.1 mod_id=sccore mod_name=SnowyCrescentCore mod_license=GNU AGPL 3.0 -mod_version=1.20.1-0.1.4 +mod_version=1.20.1-0.1.5 mod_group_id=com.linearpast mod_authors=LostInLinearPast mod_description=A lib about capability and player animator. diff --git a/src/main/java/com/linearpast/sccore/animation/data/AnimationData.java b/src/main/java/com/linearpast/sccore/animation/data/AnimationData.java index e049273..4878ffd 100644 --- a/src/main/java/com/linearpast/sccore/animation/data/AnimationData.java +++ b/src/main/java/com/linearpast/sccore/animation/data/AnimationData.java @@ -146,7 +146,7 @@ public class AnimationData implements INBTSerializable { public AnimationData withLyingType(@Nullable AnimationData.LyingType lyingType) { this.lyingType = lyingType; if(lyingType == null) return this; - this.camPosOffset.add(0, -1.3f, 0); + this.camPosOffset = new Vec3(0, -1.3f, 0); this.camPitch = -90.0f; switch (lyingType) { case RIGHT -> { diff --git a/src/main/java/com/linearpast/sccore/animation/event/client/CameraModify.java b/src/main/java/com/linearpast/sccore/animation/event/client/CameraModify.java index 23a186c..7c08aba 100644 --- a/src/main/java/com/linearpast/sccore/animation/event/client/CameraModify.java +++ b/src/main/java/com/linearpast/sccore/animation/event/client/CameraModify.java @@ -66,6 +66,9 @@ public class CameraModify { } } + private static Vec3 targetOffset = Vec3.ZERO; + private static Vec3 currentOffset = Vec3.ZERO; + @SubscribeEvent public static void changeCameraPos(ViewportEvent.ComputeCameraAngles event) { Camera camera = event.getCamera(); @@ -77,8 +80,15 @@ public class CameraModify { AnimationData animation = AnimationUtils.getPredicateAnimationData(animationData -> !animationData.getCamPosOffset().multiply(1,0,1).equals(Vec3.ZERO) ); + float var3 = Minecraft.getInstance().getDeltaFrameTime(); + float var4 = var3 / 5.0F; + if (var4 == 0.0F) { + var4 = 0.0022857143F; + } + + targetOffset = Vec3.ZERO; if(animation != null) { - Vec3 camPosOffset = animation.getCamPosOffset(); + Vec3 camPosOffset = animation.getCamPosOffset().multiply(1,0,1); if(animation.isCamPosOffsetRelative()) { float yRot = player.yBodyRotO + (player.yBodyRot - player.yBodyRotO) * minecraft.getPartialTick(); float bodyAngel = -(yRot + 90) * ((float)Math.PI / 180F); @@ -86,18 +96,27 @@ public class CameraModify { double sin = Math.sin(bodyAngel); double x = camPosOffset.x; double z = camPosOffset.z; - camera.position = player.getEyePosition(minecraft.getPartialTick()).add( + targetOffset = new Vec3( sin * x + cos * z, camPosOffset.y, cos * x - sin * z ); } else { if(camPosOffset.distanceToSqr(Vec3.ZERO) <= 10.0 * 10.0 * 10.0) { - camera.position = player.getEyePosition(minecraft.getPartialTick()) - .add(camPosOffset); + targetOffset = camPosOffset; } } } + + currentOffset = new Vec3( + MathHelper.lerp(var4, currentOffset.x, targetOffset.x), + MathHelper.lerp(var4, currentOffset.y, targetOffset.y), + MathHelper.lerp(var4, currentOffset.z, targetOffset.z) + ); + if(!currentOffset.equals(Vec3.ZERO)) { + camera.position = player.getEyePosition(minecraft.getPartialTick()) + .add(currentOffset); + } } } } diff --git a/src/main/java/com/linearpast/sccore/mixin/animation/MixinEntity.java b/src/main/java/com/linearpast/sccore/mixin/animation/MixinEntity.java index 51e12d9..cfa8105 100644 --- a/src/main/java/com/linearpast/sccore/mixin/animation/MixinEntity.java +++ b/src/main/java/com/linearpast/sccore/mixin/animation/MixinEntity.java @@ -16,6 +16,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.HashMap; +import java.util.Map; + @Mixin(Entity.class) public abstract class MixinEntity { @Shadow private AABB bb; @@ -31,16 +34,19 @@ public abstract class MixinEntity { if(self instanceof Player player){ IAnimationCapability data = AnimationDataCapability.getCapability(player).orElse(null); if(data == null) return original; - Float camYModifier = null; + Map.Entry entry = null; for (ResourceLocation value : data.getAnimations().values()) { GenericAnimationData animation = AnimationService.INSTANCE.getAnimation(value); if(animation == null) continue; float animationCamY = (float) animation.getCamPosOffset().y; - if(camYModifier == null) camYModifier = animationCamY; - camYModifier = Math.min(camYModifier, animationCamY); + int priority = animation.getCamComputePriority(); + if((entry == null && animationCamY != 0) + || (entry != null && priority > entry.getValue())) { + entry = new HashMap.SimpleEntry<>(animationCamY, priority); + } } - if(camYModifier != null){ - return player.getEyeHeight(Pose.STANDING) + camYModifier; + if(entry != null){ + return player.getEyeHeight(Pose.STANDING) + entry.getKey(); } } return original;