RepoDocsMinecraft

Networking

rosetta-networking requires core. See setup.

Declare packets in common code. Rosetta handles registration and transport for each loader.

Define a packet

A packet implements RosettaPacket. The packet may be a record and does not need to expose loader-specific payload types or codecs.

package net.example.network;

import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.rasanovum.rosetta.network.RosettaPacket;

public record RenameRequestC2S(String name) implements RosettaPacket {
    public RenameRequestC2S(FriendlyByteBuf buffer) {
        this(buffer.readUtf(64));
    }

    @Override
    public void write(FriendlyByteBuf buffer) {
        buffer.writeUtf(name, 64);
    }

    public static void handle(RenameRequestC2S packet, ServerPlayer sender) {
        // This packet is serverbound, so validate the request and modify server state here.
    }
}

Readers and RosettaPacket.write use FriendlyByteBuf on every target. Serverbound handlers receive a ServerPlayer; clientbound handlers receive a Player.

Register packets

Create one channel for the consuming mod and register each packet direction explicitly:

package net.example.network;

import net.rasanovum.rosetta.network.RosettaNetwork;

public final class ExamplePackets {
    private static final RosettaNetwork.Channel CHANNEL =
            RosettaNetwork.channel("example_mod");

    private ExamplePackets() {}

    public static void register() {
        CHANNEL.serverbound(
                "rename_request",
                RenameRequestC2S.class,
                RenameRequestC2S::new,
                RenameRequestC2S::handle
        );

        CHANNEL.clientbound(
                "rename_result",
                RenameResultS2C.class,
                RenameResultS2C::new,
                RenameResultS2C::handle
        );
    }
}

Call ExamplePackets.register() during the consuming mod’s initialization.

Send packets

Send a client-to-server packet from client code:

RosettaNetwork.sendToServer(new RenameRequestC2S("New name"));

Send a server-to-client packet to a specific player:

RosettaNetwork.sendToPlayer(new RenameResultS2C(true), serverPlayer);