P3-11 review followup : isolate client-only handler behind @OnlyIn

Prepare P3-12 consumption of Minecraft.getInstance() — refactor
handleOnClient() to delegate into a private ClientHandler inner class
annotated @OnlyIn(Dist.CLIENT). Server-side class-loader will not
resolve Minecraft.* references since the inner class isn't touched.

Direction guard inchangé. Import NetworkDirection passé top-level.

Issue : review transversale Phase 3 (architect agent), recommendation #3.
This commit is contained in:
notevil
2026-04-23 15:49:46 +02:00
parent ab93dc80be
commit 639e9e94f7

View File

@@ -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.
*
* <p>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<NetworkEvent.Context> 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
}
}
}