5.2-SNAPSHOT
Compatibility
Changes
🐛 Bug Fixes [FOLIA] UnsupportedOperationException on startup — YamlPlayerWarpStorage Replaced a Bukkit.getScheduler().runTask() call inside the constructor with OreScheduler.run(). Folia throws UnsupportedOperationException on any CraftScheduler call, causing the plugin to crash immediately on boot.
[FOLIA] IllegalStateException: Asynchronous Recipe Add! — Custom Crafting When saving a recipe via /oecraft browse, the recipe was being registered to Bukkit's recipe manager from inside an async thread (Async.run()). Bukkit.addRecipe() requires the main thread on both Folia and Paper. Added saveAndRegisterAsync() method: file I/O stays on the async thread, then switches to the main thread via OreScheduler.run() before calling registerBukkitRecipe().
[FOLIA / PAPER] RabbitMQ connection blocking the server thread Phase 1: Added factory.setConnectionTimeout(5000) and factory.setHandshakeTimeout(5000) to the ConnectionFactory. Without these, a failed connection would block the server thread for the full OS-level TCP timeout (20–30+ seconds). Phase 2: Fully refactored initRabbitMQ() to be non-blocking. The server now instantly starts in local mode, fires an async thread to connect to RabbitMQ, and if successful, upgrades to cross-server mode on the main thread. Server startup is no longer affected by RabbitMQ availability at all.
[BUG] Brokers initializing before RabbitMQ connected After the async RabbitMQ refactor, initBrokers() was running synchronously before the async connection completed, causing all brokers (MOD-BRIDGE, TRADE, HomeTeleportBroker, TPA, BackBroker, etc.) to report "PacketManager unavailable" even when RabbitMQ would later connect successfully. initBrokers() was removed from onEnable() and is now called from inside the RabbitMQ async callback — once on successful connect (with full PacketManager), and once on failure (sets all brokers to null with proper disabled messages).
[BUG] Language setting not applied — server.language not read config.yml stores the language under server.language (nested under the server: block), but Lang.init() and Lang.reload() were reading from the root key language, causing the language to always default to English regardless of config. Fixed to read server.language first, falling back to the root language key for backwards compatibility.
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:mW41qQ0T:buWyuqXg"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:mW41qQ0T:buWyuqXg"
}

