A modern Paper plugin that makes commands case-insensitive and adds powerful command aliasing
Say goodbye to "Unknown command" errors when players use CAPS LOCK
Features โข Installation
CommandProxy is a lightweight yet powerful Paper plugin that solves two common server problems:
- Case-Insensitive Commands - Players typing
/WARP,/WaRp, or/warpall work perfectly - Command Aliases - Create shortcuts like
/bedโ/home bedor/suicideโ/kill {player}
Built using Paper's modern Brigadier API with full support for all command registration methods, CommandProxy "just works" with every plugin on your server without any configuration needed.
- โ Universal Support - Works with Bukkit, Spigot, old Paper, and Brigadier commands
- โ Zero Configuration - Install and forget, it intercepts all commands automatically
- โ Tab Completion - Uppercase commands get full tab completion support
- โ Brigadier Integration - Registers uppercase variants directly in Brigadier for native support
- โ Command Aliases - Create powerful custom shortcuts with placeholder support
- โ Performance Optimized - <0.5ms overhead per command
- โ Clean Architecture - Well-structured, documented, and maintainable code
The Problem:
Player: /WARP spawn
Server: โ Unknown command
Player: /HOME
Server: โ Unknown command
The Solution:
Player: /WARP spawn
CommandProxy: Converts to /warp spawn
Server: โ
Teleports player to spawn
Player: /HoME
CommandProxy: Converts to /home
Server: โ
Teleports player home
Create powerful command shortcuts with full placeholder support:
command-aliases:
# Simple: /bed โ /home bed
bed: "home bed"
# With arguments: /h bedroom โ /home bedroom
h: "home {args}"
# With player: /suicide โ /kill Steve
suicide: "kill {player}"
# Combined: /tphere Bob โ /tp Bob Steve
tphere: "tp {args} {player}"Supported Placeholders:
{args}- Arguments passed to the alias command{player}- The player's username who executed the command{world}- The player's current world name{x}{y}{z}- Player's coordinates
CommandProxy doesn't just intercept commandsโit registers uppercase variants directly in Brigadier's command tree:
- Native Tab Completion -
/WARP+ [Tab] shows completions - Client-Side Support - Uppercase commands appear in command suggestions
- Performance - No event processing overhead for registered variants
Works with ALL command types:
| Command Type | Support | Details |
|---|---|---|
| Bukkit plugin.yml | โ Full | Traditional plugin.yml commands |
| Reflection-based | โ Full | Old-style programmatic registration |
| Paper Brigadier | โ Full | Modern Paper command API |
| Vanilla/Bukkit | โ Full | Built-in Minecraft commands |
Tab completion works for all uppercase/mixed-case commands:
Player types: /WARP [Tab]
โ
Shows: spawn, pvp, shop, lobby
Player types: /HoMe [Tab]
โ
Shows: bedroom, basement, house1
- Paper 1.20.6+ (uses Paper Brigadier API)
- Java 21+
โ ๏ธ Note: This is a Paper-only plugin. It will not work on Spigot or CraftBukkit due to Paper-specific APIs.
-
Download the latest
CommandProxy.jarfrom Releases -
Place the JAR file in your server's
plugins/folder -
Restart your server (or use
/reload confirmif needed) -
Done! The plugin works automatically with zero configuration
# Clone the repository
git clone https://github.com/extstudios/CommandProxy.git
cd CommandProxy
# Build with Gradle
./gradlew build
# Output: build/libs/CommandProxy-1.1.jarConfiguration file: plugins/CommandProxy/config.yml
Default (intercept ALL commands):
# Empty list = intercept everything
target-commands: []Intercept specific commands only:
target-commands:
- "warp"
- "home"
- "tpa"
- "spawn"
- "tp"Create custom command shortcuts:
command-aliases:
# Format: alias: "target command"
# Simple aliases
bed: "home bed"
lobby: "warp lobby"
# With arguments
h: "home {args}"
w: "warp {args}"
# With player substitution
suicide: "kill {player}"
here: "tp {player}"
# Combined placeholders
tphere: "tp {args} {player}"
bring: "tp {args} {x} {y} {z}"๐ Home/Warp Shortcuts
command-aliases:
bed: "home bed"
spawn: "warp spawn"
lobby: "warp lobby"
pvp: "warp pvp"
shop: "warp shop"Usage:
/bedโ/home bed/spawnโ/warp spawn/lobbyโ/warp lobby
โก Quick Commands
command-aliases:
h: "home {args}"
w: "warp {args}"
gm: "gamemode {args}"
fly: "fly {player}"Usage:
/h bedroomโ/home bedroom/w pvpโ/warp pvp/gm creativeโ/gamemode creative/flyโ/fly Steve
๐ฏ Teleport Aliases
command-aliases:
suicide: "kill {player}"
tphere: "tp {args} {player}"
goto: "tp {player} {args}"
back: "back {player}"Usage:
/suicideโ/kill Steve(if player is Steve)/tphere Bobโ/tp Bob Steve(brings Bob to you)/goto Aliceโ/tp Steve Alice(go to Alice)
๐ ๏ธ Admin Shortcuts
command-aliases:
bc: "broadcast {args}"
kickall: "kick * {args}"
muteall: "mute * {args}"
tpall: "tp * {player}"Usage:
/bc Server restarting!โ/broadcast Server restarting!/kickall Maintenanceโ/kick * Maintenance/tpallโ/tp * Steve(teleport everyone to you)
| Command | Description | Permission |
|---|---|---|
/cmdproxy |
Shows plugin information | None |
/cmdproxy reload |
Reloads the configuration | commandproxy.reload |
/commandproxy |
Alias for /cmdproxy |
None |
/cmdlower |
Alias for /cmdproxy |
None |
| Permission | Description | Default |
|---|---|---|
commandproxy.reload |
Allows reloading the configuration | op |
# All of these work identically:
/warp spawn โ
/WARP spawn โ
/WaRp spawn โ
/wArP sPaWn โ
# Tab completion works too:
/WARP [Tab] โ Shows: spawn, pvp, shop, lobby
/HOME [Tab] โ Shows: bed, basement, house1
# Config
command-aliases:
bed: "home bed"
h: "home {args}"
suicide: "kill {player}"
tphere: "tp {args} {player}"# Usage
/bed โ Executes: /home bed
/h bedroom โ Executes: /home bedroom
/suicide โ Executes: /kill Steve (if you're Steve)
/tphere Bob โ Executes: /tp Bob Steve (brings Bob to you)
CommandProxy follows clean architecture principles with clear separation of concerns:
CommandProxy/
โโโ CommandProxy.java # Main plugin class (lifecycle only)
โโโ commands/
โ โโโ ProxyCommand.java # /cmdproxy command (Brigadier API)
โโโ listeners/
โ โโโ CommandInterceptListener.java # Command execution interceptor
โ โโโ TabCompleteListener.java # Tab completion interceptor
โ โโโ CommandAliasListener.java # Command alias handler
โโโ util/
โโโ CommandMapUtil.java # CommandMap access utilities
โโโ BrigadierCommandRegistrar.java # Brigadier variant registration
Player types: /WARP spawn
โ
PlayerCommandPreprocessEvent (HIGHEST priority)
โ
CommandInterceptListener detects uppercase
โ
Cancels original event
โ
Executes: player.performCommand("warp spawn")
โ
Target plugin receives lowercase command โ
Player types: /WARP [Tab]
โ
TabCompleteEvent (HIGHEST priority)
โ
TabCompleteListener detects uppercase
โ
Gets command: commandMap.getCommand("warp")
โ
Calls: command.tabComplete(sender, "warp", args)
โ
Returns completions: [spawn, pvp, shop] โ
Server startup
โ
BrigadierCommandRegistrar initializes
โ
Gets all commands from CommandMap (via reflection)
โ
For each command: creates uppercase variant
โ
Registers redirect: /WARP โ /warp in Brigadier tree
โ
Client gets native uppercase command support โ
| Server | Version | Support | Notes |
|---|---|---|---|
| Paper | 1.21+ | โ Full | Recommended |
| Paper | 1.20.6 - 1.20.x | โ Full | Brigadier support |
| Paper | 1.20.5 and below | No Brigadier registration | |
| Spigot | Any | โ No | Missing Paper APIs |
| CraftBukkit | Any | โ No | Missing Paper APIs |
CommandProxy is designed to be 100% compatible with all plugins:
- โ Essentials (EssentialsX)
- โ WorldEdit / WorldGuard
- โ Multiverse-Core
- โ LuckPerms
- โ Vault
- โ Custom plugins (all command types)
Why it works: CommandProxy operates at the event level and uses Bukkit's CommandMap, making it plugin-agnostic.
Commands aren't being intercepted
Possible causes:
-
Plugin not enabled
- Check:
/pluginsto verify CommandProxy is green - Solution: Ensure JAR is in plugins folder and server restarted
- Check:
-
Configuration issue
- Check:
plugins/CommandProxy/config.ymlsyntax - Solution: Verify YAML formatting (no tabs, proper indentation)
- Check:
-
Target commands empty
- Check:
target-commands: []in config - Solution: Empty list = intercept all (this is correct)
- Check:
-
Need to reload
- Check: Did you edit config while server was running?
- Solution: Use
/cmdproxy reloadafter config changes
Tab completion not working
Possible causes:
-
Command has no tab completer
- Check: Does lowercase version have tab completion?
- Test: Type
/warp [Tab](lowercase) - does it work? - Solution: Tab completion depends on target plugin
-
Command not found
- Check: Console for "Command not found" errors
- Solution: Verify command exists with
/help commandname
-
Wrong server version
- Check: Are you on Paper 1.20.6+?
- Solution: Upgrade to Paper 1.20.6 or newer
Brigadier registration errors
Error: Failed to access knownCommands
- Cause: Reflection issue with CommandMap
- Solution: Update to latest CommandProxy version (v1.1+)
- Status: Fixed in v1.1 with fallback method
Error: ConcurrentModificationException
- Cause: Large number of commands (1000+) being processed
- Solution: Update to latest CommandProxy version (v1.1+)
- Status: Fixed in v1.1 with snapshot approach
Aliases not working
Possible causes:
-
Incorrect placeholder syntax
- Wrong:
h: home $args - Correct:
h: "home {args}"
- Wrong:
-
Missing quotes
- Wrong:
bed: home bed - Correct:
bed: "home bed"
- Wrong:
-
Target command doesn't exist
- Check: Does
/home bedwork manually? - Solution: Verify target command exists and has permissions
- Check: Does
-
Need to reload
- Check: Did you edit aliases while server running?
- Solution:
/cmdproxy reload
Performance issues
CommandProxy is highly optimized with <0.5ms overhead per command. If you experience lag:
-
Check other plugins
- CommandProxy doesn't cause lag
- Use
/timingsto identify actual cause
-
Verify version
- Ensure you're running latest CommandProxy
- Old versions may have been less optimized
-
Check command count
- 1000+ commands? Still works, but slower startup
- Runtime performance unaffected
CommandProxy is designed to be lightweight and fast:
Plugin Startup:
โโ CommandMap access: <1ms
โโ Config loading: <1ms
โโ Listener registration: <1ms
โโ Total: <5ms
Per-Command Execution:
โโ Case detection: <0.01ms
โโ CommandMap lookup: <0.01ms (cached)
โโ Event processing: <0.01ms
โโ Total overhead: ~0.5ms
Memory Usage:
โโ Plugin instance: ~100KB
โโ CommandMap reference: 0KB (reference)
โโ Configuration: ~1-5KB
โโ Total: ~105KB
- 1000 commands/hour: +0.5 seconds total overhead
- 10,000 commands/hour: +5 seconds total overhead
- 100,000 commands/hour: +50 seconds total overhead (imperceptible)
Conclusion: CommandProxy's performance impact is negligible for any server.
Contributions are welcome! Here's how you can help:
Found a bug? Open an issue with:
- Paper version
- Java version
- CommandProxy version
- Steps to reproduce
- Error logs (if any)
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Follow the existing code style
- Keep main class minimal (initialization only)
- Separate commands, listeners, and utilities
- Document your changes
- Test thoroughly
- Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
// โ
Good: Separate concerns
public class MyListener implements Listener {
private final CommandProxy plugin;
@EventHandler
public void onEvent(Event event) {
// Logic here
}
}
// โ Bad: Everything in main class
public class CommandProxy extends JavaPlugin {
@EventHandler
public void onEvent(Event event) {
// Don't do this
}
}This project is licensed under the MIT License - see the LICENSE file for details.
Free to use, modify, and distribute for your server. Attribution appreciated but not required.
If you find CommandProxy useful, please consider giving it a star! โญ
Made with โค๏ธ by ExtStudios