RE:NODE

Руководства15 мин чтения

Unturned: Commands.dat и плагины RocketMod простыми словами

Все команды сервера Unturned, что относится к Commands.dat, а что к консоли, и установка RocketMod (LDM): группы прав, cooldown, плагины и OpenMod.

1 прочтений

В Unturned одна система команд и три способа до неё добраться: строка в Commands.dat, строка в консоли сервера или строка в чате от администратора с / или @ впереди. Какой из трёх способов подойдёт для конкретной команды, определяется не произвольно - каждая команда отнесена к одной из категорий: на этапе загрузки, во время работы или и то и другое, а некоторые вдобавок требуют включённых читов. Разберитесь с этой классификацией, и большая часть путаницы вокруг администрирования Unturned исчезнет. Вторая половина дела - RocketMod, который добавляет собственную параллельную систему команд со своим файлом прав и заодно тихо закрывает самое досадное упущение ванильного сервера: в нём есть автосохранение, а в базовой игре его нет.

Как Unturned читает команду#

Регистр в командах не важен. Если у команды несколько параметров, они разделяются косой чертой, что поначалу выглядит странно: ban 76561198012345678/Cheating/86400 - это имя, причина и срок, а не путь к файлу.

Где можно выполнить команду, зависит от её категории:

  • Config. Читается только при загрузке, из Commands.dat. Сюда относятся Map, Port, Owner, Cheats, PvE и Password. Если ввести их в работающую консоль, толку не будет.
  • Runtime. Работают только пока сервер запущен: kick, ban, teleport, say, day, weather.
  • Any. Работают в обоих местах. MaxPlayers, Name, Welcome, Save и Shutdown можно записать в Commands.dat или ввести на лету.
  • Runtime cheat. Работают во время работы сервера и только если в Commands.dat есть Cheats: give, vehicle, animal, experience.

Commands.dat лежит по пути Servers/<ServerID>/Server/Commands.dat, по одной команде на строку, и читается один раз при запуске сервера. Строки, начинающиеся с //, - комментарии. Игровые числа - шансы лута, здоровье зомби, респавн техники - находятся не здесь, а в отдельном конфиге сложности, о котором рассказано в руководстве по настройке сервера Unturned. Commands.dat определяет, чем является сервер. Конфиг определяет, как в него играется.

Commands.dat: всё, что можно задать при запуске#

Команды только для конфига - те, что обязаны стоять в файле, потому что больше им негде быть:

КомандаПо умолчаниюЧто делает
MapPEIВнутреннее имя уровня. Если такого имени нет, молча загружается PEI
Port27015Порт запросов. Игровой трафик всегда идёт на порт на единицу больше
Owner-SteamID64 с постоянными правами администратора
Password-Пароль для входа, хранится только как хеш SHA-1
ModeNormalEasy, Normal или Hard; выбирает, какой блок конфига применяется
PvEвыкл.Если строка есть, бой игроков друг с другом отключён
Perspective-First, Third, Both или Vehicle
Cheatsвыкл.Если строка есть, администраторам доступны команды-читы
Filterвыкл.Отклоняет игроков с именами не на английском и не из букв и цифр
Goldвыкл.Зайти на сервер могут только владельцы Gold Upgrade
Whitelistedвыкл.Зайти на сервер могут только допущенные игроки
Hide_Adminsвыкл.Скрывает метки администраторов от игроков
GSLT-Game Server Login Token
Bind0.0.0.0Привязка к одному внутреннему адресу вместо всех сразу
GameMode-Имя класса пользовательского игрового режима
Syncвыкл.Позволяет игрокам переносить сохранения между вашими серверами

И те, что работают и в файле, и вживую в консоли:

КомандаПо умолчаниюДиапазонЧто делает
NameUnturned5-50 симв.Название сервера в браузере серверов
MaxPlayers81-200Число слотов
Queue_Size-0-64Сколько игроков могут ждать свободного слота
Timeout75050-10000Максимальный пинг в миллисекундах до кика
Chatrate0.250-60Сколько секунд игрок должен ждать между сообщениями в чате
Cycle3600-Длительность одного цикла дня и ночи в секундах
Welcome--Text/R/G/B, показывается при входе
LogN/N/N/N-Chat/Join-Leave/Death/Anticheat, каждое значение Y или N
Loadout--SkillsetID/ItemID/ItemID...; skillset 255 означает все
Votifyвыкл.-Allowed/PassCooldown/FailCooldown/Duration/Percentage/Players

