Files
spigot-stealth/design/user-stories/us-002-rejoin-without-visible-identity.md
T
dmg ba6573943b
Release / release (push) Successful in 2m13s
CI / build (push) Successful in 58s
fix(stealth): hide concealed players from server ping
2026-09-05 08:11:58 -04:00

3.4 KiB

type, title, description, status
type title description status
User Story US-002: Rejoin without a visible identity Let an unlocked player turn a qualifying invisible disconnect into one identity-concealed session. done

US-002: Rejoin without a visible identity

As an unlocked player, I want to disconnect while invisibility from a potion I drank is active so that my identity is concealed throughout my next session.

Acceptance criteria

  • An unlocked player becomes eligible for a concealed login only by disconnecting while an invisibility effect from a potion they directly drank remains active.
  • A player who has not unlocked stealth cannot prepare a concealed login.
  • An ordinary disconnect without an active qualifying effect clears any preparation for the next login.
  • On a prepared login, no public join announcement is shown.
  • When a concealed player disconnects, no public quit or disconnect announcement is shown.
  • Ordinary players' quit messages remain unchanged.
  • Concealment is checked before disconnect cleanup so announcement suppression is reliable.
  • Throughout the concealed session, the player is absent from every other player's tab list, including administrators' tab lists.
  • The multiplayer server list's online-player count excludes currently concealed players.
  • Concealed players are excluded from any player-name sample shown for the server-list count, while ordinary players remain represented.
  • The public count never becomes negative, and the configured maximum-player count remains unchanged.
  • Server-list concealment changes only the public ping response and does not alter actual online-player state or gameplay.
  • Throughout the concealed session, no overhead name tag identifies the player to any other player, including administrators.
  • The concealed player's physical character remains visible in the world and retains ordinary movement, interaction, combat, and permission behavior.
  • The concealed player receives a private message explaining that stealth is active for the session.
  • Concealment lasts until the player disconnects and is handled predictably across death and plugin reload or disable events.
  • Disconnecting consumes the current concealed session; another concealed login requires another qualifying potion and qualifying disconnect.
  • Merely owning the unlock never conceals an ordinary login or carries concealment automatically into a later session.
  • Prepared-login state survives a server restart between the qualifying disconnect and the next login.

Validation

Automated tests verify unlocked and locked disconnect transitions, ordinary-disconnect clearing, one-login consumption, concealed join and quit announcement suppression, preservation of ordinary announcements, private activation messaging, ordinary-login presentation, tab removal for existing and new observers, overhead-name suppression, active concealed-session tracking, public server-list count and sample filtering, nonnegative counts, unchanged maximum capacity, and the absence of entity-hiding calls. ProtocolLib is declared as a required dependency, prepared state round trips through YAML, and ./gradlew clean check jar passes.