diff --git a/gradle.properties b/gradle.properties index 6c96cb3..d2d6662 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.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. 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 7c08aba..eac264b 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 @@ -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); diff --git a/src/main/java/com/linearpast/sccore/animation/network/toclient/AnimationClearPacket.java b/src/main/java/com/linearpast/sccore/animation/network/toclient/AnimationClearPacket.java index 754dbac..e2deeec 100644 --- a/src/main/java/com/linearpast/sccore/animation/network/toclient/AnimationClearPacket.java +++ b/src/main/java/com/linearpast/sccore/animation/network/toclient/AnimationClearPacket.java @@ -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 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)); }); } } diff --git a/src/main/java/com/linearpast/sccore/animation/register/AnimationChannels.java b/src/main/java/com/linearpast/sccore/animation/register/AnimationChannels.java index 176fb14..c0c6186 100644 --- a/src/main/java/com/linearpast/sccore/animation/register/AnimationChannels.java +++ b/src/main/java/com/linearpast/sccore/animation/register/AnimationChannels.java @@ -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) diff --git a/src/main/java/com/linearpast/sccore/animation/register/AnimationRegistry.java b/src/main/java/com/linearpast/sccore/animation/register/AnimationRegistry.java index dc90897..a38a2a7 100644 --- a/src/main/java/com/linearpast/sccore/animation/register/AnimationRegistry.java +++ b/src/main/java/com/linearpast/sccore/animation/register/AnimationRegistry.java @@ -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 animationMap = modifierLayers.getOrDefault(player.getUUID(), new HashMap<>()); - Optional 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> oldArrayList = (ArrayList>) layersField.get(oldAnimationStack); ArrayList> newArrayList = (ArrayList>) layersField.get(newAnimationStack); ArrayList> result = new ArrayList<>(); - for (Pair integerIAnimationPair : oldArrayList) { - for (Pair iAnimationPair : List.copyOf(newArrayList)) { - if(Objects.equals(iAnimationPair.getLeft(), integerIAnimationPair.getLeft()) - && Objects.equals(iAnimationPair.getRight(), integerIAnimationPair.getRight())) { - newArrayList.remove(iAnimationPair); + for (Pair oldAnimationPair : oldArrayList) { + for (Pair 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); } } } diff --git a/src/main/java/com/linearpast/sccore/animation/utils/AnimationUtils.java b/src/main/java/com/linearpast/sccore/animation/utils/AnimationUtils.java index c1f8aeb..749f0d7 100644 --- a/src/main/java/com/linearpast/sccore/animation/utils/AnimationUtils.java +++ b/src/main/java/com/linearpast/sccore/animation/utils/AnimationUtils.java @@ -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 entry = null; + List 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(); + } } 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 0611802..1e79d7c 100644 --- a/src/main/java/com/linearpast/sccore/mixin/animation/MixinEntity.java +++ b/src/main/java/com/linearpast/sccore/mixin/animation/MixinEntity.java @@ -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 entry = null; - List 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;