Рабочий файл для небольшого сервера выживания, с комментариями, которые игра сама допускает:

Servers/MyServer/Server/Commands.dat
// identityName Thursday SurvivalOwner 76561198012345678Welcome Rules are in Discord. No offline raiding./255/200/0// worldMap WashingtonMode NormalPerspective BothMaxPlayers 24Queue_Size 8Cycle 3600// connectionPort 27015Timeout 400Chatrate 1.0FilterLog Y/Y/Y/Y// listingGSLT 0123456789ABCDEF0123456789ABCDEF

На четыре пункта из этого файла стоит посмотреть повнимательнее. Timeout - вовсе не таймаут, а максимальный пинг, и значение 750 достаточно щедрое, чтобы игрок на другом конце света оставался на сервере, заметно лагая для всех вокруг. Снижение до 400 на региональном сервере - реальное улучшение качества и решение непопулярное.

Log Y/Y/Y/Y включает логирование чата, входов и выходов, смертей и античита, а по умолчанию оно выключено. Включите его заранее, потому что в тот момент, когда вы захотите узнать, кто взорвал базу, логи либо есть, либо их нет. О том, что хранить и как долго, рассказано в статье логи, которые стоит хранить.

Про Password стоит сказать отдельно: игра хранит его как хеш SHA-1, поэтому считайте его ключом от двери для компании друзей и никогда не используйте пароль, который вы применяете где-либо ещё.

Port занимает два подряд идущих порта: 27015 для запросов и 27016 для игрового трафика. Второй сервер на той же машине означает Port 27017, а не 27016, иначе они столкнутся. Общий вид этой ловушки описан в статье порты игрового сервера. Строка GSLT - это учётные данные, которые вы создаёте сами для app id Unturned 304930; в статье токены Steam для игровых серверов объяснено, что это такое, кто может его создать и за что его блокируют.

Команды времени работы: модерация, читы и консоль#

Их вводят в консоли сервера или в чате от администратора с / или @ впереди. Набор для модерации:

КомандаСинтаксисДействие
admin<SteamID or Player>Выдать права администратора
unadmin<SteamID or Player>Забрать их
kick<Player>/<Reason>Отключить игрока
ban<Player>/<Reason>/<Duration>Забанить; пустой срок означает 31536000 секунд
unban<SteamID>Снять бан
bansВывести список банов
slay<Player>/<Reason>Убить и забанить за один шаг
kill<Player>Убить без бана
permit<SteamID>/<Tag>Добавить в список допущенных
unpermit<SteamID>Убрать из него
permitsВывести список допущенных
playersКто сейчас на сервере
spy<Player>Запросить скриншот, сохраняется как Spy.jpg
investigate<Player>Вывести SteamID64 игрока

Набор для мира и хозяйственных нужд:

КомандаСинтаксисДействие
saveНемедленно выполнить полноценное сохранение
shutdown<Delay>/<Explanation>Сохранить, отключить всех, остановиться
say<Text>/<R>/<G>/<B>Сообщение в чат для всех; по умолчанию зелёное
day / nightПерескочить время суток
time<Seconds>Установить точный момент цикла
weather<None or Storm or Blizzard or GUID>Принудительно задать погоду
airdropНемедленно вызвать десантный корабль
teleport<Player>/<Player, place, wp or bed>Переместить игрока
debugВывести состояние сервера в консоль
modulesСписок загруженных модулей, удобно для проверки, что Rocket загрузился
help[Command]Список команд или пояснение к одной из них

И набор читов, для которого в Commands.dat должна стоять строка Cheats: give, vehicle, animal, experience, reputation, flag, quest. Оставить Cheats включённым на публичном сервере - это решение, а не недосмотр: каждый администратор сможет создавать что угодно, а единственной записью об этом будет то, что вы выставили в Log.

