Skip to content

Releases

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 05 Nov 16:20

Fixed an issue with the init command

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 15:02

Anvil 1.0.0 rebuilds every add-on file on a typed JSON model and adds
support for Minecraft 1.26.60. It is a breaking release: projects built
on 0.9.x need their scripts updated.

Highlights

  • Every component, document and file is a typed dataclass validated
    against the Minecraft schemas at export, with clear ValueError messages.
  • The Jinja templates (.jsont) are gone: every file is written from Python.
  • Full Minecraft 1.26.60 support, including the stricter entity schemas.

JSON model (anvil.lib.jsonmodel)

  • New declarative engine: JsonObject, JsonValue, JsonComponent,
    JsonCustomComponent, JsonContainer and JsonFile.
  • Field rules are typing.Annotated metadata (InRange, Length, Unique,
    MinMax, ExactMinMax, RangeMinMax, Keyed, Hex, Pairs...) compiled into
    checks, encoders and JSON schemas (schema).
  • JSON loading with from_json; unknown keys raise ValueError.
  • All type aliases and enums live in anvil.lib.jsonmodel.types and
    anvil.lib.jsonmodel.enums.
  • Component clashes are class-based: clashing components cannot be used
    together in a block, a permutation or a component group.

Components and objects

  • Entities, blocks, items and biomes: every component rewritten from the
    Microsoft and Mojang references; parts have add_/set_ builders.
  • Actors: flattened modules, typed client/server descriptions, one class
    each for animations, animation controllers and render controllers,
    add_*_property builders, entity.set_display_name.
  • Items: plain Item class; attachables are item.client (ItemClient).
  • Blocks: plain Block class; Block.descriptor() returns a BlockDescriptor
    (name, states, tags).
  • Biomes: typed descriptions, server and client files created on use.
  • Crafting: recipes and the crafting catalog split into typed modules.
  • Features, feature rules, structures, loot tables, trade tables,
    dialogue, UI, particles, PBR, camera, sounds, textures, geometry,
    animations and voxel shapes are all typed files.
  • Molang: pack setting queries, Math.sign / Math.copy_sign, strict lerp.

Minecraft 1.26.60

  • Vanilla data updated to 1.26.60; experimental vanilla content moved to
    anvil.beta.vanilla. Vanilla factories only accept real ids.
  • Stricter entity schemas: {min, max} ranges (jump_delay, timer time,
    attack damage, economy_trade_table discounts), transformation delay and
    sound lists, trail radius, no tags with states in block descriptors.
  • block_entity entity_storage and container title (experimental).
  • Server sound definitions are no longer experimental (1.26.60 schema).
  • Dimensions are components in anvil.api.dimension (format 1.26.50,
    vanilla overrides only).
  • Loot tables write format_version 1.26.60; new biome_has_tag condition.
  • mega_trunk trunk_width accepts a range; jigsaw on_placed.
  • Manifest multiselect pack setting.
  • Script modules: @minecraft/server 2.11.0, @minecraft/server-ui 2.3.0.

Beta (features.experimental)

  • anvil.beta.blocks.components: BlockCollisionBoxMinMax (min/max boxes
    or a voxel shape from a Blockbench model), BlockEnchantmentPowerTransmitter,
    BlockVibrationProperties, BlockNeighborChange.
  • anvil.beta.actors.components: EntityReflectProjectiles.

Project and tooling

  • Config redesign: anvilconfig.json sections package, manifest, features,
    build and anvil (no migration from the old layout).
  • pathlib everywhere, orjson everywhere, ValueError for user errors.
  • tools/update_vanilla.py rebuilds the vanilla module from bedrock-samples.
  • Docs: guides and API reference rewritten for the typed API.
  • New issue and PR templates and contribution guide. The 0.9.x changelog
    is archived in the docs; release notes now live on GitHub Releases.

v0.9.101

Choose a tag to compare

@github-actions github-actions released this 21 Oct 14:47

Anvil

  • Sound files given with forward-slash paths are copied under their file name: before, only backslashes were split on, so a path/to/sound.ogg source kept its whole path as its name.

