Typed bulk block edits
BlockEdit.palette contains complete BlockState values. Construct them with
BlockState::of(&host.block_states(), block, constraints) (or change an existing state
with with). filters contains owned StatePredicate values. StatePredicate::block
validates property names and values strictly; StatePredicate::tag retains arbitrary
property requirements, including for an empty tag, and rejects duplicate properties.
A predicate requires block identity or tag membership AND every supplied property. Omitted properties are wildcards, never default-state requirements. An unknown or missing property on a tag member never matches. Sparse, non-Cartesian state tables are supported: a partial predicate does not need to form a complete state with defaults.
All palette entries, predicates and run indices are prepared before any mutation. NBT is not representable. At most 65,536 filters are allowed. Unloaded chunks and out-of-height portions of runs are skipped. Edits preserve strict block-entity behavior, notify no neighbors and send whole changed chunks.
ColumnBlocks.palette also contains complete BlockState values. States of the
same block with different properties have distinct entries. Only distinct numeric
states are converted to API values, not each block in the returned columns.