version 0.1.7

This commit is contained in:
LostInLinearPast 2025-12-23 20:11:01 +08:00
parent e3146feff3
commit 2745b4fb42
7 changed files with 52 additions and 40 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.6
mod_version=1.20.1-0.1.7
mod_group_id=com.linearpast
mod_authors=LostInLinearPast
mod_description=A lib about capability and player animator.

View File

@ -3,6 +3,7 @@ package com.linearpast.sccore.animation.event.client;
import com.linearpast.sccore.animation.capability.AnimationDataCapability;
import com.linearpast.sccore.animation.capability.inter.IAnimationCapability;
import com.linearpast.sccore.animation.data.AnimationData;
import com.linearpast.sccore.animation.data.RawAnimationData;
import com.linearpast.sccore.animation.utils.AnimationUtils;
import dev.kosmx.playerAnim.core.util.MathHelper;
import net.minecraft.client.Camera;
@ -89,6 +90,10 @@ public class CameraModify {
targetOffset = Vec3.ZERO;
if(animation != null) {
Vec3 camPosOffset = animation.getCamPosOffset().multiply(1,0,1);
AnimationData data = AnimationUtils.getEyeModifierAnimationData(player);
if(data instanceof RawAnimationData) {
camPosOffset = camPosOffset.add(0, data.getCamPosOffset().y, 0);
}
if(animation.isCamPosOffsetRelative()) {
float yRot = player.yBodyRotO + (player.yBodyRot - player.yBodyRotO) * minecraft.getPartialTick();
float bodyAngel = -(yRot + 90) * ((float)Math.PI / 180F);

View File

@ -1,7 +1,7 @@
package com.linearpast.sccore.animation.network.toclient;
import com.linearpast.sccore.animation.register.AnimationRegistry;
import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess;
import com.linearpast.sccore.animation.utils.AnimationUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.FriendlyByteBuf;
@ -31,9 +31,7 @@ public record AnimationClearPacket(@Nullable ResourceLocation layer) {
List<ResourceLocation> layers = new ArrayList<>();
if(layer != null) layers.add(layer);
else layers.addAll(AnimationRegistry.getLayers().keySet());
layers.forEach(layer -> PlayerAnimationAccess
.getPlayerAssociatedData(player).set(layer, null)
);
layers.forEach(layer -> AnimationUtils.playAnimation(player, layer, null));
});
}
}

View File