Kit

  • Wood set doors make double doors like vanilla: a door placed with a door on its left and none on its right hinges on the right and opens the other way, so the pair opens from the middle. Doors from other namespaces count whatever way they face, the set's own doors only when they face the same way. Added the hinge_right state and the BlockWoodSetDoor component (wood_set_door), which needs that state.
  • The wood set redstone consumer script is now redstone-consumer.ts (was redstoneConsumer.ts); the generated script index turns kebab-case module names into register<Name>Component.

v0.9.100

Choose a tag to compare

@github-actions github-actions released this 12 Oct 16:49

Release v0.9.100

Anvil

  • Fixed blocks.json nesting its blocks under a "blocks" key, which the game ignores: they now sit next to format_version, like vanilla. This affected every block with custom sounds.
  • Added block.client.sound_group(BlockSoundGroup.Wood), which gives a block the sounds of a vanilla sound group through blocks.json, with no sound files (block_sound is still how you make your own). BlockSoundGroup lists the vanilla groups, and BlocksJSONObject.add_block takes the group.
  • process_subcommand takes exit_on_error, which exits with the subprocess's return code when it fails. The script build and anvil build use it, so a failed build fails the CI job instead of carrying on.
  • A Blockbench model already loaded as another source can also be loaded as items, this is particularly useful for Item Embeds and because there are no item model exports.
  • The generated GitHub release workflow runs on Ubuntu and can also be started by hand, never runs two releases of a ref at once, installs mcanvil at least as new as the Anvil that generated it, plus the project's requirements.txt, and builds with local export on. It releases only when no release exists for the version (any other API error fails the job instead of guessing), checks that the build made the .mcaddon or .mcworld the target needs, and tags the pushed commit.

Kit

  • Added WoodSet.map_color(color) (and map_color= on create_wood_set) to the wood set kit: the color every block of the set has on a map, "#e6d063" by default. Each block's create takes it as a keyword-only map_color.
  • Added WoodSet.sound_group(group, parts) and WoodSet.options(parts, **options) to the wood set kit: the first sets the vanilla sound group of some parts, the second passes keyword arguments to their create, like the ids of the sounds the scripts play (open_sound, close_sound for doors, trapdoors and fence gates, on_sound, off_sound for buttons and pressure plates). A block's own sounds from files are made with block.client.block_sound(...) on the built part.
  • Wood set blocks have vanilla sounds: the wood group, hanging_sign for the hanging sign and grass for leaves and saplings, as oak has.
  • Wood set doors, trapdoors, fence gates, buttons and pressure plates play their vanilla open, close and click sounds: the game only plays those for vanilla blocks, so the scripts play them (also when redstone opens or closes them). BlockWoodSetInteractable, BlockWoodSetRedstoneConsumer and BlockWoodSetTogglable take their ids as open_sound, close_sound, on_sound and off_sound.
  • Wood set blocks now use BlockLiquidDetection like vanilla Bedrock: slabs, stairs, fences, fence gates, doors, trapdoors, signs, hanging signs and leaves can be waterlogged, and saplings pop off and drop their loot when water flows into them. Leaves that decay while waterlogged leave their water behind.
  • Wood set doors, trapdoors and fence gates keep their open state when the world reloads. A powered state remembers the last redstone power, so they only open or close when it changes (before, any redstone update without power closed them). Doors count as powered while either half is. Blocks using BlockWoodSetRedstoneConsumer need a powered state.

Repository

  • Anvil's own GitHub workflows are split into main, test, version, release, publish_pypi and docs (renamed from build_docs), replacing publish_to_pypi and publish_to_test_pypi.

0.9.96

Choose a tag to compare

@StarkTMA StarkTMA released this 03 Oct 16:43

Anvil

  • Added the --debug flag to anvil build, enabling debug mode for that build.
  • Component dependencies of a permutation can now be satisfied by the block's root components.
  • Bumped the geometry format version to 1.26.0.
  • Declared requests as a dependency (it was imported but only installed indirectly).

Models

  • Added anvil.api.models, builders for model files made in code:
    • Geometry (*.geo.json): a tree of bones holding cubes and locators, with clone(), merge(), translate() and scale(). Cubes use box UV (uv=(u, v)) or per-face UVs as keyword arguments (north=((0, 0), (4, 4)), up=((4, 0), (4, 4), 90), or a dict for a material_instance).
    • Animations (*.animations.json): many animations in one file, with position/rotation/scale keyframes, particle, sound and timeline events, and validate() against a Geometry.
    • VoxelShape (*.shape.json): named groups of boxes, built like a Geometry.
  • Geometry, animation and culling shape references now accept these objects as well as names:
    • Entities and attachables: geometry(...), animation(...) and reuse_assets.geometry(...) / reuse_assets.animation(...).
    • BlockGeometry, BlockItemVisual and BlockEmbeddedVisual accept a Geometry.
    • BlockGeometry.block_culling() accepts a VoxelShape, and gives a code-built geometry its own culling rules.

