diff --git a/src/main/java/com/tiedup/remake/rig/network/PacketPlayRigAnim.java b/src/main/java/com/tiedup/remake/rig/network/PacketPlayRigAnim.java
index 0530175..5ce1570 100644
--- a/src/main/java/com/tiedup/remake/rig/network/PacketPlayRigAnim.java
+++ b/src/main/java/com/tiedup/remake/rig/network/PacketPlayRigAnim.java
@@ -8,6 +8,9 @@ import java.util.function.Supplier;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkEvent;
import com.tiedup.remake.rig.TiedUpRigConstants;
@@ -77,6 +80,10 @@ public record PacketPlayRigAnim(
/**
* Handler client — stub P3-11. Le corps complet (resolve entity, lookup
* patch, playAnimation) viendra en P3-12.
+ *
+ *
La logique client-only est isolée dans {@link ClientHandler} pour que
+ * le classloader serveur ne résolve jamais {@code Minecraft.*} (sera
+ * référencé en P3-12). Voir review transversale Phase 3 (reco #3).
*/
public static void handleOnClient(PacketPlayRigAnim pkt, Supplier ctx) {
NetworkEvent.Context context = ctx.get();
@@ -85,7 +92,7 @@ public record PacketPlayRigAnim(
// n'enforce pas NetworkDirection, donc un client malveillant pourrait
// spoofer ce packet vers le serveur. Guard défensif (voir P3-11 review
// RISK-001 — fix systémique du helper reg() tracé en backlog séparé).
- if (context.getDirection() != net.minecraftforge.network.NetworkDirection.PLAY_TO_CLIENT) {
+ if (context.getDirection() != NetworkDirection.PLAY_TO_CLIENT) {
TiedUpRigConstants.LOGGER.warn(
"[PacketPlayRigAnim] rejected non-S→C packet direction: {} (possible spoofing attempt)",
context.getDirection()
@@ -94,13 +101,29 @@ public record PacketPlayRigAnim(
return;
}
- context.enqueueWork(() -> {
+ // Délégation client-only. L'inner class n'est class-loadée que si cette
+ // branche s'exécute, donc safe côté serveur même si Minecraft.* y est
+ // référencé en P3-12.
+ context.enqueueWork(() -> ClientHandler.apply(pkt));
+ context.setPacketHandled(true);
+ }
+
+ /**
+ * Handler client-only. Encapsule toute dépendance {@code Minecraft.*} pour
+ * éviter un NoClassDefFoundError serveur-side si la JVM resolve les refs
+ * dist-only du handler principal.
+ */
+ private static final class ClientHandler {
+ private ClientHandler() {}
+
+ @OnlyIn(Dist.CLIENT)
+ static void apply(PacketPlayRigAnim pkt) {
TiedUpRigConstants.LOGGER.debug(
"[PacketPlayRigAnim] received (stub P3-11): entityId={}, animId={}, transition={}s, priority={}",
pkt.entityId, pkt.animId, pkt.transitionTime, pkt.priority()
);
- // TODO P3-12 : resolve entity + patch + animator.playAnimation
- });
- context.setPacketHandled(true);
+ // TODO P3-12 : Minecraft.getInstance().level.getEntity(pkt.entityId())
+ // + LivingEntityPatch lookup + animator.playAnimation
+ }
}
}