协议常见问题解答
人们经常会对Minecraft现代协议有疑问,所以我们将尝试解决本文档中一些最常见的问题。如果您仍然有困难,请加入IRC频道,#mcdevs on irc.freenode.net
协议文档完成了吗?
根据你的定义,是的!所有的数据包类型都是已知的,并且它们的布局被记录下来。一些更精细的细节丢失了,但你所需要的一切,使功能程序。我们还可以快速发布新协议的信息。
客户端正常登录顺序
关于与Mojang服务器的通信,请参见 身份验证 。
推荐的登录顺序如下所示,其中C是客户端,S是服务器:
- 客户端与服务器建立连接
- C→S: 握手 State=2
- C→S: 开始登录
- S→C: 加密请求
- 客户端身份验证
- C→S: 加密应答
- 服务器身份验证,两者都启用加密
- S→C: 设置压缩 (可选,启用压缩)
- S→C: 登录成功
- S→C: 进入游戏
- S→C: 插件消息:
minecraft:brand
服务器名称 (可选) - S→C: 服务器难度 (可选)
- S→C: 玩家能力 (可选)
- C→S: 插件消息:
minecraft:brand
客户端名称 (可选) - C→S: 客户端设置
- S→C: 持有物品更改
- S→C: 声明配方
- S→C: 标签
- S→C: 实体状态
- S→C: 声明指令
- S→C: 解锁配方
- S→C: 玩家位置与朝向
- S→C: 玩家信息 (增加玩家动作)
- S→C: 玩家信息 (更新延迟动作)
- S→C: 更新视图位置
- S→C: 更新光源 (以玩家位置为中心的方格中的每一块都有一个)
- S→C: 数据块数据 (以玩家位置为中心的方格中的每一块都有一个)
- S→C: 地图边界 (一旦世界完成加载)
- S→C: 重生点位置 (
home
的位置,而不是客户端在登录时出现的位置) - S→C: 玩家位置与朝向 (必需,以告知客户端他们准备好了重生点位置)
- C→S: 传送确认
- C→S: 玩家位置与朝向 (来确认重生点位置)
- C→S: 客户端状态 (在接收数据块之前或接收数据块时发送,需要进一步测试;如果未发送,服务器也可正确处理)
- S→C: 背包、实体等
离线模式
如果服务器处于离线模式,它将不发送加密请求包,同样,客户端也不应发送加密响应。在这种情况下,从不启用加密,也不执行身份验证。
如果服务器在未发送加密请求的情况下发送登录成功,则客户端可以判断服务器处于离线模式。
我想我做的每件事都是对的,但是…
…客户端卡在“加载地图”界面
在发送常识包(握手
、登录开始
、背包
、指南针
和数据块
)之后,您需要最终向玩家发送他们的初始位置
,以便他们离开“加载地图”界面。
请注意,如果执行以下步骤,Minecraft客户端将重生玩家:
- 握手 (参见 协议加密)
- 发送
Spawn Position
包 - 发送
Player Position And Look
包 虽然上面的步骤对于Minecraft 1.4.5来说已经足够了,但是在允许玩家进入之前,最好先发送常识包来通知客户端关于玩家周围世界的信息。
…客户端没有收到完整的地图数据块
参见 How to Write a Client
标准Minecraft服务器只在客户端发送玩家状态更新包时发送完整数据块 (任何 Player (0x03)
通过 Player Position And Look (0x06)
).
…所有连接的玩家都无法控制地痉挛和抽搐
对于较新的客户机,您的服务器需要提前发送49个数据块,而不仅仅是一个。在生成数据块之前,以连接客户端的位置为中心发送一个7×7正方形的数据块。
…客户端试图发送以0xFE01
开头的无效数据包
客户端正在尝试 旧版服务器列表Ping ,如果服务器没有正确响应服务器列表Ping
,包括发送格式错误的JSON,则会发生这种情况。
…客户端在一段时间后断开连接,出现“超时”错误
服务器应该每秒发送一个 心跳
包,客户端应该用该包的 serverbound
版本进行响应。如果任何一方在一段时间内没有收到保持有效,它们将断开连接。
如何打开/保存命令方块?
打开客户端命令方块窗口的过程有些复杂;客户端实际上使用 Update Block Entity (0x09)
包来打开它。
首先,客户端的操作权限级别必须至少为级别2的OP,否则客户端将拒绝打开命令方块。(操作权限级别由 Entity Status
包设置)
实际上打开命令方块:
- C→S:
Player Block Placement (0x1C)
,当右键单击的命令方块时。 - S→C:
Update Block Entity (0x09)
, 命令方块的二进制数据标签。
要想保存它,使用 MC|AutoCmd
插件通道。