pCore request: network vanish, staff chat and undercover mode (keeping LibertyBans)

@Croven, a feature request for pCore, from a talk BlackDragon and JoJo had today.

Context: Ploomsy keeps LibertyBans for punishments. ban.ploomsy.net (Liberty_Web) reads its tables directly and the owner says Vulcan is wired into it, so keeping it avoids a migration and a site rework. The gaps staff raised were network-wide vanish, staff chat and an undercover mode. pCore already handles msg, friends, parties, nicknames and the chat filter on the proxy, so the request is that these hook into the same visibility rules. Native in pCore or bridging to a vanish plugin you prefer is your call.

1. Network vanish

  • Proxy owns the state: /v toggles it, it follows the player across server switches and reconnects, and it’s persisted so a proxy restart doesn’t unvanish anyone.
  • Proxy side (hidden from anyone without a see-vanished permission): displayed player count and ping sample (the public ping always excludes them), /glist and any pCore list command, friends online status and “came online” notices, /msg tab-complete, party member lists and the party status display from today’s update. /msg, friend requests and party invites to a vanished player answer exactly like “offline”.
  • Backend side, which needs the bridge or a Paper companion: hidePlayer for viewers without the permission, unlisted from tab, and join/quit/death/advancement messages suppressed. v1 scope is entity + tab + broadcasts; silent interactions (mob targeting, pickup, plates, chest animation) can come later.
  • Staff with the permission see them, with a [V] tag in /glist (per-viewer tab names need packet work, so that’s optional).
  • Decisions we’d suggest: a vanished player can still use staff chat but not public chat; /r works for replies they started; vanishing while in a party shows them as offline to non-staff members.

The timing requirement: the backend has to know a player is vanished before PlayerJoinEvent fires, otherwise they’re broadcast and visible for a moment, and plugin messages can’t arrive that early. Two honest options: the proxy puts a game profile property on the player (Velocity forwards profile properties to the backend with modern forwarding, readable at pre-login), or the backend hides and mutes every join until the proxy confirms the state, with a timeout that fails hidden. Please don’t make it depend on another player already being online on that backend (the carrier issue from t/128); an empty server has to work.

2. Staff chat

  • /sc <msg> works on every server. A toggle mode and a prefix shortcut (for example #) are nice, but they mean intercepting normal chat, and Velocity can’t cancel a signed chat message from 1.19.1+ clients by default. So they should go through whatever path the chat filter already uses. The failure that matters most is staff text leaking into public chat, so test that path specifically.
  • Optional: Vulcan alerts into staff chat. They’d ride the flagged player’s own connection (that player is on that backend by definition), so no carrier problem.

3. Undercover mode

  • A staff member appears as a normal player with a nickname and a default-looking rank. Requirement: punishments by or against them must still resolve to the real UUID and name on ban.ploomsy.net, and their staff permissions don’t change with the cosmetic rank.

4. /report with a Discord hook (JoJo’s point: StaffUtils has this and staff want it)

  • /report <player> <reason> from any server: the proxy records it (who, target, reason, server, time), pings online staff in staff chat with a click-to-teleport, and posts it to a private Discord staff channel by webhook. Cooldown per reporter, no self-reports, and /reports for staff to claim and close them.
  • If StaffUtils can run with its punishment module switched off, using its staff chat and /report next to LibertyBans is also fine; the request is just that it reads pCore’s vanish state.
    Tests we’d want: vanish then switch servers; vanish then proxy restart and backend restart; vanished player joining an empty backend; two players joining at once; a non-staff /msg, friend request and party invite to a vanished player; vanished member in a party; staff chat toggle and prefix never echoing to public chat; a ban issued while undercover showing the real name on ban.ploomsy.net; a /report reaching Discord and staff chat from an empty backend.