- Paper 26.3 (compiled against
26.3.build.42-alpha) - Java 25
- KPaper lifecycle with all optional KPaper features disabled
With JDK 25 selected, run the checked-in Gradle wrapper:
bash gradlew clean build --refresh-dependencies --no-daemonThe build compiles against Paper 26.3 and runs the unit tests. The plugin JAR is written to build/libs/. Pull requests run this same clean build without publishing a release. Jenkins uses its jdk25 tool and exposes the successful JAR as a downloadable artifact.
KPaperGradle is pinned to the last version that resolves both build and runtime libraries through Maven Central, ModLabs' hosted repository, and CodeMC rather than depending on the broad ModLabs mirror. The KPaper library version remains 2026.9.23.1637. Malformed mirror responses caused the failed release build; do not restore the mirror-only plugin until its repository routing is fixed.
Before releasing, smoke-test the JAR on an isolated Paper 26.3 server: start with an existing managed dimension, import a new 26.3 Misode share, restart, and verify world loading, teleportation, and generators. Unit tests do not replace this server check.
Use PlotSquared's normal /plot setup workflow and keep PlotSquared selected as the generator. PlotSquared creates the Bukkit world; WorldEngine discovers the loaded world automatically and manages it through /world <name> and the WorldEngine API.
WorldEngine intentionally does not register itself as a /plot setup generator.
Stage a void dimension from a Minecraft 26.3 Misode Dimension Type share link:
/worldengine dimension create <world> <share-link>
Restart the server once. WorldEngine registers the generated datapack during bootstrap and manages the loaded worldengine:<world> dimension afterward. Only HTTPS links from misode.github.io/dimension-type/ are accepted.
Managed dimension datapacks use Minecraft 26.3 data pack format 121.0. Existing WorldEngine 26.2 packs are upgraded on bootstrap: pack metadata is refreshed and the bed-rule explodes field is migrated to destroy_on_use. New imports must use a 26.3 Misode share. Back up your worlds and plugins/WorldEngine/dimension-datapack before upgrading.
For Geyser compatibility, imported dimension types with a negative min_y are mapped to Bedrock's Overworld height model. Existing WorldEngine dimension types are migrated automatically during the next server bootstrap and loaded during that same start.
WorldEngine exposes a small Bukkit service API for other plugins:
- Service interface:
cc.modlabs.worldengine.api.WorldEngineApi - Convenience accessor:
cc.modlabs.worldengine.WorldEngine.api
import cc.modlabs.worldengine.WorldEngine
val worldEngine = Bukkit.getPluginManager().getPlugin("WorldEngine") as? WorldEngine
?: return
val api = worldEngine.api
// Load or create world (same behavior as /world <name>)
val world = api.getOrLoadWorld("event_world") ?: return
// Teleport player to world spawn
api.teleportToWorldSpawn(player, world)
// Create world with a preset generator
val flatGenerator = api.resolveChunkGenerator("flat")
api.createWorld("flat_event", flatGenerator)
// Custom flat base height
val lowFlatGenerator = api.resolveChunkGenerator("flat:64")
api.createWorld("low_flat_event", lowFlatGenerator)
// Copy world asynchronously-ish on main thread callback
api.scheduleWorldCopy(world, "event_world_backup") { result ->
result.onSuccess { copied ->
player.sendMessage("Copied world: ${copied.name}")
}.onFailure { error ->
player.sendMessage("Copy failed: ${error.message}")
}
}import cc.modlabs.worldengine.api.WorldEngineApi;
import org.bukkit.Bukkit;
import org.bukkit.plugin.RegisteredServiceProvider;
RegisteredServiceProvider<WorldEngineApi> registration =
Bukkit.getServicesManager().getRegistration(WorldEngineApi.class);
if (registration == null) {
return;
}
WorldEngineApi api = registration.getProvider();
var world = api.getOrLoadWorld("event_world");
if (world != null) {
api.teleportToWorldSpawn(player, world);
}- API methods are designed to mirror existing command/startup features.
- Permission enforcement is not automatic for API callers; handle authorization in your plugin.
- Built-in generator ids are
empty,flat, andocean.flatdefaults to base height 128; useflat:<height>to override it.
WorldEngine is published to ModLabs Nexus.
repositories {
maven("https://repo-api.modlabs.cc/repo/maven/maven-public/")
}
dependencies {
compileOnly("cc.modlabs.worldengine:WorldEngine:<version>")
}