Syntactical (Latest Update) New Features LuckPerms Integration
Added /promote and /demote commands
Supports:
Step-by-step rank changes (/promote Player → next rank)
Direct rank changes (/promote Player governor)
Enforces hierarchy: players can only modify ranks below their own
All messages configurable via config.yml
Tab-completion for player names and configured ranks
Armor Stand Arms Toggle
Added /enablearms command to toggle arms on placed armor stands
Per-player setting stored in memory
Requires syntactical.arms.toggle permission
Visual feedback when placing armor stands with arms enabled
Added /armsstatus command to check current arms setting
Configurable Rank Order
Rank progression now defined in config.yml under ranks.order
Easily modify or extend rank ladders without recompiling
OP Safeguard
Intercepts /op from authorized players and assigns the governor rank via LuckPerms instead
Console-issued /op is never intercepted
Sends configurable warnings advising the use of /promote
Stores a pending override so the executor can still force /op with /override
Added /override command (with tab-complete for pending player)
Now supports offline targets: resolves UUID via LuckPerms and assigns governor even if the player is offline
Improvements
Centralized messages: All command/event messages now come from config.yml
Paper Brigadier commands: Registered commands via Paper's lifecycle for better tab-complete and performance
Permission-aware safeguard: The /op safeguard only triggers if the executor actually has permission to use /op (no extra messages for unauthorized users)
LuckPerms rank updates: Only inheritance (group) nodes are changed; other permission nodes are preserved
Rank order handling: Normalizes to lowercase and provides a sensible default fallback aligned with config
Vault UX consistency:
Unified vault title prefix across manager/listener
/pv uses an integer argument with proper bounds based on config and permissions (syntactical.vault.unlimited)
Code cleanup:
Removed duplicate listener registration
Consistent colorization and minor UX tweaks
Fixes
Resolved LuckPerms API incompatibility: replaced NodeMap.mutate()/removeIf with a safe collect-and-remove approach
Unban logging: fixed to use logUnBan instead of logBan
Player name handling: stopped lowercasing player names during /op interception to preserve exact matches
Existing Features Maintained
Ban logging system (banlogs.yml)
/seticon command
/swaphand command
Personal vault system with configurable limits
Notes for Admins
Ensure LuckPerms API 5.x is available (compileOnly net.luckperms:api:5.4 recommended)