BeDD 模式(transport: 'bedd')
本頁說明當 bedboo 不再自己處理協議、而是驅動由 Be.D.D. 託管的真實 Bedrock 客戶端(transport: 'bedd')時有哪些變化。
僅涉及 bedd 傳輸:使用 raknet / nethernet 時本頁內容均不適用。配置方法、權限歸屬表和覆蓋矩陣見
BeDD 指南。
真實客戶端負責自己的上行數據包
- 影響: 所有會發送數據包的 API;
bot._client.queue/write - Java: mineflayer 本身就是客戶端,所有數據包都由它自己寫出。
- Bedrock: 由 BeDD 託管的客戶端自己登錄、應答加載界面、請求區塊,並每 tick 自己發送
player_auth_input、方塊操作、 物品欄事務(inventory transaction)和物品堆疊請求(item stack request)。 - bedboo: 從不偽造這些數據包。一個路由器把 bedboo 原本要發送的內容轉換為 BeDD 控制操作(
input、look、slot、button、action、send、stack);屬於客戶端的數據包會被丟棄(見 權限歸屬表)。
bot.entity 跟隨客戶端,滯後 1-2 tick
- 影響:
bot.entity.position/velocity/yaw/pitch/onGround、physicsTick、move、bot.physicsEnabled、mineflayer-pathfinder - Java: mineflayer 的物理引擎每 tick 預測玩家狀態。
- Bedrock(bedd): 玩家由客戶端自己的物理引擎移動;tap 會回顯客戶端發出的每個
player_auth_input。 - bedboo: 物理提供者不自行步進,而是複製回顯(眼睛高度 − 1.62),每個客戶端 tick 觸發一次
physicsTick和move; 當回顯與目標的偏差在 0.5° 以內時,look/lookAt才 resolve。行走、pathfinder 目標和lookAt均可用;pathfinder 運行時有 1-2 tick 的延遲。
點擊落在客戶端準星所指之處
- 影響:
dig、placeBlock、activateBlock、activateEntity、attack - Java: mineflayer 在數據包中直接指定方塊 / 面 / 實體。
- Bedrock(bedd): 客戶端轉向目標並點擊;命中什麼由它自己的射線檢測決定。
- bedboo: 先轉向,等待視角收斂,再發送
button;結果從update_block和實體事件中讀取,因此點擊落到相鄰方塊上時 也能如實反映出來。
界面級操作通過客戶端的界面完成
- 影響:
bot.respawn(以及respawn選項)、bot.wake、bot.updateSign、bot.writeBook、bot.signBook - Java: bedboo 可以自己發送對應的數據包。
- Bedrock(bedd): 這些都是真實客戶端的界面:死亡界面、床界面、告示牌編輯器、書。
- bedboo: 通過 BeDD 的
ui操作點擊“重生”和“離開床”,並在告示牌編輯器中輸入文字(必要時先用一次使用點擊打開; 編輯的是客戶端正對的那一面)再點“完成”。書的頁面以 book_edit(97,在 BeDD 默認的sendAllow中)發送,書本界面用 ESC 關閉;setCommandBlock發送 command_block_update(78,同樣默認允許)。離開末地後的製作人員名單用 ESC 跳過,與無頭 bedboo 立即應答 show_credits 一致。數據包 ID 在sendAllow中時(56 block_entity_data、36 player_action),updateSign/wake改為直接發送數據包。兩者都不可用時,調用會拋出或 rejectBeddUnsupportedError(code: 'ERR_BEDD_UNSUPPORTED',missing例如['send:56', 'ui']);沒有ui時bot.respawn()只給出警告 (由用戶點擊重生)。見界面和 sendAllow。
沒有翻譯的數據包需要 sendAllow
- 影響: bedboo 沒有翻譯的數據包的
bot._client.write/queue(插件自己的數據包、set_default_game_type、 crafting_event……) - Java: mineflayer 可以寫任何數據包。
- Bedrock(bedd): 真實客戶端發送它自己的數據包;BeDD 的
send只發送 ID 在sendAllow中的其他數據包。 - bedboo: 這類數據包的 ID 在列表中(
bot.bedrock.bedd.sendAllow)時通過send發出,否則拋出指出需要加入哪個 ID 的BeddUnsupportedError。BeDD 的sendAllow為"*"時,客戶端不自己發送的所有 ID 都在列表中,這類數據包都能發出,與無頭 bedboo 一致。block_pick_request 會被翻譯(先轉向,再按選取鍵)。歸客戶端所有的數據包無論列表如何都會被丟棄。
物品欄操作需要 stack 操作
- 影響:
clickWindow、moveSlotItem、transfer、deposit、withdraw、putAway、craft、從主物品欄 / 盔甲 / 副手執行的equip、unequip、tossStack、creative.setInventorySlot、鐵砧 / 附魔臺 / 村民交易 / 鍛造臺 - Java: 窗口點擊。
- Bedrock(bedd): 物品堆疊請求必須經過客戶端的 ItemStackNetManager,否則客戶端的請求 id 和預測的物品欄會失去同步。
- bedboo: 啟用 BeDD 的
stack操作(allowStack: true)後這些調用可用,bedboo 的請求 id 會映射到客戶端的請求 id; 未啟用時它們會以ERR_BEDD_UNSUPPORTEDreject。
連接選項歸客戶端所有
- 影響:
createBot選項auth、username、host、port、viewDistance、skipPing;holdResourcePacks;bot.end、bot.quit - Java: 由 mineflayer 負責連接、認證和斷開。
- Bedrock(bedd): 客戶端已經(用它自己的賬號)登錄並處於某個世界中。
- bedboo:
host/port會讓客戶端先加入該服務器(BeDD 的join操作;無法加入時為ERR_BEDD_JOIN;本機以外的主機須在 BeDD 的allowHosts中,或allowHosts為["*"]以允許任意主機);viewDistance(以及setSettings)設置客戶端的渲染距離(settings);bot.quit讓客戶端離開當前世界(join host:null)後斷開附加,bot.end只斷開附加(客戶端仍留在它的世界中);auth和username會被忽略,每個各輸出一次警告(客戶端用它自己的賬號 登錄);holdResourcePacks不起作用。客戶端切換世界(LINK_DOWN)會結束 bot。bot 改為連接遊戲:bedd: { url, token }、{ pid }、{ instance }或{}(唯一一個正在運行的遊戲)通過 WebSocket 端點指定一個 BeDD v2 遊戲,端點公佈在 BeDD 的 run 文件中(%LOCALAPPDATA%\BeDD\run\<pid>.json);見選項。