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
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
Rank progression now defined in config.yml under ranks.order
Easily modify or extend rank ladders without recompiling
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
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
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
Ban logging system (banlogs.yml)
/seticon command
/swaphand command
Personal vault system with configurable limits
Ensure LuckPerms API 5.x is available (compileOnly net.luckperms:api:5.4 recommended)
Paper 1.21.4 and Java 21 are targeted
Update config.yml to customize the new messages:
messages.op-safeguard.* (usage, warn, override-tip, given-governor, given-governor-offline, unknown-offline, etc.)
Arms toggle messages can be added to config if needed
If you previously relied on multi-group setups, review the new "single-group" behavior for promotions/demotions (only inheritance nodes are replaced)
Armor stand arms setting is per-player and resets on server restart (can be extended to persist if needed)