
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.
Links
Tags
Creators
Details
3.2.4+26.x-plugin
Compatibility
Changes
Added
/cs set-- every setting is now readable and writable in-game. A setting you can only change by editing a file and restarting is not much use on a running server. Only two of the thirteen settings had a command; the rest, including the three new settle keys, could not be changed on a running server at all./cs setlists every setting with the value in force,/cs set <name>shows one, and/cs set <name> <value>changes it and saves it immediately.- Values with a legal range are clamped as they are written, not only as they are read, so the file can never hold a number the mod would refuse to honour. The command reports the value that was actually stored rather than echoing what you typed -- ask for a settle radius of 40 and it tells you it is 16.
- A value that cannot be understood at all -- a word where a number belongs, a language that is not shipped -- is refused, rather than quietly becoming a default.
/cs silentand/cs quietstill work and are unchanged. Both now PERSIST, which they did not before: they used to change the running value and forget it at the next restart.- On Paper/Folia the three
pregenSettle*settings report that they do not apply rather than accepting a value that is ignored. Bukkit does not manage chunk tickets, so there is no window to hold open.
Fixed
- Other mods can build on freshly pregenerated land again. A pregen added a chunk ticket,
generated the chunk and dropped the ticket the instant the future completed. For pure terrain that
is exactly right and it is what keeps a run's memory flat -- but a mod that reacts to "a new chunk
appeared" and does its work on a later server tick found the chunk, and everything around it,
already unloaded. It could not build, so it deferred, and it kept deferring for the whole run.
Reported against Millenaire (mod_support #14), whose villages simply never appeared in
pregenerated land: measured on a NeoForge 1.21.1 pregen, 309 spawn attempts and 309 deferrals,
zero villages.
- A chunk's ticket is now held until all eight of its neighbours have also been generated, plus a short delay. What is held is therefore the sweep frontier and nothing else -- it is bounded by the shape of the pattern rather than by a guessed number, and it shrinks to nothing as the run finishes.
- The rule is deliberately about chunks, not about any particular mod. Nothing in Chunksmith knows Millenaire's name; anything that builds on newly generated chunks benefits, and anything that does not is unaffected.
- On by default.
pregenSettle: falseinconfig/chunksmith/config.jsonrestores the old behaviour exactly -- release inline, allocate nothing -- which is the right setting for a pure terrain pregen with no such mods installed, where holding the frontier costs memory and a little throughput and buys nothing.pregenSettleDelayTicks(default 40, i.e. two seconds) tunes how long a chunk lingers after its neighbourhood closes, andpregenSettleRadius(default 7 chunks, maximum 16) sets how much ground the trailing sweep loads together -- sized to the largest footprint a mod is likely to want at once. - Note for upgrades: an existing config is never rewritten, so these keys will not appear in a
config written by an earlier version. They take their defaults regardless; delete
config/chunksmith/config.jsonand restart to get a fresh one that lists them.
- LOD data is no longer re-injected into the renderer on every single world join. Which
regions had already been handed to voxy / Distant Horizons was remembered only in memory, and
that memory was thrown away on disconnect -- so every join re-decoded and re-pushed the entire
in-range store, whether or not the renderer already had every bit of it. On a large pregenerated
world that is minutes of CPU on a background thread at every single join, for terrain that was
already drawn. Reported by Maker261 (mod_support #15) on a two-core machine, where it is
impossible to miss.
- The claim set is now written to disk as
.injected, one per dimension, next to the region files it describes -- the samex,z=tokenline format and the same atomic.part+move discipline the download manifest already uses. A join now starts from what the last session actually injected instead of from nothing. - A region whose token has MOVED is still re-injected. That is the whole point of tracking the token rather than the coordinates, and it is what keeps a pregen that is still growing the region under the player's feet from freezing at whatever it was when they first joined.
- The file records WHICH renderers it was written for. Install Distant Horizons alongside an existing voxy setup and the epoch no longer matches, so everything is injected once into the renderer that has never seen it, rather than being skipped forever.
reinject-on-join(new, inconfig/chunksmith-lod.properties, defaultfalse) forces a full re-injection for one session. It is the escape hatch for the case the epoch cannot see: a player who deletes or resets their renderer's own database still holds a.injectedthat honestly describes what we sent, and we would otherwise believe them. Deleting the.injectedfiles does the same thing.
- The claim set is now written to disk as
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:7Ohhi6K6"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:4BeAEBIb:7Ohhi6K6"
}
