🎓 数据包 API
下面这些对象与 API 为脚本提供了基本的 BDS 数据包接口。
温馨提示:此类 API 需要部分逆向基础,了解数据包结构(可通过参考 Nukkit,PokcetMine,BDS 逆向得知数据包结构)如出现客户端崩溃,为数据包结构错误,并非 BUG。
文档不列出数据包 ID 与其结构,请自行查询。
目录
- 🔉 数据包对象 API
- 🔌 二进制流对象 API
🔉 数据包对象 API
在脚本引擎中,使用「数据包对象」来获取数据包的相关信息。
获取一个数据包对象
从 API 获取
调用某些返回数据包对象的函数,来获取到 BDS 给出的数据包对象
详见 二进制流对象
通过数据包 ID 创建
Warning
此类的全局别名仅在 0.19.1 及以后版本可用
Packet.createPacket(pktid[,raw])
- 参数:
- pktid :
Integer数据包 ID - raw :
Boolean(可选参数) 是否创建原始网络数据包。默认值为false - 返回值:数据包对象
- 返回值类型:
Packet
数据包对象 - 函数
每一个数据包对象都包含一些可以执行的成员函数(成员方法)。对于某个特定的实体对象pkt,可以通过以下这些函数对这个数据包进行一些操作
获取数据包名称
pkt.getName()
- 返回值:数据包名称
- 返回值类型:
String
获取数据包 ID
pkt.getId()
- 返回值:数据包 ID
- 返回值类型:
Integer
将二进制流数据读取到数据包
pkt.read(bs)
- 参数:
- bs :
BinaryStream源二进制流 - 返回值:是否成功
- 返回值类型:
Boolean
将数据包数据写入二进制流
pkt.write(bs)
- 参数:
- bs :
BinaryStream目标二进制流 - 返回值:是否成功
- 返回值类型:
Boolean
发送数据包到指定目标
Warning
此函数仅在 0.19.1 及以后版本可用
pkt.sendTo(pos)
pkt.sendTo(x,y,z,dimid)
pkt.sendTo(target)
-
参数:
-
pos :
IntPos/FloatPos
数据包发送目标所在坐标(或者使用 x, y, z, dimid 来确定目标位置) -
target :
Player/Entity
数据包发送目标 -
返回值:是否成功
- 返回值类型:
Boolean
如果 target 是 Player,则数据包会发送到指定玩家。
如果 target 是 Entity,则数据包会发送到指定实体周围的玩家。
发送数据包到所有客户端
Warning
此函数仅在 0.19.1 及以后版本可用
pkt.sendToClients()
- 返回值:是否成功
- 返回值类型:
Boolean
发送数据包到服务端
Warning
此函数仅在 0.19.1 及以后版本可用
pkt.sendToServer()
- 返回值:是否成功
- 返回值类型:
Boolean
🔌 二进制流对象 API
创建一个二进制流对象
[JavaScript] new BinaryStream()
[Lua] BinaryStream()
- 返回值:二进制流对象
- 返回值类型:
BinaryStream
二进制流对象 - 函数
每一个二进制流对象都包含一些可以执行的成员函数(成员方法)。对于某个特定的实体对象bs,可以通过以下这些函数对这个二进制流进行一些操作
重置二进制流
bs.reset()
- 返回值:是否成功
- 返回值类型:
Boolean
获取二进制流读指针
Warning
此函数仅在 0.19.1 及以后版本可用
bs.getReadPointer()
- 返回值:当前读指针
- 返回值类型:
Integer
设置二进制流读指针
Warning
此函数仅在 0.19.1 及以后版本可用
bs.setReadPointer(pos)
-
参数:
-
pos :
Integer
新的读指针 -
返回值:是否成功
- 返回值类型:
Boolean
获取二进制流数据
Warning
此函数的可选参数和 ByteBuffer 返回值仅在 0.19.1 及以后版本可用
bs.getData([release])
-
参数:
-
release :
Boolean(可选参数)
获取后是否清空流数据。默认值为false -
返回值:二进制流数据
- 返回值类型:
ByteBuffer
在 0.19.1 之前,此函数只能使用 bs.getData() 形式调用。
当时它在获取后总是会清空流数据,且返回值类型为 String。
由于旧版返回的是 String,在 JavaScript 中可能会被强制按 UTF-8 编码处理,导致二进制数据损坏,拿到的数据不正确。
设置二进制流数据
Warning
此函数仅在 0.19.1 及以后版本可用
bs.setData(data)
-
参数:
-
data :
ByteBuffer
二进制流数据 -
返回值:是否成功
- 返回值类型:
Boolean
写入二进制流
bs.writexxxx(value)
-
参数:
-
value :
NULL
参考下面表格 部分数值写入函数也允许传入String -
返回值:是否成功
- 返回值类型:
Boolean
| 可用函数 | 参数类型 |
|---|---|
| writeBool | Boolean |
| writeByte | Integer / String |
| writeBytes (0.19.1 时加入) | ByteBuffer |
| writeDouble | Number / String |
| writeFloat | Float / String |
| writeSignedBigEndianInt | Number / String |
| writeSignedInt | Number / String |
| writeSignedInt64 | Number / String |
| writeSignedShort | Integer / String |
| writeString | String |
| writeUnsignedChar | Integer |
| writeUnsignedInt | Number / String |
| writeUnsignedInt64 | Number / String |
| writeUnsignedShort | Integer / String |
| writeUnsignedVarInt | Number / String |
| writeUnsignedVarInt64 | Number / String |
| writeVarInt | Number / String |
| writeVarInt64 | Number / String |
| writeVec3 | FloatPos |
| writeBlockPos (0.9.5 时加入) | BlockPos |
| writeCompoundTag | NbtCompound |
| writeItem (0.9.5 时加入) | Item |
| writeUuid (0.19.1 时加入) | String |
从二进制流读取
Warning
此类函数仅在 0.19.1 及以后版本可用。
bs.readxxxx([asString])
bs.readBytes(length)
其中 length 为 Integer 类型,仅 readBytes 可用,表示要读取的字节数,必须大于 0。
-
参数:
-
asString :
Boolean(可选参数) 仅数字读取函数可用。传入true时,返回值会转换为String -
返回值:
- 读取结果
| 可用函数 | 参数类型 | 返回值类型 |
|---|---|---|
| readBool | Boolean |
Boolean/ String |
| readByte | Boolean |
Number / String |
| readBytes | Integer |
ByteBuffer |
| readUnsignedChar | Boolean |
Number / String |
| readDouble | Boolean |
Number / String |
| readFloat | Boolean |
Number / String |
| readSignedBigEndianInt | Boolean |
Number / String |
| readSignedInt | Boolean |
Number / String |
| readSignedInt64 | Boolean |
Number / String |
| readSignedShort | Boolean |
Number / String |
| readString | 无 | String |
| readUnsignedInt | Boolean |
Number / String |
| readUnsignedInt64 | Boolean |
Number / String |
| readUnsignedShort | Boolean |
Number / String |
| readUnsignedVarInt | Boolean |
Number / String |
| readUnsignedVarInt64 | Boolean |
Number / String |
| readVarInt | Boolean |
Number / String |
| readVarInt64 | Boolean |
Number / String |
当 asString 为 true 时,数字 read* 函数返回 String;否则返回 Number。
通过二进制流构建数据包
Warning
此函数的可选参数仅在 0.19.1 及以后版本可用
bs.createPacket(pktid[,raw])
-
参数:
-
pktid :
Integer
数据包 ID -
raw :
Boolean(可选参数)
是否从当前二进制流数据创建原始网络数据包。默认值为false -
返回值:数据包对象
- 返回值类型:
Packet
在 0.19.1 之前,此函数只能使用 bs.createPacket(pktid) 形式调用。
演示代码
向一个玩家发送 TextPacket 数据包
| JavaScript | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 | |