驅動真實客戶端(BeDD)
通常情況下 bedboo 本身就是客戶端:它通過 RakNet 或 NetherNet 登錄基岩版專用服務器,並親自發送每一個數據包。使用
transport: 'bedd' 時,它改為驅動一個真實的 Minecraft 基岩版客戶端,該客戶端由
Be.D.D.(Bedrock Deep Dive,一個 LeviLamina 客戶端模組)託管。於是同一個腳本會作用於一個
真實的遊戲:你能看到本地玩家按照腳本的指示行走、轉頭、挖掘、放置和聊天。
const bedboo = require('bedboo')
const bot = bedboo.createBot({ transport: 'bedd', version: '1.26.60', bedd: {} }) // 唯一一个正在运行的 BeDD 游戏
bot.once('spawn', () => bot.chat('hello from bedboo'))兩種模式之間的切換隻取決於 transport;直連 BDS 的模式(raknet、nethernet)保持不變。該模式的差異逐條列在
BeDD 模式中。
安裝配置
僅支持 Windows(BeDD 是 Windows 客戶端模組);需要 Node 24 或更高版本。bedboo 需要 BeDD v2,它通過本機 WebSocket
提供每個遊戲;不再支持 BeDD v1(命名管道 \\.\pipe\BeDD)。
-
安裝 BeDD v2(見 BeDD 文檔),並用它啟動一個遊戲:
shBeDD.exe launch --slot 2BeDD 讓每個遊戲運行在你的 LeviLauncher 實例的獨立副本中(
%LOCALAPPDATA%\BeDD\instances\<base>-<slot>),並在監聽期間 於%LOCALAPPDATA%\BeDD\run\<pid>.json($BEDD_HOME可移動該目錄)中公佈它:{ "protocol": 2, "kind": "client", "pid", "url": "ws://127.0.0.1:<port>/v1", "token", "instance", "label", … }。 bedboo 讀取這個文件來連接;token 是唯一的憑據。 -
bedboo 用到的一切在 BeDD v2 中都默認開啟(以 token 為邊界)。遊戲的
mods\BeDD\config\config.json中與 bedboo 相關的鍵:鍵 默認值 作用 bedboo 用它來 taptruetap:所有客戶端方向(clientbound)的數據包、所有服務端方向(serverbound)數據包的回顯、標記,以及一份加入日誌 一切功能(沒有它 bedboo 無法附加) tapLoopbacktrue監聽單人 / 局域網主機世界(迴環鏈路,數據包經重新序列化) 單人遊戲 tapJournalMiB128回放給後附加客戶端的加入日誌的大小上限 在會話中途附加(超過上限時為 complete:false)gameHookstrueworld、look和input操作(掛鉤到遊戲自身的輸入管線)精確的移動和視角(沒有它:使用虛擬按鍵和鼠標) allowSendtrue針對白名單中數據包 ID 的 send操作(sendAllow,默認[9, 77, 78, 97]= text、command_request、command_block_update、book_edit)bot.chat、私聊、命令;以及你加入白名單的其他數據包(見 sendAllow)allowStacktruestack操作:通過客戶端自身的 ItemStackNetManager 提交 item_stack_request物品欄:clickWindow、transfer、craft、deposit/withdraw、從主物品欄裝備、創造模式 uitrueui操作:把遊戲界面讀成節點樹,按 ref 點擊和輸入文字respawn、wake、updateSign、關閉書本界面(界面)wsPort0WebSocket 端口(0:任意空閒端口,從 run 文件中讀取) bedd.urlwsMaxClients8同時允許打開的 WebSocket 連接數(bedboo 使用兩個) 讓 bedboo 與 BeDD 管理器及其他測試工具並存 設為
false的鍵會關閉對應操作:bedboo 會把它視為disabled並使用兜底方案(見支持範圍表)。pipeName和pipeInstances已隨管道一起移除。loopbackOnly(BeDD 自己的配置項)讓客戶端只連接本機(127.0.0.1)上的服務器。本機以外的服務器需要 BeDD 的 Remote 模式:BeDD.exe mod config <instance> --world-mode Remote --server-host <host>讓客戶端能訪問該主機,--server-host '*'(配置"allowHosts": ["*"])則允許任何由join(見下文host)指定的主機,無需重啟;本機以外的其他主機仍不可達。客戶端通過 NetherNet 加入 BDS, 因此請以transport=nethernet啟動服務器;NetherNet 加入要經過 Minecraft 的在線信令服務,所以在客戶端加入和 遊戲期間,這臺電腦上不能再啟動其他 Minecraft 遊戲(後續的登錄會把當前會話擠掉:"Multiplayer Connection Failed … NetherNet")。 -
讓玩家進入一個世界(服務器、局域網世界或單人遊戲):bedboo 附加到一個已經在遊戲中的客戶端上,它不負責登錄。
-
createBot({ transport: 'bedd', version: '1.26.60', bedd: {} }),其中version是遊戲的協議族(否則 tap 的 HELLO 會被拒絕;該模式下默認為 BeDD v2 所運行的遊戲版本1.26.60)。bedd: {}選擇唯一一個正在運行的 BeDD 遊戲;有多個時請指明其中一個(見選項)。加入日誌回放 完成後觸發spawn;從此bot.*反映的就是客戶端的狀態。
bedd_follow.js 示例讓客戶端跟隨最近的其他玩家:
node examples/bedd_follow.js # 唯一一个正在运行的 BeDD 游戏
node examples/bedd_follow.js --instance <instance> # 或 --pid <pid>工作原理
真實客戶端對它發送的一切保持權威:登錄、資源包、加載界面、區塊請求、每 tick 的 player_auth_input(包括物理)、方塊操作、
物品欄事務和物品堆疊請求。bedboo 從不偽造這些數據包。它的整個棧依然運行,而它原本要發送的內容會變成交給客戶端的意圖。
兩個方向都經過遊戲的 BeDD WebSocket(ws://127.0.0.1:<port>/v1?token=…),使用兩個連接:
script → mineflayer API → plugins → _client.queue → router ──(JSON text frames)───→ WebSocket 1 (control) → the game's input pipeline
bot.* state ← plugins ← decoder ← tap reader ←──(binary frames)──────── WebSocket 2 (tap subscribe) ← every packet the client gets / sends- 狀態輸入: 第二個連接發送
{ op: 'tap', action: 'subscribe' },之後每個 tap 幀作為一條二進制消息到達:客戶端收到的 每一個客戶端方向數據包、它發送的每一個服務端方向數據包的回顯,以及 JSON 標記(HELLO、LINK_UP/LINK_DOWN、REPLAY_BEGIN/REPLAY_END、DROPPED)。bedboo 用 bedrock-protocol 解碼它們,方式與直連模式完全相同,因此bot.entities、世界、物品欄、聊天以及每一個事件都來自真實會話。一份加入日誌(從start_game開始,經過壓縮:每個位置 只保留最新的區塊,每個實體只保留最新的屬性,已移除的實體會被剔除)會回放給每個新的訂閱者,因此 bedboo 可以在會話中途附加。 tap 同一時間只有一個訂閱者(第二個會得到code: 'busy')。如果 bedboo 落後超過 32 MiB,BeDD 會發送DROPPED並關閉連接; 機器人以bedd_dropped結束,新建的機器人會獲得完整回放。 - 自身狀態:
bot.entity的位置、速度、偏航角、俯仰角和 onGround 跟隨回顯的player_auth_input(眼睛高度 − 1.62)。physicsTick和move每個客戶端 tick 觸發一次;bedboo 自己的物理引擎不會步進。 - 意圖輸出: 路由器對比 bedboo 原本要發送的內容,並調用 BeDD 的控制操作:
input(移動向量、跳躍、潛行、疾跑,帶有失效保護 TTL)、look(絕對偏航角/俯仰角)、slot、button(攻擊/使用/選取,挖掘時方塊變化即釋放)、action(丟棄、物品欄……)、send(白名單內的數據包字節:text/command_request,以及你加入sendAllow的任何 ID)、stack(通過客戶端的 ItemStackNetManager 發送 item_stack_request)、ui(客戶端的界面:重生、離開床、告示牌編輯器)以及join(createBot 的host)。 只有在遊戲佔有鼠標且沒有打開菜單時,輸入才會生效。請求是{ id, op, … }文本幀,按順序應答,同一時間只有一個在途。 - 協商: 附加時,bedboo 會 ping 控制連接(BeDD v2 應答
protocol: 2、defaultMode: 'bedboo'和modes,即每種操作模式 的操作列表),並以不帶參數的方式探測每個操作:unknown op(或不在modes中)→ 不存在(absent),code:'disabled'→ 存在但在 config.json 中被關閉,ok→ 存在(present)。bot.bedrock.bedd.caps保存探測結果,bot.bedrock.bedd.supports(name)按 mineflayer API 逐項給出答案。
權威歸屬表
| 類別 | 數據包 | 處理方式 |
|---|---|---|
| clientOwned | login, client_to_server_handshake, request_network_settings, resource_pack_client_response, client_cache_status, client_cache_blob_status, subchunk_request, serverbound_loading_screen, set_local_player_as_initialized, network_stack_latency, tick_sync, player_skin, emote_list, respawn, player_action (dimension_change_ack / start_item_use_on / stop_item_use_on / respawn), animate, show_credits, interact mouse_over_entity | 被路由器丟棄(客戶端會自己發送);計入統計。對應的 API:bot.swingArm → action swing,bot.respawn → ui(重生),製作人員名單 → 在 credits_screen 上按 ESC,bot.quit → join host:null |
| translated | player_auth_input(move_vector 和標誌 → input;yaw/pitch → look;block_actions start_break / abort_break / stop_break → button attack)、mob_equipment(→ slot)、inventory_transaction(item_use click_block / click_air、item_release、item_use_on_entity → look + button)、interact open_inventory(→ action inventory)、container_close(→ ESC)、item_stack_request(→ stack) | 轉換為控制操作 |
| shared | text, command_request | 以字節形式通過 send 發送(保留命令 uuid,因此 command_output 能對應上);兜底方案:T / SLASH 鍵、text、ENTER |
| allowlisted | book_edit, command_block_update | 通過 send 原樣發送(在 BeDD 默認的 sendAllow 中) |
| unsupported | crafting_event, set_default_game_type,以及其他所有數據包 | 其 ID 在 BeDD 的 sendAllow 中時通過 send 原樣發送(見下文);否則拋出 BeddUnsupportedError(code: 'ERR_BEDD_UNSUPPORTED'),錯誤信息會指出需要加入的 ID |
另外 block_pick_request 會被翻譯(look + button pick),interact leave_vehicle 翻譯為一次潛行,request_chunk_radius 翻譯為
settings renderDistance;player_action stop_sleeping 和告示牌的 block_entity_data 屬於 screens 類:ui 點擊“離開床” /
告示牌編輯器,ID 在 sendAllow 中時也可原樣 send。機器人自己的 respawn / player_action respawn 仍歸客戶端所有:bot.respawn()
改為點擊死亡界面的“重生”按鈕,由客戶端自己發送這些數據包。
支持範圍
“Caps” 列出該 API 所需的 BeDD 操作;缺少它們時 bot.bedrock.bedd.supports(name) 為 false,調用會拋出或以
ERR_BEDD_UNSUPPORTED 拒絕(或使用所列的兜底方案)。
| API | 是否可用 | caps(兜底方案) |
|---|---|---|
spawn、login、遊戲事件、bot.game、時間、天氣、生命值、飢餓值、經驗 | 可用,來自 tap | tap |
bot.entities、bot.players、方塊與世界(blockAt、findBlocks、射線檢測、waitForChunksToLoad) | 可用,來自 tap | tap |
| chat / message / messagestr 事件、標題、Boss 欄、計分板、Tab 列表、聲音、粒子、爆炸 | 可用,來自 tap | tap |
bot.inventory、heldItem(讀取) | 可用 | tap |
bot.entity 的位置 / 速度 / 偏航角 / 俯仰角 / onGround | 可用,來自回顯的 player_auth_input(落後 1-2 tick) | tap |
setControlState、getControlState、clearControlStates | 可用 | input(虛擬 W/A/S/D/SPACE/SHIFT/CTRL 鍵) |
| mineflayer-pathfinder、collectblock、pvp | 可用,通過控制狀態、視角和攻擊實現 | input、look |
look、lookAt | 可用;回顯收斂(< 0.5°)時完成 | look(閉環 raw 鼠標) |
setQuickBarSlot、裝備(equip)快捷欄中的物品 | 可用 | slot(按鍵 1-9) |
chat、whisper、命令 | 可用,保留 uuid | send(T/SLASH + text + ENTER,丟失 uuid) |
dig、stopDigging | 可用;客戶端上顯示裂紋動畫,在 update_block → air 時完成 | look、button(mouse) |
placeBlock、activateBlock、activateItem、deactivateItem、consume、弓 | 可用(先轉向,再使用) | look、button |
attack、activateEntity、mount、dismount | 可用 | look、button、input |
用 toss 丟出手持物品 | 可用 | action(drop / dropAll) |
openContainer、openChest、openFurnace、closeWindow | 可用(關閉 = ESC) | look、button |
clickWindow、moveSlotItem、transfer、deposit、withdraw、putAway、craft、從主物品欄 / 盔甲欄 / 副手 equip、unequip、tossStack、creative.setInventorySlot、鐵砧 / 附魔臺 / 村民 / 鍛造臺 | 可用,通過客戶端的 ItemStackNetManager | stack(無兜底:ERR_BEDD_UNSUPPORTED) |
respawn(以及 respawn 選項) | 可用:點擊死亡界面的“重生”按鈕 | ui(無:不做任何事並給出警告) |
sleep、wake | 可用:睡覺是對床的一次使用點擊,起床點擊床界面的“離開床” | look、button;wake:ui,或 sendAllow 含 36 的 send |
updateSign | 可用:在客戶端的告示牌編輯器中輸入(未打開時先用一次使用點擊打開),再點“完成” | ui,或 sendAllow 含 56 的 send |
writeBook、signBook | 可用:用一次使用點擊打開書,頁面以 book_edit 發送,再用 ESC 關閉書本界面 | button,以及 sendAllow 含 97 的 send(BeDD 默認) |
setCommandBlock | 可用,以 command_block_update 發送 | sendAllow 含 78 的 send(BeDD 默認) |
swingArm | 可用('left' 在本客戶端上揮副手;animate 在網絡上不帶手) | 帶 swing 的 action(無:不做任何事並給出警告) |
setSettings({ viewDistance })、viewDistance 選項 | 可用:客戶端的渲染距離(服務器可能給得更多) | settings(無:忽略並給出警告) |
| 離開末地後的製作人員名單 | 與無頭 bedboo 一樣跳過:credits_screen 顯示時按 ESC | world、key |
物品欄重新同步(inventory_mismatch) | 不做任何事:物品欄由客戶端負責 | — |
block_pick_request(插件自己的 _client.write) | 可用:轉向方塊並按下選取鍵 | look、button |
插件的其他 _client.write / queue | 其數據包 ID 在 sendAllow 中時可用;sendAllow: "*" 時任何不歸客戶端所有的 ID 都可用 | send |
host、port 選項 | 客戶端先加入該服務器(本機以外:BeDD 的 allowHosts 列出該主機,或為 "*") | join |
bot.quit | 客戶端離開當前世界(回到標題界面),然後機器人斷開附加 | join(無:只斷開附加並給出警告) |
bot.end | 僅斷開附加;客戶端留在原世界 | — |
auth、username 選項 | 忽略並給出警告(客戶端用它自己的賬號登錄) | — |
說明:activateItem(true)(副手)會使用主手:基岩版沒有副手的使用輸入(副手只被動生效:潛行時舉盾、圖騰、地圖);對不需要按住使用的物品(投擲物、釣魚竿)調用
activateItem 相當於單擊一次;沒有 ui 時 bot.respawn() 不做任何事並給出警告(因此 respawn: true 永遠不會從生命值監聽器中
拋出);告示牌編輯器編輯的是客戶端正對的那一面,因此編輯器顯示正面時 updateSign(block, text, true)(背面)會給出警告;bot.craft 保留了上游的 new Error(err) 包裝,因此在界面層沒有先拒絕的情況下,請檢查那裡的 err.message。
降級之處:pathfinder 會感受到 1-2 tick 的延遲(預測會被回顯覆蓋);點擊命中什麼由客戶端自己的射線檢測決定,因此操作可能落在相鄰
的方塊或實體上(bedboo 會通過 update_block / 實體事件看到);飛行通過雙擊跳躍實現;打開界面時輸入暫停;後附加依賴加入日誌
(complete:false → 缺失的區塊要重新進入才會出現);客戶端切換世界會結束機器人(LINK_DOWN)。
界面
BeDD v2 的 ui 操作把遊戲的 JSON UI 界面讀成帶 ref 的節點樹(role、name、text、state),並按 ref 點擊節點或向其輸入
文字。lib/bedd/screens.js 用它完成客戶端只有在用戶操作界面時才會做的事:
| API | 節點 |
|---|---|
bot.respawn()(respawn 選項在死亡時調用它) | 名稱或文字含 “respawn” 的按鈕(死亡界面的 respawn_button) |
bot.wake() | 含 “wake”、“leave bed” 或 “stop sleeping” 的按鈕(床界面的 wake_up_button “Leave Bed”) |
bot.updateSign(block, text) | 告示牌界面的文本框,然後是它的“完成”按鈕(沒有則按 ESC) |
bot.writeBook / signBook | bedboo 鬆開書時,在書本界面上按 ESC |
每個操作都會重新讀取節點樹,直到節點出現(10 秒),遇到 stale_snapshot、stale_ref 或 occluded 時也會重新讀取。同樣的
輔助函數可以驅動任何其他界面:bot.bedrock.bedd.screens.click(node => node.role === 'button' && /play/i.test(node.text ?? ''))、
screens.setText(matcher, text),以及讀取原始快照的 screens.read()。
sendAllow
send 只會發送遊戲 sendAllow(config.json,自 BeDD 的對齊操作起默認 [9, 77, 78, 97],之前為 [9, 77])中的數據包 ID;1、30、144 和 147(login、
inventory_transaction、player_auth_input、item_stack_request)始終被拒絕。bedboo 從 send 的探測結果中讀取這個列表
(bot.bedrock.bedd.sendAllow),任何沒有操作可以翻譯、但 ID 在列表中的數據包都會原樣發出。相關的 ID 如下(其他 ID 可對你掌控的服務器自行加入):
| ID | 數據包 | 隨之可用的功能 |
|---|---|---|
| 97 | book_edit | bot.writeBook、bot.signBook(默認) |
| 78 | command_block_update | bot.setCommandBlock(默認) |
| 56 | block_entity_data | bot.updateSign 直接發送數據包(任意一面,不經編輯器),而不是通過告示牌編輯器 |
| 36 | player_action | bot.wake 直接發送數據包,而不是點擊“離開床”(以及插件發送的任何 player_action) |
| 105 | set_default_game_type | 插件自己的 _client.write('set_default_game_type', …) |
無論 sendAllow 如何設置,歸客戶端所有的數據包(見權限表)仍會被丟棄。
"sendAllow": "*"(BeDD.exe mod config <instance> --set sendAllow=*)讓 send 接受除客戶端自己發送的數據包
(login、握手、player_auth_input、inventory_transaction、item_stack_request、區塊與緩存請求、加載界面、respawn、animate……)
之外的所有 ID,與無頭 bedboo 可以寫任何數據包一致。此時探測結果的 allow 會逐個列出所有允許的 ID(因此
bot.bedrock.bedd.sendAllow 是完整列表),並帶有 allowAll: true。不是客戶端自己發出的數據包可能讓它和服務器的狀態
對不上:請只在你掌控的服務器上使用。
單人遊戲與局域網世界
開啟 tapLoopback(tap 開啟後默認即開啟)時,BeDD 還會監聽客戶端自己託管的世界:單人遊戲或局域網世界。這些數據包從不經過
網絡,因此 BeDD 會將它們重新序列化(Packet::write,幀標誌 reserialized),並過濾為只與本地玩家相關的內容,這樣局域網訪客的
流量不會混入。支持範圍表中的一切都照常工作;HELLO 標記中為 link.type: 'local'。
安全性
- token 是邊界。 BeDD v2 只監聽 127.0.0.1,並拒絕沒有遊戲 token 的連接(HTTP 401)或帶有
Origin頭的連接(403, 因此網頁無法訪問它)。token 位於你的%LOCALAPPDATA%下的 run 文件中:任何以你的 Windows 用戶身份運行的程序都能讀取它並 驅動遊戲。bedboo 以?token=發送它,並且從不發送Origin。 - tap 會暴露整個會話。 訂閱者可以讀取已登錄玩家看到和做的一切:聊天、位置、物品欄、世界。
send、stack和ui以該賬號的身份行事。send以已登錄玩家的身份發送聊天和命令(以及你加入sendAllow的 任何數據包),stack移動其物品,ui點擊它的界面。send僅限sendAllow中的 ID(默認[9, 77, 78, 97];"*":客戶端不自己發送的所有 ID),login、player_auth_input、物品堆疊等 ID(1、30、144、147)始終被拒絕。在不應允許它們的實例中,把allowSend/allowStack/ui設為false。- 讓用於自動化的 BeDD 遊戲運行在各自的實例中(
BeDD.exe launch --slot <n>就是這樣做的),不要使用你主賬號的世界。
選項與 bot.bedrock.bedd
createBot({ transport: 'bedd', version, bedd }),其中 bedd 為以下之一:
bedd | 連接到 |
|---|---|
{} | 唯一一個正在運行的 BeDD 遊戲客戶端(有多個時會報錯並列出它們) |
{ pid } | 該進程 ID 的 BeDD 遊戲 |
{ instance } | 該實例目錄的 BeDD 遊戲(例如 '1.26.60.05-2',即 run 文件中的 instance) |
{ url, token } | 原樣使用該端點(例如你自己從 run 文件中讀取) |
以及任何形式都可附加的:
| 選項 | |
|---|---|
bedd.home | 查找時使用的 BeDD 主目錄(默認為 $BEDD_HOME,否則為 %LOCALAPPDATA%\BeDD) |
bedd.timeoutMs | 控制請求超時,也是連接超時(默認 5000 ms;操作自帶的 timeoutMs 會再多給 2 秒) |
bedd.modules | 要附加的 lib/bedd 模塊(默認按以下順序:authority、router、router_actions、follower、surface、inventory、screens) |
bedd.joinTimeoutMs | host 加入服務器的最長時間(默認 60000 ms) |
bedd.WebSocket | WebSocket 類(默認為 Node 的全局 WebSocket) |
host / port(createBot 選項,port 默認 19132)會讓客戶端在 bedboo 附加前先加入該服務器(帶 wait 的 BeDD join
操作);已在該服務器上游玩的客戶端保持不動。沒有 join 操作,或客戶端放棄加入(join_failed;not_allowed:主機不在本機且
loopbackOnly 阻止了它:不在 BeDD 的 allowHosts 中,或 allowHosts: ["*"] 時主機無法解析)時,機器人發出 'error'(code: 'ERR_BEDD_JOIN',reason 為 BeDD 的錯誤碼)並結束。
bot._client.bedd.joined 保存 join 的應答。
進程已不存在(遊戲崩潰)的 run 文件會被跳過。沒有匹配的遊戲時,機器人發出 'error'(code: 'ERR_BEDD_DISCOVERY')並結束。
bedd.pipe、bedd.tapPipe 和 bedd.connect(BeDD v1)會拋出錯誤並指出上述選項;仍然應答的 BeDD v1 會以 ERR_BEDD_PROTOCOL
被拒絕("BeDD v1 uses named pipes; upgrade BeDD")。
bot._bedrock.mode === 'bedd'。bot.bedrock.bedd.url/endpoint:正在使用的 WebSocket(不含 token),以及來自 run 文件時遊戲的pid、instance、label。bot.bedrock.bedd.control:ping的protocol(2)、pid、defaultMode和modes({ bedboo: [...], input: [...], ui: [...] })。bot.bedrock.bedd.caps:{ [op]: 'present' | 'disabled' | 'absent' },涵蓋tap、world、look、input、slot、button、action、send、stack、join、ui、settings(經過探測;ui只讀取一個節點),以及ping.modes列出的其他操作 (key、text、mouse、raw、screenshot……)。沒有控制連接時,所有操作都是absent,機器人只能觀察。bot.bedrock.bedd.sendAllow:send接受的數據包 ID(探測結果中的allow),沒有send時為null。bot.bedrock.bedd.screens:界面輔助函數(read、find、click、setText、respawn、wake、editSign、idle)。bot.bedrock.bedd.supports(name):在當前 caps 下,某個 mineflayer API('dig'、'craft'、'creative.setInventorySlot') 或 BeDD 操作是否可用。bot.bedrock.bedd.observed:最近一次回顯的player_auth_input的{ yaw, pitch, tick },在第一次回顯之前為null。- 錯誤:
BeddUnsupportedError(code: 'ERR_BEDD_UNSUPPORTED'、bedd: true、feature、missing;missing中的'send:97'表示需要sendAllow含 97 的send);不支持的數據包還會在bot上發出'bedd_unsupported_packet'{ name, feature },每個名稱只發一次。機器人'error'上的連接錯誤:ERR_BEDD_DISCOVERY、ERR_BEDD_CONNECT(被拒絕、token 錯誤、已離開)、busy(另一個客戶端佔用著 tap)、disabled(tap: false)、ERR_BEDD_PROTOCOL/ERR_BEDD_HELLO(BeDD 或遊戲版本不同)、ERR_BEDD_JOIN(無法加入host)。 - 除常規事件外的客戶端事件:
'serverbound'{ name, params, reserialized }(客戶端發送的內容)、'bedd_marker'(tap 標記) 和'warning'(某個數據包解碼失敗;數據流繼續)。
路線圖
- 駕駛 / 傀儡模式(抑制、注入並鎖定姿態),前提是證明鎖定能在客戶端的狀態校正中保持住。
- 客戶端切換世界(
LINK_DOWN→LINK_UP)時跟隨過去,而不是結束機器人。 - 第二個分屏子客戶端。