Skip to content

Release 3.23.0 - #3084

Merged
tastybento merged 11 commits into
masterfrom
develop
Sep 19, 2026
Merged

tastybento merged 11 commits into
masterfrom
develop

Conversation

@tastybento

Copy link
Copy Markdown
Member

Release 3.23.0

Draft release notes: see the 3.23.0 draft release.

🤖 Generated with Claude Code

tastybento and others added 10 commits September 7, 2026 10:18
Server staff asked to promote and demote team members without logging in.
/admin setrank <player> <rank> [island owner] already existed and ran from
the console, but it was rough enough to be unreliable for that:

- Only the rank's translated display name matched, so the rank had to be
  typed as it appears in the caller's locale. Now the keyword (member,
  sub-owner, trusted, coop, or any addon rank without the ranks. prefix),
  the translated name, or the numeric value all work, and the error lists
  the valid choices.
- Owner, mod and admin ranks were accepted. Setting owner rank in the
  member map without moving the owner field left the island inconsistent.
  These are now refused and the admin is pointed at setowner.
- With no island named, the target's primary island was used even when
  they owned it, so the command could demote an owner into a member. Now
  the island the target is a member of (but does not own) is used, and if
  they are on several team islands the centres are listed so one can be
  chosen.
- The island can now be named by x,y,z centre as well as by owner, which is
  needed when an owner has concurrent islands.
- Tab completion was off by one (players offered for the rank slot, ranks
  for the owner slot) 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.

Locale keys added under commands.admin.setrank in every bundled locale:
cannot-set-owner, already-rank, admin-changed-rank; unknown-rank gained
[rank] and [ranks] placeholders.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146MpZW6KGnu5E4qkcR5NXV
…sole

Make admin setrank a full console team-rank tool
Players.getMetaData() tested whether the backing map was immutable by
writing to it on every read. The map was a plain HashMap, so any
concurrent access from another thread could corrupt it, after which
keySet().iterator().next() threw NoSuchElementException on every read.
Addons like Border read player metadata on every PlayerMoveEvent, so a
corrupted map spams the console until restart.

Players and Island now copy metadata into a ConcurrentHashMap once, on
first access or on setMetaData, and never mutate on read. Immutable
maps from deserialization are handled by the same copy. The Island
copy constructor uses the same helper. putMetaData(key, null) now
removes the key because a concurrent map cannot hold null values.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
maven.devs.beer, repo.oraxen.com and repo.nexomc.com were declared as
unscoped repositories, so Gradle queried them for every artifact in
order. When maven.devs.beer returned HTTP 522, resolution aborted for
Level, Nexo and Oraxen before their real repositories were reached,
failing CI on PR #3082 for artifacts that host does not serve.

Move the three repos into exclusiveContent blocks, matching the
existing pattern for Dynmap, MomiRealms, FancyInnovations, Pyr and
Clojars. Nexo's repo also hosts its team.unnamed transitives, so that
group is included in the Nexo filter.

With the host still down, a --refresh-dependencies resolution now
fails only for dev.lone:api-itemsadder.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ItemsAdder now publishes its API to Maven Central as
beer.devs:itemsadder-api, per the author's dependency snippet page
(https://maven-snippets.lonedev.workers.dev/?pkg=beer.devs%3Aitemsadder-api).
The API package is unchanged (dev.lone.itemsadder.api), so only the
coordinates change. Move to the latest stable release, 4.0.17, and
drop the maven.devs.beer repository, which has been returning HTTP 522
and was the last thing blocking CI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Resolve ItemsAdder from Maven Central and scope Oraxen and Nexo repos
Make player and island metadata maps thread-safe
SonarCloud flagged the toConcurrentMap helper and getMetaData body
added in #3082 as a duplicated block across Players and Island. Move
the helper to a static method on MetaDataAble so there is one copy,
and have both implementations call it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Share the metadata map-copy helper between Players and Island
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit 1c92473 into master Sep 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant