Lightweight Paper 1.21+ command blocker plugin with vanilla-style error messages, tab-completion hide, and optional LuckPerms integration.
Block, hide, and protect your server commands with a clean vanilla experience.
- Features
- Requirements
- Installation
- Configuration
- Permissions
- Commands
- How It Works
- LuckPerms Integration
- Vanilla Error Message
- FAQ & Troubleshooting
- Changelog
- License
- 🔒 Block Commands — Cancel blocked commands and show a vanilla-style error message (red, underlined, italic) that looks exactly like Minecraft's native "Unknown or incomplete command".
- 👁️ Hide from Tab — Remove blocked commands from the
/suggestion list so players don't even know the command exists. - 🔤 Tab-Complete Filter — Blocked commands won't appear in tab completion when typing.
- 🛡️ LuckPerms Support (Optional) — Group-based bypass via reflection (no hard dependency — plugin works perfectly without LuckPerms).
- 🎬 Title Effects — Show a configurable title + subtitle when a player tries to execute a blocked command.
- 🔊 Sound Effects — Play a configurable sound to alert the player.
- 🔄 In-Game Reload —
/hxbc reloadupdates everything instantly without restarting the server. - ⚡ Tab Refresh on Reload — Automatically calls
player.updateCommands()so the tab suggestion list refreshes immediately after reload. - 🔀 Namespace Support — Blocks namespaced commands like
/bukkit:plugins,/minecraft:plugins, etc.
| Requirement | Version | Notes |
|---|---|---|
| Server | Paper 1.21+ | Also works on Purpur, Pufferfish, Folia (Paper forks) |
| Java | 21+ | Compiled with Java 21 release target |
| LuckPerms | 5.4+ | Optional — only needed for group bypass feature |
⚠️ Not compatible with Spigot or Bukkit — this plugin uses Paper's Adventure API (MiniMessage, Components, Titles) which is not available in Spigot.
- Download the latest
HxBlockerCMD.jarfrom the Releases page. - Drop the
.jarfile into your server'splugins/folder. - Start your server (or restart if already running).
- Edit
plugins/HxBlockerCMD/config.ymlto customize blocked commands and settings. - Run
/hxbc reloadin-game or restart the server to apply changes.
# ============================================
# HxBlockerCMD Configuration
# ============================================
# Enable or disable the entire plugin
enable: true
mode:
# Hide blocked commands from tab suggestion (/ menu)
# When true: players won't see blocked commands when pressing TAB or typing /
# When false: commands still appear in tab but will be blocked when executed
hide: true
# Block execution of blocked commands
# When true: executing a blocked command shows vanilla error + title + sound
# When false: command is not blocked (only hide works if enabled above)
block: true
# ============================================
# Title Settings
# ============================================
# Shown when a player tries to execute a blocked command
# Uses MiniMessage format for colors (https://docs.advntr.dev/minimessage/format.html)
title:
# Main title text (supports MiniMessage & color codes)
# Examples:
# text: '&c&lDamn' → Red bold "Damn"
# text: '<red><bold>STOP!</bold>' → Red bold "STOP!"
# text: '<gradient:red:blue>Blocked</gradient>' → Gradient text
text: '&c&lDamn'
# Subtitle text (optional, leave empty '' for no subtitle)
subtitle: ''
# Title timing (in ticks, 1 tick = 50ms)
# fade-in: How long to fade in (5 ticks = 250ms)
# stay: How long to stay on screen (40 ticks = 2 seconds)
# fade-out: How long to fade out (5 ticks = 250ms)
fade-in: 5
stay: 40
fade-out: 5
# ============================================
# Sound Settings
# ============================================
# Sound played when a player tries a blocked command
# Must be a valid Bukkit Sound enum name (case-insensitive)
# Full list: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html
#
# Popular choices:
# ENTITY_ENDER_DRAGON_GROWL → Deep dragon growl
# BLOCK_NOTE_BLOCK_BASS → Note block bass
# ENTITY_VILLAGER_NO → Villager disagree
# BLOCK_ANVIL_LAND → Anvil landing
# ENTITY_GENERIC_EXPLODE → Explosion
# UI_BUTTON_CLICK → Simple click
#
# Set to '' (empty) to disable sound
sound: ENTITY_ENDER_DRAGON_GROWL
# ============================================
# Bypass Groups (LuckPerms)
# ============================================
# Players in these LuckPerms groups will bypass ALL blocks
# Case-insensitive
# Requires LuckPerms to be installed
# If LuckPerms is not installed, this section is ignored
groups:
- admin
- moderator
# ============================================
# Blocked Commands List (Default)
# ============================================
# These commands are blocked/hidden by default.
# You can add more or remove some as needed.
#
# Format: write with or without leading slash (both work)
# Namespaced variants are auto-blocked:
# If "plugins" is blocked, then /plugins, /bukkit:plugins, /minecraft:plugins are ALL blocked
#
commands:
# Bukkit namespace variants
- /bukkit:?
- /bukkit:about
- /bukkit:help
- /bukkit:pl
- /bukkit:plugins
- /bukkit:ver
- /bukkit:version
# Minecraft namespace variants
- /minecraft:help
- /minecraft:me
- /minecraft:msg
- /minecraft:teammsg
- /minecraft:tell
- /minecraft:tm
- /minecraft:trigger
- /minecraft:w
# Classic Bukkit memes
- /icanhasbukkit
# Base commands (these also catch /bukkit:xxx and /minecraft:xxx automatically)
- /?
- /pl
- /plugins
- /teammsg
- /tm
- /trigger
- /ver
- /versionWhen a player tries a blocked command, a title appears on their screen. You can customize:
| Setting | Default | Description |
|---|---|---|
title.text |
&c&lDamn |
Main title text. Supports MiniMessage tags and & color codes. |
title.subtitle |
'' |
Subtitle text. Leave empty for no subtitle. |
title.fade-in |
5 |
Fade-in duration in ticks (5 = 250ms). |
title.stay |
40 |
How long the title stays in ticks (40 = 2 seconds). |
title.fade-out |
5 |
Fade-out duration in ticks (5 = 250ms). |
Color Code Reference (& format):
&0-&f— Colors (black, dark blue, green, etc.)&l— Bold&n— Underlined&o— Italic&k— Obfuscated&r— Reset
MiniMessage Tags (advanced):
<red>,<green>,<blue>— Named colors<bold>,<italic>,<underlined>— Decorations<gradient:red:blue>Text</gradient>— Gradient text<rainbow>Text</rainbow>— Rainbow text
| Setting | Default | Description |
|---|---|---|
sound |
ENTITY_ENDER_DRAGON_GROWL |
Sound played when command is blocked. |
How to find sounds:
- Visit Bukkit Sound API
- Pick any enum name (e.g.,
ENTITY_VILLAGER_NO) - Write it in config (case-insensitive, so
entity_villager_noalso works)
To disable sound: Set sound: '' (empty string)
Popular Sound Examples:
sound: ENTITY_ENDER_DRAGON_GROWL # Deep scary growl
sound: BLOCK_NOTE_BLOCK_BASS # Musical note
sound: ENTITY_VILLAGER_NO # Villager "No" sound
sound: BLOCK_ANVIL_LAND # Heavy anvil sound
sound: UI_BUTTON_CLICK # Simple click (subtle)
sound: '' # No sound| Mode | Default | What It Does |
|---|---|---|
mode.hide |
true |
Hides blocked commands from the / tab suggestion menu. Players won't see them when pressing TAB or typing /. |
mode.block |
true |
Actually blocks the command execution. Shows vanilla error message + title + sound. |
Combinations:
hide: true+block: true→ Hide + block (recommended)hide: true+block: false→ Hide only (command still works if typed manually)hide: false+block: true→ Block only (command visible in tab but blocked when executed)hide: false+block: false→ Plugin does nothing (why?)
Default blocked commands:
| Command | Why It's Blocked | Also Blocks |
|---|---|---|
/? |
Bukkit help alias | — |
/pl |
Short for plugins | /bukkit:pl |
/plugins |
Lists server plugins | /bukkit:plugins |
/ver |
Short for version | /bukkit:ver |
/version |
Shows server version | /bukkit:version |
/teammsg |
Team message | /minecraft:teammsg, /tm |
/tm |
Short for teammsg | /minecraft:tm |
/trigger |
Scoreboard trigger | /minecraft:trigger |
/icanhasbukkit |
Bukkit easter egg | — |
/bukkit:? |
Bukkit help | /? |
/bukkit:about |
Bukkit about | — |
/bukkit:help |
Bukkit help | /help |
/bukkit:pl |
Bukkit plugins | /pl |
/bukkit:plugins |
Bukkit plugins | /plugins |
/bukkit:ver |
Bukkit version | /ver |
/bukkit:version |
Bukkit version | /version |
/minecraft:help |
Minecraft help | /help |
/minecraft:me |
Minecraft me | /me |
/minecraft:msg |
Minecraft msg | /msg, /tell, /w |
/minecraft:teammsg |
Minecraft teammsg | /teammsg, /tm |
/minecraft:tell |
Minecraft tell | /tell, /msg, /w |
/minecraft:tm |
Minecraft teammsg | /tm, /teammsg |
/minecraft:trigger |
Minecraft trigger | /trigger |
/minecraft:w |
Minecraft whisper | /w, /msg, /tell |
How it works:
- Commands are stored without the leading
/ - Example:
- pluginsin config blocks/plugins - Namespaced commands are auto-detected:
- If
pluginsis blocked →/plugins,/bukkit:plugins,/minecraft:pluginsare ALL blocked - If
triggeris blocked →/trigger,/minecraft:triggerare ALL blocked
- If
Adding custom commands:
commands:
- mysecretcommand # blocks /mysecretcommand
- warp # blocks /warp
- home # blocks /home
- tpa # blocks /tpaRemoving commands: Simply delete the line from the list and /hxbc reload.
💡 Tip: After removing a command from the list, run
/hxbc reloadand the command will instantly reappear in tab suggestions (thanks toupdateCommands()).
If LuckPerms is installed, players in these groups will bypass ALL restrictions:
groups:
- admin
- moderatorHow it checks:
- Primary group (e.g.,
admin) - Inherited groups (e.g., player has
defaultbut inheritsmoderator)
Case-insensitive: Admin, ADMIN, admin are all treated the same.
Without LuckPerms: This section is silently ignored. Plugin still works 100%.
| Permission | Default | Description |
|---|---|---|
hxblockercmd.admin |
op |
Access to /hxbc command (list, reload, author, version). |
hxblockercmd.bypass |
op |
Bypass ALL blocked commands and hide restrictions. Player sees everything and can execute everything. |
Who bypasses automatically?
- OP players (
player.isOp()) - Players with
hxblockercmd.bypasspermission - Players in LuckPerms bypass groups (if LuckPerms installed)
⚠️ Deop alone is not enough if the player still hashxblockercmd.bypasspermission or is in a bypass group. Use/lp user <name> permission unset hxblockercmd.bypassto remove.
| Command | Permission | Description |
|---|---|---|
/hxbc |
hxblockercmd.admin |
Show help menu |
/hxbc list |
hxblockercmd.admin |
Show all blocked commands |
/hxbc author |
hxblockercmd.admin |
Show plugin author |
/hxbc version |
hxblockercmd.admin |
Show plugin version |
/hxbc reload |
hxblockercmd.admin |
Reload config without restart |
Aliases: /hxblockercmd also works.
When mode.hide: true:
- Player joins server →
PlayerCommandSendEventfires - Plugin checks: is player bypassed? (op / permission / group)
- If NOT bypassed → remove blocked commands from the player's command list
- Player never sees blocked commands in
/tab menu
Important: PlayerCommandSendEvent only fires on join and when permissions change. That's why /hxbc reload calls player.updateCommands() to force a refresh.
When mode.block: true:
- Player types
/plugins→PlayerCommandPreprocessEventfires - Plugin checks: is command blocked? (including namespaced variants)
- If blocked AND player not bypassed:
- Cancel the event (command doesn't execute)
- Send vanilla-style error message (red, underlined, italic)
- Show title (if configured)
- Play sound (if configured)
Bypass priority (any one = bypass):
1. player.isOp() → OP status
2. hxblockercmd.bypass permission → Explicit permission
3. LuckPerms group match → Group bypass (optional)
Optional. Plugin uses reflection to interact with LuckPerms, so:
- ✅ No crash if LuckPerms is missing
- ✅ No hard dependency in
plugin.yml - ✅ Clean class loading
Setup:
- Install LuckPerms on your server
- Add bypass groups to
config.yml:groups: - admin - moderator
/hxbc reload
How it works internally:
// Reflection-based group check (no direct LuckPerms imports)
Object userManager = luckPerms.getClass().getMethod("getUserManager").invoke(luckPerms);
Object user = userManager.getClass().getMethod("getUser", UUID.class).invoke(userManager, uuid);
String primaryGroup = (String) user.getClass().getMethod("getPrimaryGroup").invoke(user);This ensures the plugin loads even when LuckPerms classes don't exist in the classpath.
When a blocked command is executed, the player sees:
Unknown or incomplete command, see below for error
plugins<--[HERE]
Formatting:
Unknown or incomplete command, see below for error→ Red colorplugins→ Red + Underlined<--[HERE]→ Red + Italic
This mimics Minecraft's native command parser error format exactly.
A: Check three things:
- Do you still have
hxblockercmd.bypasspermission? → Remove it with LuckPerms or permission plugin. - Are you in a LuckPerms bypass group? → Check
/lp user <you> infoand remove fromadmin/moderatorif listed in config. - Did you rejoin the server after deop?
PlayerCommandSendEventonly refreshes on join or/hxbc reload.
A: Run /hxbc reload. The plugin calls player.updateCommands() automatically on reload to refresh the tab list. If still not showing, rejoin the server.
A: This was a bug in v1. Fixed in v2.0.0. The current version uses reflection and works without LuckPerms. Update to the latest release.
A: No. This plugin requires Paper (or Paper forks) because it uses the Adventure API (MiniMessage, Components, Titles). Spigot does not have Adventure built-in.
A: Yes. The plugin does not use Bukkit schedulers or async tasks. All operations are event-based and run on the main thread, which is Folia-compatible.
A:
- Disable title: set
title.text: ''andtitle.subtitle: '' - Disable sound: set
sound: ''(empty string)
A: Yes. Add the namespaced variant:
commands:
- essentials:home # Only blocks /essentials:home, not /home from other pluginsA: Make sure your server is Paper 1.21+. MiniMessage (the formatting library) requires Paper. On older versions or Spigot, formatting will not work.
- Fixed: Plugin crash when LuckPerms is not installed (reflection-based group check)
- Fixed: Namespaced commands (
/bukkit:plugins,/minecraft:plugins) now properly blocked - Fixed: Vanilla-style error message with underline + italic formatting using MiniMessage
- Fixed: Tab suggestion not updating after
/hxbc reload(addedplayer.updateCommands()) - Added: Auto tab refresh for all online players on reload
- Added: Full MiniMessage support for titles
- Improved: Better namespace handling in
isBlocked()
This project is licensed under the MIT License.
- Lebynut - Development Studio
- handxt - Lead Developer
If you find this plugin useful, consider starring the repository!
Issues & Bugs: GitHub Issues
Latest Release: Releases