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
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" }