COWMODSКаталог модов

ServerSystem

Homes, warps, teleports, kits, money and moderation for Paper and Folia. 133 commands, every one of them switchable, player data in a database, and a way both into and out of EssentialsX.

3511обновлён 16 окт. 2026 г.
ЭкономикаУправлениеУтилиты

Описание

Discord Release Downloads Servers License

Built with Java 21 Available for Paper Available for Purpur

Chat with us on Discord Available on Codeberg

ServerSystem

Homes, warps, teleports, kits, money and moderation. 133 commands, every one of them switchable, and a way in and out of EssentialsX.


Essentials is the plugin almost every server installs first and almost nobody is happy with. It works, and it has worked since 2011, which is also the problem: one YAML file per player, a /give you cannot turn off without renaming it, and no idea what Folia is.

ServerSystem is the same job done with the last decade in mind. Player data lives in a database. Every command can be switched off individually. Every player reads in their own language. And if you decide it was a mistake, one command writes everything back out in Essentials' own format.


Requirements

  • Paper 1.21.x or newer, or a fork of it (Purpur, Pufferfish, Leaves)
  • Folia works, the whole plugin uses the region scheduler
  • Java 21
  • Vault - optional, only so other plugins can see the economy
  • PlaceholderAPI - optional, only if you want the placeholders

On first start Paper downloads HikariCP and the database drivers by itself. That is why the jar is half a megabyte instead of twenty.


EssentialsX migration

/serversystem migrate here --dry-run
/serversystem migrate here

The dry run reads everything and tells you what it found without writing anything. It carries over balances, homes, warps, spawns, jails, kits, worth prices, nicknames, ignore lists, mail, active mutes and the vanilla ban list Essentials shares.

Your Essentials folder is not touched. Nothing is deleted on either side, and running the import twice updates the same rows rather than doubling them, so you can import, look around, and import again after fixing something.

What has no equivalent is reported rather than dropped in silence. Numeric item ids from 1.12 kits cannot be resolved on a modern server, and a home in a world that is no longer loaded cannot be checked, so both are named in the report instead of being guessed at.

Exporting back

/serversystem migrate to essentials
/serversystem migrate to essentials --apply

The first writes a complete Essentials data folder into plugins/ServerSystem/essentials-export. The second writes it straight into plugins/Essentials, after copying whatever is there into a timestamped backup.

This is not there because anybody should want to go back. It is there because a server that cannot leave a plugin has not chosen it.


Switchable commands

commands.yml has one entry per command:

  give:
    enabled: true
    aliases: []
    permission: serversystem.command.give
    cooldown: 0
    cost: 0.0

enabled: false does not hide the command or refuse it - it is never registered with the server at all. It disappears from /help and from tab completion, and the name is free for another plugin to claim. That is the part Essentials cannot do: a command it owns stays owned.

Commands are registered at runtime rather than listed in plugin.yml, which is what makes all of that configuration instead of a jar edit. Names that vanilla already owns, such as /give and /tp, are taken over on purpose. Names another plugin owns are left alone and reported in the console, unless you list them under override-commands in config.yml.

A command added by a later version appends itself to the bottom of the file with its defaults. Nothing you changed is ever rewritten, and comments you add stay.


Storage

Essentials keeps one YAML file per player. On a server with thirty thousand of them, /baltop means opening thirty thousand files, and it does it on the server thread.

Here everything is one table. Online players are held in memory, so no command waits for a query. Offline lookups hit the database once and stay cached for five minutes, which is what makes /balance SomeoneWhoLeftLastYear finish instantly. /baltop is one ORDER BY, so it costs the same whether a hundred players exist or a hundred thousand.

SQLite by default and no setup at all. MySQL when several servers should share balances, homes and punishments.


Money

Balances are BigDecimal, not double. A double is fine until a server has been trading for a few months and a shop plugin quietly rounds a payout, and by then the only evidence is a player insisting they were short-changed.

Every change is recorded: how much, what it left behind, who did it and why. So "where did my money go" has an answer that does not depend on anybody's memory.

ServerSystem registers itself with Vault, so shops, jobs and crate plugins talk to it the way they already expect. A purchase made through a shop is logged exactly like one made with /pay.


Languages

Players are served in the language their Minecraft client is set to. A Spanish player reads Spanish on a German server without anybody configuring anything, and /language overrides it for anyone whose client language is not the one they want to read.

Missing lines fall back per line, not per file, so a half-finished translation is usable rather than a wall of blank text. English, German and French are included. Drop another file into plugins/ServerSystem/lang and it appears in /language on the next reload.


Teleporting

One place decides the warmup, the cooldown, whether moving cancels it, and whether the destination is somewhere a player can survive. Doing that per command is how plugins end up with a /home that respects the warmup and a /warp that does not.

Destinations are checked before the player is moved. A home in a room somebody filled with lava is refused rather than being a death sentence, because coordinates do not stay safe.

Teleports are asynchronous, which is a requirement on Folia and a courtesy on Paper: the destination chunk loads off the tick instead of stalling it.


Moderation

Nothing is deleted. Lifting a ban marks the row inactive and records who lifted it, so a staff team can see that a player was banned three times and unbanned by the same person each time.

Bans are recorded against the account, not the name, so a rename does not lift one. The login check runs on the async pre-login event, before the server has built a player object, and is a single indexed query rather than a walk over a banlist file.

Warnings can act on themselves. warnings.actions in config.yml maps a count to a command, so a team that agrees "three warnings is a day ban" writes that down once instead of relying on whichever moderator is online to remember it.


Setup

/serversystem setup

A checklist of what a new server still needs, with the missing steps clickable.

/serversystem doctor

Checks the database, Vault, PlaceholderAPI, the spawn point, plugins that would conflict, translation gaps and settings that are new in this version.


Permissions

serversystem.player is on by default and covers the everyday commands. serversystem.staff and serversystem.admin default to operators. Every command also has its own node, so any of it can be split apart.

Home limits come from permissions rather than a group list in the config: serversystem.homes.<number>, highest wins, serversystem.homes.unlimited beats all of them. A rank that already exists in LuckPerms does not have to be described a second time here.


Configuration

Nothing has to be touched. A brand new server can install the jar and leave every file alone.

Five things land in plugins/ServerSystem:

FileHolds
config.ymlevery setting, each one commented in place
commands.ymlone entry per command, all 133 of them
kits.ymlthe kits, in a readable format or captured with /createkit
worth.ymlwhat each item sells for
lang/one file per language

What config.yml covers:

SectionDecides
languagethe default language, and whether to follow each player's client
storageSQLite or MySQL, and how often to save
economysymbol, decimals, starting balance, floor and ceiling, Vault, transaction log
teleportwarmup, cooldown, whether moving or taking damage cancels, safe destinations
homes warps spawnhome limit, per-warp permissions, per-world spawns, respawn behaviour
chatmessage format, command spy, which commands a mute blocks, offline messages as mail
nicknamelength, prefix, whether the tab list changes too
moderation warnings jaildefault reasons, broadcasts, automatic action at N warnings, jail radius
afk vanishidle timeout, kick timer, what vanish actually hides

Each command's entry looks like this, and enabled: false means the command is never registered at all:

give:
  enabled: true
  aliases: []
  permission: serversystem.command.give
  cooldown: 0
  cost: 0.0

Placeholders

With PlaceholderAPI installed:

PlaceholderShows
%serversystem_balance%the raw balance
%serversystem_balance_formatted%the balance with the currency symbol
%serversystem_balance_compact%the balance as 1.23M
%serversystem_nickname%nickname, or the account name
%serversystem_homes% / %serversystem_homes_max%homes used and allowed
%serversystem_playtime% / %serversystem_playtime_hours%time played
%serversystem_afk% %serversystem_vanished% %serversystem_god% %serversystem_flying% %serversystem_jailed%state
%serversystem_language%the language this player reads in
%serversystem_mail_unread%unread messages
%serversystem_warps%how many warps exist

Support

Questions, bug reports and translations: dc.gg/paperstream

Licensed under GPL-3.0.

Последние версии

Все версии →
release

1.1.0-RELEASE

