🎓 數據包 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 / String |
| 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 / String |
| 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 數據包
mc.listen("onChat", (player, message) => {
const text = "LLSE Packet Test";
const bs = new BinaryStream();
bs.reserve(text.length + 8);
bs.writeBool(false);
bs.writeByte(/* TextPacketPayload::mBody::MessageOnly (Variant Index) */0);
bs.writeByte(/* TextPacketType::Raw (Enum) */0);
bs.writeString(text);
bs.writeString(""); // xuid
bs.writeString(""); // platformId
bs.writeString(""); // filtered message
bs.createPacket(9).sendTo(player);
});