MC³ is an experimental Fabric mod for Minecraft 26.2. It replaces full-height streaming with independently addressed 16 x 16 x 16 cubes and provides a layered world generator for vertically stacked terrain profiles.
Published release: 0.3.8 technical preview. The sparse storage, persistence, custom network protocol and three-dimensional tracking foundations are in place, and cube-native light now covers both generation and runtime edits. This release is not acceptance-complete. The remaining blockers include independently convergent Voxy far terrain, cube-native live tick ownership, and configured world generation outside finite level metadata. See STATUS.md and the true-cubic boundary.
TASKS.mdrecords the remaining runtime acceptance gates for this release line.
- Independent
CubePosaddressing, sparse resident storage, custom cube payloads and per-cube persistence. - Buffered view tracking: a square prism — a vanilla-parity Chebyshev square
on X/Z with an independent
verticalViewDistanceY radius at full depth (default-1: follows the horizontal distance) — so the streamed shape always covers the whole client render grid. - Shipped per-cube configured-layer generation through bounded scratch: each
16³ cube receives terrain, structures, decoration and light before first
delivery. The older unified
FULL-column path remains for comparison. - Direct all-air gap generation at legal extreme cube coordinates without allocating a finite compatibility column. Gap biomes are sampled at their absolute quart coordinates.
- A layered generator and world-creation editor for caves, nether, overworld, floating-island and custom profiles.
- Incremental block and block-entity updates, compact per-cube light fields, durable terrain provenance and fail-closed schema-2 compatibility checks.
- Built-in status, pre-generation and profiling commands under
/mc3.
The complete [-30,000,000, 30,000,000) block-coordinate range is valid for
cube addressing, sparse ownership and unconfigured gaps. That does not mean
every runtime subsystem is already full-range. Configured generation still
depends on Minecraft's finite level metadata and bounded compatibility scratch.
Several interaction, light and scheduling paths also retain vanilla packed
coordinate or column boundaries.
Current mod-support boundaries and tested versions are maintained in COMPATIBILITY.md. Release and runtime evidence remains in STATUS.md.
- Minecraft 26.2
- Fabric Loader 0.19.3 or later
- Fabric API 0.155.2+26.2 or a later 0.155.x build for Minecraft 26.2
- Java 25
The archived 0.3.6 JAR's Fabric metadata used a wildcard for Fabric API even
though this is the validated range. The 0.3.7 source enforces
~0.155.2+26.2; its final packaged load proof remains part of the release
gate.
Replace your-session with one unique, shell-safe identifier. First save this
as /tmp/mc3-your-session.init.gradle so every project's build output is kept
off the unreliable checkout mount:
def mc3BuildRoot = new File(System.getProperty('mc3.buildRoot'))
gradle.beforeProject { project ->
def relative = project.path == ':' ? 'root' : project.path.substring(1).replace(':', '/')
project.layout.buildDirectory.set(new File(mc3BuildRoot, relative))
}flock --wait 7200 /tmp/mc3-build.lock \
./gradlew clean build --project-cache-dir /tmp/mc3-pcache-your-session \
--init-script /tmp/mc3-your-session.init.gradle \
-Dmc3.buildRoot=/tmp/mc3-build-your-session \
--no-build-cache --no-daemon --console=plainThat local command writes the mod jar to
/tmp/mc3-build-your-session/root/libs/mc3-<version>.jar; CI's default output
remains build/libs/. The wrapper pins Gradle 9.5.1 by SHA-256 and the build
uses the stable Fabric Loom 1.17.18 plugin. GitHub Actions runs the clean build
on Java 25.
Useful local verification commands are:
export MC3_GRADLE_EXTRA_ARGS='--project-cache-dir /tmp/mc3-pcache-your-session --init-script /tmp/mc3-your-session.init.gradle -Dmc3.buildRoot=/tmp/mc3-build-your-session --no-build-cache'
flock --wait 7200 /tmp/mc3-build.lock \
./gradlew clean build --project-cache-dir /tmp/mc3-pcache-your-session \
--init-script /tmp/mc3-your-session.init.gradle \
-Dmc3.buildRoot=/tmp/mc3-build-your-session \
--no-build-cache --no-daemon --console=plain
tools/mixin-loadtest.sh
MC3_SMOKE_MODE=per_cube tools/true-cubic-smoke.sh
MC3_SMOKE_MODE=unified tools/true-cubic-smoke.sh
MC3_SMOKE_MODE=deferred tools/true-cubic-smoke.shtools/smoke-server.sh is a destructive regression harness for its own
run/world fixture. Read the script and STATUS.md before invoking it.
For a dedicated server, set this in server.properties:
level-type=mc3\:cubicFor single-player, choose MC³ Cubic on the World screen. The Customise screen edits the overworld layer stack; JSON import/export covers the complete dimension set. See docs/WORLDGEN_PRESETS.md.
The default config/mc3.json is:
{
"verticalViewDistance": -1,
"voxyViewDistance": 64,
"debugCubeTraffic": false,
"maxCubeUpdatesPerTick": 4096,
"maxQueuedLayerGenerations": 32768,
"maxActiveLayerGenerations": 48,
"maxLayerGenerationStartsPerTick": 48,
"suppressHaloColumnGeneration": true,
"windowedColumnSections": true,
"haloColumnsPrimaryBandOnly": true,
"elideCanonicalAirSections": true,
"stubCoveredColumnSaves": true,
"generationMode": "per_cube"
}verticalViewDistance defaults to -1, which follows the horizontal
distance so the streamed prism covers the whole client render grid; an
explicit value is clamped to 2..64. voxyViewDistance (default 64 cubes,
clamped to 0..128, 0 disables) is the Voxy far-LOD feed radius: resident
cubes inside that square prism but outside the streamed view are pushed to
the client's Voxy LOD database, decoupled from the near view. It never
starts far generation — deliberate far pre-fill is /mc3 pregen's job. This
setting is not Voxy's own render distance: Voxy 0.2.18's packed LOD identity
represents section Y -128..127 only. maxCubeUpdatesPerTick is clamped to
1..4096. Deferred generation limits are clamped to a queue of 1..65536,
active work of 1..64, and starts of 1..active.
generationMode="per_cube" is the shipped path: one 16³ cube at a time,
decorated and lit before first delivery, with no full-depth column held
resident for delivered content. unified (the pre-0.3.0 shipped path) and
deferred_band remain selectable for comparative testing; both require
decoration to be part of the result before the first payload, and deferred
delivery fails closed until its decoration result is ready. The legacy
unifiedGeneration boolean still maps onto these modes for old configs.
The 0.3.7 source contains additional terrain/closure parity, full-domain light-node identity, C2ME and Voxy capacity work, but none of it is a released 0.3.6 guarantee. Fresh same-seed cross-path parity, repeat determinism, the current performance baseline, the top/bottom runtime-light warning census, the C2ME three-way runtime matrix and Voxy's radius-63 GPU run remain acceptance work.
Five memory behaviours ship default-on, each decodable to false for
comparative debugging: suppressHaloColumnGeneration (the vanilla
47×47 player-ticket column halo is never materialised for cubic levels —
rig-measured ~3 GB of full-depth columns; streamed columns stay
entity-ticking via MC³'s own residency tickets), windowedColumnSections
(persisted, non-referenced content sections of FULL columns become
biome-exact placeholders until their cube is demanded again),
haloColumnsPrimaryBandOnly (in per-cube mode, columns driven purely by
vanilla ticket propagation generate only the primary surface band rather
than every configured layer at full depth), elideCanonicalAirSections
(canonical all-air sections are elided from region saves with a
marker-driven exact restore), and stubCoveredColumnSaves (cube-covered
column slots are saved as metadata-only stubs — air states plus the real
biome container — with content served by the cube store; fail-closed, so
placeholder air never reaches disk over real content).
The stable mc3-test.mrpack is published on the project's
GitHub Releases. Release
0.3.8-test.1 contains MC³, Fabric API, Sodium, Iris and Voxy for Minecraft
26.2. Shaders start disabled. Set the launcher's maximum memory to 12288 MiB
(12 GiB) after import because the Modrinth pack format does not carry a JVM
memory setting; 8 GiB is workable for settled play and 6 GiB is tight during
roam transients.
The immutable 0.3.6 profile's embedded MC3-PROFILE-SETUP.txt predates the
memory correction and incorrectly says 64 GiB and a 32-cube MC³ far feed. Do
not follow those two lines: the current guidance is 12 GiB and
voxyViewDistance=64. The archive is not rewritten; 0.3.7 and later embed the
corrected setup prose.
Voxy's inclusion is intentional. A release cannot pass by excluding a broken mandatory compatibility path. The profile is therefore a review and correctness-testing surface, not evidence that all current blockers are fixed.
To capture a performance problem in a world:
/mc3 profile start 60
MC³ writes a JFR recording and JSON summary under the instance's debug/
directory.
- The isolated
buildcommand above proves compilation and automated tests. It does not prove a join, renderer, save/reload or full-range runtime path. tools/mixin-loadtest.shboots the real Fabric client loader without a display and transforms the packaged Sodium, Iris and Voxy profile. It does not prove graphical correctness.tools/true-cubic-smoke.shuses an isolated temporary world and checks generation classification, sparse ownership and persistence at coordinate edges. Its defaultper_cubemode gates the shipped path;unifiedanddeferredremain available as comparative modes.- The GPU-backed client rig is required for join flow, movement, input,
rendering and visual first-delivery checks. Current evidence and any
omissions are recorded in
STATUS.md.
Release acceptance still requires authoritative cube-native ticks, entities and points of interest; independently convergent Voxy far terrain; stable Sodium behaviour over travel; and no dependence on lossy vanilla packed Y coordinates in the accepted paths.

