COWMODSКаталог модов

BentoBox

SkyBlock, OneBlock, Boxed, SkyGrid, AcidIsland, CaveBlock, Poseidon, StrangerRealms - and more! These are just some of the island-based game modes that BentoBox powers. From the author of the original ASkyBlock.

Автор: fredthedoggy56,1 тыс.45обновлён 17 окт. 2026 г.
Механики игрыМини-игры

Описание

SkyBlock, OneBlock, AcidIsland, and more — all in one plugin

BentoBox powers island-style game modes for Paper servers. Pick the game modes you want, drop them in, and you're running. No forks, no outdated code — one actively maintained platform that stays current with every Minecraft release.

Game modes available:

  • BSkyBlock — classic SkyBlock, successor to the original ASkyBlock
  • AOneBlock — the popular OneBlock experience
  • AcidIsland — survive in a sea of acid
  • Boxed — expand your world by completing advancements
  • CaveBlock — underground survival
  • SkyGrid — scattered blocks, maximum adventure
  • Poseidon — underwater island challenge
  • And more community-created game modes

Why server admins choose BentoBox:

  • Run multiple game modes on one server with shared features (challenges, warps, levels, leaderboards)
  • 20+ addons let you customize exactly the experience you want
  • Actively maintained and always up to date with the latest Minecraft version
  • Free and open source — used on 1,100+ servers worldwide
  • Rich API for developers who want to build custom addons

Browse all BentoBox Addons | Full Documentation

Installation

  1. Place the BentoBox jar in your plugins folder
  2. Start the server
  3. Download the game mode and feature addons you want from this site or download.bentobox.world and place them in the plugins/BentoBox/addons folder
  4. Restart the server — you're good to go

NOTE: Older versions supported Spigot, but now we can only support Paper.

Галерея

SkyBlockSkyBlockSkyGridSkyBlock

Последние версии

Все версии →
release

3.23.4

3.23.4
17 окт. 2026 г.2,8 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3paper, purpur
Скачать
Что нового
## Release Highlights * **Safe End arrival without the obsidian platform**: with `create-obsidian-platform: false`, going through an End portal could drop the player into the void. Players now land on the nearest safe spot, or in a pod if there is none. * ✨ **Use your own inventory while a panel is open**: players can move items, drop them and use bundles in their own inventory while a BentoBox panel such as `/island settings` is open. Shift-clicks, double-clicks and drags that could push items into a panel stay blocked, so items can't be lost. * **Addon config fix**: `saveConfig()` no longer crashes for an addon that has no `config.yml`. ### Compatibility ✔️ Paper Minecraft 1.21.5 – 26.3 ✔️ 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. Restart the server. 5. You should be good to go! There are no new locale keys and no `config.yml` or panel template changes in this release. --- ## New Features ### ✨ Player Inventory Clicks While a Panel Is Open [[PR #3100](https://github.com/BentoBoxWorld/BentoBox/pull/3100)] This brings back the goal of [#2767](https://github.com/BentoBoxWorld/BentoBox/issues/2767) without the problems that got it reverted in 3.11.1 ([#2776](https://github.com/BentoBoxWorld/BentoBox/issues/2776)). While a panel is open, players can pick up, place, swap, drop (Q / Ctrl+Q) and use bundles in their own inventory. Any action that could move an item into the panel is still blocked: shift-click, double-click to collect, and drags that touch a panel slot. A click on a panel slot while holding an item is always cancelled. > 🧩 **Addon developers:** `PanelListener` has a new default method, `allowsPlayerInventoryClicks()`, which returns `false`. Panels with a listener therefore see inventory clicks exactly as before, so icon pickers in the core and in Challenges and Biomes are unchanged. Override it to return `true` to opt in. The change is binary compatible. --- ## Bug Fixes ### End Portal Could Drop Players into the Void [[PR #3101](https://github.com/BentoBoxWorld/BentoBox/pull/3101)] When the End obsidian platform was turned off, the server teleported the player straight to the portal destination, whether or not there was a floor. BentoBox now cancels unsafe End arrivals and sends the player to the nearest safe spot, then the highest block, then a pod. Repeat portal events fired while the player stands in the portal are also cancelled, so the player is not sent to the vanilla End spawn. Arrivals that are already safe still teleport instantly, and nothing changes when the platform is on. Safe-spot pods now teleport the player to the centre of the block, not its edge. ### Addon `saveConfig()` NullPointerException [[commit fb446a7](https://github.com/BentoBoxWorld/BentoBox/commit/fb446a7af)] `Addon.getConfig()` returned `null` when the addon had no `config.yml`, so `saveConfig()` threw an error. It now returns an empty configuration, as Bukkit's `JavaPlugin.getConfig()` does. --- ## What's Changed * Let players use their own inventory while a panel is open by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3100 * Safe End arrival when the obsidian platform is off by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3101 * Fix Sonar S2259: null addon config and MongoDB connector by @tastybento **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.23.3...3.23.4
release

3.23.3

3.23.3
3 окт. 2026 г.4,8 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3paper, purpur
Скачать
Что нового
## Release Highlights * 🐛 **Obsidian scooping dupe fixed**: scooping obsidian back into lava could give a player both the obsidian and the lava bucket. Updating is recommended for every server with OBSIDIAN_SCOOPING enabled. * ⚙️ **Customisable Command Ranks panel**: the Command Ranks panel opened from `/island settings` now uses a template, `panels/command_ranks_panel.yml`, and gains paging. * ✨ **Settings panel improvements**: `/island settings` remembers the player's Basic/Advanced/Expert choice, Command Ranks hides sub-commands the player has no permission for, and the Break Spawners icon loses the stray vanilla spawn egg tooltip. * 🐛 **Multiverse auto-load respected**: BentoBox no longer resets `auto-load` to false on every startup for worlds Multiverse already knows about. ### Compatibility ✔️ Paper Minecraft 1.21.5 – 26.3 ✔️ 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. Restart the server. The new `command_ranks_panel.yml` template is written to `plugins/BentoBox/panels/` on first run. 5. You should be good to go! > ⚙️ **Panel note:** `command_ranks_panel.yml` is a new file. Nothing existing is overwritten, and a game mode addon may ship its own copy in its `panels/` folder, which takes precedence for that game mode. There are no new locale keys and no `config.yml` changes. ### Legend - ⚙️ config options have been removed, renamed, or added. --- ## New Features ### ⚙️ Template-Editable Command Ranks Panel [[PR #3096](https://github.com/BentoBoxWorld/BentoBox/pull/3096)] Closes [#3095](https://github.com/BentoBoxWorld/BentoBox/issues/3095) The Command Ranks panel is now laid out by `panels/command_ranks_panel.yml`, in the same way as the settings panel. The template supports `COMMAND`, `NEXT` and `PREVIOUS` buttons, and the `COMMAND` button's icon, title and description can be customised. The default template looks the same as the old panel, but now pages at 45 commands; the old panel silently dropped every command after the 49th. ### 🧩 `PlayerDeathsChangedEvent` for Addons [[PR #3093](https://github.com/BentoBoxWorld/BentoBox/pull/3093)] The admin `deaths set|add|remove|reset` commands now fire `PlayerDeathsChangedEvent`, which gives the world, the player, the action, the requested amount and the old and new counts. The event lets Level, which tracks death handicaps per island, follow admin changes. It is not fired for natural deaths. ## Bug Fixes ### 🐛 Obsidian Scooping Lava/Obsidian Dupe [[PR #3098](https://github.com/BentoBoxWorld/BentoBox/pull/3098)] With OBSIDIAN_SCOOPING, right-clicking a lone obsidian block with an empty bucket gives back lava. BentoBox checked the block and the bucket at the moment of the click but handed out the lava one tick later without checking again. If the obsidian was mined within that tick, the player got both the obsidian and the lava. If the bucket was moved out of the hand, lava could be given without an empty bucket being used up. Both are now re-checked before the lava is given, and the scooping message and sound only play when the lava is actually given. ### 🐛 Multiverse `auto-load` Is No Longer Reset on Every Startup Fixes [#3097](https://github.com/BentoBoxWorld/BentoBox/issues/3097) Since 3.22.0 the Multiverse hook set `auto-load: false` on every BentoBox world at every startup. Admins who set it back to `true`, so that plugins enabling after Multiverse could use the worlds during their own startup, saw the change reverted on the next boot. Auto-load is now turned off only when BentoBox first imports a world, and an existing Multiverse entry is left as the admin configured it. The default is unchanged. This applies to both the Multiverse 4 and 5 hooks. ### 🐛 Settings Panel Fixes [[PR #3094](https://github.com/BentoBoxWorld/BentoBox/pull/3094)] Fixes [#3092](https://github.com/BentoBoxWorld/BentoBox/issues/3092) * The Break Spawners icon no longer shows vanilla's "Interact with Spawn Egg: Sets Mob Type" tooltip. * Command Ranks no longer lists sub-commands the player has no permission for, such as `/ob border` when `oneblock.island.border` is denied. Ops still see everything. * `/island settings` opens in the Basic/Advanced/Expert mode the player last chose, and the Protection and Settings tabs share a single mode. The admin panel still opens in Expert. --- ## What's Changed * Fire PlayerDeathsChangedEvent from admin deaths commands by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3093 * Settings panel improvements (#3092) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3094 * ⚙️ Template-editable Command Ranks panel (#3095) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3096 * Only set Multiverse auto-load false on first import (#3097) by @tastybento * Fix obsidian scoop lava/obsidian dupe by re-validating before giving lava by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3098 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.23.1...3.23.3
release

3.23.1

3.23.1
25 сент. 2026 г.1,7 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3paper, purpur
Скачать
Что нового
## Release Highlights * 🎮 **Minecraft 26.3 "Wilderness Bound" support** — BentoBox now runs on Paper 26.3, and protects the new content: cushions (place, break and sit) and straw beds are covered by the existing PLACE_BLOCKS, BREAK_BLOCKS, RIDING and BED flags. The poplar wood set, poplar boats and shelves, wool and concrete stairs and slabs, shelf mushrooms, red shrubs and the new explorer maps needed no new flags. * ⚙️🔡 **Customisable settings panels** — `/island settings` and `/admin settings` are now template-driven panels, laid out by `panels/settings_panel.yml` and `panels/admin_settings_panel.yml`, like the other BentoBox menus. Tab layout, pinned flags, the panel title and the order of a flag's lore can all be customised. Defaults are pixel-identical to the old panels. * 🐛 **Deleted islands no longer count against a player** — after an island reset or admin delete, the island stayed in the per-player index until restart, blocking transfers and confusing `/admin delete`. ### Compatibility ✔️ Paper Minecraft 1.21.5 – 26.3 ✔️ 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. Restart the server. The two new panel templates are written to `plugins/BentoBox/panels/` on first run. 5. You should be good to go! > ⚙️ **Panel note:** the settings panels are only customisable once the templates exist in your data folder. If you keep your own edited copies of the other panel templates, the new `settings_panel.yml` and `admin_settings_panel.yml` are additional files; nothing existing is overwritten. A game mode addon may also ship its own copy in its `panels/` folder. > 🔡 **Locale note:** one new key, `panels.settings.title`, sets the title of the settings panel separately from the tab button names. Custom locale files without it fall back to the bundled text; the flag lore layout (`protection.panel.flag-item.description-layout`) is unchanged unless you opt into the new `[ranks]` and `[tooltips]` placeholders. > 🔺 **Paper 26.3 note:** at the time of this release Paper 26.3 is only available as alpha builds. BentoBox compiles against and was tested on build 41. Older 1.21.x and 26.x servers are unaffected. ### Legend - 🔡 locale files may need to be regenerated or updated. - ⚙️ config options have been removed, renamed, or added. - 🔺 special attention needed. --- ## New Features ### 🎮 Minecraft 26.3 Support [[PR #3090](https://github.com/BentoBoxWorld/BentoBox/pull/3090)] Paper 26.3 is recognised as a compatible server version. The release adds protection for the new *cushion* entity, which is neither a block, a hanging nor a vehicle and so was invisible to every existing listener: placing one requires PLACE_BLOCKS, hitting or shooting one requires BREAK_BLOCKS, and sitting on one requires RIDING. The new *straw bed* is deliberately kept out of Minecraft's bed tag (villagers may not claim it), so it is now matched explicitly and protected by the BED flag; without this a visitor could sleep in, and consume, an island's straw beds. Everything else new in 26.3 is already covered by the tag-based checks. There are no new flags, so no locale changes come from this feature. ### ⚙️🔡 Template-Driven Settings Panels [[PR #3087](https://github.com/BentoBoxWorld/BentoBox/pull/3087)] [[PR #3088](https://github.com/BentoBoxWorld/BentoBox/pull/3088)] Closes [#3081](https://github.com/BentoBoxWorld/BentoBox/issues/3081) `/island settings` is now built from `panels/settings_panel.yml` and `/admin settings` from `panels/admin_settings_panel.yml`, the same mechanism as the other customisable panels. Button types are `TAB`, `FLAG` (a paged list, or a single flag pinned to a slot with `data.flag`), `MODE`, `RESET`, `NEXT` and `PREVIOUS`. The panel title is a separate locale entry from the tab button names, so the two can be styled independently, which was the original request in #3081. A flag's lore layout may now place the rank list and the click hints with `[ranks]` and `[tooltips]`, and a template can override a flag's name and lore per panel. The admin panel uses one template for both its forms: the world tabs (`WORLD_SETTING`, `WORLD_DEFAULTS`, `ISLAND_DEFAULTS`) fall back to the island tabs when `/admin settings <player>` is used, and the `admin.set-world-defaults` permission still gates the world-defaults tabs. All existing behaviour is kept: permission checks, hidden flags with op override, sort order, click cooldowns, reset confirmation and the read-only world view off-island. If a template cannot be loaded the previous panel is shown and an error is logged. For addon developers the API is additive only: `TemplatedPanelBuilder.island(Island)`, `TemplatedPanel.regenerate(...)`, `Flag.toPanelItem(..., ItemTemplateRecord)`, `Flag.toPanelItemForRank(...)`, `SettingsTab.getIsland(Panel)` and the `PanelListener` cooldown hooks. `TabbedPanel` and `SettingsTab` are unchanged. --- ## Bug Fixes ### Soft-deleted islands still counted as a player's island [[PR #3086](https://github.com/BentoBoxWorld/BentoBox/pull/3086)] When an island was deleted by a reset or `/admin delete`, only the owner was cleared; the island stayed in the in-memory per-player index until the server restarted. As a result an admin could not transfer an island to the former owner ("player already owns N islands") and `/admin delete` could report that the player had no island. The island is now removed from every player's index as soon as it is deleted, while its location stays reserved for the region purge. ### Templated panel `fallback:` never rendered [[PR #3087](https://github.com/BentoBoxWorld/BentoBox/pull/3087)] A template button's `fallback` record was rendering its own fallback rather than itself, so the option never worked. No shipped template used it before; the settings templates now rely on it. --- ## Other Improvements * Build moved to Gradle 9.8.0 so the paperweight snapshot used for the 26.x dev bundles resolves again; this only affects building BentoBox itself, not running it or compiling addons against it. [[ae12e5206](https://github.com/BentoBoxWorld/BentoBox/commit/ae12e5206)] --- ## What's Changed * Support Minecraft 26.3 and protect cushions and straw beds by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3090 * ⚙️🔡 Make the island settings panel template-driven (#3081) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3087 * ⚙️ Make the admin settings panel template-driven (#3081) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3088 * Fix soft-deleted islands still counting towards a player's islands by @daniel-skopek in https://github.com/BentoBoxWorld/BentoBox/pull/3086 ## New Contributors * @daniel-skopek made their first contribution in https://github.com/BentoBoxWorld/BentoBox/pull/3086 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.23.0...3.23.1
release

