Skip to content

Commit

Permalink
Merge pull request #10 from ZigyTheBird/dev
Browse files Browse the repository at this point in the history
Release 2.3.0
  • Loading branch information
ZigyTheBird authored Jan 28, 2025
2 parents e231207 + 61769e6 commit 953de10
Show file tree
Hide file tree
Showing 63 changed files with 688 additions and 1,474 deletions.
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

0 comments on commit 953de10

Please sign in to comment.