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:
@@ -8,6 +8,9 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
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 net.minecraftforge.network.NetworkEvent;
|
||||||
|
|
||||||
import com.tiedup.remake.rig.TiedUpRigConstants;
|
import com.tiedup.remake.rig.TiedUpRigConstants;
|
||||||
@@ -77,6 +80,10 @@ public record PacketPlayRigAnim(
|
|||||||
/**
|
/**
|
||||||
* Handler client — stub P3-11. Le corps complet (resolve entity, lookup
|
* Handler client — stub P3-11. Le corps complet (resolve entity, lookup
|
||||||
* patch, playAnimation) viendra en P3-12.
|
* 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) {
|
public static void handleOnClient(PacketPlayRigAnim pkt, Supplier<NetworkEvent.Context> ctx) {
|
||||||
NetworkEvent.Context context = ctx.get();
|
NetworkEvent.Context context = ctx.get();
|
||||||
@@ -85,7 +92,7 @@ public record PacketPlayRigAnim(
|
|||||||
// n'enforce pas NetworkDirection, donc un client malveillant pourrait
|
// n'enforce pas NetworkDirection, donc un client malveillant pourrait
|
||||||
// spoofer ce packet vers le serveur. Guard défensif (voir P3-11 review
|
// 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é).
|
// 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(
|
TiedUpRigConstants.LOGGER.warn(
|
||||||
"[PacketPlayRigAnim] rejected non-S→C packet direction: {} (possible spoofing attempt)",
|
"[PacketPlayRigAnim] rejected non-S→C packet direction: {} (possible spoofing attempt)",
|
||||||
context.getDirection()
|
context.getDirection()
|
||||||
@@ -94,13 +101,29 @@ public record PacketPlayRigAnim(
|
|||||||
return;
|
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(
|
TiedUpRigConstants.LOGGER.debug(
|
||||||
"[PacketPlayRigAnim] received (stub P3-11): entityId={}, animId={}, transition={}s, priority={}",
|
"[PacketPlayRigAnim] received (stub P3-11): entityId={}, animId={}, transition={}s, priority={}",
|
||||||
pkt.entityId, pkt.animId, pkt.transitionTime, pkt.priority()
|
pkt.entityId, pkt.animId, pkt.transitionTime, pkt.priority()
|
||||||
);
|
);
|
||||||
// TODO P3-12 : resolve entity + patch + animator.playAnimation
|
// TODO P3-12 : Minecraft.getInstance().level.getEntity(pkt.entityId())
|
||||||
});
|
// + LivingEntityPatch lookup + animator.playAnimation
|
||||||
context.setPacketHandled(true);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user