Про save стоит сказать особо: в ванильном сервере нет автосохранения вообще. Ничто не записывает постройки, технику и инвентари игроков на диск по таймеру. shutdown сохраняет; принудительное завершение, сбой или остановка из-за нехватки памяти - нет. Пока вы не установите RocketMod, в котором автосохранение есть, запланированный save - единственное, что стоит между вашим сервером и потерянной неделей.

Администраторы, whitelist и баны#

В Servers/<ServerID>/Server/ лежат три простых текстовых файла, по одному идентификатору на строку:

code
Adminlist.dat     administratorsBlacklist.dat     bansWhitelist.dat     the allow list, used when Whitelisted is set

Команда Owner в Commands.dat - отдельная и более сильная: она даёт постоянные права администратора одному SteamID64, не трогая Adminlist.dat, и это правильное место для вашего собственного аккаунта. Все остальные проходят через admin во время работы, которая сама записывает их в список.

Whitelisted в Commands.dat переводит сервер в режим только по списку. С этого момента никто не зайдёт, если его ID нет в Whitelist.dat или он не был добавлен через permit. Параметр Tag у permit - это метка для вашего собственного удобства: она видна, когда вы выводите список, а на whitelist в 200 слотов это разница между пригодным файлом и стеной из цифр.

Проще всего получить SteamID64 игрока командой investigate <name>, пока он подключён. Скопировать его из адреса профиля тоже можно, но у половины игроков Unturned в профиле красивый текстовый адрес, а не числовой, и люди вставляют этот текст в Adminlist.dat и удивляются, почему ничего не произошло.

Установка RocketMod (LDM)#

RocketMod - это фреймворк для плагинов, на который ориентируется почти каждый плагин Unturned. Его история важна по одной практической причине: первоначальные разработчики прекратили работу в декабре 2019 года и выложили исходный код под лицензией MIT, Smartly Dressed Games сделали форк, чтобы держать его в соответствии с игрой, а в июне 2020 года по просьбе первого автора форк переименовали в Legally Distinct Missile. Вам нужна именно версия LDM. Она сохраняет совместимость с существующими плагинами и содержит исправления давних проблем Rocket, включая исключения многопоточности и эксплойт с телепортацией.

Скачивать его не нужно. Выделенный сервер поставляется вместе с ним:

  1. Остановите сервер.
  2. Скопируйте папку Rocket.Unturned из каталога Extras сервера.
  3. Вставьте её в каталог Modules сервера.
  4. Запустите сервер и найдите Rocket в журнале запуска. Команда modules в консоли подтвердит, что он загрузился.

При первом запуске Rocket создаёт собственную папку внутри экземпляра, и дальше вся работа с плагинами идёт там:

code
Servers/MyServer/Rocket/  Rocket.config.xml              core settings, RCON, automatic shutdown  Rocket.Unturned.config.xml     the Unturned-specific module settings  Permissions.config.xml         groups, members, permissions  Commands.config.xml            enable, disable and re-prioritise commands  Rocket.en.translation.xml      message strings  Plugins/                       plugin DLLs and their config files  Libraries/                     shared dependencies  Logs/                          Rocket.log, rotated on start

Серверы Unturned на RE:NODE поставляются с уже установленным RocketMod, поэтому модуль на месте, а эта папка появляется после первой загрузки - плагины вы добавляете через файловый менеджер или по SFTP. Списка разрешённых плагинов нет; что загрузите, то и запустится, и это ещё одна причина заглянуть в исходный код плагина, прежде чем отдавать ему свой сервер.

Rocket.config.xml и что он включает#

Важны четыре блока. Значения по умолчанию из поставки, а то, что стоит менять, помечено последствиями:

Servers/MyServer/Rocket/Rocket.config.xml
<RocketSettings>  <RCON Enabled="false" Port="27115" Password="changeme"        EnableMaxGlobalConnections="true" MaxGlobalConnections="10"        EnableMaxLocalConnections="true" MaxLocalConnections="3" />  <AutomaticShutdown Enabled="false" Interval="86400" />  <WebConfigurations Enabled="false" Url="" />  <WebPermissions Enabled="false" Url="" Interval="180" />  <LanguageCode>en</LanguageCode>  <MaxFrames>60</MaxFrames></RocketSettings>

RCON по умолчанию выключен, а пароль - changeme, и если включить его, не сменив пароль, вы выложите удалённую консоль в интернет. RCON в Rocket - это обычный сокет TCP на порту 27115; он не шифруется и не ограничен по частоте, кроме ограничения числа подключений выше. Включайте его, только если он действительно кому-то нужен, смените пароль и ограничьте круг тех, кто может достучаться до порта. Общие правила изложены в статье RCON без риска, и здесь они действуют строже обычного.

AutomaticShutdown со значением Interval="86400" - это перезапуск раз в сутки, по умолчанию выключенный. Для сервера выживания включить его разумно, хотя запланированный перезапуск из панели даёт предупреждающее сообщение и резервную копию перед перезапуском, чего здесь нет. Как выбрать время, рассказано в статье расписания перезапусков, которые помогают.

Файл модуля для стороны Unturned интереснее:

Servers/MyServer/Rocket/Rocket.Unturned.config.xml
<UnturnedSettings>  <RocketModObservatory KickLimitedAccounts="true"                        KickTooYoungAccounts="true"                        MinimumAge="604800" />  <AutomaticSave Enabled="true" Interval="1800" />  <CharacterNameValidation>true</CharacterNameValidation>  <LogSuspiciousPlayerMovement>true</LogSuspiciousPlayerMovement>  <EnableItemBlacklist>false</EnableItemBlacklist>  <EnableItemSpawnLimit>false</EnableItemSpawnLimit>  <MaxSpawnAmount>10</MaxSpawnAmount>  <EnableVehicleBlacklist>false</EnableVehicleBlacklist></UnturnedSettings>

AutomaticSave - главное: включено, каждые 1800 секунд. Установка RocketMod дарит серверу Unturned получасовое автосохранение, которого у него иначе нет совсем. Если сервер загружен и на нём много строят, уменьшите интервал вдвое; сохранение короткое, а полчаса потерянной стройки - нет.

KickLimitedAccounts и KickTooYoungAccounts с MinimumAge="604800" отклоняют аккаунты Steam, которые ограничены или младше семи дней. На публичном сервере это бесплатно отсеивает заметную долю одноразовых аккаунтов гриферов, но заодно блокирует и случайного настоящего новичка, так что это компромисс, а не чистая победа.

Права: группы, наследование и cooldown#

В Permissions.config.xml заканчивается большинство жалоб вида «плагин не работает». Команды плагина никому не доступны, пока у какой-нибудь группы нет их узла прав, а узел - это просто имя команды.

Servers/MyServer/Rocket/Permissions.config.xml
<RocketPermissions>  <DefaultGroup>default</DefaultGroup>  <Groups>    <Group>      <Id>default</Id>      <DisplayName>Guest</DisplayName>      <Color>white</Color>      <Members />      <Permissions>        <Permission>p</Permission>        <Permission>compass</Permission>        <Permission>rocket</Permission>      </Permissions>    </Group>    <Group>      <Id>vip</Id>      <DisplayName>VIP</DisplayName>      <Color>FF9900</Color>      <ParentGroup>default</ParentGroup>      <Members>        <Member>76561198012345678</Member>      </Members>      <Permissions>        <Permission>kit.*</Permission>        <Permission Cooldown="120">heal</Permission>        <Permission Cooldown="30">v</Permission>      </Permissions>    </Group>  </Groups></RocketPermissions>

Всю работу здесь делают четыре механизма:

  • `DefaultGroup` называет группу, в которую попадают все, кого нигде не перечислили. Всё, что в ней есть, есть у каждого игрока.
  • `ParentGroup` даёт наследование. Группа vip наследует всё, что есть у default, и добавляет своё, так что узлы повторять не приходится.
  • `Members` - список SteamID64. Это единственное место, где игрок привязывается к группе, если не считать команды /p.
  • `Cooldown` задаётся для каждого права отдельно и в секундах. Cooldown="120" у heal означает, что VIP может лечиться раз в две минуты. Именно эта возможность делает систему привилегий терпимой, и настроить её больше негде.

Подстановочные знаки работают на узлах с точками: kit.* даёт все наборы, которые определяет плагин наборов, тогда как kit.starter дал бы один. Цвета задаются именем или шестнадцатеричным значением без начального знака решётки.

Изменения в этом файле подхватываются командой /p reload, перезапуск не нужен. /p <player> <group> переводит игрока между группами вживую, так что ранг можно выдать, вообще не открывая файл. Тот же принцип наименьших привилегий, что применяется к аккаунтам панели, действует и здесь - общий довод приведён в статье субпользователи и наименьшие привилегии, и довод тот же самый: никому не нужен tp только потому, что он модерирует чат.

/healразрешено ли группе?да, если нет cooldown/kickтолько для админовИгрок вводит командуМодуль Rocketреестр командКонсоль Unturnedвстроенные командыPermissions.config.xmlгруппа, наследование, cooldoКоманда выполняется
Где обрабатывается команда со слешем

Собственными командами Rocket управляет этот файл. Ванильные команды из таблиц выше - нет: они проверяют статус администратора и ничего больше. Две системы бок о бок, и игрок может быть VIP в Rocket без ванильных полномочий или ванильным администратором без прав в Rocket.

Встроенные команды Rocket, каждая из которых - узел прав, который можно выдавать:

КомандаСинтаксисДействие
p<player> [group] или reloadЗадать группу игрока или перезагрузить файл
rocket<plugins or reload>, <load or unload or reload> <plugin>Управлять плагинами без перезапуска
i<id> [amount]Выдать себе предмет
v<id>Выдать себе технику
more<amount>Больше того, что у вас в руках
heal[player]Вылечить себя или другого
god / vanishНеуязвимость, невидимость
tp<player, place or x y z>Телепортировать себя
tphere<player>Телепортировать игрока к себе
homeОбратно к последней кровати
broadcast<color> <message>Объявить что-либо
investigate<player>Его SteamID64
compass[direction]Направление, в котором вы смотрите
exitВыйти без задержки на отключение
rwho / rkick / rflushПоказать, кикнуть и сбросить клиентов RCON

Плагины и OpenMod#

Плагин - это файл .dll, брошенный в Rocket/Plugins/. При первой загрузке он рядом с собой записывает <PluginName>.configuration.xml и <PluginName>.en.translation.xml, и это ваш знак, что он вообще загрузился: нет файла конфигурации - нет загрузки, а причину назовёт Rocket/Logs/Rocket.log. Общие зависимости кладутся в Libraries/. Команда rocket reload <plugin> подхватывает изменённую конфигурацию без остановки сервера.

Порядок действий, который избавляет от большей части неприятностей:

  1. Остановите сервер или хотя бы знайте, что потом придётся перезагрузить.
  2. Положите DLL в Plugins/ и запустите сервер.
  3. Прочитайте журнал. Убедитесь, что плагин загрузился и записал свой конфиг.
  4. Остановите сервер, отредактируйте созданный конфиг и запустите снова.
  5. Выдайте его узлы прав группе в Permissions.config.xml.
  6. Проверьте с аккаунта без прав администратора. Администраторы обходят достаточно проверок, чтобы тест от их имени ничего не доказывал.

Пятый шаг пропускают чаще всего, и он даёт классический симптом: плагин загружается чисто, ничего не пишет в журнал и игнорирует любые команды. Прежде чем решать, что плагин сломан, проверьте, что его узел есть в группе, к которой принадлежит тестирующий.

OpenMod - более новый фреймворк, написанный одним из первоначальных разработчиков Rocket, и он не заменяет RocketMod - он работает рядом и может запускать плагины Rocket через слой совместимости. Простая установка идёт через плагин-установщик OpenMod: положите его в Rocket/Plugins/, перезапустите, выполните /openmod install и следуйте подсказкам. Ручной путь - скопировать папку OpenMod.Unturned в Modules/; первый запуск при этом долгий, потому что скачиваются собственные компоненты. Выбирайте тот фреймворк, для которого опубликованы нужные вам плагины; выбирать из идейных соображений незачем.

