All versions
1.1-alpha
Alpha
Extreme2 months ago 4
Compatibility
Minecraft: Java Edition
26.2
26.1.x
1.21.x
1.20.x
1.19.x
1.18.x
1.17.x
1.16.x
1.15.x
1.14.x
1.13.x
1.12.x
1.11.x
1.10.x
1.9.x
1.8.x
Platforms
Bukkit
Folia
Paper
Purpur
Spigot
Changes
Added
- MySQL & SQLite storage backends, selectable via
storage.typein config - Automatic bidirectional migration between YAML / SQLite / MySQL on storage type switch; YAML is backed up to
data.yml.bak(never deleted) - Developer API:
getPlayerRanks(),setPlayerRanks(),addRank(),removeRank()— fully async viaCompletableFuturewith a dedicated thread pool RankChangeEventso other plugins can listen to rank changes (old/new ranks)allow_to_use_apiconfig option to disable the public API- PlaceholderAPI expansion (optional dependency):
%xrank_ranks%,%xrank_ranks_raw%,%xrank_has_rank%,%xrank_prefix%,%xrank_suffix% - TAB plugin detection — xrank yields TabList rendering to TAB when present and exposes ranks via PAPI instead
display-name-enabledoption —Player#displayNameis set so system messages (/tp, death messages, etc.) show the rank prefix; uses Adventure API on modern Paper and NMS reflection on legacy versions-online/-offlinebatch targets alongside-allforgive,remove, andlist- Team name collision fallback — team names use
xr_+ UUID hash with_1.._99retry, so registration never throws - Nametag color inheritance — the team color is derived from the last effective color code in the rank, so nametag/name text matches the rank color (respects
&r) - Tab name length guard — protocol-length check on both old (16) and new (64) versions; if exceeded, Tab falls back to the plain name and logs a warning
- Periodic cleanup of expired remove-confirmation records (every 60s)
- Debug logging for storage switches, migrations, joins, commands, and server detection
- UUID + name hybrid storage — ranks are keyed by UUID with a redundant name column, so ranks follow a player across name changes
Changed
- Storage keying — switched from name-based to UUID + name hybrid
- Chat handling — switched from
setCancelled(true)+ manual broadcast tosetFormat, coexisting with other chat plugins - Scoreboard — switched from per-player independent scoreboards to the shared main scoreboard with per-player teams (no longer hijacks the player's scoreboard)
- Chat prefix logic — modern versions rely on
%1$s(displayName already contains the prefix); legacy versions assemble the prefix manually - PAPI expansion metadata —
getIdentifier()/getAuthor()/getVersion()now read fromplugin.yml(identifier forced lowercase; author supports multiple co-authors via the full authors list) - Config philosophy — all player-facing messages come from config (
messages.<lang>), withfixConfigmerging missing keys from the bundled config;ranksis intentionally never auto-filled - Branding — version display parses
-alpha/-beta/-rlssuffixes for color;/xrankwith no/unknown args shows version info
Fixed
- Chat double prefix — rank prefix could appear twice on versions where
%1$sexpands to displayName modifyRanksdouble invocation inremove— replaced with a single pass returning aModifyResult(old/new/changed)truncatedropping the rest of the string when an RGB color code didn't fit — now skips the code and keeps subsequent characterssaveData()being a no-op — now actually flushes the storage{tag}placeholder leaking into output — removed unused placeholder from list format(无头衔)colliding with a real rank named that — no-rank state now uses a dedicated message (list-no-ranks)TreeSet<String>type error in name→UUID maps- PAPI
register()resolution — switched toPlaceholderAPI.registerExpansion(withExpansionManagerfallback for older PAPI) - RGB length accounting in truncation — RGB codes counted as 14 protocol chars
- Legacy versions — 1.8.8 verified working (system messages via NMS reflection, chat prefix via legacy branch)
Removed
helpsubcommand and help page — redundant with tab-completionlist-default-tag— default ranks are no longer listed as records (list reflects only stored ranks)- Chat takeover —
setCancelled(true)+ manual broadcast removed in favor ofsetFormat - Per-player independent scoreboards — replaced by the shared scoreboard approach
Optional dependencies
Any compatible version
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:og7SQTbp:d1tCPss0"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:og7SQTbp:d1tCPss0"
}

