Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

What this book skips

Verified against Minecraft 26.3 · Part I · A reader opens the atlas, sees fourteen packages hatched, and asks what is in them and why no part counts them.

Open the atlas and part of the jar is drawn hatched. That hatching is this page. Java Minecraft is 7,301 source files and 741,069 lines, and the parts do not reach all of it. Some of what is left out is excluded on purpose by the newest-version-only rule — save migration is version-difference code, and a book that documents only the current version has nothing to say about it. Some is out of scope because it is a client for a service this book cannot read. And one hatched box is not skipped code so much as skipped ground: net/minecraft/data is the program that writes vanilla’s own content as a data pack, it ships in the dedicated server jar — all 174 files of it — and the running game compiles against it and calls into it. Blocks names TreeFeatures keys while it constructs mushroom blocks; MinecraftServer reaches for a MiscOverworldFeatures key for the bonus chest; the F3 screen’s biome-builder line runs through NoiseRouterData.peaksAndValleys into TerrainProvider. A boundary drawn honestly has to show where it leaks, and that is the largest leak in it.

The 26.3 jar as a treemap of packages: area is lines of decompiled source, colour is which jar ships the package, hatching marks the packages what this book skips tours net/minecraft/world — 2715 classes, 313,098 lines, shared net/minecraft/world/level — 1418 classes, 151,146 lines, shared level 151,146 net/minecraft/world/entity — 727 classes, 110,760 lines, shared entity 110,760 net/minecraft/world/item — 323 classes, 30,661 lines, shared item 30,661 net/minecraft/world/inventory — 64 classes, 7,152 lines, shared inventory 7,152 net/minecraft/world/phys — 28 classes, 3,036 lines, shared phys net/minecraft/world/attribute — 30 classes, 1,936 lines, shared net/minecraft/world — 25 classes, 1,686 lines, shared net/minecraft/world/scores — 16 classes, 1,442 lines, shared net/minecraft/world/effect — 20 classes, 1,306 lines, shared net/minecraft/world/damagesource — 12 classes, 936 lines, shared net/minecraft/world/ticks — 14 classes, 869 lines, shared net/minecraft/world/waypoints — 9 classes, 677 lines, shared net/minecraft/world/timeline — 5 classes, 446 lines, shared net/minecraft/world/clock — 11 classes, 390 lines, shared net/minecraft/world/flag — 7 classes, 356 lines, shared net/minecraft/world/food — 6 classes, 299 lines, shared world 42% net/minecraft/client — 1891 classes, 176,818 lines, client-only net/minecraft/client/gui — 445 classes, 59,594 lines, client-only gui 59,594 net/minecraft/client/renderer — 715 classes, 50,649 lines, client-only renderer 50,649 net/minecraft/client/model — 268 classes, 12,712 lines, client-only model 12,712 net/minecraft/client/multiplayer — 63 classes, 11,303 lines, client-only multiplayer 11,303 net/minecraft/client — 41 classes, 10,821 lines, client-only (itself) 10,821 net/minecraft/client/resources — 110 classes, 8,326 lines, client-only resources 8,326 net/minecraft/client/particle — 88 classes, 6,839 lines, client-only particle 6,839 net/minecraft/client/data — 28 classes, 6,189 lines, client-only — toured in what this book skips data 6,189 net/minecraft/client/sounds — 17 classes, 2,174 lines, client-only sounds net/minecraft/client/player — 11 classes, 2,072 lines, client-only player net/minecraft/client/telemetry — 18 classes, 1,221 lines, client-only — toured in what this book skips net/minecraft/client/server — 6 classes, 885 lines, client-only net/minecraft/client/color — 17 classes, 879 lines, client-only net/minecraft/client/tutorial — 10 classes, 671 lines, client-only net/minecraft/client/main — 4 classes, 523 lines, client-only net/minecraft/client/animation — 23 classes, 509 lines, client-only net/minecraft/client/searchtree — 8 classes, 505 lines, client-only net/minecraft/client/input — 8 classes, 304 lines, client-only net/minecraft/client/quickplay — 3 classes, 284 lines, client-only net/minecraft/client/entity — 4 classes, 228 lines, client-only net/minecraft/client/profiling — 2 classes, 81 lines, client-only net/minecraft/client/waypoints — 2 classes, 49 lines, client-only client 24% net/minecraft/util — 735 classes, 54,700 lines, shared net/minecraft/util/datafix — 411 classes, 27,048 lines, shared — toured in what this book skips datafix 27,048 net/minecraft/util — 93 classes, 12,767 lines, shared (itself) 12,767 net/minecraft/util/profiling — 70 classes, 4,265 lines, shared — toured in what this book skips profiling 4,265 net/minecraft/util/filefix — 57 classes, 3,553 lines, shared — toured in what this book skips filefix net/minecraft/util/parsing — 29 classes, 1,879 lines, shared net/minecraft/util/debug — 19 classes, 1,348 lines, shared net/minecraft/util/worldupdate — 6 classes, 958 lines, shared net/minecraft/util/thread — 9 classes, 842 lines, shared net/minecraft/util/valueproviders — 19 classes, 707 lines, shared net/minecraft/util/eventlog — 4 classes, 459 lines, shared net/minecraft/util/random — 4 classes, 374 lines, shared net/minecraft/util/debugchart — 8 classes, 199 lines, shared net/minecraft/util/context — 4 classes, 181 lines, shared net/minecraft/util/monitoring — 2 classes, 120 lines, shared util 7% net/minecraft/server — 432 classes, 53,789 lines, shared net/minecraft/server/commands — 111 classes, 13,357 lines, shared commands 13,357 net/minecraft/server/level — 42 classes, 12,166 lines, shared level 12,166 net/minecraft/server/network — 29 classes, 5,566 lines, shared network 5,566 net/minecraft/server — 27 classes, 5,153 lines, shared (itself) 5,153 net/minecraft/server/packs — 57 classes, 5,122 lines, shared packs 5,122 net/minecraft/server/jsonrpc — 65 classes, 4,118 lines, shared — toured in what this book skips jsonrpc 4,118 net/minecraft/server/players — 19 classes, 2,770 lines, shared players net/minecraft/server/dedicated — 7 classes, 1,811 lines, shared net/minecraft/server/dialog — 35 classes, 885 lines, shared net/minecraft/server/rcon — 9 classes, 837 lines, shared — toured in what this book skips net/minecraft/server/permissions — 12 classes, 402 lines, shared net/minecraft/server/chase — 3 classes, 354 lines, shared net/minecraft/server/notifications — 5 classes, 343 lines, shared net/minecraft/server/bossevents — 3 classes, 328 lines, shared net/minecraft/server/gui — 4 classes, 310 lines, shared net/minecraft/server/waypoints — 2 classes, 180 lines, shared net/minecraft/server/advancements — 2 classes, 87 lines, shared server 7% net/minecraft/network — 416 classes, 23,319 lines, shared net/minecraft/network/protocol — 298 classes, 12,872 lines, shared protocol 12,872 net/minecraft/network/chat — 63 classes, 4,799 lines, shared chat 4,799 net/minecraft/network — 42 classes, 3,590 lines, shared net/minecraft/network/codec — 7 classes, 1,533 lines, shared net/minecraft/network/syncher — 6 classes, 525 lines, shared network 3% com/mojang/renderpearl — 146 classes, 18,659 lines, client-only com/mojang/renderpearl/backend — 76 classes, 13,866 lines, client-only backend 13,866 com/mojang/renderpearl/frontend — 12 classes, 2,876 lines, client-only frontend com/mojang/renderpearl/api — 53 classes, 1,879 lines, client-only api com/mojang/renderpearl/util — 4 classes, 34 lines, client-only com/mojang/renderpearl — 1 classes, 4 lines, client-only renderpearl net/minecraft/data — 174 classes, 16,849 lines, shared net/minecraft/data/worldgen — 64 classes, 6,016 lines, shared — toured in what this book skips worldgen 6,016 net/minecraft/data/loot — 21 classes, 3,023 lines, shared — toured in what this book skips loot 3,023 net/minecraft/data/recipes — 20 classes, 2,507 lines, shared — toured in what this book skips net/minecraft/data/tags — 29 classes, 1,756 lines, shared — toured in what this book skips tags net/minecraft/data — 10 classes, 1,272 lines, shared — toured in what this book skips net/minecraft/data/advancements — 10 classes, 896 lines, shared — toured in what this book skips net/minecraft/data/info — 8 classes, 518 lines, shared — toured in what this book skips net/minecraft/data/structures — 5 classes, 473 lines, shared — toured in what this book skips net/minecraft/data/registries — 5 classes, 325 lines, shared — toured in what this book skips net/minecraft/data/metadata — 2 classes, 63 lines, shared — toured in what this book skips data 2% com/mojang/realmsclient — 137 classes, 14,701 lines, client-only com/mojang/realmsclient/gui — 46 classes, 7,091 lines, client-only — toured in what this book skips gui 7,091 com/mojang/realmsclient/client — 19 classes, 2,643 lines, client-only — toured in what this book skips client com/mojang/realmsclient/dto — 43 classes, 1,986 lines, client-only — toured in what this book skips dto com/mojang/realmsclient — 4 classes, 1,492 lines, client-only — toured in what this book skips com/mojang/realmsclient/util — 20 classes, 1,425 lines, client-only — toured in what this book skips util com/mojang/realmsclient/exception — 5 classes, 64 lines, client-only — toured in what this book skips realmsclient net/minecraft/commands — 124 classes, 13,229 lines, shared net/minecraft/commands/arguments — 73 classes, 9,017 lines, shared arguments 9,017 net/minecraft/commands — 14 classes, 1,921 lines, shared net/minecraft/commands/synchronization — 12 classes, 905 lines, shared net/minecraft/commands/execution — 18 classes, 756 lines, shared net/minecraft/commands/functions — 7 classes, 630 lines, shared commands 2% net/minecraft/core — 123 classes, 12,359 lines, shared net/minecraft/core — 39 classes, 5,499 lines, shared (itself) 5,499 net/minecraft/core/component — 32 classes, 3,067 lines, shared net/minecraft/core/registries — 14 classes, 1,525 lines, shared net/minecraft/core/dispenser — 14 classes, 1,098 lines, shared net/minecraft/core/particles — 21 classes, 863 lines, shared net/minecraft/core/cauldron — 3 classes, 307 lines, shared core 2% com/mojang/blaze3d — 86 classes, 10,437 lines, client-only com/mojang/blaze3d/platform — 26 classes, 4,382 lines, client-only com/mojang/blaze3d/vertex — 14 classes, 2,322 lines, client-only vertex com/mojang/blaze3d/audio — 12 classes, 1,013 lines, client-only — toured in what this book skips com/mojang/blaze3d/systems — 5 classes, 773 lines, client-only com/mojang/blaze3d/framegraph — 3 classes, 437 lines, client-only com/mojang/blaze3d/font — 7 classes, 432 lines, client-only com/mojang/blaze3d/pipeline — 5 classes, 366 lines, client-only com/mojang/blaze3d — 5 classes, 289 lines, client-only com/mojang/blaze3d/buffers — 3 classes, 228 lines, client-only com/mojang/blaze3d/resource — 6 classes, 195 lines, client-only blaze3d 1% net/minecraft/nbt — 43 classes, 7,791 lines, shared net/minecraft/nbt — 36 classes, 7,279 lines, shared (itself) 7,279 net/minecraft/nbt/visitors — 7 classes, 512 lines, shared nbt 1% net/minecraft/advancements — 115 classes, 7,647 lines, shared net/minecraft/advancements/predicates — 53 classes, 3,450 lines, shared net/minecraft/advancements/triggers — 49 classes, 2,816 lines, shared net/minecraft/advancements — 13 classes, 1,381 lines, shared net/minecraft/gametest — 48 classes, 5,756 lines, shared net/minecraft/gametest/framework — 46 classes, 5,737 lines, shared net/minecraft/gametest — 2 classes, 19 lines, shared net/minecraft/sounds — 6 classes, 2,124 lines, shared net/minecraft/sounds — 6 classes, 2,124 lines, shared sounds net/minecraft/tags — 29 classes, 1,874 lines, shared net/minecraft/tags — 29 classes, 1,874 lines, shared tags net/minecraft — 19 classes, 1,665 lines, shared net/minecraft — 19 classes, 1,665 lines, shared net/minecraft/references — 5 classes, 1,483 lines, shared net/minecraft/references — 5 classes, 1,483 lines, shared — toured in what this book skips net/minecraft/resources — 12 classes, 1,473 lines, shared net/minecraft/resources — 12 classes, 1,473 lines, shared com/mojang/math — 10 classes, 1,054 lines, shared com/mojang/math — 10 classes, 1,054 lines, shared math net/minecraft/stats — 10 classes, 874 lines, shared net/minecraft/stats — 10 classes, 874 lines, shared — toured in what this book skips net/minecraft/gizmos — 15 classes, 569 lines, shared net/minecraft/gizmos — 15 classes, 569 lines, shared — toured in what this book skips net/minecraft/recipebook — 3 classes, 351 lines, shared net/minecraft/locale — 3 classes, 247 lines, shared net/minecraft/realms — 4 classes, 203 lines, client-only in both jars client only hatched: toured in what this book skips 741,069 lines, 7301 classes — area is lines of decompiled source
The jar by package, area by lines of decompiled source. Hatched boxes are the packages this page tours, which no part counts. Click to enlarge.

The sizes, and which jar ships them

Each entry below says what the thing is, roughly how big it is, whether the dedicated server ships it, one fact worth knowing, and where to start reading. The treemap deliberately does not hatch net/minecraft/gametest: Part XIII covers it, so it is a gap that closed rather than a skip. It cannot hatch player reporting either, which is why the table has fifteen top-level rows against the map’s fourteen hatched packages: the map’s smallest box is a package four levels deep, and net/minecraft/client/multiplayer/chat/report is six, sitting inside a package Parts IX and X between them own. The counts in the tables are files unless a cell says classes, so a package-info.java counts as one there and wherever the prose quotes the tables; a cell or a sentence that counts a package’s working classes leaves it out.

packagefileslinesside
net/minecraft/util/datafix41127,048both
net/minecraft/util/filefix573,553both
net/minecraft/client/telemetry181,221client
net/minecraft/util/profiling704,265both
net/minecraft/server/jsonrpc654,118dedicated server
net/minecraft/server/rcon9837dedicated server
com/mojang/realmsclient13714,701client
net/minecraft/realms4203client
net/minecraft/stats10874both
net/minecraft/gizmos15569both
net/minecraft/references51,483both
net/minecraft/data17416,849both — see below
└ net/minecraft/data/worldgen646,016both — see below
net/minecraft/client/data286,189client
com/mojang/blaze3d/audio121,013client
net/minecraft/client/multiplayer/chat/report12952client

The oracle for “server or client” throughout is the list of classes the dedicated server jar ships, which lives beside the decompile. It answers exactly one question — does the dedicated server have this class — so it can prove “client-only” and it can prove “both jars”, and it cannot prove “dedicated server only”. Two rows are labelled that way on the strength of a different check: nothing under net/minecraft/client or com/mojang/blaze3d references them. rcon is reached from DedicatedServer alone; jsonrpc from six files, and two of them — BuiltInRegistries and Registries — are classes the client loads at bootstrap, so the package’s types are on the client and the server it configures is not.

Save migration, and the fixer that moves files

net/minecraft/util/datafix — the largest thing on this page and the most explicitly out of scope. DataFixers is one static class whose whole body is the migration history of the game written out longhand: just over three hundred schema registrations and four hundred-odd fixes, from schema 99 up to the current world version. The rewriting machinery itself is Mojang’s external DataFixerUpper library; what lives here is the vanilla catalogue — util/datafix/schemas describing the shape of the data at each version, and util/datafix/fixes doing the individual rewrites.

A version number becomes a chain of fixes through DataFixTypes, an enum of about thirty type references (level, chunk, player, entity chunk, POI chunk, options, stats, advancements, and a long tail of saved-data kinds). DataFixTypes.updateToCurrentVersion takes the data version as an argument — every one of its fourteen callers reads the version itself — and asks the fixer to compose every rule from there to now. DataFixTypes.wrapCodec is the one that reads the version out of the tag: it wraps an ordinary codec so decoding pulls the data version, runs the chain, and encoding stamps the current version back in. It is the rarer door — two callers, PlayerAdvancements and DebugScreenEntryList — while player data takes the first one and reads the version itself, and chunk storage reads it too and takes a third, DataFixTypes.update. The rules are pre-compiled on a dedicated bootstrap thread, and that thread is built with some care to stay out of the way: one thread, daemon, at minimum priority, with a single caller in the client’s entry point, optimising exactly one type (the level-summary schema, so the world list opens fast). The dedicated server never asks for it at all.

net/minecraft/util/filefix does what the other cannot. A data fixer rewrites the contents of a tag after it has been read, so it can never move, rename, split or delete a file. FileFixerUpper operates on the world directory: its operations are moves, regex moves, group moves, deletions, content modifications and one composite that scopes a nested list of operations to matching folders, and the concrete fixes do things like relocate dimension storage, gather player storage into one folder and pull data out of level.dat into saved data (level data and rules).

It stays safe by working somewhere else: the whole upgrade runs against a custom copy-on-write file system over the world folder, whose writes land in a scratch directory, and the result is swapped in at the end. Exactly how safe depends on the filesystem underneath. Where hard links are available it uses them. Where they are not, it writes one file, upgrade_in_progress.json, recording the moves, and an upgrade cut short by a crash resumes from it the next time the world is opened, while one that fails on an error tries to move its files back. And where atomic move is unavailable it stops before the swap rather than risk a half-moved world.

The client does not grey out a world that needs the upgrade — it relabels the button. LevelSummary.primaryActionMessage turns Play into Upgrade and Play while leaving it active; what is disabled is Edit and Recreate, which would otherwise touch a directory the fixer is about to rearrange.

Telemetry writes to disk before it writes to the network

net/minecraft/client/telemetry, client-only. Exactly seven event types: world loaded, world unloaded, graphics capabilities (which now carries the backend name and the reason a backend failed — see Blaze3D), and four opt-in ones covering performance metrics, world load times, advancements and game load times. TelemetryProperty is the vocabulary; each property carries both an internal name and an export key.

Opting out is two-tier, and the game controls only one of the tiers. Minecraft.allowsTelemetry reads an account-level flag the game only reports; the in-game control only chooses whether the four opt-in events are sent, and is only offered when the account carries the flag that allows it. Everything sent is also written locally as a JSON event log with a seven-day expiry — and the send waits on the log opening, so a log that cannot be opened suppresses the send. A player can read their own outgoing telemetry, though not in the game: the telemetry screen renders the catalogue of event types and their properties, and a button next to it opens the log directory in the platform’s file manager.

Start at ClientTelemetryManager, TelemetryEventType.

Four profiling systems, and Tracy is the surprise

net/minecraft/util/profiling holds four profiling systems. Two sit in the package itself — the tick profiler and the Tracy bridge — and two in subpackages of it, jfr and metrics.

The tick profiler is the familiar one: Profiler is a thread-local holder of a ProfilerFiller, ActiveProfiler records the push/pop tree of named sections that pages in this book quote, and /perf and the client’s F3 profiler chart drive it.

Tracy is the surprise, and it is one class bridging out to Mojang’s Tracy binding. TracyZoneFiller implements the same interface, and Profiler.get falls back to the Tracy filler rather than the inactive one when Tracy is available — and Profiler.decorateFiller combines the two, so an attached Tracy build and a running /perf both see every section. With a Tracy build attached, every profiler section in the game streams out with no command run. Tracy reaches outside this package too, into Blaze3D’s frame capture, into the GPU abstraction’s TracyGpuProfiler and into the executor wrappers.

JFR (util/profiling/jfr) registers ten custom flight-recorder events under a Minecraft category — chunk generation, region reads and writes, packets sent and received, network summaries, server tick time, client FPS, structure generation, world load. Packet events are emitted straight from the packet codecs, so a recording gives a per-packet-type byte breakdown that this book’s packet reference cannot. Start with –jfrProfile or /jfr start.

Metrics (util/profiling/metrics) is /perf: sampling by nine MetricCategory values — pathfinding, event loops, consecutive executors, the tick loop, JVM, chunk rendering, chunk-rendering dispatch, CPU and GPU — written out as CSVs that PerfCommand zips.

The management server is not RCON

net/minecraft/server/jsonrpc, dedicated server only, and genuinely new. It is JSON-RPC 2.0 over a WebSocket, served by its own Netty bootstrap with an HTTP codec, an authentication handler, the WebSocket handshake and optional TLS. It is disabled by default; when enabled, TLS is on unless explicitly turned off, and the server refuses to start without a forty-character alphanumeric secret, generating one if absent.

What it exposes is the administrator’s surface, not the game’s: allow-list, bans and IP bans, players and kicks, operators, game rules, server status, save and stop, system messages, and a family of live server settings — including the idle-pause window, whose behaviour belongs to the server tick, because a dedicated server pauses too. Implementations sit behind service interfaces so the wire layer never touches the server object directly, and an executor service marshals calls onto the server thread.

The description of the API cannot drift from the handlers, because it is derived from them: every method is registered with a description and typed parameter and response schemas, and a discovery method returns an OpenRPC 1.3.2 document built by walking the two method registries and filtering on a per-method discoverable flag. There is also an outgoing direction for server-initiated notifications. The audience is panel and hosting operators.

Start at JsonRpc, ManagementServer.

RCON, query, and the pre-1.7 ping that removes itself

net/minecraft/server/rcon is seven classes of pre-Netty blocking socket code on its own threads. RconThread accepts the connections and RconClient speaks Valve’s Source RCON framing; commands execute as a RconConsoleSource, a command source that accumulates output into a string rather than a chat feed (Brigadier and commands). QueryThreadGs4 speaks the GameSpy4 UDP query protocol with a challenge-token handshake and a five-second cache on its full-status reply.

The pre-1.7 ping is not in that package. LegacyQueryHandler sits in the server’s network package and is installed into the Netty pipeline before the length-prefix splitter and the packet codec, right after the read timeout (the connection). It peeks at the first byte; if it is the legacy ping marker it answers in the old format and closes, and otherwise it resets the reader index, removes itself from the pipeline, and re-fires the bytes downstream. It costs one byte comparison per connection and then vanishes. The same encoding is used client-side so the server list can still ping ancient servers.

Realms is a client for a server nobody here can read

com/mojang/realmsclient, client-only, 137 files and 14,701 lines — more lines than the whole packet catalogue in network/protocol. Roughly sixty per cent is screens and the records behind them — subscriptions, world slots, templates, invites, backups, minigames, upload and download — and the rest is a task framework, the world-upload pipeline and the HTTP layer, a list of REST paths with a small request wrapper. net/minecraft/realms is three classes and a package-info.java vanilla keeps for Realms, RealmsScreen among them, the base the Realms screens extend; beyond it the Realms UI extends ordinary vanilla screens and widgets.

Out of scope because it is a service client: its behaviour is defined by a server this book cannot read. One fact anyway. The environment is chosen from an environment variable falling back to a system property, defaulting to production, in a static final field of the release client — and there are three environments, not two, because the third points at localhost.

Statistics, the scoreboard, and the recipe book

net/minecraft/stats is nine classes covering two concerns, plus a link into a third package that is the reason it is worth a paragraph.

Statistics: Stats declares eight registry-backed stat types — mined, crafted, used, broken, picked up, dropped, killed, killed by — plus a custom type holding the seventy-odd hand-declared counters (play time, distances by every mode of travel, damage dealt and blocked), each bound to a formatter that affects display only. A stat type is a lazily-populated map over a registry, so stat objects are interned; ServerStatsCounter adds the per-player file and a dirty set, and only dirty stats are sent. Statistics are one of two parts of the save that go through the data fixer as JSON rather than NBT — the other is advancement progress (advancements), and they are the only two.

The scoreboard link is why the package is worth a paragraph — and note that the class doing the linking is not in it: ObjectiveCriteria lives in net/minecraft/world/scores/criteria, which is why a scoreboard objective can name a statistic and why this package is reachable from a command at all (scores, teams and stored data is how the name is parsed).

The recipe book is the second concern, and it is in this package for historical reasons rather than architectural ones — RecipeBook, RecipeBookSettings and ServerRecipeBook are not skipped, they belong to recipes, with advancements reaching in from the other side. The address is the only thing surprising about them.

Two packages nobody will recognise

net/minecraft/gizmos is a debug-drawing API, in the game-engine sense of the word: the immediate-mode “draw me a box in the world for one frame” facility most engines have and Minecraft did not. Every one of the debug renderers — chunk borders, hitboxes, pathfinding, brains, points of interest, raids, light sections — is now written against it, and it is not client-only, which is the surprise. It is taught where its output is, in Part X, by debugging the running game; the address is what belongs here, because a reader hunting for the debug renderers’ drawing code will look under client/renderer/debug and find nothing that draws.

net/minecraft/references is not “references” in the data-fixer sense. It is a set of id-constant tables, and the split is not the one the package names suggest: BlockIds holds the keys for blocks with no item form (water, lava, wall torches, piston heads, wall signs), ItemIds the items with no block, and BlockItemIds — seven times BlockIds and not quite twice ItemIds — the pairs. Look for stone in BlockIds and it is not there. They exist to break a class-initialisation cycle: exactly twelve files outside the package name it, and four of them are the ones that need to name a block or item before the block and item classes are loaded — Blocks and Items themselves, and GrassBlock and MyceliumBlock, which name another block during that initialisation — while PotDecorations looks its brick up by key. The other seven are data generators that work in keys: four tag providers, a tag appender and two feature bootstraps, AquaticFeatures and NetherFeatures. A resource key is a registry plus an identifier, so it can be built with nothing loaded. Practically, it is the canonical machine-readable list of block and item ids, and a better starting point than the block and item holder classes if that is what you want — but not the id list: five sibling tables for entity types, block-entity types, potions, fluids and atlases live outside the package, in the trees they belong to.

The data generators, and why “data-driven” is both true and misleading

Most of net/minecraft/data is a build-time program: a second entry point with its own options, a generator that groups providers into packs, and a hash cache that skips unchanged files. net/minecraft/client/data is its client half, generating block and item models, the atlas definitions, equipment assets and waypoint styles.

The significance is a genuine paradox worth stating plainly. Vanilla’s own content is a data pack. net/minecraft/data/worldgen is most of the vanilla worldgen data pack written as Java — the biome feature lists, the material rules, the carvers, the jigsaw pools, the structures and structure sets, the processor lists — and the loot, recipe, tag and advancement packages do the same for their domains, all serialised through the same codecs the game uses to read a pack.

So “Minecraft is data-driven” is true: the running game only ever sees JSON parsed by codecs, with no vanilla-specific path (the resource system). And “you cannot change it without a data pack” is nearly true — which is the more useful statement, because the exceptions are load-bearing and a reader who believes the absolute version will misread three other pages.

The package is not build-time only, and the dedicated server ships all 174 files of it. Three kinds of exception:

  • Plain id tables. AtlasIds is read at runtime by the model manager, the atlas manager, the map, sky, painting and particle renderers, and by a chat component. Nothing build-time about it.
  • The bootstrap interface itself. BootstrapContext — in net/minecraft/data/worldgen — is what every vanilla data-pack registry’s bootstrap is written against, from damage types and enchantments to chat types, dialogs and world clocks. It is the most-imported type in the package by a wide margin.
  • Constants and math the running game calls. Blocks itself names TreeFeatures keys while constructing mushroom and fungus blocks, and a CaveFeatures key and a VegetationFeatures key for the moss and pale moss blocks; MinecraftServer reaches for a MiscOverworldFeatures key for the bonus chest; a jigsaw block entity defaults to a Pools key; NoiseRouterData and NoiseGeneratorSettings, both shipped worldgen classes, are compiled against TerrainProvider and the material rules in net/minecraft/data/worldgen/material; and the F3 screen’s biome-builder line calls NoiseRouterData.peaksAndValleys, one line that delegates straight into TerrainProvider (density functions).

Vanilla’s density functions and noise settings still reach the running game as JSON. NoiseRouterData.bootstrap and NoiseGeneratorSettings.bootstrap are collected by VanillaRegistries, which the data-generator entry point runs and which Commands.validate borrows for its ambiguity check; the game itself reads the generated files out of the built-in pack. Editing TerrainProvider changes terrain by changing what that generator writes.

So net/minecraft/data holds a build-time program and a handful of tables and functions the shipped game compiles against and executes. The generator half is inert at runtime but for one static helper StructureTemplateManager borrows from NbtToSnbt, and it is the half worth reading — it is the fastest way to understand what a vanilla biome or structure declares, because it is typed and cross-referenced where the JSON is not, a point biomes and structure placement both depend on. And the report providers are how you get machine-readable dumps of the registries and the packets, two of the tables this book’s own reference layer covers.

The audio backend lives in Blaze3D, and is not skipped

com/mojang/blaze3d/audio is hatched for its address, like net/minecraft/gizmos above: the book teaches what it does and the atlas still counts it outside every part, because it is filed where nobody looks for it. It wraps OpenAL, and it sits inside Blaze3D, beside the window and RenderSystem, rather than in the client’s sound package where the engine, the manager, the channel bookkeeping and the Ogg decoding live. That is the boundary fact: Blaze3D is the platform layer for both devices, not only the graphics one, and a reader looking for the sound code under client/sounds will not find the half that talks to the driver. Everything the package does — the device and context, the channel limits (which are counters and not pools, as that page’s own heading insists), binaural rendering through Options.directionalAudio, hot-plugging a headset mid-game — is taught, in Part X, by the sound engine.

Player reporting

net/minecraft/client/multiplayer/chat/report, client-only. ReportingContext holds the sender, the environment (which server or realm), a log of the last thousand-odd received messages, and at most one draft report. There are three report kinds — chat, skin, name — and an eleven-value reason enum.

