Documentation is a work in progress — some pages may be incomplete.
Unify

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

PermissionDescription
unify.vanishUse /vanish command
unify.vanish.otherVanish other players
unify.vanish.seeSee 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:

  1. Override handlers are checked first (highest weight wins). If any override returns true or false, that decision is final.
  2. If no override applies, adapters are checked. If any adapter says the target should be hidden, they're hidden.
  3. If no adapter hides the target, they are visible.

Updating Visibility

// Update one player for everyone
VisibilityHandler.update(player)

// Update all players
VisibilityHandler.updateAll()

On this page