Installation
Single server
- Put
PunishSystem-Paper.jarin thepluginsfolder and start the server. - Paste your
license-key(customer area) intoplugins/PunishSystem/config.yml. - Restart. The SQLite database is created automatically.
Velocity network
- Put
PunishSystem-Velocity.jaron the proxy and thelicense-keyin itsconfig.yml. - Put
PunishSystem-Paper.jaron every server behind the proxy, withmode: backend(no license needed there). - Set the same MySQL/MariaDB database in every
config.yml:
database:
type: mysql
host: 127.0.0.1
port: 3306
name: punishsystem
user: punish
password: "your-password"
The proxy checks bans on join and handles commands and appeals. The Paper servers enforce mutes (Velocity can't block chat from modern clients) and open the history menu.
Commands
| Command | What it does |
|---|---|
/ban <player> [duration] [reason] [-s] |
Ban (no duration = permanent) |
/tempban <player> <duration> [reason] |
Temporary ban |
/ipban <player\|ip> [duration] [reason] |
IP address ban |
/unban <player\|ip> [reason] |
Remove the ban (IP ban too) |
/mute · /tempmute · /unmute |
Mutes |
/warn <player> [reason] · /unwarn <player> |
Warnings |
/kick <player> [reason] |
Kick |
/punish <player> <template> |
Escalating punishment |
/history <player> |
History (menu) |
/alts <player> |
Accounts that used the same IPs |
/punishsystem reload · info |
Reload config · status |
Durations: 30m, 12h, 7d, 2w, 1mo, 1y, also combined (1d12h). perm = forever.
-s: only staff see the announcement.
Permissions
| Permission | What it allows |
|---|---|
punishsystem.ban · tempban · ipban · unban |
Bans |
punishsystem.mute · tempmute · unmute |
Mutes |
punishsystem.warn · unwarn · kick |
Warnings and kicks |
punishsystem.punish + punishsystem.punish.<template> |
Templates (or punishsystem.punish.*) |
punishsystem.history · alts |
History and alts |
punishsystem.seeip |
See full IPs |
punishsystem.silent |
Use -s |
punishsystem.notify |
See silent announcements and appeal decisions |
punishsystem.alerts |
Banned alt alerts |
punishsystem.exempt |
Can't be punished |
punishsystem.punishsystem |
reload and info |
punishsystem.staff |
Starter pack for helpers (Paper only) |
Templates and warnings
In config.yml each template has a reason and a list of steps. Every repeat offense moves to the next step:
templates:
hack:
reason: "Modified client"
steps: ["ban 7d", "ban 30d", "ban perm"]
Warnings trigger automatic actions:
warnings:
expire-days: 30
actions:
3: "mute 1h"
5: "ban 1d"
Discord appeals
You need the SonoNiko Tickets bot with Premium active on your Discord.
- Bot dashboard → Integrations: create the API key.
- Dashboard → Appeals: choose the category and enable appeals.
- In
config.yml(on the proxy if you run a network):
language: en
appeals:
enabled: true
api-key: "tb_..."
discord: "discord.gg/yourserver"
A banned or muted player sees a code and types /appeal code:XXXXXXXX on Discord. Staff get a ticket with the punishment and history and press Accept or Deny. If accepted, the punishment is lifted in game within about 20 seconds.
In the dashboard you can also require that only the owner of the punished account can appeal (the account must be linked to Discord with DiscordLink).
Linked accounts
The plugin stores the IPs each player uses. /alts shows the other accounts, with banned ones in red. With alts.block-banned-alts: true, anyone joining from the same IP as a banned account is blocked. Be careful with families and shared networks.
Troubleshooting
"in modalità backend serve MySQL": servers behind Velocity must use the same database as the proxy.
Mutes don't work on the network: make sure PunishSystem is on every Paper server with mode: backend.
Appeals don't reach Discord: /punishsystem info shows how many punishments are waiting to be sent. The console shows the reason (API key, Premium not active, appeals disabled in the dashboard).