Модерация
Баны, временные баны, IP-баны, кики, муты, тюрьма, ваниш и заморозка.
Команды 42#
Примеры#
Закрыть IP, а не ник, и проверить срок#
Альт на том же адресе не должен зайти после бана основного аккаунта. Нужен и вечный IP-бан, и временный.
/banip 203.0.113.10 griefing
/banlist ips
/tempbanip 203.0.113.20 2h proxy
/unbanip 203.0.113.10
В /banip и /tempbanip идёт адрес, не ник: «Steve» не пройдёт isValidIP (ровно 4 октета 0–255). Все онлайн с 203.0.113.10 сразу отключаются шаблоном ipBanMessageFormat. Запись живёт в коллекции ip_bans того же storage.type, что и весь мод; веб-панель пишет туда же через POST /api/moderation/ipban. Временный бан хранит expireTime: isIPBanned на входе и планировщик раз в checkExpiredBansInterval секунд (по умолчанию 300) при autoExpireTempBans: true архивируют его с unbannedBy = null. /banlist ips истечение в строке не печатает — в отличие от /banlist players.
Временный бан игрока и общая история с панелью#
Выдать 30 минут, убедиться, что после истечения зайти можно, а запись не стёрлась — и что панель показывает то же, что игра.
/tempban Steve 30m cheating
/banlist
/modhistory Steve
/unban Steve
Steve кикается tempBanMessageFormat ({reason}, {bannedBy}, {expiry}). UUID резолвится онлайн или из кэша — офлайн-tempban работает, если игрок когда-то заходил. /banlist без аргумента = players и при чтении сам архивирует просроченное. /modhistory читает BanManager.getBanHistory + MuteManager + KickManager + WarnManager — те же коллекции, что GET /api/moderation/bans/{uuid} и публичный lookup. /unban не удаляет документ: active: false, заполняются unbannedBy/unbannedAt. Повторный /ban того же UUID, пока бан active, не накладывается поверх.
Посадить на срок и отличить /jail от /jailfor#
Клетка у спавна, Steve на два часа, Alex строго через отдельную команду. По истечении — автовыпуск без /unjail.
/setjail spawn
/jail Steve spawn 2h griefing
/jailfor Alex spawn 30m
/jaillist
/jailinfo spawn
/setjail spawn без хвоста ставит сферу радиуса defaultSphereRadius (10.0) в ногах, если нет палочной/WE-выделенки. У /jail хвост greedy: слово 2h совпало с regexp срока — посадка timed, expireAt = now+2h, причина griefing. /jailfor без duration в дереве нет. Раз в секунду (20 тиков) и на входе checkJailTimeout снимает истёкших и пишет jail.released_expired. /jaillist печатает сидящих; координаты клетки — /jailinfo. Счётчик maxJailsBeforeTempBan/PermBan (3 и 6 в шаблоне) живёт только в памяти процесса: после рестарта эскалация начинается с нуля, на третий jail той же сессии придёт auto_tempban_notice, на шестой — permban вместо посадки.
Ваниш переживает перезаход, «видеть ваниш» — нет#
Спрятаться, выйти, зайти снова — остаться невидимым. Понять, почему коллега без отдельного тира вас не видит даже с OP.
/vanish
/vanishlist
/unvanish
UUID и число priority пишутся в коллекцию vanishes и поднимаются при старте. onPlayerLeave состояние не чистит; на входе через 1 тик снова шлются пакеты скрытия. vanishOnJoin — отдельный флажок: при true любой с neoessentials.moderation.vanish автоматически ванишится, даже если раньше не прятался (в шаблоне false). Кто видит ваниш: узел neoessentials.vanish.priority. из ряда 1000, 500, 250, 100, 50, 25, 10, 5, 1, проверка hasPermissionStrict — OP и голый neoessentials.* тир не дают. Равный или больший тир видит младшего; тир 0 не видит никого. Карта viewerPriorities (сессионный «see vanished») в DataStore не пишется и ни одна команда её не заполняет: литерала /vanish see в дереве нет.
Мут на час в игре — и почему IP-мут только в панели#
Заглушить онлайн-нарушителя на срок так, чтобы /mutelist, /modhistory и панель показали одну запись. Понять предел команды относительно панели.
/mute Steve 1h spam in chat
/mutelist
/modhistory Steve
/unmute Steve
Steve должен быть онлайн: EntityArgument.player() офлайн не принимает, хотя MuteManager ключует имя в нижнем регистре и переживает рестарт (коллекция mutes). 1h снимается как duration, spam in chat — причина; цель сразу получает target_notification. Чат, /msg и почта режутся isMuted по имени. Панель POST /api/moderation/mute бьёт в тот же MuteManager (duration там в секундах, не «1h»). IP-мут — только POST /api/moderation/ipmute → коллекция ip_mutes: игровой команды нет, и ChatMuteGuard isIPMuted не вызывает, так что IP-мут сам по себе чат не глушит. /unmute снова требует онлайн-цель.
Тонкие места#
Одна витрина наказаний: игра и панель#
BanManager, MuteManager, KickManager, WarnManager, NoteManager, ReportManager, JailManager, FreezeManager, VanishManager пишут в коллекции player_bans, ip_bans, mutes, ip_mutes, kicks, warns, notes, reports, jails, jail_locations, freezes, vanishes активного storage.type. ModerationEndpoint и PublicModerationEndpoint вызывают те же методы, что команды, а не отдельную таблицу. Исключение по единицам времени: тело панели передаёт duration в секундах (durationSeconds * 1000), в игре — токены 30m/2h. duration: -1 в POST /api/moderation/ban = вечный бан.
Что делать: После бана из панели смотрите /banlist и /modhistory <player> — это не «другая база». Не путайте секунды API с суффиксами команд.
Срок бана: что снимает его само#
expireTime > 0 && now > expireTime — истёк. Для игроков /banlist (players), isPlayerBanned на входе и планировщик checkExpiredBansInterval архивируют запись (unbannedBy пустой). Для IP планировщик и isIPBanned на входе делают то же, но /banlist ips отдаёт сырую карту и может показать уже мёртвый temp-бан до следующего тика очистки. autoExpireTempBans: false оставляет ключ в карте, проверки возвращают «не забанен», архива нет. parseDuration понимает s/m/h/d/w/mo/y; у /tempban* аргумент word, пробельный «1h 30m» в дерево не влезет; «1h30m» как одно слово станет 130 минутами (цифры склеиваются, суффикс hm падает в default = минуты).
Что делать: Для составного срока пишите одно слово с одной единицей или несколько через запятую без пробела-разделителя аргументов. Не ждите, что /banlist ips мгновенно спрячет истекшее — смотрите вход или подождите интервал.
/mute, /unmute, /mutelist закрыты узлом и бьют только по онлайну#
Корень трёх команд закрыт neoessentials.chat.mute: без выдачи их нет в дереве и в tab-complete (консоль проходит). <target> — EntityArgument.player(), офлайн нельзя ни выдать, ни снять, хотя запись в mutes переживает рестарт. /mute регистрируется всегда (плюс literal silence); /unmute и /mutelist не вешаются, если чат или их флаг в commands выключены. Срок в первом слове greedy: regexp без mo/y, поэтому /mute Steve 1mo воспримет 1mo как причину, не как месяц.
Что делать: Модераторам выдайте neoessentials.chat.mute. Офлайн-мут — POST /api/moderation/mute по имени.
Ваниш в vanishes, приоритет зрителя — только сессия и без команды#
Исчезнувший UUID+priority персистятся. viewerPriorities (режим «see vanished») специально не пишется и с легаси-файла не мигрируется. enableSeeVanished / toggleSeeVanished в менеджере есть, из Brigadier их никто не зовёт — /vanish see нет. Реальный просмотр: neoessentials.vanish.priority.<tier> через hasPermissionStrict (не OP-bypass, не голый neoessentials.*). Тир 0 не видит ваниш. vanishOnJoin ванишит вход штаба с neoessentials.moderation.vanish, это не то же самое, что восстановление уже записанного vanishes.
Что делать: Штабу, который должен видеть коллег, выдайте конкретный neoessentials.vanish.priority.50 (или выше цели). Не рассчитывайте, что OP сам по себе видит ваниш.
Срок тюрьмы и автоэскалация#
expireAt в коллекции jails. Проверка каждую секунду у онлайн и на логине; офлайн сидит до входа, даже если часы вышли, пока checkJailTimeout не отработает. /jail <p> <jail> 2h reason и /jailfor пишут один и тот же путь. Счётчик повторных посадок (jailCounts) не сериализуется: /neoe reload/рестарт обнуляет его, зато внутри аптайма 3-я посадка (шаблон maxJailsBeforeTempBan) даёт temp-бан tempBanDurationMinutes (1440), 6-я — вечный бан System / «Exceeded maximum jailings», посадка не создаётся, вызывающему уходит auto_*ban_notice. Perm-проверка идёт первой: если оба порога равны, temp-ветка мертва.
Что делать: Держите maxJailsBeforePermBan строго выше temp. Для тестов /jail на одном аккаунте либо поднимите пороги, либо рестартуйте, чтобы счётчик сбросился.
/jaillist — не список клеток; /deljail не выпускает#
executeJailList печатает getAllJailedPlayers(). Локации — /jailinfo без аргумента. /jails — тот же список сидящих. /deljail удаляет jail_locations, сидящие остаются в jails: движение больше не возвращает в клетку (canPlayerMove true, если локации нет), ломание/атака всё ещё режутся по isPlayerJailed. На следующем входе без локации игрока снимут автоматически.
Что делать: Перед сносом клетки пройдите /jaillist и /unjail. Координаты клеток смотрите /jailinfo, не /jaillist.
Кто резолвится офлайн, а кто нет#
/ban//tempban//jail//report//modhistory — онлайн, затем кэш профилей. /warn//note — онлайн, затем только уже лежащие warns/notes: первого варна или note человеку, который не в игре и без истории, не будет, даже если он в кэше. /freeze//vanish//kick//mute//togglejail — только онлайн. /unfreeze сначала смотрит freeze-список (офлайн можно разморозить).
Что делать: Первый /warn//note — пока цель в игре, либо сразу через панель (она резолвит имя своими правилами).
/banip не принимает ник и не принимает IPv6#
Игровой isValidIP — только dotted IPv4. Панель перед BanManager/MuteManager пропускает и IPv6. Забанить «IP игрока», подставив ник в /banip, нельзя: будет invalid_ip. Кик по IP сравнивает строку getPlayerIP как есть.
Что делать: Адрес берите из лога входа или из панели. IPv6-бан — только dashboard /api/moderation/ipban.
Замороженный не пишет в чат; ваниш глушит звук шагов#
ChatHandler отменяет чат, если FreezeManager.isPlayerFrozen. Ваниш ставит setSilent(true) — шаги не слышны соседям. Freeze переживает рестарт (freezes) и на входе шлёт reminder; позиция заморозки дописывается, если была пуста.
Что делать: Ничего чинить не нужно; если «не пишет» после /freeze — так и задумано, не путать с мутом.
Известные проблемы#
IP-мут из панели не закрывает чат#
MuteManager.muteIP / коллекция ip_mutes / маршруты /api/moderation/ipmute существуют, isIPMuted объявлен. ChatMuteGuard и ChatHandler проверяют только isMuted по имени игрока; вызовов isIPMuted в моде больше нет. Игровой команды IP-мута тоже нет. Запись в хранилище появляется, чат, /msg и почта идут как обычно.
Что делать: Глушите имя через /mute или POST /api/moderation/mute. IP-бан (/banip) по-прежнему не пускает на сервер — это другой механизм.
Штабной пинг /report не локализуется#
/modhistory использует локализованные строки и спокойный формат с причиной, выдавшим и датой. После /report онлайн с neoessentials.moderation.reports всё ещё получают сырую строку [Report] <nick> reported <nick>: <reason>, минуя lang.
Что делать: Историю наказаний смотрите через /modhistory <player>. Для пинга новых жалоб используйте панель, если нужен русскоязычный интерфейс.
Права 41#
Подробное руководство#
Раздел ниже — исходная документация проекта (docs/Wiki/ModerationSystem.md). Ссылки на другие страницы вики переписаны на этот сайт; текст самих руководств не редактируется, чтобы синк с апстримом не давал конфликтов.
Version: 1.0.5+build.54 · Config: config.json → moderation / storage sections
Overview#
Comprehensive player moderation — ban, temp-ban, IP ban, kick, mute (with IP mutes), jail (timed), freeze, vanish, warnings, staff notes, and player reports — all with persistent storage, full history/audit trails, permission integration, and event enforcement.
Bans, mutes, kicks, warnings, notes, and reports are backed by a single canonical store per feature (see Storage Backend below) — there is exactly one code path that enforces each punishment, and the Web Dashboard's moderation API reads and writes through the same managers, so in-game commands and dashboard actions always agree.
Bans#
Commands#
| Command |
Syntax |
Permission |
Description |
/ban |
/ban <player> [reason] |
neoessentials.moderation.ban |
Permanently ban a player |
/tempban |
/tempban <player> <duration> [reason] |
neoessentials.moderation.tempban |
Temporarily ban (e.g. 30m, 2h, 1d) |
/unban |
/unban <player> |
neoessentials.moderation.unban |
Unban a player |
/banip |
/banip <ip> [reason] |
neoessentials.moderation.banip |
Ban an IP address (takes the IP directly, not a player name) |
/tempbanip |
/tempbanip <ip> <duration> [reason] |
neoessentials.moderation.tempbanip |
Temporarily ban an IP |
/unbanip |
/unbanip <ip> |
neoessentials.moderation.unbanip |
Unban an IP |
/banlist |
/banlist [players\|ips] |
neoessentials.moderation.banlist |
View active bans (defaults to players) |
Duration format: 30s · 5m · 2h · 1d · 1w
History & Audit Trail#
Every ban (player and IP) is stored with a unique ID, an active flag, optional evidence, and — once lifted — who unbanned it and when (unbannedBy / unbannedAt). Expired temp-bans are archived the same way (auto-marked inactive, no "unbanned by" staff member). Unbanning and re-banning a player never destroys their prior ban records; they remain queryable as history via the dashboard's /api/moderation/bans/{uuid} and /api/moderation/ipbans routes (see Web Dashboard).
Moderation History#
| Command |
Syntax |
Permission |
Description |
/modhistory |
/modhistory <player> |
neoessentials.moderation.history |
View a player's full moderation history — bans, mutes, kicks, and warns — in one summary |
/history |
alias for /modhistory |
same |
Alias |
Kicks#
| Command |
Syntax |
Permission |
Description |
/kick |
/kick <player> [reason] |
neoessentials.moderation.kick |
Kick a player |
/kickall |
/kickall [reason] |
neoessentials.moderation.kickall |
Kick all players |
Every kick (including dashboard-initiated kicks) is recorded with a timestamp, reason, and issuing staff member, and is queryable as history via the dashboard's /api/moderation/kicks / /api/moderation/kicks/{name} routes — there is no in-game command to view kick history.
Mutes#
| Command |
Syntax |
Permission |
Description |
/mute |
/mute <player> [reason] |
neoessentials.chat.mute |
Mute a player (indefinite) |
/silence |
alias for /mute |
same |
Alias |
/unmute |
/unmute <player> |
neoessentials.chat.mute |
Unmute a player |
/mutelist |
/mutelist |
neoessentials.chat.mute |
List muted players |
Muted players cannot chat, send private messages, or send mail. The mute system is implemented in the chat module (com.zerog.neoessentials.chat), not the moderation module — all three commands share the single neoessentials.chat.mute permission (there's no separate exempt/list/unmute node), plus neoessentials.chat.mute.exempt to make a player un-mutable.
⚠️ Unlike every other moderation command, /mute//unmute//mutelist have no root
permission gate at registration — neoessentials.chat.mute is only checked deep inside the
command body, not at the point Brigadier registers the command. This means all three are
visible to every player in /help and can be attempted by anyone, though the body-level
check should still reject an unauthorized caller — worth verifying directly if you rely on
this restriction, rather than assuming registration-time enforcement like most other commands.
Like bans, every mute tracks reason, issuing staff member, an active flag, and — once lifted — unmutedBy / unmutedAt, with full history preserved. IP mutes are also supported (mute an IP directly rather than a player name) — currently exposed via the dashboard's /api/moderation/ipmute / /api/moderation/ipmutes routes rather than an in-game command.
Jail#
Jail teleports the player to a set jail location and blocks movement, interaction, combat, and teleport until released.
Commands#
| Command |
Syntax |
Permission |
Description |
/jail |
/jail <player> <jail> [duration] [reason] |
neoessentials.moderation.jail |
Jail permanently or for a set duration |
/jailfor |
/jailfor <player> <jail> <duration> [reason] |
neoessentials.moderation.jail.timed or neoessentials.moderation.jail |
Jail for a set duration |
/unjail |
/unjail <player> |
neoessentials.moderation.unjail |
Release a player from jail |
/setjail |
/setjail <name> (auto-detect shape) · /setjail <name> sphere <radius> · /setjail <name> cuboid |
neoessentials.moderation.setjail |
Create a jail location — see Jail Region Shapes below |
/deljail |
/deljail <name> |
neoessentials.moderation.setjail |
Delete a jail location (same permission as /setjail) |
/jailwand |
/jailwand |
neoessentials.jail.wand |
Give yourself the jail-region selection wand |
/jaillist |
/jaillist |
neoessentials.moderation.jaillist |
List all jail locations |
/jailinfo |
/jailinfo [name] |
neoessentials.moderation.jailinfo |
Show info for one jail, or all jails if no name given |
/jails |
alias for /jaillist |
same |
Alias |
/togglejail |
/togglejail <player> |
neoessentials.moderation.jail |
Toggle jail on/off for a player |
Jail Region Shapes#
A jail location can be either a sphere (radius around a point) or a cuboid (two-corner box):
/setjail <name> — auto-detects: uses a wand or WorldEdit cuboid selection if one is active, otherwise falls back to a sphere at your current position using moderation.jailSettings.defaultSphereRadius.
/setjail <name> sphere <radius> — explicit sphere at your current position.
/setjail <name> cuboid — cuboid from the current wand/WorldEdit selection.
/jailwand gives an item (configurable via moderation.jailSettings.wandItem) — right-click sets corner 1, left-click sets corner 2, then run /setjail <name> cuboid.
Jail Enforcement#
While jailed, the following are blocked:
- Movement outside jail radius
- Teleport commands (redirected back to jail on respawn too)
- Breaking/placing blocks (unless neoessentials.jail.allow-break / allow-place)
- Interactions (unless neoessentials.jail.allow-interact)
- Attacking entities (unless neoessentials.jail.allow-attack)
Timed jails auto-release when the duration expires (checked every second and on login).
Durations use s, m, h, d, or w, for example /jail Steve spawn-jail 2h griefing.
Freeze#
| Command |
Syntax |
Permission |
Description |
/freeze |
/freeze <player> [reason] |
neoessentials.moderation.freeze |
Freeze a player in place |
/unfreeze |
/unfreeze <player> |
neoessentials.moderation.unfreeze |
Unfreeze a player |
/freezeall |
/freezeall |
neoessentials.moderation.freezeall |
Freeze all online players |
/unfreezeall |
/unfreezeall |
neoessentials.moderation.unfreezeall |
Unfreeze all players |
/freezelist |
/freezelist |
neoessentials.moderation.freezelist |
List frozen players |
Vanish#
| Command |
Syntax |
Permission |
Description |
/vanish |
/vanish [player] |
neoessentials.moderation.vanish (self) + neoessentials.moderation.vanish.others (targeting another player) |
Toggle vanish for yourself or another |
/v |
alias |
same |
Alias |
/unvanish |
/unvanish [player] |
same as above |
Force-disable vanish |
/vanishlist |
/vanishlist |
neoessentials.moderation.vanishlist |
List vanished players |
Broadcasting vanish toggles to staff/everyone and console logging are all config-driven (moderation.vanishSettings.broadcastToStaffVanish, etc. — see below).
Warnings#
| Command |
Syntax |
Permission |
Description |
/warn |
/warn <player> [reason] |
neoessentials.moderation.warn |
Issue a warning to a player |
/warnings |
/warnings <player> |
neoessentials.moderation.warnings |
View a player's warnings and total count |
/clearwarnings |
/clearwarnings <player> |
neoessentials.moderation.warn |
Clear all warnings for a player |
/removewarn |
/removewarn <player> <warnId> |
neoessentials.moderation.warn |
Remove a single warning by its ID (accepts the short 8-char ID prefix) |
Warnings persist for offline players and are shown with a truncated ID, timestamp, reason, and issuing staff member.
Staff Notes#
Freeform notes staff can leave on a player's record — for context that isn't a punishment (e.g. "watch this player, borderline behavior last week").
| Command |
Syntax |
Permission |
Description |
/note |
/note <player> <text> |
neoessentials.moderation.note |
Add a note to a player's record |
/notes |
/notes <player> |
neoessentials.moderation.notes |
View a player's notes (paginated, 5 per page) |
/removenote |
/removenote <player> <noteId> |
neoessentials.moderation.note |
Remove a note by ID (accepts the short 8-char prefix) |
Notes persist for offline players and record author, timestamp, and text. Also available via the dashboard's /api/moderation/notes/{name} and /api/moderation/note routes.
Player Reports#
Lets players flag misbehavior even while no staff are online — reports persist and show up in the review queue whenever staff next check.
| Command |
Syntax |
Permission |
Description |
/report |
/report <player> <reason> |
neoessentials.moderation.report |
Report a player (default: granted to everyone) |
/reports |
/reports |
neoessentials.moderation.reports |
Staff: view the pending review queue (8 per page) |
/reviewreport |
/reviewreport <id> <accept\|dismiss> [notes] |
neoessentials.moderation.reports |
Staff: resolve a report, optionally with review notes |
Submitting a report also immediately notifies any online staff with neoessentials.moderation.reports, in addition to persisting for later review. Reports track reporter, target, reason, timestamp, and status (PENDING / REVIEWED / DISMISSED) plus who reviewed it and when. Also available via the dashboard's /api/moderation/reports, /api/moderation/reports/all, /api/moderation/reports/{id}, and /api/moderation/reports/{id}/review routes.
Data Files & Storage Backend#
Bans, mutes (including IP mutes), kicks, warnings, notes, and reports are persisted through a pluggable DataStore abstraction rather than bespoke JSON files — configured under config.json → storage:
"storage": {
"type": "json",
"autoMigrate": true,
"sqlite": { "file": "data.db" },
"mysql": { "host": "localhost", "port": 3306, "database": "neoessentials", "username": "neoessentials", "password": "", "useSSL": false, "poolSize": 10 }
}
| Key |
Default |
Description |
type |
"json" |
Backend to use: json, yaml, sqlite, or mysql |
autoMigrate |
true |
On first boot with an empty store, import each manager's existing legacy JSON data automatically and losslessly |
sqlite.file |
"data.db" |
SQLite database filename (under neoessentials/store/) |
mysql.* |
— |
Connection details for a shared MySQL database — point every server in a network at the same database to share bans/mutes/etc. in real time |
Each punishment type is one collection (a schema-less table of JSON documents keyed by ID):
| Collection |
Contents |
player_bans |
Player bans — active and historical, with unban audit trail |
ip_bans |
IP bans — active and historical, with unban audit trail |
mutes |
Player mutes — active and historical, with unmute audit trail |
ip_mutes |
IP mutes — active and historical |
kicks |
Kick history |
warns |
Warnings |
notes |
Staff notes |
reports |
Player reports |
jails / jail_locations |
Active jail state / named jail locations |
freezes / vanishes |
Frozen player state / vanish state |
With the default json backend, collections live at neoessentials/store/<collection>.json. With yaml, neoessentials/store/<collection>.yml. With sqlite, all collections live as tables in neoessentials/store/data.db. With mysql, all collections live as tables in the configured database. If MySQL is unreachable at boot, the mod automatically falls back to the JSON backend rather than failing to start.
As of this release, storage.type covers the entire mod, not just moderation — economy, homes/warps/spawn, kits, chat (AFK/ignore/chat-format), holograms, shops, permissions (including group inheritance), the dashboard's own accounts, and the Auction House are all backed by the same DataStore system now. See Storage Backend for the complete collection list and per-system breakdown.
Config (config.json → moderation)#
Settings are nested under per-feature sub-objects, not flat keys directly under moderation.
moderation.banSettings#
| Key |
Default |
Description |
broadcastBans |
false |
Announce bans to all players |
logBanActions |
— |
Log ban details to console |
defaultBanReason |
(built-in default) |
Reason used when none is given |
maxBanReason |
— |
Max reason length |
enableIPBans |
— |
Enable/disable IP bans |
enablePermanentBans |
— |
Enable/disable permanent (non-timed) bans |
enableTempBans |
— |
Enable/disable temp bans |
autoExpireTempBans |
— |
Automatically lift temp bans when they expire |
checkExpiredBansInterval |
— |
How often (seconds) to check for expired temp bans |
banMessageFormat / tempBanMessageFormat / ipBanMessageFormat |
— |
Disconnect screen message templates |
moderation.kickSettings#
| Key |
Default |
Description |
enableKickSystem |
true |
Enable/disable the kick system |
broadcastKicks |
false |
Announce kicks to all players |
logKickActions |
true |
Log kick details to console |
notifyStaffOnKick |
true |
Notify staff (players with neoessentials.moderation.notifications) on kick, independent of broadcastKicks |
kickMessage |
"You have been kicked from the server.\nReason: {reason}\nKicked by: {kicker}" |
Default kick screen message |
kickAllMessage |
"Server maintenance in progress. Please reconnect in a few minutes." |
/kickall screen message |
defaultKickReason |
"Kicked by an operator" |
Reason used when none is given |
maxKickReason |
500 |
Max reason length |
moderation.freezeSettings#
| Key |
Default |
Description |
enableFreezeSystem |
true |
Enable/disable the freeze system |
defaultFreezeReason |
"Frozen by an operator" |
Reason used when none is given |
maxFreezeReason |
500 |
Max reason length |
freezeMessage / unfreezeMessage |
— |
Message templates sent to the frozen/unfrozen player ({reason}, {freezer} / {unfreezer}) |
freezeReminder |
— |
Periodic reminder message shown while frozen |
freezeReminderInterval |
30 |
Seconds between freeze reminders |
logFreezeActions |
true |
Log freeze/unfreeze to console |
freezeOnLogin |
true |
Re-apply freeze if a frozen player logs back in |
preventCommands |
true |
Block command use while frozen |
allowedCommands |
[] |
Commands still allowed while frozen |
moderation.vanishSettings#
| Key |
Default |
Description |
enableVanishSystem |
— |
Enable/disable the vanish system |
preventInteraction |
true |
Block interactions while vanished |
broadcastToStaffVanish |
false |
Announce vanish toggles to staff |
BroadcastToAllVanish |
— |
Announce vanish toggles to all players (note the config's mixed-case key) |
hideFromTabList |
— |
Hide vanished players from the tab list |
vanishOnJoin |
— |
Re-apply vanish if a vanished player logs back in |
logVanishActions |
— |
Log vanish/unvanish to console |
moderation.jailSettings#
| Key |
Default |
Description |
defaultJailReason |
— |
Reason used for /jail when none is given |
logJailActions |
— |
Log jail/unjail to console |
preventJailEscape |
— |
Block movement out of the jail region |
jailMessageFormat |
— |
Message template shown to the jailed player |
wandItem |
— |
Item ID used as the jail-region selection wand (given by /jailwand) |
defaultSphereRadius |
— |
Radius used by /setjail <name> auto-detect and /setjail <name> sphere when no explicit radius is given |
maxJailsBeforeTempBan |
— |
Number of times a player can be jailed before an automatic temp-ban escalation |
Notes & Reports Permissions#
| Node |
Default |
Description |
neoessentials.moderation.note |
🔒 |
Add/remove staff notes (/note, /removenote) |
neoessentials.moderation.notes |
🔒 |
View a player's staff notes (/notes) |
neoessentials.moderation.report |
✅ granted |
Submit a player report (/report) |
neoessentials.moderation.reports |
🔒 |
View and review the report queue (/reports, /reviewreport) |
Back to Wiki Home