跳到正文
本頁目錄

🎓 數據包 API

下面這些對象與 API 為腳本提供了基本的 BDS 數據包接口。

溫馨提示:此類 API 需要部分逆向基礎,瞭解數據包結構(可通過參考 Nukkit,PokcetMine,BDS 逆向得知數據包結構)如出現客戶端崩潰,為數據包結構錯誤,並非 BUG。

文檔不列出數據包 ID 與其結構,請自行查詢。

目錄

🔉 數據包對象 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

可用函數參數類型
writeBoolBoolean / String
writeByteInteger / String
writeBytes (0.19.1 時加入)ByteBuffer
writeDoubleNumber / String
writeFloatFloat / String
writeSignedBigEndianIntNumber / String
writeSignedIntNumber / String
writeSignedInt64Number / String
writeSignedShortInteger / String
writeStringString
writeUnsignedCharInteger / String
writeUnsignedIntNumber / String
writeUnsignedInt64Number / String
writeUnsignedShortInteger / String
writeUnsignedVarIntNumber / String
writeUnsignedVarInt64Number / String
writeVarIntNumber / String
writeVarInt64Number / String
writeVec3FloatPos
writeBlockPos (0.9.5 時加入)BlockPos
writeCompoundTagNbtCompound
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

  • 返回值:

  • 讀取結果

可用函數參數類型返回值類型
readBoolBooleanBoolean/ String
readByteBooleanNumber / String
readBytesIntegerByteBuffer
readUnsignedCharBooleanNumber / String
readDoubleBooleanNumber / String
readFloatBooleanNumber / String
readSignedBigEndianIntBooleanNumber / String
readSignedIntBooleanNumber / String
readSignedInt64BooleanNumber / String
readSignedShortBooleanNumber / String
readString無String
readUnsignedIntBooleanNumber / String
readUnsignedInt64BooleanNumber / String
readUnsignedShortBooleanNumber / String
readUnsignedVarIntBooleanNumber / String
readUnsignedVarInt64BooleanNumber / String
readVarIntBooleanNumber / String
readVarInt64BooleanNumber / 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
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);
});