Configuration
On this page(3)
SnStaff ships with the following YAML files. New keys are auto-merged on boot; your edits and comments are preserved.
Numeric options are clamped to the range written in their config.yml comment, and a WARN names the key. /staff reload re-reads the config, lang, GUIs and items. Changes to network.server-id and to database.* need a restart.
api-events.enabled is the master switch of the Developer API events. /staff reload applies it at once, and the query service stays available either way.
The GUI layouts (invsee, silent container replicas and the PIN keypad in guis/pin-keypad.yml) live in guis/*.yml and are managed the same way. data/server-id.yml holds the generated instance id: never copy it to another backend.
SnLib only adds missing keys, so an existing server keeps its old values. See the upgrade notes in Installation for the keys to edit by hand.
config.yml
# ============================================================
# SnStaff - configuration
# Managed by SnLib: new keys are auto-merged on boot; your values and
# comments are preserved. Do NOT add a config-version key (retired).
# Set update-configs: false to freeze this file (SnLib only warns about
# missing keys instead of inserting them).
# Sections marked "# sn:extensible" are yours: entries you delete there
# stay deleted.
# ============================================================
# Active language code; loads lang/messages_<code>.yml (falls back to en).
lang: en
# Master switch of the SnLib auto-updater for this plugin's managed files.
update-configs: true
# Runtime debug output (also toggleable live via /staff debug).
debug:
# Master toggle of the debug output.
enabled: false
# Verbosity threshold: OFF, INFO, DEBUG or TRACE.
level: DEBUG
# Category filter; an empty list lets every category through.
categories: []
# ------------------------------------------------------------
# Main command.
# ------------------------------------------------------------
command:
# Aliases of /staff. Re-read on /staff reload.
aliases: []
# ------------------------------------------------------------
# Database. type=sqlite needs nothing else; type=mysql reads host/port/etc.
# Network features (staff chat across servers, connection notices, rank
# sync, shared PIN sessions) need every backend on the SAME mysql database.
# Changes in this block need a server restart; /staff reload does not apply them.
# ------------------------------------------------------------
database:
# sqlite or mysql
type: sqlite
# MySQL connection (ignored when type is sqlite).
host: localhost
port: 3306
database: snstaff
username: root
password: ""
# ------------------------------------------------------------
# Public developer API.
# ------------------------------------------------------------
# Public developer API events. When false, no API event is dispatched (zero
# cost) and cancellable hooks report "not cancelled" so gameplay proceeds.
# The query facade stays available either way.
api-events:
enabled: true
# ------------------------------------------------------------
# Model. Network identity and the staff rank hierarchy.
# ------------------------------------------------------------
# Identity of this backend and the shared-database bus (network features need MySQL).
network:
# Label shown wherever {server} appears in chat, notices and logs.
server-name: "server"
# Unique id of this backend; empty resolves env SNSTAFF_SERVER, then env P_SERVER_UUID, then an id generated into data/server-id.yml.
# Every backend sharing the database needs its own: never copy data/server-id.yml to another server. Needs a restart.
server-id: ""
# Milliseconds between bus polls of the shared database; 250 to 60000, and at most half the bus read window (the lesser of 60 s and half bus-retention-minutes).
poll-interval-ms: 1000
# Seconds between presence heartbeats of this backend; 1 to 3600.
heartbeat-seconds: 10
# Seconds without a heartbeat after which a presence row counts as dead; must exceed heartbeat-seconds; at most 86400.
stale-seconds: 45
# Seconds a leave is held back so a server switch is not announced as leave plus join; 1 to 3600.
switch-grace-seconds: 5
# Minutes a bus message stays in the database before it is purged; 1 to 10080.
bus-retention-minutes: 10
# Staff ranks synced to LuckPerms groups; the database is the source of truth.
ranks:
# Master toggle of the ranks module; false never touches LuckPerms groups.
enabled: false
# LuckPerms group names from the lowest rank to the highest.
order: [helper, mod, admin, manager]
# Reverts /lp changes to managed groups and alerts admins network-wide.
luckperms-protection: true
# Strips managed groups from players who are not registered staff; register current staff first.
remove-unregistered: false
# Minutes between full safety syncs of the registered ranks; 1 to 1440.
safety-sync-minutes: 5
# ------------------------------------------------------------
# Features. One section per module, each with its own toggle.
# ------------------------------------------------------------
# Staff mode: tool hotbar, inventory snapshot and protections.
staff-mode:
# Master toggle of staff mode (/staff).
enabled: true
# Gamemode applied while in staff mode: SURVIVAL, CREATIVE, ADVENTURE or SPECTATOR.
gamemode: SURVIVAL
# Never re-enters staff mode on join; false re-enters with a fresh backup.
never-on-join: true
# Teleports back to the entry point on exit unless the player has snstaff.staffmode.keeplocation.
return-to-start: true
# Protections enforced by event cancellation while in staff mode.
protections:
# Cancels all damage.
invulnerable: true
# Cancels hunger loss.
no-hunger: true
# Blocks picking up items and XP orbs. false lets items cross the exit overwrite: what is picked up is destroyed on exit.
block-item-pickup: true
# Blocks dropping items. false lets staff drop their tool items into the world.
block-item-drop: true
# Blocks breaking blocks.
block-break: true
# Blocks placing blocks, item frames, paintings, armor stands, boats and minecarts.
block-place: true
# Blocks hitting players, directly or with a projectile.
block-pvp: true
# Opens containers as a silent read-only replica. false opens the real container: items moved to or from the
# staff inventory are destroyed or minted when the exit overwrite restores the saved inventory.
silent-containers: true
# Vanish: hidden from players without snstaff.vanish.see.
vanish:
# Master toggle of /vanish and the vanish tool.
enabled: true
# Aliases of /vanish. Re-read on /staff reload.
aliases: []
# Shows a VANISH indicator in the action bar while vanished.
actionbar: true
# Opens containers as a silent read-only replica while vanished.
silent-containers: true
# Hides join and quit messages from players who cannot see the vanished player.
hide-join-quit-messages: true
# Hides death messages from players who cannot see the vanished player.
hide-death-messages: true
# Hides advancement messages from players who cannot see the vanished player.
hide-advancements: true
# Stops mobs from targeting a vanished player.
prevent-mob-targeting: true
# Stops pressure plates and sculk sensors from reacting to a vanished player.
prevent-physical-interaction: true
# Stops a vanished player from picking up items, XP and arrows.
prevent-pickup: true
# Stops a vanished player from dealing damage.
prevent-damage-dealt: true
# Excludes a vanished player from the sleeping count.
ignore-sleep: true
# Freeze: immobilizes a player and opens its freeze chat room.
freeze:
# Master toggle of /freeze (freezes, or unfreezes a frozen player), /fc and the freeze tool.
enabled: true
# Aliases of /freeze. Re-read on /staff reload.
aliases: []
# Aliases of /fc (the freeze chat of the staff member who froze). Re-read on /staff reload.
chat-aliases: []
# Commands a frozen player may still run; namespace and slash are ignored.
allowed-commands: [r, reply, m, msg]
# Seconds between reminders sent to a frozen player; 0 disables them; at most 86400.
reminder-seconds: 10
# Puts an ice block on the head of a frozen player.
ice-helmet: true
# Sanction applied when a frozen player leaves the server.
quit-punishment:
# Runs the commands below when a frozen player disconnects.
enabled: false
# Also punishes disconnects caused by a kick.
include-kicks: false
# Console commands run on punishment; {player} is the frozen player. Write [] to run none (a key
# left empty without [] reads as absent).
commands:
- "ban {player} 30d Disconnected while frozen"
# Invsee: read-only live view of a player's inventory.
invsee:
# Master toggle of /invsee and the invsee tool.
enabled: true
# Aliases of /invsee. Re-read on /staff reload.
aliases: []
# Ticks between live refreshes of the open view; 2 to 1200.
refresh-ticks: 10
# Random teleport tool with bot filtering.
random-tp:
# Master toggle of the random teleport tool.
enabled: true
# Worlds whose players are never picked; case-insensitive.
excluded-worlds: []
# How many of the latest targets are skipped on the next pick; 0 remembers none; at most 100.
recent-targets: 3
# Player names never picked; exact names or regex:<pattern> matching the whole name.
excluded-names: []
# Bot detection layers; a player flagged by an enabled layer is never picked.
bot-filter:
# Skips players carrying the NPC metadata (HalosPlayerSpoofer, Citizens).
npc-metadata: true
# Asks the HalosPlayerSpoofer API when it is installed.
halos-api: true
# Skips players with no live entity in their world.
require-entity: true
# Teleport compass tool.
compass:
# Master toggle of the compass tool.
enabled: true
# Maximum blocks of the left-click jump to the looked-at block; 1 to 512.
jump-max-distance: 120
# Maximum blocks searched behind a wall by the right-click pass-through; 1 to 64.
thru-max-distance: 8
# Follow (spectate): the follow tool in staff mode and /follow <player> (snstaff.follow).
follow:
# Master toggle of the follow tool and /follow.
enabled: true
# Aliases of /follow. Re-read on /staff reload.
aliases: []
# Network-wide staff chat.
staff-chat:
# Master toggle of /sc and the chat prefix shortcut.
enabled: true
# Aliases of /sc. Re-read on /staff reload.
aliases: []
# Chat prefix that sends a message to this channel; empty disables the shortcut.
prefix: "#"
# Styling a staff chat message may carry. Click and hover are never allowed, whatever is set here.
style:
# false = messages are plain text only.
enabled: true
# Legacy color codes (&a, &c ...).
allow-legacy-colors: true
# Hex colors (&#RRGGBB).
allow-hex: true
# Bold (&l).
allow-bold: false
# Italic (&o).
allow-italic: false
# Underline (&n).
allow-underline: false
# Strikethrough (&m).
allow-strikethrough: false
# Obfuscated (&k).
allow-obfuscated: false
# Cosmetic MiniMessage tags (colors and decorations only).
allow-minimessage: true
# Gradient forms ([rgb], <gradient>, <rainbow>).
allow-gradient: false
# reject = drop all styling to plain text; strip = remove only the disallowed styling.
on-disallowed: strip
# Network-wide admin chat.
admin-chat:
# Master toggle of /ac and the chat prefix shortcut.
enabled: true
# Aliases of /ac. Re-read on /staff reload.
aliases: []
# Chat prefix that sends a message to this channel; empty disables the shortcut.
prefix: "@"
# Styling an admin chat message may carry. Click and hover are never allowed, whatever is set here.
style:
# false = messages are plain text only.
enabled: true
# Legacy color codes (&a, &c ...).
allow-legacy-colors: true
# Hex colors (&#RRGGBB).
allow-hex: true
# Bold (&l).
allow-bold: false
# Italic (&o).
allow-italic: false
# Underline (&n).
allow-underline: false
# Strikethrough (&m).
allow-strikethrough: false
# Obfuscated (&k).
allow-obfuscated: false
# Cosmetic MiniMessage tags (colors and decorations only).
allow-minimessage: true
# Gradient forms ([rgb], <gradient>, <rainbow>).
allow-gradient: false
# reject = drop all styling to plain text; strip = remove only the disallowed styling.
on-disallowed: strip
# Staff action logging.
logs:
# Master toggle of the logging module.
enabled: true
# Days log rows are kept in the database; 0 keeps them forever; at most 36500.
retention-days: 7
# Entries per page of the in-game log viewer; 1 to 50.
page-size: 10
# Commands whose arguments are masked before storing; namespace and slash are ignored.
sensitive-commands: [login, l, log, register, reg, changepassword, changepass, cp]
# Seconds within which creative item takes are merged into one entry; 1 to 3600.
creative-grouping-seconds: 5
# Characters of an entry's text shown in the in-game log viewer before it is cut with "..."; 10 to 200.
preview-length: 60
# Staff PIN gate.
pin:
# Master toggle of the PIN gate.
enabled: true
# Hours a successful PIN stays valid for the same IP; 0 asks on every login; at most 8760.
session-hours: 24
# Wrong PIN attempts before the lockout; 1 to 100.
max-attempts: 5
# Minutes a locked player stays locked out; 1 to 10080.
lockout-minutes: 15
# Staff statistics.
stats:
# Master toggle of the statistics module.
enabled: true
# Time zone that decides week and month boundaries.
timezone: "America/Argentina/Buenos_Aires"
# Seconds without movement, chat or commands after which a staff member counts as idle; 5 to 86400.
idle-threshold-seconds: 300
# Seconds between activity samples; 5 to 3600.
sample-seconds: 30
# ------------------------------------------------------------
# Integrations. Discord webhooks and third-party plugins.
# ------------------------------------------------------------
# Discord webhooks that receive the staff action log.
webhooks:
# Master toggle of Discord delivery.
enabled: false
# Seconds between webhook batch flushes; 1 to 3600.
flush-seconds: 3
# Maximum buffered entries per webhook before the oldest are dropped; 10 to 10000.
max-buffer: 500
# Name shown as the webhook author.
username: "SnStaff"
# Avatar image URL of the webhook author; empty keeps the webhook default.
avatar-url: ""
# Fallback webhook URL used when no player or rank route matches.
default: ""
# Webhook URL per staff rank; a matching rank wins over the default.
# sn:extensible
ranks:
# Example route: staff with the mod rank post to this URL.
mod: ""
# Webhook URL per player name or UUID; a matching player wins over the rank.
# sn:extensible
players:
# Example route: this player posts to this URL.
pepito123: ""
# Which action types are sent to Discord.
events:
# Commands run by staff.
command: true
# Staff mode enter and exit.
staff-mode: true
# Vanish toggles.
vanish: true
# Freeze and unfreeze actions.
freeze: true
# Inventory views.
invsee: true
# Random teleports.
random-tp: true
# Compass jumps and pass-throughs.
compass: true
# Follow tool use.
follow: true
# Staff chat messages.
staff-chat: true
# Admin chat messages.
admin-chat: true
# Freeze chat messages.
freeze-chat: true
# Gamemode changes.
gamemode: true
# Items taken from the creative inventory.
creative: true
# Network joins, switches and leaves.
connection: true
# Staff rank changes.
rank: true
# PIN events; digits are never sent.
pin: true
# ------------------------------------------------------------
# Feedback. Staff connection notices.
# ------------------------------------------------------------
# Notices sent to staff when another staff member joins, switches, leaves, toggles staff mode or freezes.
notify:
# Master toggle of every staff notice.
enabled: true
# Announces a staff member entering the network.
join: true
# Announces a staff member moving between servers.
switch: true
# Announces a staff member leaving the network.
leave: true
# Announces a staff member entering or leaving staff mode.
staff-mode: true
# Announces a player being frozen or unfrozen, and by whom.
freeze: true
# Staff ranks that are never announced.
hidden-ranks: []items.yml
# ============================================================
# SnStaff - items
# Managed by SnLib: new keys merge in on boot, your values are kept.
# Staff mode tools and the freeze ice block are defined here.
# ============================================================
# Staff mode tools. Each one is handed out in staff mode only while its module is enabled, in
# the hotbar slot given by its "staff-slot" key (0-8, SnStaff's own key). All of them are locked
# (they cannot be moved, dropped or placed) and are removed when staff mode ends. The click
# actions call SnStaff's own action tags; the freeze, invsee and follow tools are used by
# right-clicking a player and need no action line.
# Keys of a tool entry (freeze-ice below documents the shared ones line by line):
# material the item type.
# display-name name shown in the hotbar; lore is the tooltip, one line per entry.
# staff-slot hotbar slot 0-8 where staff mode puts the tool (SnStaff's own key).
# cooldown ticks between two uses (only on tools that have one).
# left-click-actions / right-click-actions action tags run on that click.
# locked pins the item: it cannot be moved or taken off.
# no-drop blocks dropping it.
# placeable / tradeable block placing it as a block / trading it.
# obtain-via COMMAND_ONLY: the item is only ever handed out by SnStaff.
# Teleport compass: left-click jumps to the block you look at, right-click passes through walls.
staff-compass:
material: COMPASS
display-name: "₢f2&lTeleport Compass"
lore:
- "&7Left-click: &fjump to the block you look at"
- "&7Right-click: &fpass through the wall in front"
# Hotbar slot (0-8).
staff-slot: 0
left-click-actions:
- "[snstaff-compass-jump]"
right-click-actions:
- "[snstaff-compass-thru]"
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Random teleport to a player of this server.
staff-randomtp:
material: CLOCK
display-name: "₢f2&lRandom Teleport"
lore:
- "&7Right-click: &fteleport to a random player"
staff-slot: 1
# Ticks between two uses.
cooldown: 10
right-click-actions:
- "[snstaff-randomtp]"
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Freeze tool: right-click a player to freeze or unfreeze them (needs snstaff.freeze).
staff-freeze:
material: PACKED_ICE
display-name: "₢f2&lFreeze"
lore:
- "&7Right-click a player: &ffreeze or unfreeze"
staff-slot: 3
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Vanish tool shown while you are vanished; right-click to become visible (needs snstaff.vanish).
staff-vanish-on:
material: LIME_DYE
display-name: "₢f2&lVanish &8(&aVanished&8)"
lore:
- "&7Right-click: &fbecome visible"
staff-slot: 4
cooldown: 10
right-click-actions:
- "[snstaff-vanish]"
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Vanish tool shown while you are visible; right-click to vanish (needs snstaff.vanish).
staff-vanish-off:
material: GRAY_DYE
display-name: "₢f2&lVanish &8(&7Visible&8)"
lore:
- "&7Right-click: &fvanish"
staff-slot: 4
cooldown: 10
right-click-actions:
- "[snstaff-vanish]"
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Invsee tool: right-click a player to view their inventory (needs snstaff.invsee).
staff-invsee:
material: CHEST
display-name: "₢f2&lInventory Inspector"
lore:
- "&7Right-click a player: &fview their inventory"
staff-slot: 5
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Follow tool: right-click a player to spectate them until you stop.
staff-follow:
material: LEAD
display-name: "₢f2&lFollow"
lore:
- "&7Right-click a player: &ffollow them in spectator"
staff-slot: 7
locked: true
no-drop: true
placeable: false
tradeable: false
obtain-via: COMMAND_ONLY
# Ice block worn on the head of a frozen player (freeze.ice-helmet). SnStaff puts it on and takes
# it off; the real helmet is backed up by SnLib (data/equipment-backup.yml) and returned when the
# freeze ends, even after a crash. Locked: the player cannot move, drop or take it off.
freeze-ice:
# Block shown on the head.
material: ICE
# Name shown when the frozen player hovers the helmet slot.
display-name: "&b&lFrozen"
# Tooltip lines of the helmet.
lore:
- "&7You are frozen by the staff."
- "&7Answer them in chat."
# Enchantment glint.
glow: true
# Pins the item to the helmet slot.
locked: true
# Blocks dropping the item.
no-drop: true
# Blocks placing the item as a block.
placeable: false
# Blocks trading the item.
tradeable: false
# Only SnStaff may hand the item out.
obtain-via: COMMAND_ONLY
lang/messages_en.yml
# ============================================================
# SnStaff - language file (English)
# Managed by SnLib: new keys merge in on boot, your values are kept.
# Restyle any line freely; your edits survive updates.
# ============================================================
# Prefix prepended to every single-line message sent via sn.lang().send(...)
prefix: "₢f2&lSnStaff &8| &7"
# snlib.* holds the shared command lines (usage, errors, help) in SnStaff's style. Any key left
# out falls back to SnLib's neutral default. Placeholders {plugin} {usage} {description} {page}
# {total} {min} {max} {value} {command} {group} {path} are filled by SnLib; never use {prefix} here.
snlib:
no-permission: "&cYou do not have permission to use this command."
usage: "&cUsage: &e{usage}"
invalid-number: "&cInvalid number: &e{value}"
invalid-value: "&cInvalid value: &e{value}"
out-of-range: "&cValue must be between &e{min} &cand &e{max}&c: &e{value}"
number-too-small: "&cValue must be at least &e{min}&c: &e{value}"
player-not-found: "&cPlayer not found: &e{value}"
unknown-subcommand: "&cUnknown subcommand: &e{value}"
reload-done: "&aConfiguration reloaded."
help:
header: "&8&m----------&r ₢f2&l{plugin} &8&m----------"
# Branded no-separator form. SnLib's neutral default is "&e{usage} &7{description}".
entry: "₢f2{usage} &7{description}"
footer: "&7Page &f{page}&7/&f{total} &8- ₢f2/{command} help <page>"
# Own help of a groupHelp() command group (/<cmd> admin <module> help).
group-header: "&8&m----------&r ₢f2&l{group} &8&m----------"
group-footer: "&7Page &f{page}&7/&f{total} &8- ₢f2{path} help <page>"
# SnStaff messages. Never write {prefix} in a value: the prefix above is prepended to every
# single-line message automatically, and a literal {prefix} renders verbatim.
messages:
# Shared lines used by several modules. Each module adds its own sub-section below.
general:
player-only: "&cOnly players can use this command."
# Vanish (/vanish, vanish on join, the vanish tool).
vanish:
# Sent to a player who turned vanish on.
enabled: "&7You are now ₢f2vanished&7. Only staff can see you."
# Sent to a player who turned vanish off.
disabled: "&7You are now &fvisible &7to everyone."
# Sent to a player vanished automatically on join (snstaff.vanish.onjoin).
joined-vanished: "&7You joined ₢f2vanished&7."
# Join line of a vanished player, shown only to players who can see vanished staff.
join-seen: "[noprefix]&8[₢f2V&8] &e{player} joined the game"
# Quit line of a vanished player, shown only to players who can see vanished staff.
quit-seen: "[noprefix]&8[₢f2V&8] &e{player} left the game"
# Tag put before the death and advancement messages of a vanished player, shown only to
# players who can see vanished staff.
seen-tag: "&8[₢f2V&8] "
# Action bar indicator shown to a vanished player (vanish.actionbar).
actionbar: "₢f2&lVANISH &8| &7You are hidden"
# Staff mode (bare /staff, the tool hotbar, crash recovery).
staff-mode:
# Sent once staff mode is on (the inventory is saved).
enabled: "&7Staff mode &aenabled&7. Your inventory is saved."
# Sent once staff mode is off (the inventory is given back).
disabled: "&7Staff mode &cdisabled&7. Your inventory is back."
# The staff mode toggle used while staff-mode.enabled is false (the bare /staff shows the help then).
module-disabled: "&cStaff mode is disabled on this server."
# /staff while the previous switch is still being saved.
busy: "&eYour staff mode is still being saved; try again in a moment."
# /staff while dead.
dead: "&cYou cannot enter staff mode while dead."
# /staff while frozen.
frozen: "&cYou cannot enter staff mode while frozen."
# /staff while the inventory has no room for the cursor item or the crafting grid items (they would drop).
cursor-full: "&cMake room in your inventory for the items on your cursor and in the crafting grid first."
# The inventory could not be saved; staff mode was not enabled and nothing was lost.
enter-failed: "&cYour inventory could not be saved, so staff mode was not enabled. Check the console."
# The saved inventory could not be released; the player stays in staff mode.
exit-failed: "&cYour saved inventory could not be released; you stay in staff mode. Try again."
# Join after a crash: the inventory saved by staff mode was given back.
recovered: "&7Your inventory from an interrupted staff mode session was given back."
# Join after a crash: the saved inventory could not be given back yet (it stays saved).
recover-failed: "&cYour inventory from an interrupted staff mode session could not be given back yet; it stays saved. Rejoin or contact an administrator."
# Staff ranks (/staff admin rank, /staff admin sync). {player} is the target, {rank} the new
# (or current) rank, {from} the previous one; a missing rank shows the status.none word.
ranks:
# Any rank command while ranks.enabled is false.
module-disabled: "&cThe staff ranks module is disabled (ranks.enabled)."
# The typed name never joined the network.
unknown-player: "&cNo player named &e{player} &chas ever joined."
# The database could not be read or written.
failed: "&cCould not update the staff rank of &e{player}&c; check the console."
# The rank was stored but LuckPerms could not apply it (absent, group missing, storage error).
apply-failed: "&eThe rank of &f{player} &eis stored, but LuckPerms could not apply it; check the console."
# rank add: the player is registered at the lowest rank.
added: "&aRegistered &e{player} &aas &e{rank}&a."
# rank promote.
promoted: "&aPromoted &e{player} &afrom &e{from} &ato &e{rank}&a."
# rank demote.
demoted: "&aDemoted &e{player} &afrom &e{from} &ato &e{rank}&a."
# rank remove.
removed: "&aRemoved &e{player} &afrom the staff (was &e{from}&a)."
# rank set.
set: "&aSet the staff rank of &e{player} &ato &e{rank} &7(was {from})&a."
# rank set with the rank the player already holds.
unchanged: "&e{player} &7already holds &e{rank}&7."
# rank add on a player who is already registered.
already-registered: "&e{player} &cis already registered as &e{rank}&c."
# promote, demote or remove on a player who is not registered.
not-registered: "&e{player} &cis not registered staff."
# promote at the top of ranks.order.
already-highest: "&e{player} &calready holds the highest rank (&e{rank}&c)."
# demote at the bottom of ranks.order.
already-lowest: "&e{player} &calready holds the lowest rank (&e{rank}&c); use remove to unregister."
# The stored rank is no longer part of ranks.order.
not-in-order: "&cThe rank &e{rank} &cof &e{player} &cis not in ranks.order; use set."
# ranks.order is empty.
empty-order: "&cranks.order is empty: no staff rank can be assigned."
# rank set with a rank outside ranks.order.
unknown-rank: "&cUnknown staff rank: &e{rank}&c."
# Another plugin cancelled the change through the SnStaff API; nothing was stored.
cancelled: "&cThe rank change was cancelled by another plugin."
# sync <player>.
synced: "&aRe-applied the staff rank of &e{player} &7({rank})&a."
# sync without a player: {count} online players re-applied.
sync-started: "&aRe-applying the staff ranks of &e{count} &aonline players."
# rank list.
list-header: "[noprefix]&8&m----------&r ₢f2&lStaff ranks &8(&f{count}&8) &8&m----------"
list-entry: "[noprefix]&8- &f{player} &8| ₢f2{rank}"
list-empty: "&7No staff is registered."
list-failed: "&cCould not read the staff ranks; check the console."
command-failed: "&cThe rank command failed unexpectedly; check the console."
# Sent to the target player, on the server where they are online.
target-changed: "&7Your staff rank is now ₢f2{rank}&7."
target-removed: "&7You are no longer registered staff."
# Network-wide alert to snstaff.admin.rank holders: an external LuckPerms change was reverted.
# {groups} lists the touched groups, {server} the server where the change was made.
alert-reverted: "&c[!] &7External LuckPerms change to &e{player} &7({groups}) on &e{server} &7reverted to ₢f2{rank}&7."
# Detail stored in the staff log for each change (plain text, colors are stripped).
audit:
added: "rank add {player}: {rank}"
promoted: "rank promote {player}: {from} -> {rank}"
demoted: "rank demote {player}: {from} -> {rank}"
removed: "rank remove {player}: {from}"
set: "rank set {player}: {from} -> {rank}"
reverted: "rank revert {player} ({groups}): {rank}"
# Staff connection notices (a staff member joins the network, moves between servers or leaves it),
# shown to holders of snstaff.notify.see. {player} is the staff member, {server} the server where
# the event happened (joined or left), {from} and {to} the servers of a switch, {rank} the staff
# rank (the status.none word when there is none) and {vanished} the vanished-suffix below (empty
# while the staff member is visible).
notify:
# A staff member entered the network.
join: "[noprefix]&8[&a+&8] &e{player} &7joined the network &8(&f{server}&8){vanished}"
# A staff member moved from one server to another (never announced as a leave plus a join).
switch: "[noprefix]&8[&6~&8] &e{player} &7moved from &f{from} &7to &f{to}{vanished}"
# A staff member left the network.
leave: "[noprefix]&8[&c-&8] &e{player} &7left the network &8(&f{server}&8){vanished}"
# Appended as {vanished} to the notices about a vanished staff member (connection notices about
# them reach only staff who can see vanished players). {state} is the status.vanish-on word.
vanished-suffix: " &8[{state}&8]"
# The staff mode and freeze notices below go to holders of snstaff.staffmode or snstaff.notify.see.
# A staff member entered staff mode. {player} is the staff member, {server} their server.
staff-mode-on: "[noprefix]&8[₢f2Staff&8] &e{player} &7entered staff mode &8(&f{server}&8){vanished}"
# A staff member left staff mode.
staff-mode-off: "[noprefix]&8[₢f2Staff&8] &e{player} &7left staff mode &8(&f{server}&8){vanished}"
# {staff} froze {player}. {staff} is the console word when the console acted.
freeze: "[noprefix]&8[₢f2Staff&8] &e{staff} &7froze &f{player} &8(&f{server}&8){vanished}"
# {staff} unfroze {player}.
unfreeze: "[noprefix]&8[₢f2Staff&8] &e{staff} &7unfroze &f{player} &8(&f{server}&8){vanished}"
# Detail stored in the staff log for each connection (plain text, colors are stripped).
audit:
join: "joined {server}"
switch: "switched from {from} to {to}"
leave: "left {server}"
# Staff chat (/sc, the staff-chat.prefix shortcut and the /sc mode toggle), network-wide for
# holders of snstaff.staffchat whose staff PIN is unlocked. The words help, reload and debug are
# reserved as the FIRST word of /sc (SnLib's own subcommands): to say one of them, start with
# "/sc send help ...". The format line is delivered without the plugin prefix.
staff-chat:
# The line receivers see. {server} is the label of the sender's server, {player} the sender,
# {rank} their staff rank (the status.none word when they have none) and {message} the text,
# styled as allowed by staff-chat.style in config.yml.
format: "&8[₢f2Staff&8] &8[&7{server}&8] &b{rank} &e{player}&8: &f{message}"
# Reply to /sc with no message. {status} is the status.enabled or status.disabled word.
mode: "&7Staff chat mode: {status}&7. While it is enabled, everything you type goes to the staff chat."
# The channel is turned off in config.yml (staff-chat.enabled).
disabled: "&cThe staff chat is disabled (staff-chat.enabled)."
# The sender has not unlocked their staff PIN yet.
locked: "&cUnlock your staff PIN to use the staff chat."
# The message has no visible text (only color codes).
empty: "&cThere is nothing to send to the staff chat."
# Admin chat (/ac, the admin-chat.prefix shortcut and the /ac mode toggle), network-wide for
# holders of snstaff.adminchat whose staff PIN is unlocked. help, reload and debug are reserved
# first words of /ac, as in the staff chat.
admin-chat:
# The line receivers see. Same placeholders as messages.staff-chat.format.
format: "&8[&cAdmin&8] &8[&7{server}&8] &b{rank} &e{player}&8: &f{message}"
# Reply to /ac with no message. {status} is the status.enabled or status.disabled word.
mode: "&7Admin chat mode: {status}&7. While it is enabled, everything you type goes to the admin chat."
# The channel is turned off in config.yml (admin-chat.enabled).
disabled: "&cThe admin chat is disabled (admin-chat.enabled)."
# The sender has not unlocked their staff PIN yet.
locked: "&cUnlock your staff PIN to use the admin chat."
# The message has no visible text (only color codes).
empty: "&cThere is nothing to send to the admin chat."
# Freeze (/freeze toggles, /fc, the freeze tool). {player} is the frozen player, {staff} the
# staff member (the status.console word when the console acted). Every freeze has a chat room:
# the staff member who froze is in it and talks there at once (talk mode), other staff join with
# /fc <player>, and the bare /fc toggles talk mode. Chat text is shown as plain text: colors and
# tags a frozen player types are stripped. help, reload and debug are reserved first words of
# /fc (SnLib's own subcommands): to say one of them, start with "/fc send".
freeze:
# freeze.enabled is false.
module-disabled: "&cFreeze is disabled (freeze.enabled)."
# Sent to the frozen player.
frozen: "&bYou have been frozen by &f{staff}&b. Do not log out and answer the staff in chat."
# Sent to the staff member who froze.
froze: "&aFroze &e{player}&a."
# Sent to the player who is no longer frozen.
unfrozen: "&aYou are no longer frozen."
# Sent to the staff member who unfroze.
unfroze: "&aUnfroze &e{player}&a."
# Freeze on a player who is already frozen.
already-frozen: "&e{player} &cis already frozen."
# /fc on a player who is not frozen.
not-frozen: "&e{player} &cis not frozen."
# The target holds snstaff.freeze.exempt.
exempt: "&e{player} &ccannot be frozen."
# A staff member tried to freeze themselves.
self: "&cYou cannot freeze yourself."
# Repeated to a frozen player every freeze.reminder-seconds.
reminder: "&bYou are frozen. &7Answer the staff in chat and do not log out."
# A frozen player typed a command outside freeze.allowed-commands.
command-blocked: "&cYou cannot use that command while frozen."
# Freeze chat line of the frozen player (shown to them and to the room, or to the local freeze
# staff while nobody is in the room).
chat-player: "[noprefix]&b&lFREEZE &8| &f{player} &8» &7{message}"
# Freeze chat line of a staff member, shown to the frozen player and to the room.
chat-staff: "[noprefix]&b&lFREEZE &8| ₢f2{staff} &8» &f{message}"
# Sent to the staff member who froze: they are in the room and in talk mode.
chat-auto: "&7You are talking in the freeze chat of &f{player}&7: everything you type goes there. Type &e/fc &7to switch it off."
# Talk mode switched with /fc or /fc <player>. {status} is the status.enabled or status.disabled word.
chat-mode: "&7Freeze chat mode with &f{player}&7: {status}&7. While it is enabled, everything you type goes to that freeze chat."
# A staff member joined the room (shown to the frozen player and to the room).
chat-joined: "[noprefix]&b&lFREEZE &8| ₢f2{staff} &7joined the chat."
# The freeze ended, so the room closed (shown to the room).
chat-closed: "&7The freeze chat of &f{player} &7was closed."
# /fc without a player while the sender is in no room.
chat-no-room: "&cYou are in no freeze chat. Join one with &e/fc <player>&c."
# /fc without a player while the sender is in several rooms. {players} lists them.
chat-choose: "&cName the player first: &e{players}"
# /fc with a message that has no visible text.
chat-empty: "&cThere is nothing to send."
# Network-wide copy of a frozen player's line for holders of snstaff.freeze.spy. {server} is
# the server of the freeze.
spy-player: "[noprefix]&8[&bSpy&8] &8[&7{server}&8] &f{player} &8» &7{message}"
# Network-wide copy of an owner's /fc line for holders of snstaff.freeze.spy.
spy-staff: "[noprefix]&8[&bSpy&8] &8[&7{server}&8] ₢f2{staff} &8-> &f{player} &8» &7{message}"
# The last staff member in a room left the server: the player stays frozen and their chat goes
# to the local freeze staff until someone joins.
room-empty: "&e{staff} &7left; nobody is in the freeze chat of &f{player} &7now. Join it with &e/fc {player}&7."
# A frozen player left this server (disconnect, kick or server switch); the freeze ended.
target-left: "&f{player} &7left the server while frozen."
# Same, when freeze.quit-punishment ran its commands.
target-left-punished: "&f{player} &7left the server while frozen; the quit punishment was applied."
# Detail stored in the staff log (plain text, colors are stripped).
audit:
freeze: "freeze {player}"
unfreeze: "unfreeze {player}"
chat-player: "{player} -> {staff}: {message}"
chat-staff: "{staff} -> {player}: {message}"
# Staff mode tools: random teleport, teleport compass and follow (the freeze and invsee tools
# use the freeze and invsee lines).
tools:
# A tool was used while its module is switched off in config.yml.
module-disabled: "&cThis tool is disabled on this server."
random-tp:
# Teleported to a random player of this server.
teleported: "&7Teleported to ₢f2{player}&7."
# Nobody on this server can be picked (staff, vanished, spectators, bots and excluded
# worlds or names are never picked).
no-targets: "&cThere is no player to teleport to."
compass:
# Left-click: no block in sight within compass.jump-max-distance.
no-block: "&cNo block in sight within &f{distance} &cblocks."
# Left-click: no safe 2-block space above the block in sight.
no-landing: "&cThere is no safe place to land there."
# Right-click: no wall in front within compass.thru-max-distance.
no-wall: "&cNo wall in front of you within &f{distance} &cblocks."
# Right-click: a wall, but no free 2-block space behind it within the distance.
no-exit: "&cNo free space behind the wall within &f{distance} &cblocks."
# Follow (the follow tool in staff mode and /follow). Outside staff mode, /follow puts you back
# in your gamemode and location when it ends.
follow:
# Now spectating the player.
started: "&7Following ₢f2{player}&7. Sneak or type &e/follow &7to stop."
# The follow ended (sneak, a bare /follow, the target left, died or changed world).
stopped: "&7You stopped following &f{player}&7."
# Another plugin refused the spectator switch or the camera.
failed: "&cCould not follow &f{player}&c."
# /follow with your own name.
self: "&cYou cannot follow yourself."
# A bare /follow while not following anyone.
not-following: "&cYou are not following anyone. Use &e/follow <player>&c."
# Detail stored in the staff log (plain text, colors are stripped).
audit:
random-tp: "random tp to {player}"
compass-jump: "jump to {world} {x} {y} {z}"
compass-thru: "thru to {world} {x} {y} {z}"
follow-start: "follow {player}"
follow-stop: "stop following {player}"
# Invsee (/invsee, the invsee tool). {player} is the player whose inventory is shown.
invsee:
# /invsee without a player name. {label} is the command as typed.
usage: "&cUsage: &e/{label} <player>"
# guis/invsee.yml is missing or did not load.
unavailable: "&cThe inventory view is not available right now."
# The viewed player quit or changed world, so the view was closed.
closed: "&7The inventory view of &f{player} &7was closed because they left or changed world."
# Detail stored in the staff log (plain text, colors are stripped).
audit: "invsee {player}"
# Silent containers (vanish.silent-containers, staff-mode.protections.silent-containers).
silent:
# A silent view of a container cannot be shown (guis/silent-<rows>.yml is missing or did not load).
unavailable: "&cThe container view is not available right now."
# Ender chests have no read-only replica, so they stay closed instead of opening with sound and animation.
ender-chest: "&cEnder chests cannot be opened silently. Leave vanish and staff mode first."
# Title word of a silent view for a container without a custom name; the key is the block type with
# hyphens. Any type missing here uses "default".
names:
default: "Container"
chest: "Chest"
trapped-chest: "Trapped Chest"
barrel: "Barrel"
shulker-box: "Shulker Box"
furnace: "Furnace"
blast-furnace: "Blast Furnace"
smoker: "Smoker"
hopper: "Hopper"
dropper: "Dropper"
dispenser: "Dispenser"
brewing-stand: "Brewing Stand"
crafter: "Crafter"
# Staff action log (/staff admin logs <staff> [page]) and its Discord copies. {player} is the staff
# member, {page}/{pages} the page and the page count, {total} the number of entries. The text of
# an entry is shown as plain text ({content}): colors and tags inside a logged command are never
# rendered.
logs:
# The logging module is turned off in config.yml (logs.enabled).
module-disabled: "&cThe staff log is disabled (logs.enabled)."
# No player with that name was ever seen.
not-found: "&cNo player named &f{player} &cwas found."
# The staff member has no log entry.
empty: "&7There are no log entries for &f{player}&7."
# The requested page is past the last one.
page-out-of-range: "&cPage &f{page} &cdoes not exist; the log has &f{pages} &cpage(s)."
# The database could not be read.
failed: "&cThe staff log could not be read. Check the console."
# First line of a page.
header: "&7Log of ₢f2{player} &8(&f{total} &7entries, page &f{page}&7/&f{pages}&8)"
# One entry. {time} is the short time (time-format), {type} the type name below, {server} the
# server label, {cancelled} the cancelled-suffix (empty when the action went through) and
# {content} the start of the entry text. Hover the line for the full entry.
entry: "[noprefix]&8{time} &7[{type}&7]{cancelled} &f{content}"
# Hover of an entry. {date} is the full date (date-format), {player} the staff member; the other
# placeholders as in entry, with the FULL text as {content}.
entry-hover:
- "₢f2{type}{cancelled}"
- "&7Date: &f{date}"
- "&7Server: &f{server}"
- "&7Staff: &f{player}"
- "&f{content}"
# Appended as {cancelled} to an action another plugin or a gate blocked.
cancelled-suffix: " &c(blocked)"
# Last line of a page. {previous} and {next} are the buttons below.
footer: "[noprefix]{previous} &8| &7Page &f{page}&7/&f{pages} &8| {next}"
# Clickable buttons. Keep the command in sync with your /staff root if you rename it.
previous: "<click:run_command:'/staff admin logs {player} {page}'><hover:show_text:'&7Page {page}'>₢f2« Previous</hover></click>"
next: "<click:run_command:'/staff admin logs {player} {page}'><hover:show_text:'&7Page {page}'>₢f2Next »</hover></click>"
# Shown instead of a button on the first / last page.
previous-none: "&8« Previous"
next-none: "&8Next »"
# Date patterns (java DateTimeFormatter), in the stats.timezone zone of config.yml.
date-format: "yyyy-MM-dd HH:mm:ss"
time-format: "MM-dd HH:mm"
# Replaces the arguments of the logs.sensitive-commands before anything is stored.
mask: "***"
# Display name of each action type, in the viewer and in Discord.
types:
command: "&fCommand"
staff-mode: "&bStaff mode"
vanish: "&bVanish"
freeze: "&bFreeze"
invsee: "&bInvsee"
random-tp: "&bRandom TP"
compass: "&bCompass"
follow: "&bFollow"
essentials: "&bEssentials"
staff-chat: "&aStaff chat"
admin-chat: "&cAdmin chat"
freeze-chat: "&bFreeze chat"
gamemode: "&eGamemode"
creative: "&eCreative"
connection: "&7Connection"
rank: "&6Rank"
pin: "&6PIN"
# Details of the entries this module writes itself (plain text, colors are stripped).
detail:
# A gamemode change; {from} and {to} are the gamemode names.
gamemode: "{from} -> {to}"
# One item of a creative take group; {amount} and {item} (the item id).
creative-item: "{amount}x {item}"
# Between the items of one creative take group.
creative-separator: ", "
# Discord embeds (plain text: colors are stripped, mentions and markdown are neutralized).
webhook:
# Embed title; {type} is the type name, {player} the staff member.
title: "{type} | {player}"
# Embed footer; {server} is the server label.
footer: "{server}"
# Embed text of a blocked action; {detail} is the entry text.
cancelled: "{detail} (blocked)"
# Message text when the buffer of a webhook overflowed; {count} entries were dropped.
dropped: "{count} log entries were dropped because the webhook buffer was full (webhooks.max-buffer)."
# Staff statistics (/staff stats [staff] [total|week|month]). {player} is the staff member and
# {period} the period name below.
stats:
# The statistics module is turned off in config.yml (stats.enabled).
module-disabled: "&cStaff statistics are disabled (stats.enabled)."
# The console has no statistics of its own; {label} is the typed root command.
console-needs-target: "&cName a staff member: &e/{label} stats <staff> [total|week|month]"
# No player with that name was ever seen.
not-found: "&cNo player named &f{player} &cwas found."
# Nothing is stored for the staff member in that period.
empty: "&7No statistics recorded for &f{player} &8(&f{period}&8)&7."
# The database could not be read.
failed: "&cThe statistics could not be read. Check the console."
# First line of the answer.
header: "&7Statistics of ₢f2{player} &8(&f{period}&8)"
# One line per figure. {value} is the figure; {percent} is the share of the playtime that was active.
logins: "[noprefix]&8- &7Network logins: &f{value}"
playtime: "[noprefix]&8- &7Playtime: &f{value}"
active: "[noprefix]&8- &7Active time: &f{value} &8(&f{percent}%&8)"
messages: "[noprefix]&8- &7Messages: &f{value}"
commands: "[noprefix]&8- &7Commands: &f{value}"
# Period names (plain text, shown in {period}). {key} is the week (2026-W41) or month (2026-10) shown.
periods:
total: "all time"
week: "week {key}"
month: "month {key}"
# Suffixes of the durations, for example 3d 4h 12m 5s (plain text).
units:
day: "d"
hour: "h"
minute: "m"
second: "s"
# Staff PIN (pin.* in config.yml, keypad in guis/pin-keypad.yml). The digits are shown only in
# the keypad title of the player typing them, never logged or sent anywhere. Multi-line values are
# allowed for the disconnect screens (unavailable, locked-out, menu-unavailable).
pin:
# Disconnect screen: the PIN could not be read from the database (fail-closed).
unavailable: "&cYour staff PIN could not be checked right now. Please reconnect in a moment."
# Disconnect / login refusal after too many wrong PINs; {minutes} is the time left.
locked-out: "&cToo many wrong PIN attempts. Try again in &f{minutes} &cminute(s)."
# Disconnect screen: guis/pin-keypad.yml is missing or did not load.
menu-unavailable: "&cThe staff PIN keypad is not available. Contact an administrator."
# A chat message or command of a player who has not entered the PIN yet.
blocked: "&cEnter your staff PIN first."
# The confirmation of a new PIN did not match the first entry.
mismatch: "&cThe two PINs do not match. Choose your PIN again."
# A wrong PIN; {remaining} attempts are left before the lockout.
wrong: "&cWrong PIN. &7Attempts left: &f{remaining}"
# The new PIN was stored and the player is unlocked.
set: "&aYour staff PIN is set. Never share it."
# The PIN was accepted.
unlocked: "&aStaff PIN accepted."
# Unlocked without the keypad by a recent unlock from the same address (pin.session-hours).
session: "&7Staff PIN session restored for this address."
# The new PIN could not be stored.
save-failed: "&cYour PIN could not be saved. Please try again."
# The PIN could not be checked (an internal error); the player may try again.
check-failed: "&cYour PIN could not be checked. Please try again."
# An administrator reset the PIN of the player while online.
reset-notice: "&eYour staff PIN was reset by an administrator. Choose a new one."
# Keypad title start ({stage} in guis/pin-keypad.yml) for each step.
title:
# Typing the existing PIN.
enter: "&cPIN: "
# Choosing a first PIN.
set: "&cSet PIN: "
# Typing the chosen PIN a second time.
confirm: "&cConfirm: "
# One typed digit in the keypad title ({digits} in guis/pin-keypad.yml); {digit} is the digit.
digit-typed: "&a{digit}"
# One missing digit in the keypad title.
digit-empty: "&7_"
# /staff admin pin reset <player>. {player} is the target.
reset:
# Reset done.
done: "&aThe staff PIN of &f{player} &awas reset. They choose a new one on their next unlock."
# The player had no PIN; any stored session was still cleared.
none: "&f{player} &7had no staff PIN. Any stored session was cleared."
# No player with that name was ever seen.
not-found: "&cNo player named &f{player} &cwas found."
# The database could not be written.
failed: "&cThe staff PIN of &f{player} &ccould not be reset. Check the console."
# Details stored in the staff log (plain text, colors are stripped). Never the digits.
audit:
# A first PIN was set.
set: "PIN set"
# The PIN was entered correctly.
unlock: "PIN unlocked"
# A wrong PIN; {attempts} of {max} attempts used.
failed: "wrong PIN ({attempts}/{max})"
# Locked out for {minutes} minutes after {max} wrong PINs.
lockout: "locked out for {minutes} min after {max} wrong PINs"
# The actor reset the PIN of {player}.
reset: "reset the PIN of {player}"
# Short state words. Each is substituted into a {status}, {state} or {value} slot of the
# messages above, of the menus under guis/ and of the PlaceholderAPI output, so a restyle
# here applies everywhere at once. The keys are a fixed set read by name.
status:
# Generic on state of a feature toggle.
enabled: "&aEnabled"
# Generic off state of a feature toggle.
disabled: "&cDisabled"
# Vanish state of a player who is hidden from non-staff.
vanish-on: "&aVanished"
# Vanish state of a player who is visible.
vanish-off: "&7Visible"
# Staff mode state of a player who is in staff mode.
staffmode-on: "&aActive"
# Staff mode state of a player who is not in staff mode.
staffmode-off: "&7Inactive"
# Freeze state of a frozen player.
frozen: "&bFrozen"
# Freeze state of a player who is not frozen.
not-frozen: "&7Not frozen"
# Stand-in for a value that is not set; uncolored so it inherits the line color.
none: "None"
# Stand-in for a name that does not resolve; color codes are stripped on read.
unknown: "Unknown"
# Actor name used where the console triggered an action; color codes are stripped on read.
console: "Console"