## Release Highlights
* 🔡 **New `FISHING` protection 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_RESPAWN` world 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 register` can 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 settings` dropped 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
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. Regenerate/merge any customized locale, `config.yml`, and panel templates so the new keys appear (see the notes below).
6. 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_RESPAWN` world setting). Economy-sensitive servers that want the old "always respawn at island home" behaviour should disable this setting.
> ⚙️ **Config note:** A new `bluemap` section (`island-markers`, `island-areas`, and marker customization) is added to `config.yml`, both toggles default `true`. The `team_panel.yml` and `team_invite_panel.yml` templates 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_RESPAWN` setting, `/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
[[PR #3004](https://github.com/BentoBoxWorld/BentoBox/pull/3004)] Fixes [#1687](https://github.com/BentoBoxWorld/BentoBox/issues/1687)
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
[[PR #3005](https://github.com/BentoBoxWorld/BentoBox/pull/3005)] Fixes [#1632](https://github.com/BentoBoxWorld/BentoBox/issues/1632)
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](https://github.com/BentoBoxWorld/BentoBox/pull/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 delete`** with **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](https://github.com/BentoBoxWorld/BentoBox/pull/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-markers` and `bluemap.island-areas` (both default `true`) 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` / `ShapeMarker` options (icon, max distance, area style) for admins who want to restyle the layer.
### ⚙️ Configurable team panel button icons
[[PR #3010](https://github.com/BentoBoxWorld/BentoBox/pull/3010)] Fixes [#3008](https://github.com/BentoBoxWorld/BentoBox/issues/3008)
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](https://github.com/BentoBoxWorld/BentoBox/pull/3011)] [[PR #3013](https://github.com/BentoBoxWorld/BentoBox/pull/3013)] Fixes [#3009](https://github.com/BentoBoxWorld/BentoBox/issues/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](https://github.com/BentoBoxWorld/BentoBox/pull/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
[[PR #3005](https://github.com/BentoBoxWorld/BentoBox/pull/3005)] Fixes [#1632](https://github.com/BentoBoxWorld/BentoBox/issues/1632)
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](https://github.com/BentoBoxWorld/BentoBox/pull/3006)] [[PR #3007](https://github.com/BentoBoxWorld/BentoBox/pull/3007)] Fixes [#1752](https://github.com/BentoBoxWorld/BentoBox/issues/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
[[PR #3015](https://github.com/BentoBoxWorld/BentoBox/pull/3015)] [[PR #3016](https://github.com/BentoBoxWorld/BentoBox/pull/3016)]
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#getTranslation` caches** 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.yml` reusable workflow to `ca2dcd1` / `fe4b1f0` [[PR #3002](https://github.com/BentoBoxWorld/BentoBox/pull/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
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }