Code Generation (pumpkin-codegen)
Minecraft is a massive game with thousands of block states, items, packet IDs, sound events, recipes, and biome parameters. These registries frequently change between Minecraft updates.
To maintain 100% fidelity without manually maintaining tens of thousands of error-prone constants, Pumpkin utilizes an automated code generation tool: tools/pumpkin-codegen.
Purpose & Workflow
pumpkin-codegen parses official Minecraft server data generator reports, asset files, and version specifications, and outputs zero-cost, strongly-typed Rust files directly into crates/pumpkin-data.
The pipeline operates in three distinct stages:
- Ingestion: Reads raw JSON assets and vanilla server reports from
assets/andassets/datapacks/. - Transformation: Normalizes states, calculates bitsets, processes ViaVersion remappings, and optimizes lookup tables.
- Emission: Emits compiled Rust constants and structs into
crates/pumpkin-data/src/generated.
Generated Datasets
pumpkin-codegen generates the following components in pumpkin-data:
| Category | Description | Generated Source |
|---|---|---|
| Packets | Serverbound and clientbound packet IDs for all protocol states across supported Minecraft versions. | packet.rs |
| Blocks | Block definitions, default states, state properties (facing, powered, waterlogged, etc.), and block collision boxes. | block.rs |
| Items | Item definitions, stack sizes, durability, data components, food properties, and equipment slots. | item.rs |
| Registries | Dynamic registries for biomes, dimensions, chat types, damage types, trim materials, and banner patterns. | registry.rs |
| Biomes & Noise | Climate parameters, noise router configurations, 3D noise settings, and surface rules. | biome.rs, noise_router.rs |
| Entities | Entity types, default bounding boxes, attributes, and tracked entity metadata schemas. | entity_type.rs, tracked_data.rs |
| Recipes & Crafting | Shaped, shapeless, smelting, blasting, smoking, and stonecutting recipes. | recipes.rs |
| Tags | Block tags, item tags, fluid tags, and entity type tags (e.g., #minecraft:mineable/pickaxe). | tag.rs |
| Enchantments & Potions | Enchantment definitions, potion effects, and brewing stand recipes. | enchantments.rs, potion.rs |
| Translations | Official localization keys for chat messages and item names. | translations.rs |
| Plugin WIT | WebAssembly Component Model WIT files defining plugin interfaces. | wit/ |
Running Code Generation
To run the code generator locally:
# Navigate to the workspace root
cd Pumpkin
# Run the codegen tool
cargo run -p pumpkin-codegenWhen Should You Run Codegen?
- Upgrading to a New Minecraft Version: When porting Pumpkin to a new minor or major Minecraft release.
- Adding Protocol Mappings: When adding support for an older or newer client protocol version.
- Updating WIT Definitions: When adding new functions or types to the WebAssembly plugin API.
Data Sources
pumpkin-codegen reads data from several primary sources:
- Minecraft Data Generator Reports: Generated by running
java -DbundlerMainClass=net.minecraft.data.Main -jar server.jar --reports. - Minecraft Client Assets: Extracted from client
.jarfiles for translation keys, model shapes, and sound mappings. - Minecraft Protocol Wiki: Cross-referenced with protocol specifications for packet IDs.