ClickSorted 2.0.0
ClickSorted 2.0.0 introduces a per-player bundle blacklist, server-wide admin item and slot locks, a dedicated enabled toggle, and a reorganised command tree.
Highlights
- Per-player bundle blacklist — exclude specific item types or display names from bundle packing via a GUI or commands; blacklisted bundle colors are also skipped as packing bins.
- Admin item blacklist — server admins can declare materials and display names that ClickSorted will never sort, move, or pack, via
config.ymland per-player permission nodes. - Admin slot locks — server admins can lock specific player inventory slots server-wide via
config.yml(locked_slots.player) orclicksorted.lock.player.slot.<n>permission nodes. Admin-locked slots appear as non-toggleable iron-bars panes in the lock GUI. - Dedicated
enabledpreference — click-sorting can now be toggled on/off independently of the click method (/clicksorted sort enabled).ClickMethod.NONEis removed. - Command tree reorganised by domain — per-player preferences grouped under
sort,click,bundle, andlock-slots; admin diagnostics underadmin.
Breaking Changes
- Command tree restructured. The
setsubcommand group is removed. Old paths → new paths:/clicksorted set sort-method→/clicksorted sort method/clicksorted set click-method→/clicksorted click method/clicksorted set hover→/clicksorted click allow-on-hover/clicksorted set lock→/clicksorted lock-slots/clicksorted set bundle inventory|others→/clicksorted bundle enabled in-inventory|in-containers/clicksorted set bundle stacklimit→/clicksorted bundle stack-limit/clicksorted set start-corner→/clicksorted sort start-corner/clicksorted set fill-axis→/clicksorted sort fill-axis/clicksorted set enabled→/clicksorted sort enabled- Admin commands moved under
admin:reload→admin reload,getcfg→admin config,debug→admin debug,benchmark→admin benchmark.
Update macros, command blocks, and aliases.
ClickMethod.NONEremoved. Players who hadNONEstored are automatically migrated: their click method is set toSWAPandenabledis set tofalse. Use/clicksorted sort enabled no(or the bare/clicksortedtoggle) to disable click-sorting going forward.- Config keys renamed (auto-migrated on first startup):
defaults.bundle_inventory→defaults.bundle_in_inventorydefaults.bundle_others→defaults.bundle_in_containers
- Permission nodes restructured. Key renames:
clicksorted.commands.reload→clicksorted.admin.commands.reloadclicksorted.commands.getcfg→clicksorted.admin.commands.configclicksorted.commands.debug→clicksorted.admin.commands.debugclicksorted.commands.benchmark→clicksorted.admin.commands.benchmark
New sort-time bundle gates added:clicksorted.bundle,clicksorted.bundle.inventory,clicksorted.bundle.container.
Update any permission-plugin configurations that reference the old nodes.
New Features
Per-player bundle blacklist
/clicksorted bundle blacklist opens a 54-slot GUI: click an item in your real inventory to add it to the blacklist by material (for vanilla items) or by display name (for custom-named items); click a listed entry to remove it; pagination arrows navigate large lists. Text-command alternatives:
bundle blacklist add material|remove material <material>,bundle blacklist list,bundle blacklist clear— material entries.bundle blacklist add item-name|remove item-name <text>— display-name entries.listandclearabove cover both materials and names together.
Material entries block any item of that type; name entries match case-insensitively against the item's resolved display name (custom name → item_name data component → vanilla / items.yml name). Blacklisted items are never packed into or unpacked from bundles; blacklisted bundle colors are also skipped as packing bins.
Admin item blacklist
Admins can prevent ClickSorted from ever touching specific items — never sorted, moved, or packed/unpacked regardless of player preferences. Two enforcement channels (unioned):
blacklist.materials: []/blacklist.names: []inconfig.yml— server-wide; reloads with/clicksorted admin reload.clicksorted.blacklist.material.<material>/clicksorted.blacklist.name.<slug>permission nodes — per-player or group-based via a permissions plugin.
Name slug rule: strip legacy color codes → lowercase → collapse non-[a-z0-9] runs to _ → strip edge underscores. E.g. "Creative Menu" → creative_menu.
Admin slot locks
Admins can lock specific player inventory slots (0–35) server-wide so they are always excluded from sorting and cannot be toggled by the player in the lock GUI. Two enforcement channels (unioned):
locked_slots.player: []inconfig.yml— server-wide; reloads with/clicksorted admin reload.clicksorted.lock.player.slot.<n>permission nodes — per-player or group-based.
Admin-locked slots render as non-toggleable iron-bars panes in the lock GUI.
Dedicated enabled preference
Click-sorting can now be enabled or disabled independently of which click method is configured. Toggle with the bare /clicksorted, with /clicksorted sort enabled, or with /clicksorted sort enabled yes|no. The enabled state appears in /clicksorted status. Server default: defaults.enabled: true in config.yml.
item_name data component resolution
Name-based matching (admin name blacklist, bundle name blacklist) now resolves the item_name data component — the base name set by data packs or plugins before any custom rename — in addition to custom display names. Lookup priority: custom name → item_name → vanilla / items.yml name.
Graceful reload failure
Config reload failures are now caught and reported to the admin via the configReloadFailed lang key (lang.yml), with the previous configuration remaining active. The server console receives the full stack trace.
Bug Fixes
- Bundle-displaced items dropped instead of placed — items displaced from bundles during a sort now fill free slots in the region rather than being dropped on the ground.
- NPE when bundle contains items with no loose counterpart —
BundlePackernow handles the case where a bundle's contents have no corresponding loose stack instead of throwing aNullPointerException.
Other Improvements
MaterialNameSetextracted as a shared record for material + display-name matching, used by bothBundleBlacklistandProtectedItems.- Shared GUI helpers consolidated into
ClickSortedHolderbase class (BlacklistGuiHolder,LockGuiHolder). - Integration test coverage expanded: crafting exclusion, item conservation, fuzz testing, held-cursor state, and more.
Compatibility
✔️ Paper/Folia 1.21.5 – 26.1.x
✔️ Java 21+
Upgrading
- Stop your server.
- Replace the old jar in
plugins/with this release. - Recommended: delete
lang.ymlto regenerate language strings. - Start your server — config keys and stored preferences migrate automatically on first load.
Migration notes:
defaults.bundle_inventoryanddefaults.bundle_othersinconfig.ymlare rewritten todefaults.bundle_in_inventory/defaults.bundle_in_containersautomatically.- Players who had
ClickMethod.NONEstored will have their preference migrated toSWAP+enabled: falseautomatically.- Permission-plugin configurations referencing
clicksorted.commands.reload|getcfg|debug|benchmarkshould be updated toclicksorted.admin.commands.reload|config|debug|benchmark.
What's Changed
- Add per-player bundle blacklist (GUI + commands) by @kccricket
- Add admin item blacklist via config and permission nodes by @kccricket
- Add admin slot locks via config and permission nodes by @kccricket
- Replace ClickMethod.NONE with dedicated enabled preference by @kccricket
- Resolve item_name data component in name-based operations by @kccricket
- Enforce master kill-switch on all player-facing commands by @kccricket
- Add MigrationException for graceful config reload failure by @kccricket
- Fix: place bundle-displaced items into free slots instead of dropping by @kccricket
- Fix: guard against NPE when bundle contains items with no loose counterpart by @kccricket
- Reorganize command tree by domain by @kccricket
- Integration test sweep by @kccricket in #55
- Simplify pass: extract MaterialNameSet and PdcStringSet by @kccricket in #56