Blockbench

  • The Blockbench importer now builds anvil.api.models objects and lives in the internal anvil.lib.blockbench package. Imported models export the same files as before.
  • Collections:
    • Groups nested inside a collection are resolved with their full children.
    • A node is no longer exported twice when one of its ancestors is also in the collection.
    • queue_model checks the collection identifier.
  • Block culling rules are now one file per geometry (<model> or <model>.<collection>), checked against that geometry's bones; cube_index is checked against the bone's actual cubes.
  • Voxel shapes mirror the model's groups; exporting a voxel shape from a model with no bounding boxes now raises an error, and inverted boxes are normalized.
  • Animations:
    • Empty particle and sound effects are skipped.
    • Sounds without a locator no longer write "locator": null.
    • Several events on the same keyframe are all kept.
    • Animation files are exported under their source folder.
    • Keyframe values are trimmed, and a blank value counts as 0 like in Blockbench, instead of exporting an invalid Molang expression.
  • Loading the same .bbmodel under two sources (e.g. as an item and as a block) now raises an error.
  • Duplicate bone names in a model now raise an error instead of silently dropping a bone.
  • A model with both top-level cubes and a root group keeps all cubes.
  • override_bounding_box now also applies to geometries that were already built.

Blocks

  • Added the BlockReplaceable component.
  • BlockEntity no longer writes an empty container when no slot_count is given.
  • BlockMapColor accepts any color format.
  • BlockItemVisual and BlockEmbeddedVisual support Blockbench collections (collection=) and bone_visibility().
  • placement_direction only writes the fields that are set.
  • Removed a duplicate definition of BlockDestructionParticles.
  • Fixed BlockGeometry.n_way_visual_rotation(), which always failed; it now takes the axes as keywords like the visual components: n_way_visual_rotation(y=...).

Molang

  • Breaking: Query.All and Query.Any take the compared queries as a list: Query.All(query, [a, b]).
  • Breaking: Query.AllTags takes a list of tags, Query.AllTags(["minecraft:is_axe"]), and raises an error when given a single string.

Enums

  • Breaking: block state enums were renamed and regrouped:
    • BlockFaces → BlockFaceValues
    • BlockFacesTrait → FacingDirectionValues (which also replaces FacingDirectionsTrait)
    • CardinalDirectionsTrait → CardinalDirectionsValues
    • VerticalHalfTrait → VerticalHalfValues
    • BlockCorner → BlockCornerValues
    • BlockCardinalConnection → CardinalConnectionStates
  • Added the BlockCornerState and MultiblockPartState enums.

Items

  • CraftingItemCatalog is now a true singleton, so groups added from different places end up in one catalog file instead of overwriting each other.
  • CraftingItemCatalog.add_group() extends an existing group instead of adding a duplicate.

Schemas

  • MinecraftBlockDescriptor can match blocks by tags alone: tags is now a Molang expression (e.g. Query.AllTags([...])) and name is optional. Block states still require a name.

Vanilla

  • Added MinecraftBlockTags.CornerableStairs and MinecraftBlockTags.HasFenceConnections.
  • Added MinecraftItemTags.CopperTier.

