The launcher prepares a version in-process when it ships the preparer sources
the launcher was built with, with the version's own horizon-prepare when they
differ, and with the Python script only for versions made before it. Release
folders ship horizon-prepare and its sources; resources are reused between
versions with the same preparer. The game's messages, PLAY.txt, the docs and
release builds name horizon-prepare, and tools/prepare_native_client.py is a
wrapper of it for the development tools.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The creative-tabs.json export failed to build the functional blocks tab (no
data-pack registries: banner patterns), and its fallback read decompiled
sources from a path that no longer exists, so the tab was empty and anvils,
crafting and smithing tables were missing from the tabs and the search. The
search also matched only an approximate display name.
VanillaCreativeTabsExporter now builds every tab with vanilla's own
CreativeModeTabs.tryRebuildTabContents over the vanilla data pack's
registries and writes creative-inventory.json: stacks with components, and
the search tab's creative tooltip lines and tags. The client searches them
as SessionSearchTrees does (FullTextSearchTree, IdSearchTree after '#').
Changing tab empties the search box, as in selectTab.
The scrollbar only jumped to the pressed point; holding it now scrolls as
the mouse moves, anywhere, until release (mouseClicked/mouseDragged), and
the wheel and the scroller follow ItemPickerMenu.
tools/test_creative_parity.py compares every tab and 6,793 searches with
the vanilla client's own search trees. horizon-ctl `type` also fills the
creative search box.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Horizon no longer fetches anything of Minecraft from Mojang's servers. The
client jar, version JSON, libraries and assets come from the user's official
launcher install, and the server jar is one they downloaded themselves
(--server-jar or HORIZON_SERVER_JAR). Every file is checked against checksums
pinned in research-lock.json, and the prepared .local/ layout is byte-identical
to the old downloads, so the harnesses and the native client are unchanged.
CI keeps the offline checks on GitHub's runners; the vanilla comparisons and
the mod build need the game, so they move to a manual job on a self-hosted
runner that holds the maintainer's own copy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Uncommitted changes the agent had in progress when it was stopped; may not
build or pass its harnesses yet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mobs now run vanilla's tick order with a GoalSelector/target selector
(priorities, MOVE/LOOK/JUMP/TARGET flags), PathNavigation over the
walk/swim/fly/amphibious node evaluators, Move/Look/Jump/BodyRotation
controls and LivingEntity travel in air, water and lava. Path types,
spawn surfaces and keyframe animations come from a new exporter
(VanillaMobDataExporter -> mob-data.json). Farm animals, zombies,
skeletons, creepers and spiders get their vanilla goals; projectiles
(arrows, snowballs, eggs, ender pearls, fireballs) share one system;
natural spawning follows NaturalSpawner with category caps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 127 skipped placed features were all skipped because the worldgen bundle
lacked worldgen/blocks/{block-properties,cached-collision,cached-support}.nbt
and the survival definitions, which prepare_native_client.py only copied from
a previous simple-block parity run. Run the vanilla exporter directly when
those files are missing, and say so in the client when they are absent.
With them, every placed feature of the three dimensions runs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Port the creative screen's Escape and E handling into key_pressed, which
the control socket shares with the window, and keep both exporter hashes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Uncommitted work from a finished agent worktree on ludothinkpad (/home/ludovic/.t3/worktrees/2026-10-03-i-want-you-to-retro-e5fa4461/t3code-ec3c613c), saved before the worktree was removed. Not built or verified.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run the worldgen step after vanilla's data generator, which writes the
biome parameter tables it reads, and export entity-types.json with the
existing VanillaEntityTypesExporter. Without these, preparation failed and
the client exited with "No such file or directory" when loading mobs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Load gzip NBT structure templates lazily with vanilla palette ordering,
apply processors (rule, block_ignore, block_rot, gravity, protected_blocks,
capped, jigsaw_replacement, block_age, lava_submerged) and place them with
rotation/mirror, waterlogging and block-entity data (loot seeds). Per-state
rotate/mirror tables and template ordering flags come from a new vanilla
exporter. Template and fossil features now decode, so desert wells,
fossils and sulfur springs generate; their block entities are kept on the
ProtoChunk. The prepare script bundles templates, processor lists, pools,
structures and structure sets.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Behaviours loads per-block class chains, instance configuration and per-state
support/signal/fluid facts exported by VanillaBlockBehaviourExporter, and ports
Level.setBlock with the CollectingNeighborUpdater, updateShape for every
overriding class, canSurvive, FlowingFluid spreading with lava/water
interactions, gravity blocks, rails, tripwires, redstone wire/torches/diodes,
scheduled ticks and random ticks.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GeneratorData loads a worldgen bundle (written by prepare_native_client.py
to the client resource dir) once; OverworldGenerator binds a seed and shares
compiled samplers across threads; GeneratorWorker generates vanilla
BIOMES..TERRAIN proto chunks (noise fill with aquifers, material surface,
carvers) that match the material-stage parity dumps. Decoration is stubbed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Model catalog now binds all registered blockstates. Sprites accept
fractional alpha, interpolated animations and non-16px frames
(resampled into the shared 16px array). Resource preparation extracts
every jar asset and data file, exports per-state light/hardness/sound
facts through a vanilla exporter, and bundles item default components
from vanilla's data generator reports.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>