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 + } } }