3.23.0

3.23.0
19 сент. 2026 г.1 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
This release makes `/[admin] setrank` a reliable console tool for promoting and demoting team members, fixes a metadata bug that could flood the console with `NoSuchElementException` on every player move, and moves the build off a Maven host that had gone offline. ## Release Highlights * 🔡 **`/[admin] setrank` works from the console** — ranks can be given by keyword (`member`, `sub-owner`, `trusted`, `coop`), translated name, or number; the right island is picked when the target owns one island and is a member of another; and an island can be named by its `x,y,z` centre. * 🐛 **Metadata console spam fixed** — player and island metadata maps are now thread-safe. Previously a corrupted map threw `NoSuchElementException` on every `PlayerMoveEvent` (seen via Border's move listener) until the server was restarted. * 🔧 **Build no longer depends on `maven.devs.beer`** — the ItemsAdder API now comes from Maven Central, and the Oraxen and Nexo repositories are scoped so an outage at one vendor host cannot block unrelated artifacts. ### Compatibility ✔️ Paper Minecraft 1.21.x – 1.21.11 (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. Restart the server. 5. You should be good to go! > 🔡 **Locale note:** `commands.admin.setrank` gained three new keys (`cannot-set-owner`, `already-rank`, `admin-changed-rank`), `unknown-rank` now takes `[rank]` and `[ranks]` placeholders, and `parameters` and `description` were reworded. All 24 bundled locales are updated. If you maintain a custom locale file, add the new keys or those messages will show the raw key. > 💡 **`setrank` behaviour change:** with no island argument, the command now acts on the island the target is a *member* of rather than their primary island, so it can no longer accidentally demote an owner. Setting the `owner` rank is refused with a pointer to `setowner`. If the target is on several team islands, the island centres are listed so one can be chosen with `x,y,z`. ### Legend - 🔡 locale files may need to be regenerated or updated. --- ## New Features ### 🔡 Console-Ready `/[admin] setrank` [[PR #3079](https://github.com/BentoBoxWorld/BentoBox/pull/3079)] The syntax is now `/[admin] setrank <player> <rank> [island owner | x,y,z]` and stays backwards compatible. The rank argument previously matched only the translated display name; it now accepts the rank keyword (any addon rank reference without the `ranks.` prefix), the translated name, or the numeric value, case-insensitively, and an unknown rank lists the valid choices. Setting `owner`, `mod` or `admin` ranks through the member map is refused because it left the island inconsistent. Island selection without an argument uses the island the target is a member of but does not own, and an island can be named by its centre coordinates when an owner has several islands. Tab completion was off by one and now completes the correct argument. The affected player is told their rank changed, and a no-op change is reported instead of silently succeeding. --- ## Bug Fixes ### Metadata Maps Are Thread-Safe [[PR #3082](https://github.com/BentoBoxWorld/BentoBox/pull/3082)] `Players.getMetaData()` probed whether its map was immutable by writing to it on every read. The backing map was a plain `HashMap`, so any concurrent touch could corrupt it, after which every read threw `NoSuchElementException`. Addons such as Border read player metadata on every `PlayerMoveEvent`, so a corrupted map spammed the console until restart. Player and island metadata are now copied once into a `ConcurrentHashMap` and never mutated on read. `setMetaData` copies the caller's map, so immutable maps are accepted and the caller's map is never changed. `putMetaData(key, null)` now removes the key. --- ## Other Improvements * ItemsAdder API is resolved from Maven Central as `beer.devs:itemsadder-api` (4.0.17); the `maven.devs.beer` repository is removed. Oraxen and Nexo repositories are scoped with `exclusiveContent` to the groups they host. [[PR #3083](https://github.com/BentoBoxWorld/BentoBox/pull/3083)] --- ## What's Changed * 🔡 Make admin setrank a full console team-rank tool by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3079 * Make player and island metadata maps thread-safe by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3082 * Resolve ItemsAdder from Maven Central and scope Oraxen and Nexo repos by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3083 * Share the metadata map-copy helper between Players and Island by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3085 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.22.4...3.23.0
release

3.22.4

3.22.4
6 сент. 2026 г.2,7 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
This is a bug fix and performance release. It fixes a crash in the region purge, a tab-completion bug introduced by Brigadier registration, and makes player heads resolve through the server instead of the web. `/[admin] info` can now show every island a player has. ## Release Highlights * 🐛 **Purge crash fixed** — `/[admin] purge <days> confirm` no longer fails with `IslandEvent may only be triggered synchronously`. Island events are now fired on the main thread after the async file deletion. * 🐛 **Sub-command labels no longer change** — typing `/ob h` no longer renamed the shared `go` command to `h` for every player in tab completion and help. * 🔡 **`/[admin] info <player>` shows every island** — all of a player's islands in the world are listed, and a new optional `[island name]` argument picks one. The info block now prints the island name. * ⚙️ **Performance improvements** — fewer allocations in bounds checks, map sweeps and blueprint copies, a shared GSON instance, and a new optional cap on per-island history entries. * 🐛 **Player heads use server profiles** — heads are resolved from the server's own profile cache first, so panels such as TopBlock show real heads instead of falling back to Steve after Mojang rate limits. ### Compatibility ✔️ Paper Minecraft 1.21.x – 1.21.11 (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. Restart the server. 5. You should be good to go! > ⚙️ **New config option:** `island.history.max-entries` has been added to `config.yml`. The default is `0`, meaning unlimited, so existing servers keep their current behaviour. Set a positive number to cap how many history entries each island keeps; the oldest entries are dropped first. Note that capping can undercount the historical-members placeholder once old `JOINED` entries are dropped. > 🔡 **Locale note:** `commands.admin.info.parameters` now reads `<player> [island name]` and a new key `commands.admin.info.island-name` was added. All 24 bundled locales are updated. If you maintain a custom locale file, add the new key or the admin info block will show the raw key for the island name line. ### Legend - 🔡 locale files may need to be regenerated or updated. - ⚙️ config options have been removed, renamed, or added. --- ## New Features ### 🔡 Show Every Island in `/[admin] info <player>` [[PR #3074](https://github.com/BentoBoxWorld/BentoBox/pull/3074)] `/[admin] info <player>` used to report only the player's primary island. It now prints the admin info block for every island the player has in the world, owned and team islands alike. A new optional `[island name]` argument shows a single island, using the same forgiving name matching as `/[player] go` (exact, then case- and space-insensitive, then unique prefix), and multi-word names work without quotes. An unknown name lists the valid ones. Tab completion offers the target player's island and home names, and each info block now prints the island name so multiple blocks can be told apart. `IslandGoCommand.resolveName` is now public so addons can reuse it. ### ⚙️ Island History Cap [[PR #3073](https://github.com/BentoBoxWorld/BentoBox/pull/3073)] Long-lived islands accumulate history (log) entries without bound in memory and in the database. The new `island.history.max-entries` setting caps the number of entries kept per island, dropping the oldest first. It defaults to unlimited. --- ## Bug Fixes ### Purge Crashed With "IslandEvent may only be triggered synchronously" [[PR #3077](https://github.com/BentoBoxWorld/BentoBox/pull/3077)] The age-based purge deleted region files on an async task and then fired the `DELETED` and `PURGED` island events from that same thread. Paper rejects synchronous events fired off the main thread, so the first fully reaped island threw, the command reported failure, and the island's database row was left behind after its region files were already gone. The service now performs the disk work asynchronously and hops the event firing and cache/database removal onto the main thread, waiting for it to finish so the result and summary log are accurate. The daily housekeeping deleted sweep was never affected because it defers its database work to shutdown. ### Sub-Commands Renamed to the Alias a Player Typed [[PR #3076](https://github.com/BentoBoxWorld/BentoBox/pull/3076)] Fixes [#3075](https://github.com/BentoBoxWorld/BentoBox/issues/3075) When a player typed an alias such as `/ob h`, the shared sub-command object had its label changed to `h`, so tab completion and help showed `/ob h` for everyone until someone typed a different alias. Brigadier registration in 3.22.0 made this far more visible because suggestions call tab completion on every keystroke. The redundant label mutation is removed; the typed alias is still passed to the command as before, and the `home` / `h` aliases are unchanged. ### Player Heads Fall Back to Steve After Rate Limits [[PR #3070](https://github.com/BentoBoxWorld/BentoBox/pull/3070)] Heads requested by player name were always resolved through mc-heads or the Mojang API, even for players the server already knew, and those lookups get rate limited. Online players now get their head synchronously from their live profile, and everyone else is resolved through Paper's own profile cache first. The mc-heads and Mojang paths remain as fallbacks. No API changes; addons do not need to recompile. --- ## Other Improvements * Performance: bounds checks no longer allocate a `Vector` (7x faster), map sweeps use iterators instead of streams (3x faster, zero allocation), and a shared GSON instance replaces per-call construction. [[PR #3073](https://github.com/BentoBoxWorld/BentoBox/pull/3073)] * Resolved open SonarCloud and deeper-SAST reliability findings across the codebase. --- ## What's Changed * Fire purge IslandEvents on the main thread by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3077 * Stop renaming sub-commands to the alias a player typed by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3076 * 🔡 feat(admin): show every island in /[admin] info <player>, add [island name] arg by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3074 * ⚙️ refactor: performance improvements by @reecepbcups in https://github.com/BentoBoxWorld/BentoBox/pull/3073 * Use server-provided player profiles for heads by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3070 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.22.3...3.22.4
release