Kit

  • Added anvil.kit.blocks.wood_set: create_wood_set(name, blocks=WoodBlock.ALL) creates a complete wood set (planks, logs, wood, stripped variants, slabs, stairs, fences, fence gates, doors, trapdoors, buttons, pressure plates, wall signs, standing signs, hanging signs, boats and chest boats). The set includes:
    • Its recipes.
    • Vanilla wood tags, so every vanilla wood recipe accepts its planks, slabs and logs.
    • Vanilla fuel values.
    • Creative inventory placement next to the vanilla blocks, or in its own group with own_creative_group=True.
    • The TypeScript components the blocks need, generated for every wood set in the project.
    • Wall signs and standing signs (16-way rotation), placed with a single <name>_sign item like vanilla signs, that ask for their text in a form when placed, store it in the block's dynamic properties, and show it again for editing when used (needs scriptui).
    • Hanging signs: one block hung under a block or on its side (cardinal rotation, a separate bone for each), 4 lines of 9 characters, broken with the block holding it.
    • Signs can be dyed and made to glow with a glow ink sac (an ink sac removes the glow), in vanilla's dye colours and glow outline.
    • Boats (two seats) and chest boats (one seat and a 27-slot chest, opened by sneaking) sharing one model. They float, face away from the player when placed, steer like vanilla boats (A/D turn, W/S row), can be leashed, and animate their paddles and shake when hit. They break after a few quick hits, or at once with an axe or in creative, dropping their item (not in creative) and the chest's contents.
    • Its custom components as classes in anvil.kit.blocks.wood_set.components: BlockWoodSetSign (text position, scale, line length, double-sided text), BlockWoodSetSupport (breaks the block with the block below, the one it was placed against or the one it faces, set with SupportedBy), BlockWoodSetInteractable, BlockWoodSetRedstoneConsumer, BlockWoodSetStrippable, BlockWoodSetTogglable and BlockWoodSetSlab.
  • anvil.kit.world.ldtk now explains how to install Amulet (pip install mcanvil[ldtk]) when it is missing.

Documentation

  • Added the Models API pages and a Kit page, which notes that the kit may change between minor versions while anvil.api is the stable layer.
  • Updated the PBR guide to BlockFaceValues.

0.9.93

Choose a tag to compare

@StarkTMA StarkTMA released this 16 Sep 00:58

Anvil

  • Updated format version to 1.26.50.
  • Updated @minecraft/ npm package versions.
  • Particles now check for the existence of non vanilla particles referenced in the particle events.
  • Behaviour Pack settings can now be used without setting the preview flag to true.

Actor

  • Updated EntityAngerLevel, EntityProjectile, EntityAIRangedAttack components.
  • Updated EntityProjectile component and its on_hit subcomponents (wind_burst_on_hit, catch_fire_on_hit, thrown_potion_effect, arrow_effect, impact_damage, spawn_chance, stick_in_ground) according to the latest Bedrock documentation.
  • Added EntityFreezingImmune, EntityFreezingVulnerable, EntityCanStandOnPowderSnow components.

Blocks

  • Added the new BlockEntity component.

Vanilla

  • Added new Abandoned Camp Feature/Structure entries.
  • Added all new Wool Stairs and Wool Slabs 16 color block factories.
  • Added all new Cushion item factories.
  • Added the new Cushion entity factory.
  • Added a new minecraft:leaves block tag.

0.9.92

Choose a tag to compare

@StarkTMA StarkTMA released this 04 Sep 17:12

Anvil

  • Added cross-platform support for Linux and macOS alongside Windows. Operating systems outside of Windows, Linux, and macOS are explicitly disallowed and raise an OSError.
  • Added local_export (bool) configuration option under [ANVIL] in anvilconfig.json.
    • When enabled (or running on non-Windows), exports development resource packs, behavior packs, and worlds into an isolated ./output/com.mojang/ directory structure (output/com.mojang/development_resource_packs/RP_<name>, output/com.mojang/development_behavior_packs/BP_<name>, output/com.mojang/minecraftWorlds/<name>), preventing namespace collisions with packaged distribution archives (.mcaddon, .mcworld, .zip, .pdf) in ./output/.
    • On Windows with local_export: false, continues exporting to Minecraft Bedrock AppData folders (RELEASE_COM_MOJANG or PREVIEW_COM_MOJANG).
    • On non-Windows platforms, local_export is enforced as True at runtime.
  • Updated Directory.create() to safely support absolute paths cross-platform without prepending ./.
  • Updated anvil init --vscode workspace launcher to support cross-platform commands (start on Windows, open on macOS, and xdg-open on Linux).
  • Updated anvil clean / anvil clear and build-time pack cleanup (clean_old_dev) to dynamically locate and clear development packs from output/com.mojang when local export is active.
  • Simplified esbuild.js scaffolding template to drop local path guessing and rely exclusively on the --outdir argument supplied during anvil build.
  • Updated documentation and README with badges and setup instructions for Windows, Linux, and macOS.

