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
Next revision
Previous revision
zh_cn:tutorial:networking [2022/01/28 07:18] – [Advanced Networking topics] solidblockzh_cn:tutorial:networking [2024/05/28 08:52] (current) solidblock
Line 1: Line 1:
 **注意:**本页已经取代旧版页面。建议使用本页描述的新的网络API。旧的页面参见[[tutorial:legacy:networking-v0|此处(英文)]]。 **注意:**本页已经取代旧版页面。建议使用本页描述的新的网络API。旧的页面参见[[tutorial:legacy:networking-v0|此处(英文)]]。
 +
 +对于 1.20.5 引入的新的网络通信 API,请参见 [[#1.20.5 中的网络通信]]。
  
 ====== 网络通信 ====== ====== 网络通信 ======
Line 201: Line 203:
  
 这样修改之后,当你使用魔杖时,你的朋友也应该在他们自己的客户端上看到高亮方块。 这样修改之后,当你使用魔杖时,你的朋友也应该在他们自己的客户端上看到高亮方块。
-====== 高级网络主题 ====== 
  
-网络系统 Fabric API 提供的功能非常灵活并支持除了发送和接收简单数据包之外其他功能由于其中一些更高级的主题很长以下是指向其特页面链接+===== 1.20.5 中的网络通信 ===== 
 +自 1.20.5 开始网络通信逻辑被大改在 1.20.5 ,你需要定义个 ''Payload''。首先,定义一个包含了 ''BlockPos'' 的 ''Payload''
  
-^ 网络通信主题 ^ 描述 ^ +<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]]| 允许连接接收带有特殊处理器的数据包 |+  // 者,你也可以这样写: 
 +  // 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> 
 + 
 +然后,像这样注册 receiver: 
 +<code java> 
 +PayloadTypeRegistry.playS2C().register(BlockHighlightPayload.ID, BlockHighlightPayload.CODEC); 
 +ClientPlayNetworking.registerGlobalReceiver(BlockHighlightPayload.ID, (payload, context) -> { 
 +  context.client().execute(() -> { 
 +    ClientBlockHighlighting.highlightBlock(client, target); 
 +  }); 
 +}); 
 +</code> 
 + 
 +现在,在服务器一端你可以像这样把数据包发送给玩家: 
 +<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.1643354288.txt.gz · Last modified: 2022/01/28 07:18 by solidblock