
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.0.0+1.21.8-neoforge
Compatibility
Changes
Breaking. The command surface is reorganised by who can run a command and where it executes, and
/cslod is retired. Protocol version moves to 4.
Changed
-
Commands are split by audience, not by feature.
/cslodgrouped things by subsystem, which put three client-side operations behind a server permission gate and gave the client's own state no readout at all. Server operator commands now live under the existing/csroot, which already carries the permission gate; everything a player runs for their own client lives under a new/csclient.was now /cslod status/cs lod status/cslod token <player>/cs lod token <player>/cslod set/csclient set/cslod inject/csclient inject_voxy/cslod dhpush/csclient inject_dh -
/csclientis a real client command, registered through Fabric'sClientCommandRegistrationCallbackand NeoForge/Forge'sRegisterClientCommandsEvent. It therefore works when connected to a server that has never heard of Chunksmith, which is exactly when you want to ask why no LODs are arriving. It does not exist on the Bukkit plugin; there is no client there. -
injectanddhpushbecameinject_voxyandinject_dh. One was named for its verb and the other for its target, so neither said what it did. -
Both status commands print one value per line instead of a single packed line.
-
The per-subcommand operator gates are gone.
/csgates at its root, and/csclientneeds no gate. -
The client store is keyed to the WORLD, not the server address. A client used to file LOD under the host it connected to, so a world that changed address looked brand new and was downloaded again, while two unrelated worlds behind one address shared a store and overwrote each other. The server now mints a stable id per world and the client files under that. Stores from before 4.0 are left alone, listed by
/csclient statusaspre-4.0 stores, and cleared by/csclient resetwhen you want the space back. Against a 3.x server the client falls back to the old host key, because that server has no id to give.
Added
-
/csclient resetreturns the client to the state it was in before it first connected: the store for that server is deleted across every dimension, the injected-region bookkeeping is cleared, and the handshake runs again, all without a relog. Until now the only way out of a bad client store was to disconnect and delete the directory by hand.It cannot give you a clean slate on its own, and says so when it runs. Distant Horizons and Voxy keep their own databases, which Chunksmith does not touch by design, so a world that was regenerated server-side may still render its old terrain out of the renderer's copy.
-
/csclient statusreports the client store: which server it is keyed to, the path, per-dimension region counts, transport, renderers, injection progress, and the settings in force. It also reports the renderer queue depth -- the numberthrottleLodDrainTobelow is measured against. Without it there was no way to tell whether that setting could ever engage on your machine. -
max-disk-mb(client) caps what Chunksmith keeps on disk for a world, in megabytes. Default 0, meaning no cap, which is the behaviour every earlier release had: how much a client wrote was decided entirely by the server's index budget, a number the client cannot see and was never told. Nearest terrain is kept first.Declining regions does not put the client into a permanent re-download loop. The summary the two sides compare is an XOR aggregate, which is its own inverse, so declined regions fold back out of the server's number exactly and a capped client settles at "I have everything I intend to have".
-
throttleLodDrainTo(server) makes the LOD governor a barrier: stop dispatching entirely and let the renderer drain to that depth before resuming, rather than merely slowing down. Default 0, meaning off, and it should stay off unless you have measured your own machine.It is off by default because the measurement argues against it. On a four-core client with voxy the barrier ran about 11% SLOWER than the existing governor and did not change how often the run paused. It is here because alternating should beat competing on a machine with no cores to spare -- but that has not been demonstrated, and guessing the threshold is how a throttle ends up tuned for one box.
Removed
/cslodis gone, and a 4.x client does not register it under any name. See Compatibility.- The
SETTING_LIST/SETTING_SHOW/SETTING_SETrelay. A client command reads and writesconfig/chunksmith-lod.propertiesdirectly, so the server no longer has to ask the client on the player's behalf.
Plugin (Paper / Spigot)
-
/cs lod statusand/cs lod token <player>work on the plugin too. Status is reported per WORLD rather than per dimension, because that is the shape a Bukkit server actually has: the mod keeps one save folder with its dimensions nested inside, Bukkit gives each world its own folder and therefore its own store. It answers from the console for the same reason. -
There is no
/csclienton the plugin and there will not be. That command runs on a client, and a Bukkit server does not have one. -
The plugin serves the new world id, anchored to the primary world -- the one
level-namenames and the one the others are derived from, so it is the folder whose replacement really does mean "this is a different world now". -
Folia is no longer declared supported.
folia-supportedis gone fromplugin.yml, so Folia will refuse to load the plugin rather than running it untested. This was announced in 3.3.0 and a major release is where it lands. Nothing changes for Paper or Spigot.The reasoning is not that Folia is broken -- it is that the Folia harness could not be kept working, and a platform nobody tests is an unverifiable claim, which is worse than an absent one. The region-scheduler code paths and the
folia-apicompile dependency are still in the tree and come out separately; removing them means moving three cells ontopaper-apiand unwinding the JVM-version workaroundsfolia-apiforces, which is its own change and does not belong in this one.
Compatibility
CsLodProtocol.VERSION goes from 2 to 4, matching the major version from here on. There was never
a protocol 3.
4.0.0 is a coordinated upgrade: move the server and the client together. The two protocols do not interoperate, so a mixed 3.x/4.x pair turns LOD off in BOTH directions -- the client will not fetch and the server will not serve. Everything else in Chunksmith keeps working; what stops arriving is the distant terrain.
This is worth saying plainly because a launcher will offer 4.0.0 to anyone running 3.x, so a client can be updated into the mismatch without the server being touched by anyone. A 4.x client that lands on a 3.x server now says so in chat on join, rather than leaving you to work out why the horizon went empty.
- 4.x server, 4.x client.
/csloddoes not exist on either side. - 3.x server, 4.x client. The client registers no
/cslod, so the server's own still arrives in the command tree and/cslod setstill reaches this client's settings. LOD data does not transfer. - 4.x server, 3.x client.
/cslodanswers "update your cs client" and does nothing else.
All of that lives in one legacy package and comes out in 5.x.
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:m6sZqDIL"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:4BeAEBIb:m6sZqDIL"
}
