# 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
1. **As always, take backups just in case.** (Make a copy of everything!)
2. Stop the server.
3. Replace the BentoBox jar with this one.
4. Start the server.
5. ⚙️ Two new config areas are added on first run — `general.did-you-mean` (both toggles default **on**) and `world.disabled-structures` (empty by default, so structure generation is unchanged unless you opt in). Review them if you want to change the defaults.
6. 🔡 Three new `general.did-you-mean` locale 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 `/teams` or `/island invit` now 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 `/locate` main-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.placeBlock` exposes Oraxen custom-block placement to addons.
---
## New Features
### 🔡 ⚙️ Did-you-mean command suggestions
[[PR #3029](https://github.com/BentoBoxWorld/BentoBox/pull/3029)] — Fixes [#3027](https://github.com/BentoBoxWorld/BentoBox/issues/3027)
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-commands` and `subcommands` — both default **on**.
> 🔡 **Locale note:** three new `general.did-you-mean` keys were translated into all 22 bundled locales, and the pre-existing missing key `commands.admin.team.setowner.specify-island` was filled in every non-English file at the same time.
### ⚙️ Core structure suppression for all game modes
[[PR #3019](https://github.com/BentoBoxWorld/BentoBox/pull/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:
- **`/locate` freeze.** 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 any `onEnable()` 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](https://github.com/BentoBoxWorld/BentoBox/pull/3028)]
A new `NexoHook` lets BentoBox place and detect [Nexo](https://nexomc.com/) custom blocks and items, registered through `BentoBoxHookRegistrar` alongside the other custom-item integrations.
### Oraxen custom-block placement
[[PR #3026](https://github.com/BentoBoxWorld/BentoBox/pull/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 https://github.com/BentoBoxWorld/BentoBox/pull/3029
* ⚙️ Core structure suppression for all game modes (#116/#117/#118) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3019
* Add NexoHook for Nexo custom blocks and items by @Copilot in https://github.com/BentoBoxWorld/BentoBox/pull/3028
* Add OraxenHook.placeBlock to expose custom block placement by @Copilot in https://github.com/BentoBoxWorld/BentoBox/pull/3026
**Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.19.0...3.20.0
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }