
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.
- Загрузки
- 37K
- Подписчики
- 37
- Обновлён
- 10 августа 2026 г.
- Лицензия
- EPL-2.0
Опубликован 13 мая 2023 г.
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
- Place the BentoBox jar in your plugins folder
- Start the server
- Download the game mode and feature addons you want from this site or download.bentobox.world and place them in the
plugins/BentoBox/addonsfolder - Restart the server — you're good to go
NOTE: Older versions supported Spigot, but now we can only support Paper.
Ченджлог
3.22.2Релиз26.1.1, 26.1.2, 26.2 · 10 августа 2026 г.
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
- 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.
- 🔺 BentoBox now deletes stale
Namesrecords — 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
/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:
nameCacheis 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 anArrayList— mutated by the join listener while commands read it — to aConcurrentHashMap, turning a linear scan of every name ever seen into a single hash lookup.- Stale records are deleted.
setPlayerNameremoves any record still pointing at this player under another spelling, andremovePlayerdrops the name lookup too. getUUIDconsults 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
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
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#withdrawAddonnow 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 itsrequirespredicate, so it disappears from clients too.CompositeCommand#callrefuses outright when a command belongs to aGameModeAddonand has no world, logging which addon is not enabled. BentoBox's own world-less commands such as/bentoboxare unaffected.IslandWorldManager#getWorldSettingsbuilds its "non-game world" message lazily; it used to evaluateworld.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] — Fixes AOneBlock#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
-LOCALmarker intoplugin.yml—/bentobox versionon a local build reported…-SNAPSHOT-LOCAL-LOCAL. Development-only; CI and release builds were never affected (fa401ee). - Expanded the Building from Source section of the README (
5124f00). - Corrected the version-numbering notes in
CLAUDE.md(dcfe89f).
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
3.22.0Релиз26.1.1, 26.1.2, 26.2 · 1 августа 2026 г.
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
- 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.
- ⚙️ A new
general.brigadier-commandsoption is added on first run, defaulting on. If another plugin conflicts with Brigadier registration, set it tofalseto fall back to the legacy command map — BentoBox also falls back automatically if it cannot hook the registrar. - 🔺 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
structuressettings. - 🔡 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 settingsworks 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.setFlagwrites 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: falseeven 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] — Closes #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 reloadthat swaps command objects leaves nothing behind. - Aliases and the
plugin:labelform 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
/aifrom 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(defaulttrue). 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
Six new bStats charts, all of them already configured on 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]
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
structuresentry oftruestill 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 reporttrue. AOneBlock and BSkyBlock reportfalseand get automatic protection. No addon changes required.
⚙️ Config note: the
world.disabled-structurescomments 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
/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]
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
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: falseworkaround after upgrading.
Late-registered addon subcommands missing from completions
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 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] — Fixes Border#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]
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] — Relates to #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
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]
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] — Relates to Limits#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]
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 latesten-US.ymlwith placeholders and MiniMessage tags preserved [PR #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]. - Refactored to
getFirst()for readability in several classes [commit 23c2b84]. - 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].
- 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
3.21.0Релиз26.1.1, 26.1.2, 26.2 · 23 июля 2026 г.
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
- 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.
- ⚙️ A new
island.dialogsconfig section is added on first run —confirmations,go-picker, andteam-invitesdefault on;game-mode-selectiondefaults 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. - 🔡 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 gopicker, 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 gomatching —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
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.dialogssection 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
/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
3.20.0Релиз26.1.1, 26.1.2, 26.2 · 11 июля 2026 г.
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 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
3.19.0Релиз26.1.1, 26.1.2, 26.2 · 8 июля 2026 г.
Release Highlights
- 🔡 New
FISHINGprotection flag — Admins and island owners can now stop players fishing into protected areas from outside the island. Defaults to visitor rank, so nothing changes until you raise it. - 🔺 Bed & respawn-anchor spawns are now honored — Dying on an island respawns you at your bed or charged respawn anchor when it's on an island you're a member of. Controlled by the new
BED_ANCHOR_RESPAWNworld setting (enabled by default). - 🐛 End exit portal no longer dumps you at world spawn — Jumping through the end exit portal now routes you to your safe island home on multi-gamemode servers.
- 🐛 Item frames and paintings survive blueprints — Frames keep their facing and contents, and paintings restore their artwork, instead of popping off or facing the wrong way.
- 🔡 Recover islands pending deletion — New
/admin undelete, a stand-on/admin delete, and/admin registercan now rescue soft-deleted islands before their region files are purged. - ⚙️ BlueMap island layer survives reloads — Owner pins and area boxes no longer vanish after
/bluemap reload, plus new config toggles and marker customization. - ⚡ Settings-GUI click spam no longer spikes MSPT — Spam-clicking
/is settingsdropped from ~30–40 MSPT to negligible via in-place panel refresh and a translation cache.
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.
- Restart the server.
- Regenerate/merge any customized locale,
config.yml, and panel templates so the new keys appear (see the notes below). - You should be good to go!
🔺 Respawn behaviour change: Bed and respawn-anchor spawns are now honored on islands the player is a member of. This is on by default (
BED_ANCHOR_RESPAWNworld setting). Economy-sensitive servers that want the old "always respawn at island home" behaviour should disable this setting.
⚙️ Config note: A new
bluemapsection (island-markers,island-areas, and marker customization) is added toconfig.yml, both toggles defaulttrue. Theteam_panel.ymlandteam_invite_panel.ymltemplates gain configurable button icons and name/description keys. Existing configs keep the previous behaviour.
🔡 Locale note: New keys were added for the FISHING flag, the
BED_ANCHOR_RESPAWNsetting,/admin undelete,admin team setowner, and the team-panel member/prospect name & description. All 22 bundled locales were updated in this release.
Legend
- 🔡 locale files may need to be regenerated or updated.
- ⚙️ config options have been removed, renamed, or added.
- 🔺 special attention needed.
New Features
🔡 FISHING protection flag
A new FISHING protection flag lets admins and island owners prevent fishing outside island boundaries — originally needed for Boxed. A FishingListener checks the hook's location, so casting into a protected area from outside is blocked and a blocked cast removes the bobber. Hooking entities is intentionally left to the existing hurting/PVP flags. The flag defaults to visitor rank, so existing servers are unchanged until the required rank is raised.
🔺 Bed and respawn-anchor spawns honored
On death (ISLAND_RESPAWN) and on end-portal return, a vanilla-resolved bed or charged respawn anchor is now honored when it sits on an island the player is at least a member of, in the same game mode. Beds placed while visiting someone else's island, obstructed/broken beds, uncharged anchors, and reset/transferred islands all fall back to the normal island respawn by construction. A new world setting BED_ANCHOR_RESPAWN (default enabled) lets economy-sensitive servers disable the feature entirely. A new public API method IslandsManager#getSafeRespawnLocation(World, UUID) (@since 3.19.0) backs both respawn paths.
🔡 Recover islands pending deletion
[PR #3017]
Islands that are soft-deleted (marked deletable, owner cleared, awaiting the region-file purge) can now be rescued before they're gone:
/admin register <player>on an island pending deletion now shows a confirmation prompt instead of hard-refusing — confirming registers the island to the player and cancels its deletion./admin undelete(new) clears the pending-deletion status of the island you're standing on and leaves it unowned./admin deletewith no player argument (new) soft-deletes the island you're standing on after confirmation, refusing if it still has a team.
Shared restore logic lives in a new IslandsManager.undeleteIsland(Island), symmetric with deleteIsland.
⚙️ BlueMap: survive reloads, config toggles, and marker customization
[PR #3014]
Three improvements to the BlueMap integration:
- Markers now survive
/bluemap reload. BentoBox now registers with BlueMap's own lifecycle (onEnable/onDisable) instead of grabbing the API once at boot, so owner pins and protected-area rectangles are re-populated on every reload and are no longer racy at startup. - New config toggles
bluemap.island-markersandbluemap.island-areas(both defaulttrue) mirror the Dynmap toggles added in 3.17.1, letting admins who run their own markers turn BentoBox's layer off. The marker set is also client-side toggleable in BlueMap's UI. - Marker customization exposes the
POIMarker/ShapeMarkeroptions (icon, max distance, area style) for admins who want to restyle the layer.
⚙️ Configurable team panel button icons
The STATUS, RANK filter, and INVITE buttons in the team management panel previously hardcoded their icons and ignored any icon: set in team_panel.yml. They now honour the template icon, falling back to the previous material when none is set, so admins can (for example) change the rank filter to a HOPPER. Shipped template values match the old icons, so existing installs look identical.
🔡 Customizable member & prospect name/description
[PR #3011] [PR #3013] Fixes #3009
The team-panel member button and invite-prospect button name and description were built entirely in code and referenced locale keys that didn't exist. New keys commands.island.team.gui.buttons.member.{name,description,last-seen} and commands.island.team.invite.gui.buttons.member.{name,description} now drive both the online and offline member names (with a [last_seen] placeholder for offline status) and the rank line, so admins can restyle them. Default values reproduce the previous output exactly.
🔡 Console-friendly admin team setowner
[PR #3003]
admin team setowner gains an optional second argument naming the island's current owner: /[gamemode] admin team setowner <newOwner> [islandOwner]. The named form is location-independent and runs from the console (skipping the confirmation prompt), making it drivable from automation such as Skript — e.g. a "capture the island by killing the owner" game mode. The one-argument in-game form is unchanged, and the concurrent-island cap still applies.
Bug Fixes
End exit portal respawn wrongly used world spawn
Players jumping into the end exit portal were dumped at the server's global spawn on multi-gamemode servers. The listener now triggers on PlayerRespawnEvent's authoritative END_PORTAL reason instead of a stale in-memory tracking map, and routes to the player's safe home using the same resolution as ISLAND_RESPAWN.
Item frames and paintings broken in blueprints
[PR #3006] [PR #3007] Fixes #1752
Item frames survived a blueprint copy but not the round trip: facing direction was never stored, a self-assignment bug meant isFixed was never applied, and paintings lost both their facing and their artwork. Blueprints now store and re-apply the BlockFace facing for any hanging entity, restore the painting Art (skipping unknown keys from newer servers safely), paste paintings at their anchor block with the art pre-applied, and no longer silently drop the rest of a block's entities when one fails to attach. Both new blueprint fields are nullable additions, so existing blueprint files load unchanged.
Performance
⚡ Settings-GUI click spam no longer raises MSPT
Spam-clicking /is settings was costing ~30–40 MSPT. Two rounds of fixes bring it down to negligible:
- In-place tabbed-panel refresh rebuilds the panel contents instead of re-opening the inventory on every click.
- Rejected clicks are now cheap — the cooldown check runs first (only map lookups), the plain-text panel title is cached, and the "slow down" notice is translated at most once per cooldown window.
User#getTranslationcaches the expensive MiniMessage → Component → legacy conversion, keyed purely on the input string (measured ~143× faster warm, ~37× faster on a full panel rebuild). The cache is bounded by size (10,000) and idle time (30 min), needs no reload invalidation, and can't go stale because placeholders are substituted before conversion.
Other Improvements
- Bumped the pinned
publish-platforms.ymlreusable workflow toca2dcd1/fe4b1f0[PR #3002] - Refreshed stale facts in
CLAUDE.md
What's Changed
- 🔡 Add FISHING protection flag by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3004
- 🔺 Fix end exit portal respawn and honor bed/anchor spawns by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3005
- 🐛 Fix #1752: Item frames and paintings in blueprints by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3006
- 🐛 Paste paintings at their anchor block with art pre-applied by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3007
- 🔡 Recover islands pending deletion: register, undelete, and stand-on delete by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3017
- ⚙️ BlueMap: survive reloads + config toggles and marker customization by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3014
- ⚙️ Make team_panel button icons configurable via the template by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3010
- 🔡 Add customisable member/prospect name & description locale keys by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3011
- 🔡 Style offline member name via the member.name locale key by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3013
- 🔡 Make admin team setowner console/automation friendly by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3003
- ⚡ Refresh tabbed panels in place to stop settings-GUI click spam raising MSPT by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3015
- ⚡ Cut settings-GUI click-spam MSPT: translation cache + cheaper rejected clicks by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3016
- ci: bump pinned publish-platforms.yml to ca2dcd1 by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3002
Full Changelog: https://github.com/BentoBoxWorld/BentoBox/compare/3.18.1...3.19.0
3.18.1Релиз26.1.1, 26.1.2, 26.2 · 1 июля 2026 г.
Release Highlights
BentoBox 3.18.1 is a maintenance release. The headline fix restores multi-line colour in GUIs; the rest hardens the build and release pipeline.
- 🐛 Multi-line lore & names keep their colour — text after the first line of a tooltip no longer falls back to the default purple. Fixes GUI tooltips across all addons (reported on Challenges).
Compatibility
✔️ Paper Minecraft 1.21.5 – 26.2 ✔️ Java 25+
Upgrading
- As always, take backups just in case. (Make a copy of everything!)
- Ensure your server is running on a Java 25-capable Paper build for the Minecraft 26.x line.
- Stop the server.
- Replace the BentoBox jar with this one.
- Restart the server.
- You should be good to go!
Bug Fixes
Multi-line lore and text lose colour after the first line
[PR #2999]
Multi-line names and lore lost their formatting after the first line — the second and subsequent lines rendered in the default (purple) colour even when each source line specified one, affecting GUI tooltips across all addons. Util.componentToLegacy emitted a colour/format code only before the first line of a multi-line text node; after lore was split on newlines, every line after the first had no colour code left. The serializer now re-emits the active colour (and any decorations, in the correct order) after each newline, so each tooltip line keeps its colour.
Other Improvements
Build: scope vendor repositories to fix flaky dependency resolution
[PR #3000]
CI intermittently failed to resolve us.dynmap, net.momirealms, de.oliver (FancyNpcs/FancyHolograms) and MultiLib: Gradle queries repositories in declaration order, and a flaky host returning HTTP 520 aborted resolution before the authoritative repo was reached. Each vendor group is now scoped to its authoritative repository with exclusiveContent, the FancyPlugins repo was updated to its new repo.fancyinnovations.com home, and MultiLib now resolves from Clojars — so one host's outage can no longer cascade into unrelated groups.
Release publishing pipeline
Modrinth and CurseForge publishing now reuse the built release asset instead of rebuilding, CurseForge game versions include MC 1.21.5 and 26.2, and Hangar publishing is enabled. Internal CI only — no effect on the plugin itself.
What's Changed
- 🐛 Fix multi-line lore/text losing colour after the first line by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2999
- Build: scope vendor repos to fix flaky dependency resolution by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3000
Full Changelog: https://github.com/BentoBoxWorld/BentoBox/compare/3.18.0...3.18.1
3.16.2Релиз1.21.11, 26.1, 26.1.1 · 19 мая 2026 г.
New in this release
A small follow-up patch with one defensive hardening, one inventory-loss fix, and CraftEngine API compatibility.
- 🔺
Island.setRangeno longer silently corrupts island data. A misbehaving third-party addon was callingsetRangewith a value that disagreed with the game mode's configureddistance-between-islands. On the next restart, BentoBox refused to load the affected islands and panic-disabled withIsland distance mismatch, taking the whole island system offline.setRangenow refuses any value that disagrees with the configured distance (and logs the calling stack frame), unless the game mode opts out viaGameModeAddon.isEnforceEqualRanges() == false— the supported path for claim-resizing game modes like StrangerRealms. - 🐛 Team-accept no longer eats inventories under InvSwitcher. Players who accepted a team invite while standing in a non-BentoBox world (with
island.reset.on-join.inventory: true— Boxed and AOneBlock ship with this) could return to that world to find their items gone. The on-join inventory/XP/health/hunger/money resets now run after the teleport into the island world completes, so InvSwitcher (and similar plugins) save the player's real inventory under the old world before the reset fires. Fixes the case reported against AOneBlock 1.25.0 / Boxed 3.3.0 / InvSwitcher 1.17.1. - 🐛 CraftEngine 26.5+ compatibility.
CraftEngineHook.getItemStack(id)was using the pre-rewriteCustomItem<ItemStack>API and broke on recent CraftEngine releases. The hook now usesBukkitItemDefinition#buildBukkitItem()and works against CraftEngine 26.5.
Compatibility
✔️ Paper Minecraft 1.21.5 – 1.21.12 ✔️ Java 21+
Upgrading
- As always, take backups just in case.
- Stop the server.
- Replace the BentoBox jar with this one.
- Restart the server.
- You should be good to go!
🔺
Island.setRangecontract change.setRangewas previously a plain setter. It now refuses values that would put the stored range out of sync with the game mode's configured distance (which would causeIsland distance mismatchon the next load) and logs a warning naming the caller. Game modes that legitimately resize claims continue to work — they already overrideGameModeAddon.isEnforceEqualRanges()to returnfalse. If you're maintaining an addon and you see warnings likeRefusing Island.setRange(...)in the log, the warning identifies the exact caller — that's the call you need to look at.
Legend
- 🔺 special attention needed.
What's Changed
- 🐛 Compatible with the latest version of CraftEngine by @jhqwqmc in https://github.com/BentoBoxWorld/BentoBox/pull/2978
- 🐛 Defer on-join player resets until after team-accept teleport by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2979
- 🔺 Harden
Island.setRangeagainst distance-mismatch corruption by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2980 - Pin MockBukkit to v4.110.0 (fix flaky SNAPSHOT resolution) by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2981
Full Changelog: https://github.com/BentoBoxWorld/BentoBox/compare/3.16.1...3.16.2
3.16.1Релиз1.21.11, 26.1, 26.1.1 · 17 мая 2026 г.
New in this release
A targeted patch for /bbox admin delete.
- 🔺 Admin delete actually deletes the island now. Not instantly, but when the plugin runs its housekeeping or pure runs. Note that if there are live islands in the same region file, then it will remain in the deleted state until the region is clear. If you really need to delete the blocks, then use WorldEdit or manually remove them. In the next full release we'll add a cut to the Blueprint command to remove blocks.
- 🔺 Seed worlds (
<world>/bentobox) are no longer created. The seed-world infrastructure (createSeedWorlds,removeSeedWorlds, the in-memory copies, the on-disk folders) is gone. Any stale<world>/bentoboxfolders left over from earlier versions are safe to delete manually. These were not doing anything recently except taking up space. - 🔺 API:
GameModeAddon#isUsesNewChunkGeneration()is deprecated for removal. Existing addons that override it keep working (the value is simply ignored) but will see a deprecation warning. Remove the override at your convenience.
Internal cleanup that ships with the fix:
- Removed
DeleteIslandChunks,IslandChunkDeletionManager,CopyWorldRegenerator, thebentobox-deleteIslandMultiLib subscriber, and theIslandDeletionDB recovery loader. WorldRegeneratorslimmed to justregenerateChunk(Chunk);WorldRegeneratorImplis now a small Bukkit-only delegate toWorld#regenerateChunk(int, int)used byCleanSuperFlatListener.IslandDeletionManager#inDeletion(Location)now queries live island state (Island#isDeletable()) instead of a side-channelHashSet, so it can never drift out of sync.
Compatibility
✔️ Paper Minecraft 1.21.5 – 26.1.2 ✔️ Java 21+
Upgrading
- As always, take backups just in case.
- Stop the server.
- Replace the BentoBox jar with this one.
- Restart the server.
- (Optional) Delete any stale
<world>/bentoboxfolders in your world container — they are no longer used. - You should be good to go!
🔺 Reap timing. When
/bbox admin deletefinishes, the player's blocks are still on disk; the island is just marked deletad. The actual region files come out on the next housekeeping sweep (default: 24 h). If you need immediate cleanup, run/bbox admin purge deletedafter the delete. But again, it will only be removed if the region files are clear.
Legend
- 🔺 special attention needed.
What's Changed
- 🔺 fix: route admin delete through soft-delete; drop seed-world plumbing by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2977
- fix: address PR #2977 review on IslandDeletionManager by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2977
Full Changelog: https://github.com/BentoBoxWorld/BentoBox/compare/3.16.0...3.16.1
Комментарии
Загружаем…