1.1.0-RELEASE
16 окт. 2026 г.216Minecraft: 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.3folia, paper, purpur
Скачать
Что нового
Menus for homes, warps, kits and baltop, stored player reports, and a combat tag. Tested on Paper and Folia 1.21.11. ## Added - **Menus.** `/homes`, `/warps`, `/kit` and `/baltop` open a paged chest menu when a player runs them without arguments. Each one can be switched back to the chat list under `menus` in config.yml. The console still gets chat. - **Reports.** `/report <player> <reason>` files a report that is kept in the database. Staff with `serversystem.report.notify` hear about it at once, and `/reports` lists what is still open, with `close <id>` and `tp <id>`. `/report` has a 60 second cooldown by default. - **`/helpop <message>`** calls staff without filing a report. - **Combat tag.** Hitting another player, or being hit, by melee, projectile or TNT, tags both for 15 seconds. While tagged, the commands under `combat.blocked-commands` and their aliases are refused, survival flight is switched off, and logging out kills the player. Clicking a menu entry does not get around it. `serversystem.combat.bypass` is not given to operators. ## Fixed - Language files unpacked by an older version showed the keys a newer one added as raw text, such as `command.report.self`. Missing keys are now filled in from the jar, which is what the fallback was meant to do. - An unreachable MySQL server printed a stack trace instead of the short "check the storage section" message. - `/skull` with a name the server has never seen froze the tick while Mojang was asked about it. The profile is now resolved off the server thread. - `/tpahere` read the requester's position from the wrong region thread on Folia. It is now read on the requester's own thread. ## Changed - Built against Paper 1.21.11. Teleports no longer link against `TeleportFlag.EntityState`, which Paper has marked for removal. - HikariCP 7.1.0, sqlite-jdbc 3.53.4.0, mysql-connector-j 26.7.0, bStats 3.2.1, PlaceholderAPI 2.12.3.
release

ServerSystem 1.0.1

1.0.1-RELEASE
14 сент. 2026 г.68Minecraft: 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.3folia, paper, purpur
Скачать
Что нового
Fixes three things found while testing against a real MySQL server and a connected client. **MySQL storage never worked.** `CREATE INDEX IF NOT EXISTS` is SQLite syntax; MySQL answers with a syntax error, so the schema stopped after the first table and the plugin refused to enable. Anyone who set `storage.type` to `mysql` got a startup failure and nothing else. Indexes are now created through `information_schema` on MySQL. Checked against MySQL 8.4.6: ten tables, six indexes, homes, warps, mail and the transaction log written and read back, and a second save updating the row rather than adding one. **Vault lookups blocked the server thread.** Accounts were fetched through a future with a two second timeout, called from the tick. A shop plugin walking a list of offline accounts could stall the server for that long. Vault's API is synchronous and there is no correct way to answer it asynchronously, so the read now happens inline as one indexed query and is cached afterwards. A warning is logged if one ever takes longer than 25ms. **`/pay` could destroy money.** The transfer ignored the result of the withdrawal, so a failed deposit left the amount in neither account. The move is now serialised and the deposit is compensated if it fails. Two servers sharing one MySQL database can still race the balance ceiling check. That needs row locking and has not been done.
release

ServerSystem 1.0

1.0-RELEASE
9 сент. 2026 г.67Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Скачать
Что нового
First release. **133 commands** across teleporting, homes, warps, spawns, kits, economy, moderation, chat, inventories, world control and information. **Every command can be switched off.** `commands.yml` carries one entry per command with its aliases, permission node, cooldown and price. A command set to `enabled: false` is never registered with the server, so it disappears from `/help` and from tab completion and gives its name back - a name that vanilla owned, such as `/give` or `/list`, returns to vanilla. **Two-way EssentialsX migration.** `/serversystem migrate here` reads an existing installation: balances, homes, warps, spawns, jails, kits, worth prices, nicknames, ignore lists, mail, active mutes and the vanilla ban list. Item names from before the 1.13 flattening are understood, so a worth.yml that has been in use for years comes across whole. `/serversystem migrate to essentials` writes all of it back out in Essentials' own layout. Nothing is deleted on either side and running it twice updates rather than doubles. **Player data in a database.** SQLite with no setup at all, or MySQL when several servers share one set of balances and punishments. Online players are held in memory, so no command waits on a query, and `/baltop` is one `ORDER BY` rather than a walk over thirty thousand files. **Economy on BigDecimal** with a transaction log, offered to other plugins through Vault. **Folia.** Every task goes through the region scheduler and teleports are asynchronous. **Per-player languages.** Players are served in their client's language without any configuration. English, German and French are included; further files drop into `plugins/ServerSystem/lang`. --- Tested on Paper 1.21.11 with Java 21: all 133 commands were run against a live server, 74 from the console and the rest through a connected client, with no exceptions. The migration was checked against a real EssentialsX 2.22 installation. Requires **1.21.4 or newer** - `/heal` uses an attribute that was renamed in 1.21.3.