diff --git a/README.md b/README.md index 3687db4..9422f5b 100644 --- a/README.md +++ b/README.md @@ -104,15 +104,15 @@ Minecraft 协议 * 5.2.7 [玩家坐标和视点](serverboundplay.md#玩家位置与视点) * 5.2.8 [玩家挖掘](serverboundplay.md#玩家挖掘) * 5.2.9 [玩家放置方块](serverboundplay.md#玩家放置砖块) - * 5.2.10 持有物品改变 - * 5.2.11 动画 - * 5.2.12 实体表现 - * 5.2.13 驾驶交通工具 - * 5.2.14 关闭窗口 - * 5.2.15 点击窗口 - * 5.2.16 确认事务 - * 5.2.17 创造模式背包事件 - * 5.2.18 附魔物品 + * 5.2.10 [持有物品改变](serverboundplay.md#持有物品改变) + * 5.2.11 [动画](serverboundplay.md#动画) + * 5.2.12 [实体表现](serverboundplay.md#实体表现) + * 5.2.13 [驾驶交通工具](serverboundplay.md#驾驶交通工具) + * 5.2.14 [关闭窗口](serverboundplay.md#关闭窗口) + * 5.2.15 [点击窗口](serverboundplay.md#点击窗口) + * 5.2.16 [确认事务](serverboundplay.md#确认事务) + * 5.2.17 [创造模式背包事件](serverboundplay.md#创造模式背包事件) + * 5.2.18 [附魔物品](serverboundplay.md#附魔物品) * 5.2.19 修改木牌 * 5.2.20 玩家能力 * 5.2.21 Tab补全 @@ -245,15 +245,15 @@ Minecraft 协议 * 5.2.7 Player Position And Look // szszss [完成] * 5.2.8 Player Digging // szszss [完成] * 5.2.9 Player Block Placement // szszss [完成] - * 5.2.10 Held Item Change - * 5.2.11 Animation - * 5.2.12 Entity Action - * 5.2.13 Steer Vehicle - * 5.2.14 Close Window - * 5.2.15 Click Window - * 5.2.16 Confirm Transaction - * 5.2.17 Creative Inventory Action - * 5.2.18 Enchant Item + * 5.2.10 Held Item Change //roer [完成] + * 5.2.11 Animation //roer [完成] + * 5.2.12 Entity Action //roer [完成] + * 5.2.13 Steer Vehicle //roer [完成] + * 5.2.14 Close Window //roer [完成] + * 5.2.15 Click Window //roer [完成] + * 5.2.16 Confirm Transaction //roer [完成] + * 5.2.17 Creative Inventory Action//roer [完成] + * 5.2.18 Enchant Item //roer [完成] * 5.2.19 Update Sign * 5.2.20 Player Abilities * 5.2.21 Tab-Complete diff --git a/definitions.md b/definitions.md index 0a3edf2..c9cf24d 100644 --- a/definitions.md +++ b/definitions.md @@ -1,5 +1,5 @@ # 定义 - +Minecraft服务器是通过TCP进行连接并且使用数据包来进行通讯。一个数据包是由一连串通过TCP的字节组成。一个数据包的含义由其识别ID以及当时的连接状态两方面来决定。每个连接最初的步骤都是握手,并且通过数据包握手(握手,0x00,服务端)和成功登录(登录,0x02,客户端)来进行切换。 ## 类型定义 全部发向网络的数据都遵守大端序,这意味着字节将按照高位到地位的顺序发送。大部分现在的计算机都是使用的小端序,所以有可能需要在发送信息前交换字节顺序。 diff --git a/packets.md b/packets.md index d31379b..bcd4254 100644 --- a/packets.md +++ b/packets.md @@ -9,6 +9,8 @@ ###数据包格式 +##没有数据压缩 + @@ -19,7 +21,7 @@ - + @@ -28,15 +30,15 @@ - - + +
Length VarInt 数据与包ID长度的总和 数据与包识别ID长度的总和
Packet ID
Data Byte Array 由连接状态和包识别ID两方面决定
##数据压缩 -一旦一个压缩数据包组被发送,后面的所有数据包都将使用zlib压缩算法压缩发送。 +一旦一个压缩数据包组被发送,后面的所有数据包都将使用zlib压缩算法压缩发送。数据包的格式比没有压缩的数据包变得更加轻量。 diff --git a/serverboundplay.md b/serverboundplay.md index 52b96b9..ffa9a44 100644 --- a/serverboundplay.md +++ b/serverboundplay.md @@ -1,6 +1,6 @@ ## 使用实体 -客户端会在玩家攻击或右键一个实体(比如玩家,马,矿车...)时发送此封包给服务器. +客户端会在玩家攻击或右键一个实体(比如玩家,马,矿车……)时发送此封包给服务器. 原版服务器只会在实体距离玩家不超过4单位长度,并且两者之间视线不受阻碍时,才会处理此封包.
(译注:在1.8中的规则是:若两者之间没有视线,则距离不能超过3. 若视线通畅,则距离不能超过6.) @@ -371,4 +371,444 @@ Face代表敲击的砖块面,有如下6种值: 在原版的Beta客户端中,砖块或物品ID等于客户端中玩家拿着的物品,并且客户端会在每次玩家对着砖块表面按右键时都发送一次这个封包,因此对于ID的安全性没有保证. 然而,原版的服务器端似乎会忽略客户端发来的ID,只采用服务器的数据. 在1.2.5和1.3.2中,客户端在一次回话中会发送真实物品ID和一个字段值为-1的封包. (译注:在1.7.2中,服务器确实会在大多数情况下忽略客户端发来的ID,唯一一种用到客户端发来的物品ID的情况是在检查物品是否耗尽的时候. 至于那个字段值为-1的情况,还没有被观测到...) -另外,在使用水桶时,原版客户端可能会发送两个封包:一个正常的放置砖块封包,然后是一个特殊情况的放置砖块封包. 它们会在你使用水桶的时候依次发送. 第一个不会起任何作用,真正执行舀水动作的是第二个封包,取水的位置是在服务器端根据玩家的位置和朝向来测算的. \ No newline at end of file +另外,在使用水桶时,原版客户端可能会发送两个封包:一个正常的放置砖块封包,然后是一个特殊情况的放置砖块封包. 它们会在你使用水桶的时候依次发送. 第一个不会起任何作用,真正执行舀水动作的是第二个封包,取水的位置是在服务器端根据玩家的位置和朝向来测算的. + +##持有物品改变 + +切换快捷栏中的物品时会发送 + +
+ + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x09游戏服务器Slot Short 玩家所选择的栏位(0-8)
+ +##动画 + +当玩家手臂摆动时发送 + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x0A游戏服务器无字段
+ +##实体表现 + +当玩家蹲下,离开床,或者奔跑等等动作时发送。使用0x28发送动画动作到客户端,客户端会在“离开床”被点击时发送此动作ID为3的包。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x0B游戏服务器Entity IDVarInt玩家的ID
Action IDVarInt动作ID,看下面
Jump BoostVarInt马的加速跳,范围是0->100
+ +动作ID可以是以下数值: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID动作
0蹲伏
1解除蹲伏
2离开床
3开始奔跑
4停止奔跑
5骑马跳跃
6打开物品栏
+ +##驾驶交通工具 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x0B游戏服务器SidewaysFloat玩家左侧面
ForwardFloat玩家向前
FlagsUnsigned Byte位掩码: 0x1: 跳跃 0x2: 卸下
+ +##关闭窗口 + +客户端会在窗口关闭的时候发送此数据包. + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x0D游戏服务器Window IDByte这是窗口关闭的ID。0是物品栏。
+ +##点击窗口 + +当玩家点击一个窗口中的栏位 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x0E游戏服务器Window IDByte点击的窗口的ID。0是玩家物品栏
SlotShort被点击的栏位,看下面
ButtonByte点击时使用的按钮,看下面
Action NumberShort动作的唯一识别数字,通过一个计数器实现,从1开始。服务器使用它返回一个确认事务
ModeByte物品操作模式,看下面
Clicked itemSlot
+ +请看[物品窗口](http://wiki.vg/Inventory#Windows)来知晓栏位是如何被索引的。 + +当右击一个物品的栈区时,栈中一半的物品都会被拿起并且另外一半还在栏位中。如果栈区内物品数量为奇数,那么在栏位中的那一半会是较小的那一份。 + +通过模式和按钮的组合来决定客户端发送的不同种类的点击。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模式按钮栏位触发行为
00Normal鼠标左键
1Normal鼠标右键
10NormalShift+鼠标左键
1NormalShift+鼠标右键(相同行为)
20Normal数字键1
1Normal数字键2
2Normal数字键3
8Normal数字键8
32Normal鼠标中键
40Normal丢弃键(Q)
1NormalCtrl+丢弃键(Q)(扔掉一整个栏位的物品)
0-999在没有物品被鼠标拿起的情况下左击物品栏的外边(非op模式)
1-999在没有物品被鼠标拿起的情况下右击物品栏的外边(非op模式)
50-999开始鼠标左键拖拽(或者是中键)
4-999开始鼠标右键拖拽
1Normal为鼠标左键拖拽增加栏位
5Normal为鼠标右键拖拽增加栏位
2-999结束鼠标左键拖拽
6-999结束鼠标右键拖拽
60Normal双击
+ +从1.5版本开始,“画笔模式”可以在物品栏窗口使用了。首先拿起一栈物品(至少超过一个),然后按住鼠标按键(可以是左键,右键或者中键)并且拖拽其经过空栏位(在右键按下时可以经过具有相同物品的栏位)。 +在鼠标按钮放开的时候(通常会处理第一个“拿起”的数据包),客户端会发送以下信息到服务器: + +1. 模式5,栏位 -999,按键(左键是0 | 右键是4)的数据包 +2. 所有被“涂过”的栏位,模式仍然是5,按键(1 | 5)的数据包 +3. 模式5,栏位 -999,按键(2 | 6)的数据包 + +如果任何发送的“涂画”数据包不同于现在正在发送中的(打个比方,开始,经过一些栏位,然后另外一个开始了;或者在途中点击了左键),那么现在涂画的状态会被重置取消。 + +##确认事务 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x0F游戏服务器Window IDByte发生该事件的窗口ID
Action NumberShort每个被接受的行为都有一个唯一的识别码,这个字段是对应这个识别码的
AcceptedBoolean当行为被接受时
+ +##创造模式背包事件 + +当创造模式用户是在标准物品栏模式(不是一个合成台模式),服务器会发送一个数据包。 + +- 当一个物品被扔进快捷栏 +- 当一个物品从快捷栏中拿起(物品ID是-1) + + + + + + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x10游戏服务器SlotShort物品栏位
Clicked ItemSlot
+ +##附魔物品 + + + + + + + + + + + + + + + + + + + + + + + +
包标识符类别绑定到字段名字段类型备注
0x11游戏服务器Window IDByte附魔台窗口ID
EnchantmentByte点击的附魔栏位,从最上面开始计0
\ No newline at end of file