Tags
Creators
Details
1.1.1
Compatibility
Changes
ClickSorted 1.1.1 adds explicit Folia support, hardens shared state for Folia's per-region worker threads, and fixes sorting from inside ClickSorted's own GUIs.
Highlights
- Explicit Folia support — the plugin now declares
folia-supportedand makes all shared mutable state safe for Folia's per-region worker threads. - Lock GUI no longer sortable — sort triggers inside ClickSorted's own GUIs are now ignored unconditionally, so a click in the lock GUI can no longer rearrange its panes or the inventory beneath it.
- Atomic action throttle — the per-player throttle window is now updated atomically, closing a race under concurrent clicks.
Bug Fixes
- ClickSorted's own GUIs are never sorted — the lock GUI is a CHEST-type inventory that matched the sortable set, so a sort-trigger click inside it could rearrange its panes before the GUI listener cancelled the interaction. A
ClickSortedHoldermarker interface now makes the sort listener bail on any ClickSorted GUI, independent ofignore_plugin_inventory. - The action throttle window is now atomic, preventing a race when a player's clicks arrive concurrently.
Other Improvements
- Hardened shared mutable state for Folia:
CooldownMessenger's cooldown map is now aConcurrentHashMap(keyed by player UUID),GroupsConfigmappings are built locally and swapped atomically on reload, andItemsConfig/MainConfigreload swaps are published viavolatile. - Dropped the obsolete
SWAP_OFFHANDoffhand-reset workaround — modern Paper's inventory ack/sequence system reconciles the client prediction, so cancelling the event suffices. This removes the plugin's onlygetScheduler()call; an integration test pins the contract that a SWAP-triggered sort leaves the offhand untouched across a tick. - Replaced
plugin.ymlwithpaper-plugin.yml. - Avoided
InventoryViewmethod calls from plugin bytecode inLockGuiListener(usingInventoryEvent.getInventory()), preventingIncompatibleClassChangeErroracross 1.20.6/1.21. MessageUtilnow takes an AdventureAudienceinstead ofCommandSender, making the Adventure routing explicit and allowing any audience to be passed.- Made item-name lookup a pure read and removed test-only public methods with no production callers.
- Added a GitHub Actions CI workflow that runs the test suite on PRs (Java 25, matching the Paper API requirement).
Compatibility
✔️ Paper/Folia 1.20.6 – 26.1.x ✔️ Java 21
Upgrading
- Stop your server.
- Replace the old jar in
plugins/with this release. - Start your server.
What's Changed
- Support Folia explicitly and harden cross-thread/version safety by @kccricket in #43
- Never sort ClickSorted's own GUIs by @kccricket
- Make the action throttle window atomic by @kccricket
- Convert
plugin.ymltopaper-plugin.ymlby @kccricket - Optimize Adventure usage in
MessageUtilby @kccricket in #41 - Add GitHub Actions CI workflow to run tests on PRs by @kccricket in #42
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:8qsfB0IP:l5AbU45y"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:8qsfB0IP:l5AbU45y"
}

