diff --git a/CHANGELOG.md b/CHANGELOG.md index 6096092..111dbe1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2 +1,3 @@ -Fixed a bug where animation didn't play with PlayerParts set to null client side. -The mod now applies a little bit of fade length by default unless it's set to 0. \ No newline at end of file +Now has flashback, replaymod, and reforgedplay compatibility. +Will now play currently active animations for players that weren't there when it started. +API changes, check the wiki fr fr. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9fc9afe..dfce650 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.7.+" apply false + id "dev.architectury.loom" version "1.9.+" apply false id "com.modrinth.minotaur" version "2.+" id "com.matthewprenger.cursegradle" version "1.4.0" @@ -39,11 +39,20 @@ allprojects { repositories { mavenCentral() - maven { url 'https://libs.azuredoom.com:4443/mods' } maven { url 'https://maven.kosmx.dev/' } maven { url = "https://maven.parchmentmc.org" } maven { url "https://maven.terraformersmc.com/releases/" } - maven { url 'https://api.modrinth.com/maven' } + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } maven { url "https://maven.neoforged.net/releases/" } maven { url = "https://jitpack.io" @@ -60,6 +69,18 @@ allprojects { includeGroup("com.eliotlash.mclib") } } + repositories { + exclusiveContent { + forRepository { + maven { + url "https://cursemaven.com" + } + } + filter { + includeGroup "curse.maven" + } + } + } } tasks.withType(JavaCompile).tap { diff --git a/common/build.gradle b/common/build.gradle index 72a5baf..1e65371 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -8,7 +8,6 @@ dependencies { modImplementation "com.zigythebird.multiloaderutils:zigysmultiloaderutils-common-$rootProject.minecraft_version:$rootProject.multiloader_utils_version" modImplementation("software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}") - modImplementation "mod.azure.azurelib:azurelib-fabric-$rootProject.minecraft_version:$rootProject.azurelib_version" modImplementation "dev.kosmx.player-anim:player-animation-lib-fabric:${rootProject.player_anim_version}" diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPI.java b/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPI.java index 1fffd9d..acc5e23 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPI.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPI.java @@ -1,23 +1,20 @@ package com.zigythebird.playeranimatorapi.API; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.mojang.serialization.JsonOps; import com.zigythebird.multiloaderutils.utils.NetworkManager; import com.zigythebird.playeranimatorapi.ModInit; import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.data.PlayerParts; +import com.zigythebird.playeranimatorapi.example.FirstPersonExample; +import com.zigythebird.playeranimatorapi.misc.PlayerInterface; import com.zigythebird.playeranimatorapi.modifier.CommonModifier; import com.zigythebird.playeranimatorapi.utils.CommonPlayerLookup; +import dev.kosmx.playerAnim.core.util.Pair; import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import java.util.ArrayList; import java.util.List; /** @@ -29,53 +26,57 @@ public class PlayerAnimAPI { public static final ResourceLocation playerAnimPacket = ResourceLocation.fromNamespaceAndPath(ModInit.MOD_ID, "player_anim"); public static final ResourceLocation playerAnimStopPacket = ResourceLocation.fromNamespaceAndPath(ModInit.MOD_ID, "player_anim_stop"); - public static final ResourceLocation MIRROR_ON_ALT_HAND = ResourceLocation.fromNamespaceAndPath("playeranimatorapi", "mirroronalthand"); - - /**Use this if you are using an animation for an item.*/ - public static final List gameplayModifiers = new ArrayList<>(){ - { - add(new CommonModifier(MIRROR_ON_ALT_HAND, null)); - } - }; - - public static Gson gson = new GsonBuilder().setLenient().serializeNulls().create(); - - /**For emotes.*/ public static void playPlayerAnim(ServerLevel level, Player player, ResourceLocation animationID) { playPlayerAnim(level, player, animationID, PlayerParts.allEnabled, - null, -1, -1, 1000, false); + null, -1, -1, 1000, 0); } - /**For gameplay related stuff like player animations for items.*/ public static void playPlayerAnim(ServerLevel level, Player player, ResourceLocation animationID, PlayerParts parts, List modifiers, int priority) { - playPlayerAnim(level, player, animationID, parts, modifiers, -1, -1, priority, false); + playPlayerAnim(level, player, animationID, parts, modifiers, -1, -1, priority, 0); } - /**Play player animations with the PlayerAnimationData class.*/ - public static void playPlayerAnim(ServerLevel level, Player player, PlayerAnimationData data) { - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + public static void playPlayerAnim(ServerLevel level, Player player, ResourceLocation animationID, PlayerParts parts, List modifiers, + int fadeLength, int easeID, int priority, boolean firstPersonEnabled) { + if (firstPersonEnabled) { + modifiers.add(FirstPersonExample.FIRST_PERSON_MODIFIER); + } - buf.writeUtf(gson.toJson(PlayerAnimationData.CODEC.encodeStart(JsonOps.INSTANCE, data).getOrThrow())); - NetworkManager.sendToPlayers(CommonPlayerLookup.tracking(level, player.chunkPosition()), playerAnimPacket, buf); + playPlayerAnim(level, player, animationID, parts, modifiers, fadeLength, easeID, priority, 0); } - /**Play player animations with full customizability.*/ public static void playPlayerAnim(ServerLevel level, Player player, ResourceLocation animationID, PlayerParts parts, List modifiers, - int fadeLength, int easeID, int priority, boolean firstPersonEnabled) { - - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + int fadeLength, int easeID, int priority, int startTick) { PlayerAnimationData data = new PlayerAnimationData(player.getUUID(), animationID, - parts, modifiers, fadeLength, easeID, priority, firstPersonEnabled); + parts, modifiers, fadeLength, easeID, priority, startTick); + + playPlayerAnim(level, player, data); + } - buf.writeUtf(gson.toJson(PlayerAnimationData.CODEC.encodeStart(JsonOps.INSTANCE, data).getOrThrow())); + public static void playPlayerAnim(ServerLevel level, Player player, PlayerAnimationData data) { + if (data.animationID() == null) return; + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + PlayerAnimationData.STREAM_CODEC.encode(buf, data); NetworkManager.sendToPlayers(CommonPlayerLookup.tracking(level, player.chunkPosition()), playerAnimPacket, buf); + if (data.startTick() < 0) { + Pair oldData = ((PlayerInterface)player).paapi$getLastAnim(); + if (oldData != null) { + int ticksPassed = player.tickCount - oldData.getLeft(); + ((PlayerInterface) player).setLastAnim(data.getDataWithStartTick(ticksPassed)); + return; + } + } + ((PlayerInterface)player).setLastAnim(data); } /**Stop a specific player animation.*/ public static void stopPlayerAnim(ServerLevel level, Player player, ResourceLocation animationID) { + if (animationID == null) return; + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); buf.writeUUID(player.getUUID()); buf.writeResourceLocation(animationID); NetworkManager.sendToPlayers(CommonPlayerLookup.tracking(level, player.chunkPosition()), playerAnimStopPacket, buf); + Pair data = ((PlayerInterface)player).paapi$getLastAnim(); + if (data != null && data.getRight().animationID().equals(animationID)) ((PlayerInterface)player).setLastAnim(null); } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPIClient.java b/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPIClient.java index 5aa4fad..b759633 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPIClient.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/API/PlayerAnimAPIClient.java @@ -2,9 +2,11 @@ import com.zigythebird.multiloaderutils.misc.ModLoader; import com.zigythebird.multiloaderutils.utils.Platform; +import com.zigythebird.playeranimatorapi.compatibility.FlashbackCompat; import com.zigythebird.playeranimatorapi.compatibility.ReplayModCompat; import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.data.PlayerParts; +import com.zigythebird.playeranimatorapi.example.FirstPersonExample; import com.zigythebird.playeranimatorapi.modifier.CommonModifier; import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; import net.fabricmc.api.EnvType; @@ -21,35 +23,55 @@ @Environment(EnvType.CLIENT) public class PlayerAnimAPIClient { - /**For emotes.*/ public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID) { - playPlayerAnim(player, animationID, PlayerParts.allEnabled, null, - -1, -1, 1000, false, true); + playPlayerAnim(player, animationID, PlayerParts.allEnabled, null, 1000); } - /**For gameplay like player animations for items.*/ public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, int priority) { - playPlayerAnim(player, animationID, parts, modifiers, -1, -1, priority, false, true); + playPlayerAnim(player, animationID, parts, modifiers, -1, -1, priority, 0); } - /**Play player animations with the PlayerAnimationData class.*/ public static void playPlayerAnim(AbstractClientPlayer player, PlayerAnimationData data) { + boolean isFabric = Platform.getLoader().equals(ModLoader.Fabric); + + if ((isFabric && Platform.isModLoaded("replaymod")) || + Platform.isModLoaded("reforgedplaymod")) { + ReplayModCompat.playPlayerAnim(player, data.animationID(), data.parts(), data.modifiers(), data.fadeLength(), data.easeID(), data.priority(), data.startTick()); + } + + if (isFabric && Platform.isModLoaded("flashback")) + FlashbackCompat.playPlayerAnim(player, data.animationID(), data.parts(), data.modifiers(), data.fadeLength(), data.easeID(), data.priority(), data.startTick()); + PlayerAnimations.playAnimation(player, data); } - /**Play player animations with full customizability.*/ public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, int fadeLength, int easeID, int priority, boolean firstPersonEnabled, boolean replaceTick) { + if (firstPersonEnabled) { + modifiers.add(FirstPersonExample.FIRST_PERSON_MODIFIER); + } - if (Platform.isModLoaded("replaymod") && Platform.getLoader().equals(ModLoader.Fabric)) { - ReplayModCompat.playPlayerAnim(player, animationID, parts, modifiers, fadeLength, easeID, priority, firstPersonEnabled, replaceTick); + int startTick = replaceTick ? 0 : -1; + + playPlayerAnim(player, animationID, parts, modifiers, fadeLength, easeID, priority, startTick); + } + + public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, + int fadeLength, int easeID, int priority, int startTick) { + boolean isFabric = Platform.getLoader().equals(ModLoader.Fabric); + + if ((isFabric && Platform.isModLoaded("replaymod")) || + Platform.isModLoaded("reforgedplaymod")) { + ReplayModCompat.playPlayerAnim(player, animationID, parts, modifiers, fadeLength, easeID, priority, startTick); } + if (isFabric && Platform.isModLoaded("flashback")) + FlashbackCompat.playPlayerAnim(player, animationID, parts, modifiers, fadeLength, easeID, priority, startTick); + PlayerAnimations.playAnimation(player, new PlayerAnimationData(player.getUUID(), animationID, parts, modifiers, - fadeLength, easeID, priority, firstPersonEnabled), replaceTick); + fadeLength, easeID, priority, 0)); } - /**Stop a player animation*/ public static void stopPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID) { if (Platform.isModLoaded("replaymod") && Platform.getLoader().equals(ModLoader.Fabric)) { ReplayModCompat.stopPlayerAnim(player, animationID); diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/ModInit.java b/common/src/main/java/com/zigythebird/playeranimatorapi/ModInit.java index 416c4df..5b472dc 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/ModInit.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/ModInit.java @@ -1,17 +1,15 @@ package com.zigythebird.playeranimatorapi; import com.mojang.logging.LogUtils; -import com.zigythebird.multiloaderutils.utils.Platform; -import com.zigythebird.playeranimatorapi.azure.ModAzureUtils; +import net.minecraft.resources.ResourceLocation; import org.slf4j.Logger; public class ModInit { public static final String MOD_ID = "playeranimatorapi"; public static final Logger LOGGER = LogUtils.getLogger(); - public static void init() { - if (Platform.isModLoaded("azurelib", "mod.azure.azurelib.common.internal.common.AzureLib")) { - ModAzureUtils.init(); - } - } + public static final ResourceLocation altStopPlayerAnimationPacket = ResourceLocation.fromNamespaceAndPath(MOD_ID, "alt_stop_player_animation_packet"); + public static final ResourceLocation altPlayPlayerAnimationPacket = ResourceLocation.fromNamespaceAndPath(MOD_ID, "alt_play_player_animation_packet"); + + public static void init() {} } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/ModInitClient.java b/common/src/main/java/com/zigythebird/playeranimatorapi/ModInitClient.java index 3068fb0..3f85afb 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/ModInitClient.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/ModInitClient.java @@ -1,7 +1,14 @@ package com.zigythebird.playeranimatorapi; +import com.zigythebird.multiloaderutils.utils.NetworkManager; +import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; import com.zigythebird.playeranimatorapi.registry.AnimModifierRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.resources.ResourceLocation; + +import java.util.UUID; public class ModInitClient { @@ -10,5 +17,27 @@ public class ModInitClient { public static void init() { PlayerAnimations.init(); AnimModifierRegistry.register(); + + NetworkManager.registerReceiver(NetworkManager.Side.S2C, ModInit.altPlayPlayerAnimationPacket, (buf, context) -> { + try { + PlayerAnimations.playAnimation(PlayerAnimationData.STREAM_CODEC.decode(buf)); + } + catch (NullPointerException | IllegalStateException e) { + ModInit.LOGGER.error(e.getMessage()); + } + }); + + NetworkManager.registerReceiver(NetworkManager.Side.S2C, ModInit.altStopPlayerAnimationPacket, (buf, context) -> { + + UUID uuid = buf.readUUID(); + ResourceLocation resourceLocation = buf.readResourceLocation(); + + try { + PlayerAnimations.stopAnimation((AbstractClientPlayer) Minecraft.getInstance().level.getPlayerByUUID(uuid), resourceLocation); + } + catch (NullPointerException e) { + ModInit.LOGGER.error(e.getMessage()); + } + }); } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/ModMixinPlugin.java b/common/src/main/java/com/zigythebird/playeranimatorapi/ModMixinPlugin.java index b572f74..dc5acc6 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/ModMixinPlugin.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/ModMixinPlugin.java @@ -11,10 +11,7 @@ public class ModMixinPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (mixinClassName.endsWith("_azureOnly") && !Platform.isModLoaded("azurelib", "mod.azure.azurelib.common.internal.common.AzureLib")) { - return false; - } - if (mixinClassName.endsWith("_geckoOnly") && (Platform.isModLoaded("azurelib", "mod.azure.azurelib.common.internal.common.AzureLib") || !Platform.isModLoaded("geckolib", "software.bernie.geckolib.GeckoLib"))) { + if (mixinClassName.endsWith("_geckoOnly") && !Platform.isModLoaded("geckolib", "software.bernie.geckolib.GeckoLib")) { return false; } if (mixinClassName.equals("zigy.playeranimatorapi.mixin.LivingEntityRendererMixin") && Platform.isModLoaded("azurelib", "mod.azure.azurelib.common.internal.common.AzureLib")) { diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/AnimatablePlayerLayer.java b/common/src/main/java/com/zigythebird/playeranimatorapi/azure/AnimatablePlayerLayer.java deleted file mode 100644 index d5fd8a3..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/AnimatablePlayerLayer.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.zigythebird.playeranimatorapi.azure; - -import com.zigythebird.playeranimatorapi.ModInit; -import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; -import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; -import com.zigythebird.playeranimatorapi.registry.AzureControllerRegistry; -import mod.azure.azurelib.common.internal.client.util.RenderUtils; -import mod.azure.azurelib.common.internal.common.network.SerializableDataTicket; -import mod.azure.azurelib.common.internal.common.network.packet.AnimDataSyncPacket; -import mod.azure.azurelib.common.internal.common.network.packet.AnimTriggerPacket; -import mod.azure.azurelib.common.internal.common.util.AzureLibUtil; -import mod.azure.azurelib.common.platform.Services; -import mod.azure.azurelib.core.animatable.GeoAnimatable; -import mod.azure.azurelib.core.animatable.instance.AnimatableInstanceCache; -import mod.azure.azurelib.core.animation.AnimatableManager; -import mod.azure.azurelib.core.animation.AnimationController; -import mod.azure.azurelib.core.object.PlayState; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.world.entity.Entity; -import org.jetbrains.annotations.Nullable; - -public class AnimatablePlayerLayer implements GeoAnimatable { - - private final AbstractClientPlayer player; - - public AnimatablePlayerLayer(AbstractClientPlayer player) { - this.player = player; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { - CustomModifierLayer layer = PlayerAnimations.getModifierLayer(player); - controllers.add(new AnimationController<>(this, ModInit.MOD_ID, state -> PlayState.CONTINUE).setOverrideEasingTypeFunction((azurePlayer) -> ModAzureUtilsClient.getEasingTypeForID(player))); - controllers.add(new AnimationController<>(this, ModInit.MOD_ID, AzureControllerRegistry.getControllerForMod(0, layer))); - controllers.add(new AnimationController<>(this, ModInit.MOD_ID, AzureControllerRegistry.getControllerForMod(1, layer))); - controllers.add(new AnimationController<>(this, ModInit.MOD_ID, AzureControllerRegistry.getControllerForMod(2, layer))); - controllers.add(new AnimationController<>(this, ModInit.MOD_ID, AzureControllerRegistry.getControllerForMod(3, layer))); - controllers.add(new AnimationController<>(this, ModInit.MOD_ID, AzureControllerRegistry.getControllerForMod(4, layer))); - } - - private final AnimatableInstanceCache cache = AzureLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } - - @Nullable - public D getAnimData(SerializableDataTicket dataTicket) { - return getAnimatableInstanceCache().getManagerForId(player.getId()).getData(dataTicket); - } - - public void setAnimData(Entity relatedEntity, long instanceId, SerializableDataTicket dataTicket, D data) { - if (relatedEntity.level().isClientSide()) { - getAnimatableInstanceCache().getManagerForId(instanceId).setData(dataTicket, data); - } - else { - syncAnimData(instanceId, dataTicket, data, relatedEntity); - } - } - - public void syncAnimData(long instanceId, SerializableDataTicket dataTicket, D data, Entity entityToTrack) { - Services.NETWORK.sendToTrackingEntityAndSelf( - new AnimDataSyncPacket<>(getClass().toString(), instanceId, dataTicket, data), - entityToTrack - ); - } - - public void triggerAnim(Entity relatedEntity, long instanceId, @Nullable String controllerName, String animName) { - if (relatedEntity.level().isClientSide()) { - getAnimatableInstanceCache().getManagerForId(instanceId).tryTriggerAnimation(controllerName, animName); - } else { - Services.NETWORK.sendToTrackingEntityAndSelf( - new AnimTriggerPacket(getClass().toString(), instanceId, controllerName, animName), - relatedEntity - ); - } - } - - @Override - public double getTick(Object object) { - return RenderUtils.getCurrentTick(); - } - - public AbstractClientPlayer getPlayer() { - return player; - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/ModAzureUtils.java b/common/src/main/java/com/zigythebird/playeranimatorapi/azure/ModAzureUtils.java deleted file mode 100644 index 1d38546..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/ModAzureUtils.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zigythebird.playeranimatorapi.azure; - -import mod.azure.azurelib.common.internal.common.AzureLib; - -public class ModAzureUtils { - - public static void init() { - AzureLib.initialize(); - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/ModAzureUtilsClient.java b/common/src/main/java/com/zigythebird/playeranimatorapi/azure/ModAzureUtilsClient.java deleted file mode 100644 index 1babd82..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/ModAzureUtilsClient.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.zigythebird.playeranimatorapi.azure; - -import com.zigythebird.playeranimatorapi.ModInit; -import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; -import com.zigythebird.playeranimatorapi.misc.AzurePlayerInterface; -import com.zigythebird.playeranimatorapi.playeranims.ConditionalAnimations; -import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; -import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; -import mod.azure.azurelib.core.animation.*; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.world.entity.player.Player; - -public class ModAzureUtilsClient { - - public static void playGeckoAnimation(AbstractClientPlayer player, PlayerAnimationData data, float speed) { - AnimatableManager manager = ((AzurePlayerInterface)player).playeranimatorapi$getAnimatablePlayerLayer().getAnimatableInstanceCache().getManagerForId(player.getId()); - AnimationController controller = manager.getAnimationControllers().get(ModInit.MOD_ID); - controller.triggerableAnim(ConditionalAnimations.getAnimationForCurrentConditions(data).getPath(), RawAnimation.begin().then(ConditionalAnimations.getAnimationForCurrentConditions(data).getPath(), Animation.LoopType.DEFAULT)); - controller.setAnimationSpeed(speed); - - controller.setTransitionLength(data.fadeLength() > -1 ? data.fadeLength() : 0); - controller.tryTriggerAnimation(ConditionalAnimations.getAnimationForCurrentConditions(data).getPath()); - } - - public static void stopGeckoAnimation(AbstractClientPlayer player) { - AnimatableManager manager = ((AzurePlayerInterface)player).playeranimatorapi$getAnimatablePlayerLayer().getAnimatableInstanceCache().getManagerForId(player.getId()); - AnimationController controller = manager.getAnimationControllers().get(ModInit.MOD_ID); - controller.stop(); - } - - public static void tick(AbstractClientPlayer player, CustomModifierLayer animationContainer) { - AnimatableManager manager = ((AzurePlayerInterface)player).playeranimatorapi$getAnimatablePlayerLayer().getAnimatableInstanceCache().getManagerForId(player.getId()); - AnimationController controller = manager.getAnimationControllers().get(ModInit.MOD_ID); - - if (!controller.isPlayingTriggeredAnimation()) { - ModAzureUtilsClient.playGeckoAnimation(player, animationContainer.data, animationContainer.getSpeed()); - } - } - - public static EasingType getEasingTypeForID(Player player) { - CustomModifierLayer animationContainer = PlayerAnimations.getModifierLayer((AbstractClientPlayer) player); - switch (animationContainer.data.easeID()) { - case 0 -> { - return EasingType.LINEAR; - } - case 6 -> { - return EasingType.EASE_IN_SINE; - } - case 7 -> { - return EasingType.EASE_OUT_SINE; - } - case 8 -> { - return EasingType.EASE_IN_OUT_SINE; - } - case 9 -> { - return EasingType.EASE_IN_CUBIC; - } - case 10 -> { - return EasingType.EASE_OUT_CUBIC; - } - case 11 -> { - return EasingType.EASE_IN_OUT_CUBIC; - } - case 12 -> { - return EasingType.EASE_IN_QUAD; - } - case 13 -> { - return EasingType.EASE_OUT_QUAD; - } - case 14 -> { - return EasingType.EASE_IN_OUT_QUAD; - } - case 15 -> { - return EasingType.EASE_IN_QUART; - } - case 16 -> { - return EasingType.EASE_OUT_QUART; - } - case 17 -> { - return EasingType.EASE_IN_OUT_QUART; - } - case 18 -> { - return EasingType.EASE_IN_QUINT; - } - case 19 -> { - return EasingType.EASE_OUT_QUINT; - } - case 20 -> { - return EasingType.EASE_IN_OUT_QUINT; - } - case 21 -> { - return EasingType.EASE_IN_EXPO; - } - case 22 -> { - return EasingType.EASE_OUT_EXPO; - } - case 23 -> { - return EasingType.EASE_IN_OUT_EXPO; - } - case 24 -> { - return EasingType.EASE_IN_CIRC; - } - case 25 -> { - return EasingType.EASE_OUT_CIRC; - } - case 26 -> { - return EasingType.EASE_IN_OUT_CIRC; - } - case 27 -> { - return EasingType.EASE_IN_BACK; - } - case 28 -> { - return EasingType.EASE_OUT_BACK; - } - case 29 -> { - return EasingType.EASE_IN_OUT_BACK; - } - case 30 -> { - return EasingType.EASE_IN_ELASTIC; - } - case 31 -> { - return EasingType.EASE_OUT_ELASTIC; - } - case 32 -> { - return EasingType.EASE_IN_OUT_ELASTIC; - } - case 33 -> { - return EasingType.EASE_IN_BOUNCE; - } - case 34 -> { - return EasingType.EASE_OUT_BOUNCE; - } - case 35 -> { - return EasingType.EASE_IN_OUT_BOUNCE; - } - } - return null; - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/PlayerAnimationModel.java b/common/src/main/java/com/zigythebird/playeranimatorapi/azure/PlayerAnimationModel.java deleted file mode 100644 index fd46b6a..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/PlayerAnimationModel.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.zigythebird.playeranimatorapi.azure; - -import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; -import mod.azure.azurelib.common.api.client.model.GeoModel; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; - -import java.util.HashMap; -import java.util.Map; - -public class PlayerAnimationModel extends GeoModel { - - public static Map resourceLocations = new HashMap<>(); - - @Override - public ResourceLocation getModelResource(AnimatablePlayerLayer player) { - ResourceLocation geckoResource = getCurrentGeckoResource(player); - return getResourceLocation(geckoResource.getNamespace() + ":geo/player_animation/" + geckoResource.getPath() + ".geo.json"); - } - - @Override - public ResourceLocation getTextureResource(AnimatablePlayerLayer player) { - ResourceLocation geckoResource = getCurrentGeckoResource(player); - return getResourceLocation(geckoResource.getNamespace() + ":textures/player_animation/" + geckoResource.getPath() + ".png"); - } - - @Override - public ResourceLocation getAnimationResource(AnimatablePlayerLayer player) { - ResourceLocation geckoResource = getCurrentGeckoResource(player); - return getResourceLocation(geckoResource.getNamespace() + ":animations/player_animation/" + geckoResource.getPath() + ".animation.json"); - } - - public static ResourceLocation getCurrentGeckoResource(AnimatablePlayerLayer player) { - ResourceLocation currentAnim = PlayerAnimations.getModifierLayer(player.getPlayer()).currentAnim; - if (PlayerAnimations.geckoMap.containsKey(currentAnim)) { - return PlayerAnimations.geckoMap.get(currentAnim); - } - return null; - } - - public static ResourceLocation getResourceLocation(String resource) { - if (!resourceLocations.containsKey(resource)) { - resourceLocations.put(resource, ResourceLocation.parse(resource)); - } - return resourceLocations.get(resource); - } - - public boolean allResourcesExist(AnimatablePlayerLayer player) { - ResourceManager manager = Minecraft.getInstance().getResourceManager(); - return getCurrentGeckoResource(player) != null && manager.getResource(getModelResource(player)).isPresent() && manager.getResource(getTextureResource(player)).isPresent() - && manager.getResource(getAnimationResource(player)).isPresent(); - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/PlayerAnimationRenderer.java b/common/src/main/java/com/zigythebird/playeranimatorapi/azure/PlayerAnimationRenderer.java deleted file mode 100644 index bdc0546..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/azure/PlayerAnimationRenderer.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.zigythebird.playeranimatorapi.azure; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.zigythebird.multiloaderutils.utils.Platform; -import com.zigythebird.playeranimatorapi.compatibility.PehkuiCompat; -import com.zigythebird.playeranimatorapi.misc.GetAzureModelRendererInterface; -import com.zigythebird.playeranimatorapi.misc.PlayerModelInterface; -import mod.azure.azurelib.common.api.client.model.GeoModel; -import mod.azure.azurelib.common.api.client.renderer.GeoObjectRenderer; -import mod.azure.azurelib.common.internal.common.cache.object.BakedGeoModel; -import mod.azure.azurelib.common.internal.common.cache.object.GeoBone; -import mod.azure.azurelib.common.internal.common.constant.DataTickets; -import mod.azure.azurelib.core.animation.AnimationState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Pose; -import net.minecraft.world.phys.Vec2; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; - -public class PlayerAnimationRenderer extends GeoObjectRenderer implements PlayerModelInterface { - - public PlayerModel playerModel; - - public PlayerAnimationRenderer() { - super(new PlayerAnimationModel()); - } - - public PlayerAnimationRenderer(GeoModel model) { - super(model); - } - - @Override - public void preRender(PoseStack poseStack, T animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - this.objectRenderTranslations = new Matrix4f(poseStack.last().pose()); - - scaleModelForRender(this.scaleWidth, this.scaleHeight, poseStack, animatable, model, isReRender, partialTick, packedLight, packedOverlay); - - poseStack.pushPose(); - if (Platform.isModLoaded("pehkui")) { - Vec2 scale = PehkuiCompat.getScale(animatable.getPlayer(), partialTick); - poseStack.scale(scale.x, scale.y, scale.x); - } - setupAnim(this.getGeoModel().getBakedModel(this.getGeoModel().getModelResource(animatable))); - poseStack.popPose(); - } - - @Override - public void render(PoseStack poseStack, T animatable, @Nullable MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, int packedLight) { - if (playerModel != null) { - ((GetAzureModelRendererInterface)playerModel).playeranimatorapi$setRenderer(this); - } - if (renderType == null) { - renderType = RenderType.entityTranslucent(model.getTextureResource(animatable)); - } - super.render(poseStack, animatable, bufferSource, renderType, buffer, packedLight); - } - - @Override - public void actuallyRender(PoseStack poseStack, T animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - poseStack.pushPose(); - - LivingEntity livingEntity = animatable.getPlayer(); - - boolean shouldSit = animatable.getPlayer().isPassenger() && (animatable.getPlayer().getVehicle() != null); - float lerpBodyRot = livingEntity == null ? 0 : Mth.rotLerp(partialTick, livingEntity.yBodyRotO, - livingEntity.yBodyRot); - float lerpHeadRot = livingEntity == null ? 0 : Mth.rotLerp(partialTick, livingEntity.yHeadRotO, - livingEntity.yHeadRot); - float netHeadYaw; - - if (shouldSit && animatable.getPlayer().getVehicle() instanceof LivingEntity livingentity) { - lerpBodyRot = Mth.rotLerp(partialTick, livingentity.yBodyRotO, livingentity.yBodyRot); - netHeadYaw = lerpHeadRot - lerpBodyRot; - float clampedHeadYaw = Mth.clamp(Mth.wrapDegrees(netHeadYaw), -85, 85); - lerpBodyRot = lerpHeadRot - clampedHeadYaw; - - if (clampedHeadYaw * clampedHeadYaw > 2500f) lerpBodyRot += clampedHeadYaw * 0.2f; - } - - if (animatable.getPlayer().getPose() == Pose.SLEEPING && livingEntity != null) { - Direction bedDirection = livingEntity.getBedOrientation(); - - if (bedDirection != null) { - float eyePosOffset = livingEntity.getEyeHeight(Pose.STANDING) - 0.1F; - - poseStack.translate(-bedDirection.getStepX() * eyePosOffset, 0, - -bedDirection.getStepZ() * eyePosOffset); - } - } - - float ageInTicks = animatable.getPlayer().tickCount + partialTick; - - applyRotations(animatable, poseStack, ageInTicks, lerpBodyRot, partialTick); - - if (!isReRender) { - AnimationState animationState = new AnimationState<>(animatable, 0, 0, partialTick, false); - long instanceId = getInstanceId(animatable); - animationState.setData(DataTickets.TICK, animatable.getTick(animatable)); - - this.model.addAdditionalStateData(animatable, instanceId, animationState::setData); - this.model.handleAnimations(animatable, instanceId, animationState); - } - - poseStack.translate(0, 0.01f, 0); - - this.modelRenderTranslations = new Matrix4f(poseStack.last().pose()); - - if (!animatable.getPlayer().isInvisibleTo(Minecraft.getInstance().player)) { - updateAnimatedTextureFrame(animatable); - for (GeoBone group : model.topLevelBones) { - renderRecursively(poseStack, animatable, group, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); - } - } - poseStack.popPose(); - } - - protected void applyRotations(AnimatablePlayerLayer animatable, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTick) { -// Pose pose = animatable.getPlayer().getPose(); -// LivingEntity livingEntity = animatable.getPlayer(); -// -// if (this.isShaking(animatable.getPlayer())) { -// rotationYaw += (float) (Math.cos((double) animatable.getPlayer().tickCount * 3.25) * Math.PI * 0.4000000059604645); -// } -// -// if (pose != Pose.SLEEPING) poseStack.mulPose(Axis.YP.rotationDegrees(180f - rotationYaw)); -// -// if (livingEntity != null && livingEntity.deathTime > 0) { -// float deathRotation = (livingEntity.deathTime + partialTick - 1f) / 20f * 1.6f; -// -// poseStack.mulPose( -// Axis.ZP.rotationDegrees(Math.min(Mth.sqrt(deathRotation), 1) * getDeathMaxRotation(animatable.getPlayer()))); -// } else if (livingEntity != null && livingEntity.isAutoSpinAttack()) { -// poseStack.mulPose(Axis.XP.rotationDegrees(-90f - livingEntity.getXRot())); -// poseStack.mulPose(Axis.YP.rotationDegrees((livingEntity.tickCount + partialTick) * -75f)); -// } else if (livingEntity != null && pose == Pose.SLEEPING) { -// Direction bedOrientation = livingEntity.getBedOrientation(); -// -// poseStack.mulPose(Axis.YP.rotationDegrees( -// bedOrientation != null ? RenderUtils.getDirectionAngle(bedOrientation) : rotationYaw)); -// poseStack.mulPose(Axis.ZP.rotationDegrees(getDeathMaxRotation(animatable.getPlayer()))); -// poseStack.mulPose(Axis.YP.rotationDegrees(270f)); -// } else { -// String name = animatable.getPlayer().getName().getString(); -// -// if (!animatable.getPlayer().isModelPartShown(PlayerModelPart.CAPE)) return; -// -// if (name.equals("Dinnerbone") || name.equalsIgnoreCase("Grumm")) { -// poseStack.translate(0, animatable.getPlayer().getBbHeight() + 0.1f, 0); -// poseStack.mulPose(Axis.ZP.rotationDegrees(180f)); -// } -// } - } - - public boolean isShaking(AbstractClientPlayer entity) { - return entity.isFullyFrozen(); - } - - protected float getDeathMaxRotation(AbstractClientPlayer animatable) { - return 90f; - } - - public void setPlayerModel(PlayerModel model) { - this.playerModel = model; - } - - public void setupAnim(BakedGeoModel model) { - matchPlayerModel(model, playerModel.head, "head"); - matchPlayerModel(model, playerModel.body, "torso"); - matchPlayerModel(model, playerModel.rightArm, "right_arm"); - matchPlayerModel(model, playerModel.leftArm, "left_arm"); - matchPlayerModel(model, playerModel.rightLeg, "right_leg"); - matchPlayerModel(model, playerModel.leftLeg, "left_leg"); - } - - public void matchPlayerModel(BakedGeoModel model, ModelPart part, String name) { - if (model.getBone(name).isPresent()) { - GeoBone bone = model.getBone(name).get(); - - bone.setPosX(-part.x); - bone.setPosY(-part.y); - bone.setPosZ(part.z); - bone.setRotX(-part.xRot); - bone.setRotY(-part.yRot); - bone.setRotZ(part.zRot); - } - } - - @Override - public long getInstanceId(AnimatablePlayerLayer animatable) { - return animatable.getPlayer().getId(); - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/commands/PlayPlayerAnimationCommand.java b/common/src/main/java/com/zigythebird/playeranimatorapi/commands/PlayPlayerAnimationCommand.java index 313bfc6..de9636a 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/commands/PlayPlayerAnimationCommand.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/commands/PlayPlayerAnimationCommand.java @@ -52,23 +52,19 @@ private static int execute(CommandContext command, CommandSt } case Advanced -> { for (ServerPlayer player : EntityArgument.getPlayers(command, "player")) { - PlayerAnimationData data = new PlayerAnimationData(player.getUUID(), + PlayerAnimAPI.playPlayerAnim(command.getSource().getLevel(), player, ResourceLocationArgument.getId(command, "animationID"), null, null, IntegerArgumentType.getInteger(command, "fadeLength"), IntegerArgumentType.getInteger(command, "easeID"), IntegerArgumentType.getInteger(command, "priority"), BoolArgumentType.getBool(command, "firstPersonEnabled")); - - PlayerAnimAPI.playPlayerAnim(command.getSource().getLevel(), player, data); } } case Complete -> { for (ServerPlayer player : EntityArgument.getPlayers(command, "player")) { - PlayerAnimationData data = new PlayerAnimationData(player.getUUID(), + PlayerAnimAPI.playPlayerAnim(command.getSource().getLevel(), player, ResourceLocationArgument.getId(command, "animationID"), PlayerParts.fromBigInteger(playerPartsIntFromString(StringArgumentType.getString(command, "playerParts"))), modifierList(StringArgumentType.getString(command, "modifiers")), IntegerArgumentType.getInteger(command, "fadeLength"), IntegerArgumentType.getInteger(command, "easeID"), IntegerArgumentType.getInteger(command, "priority"), BoolArgumentType.getBool(command, "firstPersonEnabled")); - - PlayerAnimAPI.playPlayerAnim(command.getSource().getLevel(), player, data); } } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/FlashbackCompat.java b/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/FlashbackCompat.java new file mode 100644 index 0000000..c05951c --- /dev/null +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/FlashbackCompat.java @@ -0,0 +1,24 @@ +package com.zigythebird.playeranimatorapi.compatibility; + +import com.zigythebird.playeranimatorapi.data.PlayerParts; +import com.zigythebird.playeranimatorapi.modifier.CommonModifier; +import dev.architectury.injectables.annotations.ExpectPlatform; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.resources.ResourceLocation; +import org.apache.commons.lang3.NotImplementedException; + +import java.util.List; + +public class FlashbackCompat { + + @ExpectPlatform + public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, + int fadeLength, int easeID, int priority, int startTick) { + throw new NotImplementedException(); + } + + @ExpectPlatform + public static void stopPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID) { + throw new NotImplementedException(); + } +} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/ReplayModCompat.java b/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/ReplayModCompat.java index 030abae..b8788d7 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/ReplayModCompat.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/compatibility/ReplayModCompat.java @@ -13,7 +13,7 @@ public class ReplayModCompat { @ExpectPlatform public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, - int fadeLength, int easeID, int priority, boolean firstPersonEnabled, boolean replaceTick) { + int fadeLength, int easeID, int priority, int startTick) { throw new NotImplementedException(); } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerAnimationData.java b/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerAnimationData.java index a669ec8..c05a204 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerAnimationData.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerAnimationData.java @@ -1,48 +1,67 @@ package com.zigythebird.playeranimatorapi.data; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.zigythebird.multiloaderutils.misc.ModCodecs; import com.zigythebird.playeranimatorapi.modifier.CommonModifier; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.Utf8String; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +/** + * Use at your own risk. + * All parameters explained in the wiki. + */ +@ApiStatus.Internal public record PlayerAnimationData(UUID playerUUID, ResourceLocation animationID, PlayerParts parts, List modifiers, - int fadeLength, int easeID, int priority, boolean firstPersonEnabled) { + int fadeLength, int easeID, int priority, int startTick) { - public static final Codec UUID_CODEC = Codec.list(Codec.LONG).comapFlatMap(PlayerAnimationData::readUUID, PlayerAnimationData::writeUUID).stable(); - public static final Codec RESOURCE_LOCATION_CODEC = Codec.STRING.comapFlatMap(ResourceLocation::read, PlayerAnimationData::resourceLocationToString).stable(); + public static final StreamCodec UUID_STREAM_CODEC = new StreamCodec<>() { + @Override + public UUID decode(ByteBuf object) { + return UUID.fromString(Utf8String.read(object, 32767)); + } - public static DataResult readUUID(List input) { - return DataResult.success(new UUID(input.get(0), input.get(1))); - } + @Override + public void encode(ByteBuf object, UUID object2) { + Utf8String.write(object, object2.toString(), 32767); + } + }; - public static List writeUUID(UUID uuid) { - List list = new ArrayList<>(); - list.add(uuid.getMostSignificantBits()); - list.add(uuid.getLeastSignificantBits()); - return list; - } + public static final StreamCodec STREAM_CODEC = new StreamCodec<>() { + @Override + public PlayerAnimationData decode(FriendlyByteBuf buf) { + return new PlayerAnimationData( + UUID_STREAM_CODEC.decode(buf), + ModCodecs.RESOURCELOCATION.decode(buf), + PlayerParts.STREAM_CODEC.decode(buf), + CommonModifier.STREAM_CODEC.apply(ByteBufCodecs.list()).decode(buf), + ByteBufCodecs.INT.decode(buf), + ByteBufCodecs.INT.decode(buf), + ByteBufCodecs.INT.decode(buf), + ByteBufCodecs.INT.decode(buf) + ); + } - public static String resourceLocationToString(ResourceLocation location) { - if (location == null) { - return "null:null"; + @Override + public void encode(FriendlyByteBuf buf, PlayerAnimationData obj) { + UUID_STREAM_CODEC.encode(buf, obj.playerUUID()); + ModCodecs.RESOURCELOCATION.encode(buf, obj.animationID()); + PlayerParts.STREAM_CODEC.encode(buf, obj.parts()); + CommonModifier.STREAM_CODEC.apply(ByteBufCodecs.list()).encode(buf, obj.modifiers()); + ByteBufCodecs.INT.encode(buf, obj.fadeLength()); + ByteBufCodecs.INT.encode(buf, obj.easeID()); + ByteBufCodecs.INT.encode(buf, obj.priority()); + ByteBufCodecs.INT.encode(buf, obj.startTick()); } + }; - return location.toString(); + public PlayerAnimationData getDataWithStartTick(int startTick) { + return new PlayerAnimationData(playerUUID, animationID, parts, modifiers, fadeLength, easeID, priority, startTick); } - - public static final Codec CODEC = RecordCodecBuilder.create(playerAnimationDataInstance -> playerAnimationDataInstance.group( - UUID_CODEC.fieldOf("playerUUID").forGetter(PlayerAnimationData::playerUUID), - RESOURCE_LOCATION_CODEC.fieldOf("animationID").forGetter(PlayerAnimationData::animationID), - PlayerParts.CODEC.fieldOf("parts").forGetter(PlayerAnimationData::parts), - CommonModifier.LIST_CODEC.fieldOf("modifiers").forGetter(PlayerAnimationData::modifiers), - Codec.INT.fieldOf("fadeLength").forGetter(PlayerAnimationData::fadeLength), - Codec.INT.fieldOf("easeID").forGetter(PlayerAnimationData::easeID), - Codec.INT.fieldOf("priority").forGetter(PlayerAnimationData::priority), - Codec.BOOL.fieldOf("firstPersonEnabled").forGetter(PlayerAnimationData::firstPersonEnabled) - ).apply(playerAnimationDataInstance, PlayerAnimationData::new)); } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerPart.java b/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerPart.java index d2a86cc..e79ba99 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerPart.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerPart.java @@ -1,46 +1,24 @@ package com.zigythebird.playeranimatorapi.data; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import java.util.ArrayList; import java.util.List; public class PlayerPart { - public static Codec CODEC = Codec.list(Codec.BOOL).comapFlatMap(PlayerPart::readFromList, PlayerPart::toList).stable(); - - public static List toList(PlayerPart part) { - List list = new ArrayList<>(); - list.add(part.x); - list.add(part.y); - list.add(part.z); - list.add(part.pitch); - list.add(part.yaw); - list.add(part.roll); - list.add(part.bend); - list.add(part.bendDirection); - list.add(part.isVisible); - return list; - } + public static StreamCodec STEAM_CODEC = new StreamCodec<>() { + @Override + public PlayerPart decode(FriendlyByteBuf object) { + return PlayerPart.readFromList(object.readList(FriendlyByteBuf::readBoolean)); + } - public static DataResult readFromList(List list) { - PlayerPart part = new PlayerPart(); - try { - part.setX(list.get(0)); - part.setY(list.get(1)); - part.setZ(list.get(2)); - part.setPitch(list.get(3)); - part.setYaw(list.get(4)); - part.setRoll(list.get(5)); - part.setBend(list.get(6)); - part.setBendDirection(list.get(7)); - part.isVisible(list.get(8)); - return DataResult.success(part); - } catch (IndexOutOfBoundsException e) { - return DataResult.success(part); + @Override + public void encode(FriendlyByteBuf object, PlayerPart object2) { + object.writeCollection(PlayerPart.toList(object2), FriendlyByteBuf::writeBoolean); } - } + }; public boolean x = true; public boolean y = true; @@ -101,4 +79,36 @@ public void setBendDirection(boolean bendDirection) { public void isVisible(boolean isVisible) { this.isVisible = isVisible; } + + public static List toList(PlayerPart part) { + List list = new ArrayList<>(); + list.add(part.x); + list.add(part.y); + list.add(part.z); + list.add(part.pitch); + list.add(part.yaw); + list.add(part.roll); + list.add(part.bend); + list.add(part.bendDirection); + list.add(part.isVisible); + return list; + } + + public static PlayerPart readFromList(List list) { + PlayerPart part = new PlayerPart(); + try { + part.setX(list.get(0)); + part.setY(list.get(1)); + part.setZ(list.get(2)); + part.setPitch(list.get(3)); + part.setYaw(list.get(4)); + part.setRoll(list.get(5)); + part.setBend(list.get(6)); + part.setBendDirection(list.get(7)); + part.isVisible(list.get(8)); + return part; + } catch (IndexOutOfBoundsException e) { + return part; + } + } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerParts.java b/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerParts.java index 884fa16..2837de3 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerParts.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/data/PlayerParts.java @@ -1,7 +1,7 @@ package com.zigythebird.playeranimatorapi.data; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import java.math.BigInteger; import java.util.ArrayList; @@ -9,11 +9,21 @@ public class PlayerParts { - public static Codec CODEC = Codec.list(PlayerPart.CODEC).comapFlatMap(PlayerParts::readFromList, PlayerParts::toList).stable(); + public static StreamCodec STREAM_CODEC = new StreamCodec() { + @Override + public PlayerParts decode(FriendlyByteBuf object) { + return PlayerParts.readFromList(object.readList((arg) -> PlayerPart.STEAM_CODEC.decode(arg))); + } + + @Override + public void encode(FriendlyByteBuf object, PlayerParts object2) { + object.writeCollection(PlayerParts.toList(object2), (arg1, arg2) -> PlayerPart.STEAM_CODEC.encode(arg1, arg2)); + } + }; - public static DataResult readFromList(List list) { + public static PlayerParts readFromList(List list) { if (list.size() != 9) { - return DataResult.success(allEnabled); + return allEnabled; } PlayerParts parts = new PlayerParts(); @@ -26,7 +36,7 @@ public static DataResult readFromList(List list) { parts.leftLeg = list.get(6); parts.rightItem = list.get(7); parts.leftItem = list.get(8); - return DataResult.success(parts); + return parts; } public static List toList(PlayerParts parts) { diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/events/ClientPlayerTickEvent.java b/common/src/main/java/com/zigythebird/playeranimatorapi/events/ClientPlayerTickEvent.java index 687eed4..3c78baa 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/events/ClientPlayerTickEvent.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/events/ClientPlayerTickEvent.java @@ -1,7 +1,6 @@ package com.zigythebird.playeranimatorapi.events; import com.zigythebird.multiloaderutils.utils.Platform; -import com.zigythebird.playeranimatorapi.azure.ModAzureUtilsClient; import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.gecko.ModGeckoUtilsClient; import com.zigythebird.playeranimatorapi.playeranims.ConditionalAnimations; @@ -23,13 +22,10 @@ public static void tick(Player player) { ResourceLocation currentAnim = animationContainer.currentAnim; if (currentAnim != null && !ConditionalAnimations.getAnimationForCurrentConditions(data).equals(currentAnim)) { - PlayerAnimations.playAnimation((AbstractClientPlayer) player, data, true); + PlayerAnimations.playAnimation(player, data, -1); } - if (Platform.isModLoaded("azurelib")) { - ModAzureUtilsClient.tick((AbstractClientPlayer) player, animationContainer); - } - else if (Platform.isModLoaded("geckolib")) { + if (Platform.isModLoaded("geckolib")) { ModGeckoUtilsClient.tick((AbstractClientPlayer) player, animationContainer); } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/events/PlayerStartedTrackingEvent.java b/common/src/main/java/com/zigythebird/playeranimatorapi/events/PlayerStartedTrackingEvent.java new file mode 100644 index 0000000..98c2688 --- /dev/null +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/events/PlayerStartedTrackingEvent.java @@ -0,0 +1,31 @@ +package com.zigythebird.playeranimatorapi.events; + +import com.zigythebird.multiloaderutils.utils.NetworkManager; +import com.zigythebird.playeranimatorapi.API.PlayerAnimAPI; +import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; +import com.zigythebird.playeranimatorapi.misc.PlayerInterface; +import dev.kosmx.playerAnim.core.util.Pair; +import io.netty.buffer.Unpooled; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; + +public class PlayerStartedTrackingEvent { + public static void event(Player player, Entity entity) { + //Prob never called client side, but I am not taking any risks here. + if (!player.level().isClientSide() && entity instanceof Player player2) { + Pair data = ((PlayerInterface)player2).paapi$getLastAnim(); + if (data == null) return; + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + PlayerAnimationData animationData = data.getRight(); + if (animationData.startTick() >= 0) { + int ticksPassed = player2.tickCount - data.getLeft(); + animationData = new PlayerAnimationData(animationData.playerUUID(), animationData.animationID(), animationData.parts(), animationData.modifiers(), + animationData.fadeLength(), animationData.easeID(), animationData.priority(), animationData.startTick() + ticksPassed); + } + PlayerAnimationData.STREAM_CODEC.encode(buf, animationData); + NetworkManager.sendToPlayer((ServerPlayer) player, PlayerAnimAPI.playerAnimPacket, buf); + } + } +} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/example/FirstPersonExample.java b/common/src/main/java/com/zigythebird/playeranimatorapi/example/FirstPersonExample.java new file mode 100644 index 0000000..848fd60 --- /dev/null +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/example/FirstPersonExample.java @@ -0,0 +1,30 @@ +package com.zigythebird.playeranimatorapi.example; + +import com.google.gson.JsonObject; +import com.zigythebird.playeranimatorapi.modifier.CommonModifier; +import net.minecraft.resources.ResourceLocation; + +public class FirstPersonExample { + public static final CommonModifier FIRST_PERSON_MODIFIER; + + static { + JsonObject data = new JsonObject(); + //Look at FirstPersonMode class of the player animator mod for available options. + //Must use the exact same name as enum, all caps. + data.addProperty("firstPersonMode", "THIRD_PERSON_MODEL"); + + //This would show your right arm in first person. + //data.addProperty("showRightArm", true); + + //This would show your left arm in first person. + //data.addProperty("showRightArm", true); + + //This would stop showing the right hand item in first person. + //data.addProperty("showRightItem", false); + + //This would stop showing the left hand item in first person. + //data.addProperty("showLeftItem", false); + + FIRST_PERSON_MODIFIER = new CommonModifier(ResourceLocation.fromNamespaceAndPath("playeranimatorapi", "firstperson"), data); + } +} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/misc/AzurePlayerInterface.java b/common/src/main/java/com/zigythebird/playeranimatorapi/misc/AzurePlayerInterface.java deleted file mode 100644 index 9b99fef..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/misc/AzurePlayerInterface.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.zigythebird.playeranimatorapi.misc; - -import com.zigythebird.playeranimatorapi.azure.AnimatablePlayerLayer; - -public interface AzurePlayerInterface { - AnimatablePlayerLayer playeranimatorapi$getAnimatablePlayerLayer(); -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/misc/GetAzureModelRendererInterface.java b/common/src/main/java/com/zigythebird/playeranimatorapi/misc/GetAzureModelRendererInterface.java deleted file mode 100644 index a5b577d..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/misc/GetAzureModelRendererInterface.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.zigythebird.playeranimatorapi.misc; - -import com.zigythebird.playeranimatorapi.azure.PlayerAnimationRenderer; - -public interface GetAzureModelRendererInterface { - PlayerAnimationRenderer playeranimatorapi$getRenderer(); - void playeranimatorapi$setRenderer(PlayerAnimationRenderer renderer); -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/misc/PlayerInterface.java b/common/src/main/java/com/zigythebird/playeranimatorapi/misc/PlayerInterface.java new file mode 100644 index 0000000..690f7b8 --- /dev/null +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/misc/PlayerInterface.java @@ -0,0 +1,9 @@ +package com.zigythebird.playeranimatorapi.misc; + +import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; +import dev.kosmx.playerAnim.core.util.Pair; + +public interface PlayerInterface { + void setLastAnim(PlayerAnimationData data); + Pair paapi$getLastAnim(); +} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/LivingEntityRendererMixin.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/LivingEntityRendererMixin.java index b1241e8..cb0861a 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/LivingEntityRendererMixin.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/LivingEntityRendererMixin.java @@ -2,14 +2,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.zigythebird.playeranimatorapi.data.PlayerParts; -import com.zigythebird.playeranimatorapi.misc.PlayerModelInterface; import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -33,6 +31,7 @@ private void render(T entity, float entityYaw, float partialTicks, PoseStack mat if (animationContainer != null && animationContainer.isActive()) { PlayerParts parts = animationContainer.data.parts(); + if (parts == null) parts = PlayerParts.allEnabled; if (!parts.body.isVisible) { ci.cancel(); diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/ModelPartMixin.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/ModelPartMixin.java index c0b8524..93a4081 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/ModelPartMixin.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/ModelPartMixin.java @@ -30,7 +30,6 @@ public abstract class ModelPartMixin implements IsVisibleAccessor { private void render(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color, CallbackInfo ci) { if (!this.zigysPlayerAnimatorAPI$isVisible) { ci.cancel(); - return; } } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/PlayerMixin.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/PlayerMixin.java index 4a09c39..8d45a86 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/PlayerMixin.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/PlayerMixin.java @@ -1,17 +1,35 @@ package com.zigythebird.playeranimatorapi.mixin; +import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.events.ClientPlayerTickEvent; +import com.zigythebird.playeranimatorapi.misc.PlayerInterface; import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import dev.kosmx.playerAnim.core.util.Pair; @Mixin(Player.class) -public abstract class PlayerMixin { +public abstract class PlayerMixin implements PlayerInterface { + @Unique + private Pair paapi$lastAnim; @Inject(method = "tick", at = @At("HEAD")) private void inject(CallbackInfo ci) { ClientPlayerTickEvent.tick((Player) (Object) this); } -} + + public void setLastAnim(PlayerAnimationData data) { + if (data == null) { + paapi$lastAnim = null; + return; + } + paapi$lastAnim = new Pair<>(((Player)(Object)this).tickCount, data); + } + + public Pair paapi$getLastAnim() { + return paapi$lastAnim; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AbstractClientAzurePlayerMixin_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AbstractClientAzurePlayerMixin_azureOnly.java deleted file mode 100644 index 85105d3..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AbstractClientAzurePlayerMixin_azureOnly.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - -import com.zigythebird.playeranimatorapi.azure.AnimatablePlayerLayer; -import com.zigythebird.playeranimatorapi.misc.AzurePlayerInterface; -import net.minecraft.client.player.AbstractClientPlayer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; - -@Mixin(AbstractClientPlayer.class) -public class AbstractClientAzurePlayerMixin_azureOnly implements AzurePlayerInterface { - - @Unique - private final AnimatablePlayerLayer playeranimatorapi$animatablePlayerLayer = new AnimatablePlayerLayer((AbstractClientPlayer) (Object)(this)); - - @Override - public AnimatablePlayerLayer playeranimatorapi$getAnimatablePlayerLayer() { - return playeranimatorapi$animatablePlayerLayer; - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimatableManagerAccessor_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimatableManagerAccessor_azureOnly.java deleted file mode 100644 index 8478604..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimatableManagerAccessor_azureOnly.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - -import mod.azure.azurelib.core.animation.AnimatableManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(AnimatableManager.class) -public interface AnimatableManagerAccessor_azureOnly { - @Invoker(remap = false) - void callFinishFirstTick(); -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimationControllerAccessor_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimationControllerAccessor_azureOnly.java deleted file mode 100644 index 831b7db..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimationControllerAccessor_azureOnly.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - -import mod.azure.azurelib.core.animatable.GeoAnimatable; -import mod.azure.azurelib.core.animation.AnimationController; -import mod.azure.azurelib.core.animation.EasingType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.function.Function; - -@Mixin(AnimationController.class) -public interface AnimationControllerAccessor_azureOnly { - - @Accessor(remap = false) - Function getOverrideEasingTypeFunction(); - - @Accessor(remap = false) - void setIsJustStarting(boolean isJustStarting); -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimationProcessorMixin_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimationProcessorMixin_azureOnly.java deleted file mode 100644 index 8d2c602..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/AnimationProcessorMixin_azureOnly.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - -import com.zigythebird.playeranimatorapi.azure.AnimatablePlayerLayer; -import mod.azure.azurelib.core.animatable.GeoAnimatable; -import mod.azure.azurelib.core.animatable.model.CoreGeoBone; -import mod.azure.azurelib.core.animatable.model.CoreGeoModel; -import mod.azure.azurelib.core.animation.*; -import mod.azure.azurelib.core.keyframe.AnimationPoint; -import mod.azure.azurelib.core.keyframe.BoneAnimationQueue; -import mod.azure.azurelib.core.state.BoneSnapshot; -import mod.azure.azurelib.core.utils.Interpolations; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.*; - -@Mixin(AnimationProcessor.class) -public abstract class AnimationProcessorMixin_azureOnly { - - @Shadow(remap = false) protected abstract Map updateBoneSnapshots(Map snapshots); - - @Shadow(remap = false) public boolean reloadAnimations; - - @Shadow(remap = false) protected abstract void resetBoneTransformationMarkers(); - - @Shadow(remap = false) public abstract Collection getRegisteredBones(); - - @Shadow(remap = false) @Final private Map bonesByName; - - @Inject(method = "tickAnimation", at = @At("HEAD"), cancellable = true, remap = false) - private void inject(T animatable, CoreGeoModel model, AnimatableManager animatableManager, double animTime, AnimationState event, boolean crashWhenCantFindBone, CallbackInfo ci) { - if (animatable instanceof AnimatablePlayerLayer) { - List disabledBones = new ArrayList<>(); - Map boneSnapshots = this.updateBoneSnapshots(animatableManager.getBoneSnapshotCollection()); - Iterator var9 = animatableManager.getAnimationControllers().values().iterator(); - - addDisabled(disabledBones, "body", model); - addDisabled(disabledBones, "head", model); - addDisabled(disabledBones, "torso", model); - addDisabled(disabledBones, "right_arm", model); - addDisabled(disabledBones, "left_arm", model); - addDisabled(disabledBones, "right_leg", model); - addDisabled(disabledBones, "left_leg", model); - - Iterator var11; - BoneSnapshot saveSnapshot; - while(var9.hasNext()) { - AnimationController controller = (AnimationController) var9.next(); - if (this.reloadAnimations) { - controller.forceAnimationReset(); - controller.getBoneAnimationQueues().clear(); - } - - ((AnimationControllerAccessor_azureOnly)controller).setIsJustStarting(animatableManager.isFirstTick()); - event.withController(controller); - controller.process(model, event, this.bonesByName, boneSnapshots, animTime, crashWhenCantFindBone); - var11 = controller.getBoneAnimationQueues().values().iterator(); - - while (var11.hasNext()) { - BoneAnimationQueue boneAnimation = (BoneAnimationQueue) var11.next(); - CoreGeoBone bone = boneAnimation.bone(); - if (disabledBones.contains(bone)) { - continue; - } - saveSnapshot = (BoneSnapshot) boneSnapshots.get(bone.getName()); - BoneSnapshot initialSnapshot = bone.getInitialSnapshot(); - AnimationPoint rotXPoint = (AnimationPoint) boneAnimation.rotationXQueue().poll(); - AnimationPoint rotYPoint = (AnimationPoint) boneAnimation.rotationYQueue().poll(); - AnimationPoint rotZPoint = (AnimationPoint) boneAnimation.rotationZQueue().poll(); - AnimationPoint posXPoint = (AnimationPoint) boneAnimation.positionXQueue().poll(); - AnimationPoint posYPoint = (AnimationPoint) boneAnimation.positionYQueue().poll(); - AnimationPoint posZPoint = (AnimationPoint) boneAnimation.positionZQueue().poll(); - AnimationPoint scaleXPoint = (AnimationPoint) boneAnimation.scaleXQueue().poll(); - AnimationPoint scaleYPoint = (AnimationPoint) boneAnimation.scaleYQueue().poll(); - AnimationPoint scaleZPoint = (AnimationPoint) boneAnimation.scaleZQueue().poll(); - EasingType easingType = (EasingType) ((AnimationControllerAccessor_azureOnly)controller).getOverrideEasingTypeFunction().apply(animatable); - if (rotXPoint != null && rotYPoint != null && rotZPoint != null) { - bone.setRotX((float) EasingType.lerpWithOverride(rotXPoint, easingType) + initialSnapshot.getRotX()); - bone.setRotY((float) EasingType.lerpWithOverride(rotYPoint, easingType) + initialSnapshot.getRotY()); - bone.setRotZ((float) EasingType.lerpWithOverride(rotZPoint, easingType) + initialSnapshot.getRotZ()); - saveSnapshot.updateRotation(bone.getRotX(), bone.getRotY(), bone.getRotZ()); - saveSnapshot.startRotAnim(); - bone.markRotationAsChanged(); - } - - if (posXPoint != null && posYPoint != null && posZPoint != null) { - bone.setPosX((float) EasingType.lerpWithOverride(posXPoint, easingType)); - bone.setPosY((float) EasingType.lerpWithOverride(posYPoint, easingType)); - bone.setPosZ((float) EasingType.lerpWithOverride(posZPoint, easingType)); - saveSnapshot.updateOffset(bone.getPosX(), bone.getPosY(), bone.getPosZ()); - saveSnapshot.startPosAnim(); - bone.markPositionAsChanged(); - } - - if (scaleXPoint != null && scaleYPoint != null && scaleZPoint != null) { - bone.setScaleX((float) EasingType.lerpWithOverride(scaleXPoint, easingType)); - bone.setScaleY((float) EasingType.lerpWithOverride(scaleYPoint, easingType)); - bone.setScaleZ((float) EasingType.lerpWithOverride(scaleZPoint, easingType)); - saveSnapshot.updateScale(bone.getScaleX(), bone.getScaleY(), bone.getScaleZ()); - saveSnapshot.startScaleAnim(); - bone.markScaleAsChanged(); - } - } - } - - this.reloadAnimations = false; - double resetTickLength = animatable.getBoneResetTime(); - var11 = this.getRegisteredBones().iterator(); - - while(var11.hasNext()) { - CoreGeoBone bone = (CoreGeoBone)var11.next(); - BoneSnapshot initialSnapshot; - double percentageReset; - if (disabledBones.contains(bone)) { - continue; - } - if (!bone.hasRotationChanged()) { - initialSnapshot = bone.getInitialSnapshot(); - saveSnapshot = (BoneSnapshot)boneSnapshots.get(bone.getName()); - if (saveSnapshot.isRotAnimInProgress()) { - saveSnapshot.stopRotAnim(animTime); - } - - percentageReset = Math.min((animTime - saveSnapshot.getLastResetRotationTick()) / resetTickLength, 1.0); - bone.setRotX((float) Interpolations.lerp((double)saveSnapshot.getRotX(), (double)initialSnapshot.getRotX(), percentageReset)); - bone.setRotY((float) Interpolations.lerp((double)saveSnapshot.getRotY(), (double)initialSnapshot.getRotY(), percentageReset)); - bone.setRotZ((float) Interpolations.lerp((double)saveSnapshot.getRotZ(), (double)initialSnapshot.getRotZ(), percentageReset)); - if (percentageReset >= 1.0) { - saveSnapshot.updateRotation(bone.getRotX(), bone.getRotY(), bone.getRotZ()); - } - } - - if (!bone.hasPositionChanged()) { - initialSnapshot = bone.getInitialSnapshot(); - saveSnapshot = (BoneSnapshot)boneSnapshots.get(bone.getName()); - if (saveSnapshot.isPosAnimInProgress()) { - saveSnapshot.stopPosAnim(animTime); - } - - percentageReset = Math.min((animTime - saveSnapshot.getLastResetPositionTick()) / resetTickLength, 1.0); - bone.setPosX((float)Interpolations.lerp((double)saveSnapshot.getOffsetX(), (double)initialSnapshot.getOffsetX(), percentageReset)); - bone.setPosY((float)Interpolations.lerp((double)saveSnapshot.getOffsetY(), (double)initialSnapshot.getOffsetY(), percentageReset)); - bone.setPosZ((float)Interpolations.lerp((double)saveSnapshot.getOffsetZ(), (double)initialSnapshot.getOffsetZ(), percentageReset)); - if (percentageReset >= 1.0) { - saveSnapshot.updateOffset(bone.getPosX(), bone.getPosY(), bone.getPosZ()); - } - } - - if (!bone.hasScaleChanged()) { - initialSnapshot = bone.getInitialSnapshot(); - saveSnapshot = (BoneSnapshot)boneSnapshots.get(bone.getName()); - if (saveSnapshot.isScaleAnimInProgress()) { - saveSnapshot.stopScaleAnim(animTime); - } - - percentageReset = Math.min((animTime - saveSnapshot.getLastResetScaleTick()) / resetTickLength, 1.0); - bone.setScaleX((float)Interpolations.lerp((double)saveSnapshot.getScaleX(), (double)initialSnapshot.getScaleX(), percentageReset)); - bone.setScaleY((float)Interpolations.lerp((double)saveSnapshot.getScaleY(), (double)initialSnapshot.getScaleY(), percentageReset)); - bone.setScaleZ((float)Interpolations.lerp((double)saveSnapshot.getScaleZ(), (double)initialSnapshot.getScaleZ(), percentageReset)); - if (percentageReset >= 1.0) { - saveSnapshot.updateScale(bone.getScaleX(), bone.getScaleY(), bone.getScaleZ()); - } - } - } - - this.resetBoneTransformationMarkers(); - ((AnimatableManagerAccessor_azureOnly)animatableManager).callFinishFirstTick(); - ci.cancel(); - } - } - - @Unique - private static void addDisabled(List list, String bone, CoreGeoModel model) { - if (model.getBone(bone).isPresent()) { - list.add((CoreGeoBone) model.getBone(bone).get()); - } - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/GeoModelMixin_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/GeoModelMixin_azureOnly.java deleted file mode 100644 index 59e722c..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/GeoModelMixin_azureOnly.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - - -import com.zigythebird.playeranimatorapi.azure.AnimatablePlayerLayer; -import com.zigythebird.playeranimatorapi.azure.PlayerAnimationModel; -import com.zigythebird.playeranimatorapi.mixin.KeyframeAnimationPlayerAccessor; -import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; -import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; -import mod.azure.azurelib.common.api.client.model.GeoModel; -import mod.azure.azurelib.common.internal.common.constant.DataTickets; -import mod.azure.azurelib.core.animatable.GeoAnimatable; -import mod.azure.azurelib.core.animation.AnimatableManager; -import mod.azure.azurelib.core.animation.AnimationProcessor; -import mod.azure.azurelib.core.animation.AnimationState; -import net.minecraft.client.Minecraft; -import net.minecraft.world.entity.LivingEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GeoModel.class) -public abstract class GeoModelMixin_azureOnly { - - @Shadow(remap = false) private long lastRenderedInstance; - - @Shadow(remap = false) private double lastGameTickTime; - - @Shadow(remap = false) private double animTime; - - @Shadow(remap = false) public abstract boolean crashIfBoneMissing(); - - @Shadow(remap = false) public abstract AnimationProcessor getAnimationProcessor(); - - @Inject(method = "handleAnimations", at = @At("HEAD"), cancellable = true, remap = false) - private void inject(T animatable, long instanceId, AnimationState animationState, CallbackInfo ci) { - if ((Object)this instanceof PlayerAnimationModel) { - Minecraft mc = Minecraft.getInstance(); - AnimatableManager animatableManager = animatable.getAnimatableInstanceCache().getManagerForId(instanceId); - Double currentTick = animationState.getData(DataTickets.TICK); - CustomModifierLayer modifierLayer = PlayerAnimations.getModifierLayer(((AnimatablePlayerLayer)(animatable)).getPlayer()); - - if (animatableManager.getFirstTickTime() == -1) - animatableManager.startedAt(currentTick + mc.getTimer().getGameTimeDeltaTicks() - modifierLayer.animPlayer.getTick() - ((KeyframeAnimationPlayerAccessor)modifierLayer.animPlayer).getTickDelta()); - - if (currentTick == null) { - LivingEntity livingEntity = (LivingEntity) animatable; - currentTick = (double) livingEntity.tickCount; - } - - if (animatableManager.getFirstTickTime() == -1) - animatableManager.startedAt(currentTick + mc.getTimer().getGameTimeDeltaTicks()); - - double currentFrameTime = currentTick - animatableManager.getFirstTickTime(); - boolean isReRender = !animatableManager.isFirstTick() && currentFrameTime == animatableManager.getLastUpdateTime(); - - if (isReRender && instanceId == this.lastRenderedInstance) - return; - - if (!isReRender && (!mc.isPaused() || animatable.shouldPlayAnimsWhileGamePaused())) { - animatableManager.updatedAt(currentFrameTime); - - double lastUpdateTime = animatableManager.getLastUpdateTime(); - this.animTime += lastUpdateTime - this.lastGameTickTime; - this.lastGameTickTime = lastUpdateTime; - } - - animationState.animationTick = this.animTime; - AnimationProcessor processor = getAnimationProcessor(); - - processor.preAnimationSetup(animationState.getAnimatable(), this.animTime); - - if (!processor.getRegisteredBones().isEmpty()) - processor.tickAnimation(animatable, (GeoModel)(Object)this, animatableManager, this.animTime, animationState, crashIfBoneMissing()); - - ci.cancel(); - } - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/LivingEntityRendererMixin_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/LivingEntityRendererMixin_azureOnly.java deleted file mode 100644 index a7f3403..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/LivingEntityRendererMixin_azureOnly.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.zigythebird.playeranimatorapi.ModInitClient; -import com.zigythebird.playeranimatorapi.azure.PlayerAnimationModel; -import com.zigythebird.playeranimatorapi.azure.PlayerAnimationRenderer; -import com.zigythebird.playeranimatorapi.data.PlayerParts; -import com.zigythebird.playeranimatorapi.misc.AzurePlayerInterface; -import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; -import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LivingEntityRenderer.class) -public class LivingEntityRendererMixin_azureOnly> { - - @Unique - private PlayerAnimationRenderer zigysPlayerAnimatorAPI$animationRenderer; - - @Shadow - protected M model; - - @Inject(method = "", at = @At("TAIL")) - private void constructor(EntityRendererProvider.Context context, EntityModel model, float shadowRadius, CallbackInfo ci) { - if (model instanceof PlayerModel) { - zigysPlayerAnimatorAPI$animationRenderer = new PlayerAnimationRenderer(); - } - } - - @Inject(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/model/EntityModel;setupAnim(Lnet/minecraft/world/entity/Entity;FFFFF)V"), cancellable = true) - private void render(T entity, float entityYaw, float partialTicks, PoseStack matrixStack, MultiBufferSource buffer, int packedLight, CallbackInfo ci) { - if (entity instanceof Player) { - CustomModifierLayer animationContainer = PlayerAnimations.getModifierLayer((AbstractClientPlayer) entity); - PlayerModel playerModel = ((PlayerModel) (this.model)); - - if (animationContainer != null && animationContainer.isActive()) { - PlayerParts parts = animationContainer.data.parts(); - - if (!parts.body.isVisible) { - ModInitClient.renderingGUI = false; - ci.cancel(); - return; - } - - if ((!entity.equals(Minecraft.getInstance().player) || !Minecraft.getInstance().options.getCameraType().isFirstPerson() || ModInitClient.renderingGUI) && ((PlayerAnimationModel)(zigysPlayerAnimatorAPI$animationRenderer.getGeoModel())).allResourcesExist(((AzurePlayerInterface) entity).playeranimatorapi$getAnimatablePlayerLayer())) { - matrixStack.pushPose(); - matrixStack.scale(-1.0F, -1.0F, 1.0F); - matrixStack.scale(1/0.9375F, 1/0.9375F, 1/0.9375F); - matrixStack.translate(0.0F, -1.501F, 0.0F); - zigysPlayerAnimatorAPI$animationRenderer.setPlayerModel(playerModel); - zigysPlayerAnimatorAPI$animationRenderer.render(matrixStack, ((AzurePlayerInterface) entity).playeranimatorapi$getAnimatablePlayerLayer(), buffer, null, null, packedLight); - matrixStack.popPose(); - } - - playerModel.head.zigysPlayerAnimatorAPI$setIsVisible(parts.head.isVisible); - playerModel.body.zigysPlayerAnimatorAPI$setIsVisible(parts.torso.isVisible); - playerModel.rightArm.zigysPlayerAnimatorAPI$setIsVisible(parts.rightArm.isVisible); - playerModel.leftArm.zigysPlayerAnimatorAPI$setIsVisible(parts.leftArm.isVisible); - playerModel.rightLeg.zigysPlayerAnimatorAPI$setIsVisible(parts.rightLeg.isVisible); - playerModel.leftLeg.zigysPlayerAnimatorAPI$setIsVisible(parts.leftLeg.isVisible); - playerModel.hat.zigysPlayerAnimatorAPI$setIsVisible(parts.head.isVisible); - playerModel.jacket.zigysPlayerAnimatorAPI$setIsVisible(parts.torso.isVisible); - playerModel.rightSleeve.zigysPlayerAnimatorAPI$setIsVisible(parts.rightArm.isVisible); - playerModel.leftSleeve.zigysPlayerAnimatorAPI$setIsVisible(parts.leftArm.isVisible); - playerModel.rightPants.zigysPlayerAnimatorAPI$setIsVisible(parts.rightLeg.isVisible); - playerModel.leftPants.zigysPlayerAnimatorAPI$setIsVisible(parts.leftLeg.isVisible); - } else { - playerModel.head.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.body.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.rightArm.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.leftArm.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.rightLeg.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.leftLeg.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.hat.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.jacket.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.rightSleeve.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.leftSleeve.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.rightPants.zigysPlayerAnimatorAPI$setIsVisible(true); - playerModel.leftPants.zigysPlayerAnimatorAPI$setIsVisible(true); - } - - ModInitClient.renderingGUI = false; - } - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/PlayerAzureModelMixin_azureOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/PlayerAzureModelMixin_azureOnly.java deleted file mode 100644 index 4424832..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/azure/PlayerAzureModelMixin_azureOnly.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zigythebird.playeranimatorapi.mixin.azure; - -import com.zigythebird.playeranimatorapi.azure.PlayerAnimationModel; -import com.zigythebird.playeranimatorapi.azure.PlayerAnimationRenderer; -import com.zigythebird.playeranimatorapi.misc.AzurePlayerInterface; -import com.zigythebird.playeranimatorapi.misc.GetAzureModelRendererInterface; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(PlayerModel.class) -public class PlayerAzureModelMixin_azureOnly implements GetAzureModelRendererInterface { - - @Unique - private PlayerAnimationRenderer zigysPlayerAnimatorAPI$renderer = null; - - @Inject(method = "setupAnim(Lnet/minecraft/world/entity/LivingEntity;FFFFF)V", at = @At("TAIL")) - private void inject(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, CallbackInfo ci) { - PlayerAnimationRenderer renderer = playeranimatorapi$getRenderer(); - if (renderer != null && entity instanceof Player && entity.equals(Minecraft.getInstance().player) && ((PlayerAnimationModel)renderer.getGeoModel()).allResourcesExist(((AzurePlayerInterface) entity).playeranimatorapi$getAnimatablePlayerLayer())) { - renderer.setupAnim(renderer.getGeoModel().getBakedModel(renderer.getGeoModel().getModelResource(((AzurePlayerInterface) entity).playeranimatorapi$getAnimatablePlayerLayer()))); - } - } - - @Override - public PlayerAnimationRenderer playeranimatorapi$getRenderer() { - return zigysPlayerAnimatorAPI$renderer; - } - - @Override - public void playeranimatorapi$setRenderer(PlayerAnimationRenderer renderer) { - zigysPlayerAnimatorAPI$renderer = renderer; - } -} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/AnimationProcessorMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/AnimationProcessorMixin_geckoOnly.java index 3596f2f..aed8203 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/AnimationProcessorMixin_geckoOnly.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/AnimationProcessorMixin_geckoOnly.java @@ -17,7 +17,10 @@ import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; @Mixin(AnimationProcessor.class) public abstract class AnimationProcessorMixin_geckoOnly { diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/LivingEntityRendererMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/LivingEntityRendererMixin_geckoOnly.java index a914f6e..03c8489 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/LivingEntityRendererMixin_geckoOnly.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/mixin/gecko/LivingEntityRendererMixin_geckoOnly.java @@ -2,9 +2,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.zigythebird.playeranimatorapi.ModInitClient; +import com.zigythebird.playeranimatorapi.data.PlayerParts; import com.zigythebird.playeranimatorapi.gecko.PlayerAnimationModel; import com.zigythebird.playeranimatorapi.gecko.PlayerAnimationRenderer; -import com.zigythebird.playeranimatorapi.data.PlayerParts; import com.zigythebird.playeranimatorapi.misc.GeckoPlayerInterface; import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/AbstractCameraModifier.java b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/AbstractCameraModifier.java index 8aaa9a8..b8e5d11 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/AbstractCameraModifier.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/AbstractCameraModifier.java @@ -4,7 +4,6 @@ import dev.kosmx.playerAnim.api.layered.modifier.AbstractModifier; import dev.kosmx.playerAnim.core.util.Vec3f; import net.minecraft.client.Camera; -import net.minecraft.client.renderer.GameRenderer; import org.jetbrains.annotations.NotNull; public abstract class AbstractCameraModifier extends AbstractModifier { diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CommonModifier.java b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CommonModifier.java index 41d4198..6695fa0 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CommonModifier.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CommonModifier.java @@ -3,9 +3,9 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; import dev.kosmx.playerAnim.api.layered.modifier.AbstractModifier; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import java.util.ArrayList; @@ -18,44 +18,34 @@ public class CommonModifier { public final JsonObject data; public static Gson gson = new Gson(); - public static final Codec CODEC = Codec.list(Codec.STRING).comapFlatMap(CommonModifier::decode, CommonModifier::encode); - public static final Codec> LIST_CODEC = Codec.list(CODEC).comapFlatMap(CommonModifier::decodeList, CommonModifier::encodeList); - - public static final CommonModifier nullModifer = new CommonModifier(null, null); - public static final List emptyList = new ArrayList<>(); - - public static List encode(CommonModifier modifier) { - List list = new ArrayList<>(); - if (modifier != null) { - list.add(modifier.ID.toString()); - if (modifier.data != null) { - list.add(modifier.data.toString()); + public static final StreamCodec STREAM_CODEC = new StreamCodec<>() { + @Override + public CommonModifier decode(FriendlyByteBuf object) { + List data = object.readList(FriendlyByteBuf::readUtf); + + if (data.size() == 2) { + return new CommonModifier(ResourceLocation.parse(data.get(0)), gson.fromJson(data.get(1), TypeToken.get(JsonObject.class))); + } else if (data.size() == 1) { + return new CommonModifier(ResourceLocation.parse(data.get(0)), null); } + return nullModifer; } - return list; - } - - public static DataResult decode(List data) { - if (data.size() == 2) { - return DataResult.success(new CommonModifier(ResourceLocation.parse(data.get(0)), gson.fromJson(data.get(1), TypeToken.get(JsonObject.class)))); - } else if (data.size() == 1) { - return DataResult.success(new CommonModifier(ResourceLocation.parse(data.get(0)), null)); - } - return DataResult.success(nullModifer); - } - public static List encodeList(List list) { - if (list != null) { - return list; - } - else { - return emptyList; + @Override + public void encode(FriendlyByteBuf object, CommonModifier modifier) { + List list = new ArrayList<>(); + if (modifier != null) { + list.add(modifier.ID.toString()); + if (modifier.data != null) { + list.add(modifier.data.toString()); + } + } + object.writeCollection(list, FriendlyByteBuf::writeUtf); } - } + }; - public static DataResult> decodeList(List list) { - return DataResult.success(list); - } + public static final CommonModifier nullModifer = new CommonModifier(null, null); + public static final List emptyList = new ArrayList<>(); public CommonModifier(ResourceLocation ID, JsonObject json) { this.ID = ID; diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CustomFirstPersonModifier.java b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CustomFirstPersonModifier.java new file mode 100644 index 0000000..bfe9836 --- /dev/null +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/CustomFirstPersonModifier.java @@ -0,0 +1,30 @@ +package com.zigythebird.playeranimatorapi.modifier; + +import dev.kosmx.playerAnim.api.firstPerson.FirstPersonConfiguration; +import dev.kosmx.playerAnim.api.firstPerson.FirstPersonMode; +import dev.kosmx.playerAnim.api.layered.modifier.FirstPersonModifier; +import org.jetbrains.annotations.NotNull; + +/** + * firstPersonMode defaults to NONE. + * firstPersonConfig defaults to only items. + */ +public class CustomFirstPersonModifier extends FirstPersonModifier { + private final FirstPersonMode firstPersonMode; + private final FirstPersonConfiguration firstPersonConfig; + + public CustomFirstPersonModifier(FirstPersonMode firstPersonMode, FirstPersonConfiguration firstPersonConfig) { + this.firstPersonConfig = firstPersonConfig; + this.firstPersonMode = firstPersonMode; + } + + @Override + public @NotNull FirstPersonConfiguration getFirstPersonConfiguration(float tickDelta) { + return firstPersonConfig; + } + + @Override + public @NotNull FirstPersonMode getFirstPersonMode(float tickDelta) { + return firstPersonMode; + } +} diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/HeadRotBoundCamera.java b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/HeadRotBoundCamera.java index 833ef4e..fc36a70 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/HeadRotBoundCamera.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/modifier/HeadRotBoundCamera.java @@ -5,7 +5,6 @@ import dev.kosmx.playerAnim.core.util.Vec3f; import net.minecraft.ChatFormatting; import net.minecraft.client.Camera; -import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.util.Mth; diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/ConditionalAnimations.java b/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/ConditionalAnimations.java index 5872fe2..ec6e303 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/ConditionalAnimations.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/ConditionalAnimations.java @@ -29,28 +29,6 @@ public static ResourceLocation getAnimationForCurrentConditions(PlayerAnimationD return perModConditions.get(data.animationID().getNamespace()).apply(data); } - AbstractClientPlayer player = (AbstractClientPlayer) Minecraft.getInstance().level.getPlayerByUUID(data.playerUUID()); - CustomModifierLayer animationContainer = (CustomModifierLayer) PlayerAnimationAccess.getPlayerAssociatedData(player).get(PlayerAnimations.animationLayerId); - - ResourceLocation currentAnim = animationContainer.currentAnim; - ResourceLocation baseAnim = data.animationID(); - ResourceLocation runningAnim = data.animationID().withPath(data.animationID().getPath() + "_run"); - ResourceLocation crouchedAnim = data.animationID().withPath(data.animationID().getPath() + "_crouch"); - ResourceLocation crawlingAnim = data.animationID().withPath(data.animationID().getPath() + "_crawl"); - ResourceLocation swimmingAnim = data.animationID().withPath(data.animationID().getPath() + "_swim"); - - Map animations = PlayerAnimationRegistry.getAnimations(); - - if (player.isCrouching() && currentAnim != crawlingAnim && animations.containsKey(crouchedAnim)) { - return crouchedAnim; - } else if (player.isVisuallyCrawling() && currentAnim != crawlingAnim && animations.containsKey(crawlingAnim)) { - return crawlingAnim; - } else if (player.isVisuallySwimming() && currentAnim != swimmingAnim && animations.containsKey(swimmingAnim)) { - return swimmingAnim; - } else if (player.isSprinting() && currentAnim != runningAnim && animations.containsKey(runningAnim)) { - return runningAnim; - } - - return baseAnim; + return data.animationID(); } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/PlayerAnimations.java b/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/PlayerAnimations.java index 76c25d5..9738020 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/PlayerAnimations.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/playeranims/PlayerAnimations.java @@ -1,13 +1,8 @@ package com.zigythebird.playeranimatorapi.playeranims; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.mojang.serialization.JsonOps; import com.zigythebird.multiloaderutils.utils.NetworkManager; import com.zigythebird.multiloaderutils.utils.Platform; import com.zigythebird.playeranimatorapi.ModInit; -import com.zigythebird.playeranimatorapi.azure.ModAzureUtilsClient; import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.data.PlayerParts; import com.zigythebird.playeranimatorapi.gecko.ModGeckoUtilsClient; @@ -15,12 +10,10 @@ import com.zigythebird.playeranimatorapi.modifier.CommonModifier; import com.zigythebird.playeranimatorapi.registry.AnimModifierRegistry; import dev.kosmx.playerAnim.api.IPlayable; -import dev.kosmx.playerAnim.api.firstPerson.FirstPersonMode; import dev.kosmx.playerAnim.api.layered.AnimationStack; import dev.kosmx.playerAnim.api.layered.IAnimation; import dev.kosmx.playerAnim.api.layered.KeyframeAnimationPlayer; import dev.kosmx.playerAnim.api.layered.modifier.AbstractFadeModifier; -import dev.kosmx.playerAnim.api.layered.modifier.AbstractModifier; import dev.kosmx.playerAnim.core.data.KeyframeAnimation; import dev.kosmx.playerAnim.core.util.Ease; import dev.kosmx.playerAnim.core.util.Pair; @@ -45,8 +38,6 @@ public class PlayerAnimations { private static final Logger logger = LogManager.getLogger(ModInit.class); - public static Gson gson = new GsonBuilder().setLenient().serializeNulls().create(); - public static Map animLengthsMap; public static Map geckoMap; @@ -62,7 +53,7 @@ public static void init() { ); NetworkManager.registerReceiver(NetworkManager.Side.S2C, playerAnimPacket, (buf, context) -> { - PlayerAnimations.receivePacket(buf.readUtf()); + PlayerAnimations.playAnimation(PlayerAnimationData.STREAM_CODEC.decode(buf)); }); NetworkManager.registerReceiver(NetworkManager.Side.S2C, playerAnimStopPacket, (buf, context) -> { PlayerAnimations.stopAnimation(buf.readUUID(), buf.readResourceLocation()); @@ -78,37 +69,33 @@ public static void stopAnimation(AbstractClientPlayer player, ResourceLocation a if (animationContainer != null && animationContainer.isActive() && animationContainer.data.animationID().equals(animationID)) { animationContainer.animPlayer.stop(); - if (Platform.isModLoaded("azurelib")) { - ModAzureUtilsClient.stopGeckoAnimation(player); - } - else if (Platform.isModLoaded("geckolib")) { + if (Platform.isModLoaded("geckolib")) { ModGeckoUtilsClient.stopGeckoAnimation(player); } } } - public static void receivePacket(String jsonData) { - PlayerAnimationData data = PlayerAnimationData.CODEC.parse(JsonOps.INSTANCE, gson.fromJson(jsonData, JsonElement.class)).getOrThrow(); - AbstractClientPlayer player = (AbstractClientPlayer) Minecraft.getInstance().level.getPlayerByUUID(data.playerUUID()); - playAnimation(player, data); + public static void playAnimation(PlayerAnimationData data) { + playAnimation((AbstractClientPlayer) Minecraft.getInstance().level.getPlayerByUUID(data.playerUUID()), + data, data.parts(), data.modifiers(), data.fadeLength(), data.easeID(), data.startTick()); } - public static void playAnimation(AbstractClientPlayer player, PlayerAnimationData data) { - playAnimation(player, data, true); + public static void playAnimation(Player player, PlayerAnimationData data) { + playAnimation(player, data, data.startTick()); } - public static void playAnimation(AbstractClientPlayer player, PlayerAnimationData data, boolean replaceTick) { - playAnimation(player, data, data.parts(), data.modifiers(), data.fadeLength(), data.easeID(), data.firstPersonEnabled(), replaceTick); + public static void playAnimation(Player player, PlayerAnimationData data, int startTick) { + playAnimation((AbstractClientPlayer) player, data, data.parts(), data.modifiers(), data.fadeLength(), data.easeID(), startTick); } public static void playAnimation(AbstractClientPlayer player, PlayerAnimationData data, PlayerParts parts, List modifiers, - int fadeLength, int easeID, boolean firstPersonEnabled, boolean replaceTick) { + int fadeLength, int easeID, int startTick) { try { CustomModifierLayer animationContainer = getModifierLayer(player); ResourceLocation baseAnimationID = data.animationID(); - if (baseAnimationID.toString().equals("null:null")) { + if (baseAnimationID == null || baseAnimationID.toString().equals("null:null")) { return; } @@ -131,19 +118,17 @@ public static void playAnimation(AbstractClientPlayer player, PlayerAnimationDat animationContainer.setCurrentAnimationLocation(animationID); - if (replaceTick) { - animationContainer.removeAllModifiers(); - if (modifiers != null) { - for (CommonModifier commonModifier : modifiers) { - if (commonModifier.modifier != null) { - animationContainer.addModifier(commonModifier.modifier); - } - else if (AnimModifierRegistry.getModifiers().containsKey(commonModifier.ID)) { - try { - animationContainer.addModifier(AnimModifierRegistry.getModifiers().get(commonModifier.ID).apply(animationContainer, commonModifier.data)); - } catch (NullPointerException | UnsupportedOperationException e) { - ModInit.LOGGER.error("Failed to apply modifier: " + commonModifier.ID + " :" + e); - } + animationContainer.removeAllModifiers(); + if (modifiers != null) { + for (CommonModifier commonModifier : modifiers) { + if (commonModifier.modifier != null) { + animationContainer.addModifier(commonModifier.modifier); + } + else if (AnimModifierRegistry.getModifiers().containsKey(commonModifier.ID)) { + try { + animationContainer.addModifier(AnimModifierRegistry.getModifiers().get(commonModifier.ID).apply(animationContainer, commonModifier.data)); + } catch (NullPointerException | UnsupportedOperationException e) { + ModInit.LOGGER.error("Failed to apply modifier: " + commonModifier.ID + " :" + e); } } } @@ -236,31 +221,19 @@ else if (AnimModifierRegistry.getModifiers().containsKey(commonModifier.ID)) { anim = builder.build(); } - FirstPersonMode firstPersonMode = FirstPersonMode.DISABLED; - if (firstPersonEnabled) { - firstPersonMode = FirstPersonMode.THIRD_PERSON_MODEL; + if (startTick < 0 && animationContainer.isActive()) startTick = animationContainer.animPlayer.getCurrentTick(); + KeyframeAnimationPlayer animPlayer = new KeyframeAnimationPlayer(anim, startTick); + if (fadeLength < 0) { + fadeLength = Math.min(animPlayer.getStopTick()/4, 20); } - - if (!replaceTick) { - KeyframeAnimationPlayer animPlayer = new KeyframeAnimationPlayer(anim, animationContainer.animPlayer.getCurrentTick()).setFirstPersonMode(firstPersonMode); + if (fadeLength > 0 && 0 <= easeID) { + animationContainer.replaceAnimationWithFade(AbstractFadeModifier.standardFadeIn(fadeLength, getEase(easeID)), animPlayer); + } + else { animationContainer.replaceAnimation(animPlayer); - } else { - KeyframeAnimationPlayer animPlayer = new KeyframeAnimationPlayer(anim).setFirstPersonMode(firstPersonMode); - if (fadeLength < 0) { - fadeLength = Math.min(animPlayer.getStopTick()/4, 20); - } - if (fadeLength > 0 && 0 <= easeID) { - animationContainer.replaceAnimationWithFade(AbstractFadeModifier.standardFadeIn(fadeLength, getEase(easeID)), animPlayer); - } - else { - animationContainer.replaceAnimation(animPlayer); - } } - if (Platform.isModLoaded("azurelib")) { - ModAzureUtilsClient.playGeckoAnimation(player, data, animationContainer.getSpeed()); - } - else if (Platform.isModLoaded("geckolib")) { + if (Platform.isModLoaded("geckolib")) { ModGeckoUtilsClient.playGeckoAnimation(player, data, animationContainer.getSpeed()); } } catch (NullPointerException e) { diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AnimModifierRegistry.java b/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AnimModifierRegistry.java index ddf9767..1e95af5 100644 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AnimModifierRegistry.java +++ b/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AnimModifierRegistry.java @@ -1,12 +1,12 @@ package com.zigythebird.playeranimatorapi.registry; import com.google.gson.JsonObject; -import com.zigythebird.playeranimatorapi.modifier.HeadPosBoundCamera; -import com.zigythebird.playeranimatorapi.modifier.HeadRotBoundCamera; -import com.zigythebird.playeranimatorapi.modifier.LengthModifier; -import com.zigythebird.playeranimatorapi.modifier.MirrorOnAltHandModifier; +import com.zigythebird.playeranimatorapi.modifier.*; import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; +import dev.kosmx.playerAnim.api.firstPerson.FirstPersonConfiguration; +import dev.kosmx.playerAnim.api.firstPerson.FirstPersonMode; import dev.kosmx.playerAnim.api.layered.modifier.AbstractModifier; +import dev.kosmx.playerAnim.api.layered.modifier.FirstPersonModifier; import dev.kosmx.playerAnim.api.layered.modifier.MirrorModifier; import dev.kosmx.playerAnim.api.layered.modifier.SpeedModifier; import net.fabricmc.api.EnvType; @@ -37,5 +37,24 @@ public static void register() { registerModifier(ResourceLocation.fromNamespaceAndPath("playeranimatorapi", "mirroronalthand"), (layer, json) -> new MirrorOnAltHandModifier(layer)); registerModifier(ResourceLocation.fromNamespaceAndPath("playeranimatorapi", "headposboundcamera"), (layer, json) -> new HeadPosBoundCamera(layer)); registerModifier(ResourceLocation.fromNamespaceAndPath("playeranimatorapi", "headrotboundcamera"), (layer, json) -> new HeadRotBoundCamera(layer)); + registerModifier(ResourceLocation.fromNamespaceAndPath("playeranimatorapi", "firstperson"), (layer, json) -> { + FirstPersonMode firstPersonMode = FirstPersonMode.NONE; + try { + firstPersonMode = FirstPersonMode.valueOf(json.get("firstPersonMode").getAsString()); + } + catch (IllegalArgumentException ignore) {} + + boolean showRightArm = false; + boolean showLeftArm = false; + boolean showRightItem = true; + boolean showLeftItem = true; + + if (json.has("showRightArm")) showRightArm = json.get("showRightArm").getAsBoolean(); + if (json.has("showLeftArm")) showRightArm = json.get("showLeftArm").getAsBoolean(); + if (json.has("showRightItem")) showRightArm = json.get("showRightItem").getAsBoolean(); + if (json.has("showLeftItem")) showRightArm = json.get("showLeftItem").getAsBoolean(); + + return new CustomFirstPersonModifier(firstPersonMode, new FirstPersonConfiguration(showRightArm, showLeftArm, showRightItem, showLeftItem)); + }); } } diff --git a/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AzureControllerRegistry.java b/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AzureControllerRegistry.java deleted file mode 100644 index ef8e75b..0000000 --- a/common/src/main/java/com/zigythebird/playeranimatorapi/registry/AzureControllerRegistry.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.zigythebird.playeranimatorapi.registry; - -import com.zigythebird.playeranimatorapi.ModInit; -import com.zigythebird.playeranimatorapi.azure.AnimatablePlayerLayer; -import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; -import mod.azure.azurelib.core.animation.AnimationController; -import mod.azure.azurelib.core.animation.AnimationState; -import mod.azure.azurelib.core.object.PlayState; -import net.minecraft.core.NonNullList; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiFunction; - -public class AzureControllerRegistry { - private static final Map, CustomModifierLayer, PlayState>>> CONTROLLERS = new HashMap<>(); - - public static AnimationController.AnimationStateHandler getControllerForMod(int i, CustomModifierLayer layer) { - try { - if (layer.isActive()) { - String modID = layer.data.animationID().getNamespace(); - return (state) -> { - try { - return CONTROLLERS.get(modID).get(i).apply(state, layer); - } - catch (Exception e) { - return PlayState.CONTINUE; - } - }; - } - else { - return (state) -> PlayState.CONTINUE; - } - } - catch (Exception e) { - return (state) -> PlayState.CONTINUE; - } - } - - public static void addController(String modID, BiFunction, CustomModifierLayer, PlayState> controller) { - if (!CONTROLLERS.containsKey(modID)) { - CONTROLLERS.put(modID, NonNullList.createWithCapacity(5)); - } - if (CONTROLLERS.get(modID).size() >= 5) { - ModInit.LOGGER.error("Cannot register new gecko controller for mod " + modID + " due to a controller count limit of 5."); - return; - } - CONTROLLERS.get(modID).add(controller); - } -} diff --git a/common/src/main/resources/assets/playeranimatorapi/lang/en_us.json b/common/src/main/resources/assets/playeranimatorapi/lang/en_us.json index eb4cd6f..9523134 100644 --- a/common/src/main/resources/assets/playeranimatorapi/lang/en_us.json +++ b/common/src/main/resources/assets/playeranimatorapi/lang/en_us.json @@ -1,3 +1,3 @@ { - "warn.playeranimatorapi.cannotEmote": "Cannot emote while another animation is playing." + "warn.playeranimatorapi.cannotEmote": "Cannot emote while a high priority animation is playing." } \ No newline at end of file diff --git a/common/src/main/resources/playeranimatorapi-common.mixins.json b/common/src/main/resources/playeranimatorapi-common.mixins.json index f300ec4..30ec775 100644 --- a/common/src/main/resources/playeranimatorapi-common.mixins.json +++ b/common/src/main/resources/playeranimatorapi-common.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.zigythebird.playeranimatorapi.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "plugin": "com.zigythebird.playeranimatorapi.ModMixinPlugin", "client": [ @@ -9,9 +9,6 @@ "InventoryScreenMixin", "LivingEntityRendererMixin", "ModelPartMixin", - "azure.AbstractClientAzurePlayerMixin_azureOnly", - "azure.LivingEntityRendererMixin_azureOnly", - "azure.PlayerAzureModelMixin_azureOnly", "gecko.AbstractClientAzurePlayerMixin_geckoOnly", "gecko.LivingEntityRendererMixin_geckoOnly", "gecko.PlayerAzureModelMixin_geckoOnly" @@ -20,10 +17,6 @@ "AnimationStackAccessor", "KeyframeAnimationPlayerAccessor", "PlayerMixin", - "azure.AnimatableManagerAccessor_azureOnly", - "azure.AnimationControllerAccessor_azureOnly", - "azure.AnimationProcessorMixin_azureOnly", - "azure.GeoModelMixin_azureOnly", "gecko.AnimatableManagerAccessor_geckoOnly", "gecko.AnimationControllerAccessor_geckoOnly", "gecko.AnimationProcessorMixin_geckoOnly", diff --git a/fabric/build.gradle b/fabric/build.gradle index b2e0bcb..927b99c 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -31,20 +31,18 @@ dependencies { modImplementation "com.zigythebird.multiloaderutils:zigysmultiloaderutils-fabric-$rootProject.minecraft_version:$rootProject.multiloader_utils_version" include "com.zigythebird.multiloaderutils:zigysmultiloaderutils-fabric-$rootProject.minecraft_version:$rootProject.multiloader_utils_version" - modApi("com.github.Virtuoel:Pehkui:${pehkui_version}", { + modCompileOnly("com.github.Virtuoel:Pehkui:${pehkui_version}", { exclude group: "net.fabricmc.fabric-api" }) common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } - modImplementation("software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}") - modImplementation "mod.azure.azurelib:azurelib-fabric-$rootProject.minecraft_version:$rootProject.azurelib_version" - modImplementation "dev.kosmx.player-anim:player-animation-lib-fabric:${rootProject.player_anim_version}" -// modImplementation "maven.modrinth:emotecraft:CUDCdgav" - modImplementation "maven.modrinth:replaymod:yn3njhcI" + modCompileOnly "maven.modrinth:emotecraft:TxPTEp93" + modCompileOnly "maven.modrinth:replaymod:yn3njhcI" + modCompileOnly "maven.modrinth:flashback:phWB81q5" } processResources { diff --git a/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/FlashbackCompatImpl.java b/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/FlashbackCompatImpl.java new file mode 100644 index 0000000..dc7b1ad --- /dev/null +++ b/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/FlashbackCompatImpl.java @@ -0,0 +1,37 @@ +package com.zigythebird.playeranimatorapi.compatibility.fabric; + +import com.moulberry.flashback.Flashback; +import com.zigythebird.multiloaderutils.network.MultiloaderPacket; +import com.zigythebird.playeranimatorapi.ModInit; +import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; +import com.zigythebird.playeranimatorapi.data.PlayerParts; +import com.zigythebird.playeranimatorapi.modifier.CommonModifier; +import io.netty.buffer.Unpooled; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +public class FlashbackCompatImpl { + public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, int fadeLength, int easeID, int priority, int startTick) { + if (Flashback.RECORDER.readyToWrite()) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + PlayerAnimationData data = new PlayerAnimationData(player.getUUID(), animationID, + parts, modifiers, fadeLength, easeID, priority, startTick); + PlayerAnimationData.STREAM_CODEC.encode(buf, data); + Flashback.RECORDER.writePacketAsync(ServerPlayNetworking.createS2CPacket(new MultiloaderPacket(buf, ModInit.altPlayPlayerAnimationPacket)), ConnectionProtocol.PLAY); + } + } + + public static void stopPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID) { + if (Flashback.RECORDER.readyToWrite()) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeUUID(player.getUUID()); + buf.writeResourceLocation(animationID); + Flashback.RECORDER.writePacketAsync(ServerPlayNetworking.createS2CPacket(new MultiloaderPacket(buf, ModInit.altStopPlayerAnimationPacket)), ConnectionProtocol.PLAY); + } + } +} diff --git a/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/ReplayModCompatImpl.java b/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/ReplayModCompatImpl.java index 320cc9d..6409588 100644 --- a/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/ReplayModCompatImpl.java +++ b/fabric/src/main/java/com/zigythebird/playeranimatorapi/compatibility/fabric/ReplayModCompatImpl.java @@ -1,13 +1,10 @@ package com.zigythebird.playeranimatorapi.compatibility.fabric; -import com.mojang.serialization.JsonOps; import com.replaymod.recording.ReplayModRecording; import com.zigythebird.multiloaderutils.network.MultiloaderPacket; -import com.zigythebird.playeranimatorapi.API.PlayerAnimAPI; import com.zigythebird.playeranimatorapi.ModInit; import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; import com.zigythebird.playeranimatorapi.data.PlayerParts; -import com.zigythebird.playeranimatorapi.fabric.PlayerAnimatorAPIClientFabric; import com.zigythebird.playeranimatorapi.modifier.CommonModifier; import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -18,14 +15,13 @@ import java.util.List; public class ReplayModCompatImpl { - public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, int fadeLength, int easeID, int priority, boolean firstPersonEnabled, boolean replaceTick) { + public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, int fadeLength, int easeID, int priority, int startTick) { if (ReplayModRecording.instance.getConnectionEventHandler().getPacketListener() != null) { FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); PlayerAnimationData data = new PlayerAnimationData(player.getUUID(), animationID, - parts, modifiers, fadeLength, easeID, priority, firstPersonEnabled); - buf.writeUtf(PlayerAnimAPI.gson.toJson(PlayerAnimationData.CODEC.encodeStart(JsonOps.INSTANCE, data).getOrThrow())); - buf.writeBoolean(replaceTick); - ReplayModRecording.instance.getConnectionEventHandler().getPacketListener().save(ServerPlayNetworking.createS2CPacket(new MultiloaderPacket(buf, PlayerAnimatorAPIClientFabric.altPlayPlayerAnimationPacket))); + parts, modifiers, fadeLength, easeID, priority, startTick); + PlayerAnimationData.STREAM_CODEC.encode(buf, data); + ReplayModRecording.instance.getConnectionEventHandler().getPacketListener().save(ServerPlayNetworking.createS2CPacket(new MultiloaderPacket(buf, ModInit.altPlayPlayerAnimationPacket))); } } @@ -34,7 +30,7 @@ public static void stopPlayerAnim(AbstractClientPlayer player, ResourceLocation FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); buf.writeUUID(player.getUUID()); buf.writeResourceLocation(animationID); - ReplayModRecording.instance.getConnectionEventHandler().getPacketListener().save(ServerPlayNetworking.createS2CPacket(new MultiloaderPacket(buf, PlayerAnimatorAPIClientFabric.altStopPlayerAnimationPacket))); + ReplayModRecording.instance.getConnectionEventHandler().getPacketListener().save(ServerPlayNetworking.createS2CPacket(new MultiloaderPacket(buf, ModInit.altStopPlayerAnimationPacket))); } } } diff --git a/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIClientFabric.java b/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIClientFabric.java index f13f7dc..efcd407 100644 --- a/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIClientFabric.java +++ b/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIClientFabric.java @@ -1,54 +1,12 @@ package com.zigythebird.playeranimatorapi.fabric; -import com.google.gson.JsonElement; -import com.mojang.serialization.JsonOps; -import com.zigythebird.multiloaderutils.utils.NetworkManager; -import com.zigythebird.playeranimatorapi.ModInit; import com.zigythebird.playeranimatorapi.ModInitClient; -import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; -import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; import net.fabricmc.api.ClientModInitializer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.resources.ResourceLocation; - -import java.util.UUID; - -import static com.zigythebird.playeranimatorapi.API.PlayerAnimAPI.gson; public class PlayerAnimatorAPIClientFabric implements ClientModInitializer { - public static final ResourceLocation altPlayPlayerAnimationPacket = ResourceLocation.fromNamespaceAndPath(ModInit.MOD_ID, "alt_play_player_animation_packet"); - public static final ResourceLocation altStopPlayerAnimationPacket = ResourceLocation.fromNamespaceAndPath(ModInit.MOD_ID, "alt_stop_player_animation_packet"); - @Override public void onInitializeClient() { ModInitClient.init(); - - NetworkManager.registerReceiver(NetworkManager.Side.S2C, altPlayPlayerAnimationPacket, (buf, context) -> { - String jsonData = buf.readUtf(); - boolean replaceTick = buf.readBoolean(); - try { - PlayerAnimationData data = PlayerAnimationData.CODEC.parse(JsonOps.INSTANCE, gson.fromJson(jsonData, JsonElement.class)).getOrThrow(); - AbstractClientPlayer player2 = (AbstractClientPlayer) Minecraft.getInstance().level.getPlayerByUUID(data.playerUUID()); - PlayerAnimations.playAnimation(player2, data, replaceTick); - } - catch (NullPointerException | IllegalStateException e) { - ModInit.LOGGER.error(e.getMessage()); - } - }); - - NetworkManager.registerReceiver(NetworkManager.Side.S2C, altStopPlayerAnimationPacket, (buf, context) -> { - - UUID uuid = buf.readUUID(); - ResourceLocation resourceLocation = buf.readResourceLocation(); - - try { - PlayerAnimations.stopAnimation((AbstractClientPlayer) Minecraft.getInstance().level.getPlayerByUUID(uuid), resourceLocation); - } - catch (NullPointerException e) { - ModInit.LOGGER.error(e.getMessage()); - } - }); } } diff --git a/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIModFabric.java b/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIModFabric.java index 90a8a1b..21f7f73 100644 --- a/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIModFabric.java +++ b/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/PlayerAnimatorAPIModFabric.java @@ -3,8 +3,10 @@ import com.zigythebird.playeranimatorapi.ModInit; import com.zigythebird.playeranimatorapi.commands.PlayPlayerAnimationCommand; import com.zigythebird.playeranimatorapi.commands.StopPlayerAnimationCommand; +import com.zigythebird.playeranimatorapi.events.PlayerStartedTrackingEvent; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.networking.v1.EntityTrackingEvents; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.server.packs.PackType; @@ -18,6 +20,8 @@ public void onInitialize() { StopPlayerAnimationCommand.register(dispatcher); }); + EntityTrackingEvents.START_TRACKING.register(((trackedEntity, player) -> PlayerStartedTrackingEvent.event(player, trackedEntity))); + ModInit.init(); } } diff --git a/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/mixin/EmoteCraftClientInitMixinFabric.java b/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/mixin/EmoteCraftClientInitMixinFabric.java index 962eb7c..4d9bd69 100644 --- a/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/mixin/EmoteCraftClientInitMixinFabric.java +++ b/fabric/src/main/java/com/zigythebird/playeranimatorapi/fabric/mixin/EmoteCraftClientInitMixinFabric.java @@ -1,24 +1,23 @@ -//package com.zigythebird.playeranimatorapi.fabric.mixin; -// -//import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; -//import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; -//import io.github.kosmx.emotes.fabric.ClientInit; -//import net.minecraft.client.Minecraft; -//import net.minecraft.client.gui.screens.Screen; -//import net.minecraft.network.chat.Component; -//import org.jetbrains.annotations.Nullable; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Redirect; -// -//@Mixin(ClientInit.class) -//public abstract class EmoteCraftClientInitMixinFabric { -// -// @Redirect(method = "lambda$initKeyBinding$1", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V")) -// private static void initKeybinding(Minecraft instance, @Nullable Screen guiScreen) { -// CustomModifierLayer layer = PlayerAnimations.getModifierLayer(instance.player); -// if (instance.player != null && layer.isActive() && (layer.data.priority() >= 1000 || layer.data.priority() == -1)) { -// instance.player.displayClientMessage(Component.translatable("warn.playeranimatorapi.cannotEmote"), true); -// } -// } -//} +package com.zigythebird.playeranimatorapi.fabric.mixin; + +import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; +import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; +import io.github.kosmx.emotes.fabric.ClientInit; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ClientInit.class) +public abstract class EmoteCraftClientInitMixinFabric { + @Redirect(method = "lambda$initKeyBinding$1", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V")) + private static void initKeybinding(Minecraft instance, @Nullable Screen guiScreen) { + CustomModifierLayer layer = PlayerAnimations.getModifierLayer(instance.player); + if (instance.player != null && layer.isActive() && layer.data.priority() > 1000) { + instance.player.displayClientMessage(Component.translatable("warn.playeranimatorapi.cannotEmote"), true); + } + } +} diff --git a/fabric/src/main/resources/playeranimatorapi.mixins.json b/fabric/src/main/resources/playeranimatorapi.mixins.json index 5a711a7..d8853f5 100644 --- a/fabric/src/main/resources/playeranimatorapi.mixins.json +++ b/fabric/src/main/resources/playeranimatorapi.mixins.json @@ -1,10 +1,12 @@ { "required": true, "package": "com.zigythebird.playeranimatorapi.fabric.mixin", - "compatibilityLevel": "JAVA_17", - "minVersion": "0.8", "plugin": "com.zigythebird.playeranimatorapi.fabric.ModMixinPluginFabric", - "client": [], + "compatibilityLevel": "JAVA_21", + "minVersion": "0.8", + "client": [ + "EmoteCraftClientInitMixinFabric" + ], "mixins": [], "injectors": { "defaultRequire": 1 diff --git a/gradle.properties b/gradle.properties index 4ed3994..f4e238f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,18 +4,14 @@ java_version=21 enabled_platforms=fabric,forge archives_base_name=playeranimatorapi mod_id=playeranimatorapi -mod_version=2.2.1 +mod_version=2.3.0 maven_group=zigy.playeranimatorapi fabric_loader_version=0.15.11 fabric_api_version=0.100.6+1.21 neoforge_version=21.0.114-beta parchment_version=2024.07.07 -#modmenu_version=7.2.1 -#jei_version=15.2.0.23 -#rei_version=12.0.634 -player_anim_version=2.0.0-alpha1+1.21 +player_anim_version=2.0.1+1.21.1 azurelib_version=2.3.14 geckolib_version=4.5.8 -#better_combat_version=1.7.2+1.20.1 multiloader_utils_version=1.3.0 pehkui_version=3.8.3 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2617362..21d5e09 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 6c3023e..4b89c40 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -18,20 +18,20 @@ configurations { dependencies { neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" - modImplementation "com.zigythebird.multiloaderutils:zigysmultiloaderutils-neoforge-$rootProject.minecraft_version:$rootProject.multiloader_utils_version" + implementation "com.zigythebird.multiloaderutils:zigysmultiloaderutils-neoforge-$rootProject.minecraft_version:$rootProject.multiloader_utils_version" include "com.zigythebird.multiloaderutils:zigysmultiloaderutils-neoforge-$rootProject.minecraft_version:$rootProject.multiloader_utils_version" - modApi("com.github.Virtuoel:Pehkui:$rootProject.pehkui_version-$rootProject.minecraft_version-neoforge") + compileOnly("com.github.Virtuoel:Pehkui:$rootProject.pehkui_version-$rootProject.minecraft_version-neoforge") common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive false } - modImplementation("software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}") - modImplementation "mod.azure.azurelib:azurelib-neo-$rootProject.minecraft_version:$rootProject.azurelib_version" + compileOnly "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" - modImplementation "dev.kosmx.player-anim:player-animation-lib-forge:${rootProject.player_anim_version}" + implementation "dev.kosmx.player-anim:player-animation-lib-forge:${rootProject.player_anim_version}" -// modImplementation "curse.maven:emotecraft-forge-403422:4632460" + compileOnly "maven.modrinth:emotecraft:ph764ff5" + compileOnly "curse.maven:reforgedplay-mod-1018692:5629250" } processResources { diff --git a/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModEvents.java b/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModEvents.java index de02243..cea34cf 100644 --- a/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModEvents.java +++ b/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModEvents.java @@ -3,9 +3,11 @@ import com.zigythebird.playeranimatorapi.ModInit; import com.zigythebird.playeranimatorapi.commands.PlayPlayerAnimationCommand; import com.zigythebird.playeranimatorapi.commands.StopPlayerAnimationCommand; +import com.zigythebird.playeranimatorapi.events.PlayerStartedTrackingEvent; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; public class ModEvents { @@ -17,5 +19,10 @@ public static void registerCommands(RegisterCommandsEvent event) { PlayPlayerAnimationCommand.register(event.getDispatcher()); StopPlayerAnimationCommand.register(event.getDispatcher()); } + + @SubscribeEvent + public static void startTracking(PlayerEvent.StartTracking event) { + PlayerStartedTrackingEvent.event(event.getEntity(), event.getTarget()); + } } } diff --git a/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModMixinPluginForge.java b/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModMixinPluginForge.java index 872d462..5370bfc 100644 --- a/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModMixinPluginForge.java +++ b/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/ModMixinPluginForge.java @@ -1,54 +1,54 @@ -//package com.zigythebird.playeranimatorapi.neoforge; -// -//import com.google.common.collect.ImmutableMap; -//import com.zigythebird.multiloaderutils.utils.Platform; -//import org.objectweb.asm.tree.ClassNode; -//import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -//import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -// -//import java.util.List; -//import java.util.Map; -//import java.util.Set; -//import java.util.function.Supplier; -// -//public class ModMixinPluginForge implements IMixinConfigPlugin { -// -// private static final Supplier TRUE = () -> true; -// -// private static final Map> CONDITIONS = ImmutableMap.of( -// "zigy.playeranimatorapi.forge.mixin.EmoteCraftClientInitMixinForge", () -> Platform.isModLoaded("emotecraft", "io.github.kosmx.emotes.forge.ForgeWrapper") -// ); -// -// @Override -// public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { -// return CONDITIONS.getOrDefault(mixinClassName, TRUE).get(); -// } -// -// //Boilerplate -// -// @Override -// public void onLoad(String mixinPackage) { -// } -// -// @Override -// public String getRefMapperConfig() { -// return null; -// } -// -// @Override -// public void acceptTargets(Set myTargets, Set otherTargets) { -// } -// -// @Override -// public List getMixins() { -// return null; -// } -// -// @Override -// public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { -// } -// -// @Override -// public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { -// } -//} +package com.zigythebird.playeranimatorapi.neoforge; + +import com.google.common.collect.ImmutableMap; +import com.zigythebird.multiloaderutils.utils.Platform; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; + +public class ModMixinPluginForge implements IMixinConfigPlugin { + + private static final Supplier TRUE = () -> true; + + private static final Map> CONDITIONS = ImmutableMap.of( + "zigy.playeranimatorapi.neoforge.mixin.EmoteCraftClientInitMixinForge", () -> Platform.isModLoaded("emotecraft", "io.github.kosmx.emotes.forge.ForgeWrapper") + ); + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return CONDITIONS.getOrDefault(mixinClassName, TRUE).get(); + } + + //Boilerplate + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/mixin/EmoteCraftClientInitMixinForge.java b/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/mixin/EmoteCraftClientInitMixinForge.java index ef62fad..43b863b 100644 --- a/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/mixin/EmoteCraftClientInitMixinForge.java +++ b/neoforge/src/main/java/com/zigythebird/playeranimatorapi/neoforge/mixin/EmoteCraftClientInitMixinForge.java @@ -1,30 +1,24 @@ -//package zigy.playeranimatorapi.neoforge.mixin; -// -//import io.github.kosmx.emotes.forge.ClientInit; -//import net.minecraft.client.Minecraft; -//import net.minecraft.client.gui.screens.Screen; -//import net.minecraft.network.chat.Component; -//import net.minecraft.resources.ResourceLocation; -//import org.spongepowered.asm.mixin.Mixin; -//import org.spongepowered.asm.mixin.Unique; -//import org.spongepowered.asm.mixin.injection.At; -//import org.spongepowered.asm.mixin.injection.Redirect; -//import zigy.playeranimatorapi.ModInit; -//import zigy.playeranimatorapi.playeranims.PlayerAnimations; -// -//import javax.annotation.Nullable; -// -// -//@Mixin(ClientInit.class) -//public class EmoteCraftClientInitMixinForge { -// -// @Unique -// private static final ResourceLocation animationLayerId = new ResourceLocation(ModInit.MOD_ID, "factory"); -// -// @Redirect(method = "lambda$initKeyBinding$2", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V"), remap = false) -// private static void initKeybinding(Minecraft instance, @Nullable Screen guiScreen) { -// if (instance.player != null && PlayerAnimations.getModifierLayer(instance.player).isActive() && PlayerAnimations.getModifierLayer(instance.player).important) { -// instance.player.displayClientMessage(Component.translatable("warn.playeranimatorapi.cannotEmote"), true); -// } -// } -//} +package com.zigythebird.playeranimatorapi.neoforge.mixin; + +import com.zigythebird.playeranimatorapi.playeranims.CustomModifierLayer; +import com.zigythebird.playeranimatorapi.playeranims.PlayerAnimations; +import io.github.kosmx.emotes.neoforge.ClientInit; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import javax.annotation.Nullable; + +@Mixin(ClientInit.class) +public class EmoteCraftClientInitMixinForge { + @Redirect(method = "lambda$initKeyBinding$1", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V"), remap = false) + private static void initKeybinding(Minecraft instance, @Nullable Screen guiScreen) { + CustomModifierLayer layer = PlayerAnimations.getModifierLayer(instance.player); + if (instance.player != null && layer.isActive() && layer.data.priority() > 1000) { + instance.player.displayClientMessage(Component.translatable("warn.playeranimatorapi.cannotEmote"), true); + } + } +} diff --git a/neoforge/src/main/java/compatibility/neoforge/ReplayModCompatImpl.java b/neoforge/src/main/java/compatibility/neoforge/ReplayModCompatImpl.java new file mode 100644 index 0000000..990e188 --- /dev/null +++ b/neoforge/src/main/java/compatibility/neoforge/ReplayModCompatImpl.java @@ -0,0 +1,35 @@ +package compatibility.neoforge; + +import com.replaymod.recording.ReplayModRecording; +import com.zigythebird.multiloaderutils.network.MultiloaderPacket; +import com.zigythebird.playeranimatorapi.ModInit; +import com.zigythebird.playeranimatorapi.data.PlayerAnimationData; +import com.zigythebird.playeranimatorapi.data.PlayerParts; +import com.zigythebird.playeranimatorapi.modifier.CommonModifier; +import io.netty.buffer.Unpooled; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +public class ReplayModCompatImpl { + public static void playPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID, PlayerParts parts, List modifiers, int fadeLength, int easeID, int priority, int startTick) { + if (ReplayModRecording.instance.getConnectionEventHandler().getPacketListener() != null) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + PlayerAnimationData data = new PlayerAnimationData(player.getUUID(), animationID, + parts, modifiers, fadeLength, easeID, priority, startTick); + PlayerAnimationData.STREAM_CODEC.encode(buf, data); + ReplayModRecording.instance.getConnectionEventHandler().getPacketListener().save(new MultiloaderPacket(buf, ModInit.altPlayPlayerAnimationPacket).toVanillaClientbound()); + } + } + + public static void stopPlayerAnim(AbstractClientPlayer player, ResourceLocation animationID) { + if (ReplayModRecording.instance.getConnectionEventHandler().getPacketListener() != null) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeUUID(player.getUUID()); + buf.writeResourceLocation(animationID); + ReplayModRecording.instance.getConnectionEventHandler().getPacketListener().save(new MultiloaderPacket(buf, ModInit.altStopPlayerAnimationPacket).toVanillaClientbound()); + } + } +} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 25974a0..35aa15e 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -10,7 +10,7 @@ config = "playeranimatorapi.mixins.json" [[mods]] modId = "playeranimatorapi" -version = "2.2.1" +version = "2.3.0" displayName = "Zigy's Player Animator API" authors = "Zigy" description = ''' @@ -36,6 +36,6 @@ side = "BOTH" [[dependencies.playeranimatorapi]] modId = "playeranimator" type="required" -versionRange = "[2.0.0-alpha1+1.21,)" +versionRange = "[2.0.1+1.21.1,)" ordering = "AFTER" side = "CLIENT" \ No newline at end of file diff --git a/neoforge/src/main/resources/playeranimatorapi.mixins.json b/neoforge/src/main/resources/playeranimatorapi.mixins.json index cf7b4db..fbc9fc5 100644 --- a/neoforge/src/main/resources/playeranimatorapi.mixins.json +++ b/neoforge/src/main/resources/playeranimatorapi.mixins.json @@ -1,9 +1,12 @@ { "required": true, "package": "com.zigythebird.playeranimatorapi.neoforge.mixin", - "compatibilityLevel": "JAVA_17", + "plugin": "com.zigythebird.playeranimatorapi.neoforge.ModMixinPluginForge", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", - "client": [], + "client": [ + "EmoteCraftClientInitMixinForge" + ], "mixins": [], "injectors": { "defaultRequire": 1