3.22.3

3.22.3
22 авг. 2026 г.2,6 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
Thhis is mostly a bug fix and API related update. ## Release Highlights * 🔲 **Dialog grid layout** — `DialogBuilder` can now lay buttons out in a configurable number of columns with per-button widths, enabling grids, maps, and pickers without leaving the API. Used in the latest ChunkBlock. * ⚙️ **bStats metrics opt-out** — new `general.metrics` toggle lets server owners disable BentoBox's anonymous usage statistics independently of the global bStats switch. * 🛡️ **Paper 26.2 & Adventure 5** — BentoBox now compiles and runs against Paper 26.2, bringing Adventure 5 API changes that addon authors should be aware of. * 🐛 **Player head 429 spam fixed** — heads with missing textures no longer trigger repeated Mojang session-server lookups that flood the console with rate-limit errors. * 🐛 **YAML numeric type widening** — config values like `20` written without a decimal point now correctly load into `double`, `float`, and `long` fields instead of throwing `ClassCastException`. ### Compatibility ✔️ Paper Minecraft 1.21.x – 1.21.11 (26.2) ✔️ Java 21+ ### 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. Restart the server. 5. You should be good to go! > ⚙️ **New config option:** `general.metrics` has been added to `config.yml` (default `true`). Set it to `false` and restart to disable BentoBox's bStats telemetry. The global switch in `plugins/bStats/config.yml` still works as before. > 🔺 **Addon authors — Adventure 5 changes:** Paper 26.2 ships Adventure 5, which seals `Component` (Mockito can no longer mock it) and replaces `ClickEvent.value()` with `payload()`. See [PR #3067](https://github.com/BentoBoxWorld/BentoBox/pull/3067) for the full removal list and migration notes. Addons already deployed against a 26.2 server may already be affected at runtime; recompiling against BentoBox 3.22.3 will surface any issues at compile time. ### Legend - ⚙️ config options have been removed, renamed, or added. - 🔺 special attention needed. --- ## New Features ### 🔲 Dialog Grid Layout [[PR #3066](https://github.com/BentoBoxWorld/BentoBox/pull/3066)] `DialogBuilder#columns(int)` lays a multi-action dialog's buttons out in a grid instead of the default two-wide list. `DialogButton` gains a width parameter (1–1024) matching Paper's `ActionButton` sizing, plus `withWidth(int)` for resizing existing buttons. Existing callers are unaffected — omitting columns and width preserves the client's default behaviour. ### ⚙️ bStats Metrics Opt-Out [[PR #3065](https://github.com/BentoBoxWorld/BentoBox/pull/3065)] A new `general.metrics` setting (default `true`) in `config.yml` lets server owners disable BentoBox's bStats telemetry without touching the global bStats config. When set to `false`, no metrics collector is registered and no data is submitted. Changing this setting requires a server restart. --- ## Bug Fixes ### Player Head Texture-Less Profile Spam [[PR #3063](https://github.com/BentoBoxWorld/BentoBox/pull/3063)] Opening a panel with player heads (e.g. a top-ten list) could flood the console with HTTP 429 errors from `sessionserver.mojang.com`. This happened because `HeadGetter` delivered profiles without texture data, causing the server to re-resolve them on every panel open. Now, heads without a usable texture degrade to a plain head instead of triggering repeated lookups, and a failed fetch no longer evicts a cached head that already has a working texture. ### YAML Numeric Type Widening [[PR #3068](https://github.com/BentoBoxWorld/BentoBox/pull/3068)] YAML types a number by how it is written: `20` loads as `Integer` regardless of the declared field type. A `double` config field written without a decimal point reached the setter as an `Integer`, and inside collections, generic erasure hid the mismatch until the first read threw `ClassCastException`. A new `widen()` helper now correctly promotes `Integer` to `Double`, `Float`, or `Long` as needed, while deliberately refusing to silently narrow `Double` to `Integer` or `Long`. ### Literal Color Names in Panels A previous refactor replaced deprecated `ChatColor` constants with `NamedTextColor` in string concatenations, but `NamedTextColor.WHITE.toString()` returns the word `"white"`, not a color code — so the Management panel showed addon names like `"whiteChallenges"`. Fixed by using MiniMessage tags instead. --- ## Other Improvements * 🔺 **Paper 26.2 & Adventure 5** — Compiled against Paper 26.2 (`build.111-stable`) with MockBukkit 4.116.1. See the addon author note above for API removals. [[PR #3067](https://github.com/BentoBoxWorld/BentoBox/pull/3067)] * Removed workarounds for 26.2 symbols that were missing at compile time — `SULFUR_CUBE` is now `static final` again, and tests use the real entity type directly (−87 lines). [[PR #2994](https://github.com/BentoBoxWorld/BentoBox/pull/2994)] * Published JSON Schemas (draft 2020-12) for the `.blueprint` and blueprint-bundle file formats, covering blocks, spawners, entities, display entities, and item frames. * Referenced the new org-wide privacy policy, AI policy, and contributing guidelines from the README. --- ## What's Changed * 🔲 Lay dialog buttons out in a grid: columns and button width by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3066 * ⚙️ Add general.metrics config toggle to opt out of bStats by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3065 * Do not put texture-less profiles on player heads by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3063 * Fix: widen YAML-loaded numbers to the declared numeric field type by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3068 * 🔺 Compile against Paper 26.2 now that MockBukkit supports it by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3067 * Drop the workarounds for 26.2 symbols missing at compile time by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2994 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.22.2...3.22.3
release

3.22.2

