User Tools

Site Tools


zh_cn:tutorial:networking

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
zh_cn:tutorial:networking [2022/01/28 07:18] – [Advanced Networking topics] solidblockzh_cn:tutorial:networking [2024/04/15 02:16] (current) solidblock
Line 201: Line 201:
  
 这样修改之后,当你使用魔杖时,你的朋友也应该在他们自己的客户端上看到高亮方块。 这样修改之后,当你使用魔杖时,你的朋友也应该在他们自己的客户端上看到高亮方块。
-====== 高级网络主题 ====== 
  
-网络系统 Fabric API 提供的功能非常灵活,并支持除了发送和接收简单数据包之外的其他功能。由于其中一些更高级的主题很长,以下是指向其特定页面的链接:+===== Networking in 1.20.5 ===== 
 +Since 1.20.5, the logic of networking is totally rewrited. In 1.20.5, you have to define a custom ''Payload''. First, define the payload that includes a ''BlockPos'':
  
-^ 网络通信主题 ^ 描述 ^ +<code java> 
-| [[zh_cn:tutorial:networking:connection_events|Connection Network connection events]] | 与客户端或服务器连接的生命周期相关的事件 | +public record BlockHighlightPayload(BlockPos blockPos) implements CustomPayload { 
-| [[zh_cn:tutorial:networking:channel_events|Channel registration events]] | 与客户端或服务器相关的事件,声明在特定名称的通道上接收数据包的能力 | +  public static final Id<BlockHighlightPayload> ID = CustomPayload.id("tutorial:block_highlight"); 
-| [[zh_cn:tutorial:networking:login|Login phase networking]]| 在登录期间向客户端发送请求;并允许在短时间内延迟登录 | +  public static final PacketCodec<PacketByteBuf, BlockHighlightPayload> CODEC = PacketCodec.tuple(BlockPos.PACKET_CODEC, BlockHighlightPayload::blockPos, BlockHighlightPayload::new); 
-| [[zh_cn:tutorial:networking:dynamic_handlers|Dynamic registration of channel handlers]]| 允许连接接收带有特殊处理器的数据包 |+  // 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>
zh_cn/tutorial/networking.txt · Last modified: 2024/04/15 02:16 by solidblock