Tags
Creators
Details
1.2.0
Compatibility
Changes
ClickSorted 1.2.0 adds a treemap sort method, configurable sort direction, an automatic update check, and fixes several sorting correctness bugs including an item-loss edge case.
Highlights
- Treemap sort — a new
TREEMAPsort method groups each item type into its own contiguous near-square block, sized to that type's stack count. The most numerous types claim the largest rectangles; smaller types fill in beside or below them; and when the inventory is nearly full, remaining types degrade to a gap-free linear fill so no slots are wasted. - Sort direction — each player can now choose which corner items are placed from (
TOP_LEFT,TOP_RIGHT,BOTTOM_LEFT,BOTTOM_RIGHT) and whether rows or columns fill first (HORIZONTAL/VERTICAL), via/clicksorted set start-cornerand/clicksorted set fill-axis. Both settings affect treemap placement as well as the linear sorts. - Automatic update check — on startup and after
/clicksorted reload, the plugin queries the Modrinth API and logs a console notice if a newer release exists. Can be disabled withcheck_for_updates: false. - Item-loss fix — enchantments and other
ItemMetafields are now included in the sort-key merge-equality check, so identically typed but differently enchanted items are never merged. - Hover coupled to click method —
single_clicknow forces sort-over-items off (it only ever triggers on an empty slot);control_dropforces it on. Switching click method adjusts the hover preference automatically, and trying to override it manually shows a clear message.
Breaking Changes
- Minimum server version is now Paper/Folia 1.21.5
New Features
Treemap sort method
/clicksorted set sort-method treemap selects the new TREEMAP mode. Unlike NAME (linear alphabetical) and GROUP (linear by creative-tab bucket), TREEMAP assigns each item type a shelf-packed, contiguous near-square rectangle in the inventory grid. Types are ranked largest-first so the biggest stacks dominate the most visible area. The rectangle's shape is chosen to minimise wasted cells while staying close to square; types that can no longer fit cleanly fall back to filling free cells in reading order, so a nearly-full inventory degrades gracefully to a gap-free fill. TREEMAP is always available — no groups.yml required. The start_corner and fill_axis preferences (see below) control which corner the largest block anchors to and whether shelves of blocks grow horizontally or vertically.
Sort direction
Two new per-player preferences control how sorted items are written back into the inventory grid (for linear sorts) and how treemap shelves are oriented:
/clicksorted set start-corner <TOP_LEFT|TOP_RIGHT|BOTTOM_LEFT|BOTTOM_RIGHT>— which corner items are placed from (defaultTOP_LEFT)./clicksorted set fill-axis <HORIZONTAL|VERTICAL>— whether rows (HORIZONTAL) or columns (VERTICAL) fill first (defaultHORIZONTAL).
Server admins set defaults with defaults.start_corner and defaults.fill_axis in config.yml. The new GridGeometry / SlotOrder / TreemapPacker classes implement the layout internally.
Automatic update check
On startup and after /clicksorted reload, UpdateChecker fires an async Modrinth API query. If a newer release version is available, two INFO-level lines are logged to the console with the version number and download links. Failures degrade silently to a debug log. Disable entirely with check_for_updates: false in config.yml.
Preference repair
A "preference repair" procedure runs on player join and resets any per-player PDC value that can no longer be parsed as its expected type (e.g. a stale enum name from an old version). Each reset preference sends the player a chat notice (prefResetInvalid in lang.yml) naming the preference, the bad value, and the new default.
Bug Fixes
- Item loss from same-material stacks with differing meta — Merge equality now includes
ItemMeta, so enchanted and plain tools are never collapsed together. Previously, merging a stack of stackable items with different enchantments could silently discard the extras. [PR #46] - Lifted stack not re-deposited on
DOUBLE_CLICK— a double-click sort left the item on the cursor unreturned to the inventory if the click initiated the sort. The stack is now placed back before writing sorted results. SINGLE_CLICKsort could fire over an occupied slot — the sort-over-items gate now enforces thatsingle_clickonly triggers on an empty slot unconditionally (hover is forced off for this method).- Sort grid origin not row-aligned — now aligns the sort origin to the first full row of the inventory, preventing partial-row layouts at the top of large containers.
- Real chest grids and fill-axis not honoured — the slot-order implementation now correctly reflects actual chest grid dimensions and respects the fill-axis setting end-to-end. [PR #46]
Lognot null-safe beforeonEnable— the logger handle is now checked for null before early log calls during plugin load.
Other Improvements
- Deduplicated enum/boolean PDC accessors in
PlayerSortingPrefsusing a shared accessor pattern;sortable_inventoriesis now backed by anEnumSet. GridGeometryis now the single authoritative source for the mount-slot offset used in player inventory layout.- New
lang.ymlkeys:setStartCornerTo,setFillAxisTo,hoverForcedByClickMethod,hoverGovernedByClickMethod,prefResetInvalid,invalidValue,statusStartCorner,statusFillAxis. - New
lang.ymlkey:prefix— a configurable MiniMessage string prepended to every status, error, and alert message sent to players. Defaults to<gray>[<aqua>ClickSorted<gray>]. Set to""to disable. Lock-GUI item names are not affected. - Unified command-feedback messaging: all player-facing
set …/status/reload messages were reworded for a consistent voice and now default to white text./clicksorted set …subcommands also send a clearinvalidValueerror when an argument can't be parsed, naming the bad value and listing valid options (previously invalid input was silently ignored). [PR #47] - Treemap grouping refined: durable items get their own block per meta variant while non-durable items (including bundles) group by material, with a stable within-block stack order (enchanted books ordered by primary enchantment), and rectangle selection now prefers squareness over minimal waste. [PR #48]
- README and CLAUDE.md updated for sort direction, the update check, hover coupling, preference repair, and the new config/lang keys.
Compatibility
✔️ Paper/Folia 1.21.5 – 26.1.x ✔️ Java 21
Upgrading
- Stop your server.
- Replace the old jar in
plugins/with this release. - Start your server.
Note: The two new per-player preferences (
start_corner,fill_axis) are read fromconfig.ymldefaults if a player has never set them. No manual migration is needed.
What's Changed
- Add Modrinth-based update check by @kccricket in #45
- Add TREEMAP sort method, sort direction (start corner + fill axis), and treemap layout engine by @kccricket in #46
- Unify command feedback messages and add configurable
prefixby @kccricket in #47 - Refine treemap grouping/ordering so bundles and meta variants pack correctly by @kccricket in #48
- Couple hover preference to click method, repair invalid prefs by @kccricket
- Fix item loss from same-material stacks with differing ItemMeta by @kccricket
- Fix re-deposit of lifted stack on DOUBLE_CLICK sort by @kccricket
- Fix SINGLE_CLICK sort over occupied slots by @kccricket
- Fix sort grid alignment and chest grid layout by @kccricket
- Dedupe enum/boolean accessors and EnumSet sortables by @kccricket
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:6zaHnikX"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:8qsfB0IP:6zaHnikX"
}