3.22.2
10 авг. 2026 г.2,1 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
# BentoBox 3.22.2 A bug-fix patch on top of 3.22.0. Four fixes, all of them for things players hit directly: name lookups resolving to the wrong account, Bedrock players' panel clicks being swallowed, an addon whose dependency is missing leaving broken commands behind, and nether returns dropping players on somebody else's island. No new features, no config keys, no locale changes. If you are on 3.22.0, this is a drop-in replacement. > There is no 3.22.1 release. The version was incremented twice during development; 3.22.2 is the first build published from it. ### 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. 🔺 BentoBox now deletes stale `Names` records — old name→UUID entries that were dropped from memory but never removed from the database. Existing databases heal themselves as players log in; no manual migration is needed, but take the backup in step 1 before you let it run. --- ## Highlights * 🔺 **Player name lookups no longer resolve to a stale account** — `/is team trust <name>` and `/is info <name>` could silently answer for a UUID that had not held that name in months. * **Bedrock players can use panels again** — Geyser expands one tap into several Java click packets, and the click cooldown was eating the one that mattered. * **A disabled addon no longer leaves live, broken commands behind** — an addon dropped for a missing dependency kept its commands registered, and every subcommand threw an NPE. * **Returning from a standard nether puts you on your own island** — not on whichever island sits nearest 0,0. --- ## Bug Fixes ### 🔺 Player names resolve to the right account [[PR #3057](https://github.com/BentoBoxWorld/BentoBox/pull/3057)] — Fixes [#3052](https://github.com/BentoBoxWorld/BentoBox/issues/3052) `/ob team trust Oli713664` reported no such player, and `/ob info Oli713664` answered "that player does not have an island" for a player who has one. Capitalization was the visible symptom but not the cause. `setPlayerName` removed the superseded `Names` record from the in-memory cache and **never deleted it from the database**, so every leftover was reloaded on restart, and `getUUID` took `findFirst()` over an unordered list — a name could resolve to a UUID that had not held it for months. On a case-sensitive file system a leftover `oli713664.json` and the current `Oli713664.json` both matched, and whichever the directory listing yielded first won. That also explains the misleading second symptom: the lookup returned a *stale* UUID rather than `null`. Three changes: - **`nameCache` is keyed on the lower-cased name.** Minecraft names are unique ignoring case, so there is exactly one entry per name and the match no longer depends on how it was spelled when stored. It also moves from an `ArrayList` — mutated by the join listener while commands read it — to a `ConcurrentHashMap`, turning a linear scan of every name ever seen into a single hash lookup. - **Stale records are deleted.** `setPlayerName` removes any record still pointing at this player under another spelling, and `removePlayer` drops the name lookup too. - **`getUUID` consults the online player first**, then the cache, then the server's own user cache for players BentoBox has never recorded. Every step is in-memory, so resolving a name still never blocks the caller — the `getOfflinePlayerIfCached` variant is used deliberately, as it returns `null` on a miss instead of asking Mojang. > 🔺 **Data note:** the stale-record purge runs on login and only when a player's stored name actually differs from their current one — once per rename, not once per join. ### Bedrock players' panel clicks are no longer eaten [[PR #3058](https://github.com/BentoBoxWorld/BentoBox/pull/3058)] — Fixes [#3049](https://github.com/BentoBoxWorld/BentoBox/issues/3049) A Bedrock player opened `/is settings`, tapped any button, and got `general.errors.slow-down` with nothing happening — on the *first* tap, even after waiting, with the default 250 ms `panel.click-cooldown-ms`. Bedrock's inventory model sends a whole transaction per tap, and Geyser expands it into a sequence of Java click packets that arrive in the same tick. Packet 1 opened the cooldown window; packet 2 hit it. This became fatal in 3.22.0 when the check moved to `PanelListenerManager` as an early `return` ahead of the click handler, so whichever packet lost the race was discarded outright — and the packet that landed on the button was not necessarily the one that arrived first. Clicks in the same tick as the window opened are now treated as one physical gesture: the first click that can actually do work is let through, the rest are dropped **silently**, and a no-op click on a filler icon or the player's own inventory no longer consumes the window the real click needs. Clicks in a later tick but still inside the cooldown are unchanged — rejected, with the notice sent at most once per window. Spam protection is intact at one action-bearing click per tick. `onTimeout(User, Panel)` keeps its signature and behaviour; a three-argument overload carries the new flag, and `TabbedPanel.isActionableSlot(int)` is new. Both additive. ### A dropped addon no longer leaves broken commands registered [[PR #3060](https://github.com/BentoBoxWorld/BentoBox/pull/3060)] — Fixes [#3059](https://github.com/BentoBoxWorld/BentoBox/issues/3059) Reported on Discord: `/ch` on a server with ChunkBlock installed but not the Level addon it depends on answered "An unexpected error occurred while running the command" with an NPE, for every subcommand. A game mode addon builds its commands in `onLoad()`, and `CompositeCommand`'s constructor registers them with the Bukkit command map immediately — but the world is only attached later, in `enableAddon`. `sortAddons()` spots the missing dependency after `onLoad()` has run: it unregistered the addon's flags and dropped it from the addon list, but **left the commands registered**. `/ch` stayed live with a null world, and `getWorldSettings(null)` threw on the first lookup. The same hole existed for an addon abandoned as incompatible, or one that threw during load or enable. - **`AddonsManager#withdrawAddon`** now takes back listeners, flags *and* commands, and is called from all three abandonment paths. Previously only flags were unregistered, and only on the missing-dependency path. - **`CommandsManager#unregisterCommands(Addon)`** is the new method backing it. Brigadier keeps its nodes — it has no removal API — but a node whose label no longer resolves is refused by its `requires` predicate, so it disappears from clients too. - **`CompositeCommand#call`** refuses outright when a command belongs to a `GameModeAddon` and has no world, logging which addon is not enabled. BentoBox's own world-less commands such as `/bentobox` are unaffected. - **`IslandWorldManager#getWorldSettings`** builds its "non-game world" message lazily; it used to evaluate `world.getName()` eagerly, so a null world threw inside the very string meant to explain the problem. `CommandsManager#unregisterCommands(Addon)` is new and additive, so binary compatibility is unaffected. ### Returning from a standard nether lands you on your own island [[PR #3061](https://github.com/BentoBoxWorld/BentoBox/pull/3061)] — Fixes [AOneBlock#549](https://github.com/BentoBoxWorld/AOneBlock/issues/549) With a shared nether and `create-and-link-portals: false` — AOneBlock's default — a player who went through a nether portal and came back was always dumped on the island near 0,0, usually somebody else's, where they had no build rights. `/ob home` worked fine, so the island data was never the problem. `handleFromStandardNetherOrEnd` resolved the destination from the island's spawn point only, and `Optional.map` collapses to empty when the mapper returns `null` — so an island with no spawn point was indistinguishable from having no island at all, and execution fell through to the world-spawn fallback. An island only gets a spawn point when its blueprint contains a `{spawn here}` sign; AOneBlock's default blueprint is a single bedrock block, so the fallback fired every single time. BSkyBlock was unaffected because it defaults to island nethers and never reaches this branch. The destination now falls back to the island's home location, which is `@NonNull` and defaults to the protection centre. The end-exit-portal path already did the equivalent via `getSafeRespawnLocation`. --- ## Other Improvements * **Local builds no longer stamp a doubled `-LOCAL` marker into `plugin.yml`** — `/bentobox version` on a local build reported `…-SNAPSHOT-LOCAL-LOCAL`. Development-only; CI and release builds were never affected ([`fa401ee`](https://github.com/BentoBoxWorld/BentoBox/commit/fa401ee8b)). * **Expanded the Building from Source section of the README** ([`5124f00`](https://github.com/BentoBoxWorld/BentoBox/commit/5124f00c7)). * **Corrected the version-numbering notes in `CLAUDE.md`** ([`dcfe89f`](https://github.com/BentoBoxWorld/BentoBox/commit/dcfe89f28)). --- ## Legend | Marker | Meaning | |---|---| | 🔡 | Locale files may need regenerating or updating | | ⚙️ | Config options added, renamed or removed | | 🔺 | Special attention needed | --- ## What's Changed * 🔺 Resolve player names without depending on stored capitalization by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3057 * Stop the panel click cooldown eating Bedrock players' clicks by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3058 * Withdraw an addon's commands when the addon never enables by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3060 * Send players returning from a standard nether to their own island by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3061 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.22.0...3.22.2
release

3.22.0

