跳到正文
本頁目錄

名稱、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);出現其他任何不一致時生成器會失敗。每個方塊都有一個 Bedrock friction 字段(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 的 foods schema(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_id 65535("vanilla id"),並按 id 順序列出,因此客戶端必須知道編號:id 取自 pmmp/BedrockData 的 biome_id_map.json(CC0),外加 dappled_forest 195(1.26.50 新增),並對照 minecraft-data bedrock 1.20.0、BDS biome_definition_list 的順序以及在線 核對(每個用 /locate biome 找到的生物群系在區塊中都是這個 id)。schema 與 minecraft-data 相同(id、name、 category、temperature、has_precipitation、dimension overworld / nether / the_end、displayName、color = BDS 地圖水體顏色,與 minecraft-data bedrock 1.21.60 一致,另加 rainfall 和 depth);氣候數值取自 BDS (CloudburstMC stripped_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_event 0x4000 | 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。

線上的物品(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 時則拋出異常。規則:
    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 等)。
    2. 命令(已在 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。
    3. Java 數據包佈局 → false(stateIdUsed、blockPlaceHas*、dimensionIsA*、dimensionDataInCodec、titleUses*、 updatedParticlesPacket、useItemWith*、teleportUsesOwnPacket、hasEditBookPacket 等):這些插件已基於 Bedrock 數據包重新實現,false 防止走進內置的 Java 分支。例外:positionUpdateSentEveryTick: true(player_auth_input 每 tick 發送)。
    4. API 形態: tabCompleteHasAToolTip: true(mineflayer ≥ 1.13 的 [{ match, tooltip }])、lessCharsInChat: false (按 256 字符分段)、selectingTradeMovesItems: false(Bedrock 沒有 select_trade)、fishingBiteDelayMaxTicks: 600 (Java 的窗口;經測量在 BDS 上同樣成立,見釣魚)。
    5. 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 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。