生態插件補丁
mineflayer 生態插件在 bedboo 上無需修改即可運行,只有 patches/ 中的少量 pnpm patch(patches/mineflayer-*.patch)
例外。本頁說明每個補丁改了什麼、為什麼改,並記錄這些插件在 Bedrock 上與 Java 表現不同之處(以及有用的變通做法)。推薦用法見
插件。觀測環境為 BDS 1.26.51.1(協議 2193)。
mineflayer-pathfinder 2.4.5 補丁
- 影響:
Movements、bot.pathfinder.bestHarvestTool、goto、stop、路徑執行器(monitorMovement、fullStop、postProcessPath);以及基於它構建的一切(mineflayer-collectblock、mineflayer-pvp、mineflayer-tool 的箱子取工具) - Java: 方塊名集合使用 Java 名稱;門會被挖穿(只有柵欄門能打開,上游默認關閉
canOpenDoors);fullStop()通過移動bot.entity.position讓 bot 重新居中(“服務器察覺不到差別”);挖掘成本來自 prismarine-block 的block.digTime,使用 工具簡化後的 NBT。 - Bedrock: 方塊名稱不同(
flowing_water/flowing_lava是獨立的方塊,web、wooden_door、fence_gate、standing_sign、lit_furnace……——lib/interactable.json只認識 Java 名稱);服務器權威的移動會糾正客戶端對位置的任何 改動(重新居中會使每次搭橋產生 3–4 次 0.16–0.64 格的糾正,見 搭路);Bedrock 物品把附魔保存在ench中(數字 id),且 BDS 使用 Bedrock 的急迫 / 挖掘疲勞係數(挖掘速度)。 - bedboo(補丁,新文件
lib/bedrock.js+ 若干修改):- 名稱:
flowing_water/flowing_lava加入liquids和replaceables,flowing_lava加入blocksToAvoid; 充滿水的方塊(seagrass、kelp、bubble_column……)和含水方塊算作液體,後處理的路徑會在其中居中(反向移植上游 master #384);interactable.json加入 156 個可交互方塊的 Bedrock 名稱(與lib/bedrock/placement.js同一集合), 因此 pathfinder 對著它們放置前也會潛行(潛行放置); - 門和柵欄門:
openable除柵欄門外還包含可徒手打開的門(wooden_door、spruce_door……、銅門;鐵門除外);啟用canOpenDoors時,關著的門會變成一次useOne點擊(門的上半部分不會被挖掉),開著的門 / 柵欄門(open_bit,Java 中為open)可以通過,且不會再被點擊;門口節點取地面中心,useOne節點不再中止路徑後處理(反向移植 master #372); 點擊後執行器繼續行走(上游會讓placing保持置位,隨後讀取 undefined 的placingBlock.y,或因缺少搭路方塊而重置路徑)。 BDS 只打開門的下半部分(上半部分的open_bit保持為 0):上半部分由 bedboo 的blockAt()賦予打開門板的形狀 (門的兩半),因此 bot 能穿過自己打開的門走回來,而不是找不到路徑或把門挖掉; fullStop()保留上游清零水平速度的做法,但當 bot 有bot._bedrock.physics(服務器權威移動)時跳過重新居中的瞬移。 實測:pathfinder 搭橋 0 次糾正(原為 3–4 次);偶爾在 BDS 不接受清零速度時最多出現一次約 0.24 格的糾正(只鬆開按鍵 會讓 bot 漂出目標方塊);- 挖掘成本(
bestHarvestTool、safeOrBreak):使用item.enchants(Java 的Enchantments和 Bedrock 的ench都適用;簡化後的 NBT 中是id,prismarine-block 從未匹配上),以及存在時使用bot._bedrock.digging.blockDigTime(Bedrock 效果係數;否則使用 prismarine-block 的digTime); - 反向移植 master #375:空閒時調用
stop()不再被鎖存(以前它會停掉下一個目標),goto在搜索失敗且結果為空時以NoPathreject,而不是 resolve。mineflayer-collectblock 的cancelTask()依賴這個鎖存(它在挖掘期間 pathfinder 空閒時 調用stop()):它的補丁現在自己處理取消(mineflayer-collectblock); lib/passableEntities.json也列出了可穿過實體的 Bedrock 名稱(xp_orb、xp_bottle、splash_potion、lingering_potion、fireworks_rocket、thrown_trident、fishing_hook、evocation_fang、wind_charge_projectile、breeze_wind_charge_projectile、ender_crystal、eye_of_ender_signal、ominous_item_spawner、wither_skull_dangerous):只有 Java 名稱時,經驗球和彈射物被當成障礙物(產生實體成本,經驗球所在處不會墊高或搭路);detectDiggingStopped只移除它自己的監聽器(removeAllListeners(event, fn)會忽略fn,把 bot 上所有其他diggingCompleted/diggingAborted監聽器都刪掉);- 當 bot 被推離其已完成路徑的計算起點超過一格時,動態目標(
GoalFollow)會重新規劃(骷髏的箭把一個 mineflayer-pvp bot 永久推出了攻擊範圍:目標本身移動的距離還不足以讓hasChanged()成立); - 放置失敗不再讓路徑卡死(上游 2.4.5 和 master d773d15 都會卡死——master 中未合併的 PR #365 只是移動了無效判斷;任何
服務器都一樣,包括 Java):
- 上游:搭路方塊的
bot.equip被拒絕後,lockEquipItem永遠不會釋放,執行器在每個 tick 都在無效判斷之前提前返回, 再也恢復不了;被拒絕的放置會把路徑重置到同一個放置上,無限循環;stop()等待一個永遠不會到來的節點或重置; - 現在裝備鎖從裝備開始一直持有到放置結束,並在任何結果下都會釋放;
- 失敗的裝備 / 放置 / 開門點擊(
equip_error、place_error、use_error),或耗時超過placeTimeout(10 s,place_timeout)的操作,會計入對應格子:失敗次數超過maxPlaceRetries(1)的格子會加入bot.pathfinder.refusedPlacements,在當前目標下Movements#getNeighbors不會再在這些格子上規劃放置(再次設置同一個 目標對象——即調用方的重試——會保留它們;設置其他目標或stop()會清空); - 連續
maxPlaceFailures(6)次失敗則放棄目標(path_update'noPath',goto以NoPath"… placements failed in a row" reject;除非是動態目標,否則該目標會被丟棄,之後的重置也不會讓它復活); - 放置過程中的
stop()在下一個 tick 結束;被 stop / 重置 / 新目標放棄的放置即使遲遲結束也不會改變任何東西(也不會 釋放更新的放置所持有的鎖);放置後走回returnPos的過程與走向節點一樣有時限; - 失敗後 bot 會退回到它探出身子時所站的方塊上;當 bot 向下取整後的位置位於空隙上方時,搜索從 bot 所站的方塊開始(上游從
空隙上方的格子開始,並計劃對著其下方的空氣放置——在橋邊停下後,下一次
goto會在這上面耗費 2 × 10 s)。
- 上游:搭路方塊的
- 名稱:
長距離搜索與部分路徑
- 影響: mineflayer-pathfinder 對 100 格以外、跨越山丘的目標執行
goto()(Java 上相同) - Java / Bedrock: 上游行為相同:
goto(GoalLookAtBlock(<90 格外的矿石>))以 "Took to long to decide path to goal!" reject——goto在搜索狀態為timeout時就 reject,而不是沿最佳部分路徑行進;儘管 pathfinder 隨後確實會走這條部分路徑, 但走到盡頭後不會重新規劃。 - bedboo: 庫和補丁都未做改動。變通做法(倉庫自帶的 agent
packages/agent即如此):把遠距離目標拆成每段 32 格分段行走 (GoalNearXZ路點,某段失敗時改走側向 16 格的一段),thinkTimeout設為 10 s;超時後等待部分路徑走完,再從那裡重新搜索; bot 30 s 沒有移動就放棄。1×1 墊高需要 bot 在所在列中居中(碰撞箱與相鄰列重疊時,跳躍會碰到那一列的天花板):每次跳躍前 先讓 bot 居中。
穿過剛放置的門出去時找不到路徑
- 影響: bot 放置一扇木門且保持連接後,緊接著使用的 mineflayer-pathfinder(已打補丁,
canOpenDoors) - Java: 未觀察到。
- Bedrock(已觀察到,原因不明): 一個從屋內放置了房門的 bot 對屋外的所有目標都得到
NoPath;重新加入後,pathfinder 打開了同一扇門並走了出去。bot 看到的門方塊狀態是正確的(下半部分的open_bit、上半部分的upper_block_bit,重新加入後 也一樣),所以原因不在世界模型;未進一步調查。 - bedboo: 未修復。變通做法:從建築佔地範圍之外放置門,並顯式地穿過門離開已完成的建築(
activateBlock+ 行走);被卡住 時,打開相鄰的關著的門並穿過去。
mineflayer-pathfinder 掉進岩漿
- 影響: 在下界使用 mineflayer-pathfinder 默認設置的任何人
- Java / Bedrock: 上游行為相同:
Movements.infiniteLiquidDropdownDistance(默認 true)允許路徑從任意高度落入 “液體”,而 pathfinder 的液體包括岩漿——一條下界路徑讓 bot 掉進了岩漿海(實測:在 y 26 探索時出現 "<bot> tried to swim in lava")。 - bedboo: 庫和補丁都未做改動。變通做法:設置
infiniteLiquidDropdownDistance = false(下落限制為maxDropDown3), 並把傳送門、火、岩漿塊、漿果叢……加入blocksToAvoid。
在天花板下墊高(1×1 塔)
- 影響: mineflayer-pathfinder 的
allow1by1towers - Java: pathfinder 跳起並在腳下放置方塊;它只清除腳上方兩格的方塊。只要客戶端聲稱自己升起了,Java 服務器就接受放置; 客戶端會自己在柱子上重新居中。
- Bedrock: BDS 拒絕與玩家服務器端碰撞箱重疊的任何方塊(搭路),而打過補丁的 pathfinder 不再
讓 bot 重新居中(那會導致糾正)。偏離中心的碰撞箱會跨到相鄰的列;那裡腳上方兩三格的方塊(例如末地島嶼在其抵達平臺上方的
底面)會截斷跳躍,每次放置都會被拒絕(實測:連續 204 次
place_error路徑重置,bot 卡在 3 格高的柱子上)。 - bedboo: 庫未做改動。變通做法:在天花板很近的地方,去掉那些九列中任意一列在腳上方 2–3 格有方塊的墊高步驟,讓 pathfinder 改為挖出階梯(末地平臺 → 島頂約 25 s)。其他地方墊高正常(把自己挖進 1×1 豎井的 bot 會居中,能正常墊高出來)。
在下界岩漿海上搭橋
- 影響: 下界中 mineflayer-pathfinder 的搭路
- Java / Bedrock: 相同:岩漿海上的橋很危險(疣豬獸的頂撞或弩箭會把 bot 打進岩漿)。
- bedboo: 庫未做改動。變通做法:在下界,不在落差超過 4 格的地方放置搭路方塊;讓 pathfinder 改為挖穿岩石。
mineflayer-tool 1.2.0 補丁
- 影響:
bot.tool.getDigTime、equipForBlock、retrieveTools的成本排序 - Java:
block.digTime(type, …, nbt.simplify(item.nbt).Enchantments, effects)。 - Bedrock: 附魔是帶數字 id 的
enchNBT;使用 Bedrock 效果係數(挖掘速度)。 - bedboo(補丁): 使用
item.enchants+bot._bedrock.digging.blockDigTime(否則使用 prismarine-block)——估算值等於 手持該工具時的bot.digTime,因此效率附魔會讓帶附魔的工具被選中。- 修復的上游 bug(與 Bedrock 無關):物品欄中沒有可採集工具時,
equipForBlock(block, { requireHarvest, getFromChest })會調用retrieveTools(),而它在沒有箱子(或沒有箱子裡有工具)時不報錯直接返回,隨後equipForBlock再次調用自己—— 無限循環。沒有箱子時這是一條無盡的微任務鏈:事件循環被凍結,進程在約 25 s 內因內存耗盡而崩潰(例如沒有鎬時用 mineflayer-collectblock 的collect()採集煤礦石;它的選項是{ requireHarvest: true, getFromChest: true, maxTools: 2 })。补丁只在有箱子时才搜索箱子,且只搜索一轮;否则(或仍然没有工具时)调用以NoItemreject,與不帶getFromChest時一樣。
- 修復的上游 bug(與 Bedrock 無關):物品欄中沒有可採集工具時,
mineflayer-collectblock 1.6.0 補丁
- 影響:
bot.collectBlock.collect(target, [options], cb)(回調形式)、它拾取的掉落物、cancelTask() - Java / Bedrock: 兩邊存在相同的上游 bug:
callbackify(this.collect)丟失了this,因此回調形式(mineflayer 的examples/collectblock.js)總是以 "Cannot read properties of undefined (reading 'bot')" 失敗;- 被挖方塊的掉落物生成在每個軸上距方塊 0.25–0.75 的隨機位置(再減去物品高度的一半):距方塊中心最遠約 0.52 格(BDS 上 實測:0.17–0.52)。collectblock 只把距中心 0.5 以內的掉落物作為目標,因此偶爾會漏掉一個掉落物(Java 的分佈相同);
- 輪到某個目標方塊時它已經不存在了(mineflayer-pathfinder 會挖掉擋路的東西,例如在跟隨某根原木的掉落物時挖掉了它上方的
原木),這時會得到一個指向空氣的
GoalLookAtBlock,它永遠不會結束:搜索會跑到 5 s 超時,collect()reject(實測:採集 5 根原木的 4 次運行中有 2 次); cancelTask()調用bot.pathfinder.stop()並等待任務結束。在 pathfinder 2.4.5 中,pathfinder 空閒時(挖掘期間、等待 拾取時)的 stop 會被鎖存,因此任務的下一次goto以PathStoppedreject,而collect()會吞掉這個錯誤。打過補丁的 pathfinder 不再鎖存(mineflayer-pathfinder):取消因此丟失,cancelTask()要等整個任務做完(實測:4 根 原木 17 s)。
- bedboo(補丁):
callbackify(this.collect).call(this, …);採集距被挖方塊中心 0.75 以內的掉落物;在尋路前丟棄已經變化的 方塊目標;cancelTask()還會給正在運行的任務設置標誌,任務在每一步(goto、挖掘、等待拾取、清空物品欄)之後檢查該標誌, 並像以前一樣以PathStopped結束——在當前步驟完成之後,與 pathfinder 2.4.5 時一樣——等待拾取則會立即結束。其他部分未打 補丁:挖掘等待服務器(完成),掉落物來自itemDrop→GoalFollow→playerCollect/entityGone,箱子流程照常使用openChest/deposit。
礦石搜索使用區塊數據
- 影響: 用
bot.findBlocks查找礦石(mineflayer-collectblock 的示例也是這樣做的) - Java / Bedrock: 相同——服務器發送完整區塊,bot 用
bot.findBlocks定位方塊。 - bedboo: 無需改動。在下界採礦時值得了解的事實:
- 遠古殘骸的 y 8–22 區間(大礦脈,約在 y 15)大多位於岩漿海(y ≤ 31)之下:那裡的目標常常處在開闊洞穴之下, mineflayer-pathfinder 會搭橋、墊高穿過虛空去夠它們,或者 bot 掉進岩漿。更好的做法是先在岩漿海之上搜索(y ≥ 32,小礦脈 所在處),要求殘骸被岩石包裹到 bot 所在高度(上方沒有開闊洞穴或岩漿),再退而求其次搜索 8–22 區間或挖一條直的分支礦道;
- 尋路去礦石時,絕不破壞與液體相鄰的方塊;
- 開採下界金礦會激怒看到這一幕的豬靈,無論是否穿著金甲(之後持弩的豬靈會一直射擊 bot):最後再開採,且絕不在距豬靈 20 格 以內開採。
mineflayer-armor-manager 2.0.1 補丁
- 影響:
playerCollect時的自動裝備 - Java: 每件拾取的盔甲在 100 ms 後開始
equipItem;由於 Java 的窗口點擊是即時的,這些裝備操作很少重疊。 - Bedrock: 每次點擊都要等待服務器的物品堆疊響應,因此一起拾取的多件盔甲會同時裝備;它們的點擊通過共享的光標交錯進行, 把盔甲互相換來換去(實測:5 件中只有 1 件最終被裝備上)。
- bedboo(補丁): 裝備操作依次執行(一個 promise 隊列)。
getDroppedItem()以及 Java 的盔甲槽 5–8 / 副手 45 可直接 使用;supportFeature('doesntHaveOffHandSlot')為 false。
mineflayer-auto-eat 5.0.3 補丁
- 影響:
bot.autoEat.eat()、enableAuto() - Java: 一次進食以
bot._client上的entity_status9 結束。 - Bedrock: 沒有
entity_status數據包;BDS 向進食者發送completed_using_item(也就是bot.consume等待的東西)。 - bedboo(補丁): 進食監聽器在收到
completed_using_item時也會完成。該插件只提供 ESM(用await import('mineflayer-auto-eat')加載);registry.foods/foodsByName來自 bedrock-data;它的 GPL-3.0 依賴@nxg-org/mineflayer-util-plugin原樣使用(它需要 Java 版本比較(版本比較)、bot.version.split('.')、clickWindow、inventory.selectedItem、firstEmptyInventorySlot)。只有在簡單或更高難度下 飢餓值才會下降(和平模式下 Bedrock 永遠不會讓飢餓值下降)。- 修復的上游 bug(與 Bedrock 無關):
eat()在裝備食物之前就設置進食標誌,而只在進食開始之後的路徑上清除它:裝備失敗(customEquip→ false,例如同時 有窗口打開或正在換手)會讓isEating永遠為 true——之後每次eat()都拋出Already eating!,自動模式再也不會進食 (詳情)。現在進食開始前的任何失敗(沒有食物、裝備、激活物品)都會清除該標誌;這樣的失敗仍然不觸發 任何事件(進食並未開始),與上游一致。- 啟用
strictErrors(默認)時,失敗的進食(超時、物品被換走、cancelEat())會在觸發eatFail之前就拋出,因此默認 選項下從不會觸發失敗事件;現在先觸發eatFail(然後eatFinish,然後 reject),與strictErrors: false時一樣。 每次失敗只觸發一次eatFail:自己用eat()拋出的錯誤觸發它的代碼(針對缺失事件的變通做法)不會把一次失敗報告兩次。
- 對無法開始的進食,自動模式在 2 s 後重試(否則失敗的裝備會在每個 tick 重複),對已失敗的進食則立即重試,與上游一致;
直接調用的
eat()永遠不會被延後。拋出異常的eatStart監聽器也不會再讓標誌保持置位(該事件在進食的try中觸發)。
- 修復的上游 bug(與 Bedrock 無關):
mineflayer-auto-eat 在生命值 < 14 時總是進食
- 影響: mineflayer-auto-eat 5.0.3 的
minHealth(默認 14),Java 和 Bedrock 都一樣 - Java: 同樣的選項;對普通食物而言,飽食度滿時因低生命值觸發的進食同樣是徒勞的循環。
- Bedrock: 飽食度滿的玩家無法進食(BDS 拒絕這次進食),因此僅由低生命值觸發的自動進食會每個 tick 開始一次永遠完成不了的 進食(每次 3 s 超時)。
- bedboo: 未打補丁。推薦選項:
minHealth: 0、minHunger: 16(只按飢餓值進食)。
mineflayer-auto-eat 在裝備被拒後停止進食
- 影響: mineflayer-auto-eat 5.0.3 的
eat()/ 其自動模式(Java 上代碼相同) - Java / Bedrock: 相同的上游 bug:
eat()在裝備食物之前設置“正在進食”標誌,只在進食開始之後的路徑上清除它;裝備拋出 異常(其他代碼或戰鬥同時在換手、有窗口打開)會讓標誌保持置位,自動模式(physicsTick→if (!_eating) eat())再也不會 重試(觀察到:一個 bot 在飢餓值 5、物品欄裡有 5 份熟食的情況下持續了好幾分鐘都沒進食)。 - bedboo: 已在 mineflayer-auto-eat 補丁 中修復:進食開始前的失敗會清除該標誌。作為最後手段,把“進行中” 超過 15 s 的進食重置掉仍是一個合理的安全網。
mineflayer-auto-eat 與 pathfinder 爭奪手持物品
- 影響: 啟用 mineflayer-auto-eat、在飢餓時挖掘或放置的 bot
- Java / Bedrock: 上游行為相同。只要飢餓值低於
minHunger且攜帶可食用物品,auto-eat 就會在任意物理 tick 開始進食 (裝備食物並按住“使用”);手持物品一變,它就以 "Item switched early" 放棄這次進食。mineflayer-pathfinder 挖掘時裝備工具、 放置時裝備方塊——下一個 tick auto-eat 又裝備回食物。路徑需要挖掘或放置方塊的飢餓 bot 兩樣都做不成(實測:一個 bot 在岩漿池 旁站了 12 分鐘,飢餓值 4,攜帶九塊腐肉,每次行走都超時)。 - bedboo: 未打補丁。變通做法:在需要挖掘或放置的任務之前,先停下來進食(pathfinder 停止時調用 auto-eat 自己的
eat());不要把正在進行的進食當作中斷而無限重試;給重試和搜索加上時間上限。
mineflayer-pvp 1.3.2 補丁、盾牌與攻擊時機
- 影響:
bot.pvp(對苦力怕舉盾、盾牌使用、攻擊時機、followRange) - Java: 正在引爆的苦力怕是元數據索引 16 = 1;用
activateItem(true)舉盾;攻擊頻率遵循 Java 的武器冷卻。 - Bedrock: 正在引爆的苦力怕帶有
ignited實體標誌;舉盾靠潛行(沒有使用動作,見 物品使用、進食與盾牌);沒有攻擊冷卻。 - bedboo(補丁):
checkExplosion也會讀取metadata.flags.ignited(實測:該標誌會被設置,pvp 會舉盾)。未打補丁的 部分:activateItem(true)/deactivateItem()按住 / 鬆開潛行,因此持盾時 bot 在兩次攻擊之間以潛行速度移動;這個潛行屬於 盾牌本身,所以 pathfinder 的clearControlStates()(每次追擊結束時、挖掘或放置前、stop()時)不會把盾放下;- Java 的冷卻時機只是讓攻擊比 Bedrock 允許的略慢一點;
- 默認
followRange為 2 時,邊射擊邊後退的骷髏會保持在 4 格之外(GoalFollow只在目標移動超過該範圍時才重新規劃;Java 上也一樣):對付遠程生物請使用bot.pvp.followRange = 1; - pvp 監聽的是
physicTick(mineflayer 會打印其棄用警告,與 Java 上一樣)。
運行插件時發現的核心修復
- 影響:
bot.stopDigging、bot.creative.flyTo、bot.waitForChunksToLoad - Java: 不適用(插件所依賴的庫行為)。
- Bedrock: 插件觸及了基本 API 調用不會觸及的時序。
- bedboo:
lib/plugins/digging.js:blockUpdate監聽器先於挖掘自己的按位置監聽器運行;mineflayer-pathfinder 在路徑附近有任何變化 時都會停止挖掘,因此 pathfinder 的每次挖掘都以diggingAborted("Digging aborted")結束,儘管方塊其實已被破壞。現在在 方塊已被破壞時調用stopDigging會像上游一樣完成這次挖掘(上游的finishDigging在本地更新之前就清除了targetDigBlock)。新增bot._bedrock.digging.blockDigTime(block, type, creative, inWater, notOnGround, enchantments, effects)(prismarine-block 的簽名,Bedrock 係數),供插件做成本估算。lib/plugins/physics.js:創造模式flyTo規劃器在鬆開前進鍵後 10 tick 內絕不再次按下(BDS 在雙擊前進後會衝刺飛行), 在連續的flyTo調用之間保留跳躍保護,並且當目的地高於落點時絕不會提前落地(玩家一接觸地面 BDS 就停止飛行);見 飛行。waitForChunksToLoad:在瞬移後立即於 "loaded" 時調用會超時,因為 BDS 在加入時發送的區塊列(超出其公佈的 publisher 半徑的部分)被卸載後再也不會重發;lib/plugins/blocks.js現在會保留它們。
移植的 mineflayer 示例
- 影響: 庫的
examples/目錄 - Java: mineflayer 4.39.0 的
examples/(require('mineflayer'))。 - bedboo: 移植了 51 個示例文件,改為
require('bedboo'),其餘完全相同(其中硬編碼的 Java 物品 / 方塊名稱保持不變:例如 fisherman 的fish、graffiti 的sign都不是 Bedrock 名稱——也不是新版 Java 名稱)。auto-eat.js改用固定版本的 mineflayer-auto-eat 5 API(ESMimport()、setOpts、enableAuto/disableAuto、eatStart/eatFinish),上游的示例 早於該 API。未移植:session.js(Java 啟動器配置文件認證)、discord.js/telegram.js(第三方機器人,沒有 Bedrock 特有 內容)、perfectShotBow.js(minecrafthawkeye,Java)、viewer/、screenshot-with-node-canvas-webgl/(prismarine-viewer:Java 區塊)、anvil_saver/(Java Anvil 世界文件)、python/。需要 Bedrock 行為的示例: