New Commands
- /price — item price lookup
- /recipe — view crafting recipes
- /top — likely top players (balance/stats)
- /oeworld (OeWorldCommand) — admin world management (625 lines, major feature)
- /help — custom help system with HelpConfig
- /ignore — player ignore system with IgnoreService
- /mail — in-game mail system (MailCommand, MailService, MailListener)
- /rules — display server rules
- /history — punishment history viewer
- /warn / /unwarn / /warnings — full warnings system with WarnService
- /setfirstspawn — set the first-join spawn point
New Systems / Services
- MOTD — MotdConfig + MotdService
- Join Flood Guard — JoinFloodGuardService (rate-limits joins)
- Container Spam Guard — ContainerSpamGuardListener (anti-spam for container opens)
- Punishment Logger — PunishmentLogger for audit logging
- Void Chunk Generator — VoidChunkGenerator for void worlds
Improvements
- /cheque — heavily reworked (ChequeCommand, tab completer)
- /near — GUI provider added (NearGuiProvider)
- /homes — significant rework
- Scoreboard — service refactor
- Tab list — CustomTablistLayout expanded
- Nametag manager — expanded
- World gamerules menu — reworked GUI
- /msg — minor additions
New: /oeworld — World Management
Full in-game world creation, import, and pre-generation without restarting the server.
/oeworld create <name> <normal|nether|end|void> <border> <true|false>
/oeworld import <worldname> [normal|nether|end|void] [border]
/oeworld cancel <worldname>
- Create normal, nether, end, and void worlds on the fly
- Void worlds include a single bedrock platform at the center — players teleport directly onto it
- Import existing worlds from disk — detects environment automatically from level.dat, registers for auto-load on restart
- World border applied on creation/import
- Lag-free async pre-generation — uses Paper's async chunk API, all chunk generation runs off the main thread with zero TPS impact. Progress reported every 5% in chat
- Cancel any active pre-generation at any time with /oeworld cancel
- Worlds persist across restarts — saved to plugins/OreoEssentials/worlds.yml and auto-loaded on startup
- Full tab completion with inline hints (<worldname>, <border_in_blocks>, etc.)
- Permission: oreo.oeworld (default: op)
---
New: /setfirstspawn
Sets a separate spawn location used exclusively for players joining the server for the very first time. Falls back to the regular spawn if not set.
- Permission: oreo.setfirstspawn (default: op)
---
Fix: PAPI placeholders not resolving in LuckPerms prefix/suffix
PlaceholderAPI placeholders (e.g. %nexo_...%) set directly inside a LuckPerms prefix or suffix were shown as literal text in chat instead of being replaced. Fixed in both the standard chat listener and the chat channels handler.
---
Fix: Server crash on startup when importing worlds without a border
Importing a world without specifying a border saved Minecraft's default world border size (60,000,000) which is above Bukkit's hard cap of 59,999,968, causing IllegalArgumentException on the next startup. The value is now treated as "no border" and saved as 0.
---
Compatibility: Paper / Folia / Purpur 1.21+
FIXES:
1 : reloadHolograms() race condition
Previously unloadHolograms() submitted an async task and returned immediately, then loadHolograms() was called right away. The async unload could fire after the load, deleting newly-loaded holograms. Now reloadHolograms() submits unloadHologramsSync() and blocks with .get() until it completes before
loading.
2:unloadHolograms() / unloadHolograms(world) key mismatch (three call sites)
The holograms map uses name.toLowerCase() as its key, but all holograms.remove() calls in the unload methods were using hologram.getName() (no lowercase). Holograms with uppercase letters in their names were silently left in the map. All three removed.
3: saveConfig() swallows SnakeYAML exceptions
Only IOException was caught. SnakeYAML's YAMLException (which can be thrown for unusual Unicode codepoints like ItemsAdder glyphs) is unchecked, so it was silently swallowed by the executor — the file was never written and the hologram reappeared on restart. Now a second catch (Exception e) block logs
the error visibly.
Fix 4 : Shutdown ordering (OHolograms.java

nDisable)
The hologram thread and file executor were shut down simultaneously. Pending hologram-thread tasks (like delete saves) that submit work to the file executor would get RejectedExecutionException if the file executor shut down first. Now the hologram thread is fully awaited before the file executor is shut
down.