zh_cn:tutorial:networking
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| zh_cn:tutorial:networking [2024/04/15 02:16] – solidblock | zh_cn:tutorial:networking [2024/07/05 10:58] (current) – solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| **注意:**本页已经取代旧版页面。建议使用本页描述的新的网络API。旧的页面参见[[tutorial: | **注意:**本页已经取代旧版页面。建议使用本页描述的新的网络API。旧的页面参见[[tutorial: | ||
| + | |||
| + | 对于 1.20.5 引入的新的网络通信 API,请参见 [[#1.20.5 中的网络通信]]。 | ||
| ====== 网络通信 ====== | ====== 网络通信 ====== | ||
| Line 41: | Line 43: | ||
| 要修复崩溃,你需要了解 Minecraft 如何在客户端和专用服务器之间通信(communication)。 | 要修复崩溃,你需要了解 Minecraft 如何在客户端和专用服务器之间通信(communication)。 | ||
| - | [[Minecraft 的逻辑段|{{tutorial: | + | [[Minecraft 的逻辑端|{{tutorial: |
| 从上面这张图可以看到,游戏客户端和专用服务器是相互分离的系统,并使用数据包(packets,注意不是 datapack)桥接在一起。这个数据包桥(packet bridge)不仅存在于游戏客户端和专用服务器之间,还存在于您的客户端和通过 LAN 连接的另一个客户端之间。注意即使是单人游戏也有数据包桥,这是因为游戏客户端会启动一个特殊的集成服务器实例来运行游戏。下表显示了三种连接类型之间的主要区别: | 从上面这张图可以看到,游戏客户端和专用服务器是相互分离的系统,并使用数据包(packets,注意不是 datapack)桥接在一起。这个数据包桥(packet bridge)不仅存在于游戏客户端和专用服务器之间,还存在于您的客户端和通过 LAN 连接的另一个客户端之间。注意即使是单人游戏也有数据包桥,这是因为游戏客户端会启动一个特殊的集成服务器实例来运行游戏。下表显示了三种连接类型之间的主要区别: | ||
| Line 72: | Line 74: | ||
| </ | </ | ||
| - | 接下来,我们需要将数据包发送到游戏客户端。首先需要定义一个用于识别数据包的 '' | + | 接下来,我们需要将数据包发送到游戏客户端。首先需要定义一个用于识别数据包的 '' |
| + | <code java> | ||
| + | public class TutorialNetworkingConstants { | ||
| + | // 存储数据包的 id 以便后面引用 | ||
| + | public static final Identifier HIGHLIGHT_PACKET_ID = Identifier.of(" | ||
| + | } | ||
| + | </ | ||
| 要将数据包发送到玩家,我们使用 '' | 要将数据包发送到玩家,我们使用 '' | ||
| Line 81: | Line 89: | ||
| </ | </ | ||
| - | 数据包将会被发送到此方法中的玩家。通道名称是你之前决定用来识别数据包的 '' | + | 数据包将会被发送到此方法中的玩家。通道名称是你之前决定用来识别数据包的 '' |
| 由于我们没有向数据包写入任何数据,所以现在,我们将发送带有空有效负载的数据包。可以使用 '' | 由于我们没有向数据包写入任何数据,所以现在,我们将发送带有空有效负载的数据包。可以使用 '' | ||
| Line 202: | Line 210: | ||
| 这样修改之后,当你使用魔杖时,你的朋友也应该在他们自己的客户端上看到高亮方块。 | 这样修改之后,当你使用魔杖时,你的朋友也应该在他们自己的客户端上看到高亮方块。 | ||
| - | ===== Networking in 1.20.5 ===== | + | ===== 1.20.5 |
| - | Since 1.20.5, the logic of networking is totally rewrited. In 1.20.5, you have to define a custom | + | 自 1.20.5 |
| <code java> | <code java> | ||
| public record BlockHighlightPayload(BlockPos blockPos) implements CustomPayload { | public record BlockHighlightPayload(BlockPos blockPos) implements CustomPayload { | ||
| - | public static final Id< | + | public static final Id< |
| public static final PacketCodec< | public static final PacketCodec< | ||
| - | // or you can also write like this: | + | // 或者,你也可以这样写: |
| // public static final PacketCodec< | // public static final PacketCodec< | ||
| Line 219: | Line 227: | ||
| </ | </ | ||
| - | And then, register the receiver | + | 然后,像这样注册 |
| <code java> | <code java> | ||
| PayloadTypeRegistry.playS2C().register(BlockHighlightPayload.ID, | PayloadTypeRegistry.playS2C().register(BlockHighlightPayload.ID, | ||
| Line 229: | Line 237: | ||
| </ | </ | ||
| - | Now, on the server side, you can send the packet to players like this: | + | 现在,在服务器一端,你可以像这样把数据包发送给玩家: |
| <code java> | <code java> | ||
| public TypedActionResult< | public TypedActionResult< | ||
zh_cn/tutorial/networking.1713147414.txt.gz · Last modified: 2024/04/15 02:16 by solidblock