Blockbench

  • Added support for locator rotation and ignore_inherited_scale properties in Blockbench models.
  • Fixed newline handling in animation particle keyframes, allowing particle scripts, effects, and locators to be parsed cleanly without formatting issues.
  • Added VOXEL_SHAPE_VERSION (1.21.110) format version constant.

Components

  • Added add_stamp (bool) option under [ANVIL] in anvilconfig.json to configure whether metadata stamps are prepended to generated files.
  • Restricted EntityAIHide.poi_type with strict Literal["bed", "jobsite", "meeting_area"] typing.

0.9.91

Choose a tag to compare

@StarkTMA StarkTMA released this 22 Aug 04:02

CLI & Scaffolding

  • Enhanced AnvilValidator.check_new_versions() to detect outdated packages across both npm dependencies and pip (mcanvil), outputting a clear, color-coded terminal table.
  • Updated project scaffolding template package.json to include default "build" (node esbuild.js) and "test" (npx tsc --noemit) npm scripts.
  • Updated esbuild.js scaffolding template to target BP_${projectName} behavior pack output directory and dynamically exclude @minecraft/server-ui based on the scriptui config flag.
  • Updated GitHub Actions release workflow template to use Node.js version 24.
  • Comprehensive documentation updates for the anvil init command (alias anvil create), clarifying valid flags and providing guidance on removed CLI options (--pbr, --random_seed/--seed, and --fullns).

Core

  • Updated behavior pack module dependencies (ManifestBP) so that @minecraft/server and @minecraft/server-ui preview module versions are only used when both preview and experimental flags are enabled.

0.9.9

Choose a tag to compare

@StarkTMA StarkTMA released this 05 Aug 17:39

Blockbench

  • Added Voxel Shape support for Blockbench models. Now you can generate bounding boxes for your blocks in Blockbench and queue them to export using BlockGeometry.block_culling with full support for collections.

Blocks

  • Added BlockInstrumentSound block component for mapping note block sounds to up and down block faces.
  • Enhanced multi_block trait in _BlockTraits:
    • Added support for horizontal directions ("north", "south", "east", "west") under experimental flag.
    • Added strict trait conflict validation: multi_block cannot be combined with placement_position or connection traits.
    • Restricted multi_block + placement_direction usage to PlacementDirectionTrait.CardinalDirection.

Features

  • Added MultiBlockFeature for placing multi-blocks in worldgen.

Actors & Entities

  • Added EntityNotPickableFromInside component to prevent cursor targeting when the player's camera lies inside the entity's collision box.
  • Updated EntityApplyKnockbackRules, EntityProjectile and EntityAIUseKineticWeapon with the new schema.
  • Updated EntityMovementMeters calculation precision to 4 decimal places.

Vanilla

  • Added "minecraft:cushion" to vanilla entity IDs list.
  • Added ~80 new block factories:
    • Colored wool slabs, double slabs, and stairs for all 16 wool colors ({Color}WoolDoubleSlab, {Color}WoolSlab, {Color}WoolStairs).
    • Full Poplar wood block set (PoplarButton, PoplarDoor, PoplarDoubleSlab, PoplarFence, PoplarFenceGate, PoplarHangingSign, PoplarLog, PoplarPlanks, PoplarPressurePlate, PoplarSapling, PoplarShelf, PoplarSlab, PoplarStairs, PoplarStandingSign, PoplarTrapdoor, PoplarWallSign, PoplarWood).
    • StrippedPoplarLog and StrippedPoplarWood.
    • Poplar leaf variants (OrangePoplarLeaves, RedPoplarLeaves, YellowPoplarLeaves).
    • New blocks: RedShrub, ShelfMushroom, and StrawBed.

v0.9.8.71

Choose a tag to compare

@StarkTMA StarkTMA released this 29 Jul 17:09

Anvil

  • The Fonts object will now create the default8 texture in the resource pack instead of /assets
  • Update format version to 1.26.34.
  • Increased the file path length from 80 to 96.
  • Fixed molang condition test unit.

Actors

  • You can now customize your initial state name in client/server animation controller with "default" as the default name.
  • Server animations now require a list of commands/events instead of a star-args.
  • Creating a render controller with the same name will now return the existing controller if it exists instead of overwriting it.

Blocks

  • Added minecraft:sixteen_way_rotation trait.

Molang

  • Renamed Molang.molang_condition() to Molang.condition()