Skip to content

Bedrock data from each server for every version 1.16.201 to 1.26.51 - #1327

Draft
mc-zuri wants to merge 17 commits into
PrismarineJS:masterfrom
mc-zuri:bedrock-block-states-collision
Draft

mc-zuri wants to merge 17 commits into
PrismarineJS:masterfrom
mc-zuri:bedrock-block-states-collision

Conversation

@mc-zuri

@mc-zuri mc-zuri commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

No description provided.

mc-zuri and others added 10 commits September 22, 2026 23:58
…server

blockStates.json and blockCollisionShapes.json of every bedrock version from 1.16.201 to 1.26.51, exported
from each Bedrock Dedicated Server build by bedrock-data-generator:
- blockStates.json: the server's block palette in runtime id order;
- blockCollisionShapes.json: what the game collides with (BlockLegacy::addCollisionShapes), one shape per
  state, blocks in blocks.json order. Replaces the Geyser-derived files up to 1.21.120, which held centre +
  size boxes, missed blocks and states, and took the phantom boxes the game leaves at the world origin
  (pressure plates before 1.19.50, buttons and fire, the end portal frame's eye) as the block's.

A version whose file is the same as the one before points to it in dataPaths.json: every file is unique.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Every version's blocks.json fits its palette: exactly its blocks, each with its own state range. Where
  minecraft-data reused a blocks.json of an older palette (1.17.30, 1.19.20 - 1.19.70, 1.20.80, 1.26.40 -
  1.26.51) or had none (1.16.201, 1.16.210), it is generated as minecraft-data-extractor-legacy2 does.
- defaultState is the game's default state of each block (BlockLegacy::mDefaultState) instead of its first
  state; in the other files only that value changes.
- dataPaths.json: blocks, blockStates and blockCollisionShapes where every entry has them (after attributes).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tions

Every bedrock version resolves biomes (1.16.201 and 1.16.210 had none). The
1.21.60 file, used up to 1.26.51, had alphabetical indexes for ids and no
rainfall or depth; it and the files missing biomes the server sends
(legacy_frozen_ocean, cherry_grove, pale_garden, sulfur_caves, dappled_forest)
are regenerated with the game's ids, temperatures and rainfall.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ntifiers

Every bedrock version resolves entities (1.16.201 and 1.16.210 had none). The
earlier files miss up to 24 entities the server sends, have wrong runtime ids
(goat and axolotl 0, villager_v2 15 from 1.21.0) and null hitboxes; they are
regenerated with the game's identifiers and runtime ids. The 1.18.11, 1.21.60
and 1.21.80 files, which no version uses any more, are removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The steve skins held the capturing accounts' PlayFab persona ids in SkinId,
SkinResourcePatch and SkinGeometryData; they are replaced by a fixed id. Each
version now has the skin its own client sends (the 1.16.201 file served every
version up to 1.20.71, while the skin changed five times); the 1.20.80 and
1.21.50 files, which no version uses any more, are removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1.20.30 to 1.21.50 used the 1.20.10 strings and 1.21.80 to 1.26.51 the 1.21.70
ones, missing up to 2,745 keys and with changed values; each now has its own
server's en_US.lang (1.21.124 and 1.26.45 share the identical 1.21.120 and
1.26.40 files). The existing files are unchanged: regenerated, they are the
same byte for byte.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Every bedrock version resolves items (1.16.201 to 1.17.0 had none), each with
exactly the items its server's registry has. Versions that used an older
version's file get their own; 1.18.11 and 1.18.30 no longer list names that
are not items (pistonArmCollision, movingBlock, ...); 1.21.100 and 1.21.111
give each item its runtime id, as the 1.26 files do, so the registry
prismarine-registry writes from them is the server's. The other files are
kept as they were.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The one bedrock attributes.json (1.16.201, used up to 1.19.63) listed Java's
attributes (generic.follow_range, generic.attack_damage, ...), and later
versions had none. Every version now has the attributes its server sends:
the saturation default and exhaustion max change at 1.18.30, and 1.26.20 adds
friction_modifier, bounciness and air_drag_modifier.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- blocks.json: hardness, resistance, light, display names, drops (Bedrock item
  ids), stack size, bounding box from the server; harvestTools / material from
  its block tags, with a materials.json per version