3.22.0
1 авг. 2026 г.1,6 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
# BentoBox 3.22.0 A commands-and-visibility release. BentoBox now registers its commands with **Paper's Brigadier API**, so players see subcommands and completions *while* they type rather than only after pressing enter or TAB. Alongside it, six new bStats charts finally answer which addon versions are actually deployed and which commands players struggle with, and worlds that generate no structures now protect themselves from the `/locate`-style searches that could freeze a server outright. It also carries two fixes worth upgrading for on their own: data queued by addons **during shutdown is no longer discarded**, which was silent, intermittent data loss on every restart, and BentoBox commands are back in the Bukkit command map, so NPCs, signs and GUI plugins can run them again. ### 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. ⚙️ A new `general.brigadier-commands` option is added on first run, defaulting **on**. If another plugin conflicts with Brigadier registration, set it to `false` to fall back to the legacy command map — BentoBox also falls back automatically if it cannot hook the registrar. 6. 🔺 In worlds whose generator places no structures (classic void skyblock, AOneBlock), structure searches are now suppressed automatically with no configuration. If you have a converted world that contains pre-existing structures, force-enable them per structure in the game mode's own `structures` settings. 7. 🔡 A new Traditional Chinese (`zh-TW`) locale is included. No existing locale keys changed, so custom locale files need no work. --- ## Highlights * 🔺 **Addon data queued during shutdown is no longer discarded** — silent, intermittent data loss on every restart, affecting nine bundled addons. * ⚙️ 🔺 **Brigadier command registration** — subcommands and completions now appear as the player types, with an off-switch if it clashes with another plugin. * **Six new bStats charts** — addon and game mode versions, addon API levels, non-default settings, and how/where commands fail. * 🔺 **Structureless worlds protect themselves** — no more main-thread freezes from cartographer trades, dolphins or treasure maps searching a void world to the border. * **`/island settings` works out in the world** — instead of "You do not have an island!", players see what the world's protection rules let them do where they are standing. * **`Island.setFlag` writes are no longer discarded** — setting a protection rank on an island that had no entry for that flag silently did nothing, which is every freshly created island. * **Repeated warnings stay throttled** — a player alternating between two limit messages no longer bypasses the 4-second notification cooldown. * **BlueMap marker sets stay in their own worlds** — an addon's marker set no longer appears in the sidebar of every other map on the server. * **Multiverse tidy-up** — BentoBox worlds get `auto-load: false` even when Multiverse already knew about them, and dead seed-world registrations are gone. * 🔡 **Traditional Chinese (`zh-TW`) locale** contributed by @qwe664. --- ## New Features ### ⚙️ 🔺 Brigadier command registration [[PR #3036](https://github.com/BentoBoxWorld/BentoBox/pull/3036)] — Closes [#3023](https://github.com/BentoBoxWorld/BentoBox/issues/3023) (phases 1 and 2) The `SimpleCommandMap` reflection in `CommandsManager` is replaced with registration through Paper's Brigadier API, and the `CompositeCommand` subcommand tree is exposed to clients. The practical effect for players is that `/island t…` offers `team` in the chat bar immediately, instead of the client knowing nothing until enter or TAB. Paper only permits Brigadier registration inside its `COMMANDS` lifecycle callback, which fires *before* addons are enabled — so game mode commands such as `/island` and `/acid` do not exist yet at that point. `BrigadierCommandRegistrar` therefore captures the live `CommandDispatcher` inside that window and registers nodes into it afterwards as addons come up. Design consequences worth knowing: - **No stale references.** Nodes never capture a `CompositeCommand`; they resolve it by label on every use, so a `/bentobox reload` that swaps command objects leaves nothing behind. - **Aliases and the `plugin:label` form are redirects**, not duplicated trees — a game mode admin tree runs to dozens of nodes and every one is sent to every client. - **Console still sees player-only commands**, so `/ai` from console reports "This command is only available in-game" rather than Brigadier's generic unknown-command error. - **The literal tree is depth-capped at 4.** Deeper subcommands still work — they fall through to a greedy argument — they are just not pre-advertised. > ⚙️ **Config note:** guarded by the new `general.brigadier-commands` (default `true`). Turning it off restores the legacy command map path, which is kept intact as the fallback. Still to come in phase 3: tooltips on subcommand names, and typed arguments (red-underline validation, quoting-free multi-word island names). ### Addon version, feature adoption and command failure metrics [[PR #3038](https://github.com/BentoBoxWorld/BentoBox/pull/3038)] — Closes [#3022](https://github.com/BentoBoxWorld/BentoBox/issues/3022) Six new bStats charts, all of them already configured on [bstats.org/plugin/bukkit/BentoBox/3555](https://bstats.org/plugin/bukkit/BentoBox/3555): | Chart | What it answers | |---|---| | `addonVersions` / `gameModeVersions` | Which *version* of each addon and game mode is deployed | | `addonApiVersions` | Which BentoBox API levels addons in the wild are built against | | `features` | Which settings servers change away from their defaults | | `commandFailures` | How commands fail, by kind | | `commandFailurePaths` | Which commands fail most | Previously we knew *that* a server ran Level, not *which* Level — leaving no way to see how long the tail is after a release, or to judge when a breaking API change is safe. The settings chart reports only deviations from default, so every bar is a signal: a default-off setting appears under its own name when enabled (`chunk-pregen`), and a default-on setting appears as `no-<name>` when disabled (`no-brigadier-commands`). 24 settings are covered. > **Privacy:** only the failure *kind* and a stable command key (derived from the hard-coded permission, e.g. `bskyblock.island.team.invite`) are submitted — never arguments, player names, or anything typed. bStats data is public. Distinct keys are capped at 200 between submissions and only the busiest 20 sent. Three charts were also removed: the `addons`, `gameModeAddons` and `hooks` advanced pies had no matching chart IDs on bstats.org, so every submission was discarded on arrival — which is why the Hooks pie never showed anything. The `addonsBar`, `gameModeAddonsBar` and `hooksBar` charts carry identical data and do work. ### 🔺 Automatic structure-search suppression in structureless worlds [[PR #3035](https://github.com/BentoBoxWorld/BentoBox/pull/3035)] A production server froze repeatedly and entered a reboot loop: a cartographer villager levelling up rolled an explorer-map trade, which runs `findNearestMapStructure` synchronously on the main thread. In a void world the structure can never be found, so the search evaluates jigsaw placement and full noise columns out to the radius cap and blows past the 60-second watchdog. The level-up never saves, so after the auto-restart the same villager triggers the same search — indefinitely. `StructureListener` now asks the world's `ChunkGenerator` whether it places structures at all. If it does not, every structure search in that world is suppressed with **no configuration needed** — such a search is always the pathological scan-to-the-cap case, never a success. - A per-world `structures` entry of `true` still force-enables a structure, as an escape hatch for converted worlds containing pre-existing structures. - Game modes that *do* generate structures are unaffected: SkyGrid, Boxed (`allow-structures`), CaveBlock (overworld) and AcidIsland (`make-structures`) all report `true`. AOneBlock and BSkyBlock report `false` and get automatic protection. **No addon changes required.** > ⚙️ **Config note:** the `world.disabled-structures` comments now explain how to list valid structure keys in-game (tab-complete `/locate structure `) and give a concrete example for admins still on released versions. ### `/island settings` opens out in the world [[PR #3055](https://github.com/BentoBoxWorld/BentoBox/pull/3055)] · [[PR #3056](https://github.com/BentoBoxWorld/BentoBox/pull/3056)] `/island settings` used to answer "You do not have an island!" whenever the player was not standing on one and owned none — out in the wilderness, or in a game mode where players never own islands at all. That is the moment a player most wants to ask *what rules apply where I am standing?* The panel now opens anyway, with a single read-only **World Protections** tab listing each protection flag as active or disabled for the world. That is the same value an admin edits on their own World Protections tab, and it is what actually governs a player off-island: with no island under them, `FlagListener` resolves a protection flag to the world's on/off switch rather than to any rank. Can I break blocks out here, can I place them — answered without asking an admin. The settings tab is not shown in that case: settings are island-level and there is no island to configure. Nothing is clickable, and a player standing on or owning an island sees exactly the panel they always did. --- ## Bug Fixes ### 🔺 Database writes queued during shutdown were discarded [[PR #3044](https://github.com/BentoBoxWorld/BentoBox/pull/3044)] Queued writes are drained by an async repeating task that stops the moment BentoBox is disabled, after which `store(...)` silently dropped anything still queued. The server disables Pladdons *before* BentoBox, so everything an addon persisted from `onDisable()` was queued into a pipeline about to be abandoned — whether the drain task got a tick in first was a race, which is why this presented as intermittent data loss with nothing in the log. Nine bundled addons save state in `onDisable` and all nine are Pladdons: **Boxed, AOneBlock, Raft, Challenges, Limits, DragonFights, CheckMeOut, ControlPanel, InvSwitcher**. Third-party Pladdons doing the same were affected identically. Reproduced end to end with InvSwitcher: pick up items, restart while still connected, and the shutdown save never landed — then the stale stored inventory was re-applied on join, making it an active rollback rather than just a lost write. Shutdown writes are now drained before the database is closed. ### 🔺 BentoBox commands unusable from NPCs, signs and GUI plugins [[PR #3051](https://github.com/BentoBoxWorld/BentoBox/pull/3051)] — Fixes [#3050](https://github.com/BentoBoxWorld/BentoBox/issues/3050) Registering commands with Brigadier replaced the Bukkit command map registration outright, which took BentoBox commands out of the map every *other* plugin dispatches through. An NPC running `/oneblock go` for a player answered with the server's no-permission message and ran nothing, while typing the same command by hand worked and operators saw nothing wrong. On Paper the command map is a facade over the Brigadier dispatcher, and it synthesises a Bukkit view of whatever node it finds there. A node registered outside Paper's own command API carries no `APICommandMeta`, so that view is a `VanillaCommandWrapper` — which demands `minecraft.command.<label>` and reports the no-permission message before the command ever runs. Anything resolving commands through the map was affected: NPC plugins, command signs, GUI plugins. Commands are now registered with the command map as well, and first, so Brigadier merges the subcommand tree onto Paper's node instead of replacing it. Clients still get the literal tree, and the command map still hands back the real `CompositeCommand`, which checks its own permissions and reports for itself. > This only ever affected 3.22.0 development builds. Anyone running one can drop the `general.brigadier-commands: false` workaround after upgrading. ### Late-registered addon subcommands missing from completions [[PR #3040](https://github.com/BentoBoxWorld/BentoBox/pull/3040)] — Fixes [#3039](https://github.com/BentoBoxWorld/BentoBox/issues/3039) A top-level command's Brigadier children are baked in when its node is built, which happens before addons register their subcommands — so every addon subcommand missed the tree. They still *ran*, and still appeared in `/<gamemode> help`, but the client was never told they exist. `refreshTrees()` now rebuilds every registered top-level command at the end of `enableAddons()` and again after `allLoaded()`, relying on Brigadier merging same-named literals rather than replacing them. The change-detection this relied on compared child counts read back from `dispatcher.getRoot()`, which returns Paper's *wrapped* node while the merge lands on the NMS copy — so the count never changed and the refreshed tree was never pushed to clients. [PR #3051](https://github.com/BentoBoxWorld/BentoBox/pull/3051) resolves that as well: the refresh now compares the tree as it was built, which is the tree that was grafted on, so late subcommands reach clients as intended. ### Permission-hidden subcommands failing with a Brigadier parse error [[PR #3042](https://github.com/BentoBoxWorld/BentoBox/pull/3042)] — Fixes [Border#179](https://github.com/BentoBoxWorld/Border/issues/179) `/oneblock border color green` produced an unhandled `CommandException` and never changed the border colour. Permission checks live in each literal's Brigadier `requires` predicate, and Brigadier *silently skips* a literal the source cannot use — so a player without the permission dead-ended at `color` with a red `INCORRECT_ARGUMENT` instead of "you do not have permission", and the line never reached `CompositeCommand`. Worse, the did-you-mean handler then suggested back the very line that had just failed, and re-dispatching it threw out of a scheduled task. A command line of ours that Brigadier refuses to parse is now dispatched through the command tree, which checks its own permissions and reports for itself. The suggester never offers a line identical to what was typed, and dispatch failures are logged rather than escaping. ### BlueMap marker sets attached to every map on the server [[PR #3041](https://github.com/BentoBoxWorld/BentoBox/pull/3041)] `createMarkerSet()` put every new marker set into *every* map, so an addon registering a warps set for one game mode had it appear in the sidebar of every other game mode's map, and of any non-BentoBox world's map too. A set created but never populated was listed everywhere, permanently empty. Worlds are now learned lazily from the markers added to a set, and only those worlds' maps get it. Island marker sets were never affected. Also fixed: `createMarkerSet()` and `removeMarkerSet()` threw an NPE when called before BlueMap finished loading or during a `/bluemap reload`. `getBlueMapAPI()` is corrected from `@NonNull` to `@Nullable` (annotation-only, binary compatible). ### Multiverse `auto-load` never cleared for known worlds [[commit 45c5402](https://github.com/BentoBoxWorld/BentoBox/commit/45c5402d6)] — Relates to [#3037](https://github.com/BentoBoxWorld/BentoBox/issues/3037) `registerWorld()` set `auto-load: false` inside a `peek()` on the import result, so it only ever ran on a *first-time* import. If Multiverse already had the world in `worlds.yml` the import fails with `WORLD_EXIST_LOADED`, the peek is skipped, and the world keeps auto-loading — which is what every BentoBox world in #3037's `worlds.yml` shows. The world is now looked up after the import and the flag cleared there. BentoBox creates and loads its own worlds in `onEnable`; Multiverse should not be autoloading them. ### Dead seed-world Multiverse registration removed [[commit a89bf9d](https://github.com/BentoBoxWorld/BentoBox/commit/a89bf9d83)] Seed worlds (`<world>/bentobox`) were dropped in 3.16.1, but `IslandWorldManager` still looked one up for every game mode world and registered it with the world management hooks — always returning null. This registration is why stale `acid/bentobox` entries linger in Multiverse's `worlds.yml`: BentoBox deleted the folder on shutdown but never unregistered it. Removing the call stops future versions re-adding such an entry; **existing stale entries still need `/mv remove`**. ### `Island.setFlag` silently discarded writes for unset flags [[PR #3053](https://github.com/BentoBoxWorld/BentoBox/pull/3053)] `setFlag(Flag, int, boolean)` only wrote when the flag was **already** a key in the island's flag map. Islands created through `IslandsManager.createIsland` start with an empty map, so an addon setting a protection rank on a fresh island had the write dropped with no error and no log line, and the flag stayed on its default rank. It was easy to miss because `setSettingsFlag()` writes unconditionally — `SETTING` and `WORLD_SETTING` flags worked fine while `PROTECTION` ranks quietly did not. Absent flags are now written; the island is still only marked changed when the value actually differs. Addons that worked around this by pre-seeding the map can drop the workaround. ### Notification throttle bypassed by alternating messages [[PR #3054](https://github.com/BentoBoxWorld/BentoBox/pull/3054)] — Relates to [Limits#293](https://github.com/BentoBoxWorld/Limits/issues/293) `Notifier` remembered only the **single last** message sent to a user and sent whenever the new one differed. A player hitting two different limits back to back — mixed animal and monster limit messages while mining in AOneBlock — therefore bypassed the 4-second cooldown entirely: each message differed from the one before it, so every one of them spammed through. The cache is now keyed by user *and* message, so each distinct message is throttled independently within the window. ### Zombie flag listeners from addons dropped for missing dependencies [[PR #3048](https://github.com/BentoBoxWorld/BentoBox/pull/3048)] `loadAddon()` runs an addon's `onLoad()` *before* the hard-dependency check, so an addon later dropped by `sortAddons()` had already registered its flags — and `FlagsManager` registers flag listeners immediately, under the BentoBox plugin. Those listeners survived the drop: registered, firing on global events, backed by an addon that never enabled and never created its worlds. Removing Level from a server running ChunkBlock (which hard-depends on it) turned every `PlayerJoinEvent` into an NPE from `Util.sameWorld()`. Dropped addons are now marked `MISSING_DEPENDENCY` and have their flags and listeners unregistered, and `Util.sameWorld()` returns `false` for a null world rather than throwing. --- ## Other Improvements - 🔡 Traditional Chinese (`zh-TW`) locale added, translated from the latest `en-US.yml` with placeholders and MiniMessage tags preserved [[PR #3046](https://github.com/BentoBoxWorld/BentoBox/pull/3046)] — thanks @qwe664. - SonarCloud reliability fixes across `AddonClassLoader`, `User`, `PVPListener`, `PlaceholderGrouper`, `PurgeRegionsService`, the Multiverse hooks and the placeholder dump command, plus the Modrinth publish action pinned to a fixed SHA [[commit c5d66ca](https://github.com/BentoBoxWorld/BentoBox/commit/c5d66ca99)]. - Refactored to `getFirst()` for readability in several classes [[commit 23c2b84](https://github.com/BentoBoxWorld/BentoBox/commit/23c2b84b0)]. - CI: the shared platform-publish workflow pin was bumped to the multipart-JSON fix, so a semicolon anywhere in a release body no longer truncates the CurseForge and Hangar upload metadata [[PR #3047](https://github.com/BentoBoxWorld/BentoBox/pull/3047)]. - Test suite grew to **3430 tests, 0 failures**, with new coverage for Brigadier registration, tree refresh and command map registration, bStats accumulation and capping, command failure classification, structureless-world suppression, BlueMap world scoping, the unparseable-command path, the shutdown write drain, per-message notification throttling and the off-island settings panel. --- ## Legend | Marker | Meaning | |---|---| | 🔡 | Locale files may need regenerating or updating | | ⚙️ | Config options added, renamed or removed | | 🔺 | Special attention needed | --- ## What's Changed * 🔺 Auto-suppress structure searches in structureless worlds by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3035 * ⚙️ 🔺 Register commands with Paper's Brigadier API (#3023 phases 1 and 2) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3036 * Add addon version, feature adoption and command failure metrics by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3038 * Rebuild the Brigadier tree once addons have enabled by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3040 * Scope addon-created BlueMap marker sets to their own worlds by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3041 * Run our own commands that Brigadier will not parse by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3042 * 🔺 fix: do not discard database writes queued during shutdown by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3044 * 🔡 Add Traditional Chinese (zh-TW) localization by @qwe664 in https://github.com/BentoBoxWorld/BentoBox/pull/3046 * Clean up flags of addons dropped for missing dependencies by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3048 * ci: bump publish-platforms pin to the multipart-JSON fix by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3047 * 🔺 Keep BentoBox commands in the Bukkit command map by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3051 * Fix Island.setFlag silently ignoring flags not already in the map by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3053 * Show the settings panel when the player has no island by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3055 * Throttle notifications per distinct message, not just the last one by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3054 * Show the world's protection flags when the player is not on an island by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3056 ## New Contributors * @qwe664 made their first contribution in https://github.com/BentoBoxWorld/BentoBox/pull/3046 **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.21.0...3.22.0
release

