Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 2.3.0 #10

Merged
merged 4 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
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.
27 changes: 24 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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"
Expand All @@ -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 {
Expand Down
1 change: 0 additions & 1 deletion common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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}"

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

/**
Expand All @@ -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<CommonModifier> 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<CommonModifier> 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<CommonModifier> 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<CommonModifier> 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<Integer, PlayerAnimationData> 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<Integer, PlayerAnimationData> data = ((PlayerInterface)player).paapi$getLastAnim();
if (data != null && data.getRight().animationID().equals(animationID)) ((PlayerInterface)player).setLastAnim(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<CommonModifier> 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<CommonModifier> 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<CommonModifier> 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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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() {}
}
Original file line number Diff line number Diff line change
@@ -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 {

Expand All @@ -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());
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")) {
Expand Down
Loading