The piece worth naming is the context builder: a chat report does not send just the offending line, it walks the log backwards to assemble surrounding signed context, which is what makes the report verifiable at the other end. The report machinery is the consumer of the chat-signing system that chat and signing documents. Neither the transport nor the policy is in the game — both come from the account service library.

Gaps, and the ruling on each

The hatched boxes above are the boundary as drawn. Beside them sits a shorter list of things that were never excluded on principle — they were simply not written when the book reached them, and each has since been ruled on. Ten are now taught, either as a page of their own (net/minecraft/gametest, com/mojang/blaze3d/platform, the post-effect chains, the scoreboard and command storage) or as a section of one (the debug cluster across the HUD and debugging pages, item models on models and atlases, the packrat parser on Brigadier and on codecs, the animation framework on entity rendering, the pack classes on the resource system, and net/minecraft/client/resources, which turned out to be five systems with five owners rather than one gap). Naming where each landed is the landing pages’ job, not this one’s; what belongs here is the other ruling.

Declined, with the reason. A decline is a promise that a reader will not miss it, not a shrug.

whatsizewhywhat carries it instead
com/mojang/renderpearl/backend/vulkan33 files, 7,387 linesa faithful second implementation of an interface already documented, and the abstraction is the lectureBlaze3D
net/minecraft/client/data28 files, 6,189 linesbuild-time model, atlas, equipment and waypoint generators, the same category as the generator half of net/minecraft/data, but big enough that a reader trips over itnamed here and in the list of main methods on anatomy
the catalogues~140 entity models, ~80 particles, 102 render states, 50 render layers, 16 animation definitions, 56 of 58 worldgen features, 57 tree kits, the entity sub-predicateseach is one shape repeated, and the shape is on the page that owns the frameworkthe reference layer
client/quickplay, client/profiling, client/renderer/gizmosone or two classes eachno mechanism a lecture needs—
net/minecraft/data/worldgen as content64 files, 6,016 linesdeclined as content: it is the datagen bootstrap that emits vanilla’s JSONthe runtime exceptions named above, which are not a decline
net/minecraft/client/animation’s keyframe definitions16 of its 21 classespure data in Java clothing — and lines is the wrong unit for it: 266 lines and 665 KB, one file’s longest line thirty thousand characters, because the decompiler renders each animation as one builder chainentity rendering has the framework

Two things inside com/mojang/renderpearl/backend/vulkan are named before the decline rather than after it: DestructionQueue, the deferred-free discipline OpenGL needs no equivalent of, which is the clearest illustration of what the device seam hides, and vulkan/checkpoints, vendor breadcrumb extensions for GPU crash reports. The shader compiler is not in the declined tree. GlslCompiler and SPIRVModule, the shaderc and spirv-cross pair, sit in front of both backends in renderpearl/frontend/shaders, because Minecraft still authors GLSL and compiles it to SPIR-V once — Vulkan takes the SPIR-V as it is and OpenGL cross-compiles it back to GLSL — which is the whole reason one shader source can feed two backends. The interiors of com/mojang/renderpearl/backend/opengl are declined on the same grounds.

Named, and not yet written. These are real systems with real lectures in them, and no ruling above covers them: the carver tunnel walk; the dragon fight (EnderDragonFight); client/multiplayer‘s joining-a-server tail; and two corners of the pack system that the resource system names without teaching — the server-resource-pack prompt and download flow in client/resources/server, and the linkfs synthetic file system that presents the launcher’s hash-named asset files as the one tree their index describes. Beside them sit the maps’ saved data and the wandering trader’s timer, which the level data table names and no page teaches, four Part V mechanisms its landing page does not list: rails, the shelf, the beehive and fire spread; local difficulty (DifficultyInstance), which only that table’s page explains; and four things a player carries that Part VIII lists and does not teach — the attack’s visual effects, the damage statistics, the warden-spawn tracker and the spectator camera behind /spectate. They are named here so that a reader who wants one knows the book knows it is missing, and knows where to start.

Where to look

If you need one of these the entry points are named in each section; if you want a list rather than a system, start at net/minecraft/references for ids and the report providers in net/minecraft/data for everything else, and the atlas for the shape of the whole jar.


Rules: names, never code · how the system works, not how the code reads · newest version only · every backticked name passes tools/verify_names.py.