3.21.0

3.21.0
23 июл. 2026 г.1,7 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
A player-experience release. BentoBox gains a **Dialogs API** — real modal UI built on Minecraft 26's native dialogs — and uses it for four high-friction flows: command confirmations, the `/island go` destination picker, team invites, and a first-join game-mode chooser. On top of that, `/island go <name>` now forgives typos, wrong case, and partial home names instead of dumping the full list. ### 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. ⚙️ A new `island.dialogs` config section is added on first run — `confirmations`, `go-picker`, and `team-invites` default **on**; `game-mode-selection` defaults **off**. Dialogs require Minecraft 26+; on older servers every flow automatically falls back to the classic chat/command behaviour, so no action is needed there. 6. 🔡 New dialog locale keys (`general.dialogs.*` plus dialog/picker keys under the confirmation, `island go`, and team-invite commands) were added to every bundled language. If you maintain custom locale files, regenerate or add these keys. --- ## Highlights * ⚙️ 🔡 **Dialogs** — sensitive-command confirmations, the `/island go` picker, team invites, and first-join game selection can now appear as modal dialogs the player can't misread or scroll past, with automatic fallback on pre-26 servers. * **Forgiving `/island go` matching** — `myisland`, `hom`, or a stray double-space now teleports you where you meant, instead of failing an exact case-sensitive match. * 🔡 **uk.yml cleanup** — removed duplicated placeholder panel sections from the Ukrainian locale. --- ## New Features ### ⚙️ 🔡 Dialogs API and dialog-driven flows [[PR #3033](https://github.com/BentoBoxWorld/BentoBox/pull/3033)] — Closes [#3021](https://github.com/BentoBoxWorld/BentoBox/issues/3021) A new public **`world.bentobox.bentobox.api.dialogs`** package wraps Paper's modal dialog system (Minecraft 26+) alongside the Panels API: `DialogBuilder` (fluent title/body/buttons, localized via `User`), `DialogButton` (label, tooltip, main-thread `onClick`), `BBDialog` (`show(User)`), and `Dialogs.isSupported()` for graceful degradation. Everything is Adventure `Component`-based end-to-end so click actions survive. Four flows now use it, each behind its own toggle in the new consolidated `island.dialogs` config section, and each falling back to the previous behaviour if the dialog can't be built or shown (older server, error): | Flow | Config key | Default | |---|---|---| | Sensitive-command confirmations show `[Confirm]`/`[Cancel]` instead of "type the command again" | `island.dialogs.confirmations` | **on** | | A bare `/island go` with several islands/homes opens a button-per-destination picker | `island.dialogs.go-picker` | **on** | | Receiving a team invite auto-opens an `[Accept]`/`[Decline]` dialog | `island.dialogs.team-invites` | **on** | | Brand-new players get a non-dismissable "choose your game" dialog when several game modes are installed | `island.dialogs.game-mode-selection` | **off** (intrusive by design) | > ⚙️ **Config note:** the whole `island.dialogs` section is new. On servers older than Minecraft 26 the toggles are ignored and the classic behaviour is used regardless. > 🔡 **Locale note:** the new dialog keys were translated into all 22 bundled locales, preserving each file's style. Addon developers get the same API for their own confirmations and pickers — check `Dialogs.isSupported()` and provide a fallback, exactly as core does. ### Forgiving name matching for `/island go` [[PR #3031](https://github.com/BentoBoxWorld/BentoBox/pull/3031)] — Part of [#3024](https://github.com/BentoBoxWorld/BentoBox/issues/3024) `/island go <name>` used to require an exact, case-sensitive match against island and home names — any miss dumped the whole list. It now resolves the typed name in decreasing order of confidence: exact match, then case/colour/whitespace-insensitive match, then unique case-insensitive prefix (`hom` → `Home`). Anything ambiguous still falls through to the existing list rather than guessing, and the resolved canonical name is used for the teleport so named homes stay accurate. --- ## Other Improvements ### 🔡 Ukrainian locale cleanup Removed duplicated placeholder panel sections from `uk.yml`. --- ## Legend - 🔡 Locale files may need regenerating or updating. - ⚙️ Config options have been added, renamed, or removed. - 🔺 Special attention needed. --- ## What's Changed * ⚙️ 🔡 Add Dialogs API and wire it into confirmations, go picker, team invites & first-join (#3021) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3033 * Forgiving name matching for /island go (#3024) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3031 * 🔡 Remove duplicated placeholder panel sections in uk.yml locale by @tastybento **Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.20.0...3.21.0
release

3.20.0

3.20.0
11 июл. 2026 г.1,8 тыс.Minecraft: 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2paper, purpur
Скачать
Что нового
# 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