
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.0+1.20.4-forge
Compatibility
Changes
The world-enter pregen always centred on (0, 0). Any mod that moves world spawn -- and plenty do -- therefore had it pregenerate the wrong part of the world: the player waits behind a progress screen while terrain nobody is going to stand on is built, and the terrain around them is generated on foot afterwards anyway. Reported on mod_support #34.
Added
-
worldEnterPregenCenter-- where the world-enter pregen is centred.origin(the default, and what every existing world already did),spawnto follow the world's spawn point, or an explicitx,z. Settable inconfig/chunksmith/config.jsonor with/cs set worldEnterPregenCenter spawn.In a command the coordinate form needs quotes --
/cs set worldEnterPregenCenter "512,-64"-- because an unquoted command argument cannot contain a comma.originandspawnneed no quotes, and the config file takes the bare form either way. All three were checked on a live server, not assumed: the unquoted pair is the one thing that does not parse, and it fails loudly rather than storing something nobody asked for. -
The server now tells you when no client has ever reached the LOD backchannel. It has always logged the port at startup and said to open it; three separate operators have now missed that line in a modded server's boot spam and reported the symptom instead. The server can tell the difference on its own -- a client is connected, a download credential was issued, and yet nothing has served AND nothing has been rejected, which together mean no request ever arrived -- so it says so, once, to the operator, at the moment it matters rather than at boot. Throttled to one message per player every ten minutes.
The consequence differs by platform and the message says which applies to you: on the mod the LOD falls back to the game connection, so it still arrives, just slowly. The plugin has no such fallback, so an unreachable backchannel there means no LOD at all -- which makes the plugin the side that needed this notice most, and the side that did not have it until now.
The notice now also names the cause it used to leave out.
lodBackchannelBindAddressdefaults to empty, which means "bind wherever the game bound" -- that is, whateverserver-ip=says in server.properties. Unset, which is the normal case, that is every interface and all is well. But a hosted panel behind a proxy routinely setsserver-ip=127.0.0.1, and the backchannel then binds loopback only: unreachable however carefully the port is forwarded, and producing exactly the signature this notice fires on. It now says so, and gives the override --/cs set lodBackchannelBindAddress 0.0.0.0. -
/cs setnames the accepted forms when it refuses a value. A rejected setting used to say only that the value was invalid, leaving you to guess the shape it wanted.
Fixed
-
/cs statusand/cs progresscould answer with silence while a pregen was running. Both read the list of tasks, then printed only those whose world matched one the server currently listed -- and when none matched they printed nothing at all, not even "no tasks", because there were tasks. A player watching chunks generate could ask what was running and be told nothing, in two different ways. Both now report every task they hold; each line already named its own world, so the filtering was never buying anything. Reported on mod_support #33. -
The world-enter estimate no longer swings by an hour between redraws. Reported from real play: "time remaining" jumping from 1-2 hours down to 30 minutes, several times a second. The estimate is measured over a window of eight samples, which was written for samples about a second apart -- but it is fed
GenerationProgressEvent, which fires once per finished chunk, throttled to ten a second rather than to one. Eight of those is under a second of history, so on a bursty run the "rate" was whichever side of a burst it happened to catch. Samples closer together than a second are now ignored, so the window really is the few seconds it claims to be.Nothing about the window length or the arithmetic was wrong; the samples were simply arriving an order of magnitude faster than the code consuming them assumed. A rate is only as meaningful as the interval it is measured over.
Changed
-
Every cell was rebuilt against a current loader and a current fabric-api. This is not a behaviour change; it is a coverage one. The pins had drifted -- NeoForge 26.3 was three betas behind, 26.2 four builds, and several pre-26 cells more -- and because the declared ranges are deliberately wider than the build pins, nothing was ever broken by it: the jars loaded on the newer loaders perfectly well. What had drifted was that the jars players run were not the jars that were tested. NeoForge is now 26.1
26.1.2.109/ 26.226.2.0.88/ 26.326.3.0.4-beta, fabric-api 26.10.155.3/ 26.20.160.0/ 26.30.160.7, and the pre-26 Forge and NeoForge cells are current too.Forge 1.21.11 is the one exception and stays at
61.1.0: newer builds on that line cannot be built here at all, because ForgeGradle 6 throwsduplicate entry: mcp/client/Start.classwhile assembling the mapped artifact. The published Forge bundles are not at fault -- they carry no duplicate -- and61.1.0succeeds only because its artifact was derived months ago and is still cached. That jar declares[61,)with an open upper bound, so it loads on newer 61.x regardless. -
The completion record now stores the centre as well as the radius. It already stored the radius so that raising
worldEnterPregenRadiuscould re-arm a world that had been finished at a smaller one. The centre needs the same treatment for the same reason: without it, changing the centre on a world already recorded as done would be silently ignored forever, which is the exact failure the stored radius exists to prevent.
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:Xlc8kdqn"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:4BeAEBIb:Xlc8kdqn"
}