@ -25,7 +25,7 @@ public class AnimationChannels {
.encoder(AnimationClientStatusPacket::encode)
.consumerMainThread(AnimationClientStatusPacket::handle)
.add();
ModChannel.INSTANCE.messageBuilder(AnimationClearPacket.class, cid(), NetworkDirection.PLAY_TO_SERVER)
ModChannel.INSTANCE.messageBuilder(AnimationClearPacket.class, cid(), NetworkDirection.PLAY_TO_CLIENT)
.decoder(AnimationClearPacket::new)
.encoder(AnimationClearPacket::encode)
.consumerMainThread(AnimationClearPacket::handle)

View File

@ -206,9 +206,9 @@ public class AnimationRegistry {
registerLayers(layersCache);
layersCache.forEach((key, value) -> PlayerAnimationFactory.ANIMATION_DATA_FACTORY.registerFactory(
key, value, player -> {
if(Minecraft.getInstance().player == null) return ClientCache.registerPlayerAnimation(player);
Map<ResourceLocation, IAnimation> animationMap = modifierLayers.getOrDefault(player.getUUID(), new HashMap<>());
Optional<ResourceLocation> optional = animationMap.keySet().stream().filter(key::equals).findFirst();
if(optional.isPresent()) return animationMap.get(optional.get());
if(animationMap.containsKey(key)) return animationMap.get(key);
IAnimation iAnimation = ClientCache.registerPlayerAnimation(player);
animationMap.put(key, iAnimation);
modifierLayers.put(player.getUUID(), animationMap);
@ -235,11 +235,14 @@ public class AnimationRegistry {
ArrayList<Pair<Integer, IAnimation>> oldArrayList = (ArrayList<Pair<Integer, IAnimation>>) layersField.get(oldAnimationStack);
ArrayList<Pair<Integer, IAnimation>> newArrayList = (ArrayList<Pair<Integer, IAnimation>>) layersField.get(newAnimationStack);
ArrayList<Pair<Integer, IAnimation>> result = new ArrayList<>();
for (Pair<Integer, IAnimation> integerIAnimationPair : oldArrayList) {
for (Pair<Integer, IAnimation> iAnimationPair : List.copyOf(newArrayList)) {
if(Objects.equals(iAnimationPair.getLeft(), integerIAnimationPair.getLeft())
&& Objects.equals(iAnimationPair.getRight(), integerIAnimationPair.getRight())) {
newArrayList.remove(iAnimationPair);
for (Pair<Integer, IAnimation> oldAnimationPair : oldArrayList) {
for (Pair<Integer, IAnimation> newAnimationPair : List.copyOf(newArrayList)) {
if(Objects.equals(oldAnimationPair.getLeft(), newAnimationPair.getLeft())) {
KeyframeAnimation oldData = Optional.ofNullable((KeyframeAnimationPlayer) ((ModifierLayer<?>) oldAnimationPair.getRight()).getAnimation())
.map(KeyframeAnimationPlayer::getData).orElse(null);
KeyframeAnimation newData = Optional.ofNullable((KeyframeAnimationPlayer) ((ModifierLayer<?>) newAnimationPair.getRight()).getAnimation())
.map(KeyframeAnimationPlayer::getData).orElse(null);
if(Objects.equals(oldData, newData)) oldArrayList.remove(oldAnimationPair);
}
}
}

View File

@ -243,11 +243,37 @@ public class AnimationUtils {
if(data.getRiderAnimation() != null) resourceLocations.add(data.getRiderAnimation());
for (ResourceLocation value : resourceLocations) {
AnimationData animation = AnimationApi.getDataHelper().getAnimationData(value);
if(animation == null) return null;
if(animation == null) continue;
if(!predicate.test(animation)) continue;
animations = new AbstractMap.SimpleEntry<>(animation.getCamComputePriority(), animation);
if(animations == null || animations.getKey() < animation.getCamComputePriority()) {
animations = new AbstractMap.SimpleEntry<>(animation.getCamComputePriority(), animation);
}
}
return animations == null ? null : animations.getValue();
});
}
@Nullable
public static AnimationData getEyeModifierAnimationData(Player player) {
IAnimationCapability data = AnimationDataCapability.getCapability(player).orElse(null);
RawAnimationDataCapability rawData = RawAnimationDataCapability.getCapability(player).orElse(null);
if(data == null) return null;
if(rawData == null) return null;
Map.Entry<AnimationData, Integer> entry = null;
List<ResourceLocation> values = new ArrayList<>();
if(data.getRiderAnimation() != null) values.add(data.getRiderAnimation());
values.addAll(data.getAnimations().values());
values.addAll(rawData.getAnimations().values());
for (ResourceLocation value : values) {
AnimationData animation = AnimationApi.getDataHelper().getAnimationData(value);
if(animation == null) continue;
float animationCamY = (float) animation.getCamPosOffset().y;
int priority = animation.getCamComputePriority();
if((entry == null && animationCamY != 0)
|| (entry != null && priority > entry.getValue())) {
entry = new HashMap.SimpleEntry<>(animation, priority);
}
}
return entry == null ? null : entry.getKey();
}
}

View File

@ -1,11 +1,10 @@
package com.linearpast.sccore.mixin.animation;
import com.linearpast.sccore.animation.capability.AnimationDataCapability;
import com.linearpast.sccore.animation.capability.inter.IAnimationCapability;
import com.linearpast.sccore.animation.data.AnimationData;
import com.linearpast.sccore.animation.data.GenericAnimationData;
import com.linearpast.sccore.animation.service.AnimationService;
import com.linearpast.sccore.animation.utils.AnimationUtils;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.player.Player;
@ -16,11 +15,6 @@ 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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Mixin(Entity.class)
public abstract class MixinEntity {
@Shadow private AABB bb;
@ -34,23 +28,9 @@ public abstract class MixinEntity {
private float redefinedEyeHeight(float original){
Entity self = Entity.class.cast(this);
if(self instanceof Player player){
IAnimationCapability data = AnimationDataCapability.getCapability(player).orElse(null);
if(data == null) return original;
Map.Entry<Float, Integer> entry = null;
List<ResourceLocation> values = new ArrayList<>(data.getAnimations().values());
if(data.getRiderAnimation() != null) values.add(data.getRiderAnimation());
for (ResourceLocation value : values) {
GenericAnimationData animation = AnimationService.INSTANCE.getAnimation(value);
if(animation == null) continue;
float animationCamY = (float) animation.getCamPosOffset().y;
int priority = animation.getCamComputePriority();
if((entry == null && animationCamY != 0)
|| (entry != null && priority > entry.getValue())) {
entry = new HashMap.SimpleEntry<>(animationCamY, priority);
}
}
if(entry != null){
return player.getEyeHeight(Pose.STANDING) + entry.getKey();
AnimationData data = AnimationUtils.getEyeModifierAnimationData(player);
if(data instanceof GenericAnimationData){
return player.getEyeHeight(Pose.STANDING) + (float) data.getCamPosOffset().y;
}
}
return original;