Advanced staff tools and punishment management in one easy-to-use plugin.

Staff+ is an enterprise-grade, high-performance moderation and utility plugin built for modern Minecraft networks. It ships as two platform-specific JARs — one for Paper/Purpur/Folia backend servers and one for Velocity proxies — sharing a unified core engine for consistent punishment management across your entire network.
Paper Edition runs on Paper/Purpur/Folia 1.20–1.21+ servers with full Folia multi-threaded region safety, and includes advanced staff tools like vanish, inventory inspection, and spectator monitoring.
Velocity Edition runs on Velocity 3.3.0+ proxies and enforces bans, IP-bans, and mutes at the network gateway before players even reach a backend server.
Both editions share the same database, configs, and migration system — deploy one or both depending on your setup.
| Feature | Paper (Paper/Purpur/Folia) | Velocity (Proxy) |
|---|---|---|
| Ban / TempBan / Unban | ✅ | ✅ |
| IP-Ban / TempIP-Ban / UnIP-Ban | ✅ | ✅ |
| Mute / TempMute / Unmute | ✅ | ✅ |
| Warn / Warns / Clear | ✅ | ✅ |
| History / StaffHistory | ✅ | ✅ |
| Staff Rollback | ✅ | ✅ |
IP-Ban Exemption (/staffallow) |
✅ | ✅ |
Punishment Migration (/staffimport) |
✅ | ✅ |
| Discord Webhook Logging | ✅ | ✅ |
| Warning Escalation Ladder | ✅ | ✅ |
| Hierarchy Protection | ✅ | ✅ |
| Alt-Detection (IP Matching) | ✅ | ✅ |
| SQLite / MySQL Storage | ✅ | ✅ |
| Vanish System | ✅ | ❌ |
| Spectator Monitor/Follow | ✅ | ❌ |
Inventory Inspector (/invsee) |
✅ | ❌ |
| Gamemode Shortcuts | ✅ | ❌ |
Flight Toggle (/fly) |
✅ | ❌ |
| bStats Metrics | ✅ | ✅ |
| Folia Scheduler Safety | ✅ | N/A |
| Proxy-Level Ban Enforcement | ❌ | ✅ |
config.yml and messages.yml use identical formats on both platforms via the Okaeri configuration framework.teleportAsync futures, completely preventing thread crashes./ban, /tempban, /ip-ban, /tempip-ban, /mute, /tempmute, and /warn./warns <player> [list/clear].1d, 12h, 45m) and infinite duration mappings (perm)./history <player>, /staffhistory <staff>, and /staffrollback <staff> commands supported by dynamic database-backed name tab completions.HttpClient interfaces with zero impact on region ticks.staff.hierarchy.weight.<number>) blocking junior staff from overriding, deactivating, or removing punishments placed by senior administrators or the Console (Integer.MAX_VALUE)./staffallow) to connect and bypass active IP-bans without lifting the IP ban itself for other accounts sharing the IP.banned-players.json and banned-ips.json in the server root.plugins/Essentials/userdata/*.yml.litebans.mv.db H2 file or manual JDBC parameters.Punishments tables from SQLite or MySQL.bat_ban and bat_mute.target.getVelocity()) to position the camera slightly ahead of the target, eliminating stutter and rubber-banding..getOpenInventory().getTopInventory().getHolder() on block-based inventories in other regions). Instead, it implements a thread-safe custom session registry that cleanly tracks active inspect views and propagates updates regionally./gmc), survival (/gms), spectator (/gmsp), and adventure (/gma)./fly.| Command | Description | Usage | Permission Node |
|---|---|---|---|
/ban |
Bans a player from the server. | /ban <player> [reason] |
staff.ban |
/tempban |
Temporarily bans a player. | /tempban <player> <duration> [reason] |
staff.tempban |
/unban |
Unbans a player. | /unban <player> |
staff.unban |
/ip-ban |
IP-bans a player. | /ip-ban <player> [reason] |
staff.ipban |
/tempip-ban |
Temporarily IP-bans a player. | /tempip-ban <player> <duration> [reason] |
staff.tempipban |
/unip-ban |
Unbans an IP address or player. | /unip-ban <player/IP> |
staff.unipban |
/mute |
Mutes a player in chat. | /mute <player> [reason] |
staff.mute |
/tempmute |
Temporarily mutes a player. | /tempmute <player> <duration> [reason] |
staff.tempmute |
/unmute |
Unmutes a player. | /unmute <player> |
staff.unmute |
/warn |
Warns a player. | /warn <player> [reason] |
staff.warn |
/warns |
View or clear warning history. | /warns <player> [list/clear] |
staff.warns |
/history |
View complete punishment logs (active/inactive) for players. | /history <player> |
staff.history |
/staffhistory |
View all punishments issued by a staff member. | /staffhistory <staff> |
staff.staffhistory |
/staffrollback |
Rollback all active punishments placed by a staff member. | /staffrollback <staff> [confirm] |
staff.staffrollback |
/staffallow |
Exempt a player/UUID from active IP bans. | /staffallow <player> [remove] |
staff.staffallow |
/staffimport |
Import punishments from other plugins. | /staffimport <source> [params...] |
staff.import |
| Command | Description | Usage | Permission Node |
|---|---|---|---|
/vanish |
Toggle complete invisibility. | /vanish |
staff.vanish |
/invsee |
Inspect a player's inventory live. | /invsee <player> |
staff.invsee |
/monitor |
Spectate and smoothly follow a player. | /monitor <player/leave> |
staff.monitor |
/fly |
Toggle player flight. | /fly [player] |
staff.fly |
/gmc |
Switch to creative mode. | /gmc [player] |
staff.gmc |
/gms |
Switch to survival mode. | /gms [player] |
staff.gms |
/gmsp |
Switch to spectator mode. | /gmsp [player] |
staff.gmsp |
/gma |
Switch to adventure mode. | /gma [player] |
staff.gma |
Admin Wildcard: The permission node
staff.admingrants access to all capabilities of the plugin by default.
Bypass Node: Players with the permissionstaff.vanish.seecan see vanished players in-game, in tab lists, and in commands.
StaffPlus-Paper-1.0.0.jar from Releases.plugins/ folder.plugins/Staff/config.yml and plugins/Staff/messages.yml to your liking.StaffPlus-Velocity-1.0.0.jar from Releases.plugins/ folder.plugins/staffplus/config.yml and plugins/staffplus/messages.yml to your liking.To share punishments across your entire network, configure both editions to use the same MySQL database:
# config.yml (same on both Paper and Velocity)
storage-type: "mysql"
mysql-host: "your-db-host"
mysql-port: 3306
mysql-database: "staffplus"
mysql-username: "your-user"
mysql-password: "your-password"
The plugin uses Okaeri Config to generate, validate, and auto-update clean YAML configuration structures. Both platforms share identical configuration formats.
config.yml# Storage type: SQLITE or MYSQL
storage-type: "sqlite"
# MySQL Connection Details (only used if storage-type is MYSQL)
mysql-host: "localhost"
mysql-port: 3306
mysql-database: "minecraft"
mysql-username: "root"
mysql-password: "password"
mysql-pool-size: 10
mysql-use-ssl: false
# Vanish settings (Paper only — ignored on Velocity)
vanish-silent-container-clicks: true
vanish-ignore-pressure-plates: true
vanish-disable-mob-targeting: true
vanish-disable-item-pickup: true
# Warning escalation ladder settings
warning-ladder-enabled: true
# Actions to run when a player reaches a specific number of active warnings
warning-ladder-actions:
1: "tempmute {player} 1h [Warning Ladder] First warning"
2: "tempmute {player} 12h [Warning Ladder] Second warning"
3: "tempban {player} 3d [Warning Ladder] Reached 3 warnings"
4: "ban {player} [Warning Ladder] Reached 4 warnings"
# Discord Webhook logging settings
discord-webhook-enabled: false
discord-webhook-url: ""
discord-webhook-username: "Staff+ Moderation"
discord-webhook-avatar-url: "https://i.imgur.com/8Qp49X0.png"
# Hex color codes for webhook embeds (without the #)
discord-webhook-color-ban: "FF5555"
discord-webhook-color-mute: "FFAA00"
discord-webhook-color-warn: "FFFF55"
messages.ymlFeatures full Adventure MiniMessage compatibility, enabling gorgeous native text styling, hex colors, and gradients (e.g. <gradient:#FF5F6D:#FFC371>Text</gradient>).
# Prefix for all plugin messages
prefix: "<color:#A0A0A0>[<color:#00E262>Staff+<color:#A0A0A0>] "
no-permission: "<color:#E20000>You do not have permission to execute this command."
player-only: "<color:#E20000>This command can only be executed by a player."
cannot-overwrite-punishment: "<color:#E20000>You cannot override a punishment placed by a higher-ranking staff member ({staff})."
player-allowed: "<color:#00E262>You have allowed {player} to bypass IP bans."
player-allowed-broadcast: "<color:#00E262>{player} has been exempted from IP bans by {sender}."
player-unallowed: "<color:#00E262>You have removed IP ban exemption for {player}."
player-unallowed-broadcast: "<color:#00E262>{player} is no longer exempted from IP bans."
player-not-found: "<color:#E20000>Player '{player}' has not been found or registered."
invalid-duration: "<color:#E20000>Invalid duration format! Use e.g. 1d, 12h, 30m or perm."
# Mutes
player-muted: "<color:#00E262>You have muted {player} for {time}. Reason: {reason}"
player-muted-broadcast: "<color:#E2B700>{player} has been muted by {sender} for {time}. Reason: {reason}"
you-are-muted: "<color:#E20000>You are muted! Remaining time: {time}. Reason: {reason}"
# Bans
player-banned: "<color:#00E262>You have banned {player} for {time}. Reason: {reason}"
player-banned-broadcast: "<color:#E20000>{player} has been banned by {sender} for {time}. Reason: {reason}"
ban-kick-message: "<color:#E20000>You have been banned from the server!\n\nReason: {reason}\nExpiry: {time}"
# Vanish (Paper only)
vanish-enabled: "<color:#00E262>You are now vanished."
vanish-disabled: "<color:#00E262>You are no longer vanished."
vanish-action-bar: "<color:#00E262>★ YOU ARE VANISHED ★"
Staff+ is a multi-module Gradle project producing two independent shaded JARs.
Compile and build both platform JARs:
./gradlew clean build
The compiled plugins will be located at:
staff-paper/build/libs/StaffPlus-Paper-1.0.0.jar # Paper/Purpur/Folia servers
staff-velocity/build/libs/StaffPlus-Velocity-1.0.0.jar # Velocity proxies
StaffPlus/
├── staff-core/ # Shared platform-agnostic library
│ └── src/main/java/ # Database, Punishment model, Configs, Migration, Utils
├── staff-paper/ # Paper/Folia backend plugin
│ └── src/main/java/ # Paper commands, listeners, vanish, monitor, invsee
├── staff-velocity/ # Velocity proxy plugin
│ └── src/main/java/ # Velocity commands, login/chat listeners
├── build.gradle # Root configuration
└── settings.gradle # Multi-module declaration
Note: The Gradle shadow configuration automatically relocates eu.okaeri, com.zaxxer.hikari, org.h2, and org.xerial libraries to private namespaces (me.ayosynk.staff.libs.*) to prevent conflicts with any other plugins on the classpath.
Staff+ implements a fully automated CI/CD pipeline via GitHub Actions to compile, validate, and distribute artifacts for both platforms.
push to the master or main branches.dev-latest tag on every build, maintaining a clean releases page.StaffPlus-Paper and StaffPlus-Velocity JARs are published in every release.v* (e.g., v1.0.0) is pushed to the repository.Both editions of Staff+ integrate with bStats to collect anonymous usage statistics. This helps us understand how the plugin is being used and guides future development.
bstats-bukkit for server-side metrics.bstats-velocity (Plugin ID: 31693) for proxy-side metrics.If you wish to opt-out of anonymous metrics collection, you can disable it by navigating to the plugins/bStats/config.yml file on your server or proxy and setting enabled: false.
For developers looking at the source code of Staff+, here is a summary of the architecture:
ForkJoinPool.commonPool() for async operations — no platform-specific scheduler dependencies.StaffPlatform interface. Contains all Paper-specific commands, listeners, vanish, monitor, invsee, and gamemode shortcuts. Uses Folia-safe regional schedulers.StaffPlatform interface. Contains proxy-level commands and login/chat event listeners for network-wide enforcement.Player#teleport() on Folia. Always use Player#teleportAsync() and queue dependent actions using .thenRun() or .thenAccept().recipient.hidePlayer() or recipient.showPlayer()) must execute on the recipient's regional thread context. Wrap these calls in SchedulerUtils.runEntity(plugin, recipient, ...) to guarantee packet delivery.open.getHolder() on block-based inventories open in other regions throws threading exceptions. Instead, maintain an in-memory, thread-safe registry of InvseeSession objects.