diff --git a/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java b/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java index a6bccaf..ea19364 100644 --- a/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java +++ b/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java @@ -1,6 +1,7 @@ package org.saturnclient.saturnclient.client; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.saturnclient.saturnclient.SaturnClient; @@ -8,8 +9,14 @@ import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; +import dev.kosmx.playerAnim.api.layered.AnimationStack; +import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess; +import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationRegistry; import dev.selimaj.session.Session; +import dev.selimaj.session.types.SessionResult; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.util.Identifier; public class ServiceClient { private static Session session; @@ -53,7 +60,8 @@ public class ServiceClient { return false; } - ServiceMethods.AuthResponse response = session.request(ServiceMethods.Authenticate, accessToken).get(); + ServiceMethods.Types.AuthResponse response = session.request(ServiceMethods.Authenticate, accessToken) + .get(); for (String availableCloak : response.cloaks()) { Cloaks.availableCloaks.add(availableCloak); @@ -63,6 +71,8 @@ public class ServiceClient { Hats.availableHats.add(availableHat); } + eventHandlers(); + SaturnPlayer.set(uuid, username, new SaturnPlayer(uuid, username, response.cloak(), response.hat())); Cloaks.loadCloak(uuid); @@ -128,13 +138,42 @@ public class ServiceClient { public static void emote(String emote) { try { - session.request(ServiceMethods.Emote, emote).whenComplete((msg, throwable) -> { - if (throwable != null) { - throwable.printStackTrace(); - } - }); + String[] targets = { uuid.toString().replaceAll("-", "") }; + + session.request(ServiceMethods.Emote, + new ServiceMethods.Types.EmoteRequest(emote, targets)) + .whenComplete((msg, throwable) -> { + if (throwable != null) { + throwable.printStackTrace(); + } + }); } catch (Exception e) { SaturnClient.LOGGER.error("Failed to emote (service): ", e); } } + + public static void eventHandlers() { + session.onNotification(ServiceMethods.EmoteEvent, (l, data) -> { + return CompletableFuture.supplyAsync(() -> { + for (AbstractClientPlayerEntity player : SaturnClient.client.world.getPlayers()) { + if (player.getUuidAsString().replace("-", "").equals(data.from())) { + AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(player); + if (data.emote() != null && !data.emote().isEmpty()) { + if (animationStack.isActive() && animationStack.getPriority() == 1000) { + animationStack.removeLayer(1000); + } + animationStack.addAnimLayer(1000, + PlayerAnimationRegistry + .getAnimation(Identifier.of("saturnclient", data.emote())) + .playAnimation()); + } else { + animationStack.removeLayer(1000); + } + } + } + + return SessionResult.ok(""); + }); + }); + } } diff --git a/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java b/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java index 7eb9dea..afb0ccf 100644 --- a/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java +++ b/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java @@ -3,11 +3,19 @@ package org.saturnclient.saturnclient.client; import dev.selimaj.session.types.Method; public class ServiceMethods { - public record AuthResponse(String cloak, String hat, String[] cloaks, String[] hats) { + public class Types { + public record AuthResponse(String cloak, String hat, String[] cloaks, String[] hats) { + } + + public record EmoteRequest(String emote, String[] targets) { + } + + public record EmoteEvent(String emote, String from) { + } } - public static final Method Authenticate = new Method<>("auth", - String.class, AuthResponse.class, String.class); + public static final Method Authenticate = new Method<>("auth", + String.class, Types.AuthResponse.class, String.class); // Equip public static final Method SetCloak = new Method<>("set_cloak", @@ -22,6 +30,9 @@ public class ServiceMethods { String.class, String.class, String.class); // Emote - public static final Method Emote = new Method<>("emote", - String.class, String.class, String.class); + public static final Method Emote = new Method<>("emote", + Types.EmoteRequest.class, String.class, String.class); + + public static final Method EmoteEvent = new Method<>("emote_event", + Types.EmoteEvent.class, String.class, String.class); } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java index 158c29a..cabc440 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java @@ -28,7 +28,7 @@ public class HatFeatureRenderer extends FeatureRenderer T getOrNull(List list, int index) { - SaturnClient.LOGGER.info("Accessing index {} in list of size {}", index, list.size()); return (index >= 0 && index < list.size()) ? list.get(index) : null; } diff --git a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java index 55d6fe1..ab726ea 100644 --- a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java +++ b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java @@ -63,13 +63,13 @@ public class EmoteWheel extends SaturnScreen { if (emote == null) { return; } - AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(SaturnClient.client.player); - if (animationStack.isActive() && animationStack.getPriority() == 1000) { - animationStack.removeLayer(1000); - } - animationStack.addAnimLayer(1000, - PlayerAnimationRegistry.getAnimation(Identifier.of("saturnclient", - emote)).playAnimation()); + // AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(SaturnClient.client.player); + // if (animationStack.isActive() && animationStack.getPriority() == 1000) { + // animationStack.removeLayer(1000); + // } + // animationStack.addAnimLayer(1000, + // PlayerAnimationRegistry.getAnimation(Identifier.of("saturnclient", + // emote)).playAnimation()); ServiceClient.emote(emote); close(); }).dimensions(70, 70).centerOffset(width, height, -80 + (col * 80), -35 + (row * 80))