- Java 100%
isAirPassable: explicitly block shulker boxes via BlockTags.SHULKER_BOXES before the collision/opacity checks. Shulker boxes are solid full-cube containers but MC marks them non-opaque so the lid-animation renderer can overdraw the block boundary, causing them to slip through the glass fix. isDefinitelyArtificial: expand from 5 blocks/tags to a comprehensive list covering shulker boxes, carpet, beds, smooth/polished stone variants, deepslate bricks/tiles, quartz family, all precious ore blocks, crafting and storage blocks (furnace, chest, barrel, enchanting table, etc.), and concrete+glazed terracotta via registry-path match (no vanilla tag exists). isNaturalGround: remove cobblestone and stone bricks — players build with them constantly, making them unreliable as a "natural" signal. They now fall through as neutral (count as neither natural nor artificial). isNaturalCaveContext: reduce ray length 8→5 so rays see the immediate wall rather than punching through casino walls to count terrain outside as natural. Tighten pass condition from natural>=artificial to natural>artificial so a room with equal natural/artificial surfaces now correctly fails. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| gradle/wrapper | ||
| src/main | ||
| .gitignore | ||
| build.gradle | ||
| features.md | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| icon.jpeg | ||
| modrinth.md | ||
| readme.md | ||
| settings.gradle | ||
Cave Flow
I wanted caves to feel like places, not just empty geometry. So Cave Flow does one thing — it gives every air block underground a sense of which way the air wants to go. Dust drifts toward openings. Tunnels carry through-currents. Dead-end pockets settle and pool. The cave starts to feel like it's breathing.
Client-side Fabric mod for 1.21.10 / 1.21.11. Forge port is on the maybe-someday pile.
What it does
The core thing is airflow. Every air block in a loaded chunk gets a flow vector pointing toward the nearest cave opening, computed via flood-fill from sky-exposed blocks. Dust particles drift along it. Tunnels with two open ends blend their sources into a coherent through-current instead of two competing outflows.
On top of that, a handful of other things that make caves feel inhabited rather than generated:
- Heat shimmer rising from lava — subtle wavy distortion in the air column above.
- Cold-air particles in chilly caves (dripstone, frozen, ice biomes). The drift system swaps its default dust for a paler, frostier particle variant — same flow vectors, same density, just a different look so cold caves feel cold. Not breath from the player; the cave itself reads cold.
- Settled dust in dead-end pockets — particles accumulate and rest where flow stalls. Plays nicely with the airflow logic since you can read flow by where the dust doesn't move.
- disabled in the end as empty space, and disabled in the nether as there are no caves... and such
All toggleable individually. If you only want the dust and none of the rest, that's fine.
Compatibility
- Minecraft 1.21.10 / 1.21.11
- Fabric (primary). Forge maybe later.
- Fully client-side. No server install. Works on vanilla servers, modded servers, realms, anywhere.
- Multi-world servers work (Paper, Bukkit, plugin-based world managers, modded dimensions). The cache keys by world dimension and saves per-world, so flow data stays correct when you portal or get warped between server-managed worlds.
- Mod Menu for in-game config.
Configuration
Open Mod Menu → Cave Flow. The settings I actually care about:
- Tunnel currents — on/off
- Min flow speed — floor on drift velocity, so it never goes completely dead
- Max flow speed — ceiling, so it never feels like a wind tunnel
- Particle density — how thick the dust is
- Detection range — how far from the player flow is computed
- Cache directory — where flow files get written
- Per-effect toggles — heat shimmer, drips, cold-air particles, pebbles, settled dust, drafts. All independent.
How it works, if you care
The mod keeps a distance-to-sky scalar field for every air block in loaded chunks. Flood-fill from sky-exposed blocks inward, gradient gives you a direction. Bake that into per-chunk files on disk.
The whole render distance is processed, not just where you're standing — caves you can't see still breathe correctly when you walk into them. The work runs on a background thread pool, off the main thread. Particles read the field on the main thread but never block on computing it.
Block changes don't trigger a full chunk re-flood. A new solid block invalidates only the downstream cells; a removed block extends the field outward locally. Cheap to maintain even while mining.
On-disk cache only writes files for chunks that actually contain caves. Solid stone and pure sky chunks store nothing.