Что бы вы ни ставили, сначала сделайте резервную копию. Постройки, техника и инвентари игроков хранятся в файлах сохранений экземпляра, а плагин, который их удалит, отмены не предусматривает. Копируйте папку экземпляра по расписанию и время от времени восстанавливайте одну из копий, чтобы убедиться, что она работает, потому что резервная копия, которую никто не восстанавливал, - это гипотеза. Общая гигиена сервера с модами - фиксировать версии, читать исходный код, удалять то, чем перестали пользоваться - описана в статье как содержать сервер с модами в чистоте, а у содержимого Workshop свои правила, разобранные в статье моды Steam Workshop на выделенных серверах.

Устранение неполадок#

Команда в `Commands.dat` ничего не делает. Это команда времени работы. kick, ban, say и teleport существуют только пока сервер запущен.

Сервер постоянно загружает PEI. Map не совпадает с именем установленного уровня. Нужно внутреннее имя, а не отображаемое, и отсутствующая карта из Workshop даёт тот же результат.

Правки в `Commands.dat` пропадают. Когда вы сохраняли файл, сервер работал. Остановите, отредактируйте, запустите.

Rocket не загрузился. Выполните modules в консоли. Если Rocket.Unturned в списке нет, папку не скопировали из Extras в Modules либо скопировали на уровень глубже.

Плагин загрузился, но его команды игнорируются. В девяти случаях из десяти виноваты права. Добавьте узел в группу в Permissions.config.xml, выполните /p reload и проверьте от имени обычного игрока.

Плагин не записал файл конфигурации. Он не загрузился. Rocket/Logs/Rocket.log назовёт недостающую зависимость или несовпадение версий.

Игроков кикает сразу при входе. Причина - KickLimitedAccounts или KickTooYoungAccounts в Rocket.Unturned.config.xml, либо Filter в Commands.dat отклоняет их имена, либо включён Whitelisted при пустом списке допущенных.

После сбоя потерян прогресс. В ванильном Unturned автосохранения нет. Установите RocketMod ради его 30-минутного AutomaticSave, сократите интервал и вдобавок запланируйте команду save.

RCON отказывает в подключении или пускает не тех. Порт 27115, пароль, который всё ещё changeme, и ограничения числа подключений, которые ниже, чем вам кажется. Проверьте все три пункта, прежде чем винить файрвол.

FAQ#

Чем отличается Commands.dat от конфига?

Commands.dat задаёт, чем является сервер: название, карта, порт, слоты, владелец, пароль, токен. Конфиг сложности задаёт, как играется: шанс лута, урон зомби, время респавна техники. Они никогда не пересекаются, и почти на любой вопрос «какой файл править» отвечает именно это разделение.

Поддерживается ли RocketMod до сих пор?

Да, под названием Legally Distinct Missile, силами Smartly Dressed Games с тех пор, как первоначальная команда отошла от дел в декабре 2019 года. Он поставляется с выделенным сервером в папке Extras, так что устанавливаемая вами копия всегда соответствует сборке игры.

Почему плагин загружается, но ничего не делает?

Для его команд не выдан узел прав той группе, в которой состоит игрок. Откройте Permissions.config.xml, добавьте имя команды как Permission в нужную группу и выполните /p reload. Проверяйте от имени не-администратора, потому что администраторы обходят достаточно проверок, чтобы скрыть проблему.

Можно ли запускать RocketMod и OpenMod вместе?

Да. OpenMod задумывался как работающий рядом с Rocket, а не вместо него, и умеет запускать плагины Rocket через слой совместимости. Путь через плагин-установщик настроит оба за несколько минут.

Есть ли у Unturned автосохранение?

В ванильной версии нет. Базовый сервер сохраняется при штатном shutdown и когда вы вводите save, и больше никогда. RocketMod добавляет AutomaticSave каждые 1800 секунд, и это самая веская причина установить его даже на сервер без плагинов.

Как ограничить привилегию, не раздавая её без счёта?

Используйте атрибут Cooldown у права, а не настройку плагина: <Permission Cooldown="120">heal</Permission> разрешает одно лечение раз в две минуты. Cooldown задаётся для каждого права и каждой группы отдельно, так что одна и та же команда может быть щедрой для персонала и нормированной для донатеров.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000