Sort any inventory — and pack your bundles — with a mouse click.
ClickSorted 2.3.0 adds an in-game self-test and compatibility-diagnostics tool, lowers the minimum supported server back down to Paper 1.20.6, and extracts the plugin's internal utility code into a shared library.
Highlights
- New
/clicksorted admin selftest— an in-game correctness and version-compatibility self-test, for admins validating an update against their exact Paper build before trusting it on a live server. - Broadened compatibility — minimum supported server lowered back to Paper/Folia 1.20.6 (from the 1.21.6 floor introduced in 2.2.0). The
/clicksorted menudialog automatically disables itself on servers older than 1.21.6 (no Dialog API); every other feature works down to 1.20.6. - Internal plugin-agnostic utility code (config/migration engine, logging, localisation, rate limiting, permission helpers, update checking, Adventure Component helpers) was extracted into a new shared library, KcMcLib, consumed as a git submodule. No behavior change for players or admins.
Breaking Changes
/clicksorted admin benchmarknow also requiresenable_benchmark: trueinconfig.yml(new key, defaultfalse), matching the existingenable_selftest-style gate — previously theclicksorted.admin.commands.benchmarkpermission alone was enough. Admins who use the benchmark command need to add this key.- Internal Java API reshuffle, for third-party plugin developers only. Several non-event internal classes (the migration engine, config lifecycle, logging, the
MessageSource/Localizedmessage facade, rate limiting, permission helpers, the Modrinth update checker, and Adventure Component helpers) moved out ofnet.kccricket.clicksorted.*into the newnet.kccricket.kcmclib.*namespace, andMessageSource/Localized'sgetColoredMessage/getMessagewere renamed torender/raw. The public event API —InventorySortEvent,PlayerPreferenceChangeEvent,Preference, and thePlayerSortingPrefssetters — is unchanged; only code that directly imported the moved internal classes needs updating.
New Features
In-game self-test & compatibility diagnostics
/clicksorted admin selftest (permission clicksorted.admin.commands.selftest, default op; also requires the new enable_selftest config key, default false, since a run stages and restores the tester's real inventory and preferences) runs the plugin's algorithm and integration checks against the server it's actually installed on:
selftest algo— pure algorithm checks, no Paper API surface involved.selftest probe— runs the capability-probe suite alone, a quick compatibility fingerprint of the running server.selftest sim— synthetic events dispatched through the real listeners.selftest start [quick|full]— an interactive LIVE session that walks the tester through real click-method gestures (quick) or the full set of region/lock/blacklist/bundle scenarios (full), restoring their inventory and preferences from a crash-safe backup afterward;selftest next/status/stopcontrol an in-progress session.
Failures are grouped into SANITY/INTEGRATION/ENDTOEND categories so a weak-signal algorithm hiccup can't masquerade as a real version-compatibility break — only ENDTOEND failures (real client gestures) carry full compatibility signal. Intended for admins/testers checking a plugin update, not routine play.
Bug Fixes
- Self-test LIVE session restore could lose the crash-safety backup if any single restore step failed — exactly the kind of version-incompatibility failure this subsystem exists to catch — stranding the tester's real inventory and preferences with no recovery path. Each restore step now runs independently, and the backup is only cleared once every step has actually run.
/clicksorted menucould show stale "hover" wording on its click-method status line when a single Save changed both the click method and the allow-on-hover preference together.- Fixed a permission leak where the
/clicksorted admincommand node was visible in tab-complete to every player, even though none of its subcommands were actually usable without their own permission. /clicksorted bundle blacklist add|remove materialtab-completion now suggests namespaced material IDs (e.g.minecraft:dirt), matching what the command actually accepts, instead of a drifted, un-namespaced local implementation.- A bundle that contained another bundle was treated as completely full, so ClickSorted would never pack anything into it — a nested bundle was charged an entire bundle's capacity instead of vanilla's one-sixteenth plus whatever it holds. Bundle weight now matches vanilla exactly, including beehives/bee nests holding bees (a whole bundle, previously undercounted — the undercount could let a bundle be packed past its real capacity and rejected on reload) and items with a custom stack size.
- TREEMAP sorting crashed on every pre-1.21.2 server — a call to the newer
hasCustomModelDataComponent()API had no fallback for the plugin's own stated 1.20.6 floor. It now falls back to the olderhasCustomModelData()check on servers where the newer API doesn't exist.
Other Improvements
- Trigger instructions (chat messages and self-test prompts) now reflect the player's actual allow-on-hover setting instead of always describing the plain, non-hover gesture.
config.ymlnow warns on reload/load about any key it doesn't recognize (a leftover from an old config version, or a typo) instead of silently ignoring it.- New maintainer-only
./gradlew generateItemNamestool regenerates the item display-name/sort-key table from the current Paper API; not bundled into the plugin jar.
Compatibility
✔️ Paper/Folia 1.20.6 – 26.2.x ✔️ Java 21+
Upgrading
- Stop your server.
- Replace the old jar in
plugins/with this release. - If you use
/clicksorted admin benchmark, addenable_benchmark: truetoconfig.yml. - Start your server.