User Tools

Site Tools


tutorial:networking

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:networking [2023/04/16 01:03] fxtutorial:networking [2024/05/04 19:51] (current) – Call out the 1.20.5 networking section at the top so people can know to skip to it bluemeanial
Line 2: Line 2:
 It is recommended to use the new networking API described on this page. It is recommended to use the new networking API described on this page.
 The old page can be [[tutorial:legacy:networking-v0|found here]]. The old page can be [[tutorial:legacy:networking-v0|found here]].
 +
 +For the even newer networking API introduced at 1.20.5, read the [[#Networking in 1.20.5 | separate documentation below]].
  
 ====== Networking ====== ====== Networking ======
Line 82: Line 84:
 public class TutorialNetworkingConstants { public class TutorialNetworkingConstants {
     // Save the id of the packet so we can reference it later     // Save the id of the packet so we can reference it later
-    public static final Identifier HIGHLIGHT_PACKET_ID = new Identifier("wiki_example", "highlight");+    public static final Identifier HIGHLIGHT_PACKET_ID = new Identifier("wiki_example", "highlight_block");
 } }
 </code> </code>
Line 217: Line 219:
 After this change, when you use the wand, your friend should also see the highlighted block on their own client. After this change, when you use the wand, your friend should also see the highlighted block on their own client.
  
-====== Advanced Networking topics ====== 
  
-The Networking system Fabric API supplies is very flexible and supports additional features other than just sending and receiving simple packetsAs some of these more advanced topics are longhere are links to their specific pages:+===== Networking in 1.20.5 ===== 
 +Since 1.20.5, the logic of networking has been totally rewritten. In 1.20.5you have to define a custom ''Payload''. First, define the payload that includes a ''BlockPos'':
  
-^ Networking Topic ^ Description ^ +<code java> 
-| [[tutorial:networking:connection_events|Connection Network connection events]] | Events related to the the lifecycle of a connection to a client or server | +public record BlockHighlightPayload(BlockPos blockPos) implements CustomPayload { 
-| [[tutorial:networking:channel_events|Channel registration events]] | Events related to a server of client declaring the ability to receive a packet on a channel of a specific name | +  public static final Id<BlockHighlightPayload> ID = CustomPayload.id("tutorial:block_highlight"); 
-| [[tutorial:networking:login|Login phase networking]]| Sending requests to a client during loginand allowing delay of login for a short amount of time | +  public static final PacketCodec<PacketByteBuf, BlockHighlightPayload> CODEC = PacketCodec.tuple(BlockPos.PACKET_CODEC, BlockHighlightPayload::blockPos, BlockHighlightPayload::new)
-| [[tutorial:networking:dynamic_handlers|Dynamic registration of channel handlers]]| Allowing for a connection to receive a packet with a special handler |+  // or you can also write like this: 
 +  // public static final PacketCodec<PacketByteBuf, BlockHighlightPayload> CODEC = PacketCodec.of((value, buf) -> buf.writeBlockPos(value.blockPos), buf -> new BlockHighlightPayload(buf.readBlockPos()));
  
 +  @Override
 +  public Id<? extends CustomPayload> getId() {
 +    return ID;
 +  }
 +}
 +</code>
 +
 +And then, register the receiver like this:
 +<code java>
 +PayloadTypeRegistry.playS2C().register(BlockHighlightPayload.ID, BlockHighlightPayload.CODEC);
 +ClientPlayNetworking.registerGlobalReceiver(BlockHighlightPayload.ID, (payload, context) -> {
 +  context.client().execute(() -> {
 +    ClientBlockHighlighting.highlightBlock(client, target);
 +  });
 +});
 +</code>
 +
 +Now, on the server side, you can send the packet to players like this:
 +<code java>
 +    public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
 +        if (world.isClient()) return super.use(world, user, hand);
 +
 +        // ...
 +
 +        for (ServerPlayerEntity player : PlayerLookup.tracking((ServerWorld) world, target)) {
 +            ServerPlayNetworking.send(player, new BlockHighlightPayload(blockPos));
 +        }
 +
 +        return TypedActionResult.success(user.getHandStack(hand));
 +    }
 +</code>
tutorial/networking.1681607016.txt.gz · Last modified: 2023/04/16 01:03 by fx