Release 3.20.0
BentoBox 3.20.0
A quality-of-life release. Players who mistype a command now get a clickable "did you mean…?" suggestion instead of a wall of help text, every game-mode world can suppress vanilla structures from core (fixing the long-standing /locate freeze), and BentoBox gains hooks for Nexo and richer Oraxen custom-block placement.
Compatibility
✔️ Paper Minecraft 1.21.5 – 26.2
✔️ Java 25+
Upgrading
- As always, take backups just in case. (Make a copy of everything!)
- Stop the server.
- Replace the BentoBox jar with this one.
- Start the server.
- ⚙️ Two new config areas are added on first run —
general.did-you-mean(both toggles default on) andworld.disabled-structures(empty by default, so structure generation is unchanged unless you opt in). Review them if you want to change the defaults. - 🔡 Three new
general.did-you-meanlocale keys were added to every bundled language. If you maintain custom locale files, regenerate or add these keys.
Highlights
- 🔡 ⚙️ Did-you-mean command suggestions — a mistyped command like
/teamsor/island invitnow offers the closest matching BentoBox command, clickable or accept-by-typing-yes, instead of an unknown-command error. - ⚙️ Core vanilla-structure suppression — any game mode can now disable vanilla structures from a single core config list, ending the
/locatemain-thread freeze and near-spawn structure leaks per-addon fixes used to require. - Nexo hook — BentoBox can now place and detect Nexo custom blocks and items.
- Oraxen block placement —
OraxenHook.placeBlockexposes Oraxen custom-block placement to addons.
New Features
🔡 ⚙️ Did-you-mean command suggestions
When a player mistypes a command, BentoBox now suggests the closest match instead of dumping help:
| Player types | They get |
|---|---|
/teams |
Did you mean /oneblock team? Click here or type yes to run it. |
/team invite Floris |
Did you mean /oneblock team invite Floris? — arguments survive |
/oneblock invit Floris |
Did you mean /oneblock team invite Floris? — instead of the unknown-command error |
| gibberish | vanilla behavior, no false positives |
Suggestions match against the labels and aliases of every node in the command trees (players type subcommands as if they were whole commands), rank exact > prefix > edit-distance, are permission-filtered, and use the game-mode world the player is standing in to disambiguate. Accepting is a click ([run_command:] inline tag) or typing yes/y within 30 seconds; pending suggestions clear when the player runs any other command or quits. The listener hooks UnknownCommandEvent, which fires only when no plugin owns the command, so BentoBox never shadows another plugin.
⚙️ Config note: two new toggles under
general.did-you-mean—unknown-commandsandsubcommands— both default on.
🔡 Locale note: three newgeneral.did-you-meankeys were translated into all 22 bundled locales, and the pre-existing missing keycommands.admin.team.setowner.specify-islandwas filled in every non-English file at the same time.
⚙️ Core structure suppression for all game modes
[PR #3019] — Addresses CaveBlock #116 / #117 / #118
Disabling a vanilla structure used to be a per-addon job. This moves it into core so every game mode gets it for free, fixing two problems any world that delegates to vanilla generation could hit:
/locatefreeze. Cancelling structure placement left the world's placement rules intact, so every structure search —/locate, Eyes of Ender, explorer/treasure maps, dolphins, villager cartographer trades — kept proposing candidates that all got cancelled, scanning to the radius cap and freezing the main thread (Paper Watchdog territory).- Near-spawn leak. A disabled structure could still generate near spawn because spawn chunks are generated during
createWorlds(), before anyonEnable()listener existed.
Two config layers control it: the global world.disabled-structures list in config.yml (applied to every BentoBox game-mode overworld/nether/end), and a binary-compatible per-world WorldSettings.getStructureSettings() override that lets a game mode disable extra structures or force-enable one the global list disables. Keys are case- and separator-insensitive (trial_chambers, ancient-city). The global list is empty by default, so upgrading changes nothing until you opt in.
Nexo hook
[PR #3028]
A new NexoHook lets BentoBox place and detect Nexo custom blocks and items, registered through BentoBoxHookRegistrar alongside the other custom-item integrations.
Oraxen custom-block placement
[PR #3026]
OraxenHook.placeBlock exposes Oraxen custom-block placement to addons, matching the placement API the other custom-block hooks provide.
Legend
- 🔡 Locale files may need regenerating or updating.
- ⚙️ Config options have been added, renamed, or removed.
- 🔺 Special attention needed.
What's Changed
- 🔡 ⚙️ Did-you-mean command suggestions (#3027) by @tastybento in #3029
- ⚙️ Core structure suppression for all game modes (#116/#117/#118) by @tastybento in #3019
- Add NexoHook for Nexo custom blocks and items by @Copilot in #3028
- Add OraxenHook.placeBlock to expose custom block placement by @Copilot in #3026
Full Changelog: 3.19.0...3.20.0