Skip to main content

Get 25% OFF on your first order with BisectHosting using code "DAQEM"!

Networking

Knot utilizes modern Minecraft record packets and StreamCodecs.

Defining a Packet

Packets must implement CustomPacketPayload.

public record MyPacket(String message, int number) implements CustomPacketPayload {

public static final Type<MyPacket> TYPE = new Type<>(MyMod.API.getId("my_packet"));

// Codec defines how to write/read the data
public static final StreamCodec<RegistryFriendlyByteBuf, MyPacket> CODEC = StreamCodec.composite(
ByteBufCodecs.STRING_UTF8, MyPacket::message,
ByteBufCodecs.INT, MyPacket::number,
MyPacket::new
);

@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}
}

Handling Packets

Create a handler method.

Clientbound:

public static void handleClient(MyPacket payload, ClientboundContext context) {
Player player = context.player();
MyMod.API.info("Received on client: " + payload.message());
}

Serverbound:

public static void handleServer(MyPacket payload, ServerboundContext context) {
ServerPlayer player = context.player();
// Verify permissions, log logic, etc.
}

Registration

Register your packets during your mod initialization.

public static void init() {
Knot.NETWORKING.registerClientbound(MyPacket.TYPE, MyPacket.CODEC, MyPacketHandler::handleClient);
Knot.NETWORKING.registerServerbound(MyOtherPacket.TYPE, MyOtherPacket.CODEC, MyPacketHandler::handleServer);
}

Sending Packets

// Send to Server
Knot.NETWORKING.sendToServer(new MyPacket("Hello", 1));

// Send to Player
Knot.NETWORKING.sendToPlayer(serverPlayer, new MyPacket("Welcome", 2));

// Send to All
Knot.NETWORKING.sendToPlayers(serverLevel.players(), new MyPacket("Broadcast", 3));