名稱、id 與數據
bot.registry 在 Bedrock 上包含什麼:方塊、物品和實體的名稱與 id、方塊狀態 id、數據集、特性表,以及 Bedrock 數據中缺少的
內容。核對依據為 BDS 1.26.51.1(protocol 2193)、CloudburstMC/Data 的 659ce1e2eee3a67045693f4fd5515c6ccf571953(BDS 導出)
以及一臺在線服務器;數據的構建方式見 packages/bedrock-data/NOTICE.md。
bot.registry 中的 Bedrock 方塊、物品名稱與 id
- 影響:
bot.registry/require('minecraft-data')('bedrock_1.26.51'),以及所有接受方塊或物品名稱 / id 的 API (bot.blockAt().name、bot.findBlocks({ matching })、bot.inventory.items()[i].name、配方等)。 - Java: Java 的名稱和 id(
grass_block、oak_door、zombified_piglin等)。 - Bedrock: Bedrock 標識符:1,477 個方塊 / 22,091 個方塊狀態 / 2,076 個物品(minecraft-data PR #1335 的 1.26.51 數據,
每個狀態都對應到 BDS 的 runtime id,每個物品的名稱和 id 都與 BDS
item_registry對應)。許多名稱與 Java 相同,也有不同的 (Java 的oak_door在 Bedrock 上方塊和物品都叫wooden_door,以及noteblock、unpowered_repeater、實體zombie_pigman、fishing_hook、fireworks_rocket等)。物品 id 是服務器的網絡 id(方塊物品的 id 可以為負)。 還有 Bedrock 獨有的物品 / 方塊(例如element_*、hard_*_stained_glass、unknown)。 - bedboo:
bot.registry使用 Bedrock 的名稱和 id;物品按服務器的item_registry重新建立索引(原版 BDS 下保持不變)。 硬編碼 Java 名稱的代碼需要改用 Bedrock 名稱。部分在 Java 上帶lit/powered狀態的方塊在 Bedrock 上是兩個方塊: 見方塊變體。
方塊狀態 id 與網絡 runtime id
- 影響:
Block.stateId、registry.blocksByStateId、bot.world.setBlockStateId,以及所有解碼update_block/ 子區塊或發送block_runtime_id的代碼。 - Java: 網絡上傳輸全局調色板 id,與
block.stateId是同一組數字。 - Bedrock: 開啟
block_network_ids_are_hashes時(BDS 1.26.51 上始終開啟),網絡上傳輸的是方塊狀態 NBT 的 32 位 FNV-1a 哈希(線上為有符號 int32,例如 stone = -2144268767)。 - bedboo:
block.stateId仍是registry.blockStates中的順序下標,因此每個方塊的狀態與 Java 完全一樣是連續的minStateId..maxStateId區間(mineflayer 的bed.js、prismarine-block 的 metadata / shapes 以及 mineflayer-pathfinder 的Block.fromStateId(x.minStateId)都無需修改即可工作)。網絡 runtime id 會被轉換:registry.blocksByRuntimeId[runtimeId] → { stateId, ...block }和registry.runtimeIdByStateId[stateId](都由registry.handleStartGame(start_game)構建),Block 的block.hash是它的 runtime id。prismarine-chunk 在解碼 / 編碼子區塊時 自行完成轉換。這有意不同於 prismarine-registry PR #57(該 PR 讓stateId等於哈希,並且minStateId未定義,會讓 pathfinder 失效)。minecraft:unknown是唯一一個 runtime id 不等於其哈希的狀態:BDS 為它保留了0xFFFFFFFE(-2)。每個blockStates[i]都以hash攜帶自己的 runtime id(由生成器預先計算並校驗),因此handleStartGame不必對 22k 個狀態做哈希。
未知的方塊 runtime id 解碼為 minecraft:unknown
- 影響: 服務器發送數據中不存在的方塊狀態時的區塊解碼(
bot.blockAt、bot.world),例如來自start_game.block_properties的自定義 / 附加包方塊。 - Java: 不適用(registry codec 由服務器發送)。
- Bedrock: 自定義方塊與原版方塊一樣做哈希;它們的狀態不在 1.26.51 數據中。
- bedboo: 子區塊解碼器從不拋出異常:未知的 runtime id 會成為一個
minecraft:unknown的調色板條目(BDS 自己的佔位方塊: 實心完整方塊,硬度 0,因此物理引擎視其為實心,尋路視其為可挖掘),並保留entry.runtimeId,重新編碼時寫回原 id。在線檢查中 原版 BDS 從未產生過這種情況(默認主世界、下界、末地)。自定義方塊暫未加入 registry。在registry.handleStartGame(start_game)之前解碼網絡區塊會拋出異常(沒有 runtime id 映射),而不是悄悄生成佔位方塊。
來自 BDS 的碰撞箱與摩擦係數
- 影響:
block.shapes(物理、尋路、bot.canSeeBlock)、registry.blocksByName[x].friction。 - Java: Java 的碰撞箱;滑度硬編碼在 prismarine-physics 中。
- Bedrock: BDS 導出數據與 minecraft-data PR #1335 有 708 個狀態不同:門的厚度為 0.1875(3/16)(PR 中為 0.1825),
放了末影之眼的
end_portal_frame多一個眼睛的碰撞箱。各方塊的摩擦係數:冰 / 浮冰 / 霜冰 0.98,blue_ice 0.989, slime 0.8,honey_block 0.8,其餘均為 0.6(air 和unknown為 0.899999)。 - bedboo: 碰撞箱取自 PR #1335,僅有一份明確的白名單取自 Cloudburst
collisionShape(/_door$/、end_portal_frame);出現其他任何不一致時生成器會失敗。每個方塊都有一個 Bedrockfriction字段(schema 中新增; 物理引擎會讀取它)。門上下兩半的形狀見門的上下半。
數據集
- 影響:
bot.registry.effects*、foods*、attributes*、enchantments*、entities*、biomes*、particles*、sounds*,以及所有使用它們的地方(bot.entity.effects、auto-eat、prismarine-physics 的PlayerState、digTime、item.enchants、bot.entities[x].name、粒子 / 聲音事件)。 - Java / Bedrock / bedboo:
- effects: 使用 Bedrock id(
mob_effect.effect_id:Speed 1 … SlowFalling 27、BadOmen 28、HeroOfTheVillage 29 (village_hero)、Darkness 30、TrialOmen 31、WindCharged 32、Weaving 33、Oozing 34、Infested 35、RaidOmen 36、 BreathOfTheNautilus 37),並帶有 minecraft-data 的 Java 風格name/displayName/type,因此effectsByName.JumpBoost等可以正常使用;bedrockName是命令中的名字。Bedrock 獨有:FatalPoison(25)。Java 獨有 (缺失):Glowing、Luck、BadLuck、DolphinsGrace。id 已在 BDS 上用/effect驗證。 - enchantments: 使用 Bedrock id(minecraft-data bedrock 0..37 + wind_burst 38、density 39、breach 40、lunge 41,
已用
/enchant驗證);名稱是 Java 的(efficiency、binding_curse等)。Java 的sweeping_edge在 Bedrock 上不存在。 - attributes:
resource是 Java 鍵(bot.entity.attributes以它為鍵,prismarine-physics 讀取attributesByName.movementSpeed.resource),bedrockName是update_attributes中的名字:maxHealth ←minecraft:health(其max為最大生命值,current為當前生命值),movementSpeed ←minecraft:movement(玩家默認 0.1), followRange、knockbackResistance、attackDamage、maxAbsorption ←minecraft:absorption、luck、jumpStrength ←minecraft:horse.jump_strength、spawnReinforcements ←minecraft:zombie.spawn_reinforcements。Bedrock 獨有的條目 (resource= Bedrock 名稱):underwaterMovement、lavaMovement、frictionModifier、bounciness、airDragModifier、 playerHunger、playerSaturation、playerExhaustion、playerLevel、playerExperience。Java 獨有的屬性(armor、stepHeight、 gravity 等)保留但沒有bedrockName;BDS 從不發送它們。本地玩家屬性的上報方式見自身元數據。 - foods: 採用 minecraft-data 的
foodsschema(Java 字段名),數據來自 BDS 物品組件minecraft:food:foodPoints= nutrition,saturation= nutrition × modifier × 2,saturationRatio= modifier × 2,effectiveQuality= foodPoints + saturation;共 40 種食物,使用 Bedrock 物品 id。 - entities: 137 個 BDS 標識符(Cloudburst
entity_identifiers.dat);id=internalId= Bedrock 的數字實體類型 (player 257)。尺寸是 BDS 為召喚出的實體報告的包圍盒(有幾個與 Java 不同:zombie / skeleton 0.6×1.9、chicken 0.6×0.8 等);slime / magma cube 按尺寸 1 給出,shulker 為 1×1(BDS 對它報告的是默認 actor 包圍盒);教育版實體(agent、balloon、 ice_bomb、tripod_camera)沒有尺寸(0×0)。minecraft-data 中 Bedrock 獨有的moving_block、item_frame、glow_item_frame、chalkboard被移除(它們在 BDS 上是方塊 / 方塊實體,不是實體標識符)。minecraft-data bedrock 1.21.80 把 Java 獨有的變體歸到它們映射的標識符下(zombie:Zombie + Giant,llama:Llama + Trader Llama,arrow:Arrow + Spectral Arrow,evocation_illager:Evoker + Illusioner,另有 armor_stand 和 minecart 的佔位行);生成器取 Bedrock 實體自己的那一行(tables.ENTITY_DUPLICATES;未列出的重複項會讓生成失敗),因此entitiesByName.zombie是 Zombie 而不是 Giant。部分標識符沿用 minecraft-data 的佔位顯示名(即標識符本身:npc、tnt、boat、egg、*_minecart等)。 - biomes: 以區塊生物群系調色板中攜帶的原版數字 id 為鍵(ocean 0、plains 1、river 7、hell 8、the_end 9、…
soulsand_valley 178 … mangrove_swamp 191、cherry_grove 192、pale_garden 193、sulfur_caves 194、dappled_forest 195):
共 89 個生物群系,即 BDS 1.26.51 在
biome_definition_list中發送的列表。minecraft-data 的 bedrock 1.21.60 列表 (bedrock_1.26.51原本繼承的)按字母順序編號(0 bamboo_jungle、1 bamboo_jungle_hills、plains 64),導致每個生物群系 都解析錯誤(超平坦世界的 plains 變成了 bamboo_jungle_hills)。BDS 對所有原版生物群系發送biome_id65535("vanilla id"),並按 id 順序列出,因此客戶端必須知道編號:id 取自 pmmp/BedrockData 的biome_id_map.json(CC0),外加 dappled_forest 195(1.26.50 新增),並對照 minecraft-data bedrock 1.20.0、BDSbiome_definition_list的順序以及在線 核對(每個用/locate biome找到的生物群系在區塊中都是這個 id)。schema 與 minecraft-data 相同(id、name、category、temperature、has_precipitation、dimensionoverworld / nether / the_end、displayName、color= BDS 地圖水體顏色,與 minecraft-data bedrock 1.21.60 一致,另加rainfall和depth);氣候數值取自 BDS (CloudburstMCstripped_biome_definitions.json,與數據包一致);category 和顯示名取自 minecraft-data bedrock 1.20.0 (Java 風格的分類),較新的生物群系來自一張表。自定義(數據驅動)生物群系不在 registry 中。bot.blockAt(p).biome由 prismarine-block 1.23.0 通過prismarine-biome(registry.version)構建,只填充id(其name為'',Java 上也一樣);bot.registry.biomes[block.biome.id]才是完整的生物群系。 - particles: Bedrock 粒子類型(
level_event0x4000 | id,例如 bubble 1、heart 19)。 - sounds: 與
level_sound_event.sound_id中發送的一致的關卡聲音事件標識符(1.26.40 起為字符串,例如armor.equip_iron);id是舊的數字 LevelSoundEvent id(13 個較新的事件分配了 ≥ 615 的 id)。 - 沿用 minecraft-data: language(1.21.70)、recipes(1.19.10,已被
crafting_data取代:見配方)、 windows、instruments、blocksB2J / J2B、protocol。
- effects: 使用 Bedrock id(
線上的物品(ItemV4)
- 影響:
Item.fromNotch/Item.toNotch(prismarine-item),用於物品欄、創造模式、事務。 - Java:
{ itemCount, itemId, components };空槽位為present: false/ count 0。 - Bedrock: ItemV4
{ network_id, count, metadata, has_stack_id, stack_id, block_runtime_id, extra };從 1.26.40 起, 空槽位同樣攜帶所有字段;方塊物品攜帶它所放置的方塊狀態的 runtime id(BDS 會精確比較手持物品)。 - bedboo:
Item.toNotch(null)即 BDS 的空物品;物品保留服務器的stack_id、blockRuntimeId以及can_place_on/can_destroy列表(item.canPlaceOn/item.canDestroy),因此toNotch(fromNotch(x))逐字節相同; 新建的方塊物品通過registry.items[id].blockStateId(來自 BDS 創造模式數據,新增字段)→ runtime id。在registry.handleStartGame之前,新建的方塊物品得到 0。
物品標籤不在線上傳輸
- 影響: 使用標籤作為原料的配方(木板、原木、木臺階、石質材料、煤炭、蛋、羊毛、粒等)。
- Java: minecraft-data 的配方已經展開;標籤存在於數據中。
- Bedrock:
crafting_data中寫的是標籤名(minecraft:planks);BDS 從不發送其成員(item_registry只列出數據驅動物品 的標籤,不包括上述任何原版標籤)。1.26.51 的合成配方共用到 11 個標籤。 - bedboo:
lib/bedrock/item_tags.js為這 11 個標籤收錄了 pmmp/BedrockData 的item_tags.json(BDS 1.26.30,CC0), 並在 BDS 1.26.51.1 上逐個成員驗證:把每個候選物品放入使用該標籤的配方中合成(被接受 = 是成員,狀態 35 = 不是)。1.26.51 新增: poplar 木材系列(木板、原木、木臺階)以及minecraft:mushrooms_for_stew(棕色、紅色和 shelf 蘑菇)。含有未知標籤或物品的 配方會被跳過(bot._bedrock.recipes.skipped;在 1.26.51 上為空)。見配方。
Bedrock 數據中沒有戰利品表
- 影響:
registry.blockLoot、registry.entityLoot(bedrock_1.26.51下為空)。 - Java: minecraft-data 有方塊和實體的戰利品表(掉落概率和數量)。
- Bedrock: 只有
blocks[].drops(物品 id 列表,沒有數量和概率)。 - bedboo: 兩張表都是空的;需要產量數據的代碼必須自帶。bedboo agent(
packages/agent/src/data/index.js)保存了它需要的 數據:紅石礦石 ×4.5、青金石 ×6.5、銅 ×3.5、沙礫 → 燧石 10 %、樹葉 → 樹苗 / 木棍 / 蘋果,以及它所獵殺的被動生物的掉落物。
特性表(bot.supportFeature)
- 影響:
bot.supportFeature(name)、supportFeature導出項,以及所有按 Java 特性名分支的複用插件。 - Java: 取自 minecraft-data 中該機器人版本的 Java 特性列表。
- Bedrock: minecraft-data 的 Bedrock 列表不認識任何 Java 特性名。
- bedboo: 為以下來源用到的每個 Java 特性名給出明確的值:mineflayer 4.39.0 的
lib/和examples/及其測試套件, pathfinder / pvp / collectblock / tool / armor-manager / auto-eat,以及 prismarine-* 模塊;另外還包括 minecraft-data 的全部 17 個 Bedrock 特性,取 minecraft-data 自己的 1.26.51 值(packages/bedrock-data/features.js)。未知名稱返回false,並在 進程內發出一次警告(BEDBOO_UNKNOWN_FEATURE);設置BEDBOO_STRICT_FEATURES=1時則拋出異常。規則:- 遊戲 / 數據事實 → 取 Bedrock 的實際情況:
tallWorld、itemsAreNotBlocks(而非itemsAreAlsoBlocks)、blockSchemeIsFlat、blockStateId、doesntHaveChestType(Bedrock 的箱子沒有type狀態)、doesntHaveOffHandSlot: false、shieldSlot(46 槽的玩家窗口)、hasElytraFlying、mobSpawner(方塊名為mob_spawner;mineflayer 的示例會查詢它)、village&pillageInventoryWindows: false(見下文)、noteBlockNameIsNoteBlock: false(noteblock)、multiSidedSigns、furnaceNbtUsesSnakeCase: false、creativeSleepNearMobs、實體名稱(enderCrystalNameEndsInErNoCaps、fireworkNamePlural、fishingBobberCorrectlyNamed: false)、prismarine-item 用到的物品 NBT 事實(itemsWithComponents: false、booksUseStoredEnchantments: false、itemLoreIsAString: false等)。 - 命令(已在 BDS 1.26.51.1 上核對):
hasExecuteCommand(execute in overworld run teleport …可用)、hasItemCommand: false(沒有/item)、replaceItemSlotIsPrefixed(/replaceitem … slot.container <n>;槽位下標是 單獨的參數,因此使用slot.container.<n>的代碼需要調整)、hasDataCommand: false、gameRuleUsesResourceLocation: false、effectAreNotPrefixed(Bedrock 寫作/effect <target> hunger 1 255:既不接受effect give,也不接受minecraft:前綴)、playsoundUsesResourceLocation: false、setBlockUsesMetadataNumber: false。 - Java 數據包佈局 → false(
stateIdUsed、blockPlaceHas*、dimensionIsA*、dimensionDataInCodec、titleUses*、updatedParticlesPacket、useItemWith*、teleportUsesOwnPacket、hasEditBookPacket等):這些插件已基於 Bedrock 數據包重新實現,false防止走進內置的 Java 分支。例外:positionUpdateSentEveryTick: true(player_auth_input每 tick 發送)。 - API 形態:
tabCompleteHasAToolTip: true(mineflayer ≥ 1.13 的[{ match, tooltip }])、lessCharsInChat: false(按 256 字符分段)、selectingTradeMovesItems: false(Bedrock 沒有select_trade)、fishingBiteDelayMaxTicks: 600(Java 的窗口;經測量在 BDS 上同樣成立,見釣魚)。 - prismarine-windows:
village&pillageInventoryWindows: false選擇它的舊版窗口表(通過shieldSlot得到 46 槽的玩家 物品欄)。若為true則會走 1.14+ 分支,其中的registry.version['>=']('1.20.3')對 Bedrock 版本會拋出 RangeError。 Bedrock 容器不是 Java 協議窗口:bedboo 註冊了每一種 Bedrock 容器類型(bot._bedrock.windows),並自行構建 46 槽、Java 佈局的玩家物品欄(窗口類型)。netherUpdateInventoryWindows只在那個 1.14+ 分支中讀取 (對 Bedrock 無影響)。
- 遊戲 / 數據事實 → 取 Bedrock 的實際情況:
在 Bedrock registry 上比較 Java 版本
- 影響: 使用 Java 版本號調用
bot.registry.isNewerOrEqualTo/isOlderThan/version['>=']等(mineflayer 的examples/inventory.js、@nxg-org/mineflayer-util-plugin)。 - Java: Java 版本之間的比較。
- Bedrock: 對 Bedrock 版本對象,minecraft-data 只認識 Bedrock 版本,傳入
'1.9'/'1.16'會拋出 RangeError:util 插件 (進而 mineflayer-auto-eat)連加載都無法完成。 - bedboo:
@bedboo/bedrock-data的install()放寬了緩存的bedrock_1.26.51版本對象的比較函數:minecraft-data 不認識的 版本按數字(major.minor.patch)與 1.26.51 比較,因此比所有 Java 1.x 新、比 Java 26.x 舊;Bedrock 版本之間的比較與之前完全相同; 非數字的未知版本仍會拋出異常。依賴該異常的代碼(prismarine-windows 的 1.14+ 分支)不受影響:守護它的特性 仍為 false。