- items.json: stack size, durability, names from the item registry; one entry
  per data value; repairWith by Bedrock names
- entities.json: hitboxes from the behavior packs, names from the language file
- biomes.json: dimension, depth, rain from biome_definition_list; unique names
- effects.json, enchantments.json, entityLoot.json: new, per version, in
  Bedrock's numbering, from the server
- language.json: keys without trailing spaces

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Pix3lPirat3

Copy link
Copy Markdown
Contributor

Tested this PR with a live-server validator (bedrock block palette + collisions).

Static validation — 54/54 versions with data pass (1.16.201 → 1.26.51, own data or dataPaths-resolved):

  • block states: well-formed NBT {type,value}, no duplicate (name, states), all hashable via the client FNV1a32 Block.getHash, zero hash collisions, every name present in blocks.json
  • collision shapes: every block has a shape, every referenced shape index resolves, every shape is a valid [x0,y0,z0,x1,y1,z1] AABB, no dangling refs or shapes for missing blocks
  • blocks.json: every block has a boundingBox, and defaultState is within [minStateId, maxStateId]

Live ground-truth against running BDS:

  • 1.26.45 (data via 1.26.40): 544/544 distinct chunk-palette hashes resolve = 100%
  • 1.26.51: 258/258 = 100%, including the new corner-stair / trip_wire states that older stale-pinned data missed (0 silent-AIR fallbacks)

Method: a tool taps prismarine-chunk's loadRuntimePalette to tally every runtime hash a real server sends as resolved-or-air against blocksByRuntimeId; the static validator hashes each version's blockStates with the client getHash and cross-checks blocks/states/collisions.

No issues found on my end. Only the pre-palette alphas (0.14/0.15/1.0) have no block states, as expected.

mc-zuri and others added 6 commits September 23, 2026 09:55
…from the first build with digger tags

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132eAANHgXLt5rE9E6H7eh6
…they became

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132eAANHgXLt5rE9E6H7eh6
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132eAANHgXLt5rE9E6H7eh6
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132eAANHgXLt5rE9E6H7eh6
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132eAANHgXLt5rE9E6H7eh6
…cket

- 1.16.201: recipe network ids are varint (as in 1.16.210), not zigzag32
- 1.17.30, 1.17.40: potion container recipes come before material reducers
- 1.21.0 - 1.21.30: a user data (shulker box) recipe has no unlocking requirement

With these every build's recipe network ids decode as 1..n, each once.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132eAANHgXLt5rE9E6H7eh6
@Pix3lPirat3

Copy link
Copy Markdown
Contributor

Re-tested at 9bb2868 (with the new entity / foods / biome / crafting_data / pre-1.21.50 dig-data commits) through the
mineflayer bedrock adapter. Complements my earlier block-palette report - a couple of additional angles:

Item durability across 1.21.x is fixed here. On the current released data, damageable items resolve to
maxDurability = 1 for the whole early 1.21 span (1.21.0 through 1.21.50 inherit the placeholder; correct only from
1.21.60). On this branch every version reads the real values (diamond_pickaxe 1561, netherite_sword 2031, ...), 1.21.0
included.

End-to-end, not just block data. Booting fresh BDS worlds and connecting the adapter with this branch's data:
connect / spawn / world-decode / inventory / movement all pass on 1.26.45, 1.21.90, 1.19.80, 1.17.10 (4/4). Registry builds
for every version 1.16.201 -> 1.26.45 with per-version block/item counts scaling sensibly (554/914 at 1.16.201 -> 1379/1976
at 1.26.45).

One consumer note. For consumers that ship a generated data.js index, a plain data-file swap is not enough - the index
bakes in the previous dataPaths layout, so several versions fail to load (missing entities.json / steve.json for the
old mappings) until npm run generate:data is re-run against this branch. Regenerating fixes it completely. Not a data
bug, just worth flagging for anyone testing by dropping files in.

Happy to run the full version x server-type (BDS / PowerNukkitX / PocketMine) x offline+authed matrix against it if useful.

blocks.json harvestTools and materials.json are what each build's Item::getDestroySpeed and
Item::canDestroySpecial answer, so digTime gives the game's break time for every block and item.
Before 1.21.50, swords dig any block at 1.5 (materials default). Blocks that need a tool nothing
has get harvestTools {}.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants