New features
- -HackDetection in ClientDetection: known hack-client brands and plugin channels (Wurst, Meteor, LiquidBounce, Sigma, Impact, Aristois, Future, Vape, RusherHack, Inertia, KAMI, SeedcrackerX, Xray and others) are flagged on join. Default Action is kick; staff with muteessentials.clientdetection.hack get an in-game alert.
- -AntiVPN module: AsyncPlayerPreLoginEvent check against the NetSight /api/fraud-check endpoint. Configurable risk score threshold, optional hosting/datacenter blocking, per-IP cache, and a kick message in messages-de.yml / messages-en.yml. Authenticated via X-MC-Token shared secret so no per-user API key is required.
- -AdminGUI Settings menu rebuilt as a 21-toggle dashboard: every system, module, scoreboard, tablist, kit, MOTD, maintenance and update can be flipped live, with a description and an apply tag (✓ no restart needed / ✗ restart required) on each entry.
- -Rank color picker in AdminGUI: creating a rank now prompts for the rank id in chat and then opens a 16-block wool picker (one wool per Minecraft dye color). Existing ranks have an Edit Color button on their detail page.
- -Templates GUI is paginated: ban, kick, mute and warn template lists now use 28 entries per page with prev/next arrows, so an unlimited number of templates is supported.
- -Custom... button on each templates GUI: opens a chat prompt for a free reason (kick, warn) or reason plus duration (ban, mute) in the form Hacking | 7d. The duration parser accepts 1d, 12h, 30m, 15s, combinations like 1d12h, plain seconds, and permanent / perm / -1.
- -/mute <player> <reason words> [seconds] now accepts a numeric last argument as the duration in seconds, mirroring /customban.
- -WarnSystem.Templates: the warn system now supports the same template structure as bans and kicks. /admingui exposes a Warn button (magenta wool) in the player view.
- -muteessentials.bypass.clientdetection.hack: a player with this permission is never flagged or kicked by HackDetection.
Localization and consistency
- -Rank color defaults aligned to the Minecraft dye palette (red, orange, yellow, lime/green, cyan, blue, purple, magenta, pink, light gray). Owner is red, admin is orange, premium is purple, default is light gray. Existing config values are preserved by the merger.
- -ServerMOTD renamed to ServerListMOTD (server-list ping) and MOTD renamed to JoinMessage (post-join chat welcome). Both keys are auto-migrated to the new names by ConfigMigrator on first start; the legacy keys stay in the file as a record and the runtime falls back to them when migration is skipped.
- -All AdminGUI items are now wool blocks instead of dyes, matching the rank color picker. Player rank rows in the manage GUI are colored by the rank's own prefix color rather than the previous lime/gray indicator.
- -Toggle apply tags use ✓ and ✗ instead of ↻; English reads No restart needed and Restart required.
- -Default ServerName in the bundled config changed to play.example.com so fresh installs no longer ship with the author's domain.
Fixes
- -BlockLog rollback now restores attached blocks (torches, ladders, wall signs, doors, beds, plants, lanterns, chains, vines, dripstone, banners, candles, pressure plates, redstone, …). Previously only the support block came back; the dependent block was lost as a dropped item.
- -BlockLog rollback now restores both halves of a bed and a door. Previously isBedHead always returned true for the head entry, skipping it; the head was missing after rollback because applyPhysics=false does not auto-create the paired half.
- -Scoreboard rank prefix no longer shows the » separator for the default Player rank. The cut point is now the » character itself instead of the first §8 color code, so a rank that uses gray as its name color (the default Player) is rendered correctly.
- -GamemodeCommand checks the base permission Gamemode.Permission before the subcommand-specific check; Gamemode.PermissionOther is read at the call site as before.
- -Config.java logs accurate severity for each I/O path: Could not load and Invalid config file at startup, Could not save on save failure, Could not reload on reload failure (was previously a copy-paste of the create-failed message).
Under the hood
- -ConfigMigrator runs at plugin enable, before ConfigMerger. It moves customisations from old key names (Modules.AntiHack.*, ServerMOTD.*, MOTD.*) to their new locations and never deletes the originals, so user content is preserved.
- -ClientDetector default brand/channel pattern lists are extensible via ClientDetection.HackDetection.BrandPatterns and ChannelPatterns; an empty list falls back to the built-in defaults.
- -AntiHackModule and AntiHackListener removed; the logic is now inside ClientDetector and triggered after the existing client resolution callback.
- -MuteCommand free-form path accepts an optional numeric last argument for duration in seconds, parallel to CustomBanCommand.