Vanish
Vanish makes a player invisible to everyone who is not allowed to see hidden players, and it does the job properly — the vanished player drops off the tab list, their join and quit lines can be faked so nobody notices they merely went invisible, and they move through the world untouched by damage, hunger, and mobs. It is a PremiumVanish-class feature with layered see/use levels, so a senior admin can hide from a junior moderator while still watching over them.
Vanish is its own vanish module. It is the single authority over vanish state:
messaging (/msg resolution), the nametag renderer, and staff mode all read this one
vanish flag, so there is never a second copy to keep in sync. It replaces the plain
vanish that used to live inside the presence and staff modules.
The module ships enabled. Turn it off with enabled = false in
modules/vanish/config.conf, at which point the messaging and nametag vanish gates
degrade to "no one is hidden" and staff-mode vanish becomes a no-op.
Commands¶
Everything lives under one command, /vanish (alias /v).
| Command | What it does | Permission |
|---|---|---|
/vanish |
Toggle your own vanish on or off | uxmessentials.vanish.use |
/vanish on / /vanish off |
Set your vanish absolutely (no guessing which way a toggle went) | uxmessentials.vanish.use |
/vanish <player> |
Toggle another player's vanish (console-usable) | uxmessentials.vanish.others |
/vanish list |
List the hidden players you are permitted to see | uxmessentials.vanish.list |
/vanish pickup [on\|off] |
Flip whether you pick up items while vanished | uxmessentials.vanish.use |
/vanish -s (also on -s / off -s) |
Vanish or reappear silently — no fake join/quit broadcast | uxmessentials.vanish.silent |
A few notes:
/vanish listis scoped to your see level. It never leaks a player hidden above your see level — you only ever learn about the vanished players you could already see. A vanished caller appears in their own list (that reads as "you are vanished")./vanish pickupis remembered per player and defaults to thepickup-itemsconfig value. Bare/vanish pickuptoggles;on/offset it absolutely.- The
-sflag only applies to vanishing and reappearing (/vanish,on,off). It suppresses the fake connection broadcast for a truly silent transition.
Layered See / Use Levels¶
Vanish uses the PremiumVanish see/use model. Every vanished player has a use level (how hidden they are), and every viewer has a see level (how far up they can see). The rule is one line:
A viewer sees a vanished player if and only if the viewer's see level is at least the target's use level. A higher-or-equal see level overrides a lower-or-equal use level; a higher use level overrides a lower see level.
Levels come from permissions:
| Permission a player holds | Resolves to |
|---|---|
uxmessentials.vanish.use.level<N> |
Use level N (the highest numbered node they hold wins) |
uxmessentials.vanish.see.level<N> |
See level N (highest wins) |
plain uxmessentials.vanish.use (no number) |
Use level 1 |
plain uxmessentials.vanish.see (no number) |
See level 1 |
no .see node at all |
See level 0 — sees nobody who is vanished |
| op or a wildcard grant | A very high level — sees every vanished player, and hides from every non-op viewer |
With layered permissions off, it's just a flat toggle
If you never grant a numbered .level<N> node, every vanished player is use level 1
and every .see holder is see level 1, so 1 >= 1 reveals and 0 >= 1 (no see
node) hides. That is exactly the classic "staff see each other, players see nobody"
behaviour — the levels are there only if you want tiers.
Worked example: two staff tiers¶
Grant your ranks like this in your permission plugin:
# Moderators — plain nodes = level 1
uxmessentials.vanish.use
uxmessentials.vanish.see
# Admins — level 2
uxmessentials.vanish.use.level2
uxmessentials.vanish.see.level2
Now:
- An admin vanishes at use level 2. A moderator (see level 1) does not see
them —
1 >= 2is false — so an admin can hide even from staff below them. - A moderator vanishes at use level 1. An admin (see level 2) does see them —
2 >= 1— and can/tpto them (that needsuxmessentials.vanish.see). - Two admins see each other (
2 >= 2); two moderators see each other (1 >= 1). - A regular player holds no
.seenode, so their see level is 0 and every vanished player stays invisible to them.
What a Vanished Player Experiences¶
Each of these is an independent toggle in config.conf. They all default on (except
pickup) so a vanished admin moves through the world unseen and untouched out of the box.
| Toggle | What it does |
|---|---|
silent-chests |
Silences the open animation and sound when a vanished player opens a chest, shulker box, ender chest, or barrel — the lidded containers whose open would otherwise broadcast to every nearby player and give the vanished player away. (Furnaces, hoppers, anvils and the like animate nothing, so they need no help.) |
pickup-items |
The default for whether a vanished player picks up items. Ships off so a vanished player doesn't silently vacuum drops; each player flips their own preference with /vanish pickup. |
night-vision |
Grants permanent night vision while vanished, with no tint or particles, so a hidden staffer can see in the dark. Removed on reappear. |
allow-flight |
Allows flight while vanished. On reappear the allowance is restored to your game-mode default — creative and spectator keep flying; survival and adventure lose the granted flight. |
no-hunger |
Stops hunger draining while vanished. A deliberate eat still tops the food bar back up; only the drain is blocked. |
no-damage |
Makes a vanished player invulnerable — cancels all incoming damage while hidden. |
mob-target |
Stops mobs targeting a vanished player, and drops any target a mob already had on them, so nothing paths to or attacks a hidden player. |
How silent containers work
When silent-chests is on, opening a lidded container as a vanished player shows a
detached copy of its contents (which carries no block, so no animation plays);
the copy is written back to the real container when you close it. It's the same live
inventory-mirror pattern the /invsee and offline-container views use. The copy is a
point-in-time snapshot, so if another player edits the real chest while you have the
mirror open, your write-back on close wins — a negligible window for a quick peek.
Fake Join / Quit Messages¶
To sell the illusion, a vanishing player can broadcast a fake "left the game" line, and a fake "joined the game" line on reappear, so no viewer notices they merely turned invisible. While vanished, the player's real connection lines (an actual disconnect or reconnect) are suppressed too.
fake-join-quit = true
fake-quit-message = "<yellow>{player} left the game"
fake-join-message = "<yellow>{player} joined the game"
fake-quit-message-staff = ""
fake-join-message-staff = ""
| Key | What it does |
|---|---|
fake-join-quit |
Master switch for the whole illusion. Off, and a vanish/reappear broadcasts nothing (the player just winks out). |
fake-quit-message / fake-join-message |
The fake lines, as MiniMessage. {player} is replaced with the player's name. They mirror the vanilla connection format by default — change them to match your server's real join/quit style so the illusion is seamless. |
fake-quit-message-staff / fake-join-message-staff |
The lines shown instead to viewers who can see the vanishing player (staff). Left blank by default, so staff are sent nothing and simply watch the player wink out rather than getting a misleading "left the game". |
The -s flag skips the fake broadcast entirely. /vanish -s (gated by
uxmessentials.vanish.silent) is a truly silent vanish or reappear — nobody, staff
included, gets a line.
Action Bar¶
With action-bar on, a vanished player sees a persistent "You are vanished" action
bar, refreshed once a second so it never fades. Its text is the vanish.actionbar entry
in your message catalog, so it is per-locale. Turn it off to
hide the indicator entirely.
Join Vanished¶
A player who holds uxmessentials.vanish.persist can rejoin already vanished: on
join they are re-hidden before anyone sees them and their real join line is suppressed,
so a staff member who relogs stays invisible instead of announcing themselves. Without
the persist node a player reappears normally on join. (A player is dropped from the
vanish store on quit; the persist permission is what re-derives it on the next join.)
Cross-Server Vanish¶
On a network, cross-server syncs vanish state across every backend: someone vanished
on survival-1 arrives already hidden on survival-2, and /vanish list shows the
hidden players across the whole network (still scoped to the caller's see level). A
server hop is not read as an unvanish — only a genuine /vanish flip crosses the
bus.
Needs the network bus
Cross-server vanish requires the network bus in network.conf to be enabled (a
Velocity proxy or a Redis bus). It ships off, and is completely inert — with no
change to same-server vanish — when the bus is absent. See
Cross-Server: Velocity & Redis.
The config.conf¶
The complete modules/vanish/config.conf, with the shipped defaults:
enabled = true
# What a vanished player experiences in the world
silent-chests = true
pickup-items = false
night-vision = true
allow-flight = true
no-hunger = true
no-damage = true
mob-target = true
# Connection illusions
fake-join-quit = true
fake-quit-message = "<yellow>{player} left the game"
fake-join-message = "<yellow>{player} joined the game"
fake-quit-message-staff = ""
fake-join-message-staff = ""
# Indicator, persistence, network
action-bar = true
join-vanished = true
cross-server = false
Config is loaded once on enable and swapped atomically on /uxmess reload vanish, so a
command or listener that reads it mid-reload always sees one coherent snapshot. Delete a
line and it falls back to the shipped default above, never to false.
Permissions¶
| Node | Default | What it grants |
|---|---|---|
uxmessentials.vanish.use |
op |
/vanish (and on/off, /vanish pickup) — become invisible |
uxmessentials.vanish.others |
op |
/vanish <player> — toggle another player's vanish |
uxmessentials.vanish.list |
op |
/vanish list — the hidden players you may see |
uxmessentials.vanish.see |
op |
See vanished players (staff-among-staff) and /tp to them |
uxmessentials.vanish.silent |
op |
/vanish -s — vanish or reappear with no fake broadcast |
uxmessentials.vanish.persist |
op |
Rejoin already vanished across a relog |
uxmessentials.module.vanish |
op |
Reload / inspect the module (/uxmess reload vanish) |
Layered level families (optional, granted per rank — no boolean default):
| Node family | Meaning | Reduction |
|---|---|---|
uxmessentials.vanish.use.level<N> |
Vanish at use level N |
highest <N> wins |
uxmessentials.vanish.see.level<N> |
See vanished players up to level N |
highest <N> wins |
Because their value space is open, the numbered nodes are not enumerated in
paper-plugin.yml — grant the specific level<N> instances your ranks need. See
Numbered and Tiered Nodes.
Next Steps¶
- 🔑 Permission Reference — the full
uxmessentials.vanish.*node list - 🕵️ Staff Mode — the on-duty toolkit that drops you into this same vanish
- 💬 Messaging — how
/msgresolution respects vanish - 🌐 Cross-Server: Velocity & Redis — the bus that
cross-serverrides on - 🧩 Per-Module Config — where
modules/vanish/config.conflives and how it's loaded