Staff plugin for Paper 1.21+, plus an optional Velocity plugin if you run a network. everything gets stored in MySQL.
what it does:
- staff mode, auto vanishes you and backs up your inventory first so you get it back even after a crash
- vanish with silent join/leave
- freeze, with an optional time and reason
- ban, mute, kick, unban, unmute. add
--silentto a ban to skip the broadcast - reports and staff notes
- invsee, ecsee and an inspect gui (punishments, freezes, reports, ip history, alts, login logs)
- staff chat
- PlaceholderAPI placeholders under
%staff_...%if papi is installed - works on folia too, same paper jar
| usage | what it does |
|---|---|
/staffmode [reload] |
toggle staff mode, or reload the configs |
/vanish [player] |
toggle vanish for you or someone else |
/vanishlist |
list vanished players |
/freeze <player> [time] [reason] |
freeze a player |
/unfreeze <player> |
unfreeze a player |
/freezelist |
list frozen players |
/invsee <player> |
look at someones inventory |
/ecsee <player> |
look at someones ender chest |
/inspect <player> |
open the inspect gui |
/note add <player> <text> / /note remove <id> |
add or remove a note |
/notes <player> [page] |
see a players notes |
/staffchat [message] |
send to staff chat, or toggle it with no message |
/ban <player> [time] [reason] |
ban |
/unban <player> |
unban |
/mute <player> [time] [reason] |
mute |
/unmute <player> |
unmute |
/kick <player> [reason] |
kick |
/report <player> <reason> |
report a player |
/reports [gui|list <player> [page]|clear <player>] |
view and manage reports |
times look like 30m, 1h, 1d, 2w (s works too), or perm.
you can change all of these in settings.yml, these are the defaults:
- staff mode:
staff.staffmode.use,staff.staffmode.reload - vanish:
staff.vanish.self,staff.vanish.other,staff.vanish.list - freeze:
staff.freeze.use,staff.freeze.list,staff.freeze.logout-notify - inventory:
staff.inventory.invsee,staff.inventory.ecsee - inspect:
staff.inspect - notes:
staff.notes.add,staff.notes.remove,staff.notes.view - reports:
staff.reports.view,staff.reports.clear. anyone can/reportby default - staff chat:
staff.staffchat - staff teleport tool:
staff.teleport.tp - punishments:
staff.punishments.ban,staff.punishments.ban-notify,staff.punishments.unban,staff.punishments.mute,staff.punishments.unmute,staff.punishments.kick
- build it (see below) or grab a release
- put the paper jar in your servers
plugins/folder, and the velocity jar in the proxysplugins/folder if you use one - start it once, set up the db in
settings.yml(andconfig.propertieson velocity), restart
config files:
settings.ymldb, network mode, features, permsmessages.ymlall the messagesitems.ymlstaff mode hotbar itemspunishments.ymltime and reason presetsconfig.properties(velocity) db, shared secret anddatabase.enforcement-interval-seconds(how often the proxy rechecks bans/mutes)
network.mode in settings.yml needs a restart to change:
proxy(default) uses the velocity plugin for cross server stuff and staff chat. set the samenetwork.shared-secreton paper and velocity. if its blank on velocity every proxy login gets denied, so use a long random value and keep it privatepaperruns without velocity, doesnt register any plugin message channels and doesnt need a secret. local staff chat and bans still work
more than one proxy works too, no redis needed. point them all at the same db and shared secret. each proxy needs its own network.proxy-id in its config.properties, it gets generated on first start, so if you copy a proxy folder blank it on the copy.
staff mode wont replace your inventory unless it got backed up first, so if features.staffmode.save-inventory is false and staff items are on it just refuses. open sessions get restored on join or reload.
inventory backups belong to the backend that made them. each paper server generates a server-id.txt in the plugins data folder. keep it across restarts and when moving that server. if you copy the folder to make a different backend, remove server-id.txt from the copy before starting it.
when updating, turn off staff mode for everyone before shutting down the old version. old open backups dont have a server id, so recovery locks that players inventory instead of guessing where it belongs. if theres an old backup from a crash, check the row in staff_sessions and set its server_id to the value from the original backends server-id.txt, then have the player rejoin. dont assign backups to another backend or delete them to get past the lock. update all backends together so an old jar cant read another servers backup.
alt bans are off by default. turn them on with features.alt-ban.enabled: true and set action to kick or ban. ban needs a positive ban-duration-seconds, it never perm bans alts. keep require-forwarding: true behind velocity so it doesnt treat the proxy ip as everyones ip, only set it false if paper runs on its own. alt bans also turn on ip logging even if features.inspect.log-ips is false.
needs JDK 21. MikeyCore gets pulled in as a composite build, so clone it next to this repo:
parent/
├── MikeyStaff/
└── MikeyCore/
then:
./gradlew coreTest buildcoreTest runs the MikeyCore tests too, build builds and tests both plugins. jars end up in plugins/advanced-staff/paper/build/libs and plugins/advanced-staff/velocity/build/libs, core gets shaded into both.
CI checks out MikeyCore next to it and builds both. every push to main updates the latest build release with the paper and velocity jars.