Skip to content

v1.7.2 — the optional plugin: held players cannot be hurt, and the commands turn blue

Choose a tag to compare

@CaYatur CaYatur released this 25 Aug 21:32
· 8 commits to master since this release

The optional server plugin

There is one thing a firewall in front of a server cannot do, and it is the thing people notice: stop a held player being hurt. A player waiting at the login prompt is genuinely standing in your world, and only the server decides their health. Until now the best available was to notice the damage and disconnect them before they died — a reconnect instead of an inventory, which is better than nothing and not the same as fixing it.

This release adds the part that goes inside the server.

The Protection page finds your server and installs it for you. It shows you the exact path first and writes nothing until you approve that path. About four kilobytes, compiled against the Minecraft 1.8 API using only calls that have existed since then, so one file works on every version this firewall supports and on versions that do not exist yet. The source is in plugin/ and is short enough to read in a couple of minutes.

With it installed, a player at the login prompt:

  • cannot be hurt at all — not by mobs, falling, drowning, the void, fire, or hunger
  • cannot be moved by anything in the world
  • sees /login, /register and /premium in blue, as real commands, and finds them in /help — which is where somebody actually works out how to claim their name

Everything still works without it. Nothing waits for it, no message depends on it, and a server without it behaves exactly as it did before it existed. Identity.UseServerPlugin turns it off entirely.

It never decides anything

Who is held, and for how long, is the firewall's judgement alone; the plugin holds whoever it is told to hold. A plugin that decided for itself would be a second implementation of the login rules, free to disagree with the first. It is also deliberately not allowed to look at the world — that would be the shadow world model this project already rejected for the anti-cheat, in a place where it is even harder to reason about.

The channel is closed at both ends

Instructions travel on the player's own connection and the format has no field for a name, so a message cannot be aimed at anybody else. The plugin cannot tell an instruction the firewall injected from one a player sent — so the firewall drops anything a client sends on that channel, unconditionally, not as an inspection setting. Tested with a byte-identical forged instruction.

Installing is the careful part

It writes into software this project does not own, and the server folder is found by a heuristic. So: the exact absolute path is approved before anything is written, a missing plugins folder is treated as evidence the wrong directory was found rather than something to create, and the only filename ever written or deleted is our own.


One thing to be aware of: the plugin builds, packages and installs correctly, and that whole path is verified. It has not been loaded on a live Minecraft server from here — there isn't one on the build machine. If it misbehaves on yours, the source is right there and it is forty lines.

646 tests. Windows 10/11, x64.