Networking
Client vs Server
Minecraft ha un’architettura Client-Server (anche in giocatore singolo! C’è un server interno).
- Il Server gestisce la logica (HP, posizioni, inventari).
- Il Client gestisce il rendering e l’input.
Se modifichi una variabile sul Client, il Server non lo saprà (e viceversa), causando disconnessioni o “ghost items”.
Packets (Pacchetti)
Per comunicare, inviamo pacchetti.
1. Definire l’ID
```java public static final Identifier PACKET_ID = new Identifier(“tutorial”, “spawn_particle”); ```
2. Inviare dal Server al Client (S2C)
```java PacketByteBuf buf = PacketByteBufs.create(); buf.writeBlockPos(pos); // Dati da inviare
// Invia a tutti i giocatori nel mondo ServerPlayNetworking.send(player, PACKET_ID, buf); ```
3. Ricevere sul Client
Devi registrare il ricevitore nel client initializer.
```java ClientPlayNetworking.registerGlobalReceiver(PACKET_ID, (client, handler, buf, responseSender) -> { BlockPos pos = buf.readBlockPos();
// Esegui sul thread principale di render (importante!)
client.execute(() -> {
client.world.addParticle(ParticleTypes.EXPLOSION, pos.getX(), pos.getY(), pos.getZ(), 0, 0, 0);
});
}); ```
C2S (Client to Server)
Funziona allo stesso modo, ma registri il ricevitore sul server (ServerPlayNetworking).
Utile per keybinds custom che devono attivare abilità sul server.