Visibility
Vanish system and custom visibility adapters
Unify provides two visibility systems: a simple vanish handler and a flexible adapter-based visibility system for custom hide/show logic.
Vanish Handler
The simplest way to hide a player from others:
import me.jordanfails.unify.visibility.VanishHandler
// Vanish a player
VanishHandler.setVanished(player, true)
// Unvanish
VanishHandler.setVanished(player, false)
// Toggle
val nowVanished = VanishHandler.toggle(player)
// Check if vanished
val isVanished = VanishHandler.isVanished(player)
// Check if a viewer can see vanished players
val canSee = VanishHandler.canSeeVanished(viewer)Permissions
| Permission | Description |
|---|---|
unify.vanish | Use /vanish command |
unify.vanish.other | Vanish other players |
unify.vanish.see | See vanished players |
Visibility Adapters
For more complex hide/show logic, use VisibilityAdapters:
import me.jordanfails.unify.visibility.VisibilityHandler
import me.jordanfails.unify.visibility.VisibilityAdapter
class GameVisibilityAdapter : VisibilityAdapter("Game", 50) {
override fun canSee(viewer: Player, target: Player): Boolean {
val viewerGame = gameManager.getGame(viewer)
val targetGame = gameManager.getGame(target)
// Players in different games can't see each other
return viewerGame == targetGame
}
}Register it:
VisibilityHandler.registerAdapter(GameVisibilityAdapter())Visibility Overrides
Sometimes you need to force a visibility decision regardless of adapters. Use OverrideHandlers for that:
import me.jordanfails.unify.visibility.VisibilityHandler
import me.jordanfails.unify.visibility.OverrideHandler
class SpectatorOverride : OverrideHandler("Spectator", 100) {
override fun canSee(viewer: Player, target: Player): Boolean? {
// Spectators can always see everyone
if (viewer.gameMode == GameMode.SPECTATOR) {
return true
}
// Don't override for non-spectators
return null
}
}Register it:
VisibilityHandler.registerOverride(SpectatorOverride())How Decisions Work
When checking if viewer can see target:
- Override handlers are checked first (highest weight wins).
If any override returns
trueorfalse, that decision is final. - If no override applies, adapters are checked. If any adapter says the target should be hidden, they're hidden.
- If no adapter hides the target, they are visible.
Updating Visibility
// Update one player for everyone
VisibilityHandler.update(player)
// Update all players
VisibilityHandler.updateAll()