version 0.1.5

This commit is contained in:
LostInLinearPast 2025-12-11 00:54:10 +08:00
parent 20e11be3d0
commit eabc4009fd
4 changed files with 36 additions and 11 deletions

View File

@ -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.

View File

@ -146,7 +146,7 @@ public class AnimationData implements INBTSerializable<CompoundTag> {
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 -> {

View File

@ -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);
}
}
}
}

View File

@ -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<Float, Integer> 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;