
Chunksmith
Pre-generates chunks fast, and safely: an adaptive throttle paces generation against server tick-health so it can run with players online. Builds Distant Horizons / voxy LOD data as it goes and serves it to clients. Fabric, Forge, NeoForge and Paper/Folia.
Tags
Creators
Details
4.3.1+26.1
Compatibility
Required content
Changes
A world-enter pregen that stopped early was recorded as having finished, and the world was then skipped forever. Reported on mod_support #35: a 5000-block radius produced a partial area, and on re-entry Chunksmith announced the world was already pre-generated and refused to run again. The resume-on-re-entry behaviour that makes a large radius workable at all was the exact thing being destroyed -- a 5000-block radius is about 306,000 chunks, which nobody finishes in one sitting.
Fixed
- The world-enter pregen treated "the task ended" as "the work finished". It recorded completion
from
GenerationCompleteEvent, whichGenerationTaskfires from the single end-of-task path that a genuine exhaustion of the iterator, a cancel, a pause and an auto-pause all reach. The task's own comment beside that line already said it: "Ending a task is not the same as finishing the work." Auto-pause is the likely trigger in the wild -- when the server cannot keep up,GenerationTaskdeliberately stops rather than stutter and expects the resume watcher to pick the run back up, which is correct behaviour and is not being changed here. What was wrong is that stopping made Chunksmith writeworldenter-done.jsonwith the configured radius, describing a run that had covered a fraction of it.WorldEnterDone.satisfies()then did its job perfectly and skipped that world on every subsequent load. - Completion is now recorded only when the task itself reports the selection covered. The progress
event already carries that verdict (
GenerationTask.update()setscompleteonly whenchunkIterator.total() - finishedChunks == 0), so the number being trusted is the task's own iterator total rather than this feature'sestimateChunks()circle-area approximation -- which is documented as inexact and has no business deciding whether a permanent record gets written. - The world is released either way. Whatever ended the task, the player is behind a frozen world and a progress screen, and leaving them there is the one outcome that is never acceptable. Only the permanent record is now conditional.
- The log stops lying. A run that ends short says how far it got, that it is deliberately not
being recorded, that it will resume on the next load, and that an auto-pause above is the usual
reason. It previously said "world-enter pregen finished; releasing the world. It will not run again
on this world." on exactly this path, with a
Task stoppedline immediately above it.
Notes
- If a world is already stuck, it stays stuck until the record is removed -- this build cannot
un-write what a previous one recorded. Delete
<world>/chunksmith/worldenter-done.json, or raiseworldEnterPregenRadiusabove the recorded value, and the feature re-arms. - No change to auto-pause, to the radius, to the shape, or to the selection. The reported symptom of a square area is what a partial concentric run looks like: the pattern walks square rings outward from the centre, so a run that stops early leaves a filled square well inside the circular selection. That part was working as designed and only looked wrong because it had been declared finished.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:4BeAEBIb:YSleUiXL"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:4BeAEBIb:YSleUiXL"
}
