🐛 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.