RE:NODE

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

Don't Starve Together: моды, админы и откаты

Как ставить моды DST на выделенный кластер через dedicated_server_mods_setup.lua и modoverrides.lua, назначать админов, вводить консольные команды и безопасно откатывать мир.

0 прочтений

Для модов на выделенном сервере Don't Starve Together нужны два файла: mods/dedicated_server_mods_setup.lua в папке установки сервера говорит ему, какие предметы Workshop скачивать, а modoverrides.lua в папке каждого шарда решает, какие из них включены и с какими настройками. Админы - это Klei user ID, по одному на строку, в файле adminlist.txt в папке кластера. Всё остальное - кики, баны, сохранения, откаты, выдача предметов - это Lua, который вводится в консоль шарда, и несколько этих команд в консоли сервера ведут себя иначе, чем в игре. В этой статье подробно разобраны файлы модов, как без гадания правильно настроить каждый мод, настройка админов, полный справочник команд и как откатиться так, чтобы Лес и Пещеры не оказались в разных днях.

Про сам кластер - токен, cluster.ini, server.ini, порты и шарды - начните с руководства по серверу Don't Starve Together. Здесь предполагается, что кластер запускается.

Как моды попадают на выделенный сервер#

Сервер DST никогда не загружает моды от игроков. Он скачивает их сам из Steam Workshop, когда стартует шард. Порядок такой:

  1. Шард читает dedicated_server_mods_setup.lua и скачивает или обновляет каждый перечисленный там предмет Workshop.
  2. Он читает свой modoverrides.lua и включает моды, помеченные enabled = true, с указанной конфигурацией.
  3. Когда игрок заходит, сервер сообщает его клиенту, какие моды обязательны, и клиент автоматически скачивает их из Workshop.
ID из ServerModSetupскачивается при стартесписок обязательных модовте же версииmods_setup.luaчто скачиватьSteam Workshopфайлы модовКаждый шардmodoverrides.luaИгра игрокаавтозагрузка
Как мод попадает из Workshop к игроку DST

Из такой схемы следует, что кластер должен быть онлайн - offline_cluster = false, - иначе моды из Workshop вообще не работают, а каждый шард при запуске скачивает всё, что ему нужно, так что длинный список модов означает более медленный старт.

Куда попадают скачанные файлы, зависит от формата мода в Workshop. Старые моды распаковываются в папку mods установки в виде каталогов workshop-<id>. Новые хранятся в папке ugc_mods, раздельно по кластерам и шардам, если сервер не запущен с -ugc_directory, указывающим в другое место. Трогать эти папки приходится редко; знать о них полезно, когда проверяете, произошла ли загрузка на самом деле.

dedicated_server_mods_setup.lua#

Этот файл лежит в папке установки сервера, а не в папке кластера - mods/dedicated_server_mods_setup.lua рядом с бинарниками игры. Это список загрузки, и только он:

mods/dedicated_server_mods_setup.lua
-- Individual workshop items, by idServerModSetup("1234567890")ServerModSetup("2345678901")-- Or a whole workshop collectionServerModCollectionSetup("3456789012")

ID - это число в конце URL мода в Workshop, после ?id=. ID коллекции работает так же и подтягивает все предметы коллекции - удобно для большого списка, но это значит, что любой, кто может редактировать коллекцию, может изменить то, что скачивает ваш сервер. Используйте коллекцию, которая принадлежит вам.

Здесь люди спотыкаются о три вещи:

  • Файл лежит в установке, поэтому переустановка или validate могут его сбросить. Держите копию в папке кластера или в заметках и восстанавливайте её после обновлений.
  • Указать мод здесь - не значит включить его. Он только скачивается. Мод, который есть в этом файле, но отсутствует в modoverrides.lua, скачивается при каждом запуске и никогда не используется.
  • Моды обновляются при каждом запуске. Когда автор публикует обновление, ваш следующий перезапуск его подхватит. Закрепить версию нельзя, поэтому обновление игры или мода может сломать кластер, который вчера работал нормально.

modoverrides.lua, для каждого шарда#

У каждого шарда в его папке в кластере свой modoverrides.lua - Master/modoverrides.lua и Caves/modoverrides.lua. Это Lua-таблица, ключи в которой - workshop- плюс ID:

Master/modoverrides.lua
return {  ["workshop-1234567890"] = {    enabled = true,    configuration_options = {      stack_size = 99,      show_in_inventory = true,    },  },  ["workshop-2345678901"] = { enabled = true },}

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

Ключи конфигурации нигде не документированы, кроме самого мода. У каждого мода есть modinfo.lua, и его таблица configuration_options перечисляет для каждой опции внутреннее имя name, допустимые значения data и значение по умолчанию default. Значения в modoverrides.lua должны точно совпадать с одним из этих data - число там, где мод ждёт строку, или значение не из списка молча игнорируется, и используется значение по умолчанию.

Какие моды нужны на сервере#

Каждый мод DST указывает в своём modinfo.lua, где он работает, и это стоит прочитать, прежде чем что-то добавлять:

Флаг в modinfo.luaЧто это значит для сервера
client_only_mod = trueВообще не для серверов. Каждый игрок ставит его сам
all_clients_require_mod = trueРаботает на сервере и у каждого клиента. Скачивается автоматически при входе
all_clients_require_mod = falseРаботает только на сервере. Игрокам ничего не нужно
dst_compatible = trueНаписан для DST, а не для одиночной Don't Starve

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

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

Хорошая дисциплина - держать короткий список, проверять любое добавление на копии мира и добавлять моды между игровыми сессиями, а не во время них. Шире эта привычка описана в статье как держать модовый сервер в чистоте, а общая механика контента Workshop на серверах - в статье моды Steam Workshop на выделенных серверах.

Моды, которых нет в Workshop, - ваши собственные или приватный форк, - кладутся папкой в каталог mods сервера и включаются в modoverrides.lua по имени этой папки, а не по ключу workshop-. Игрокам тогда нужна копия вручную, потому что автозагрузка работает только для предметов Workshop.

Админы и как найти Klei ID#

Админы перечисляются в файле adminlist.txt в папке кластера, рядом с cluster.ini:

adminlist.txt
KU_aB3dEf7hKU_9zQ2mNp1

Записи - это Klei user ID, которые начинаются с KU_ и одинаковы на всех платформах, где играет аккаунт. Это не Steam ID и не имена игроков. Чтобы найти ID, попросите игрока зайти и выполните в консоли шарда:

lua
c_listallplayers()

Команда выводит всех подключённых игроков с их ID. Игроки также могут найти свой ID на странице аккаунта Klei. Файл читается при старте шарда, так что после правки перезапустите его.

Админ в игре получает две вещи. Список игроков (удерживайте Tab) показывает кнопки кика и бана рядом с каждым именем. А внутриигровая консоль - открывается клавишей с обратной кавычкой - может отправлять команды на сервер: она стартует в локальном режиме, и перед вводом её нужно переключить в удалённый режим клавишей Ctrl. Команда, выполненная в локальном режиме, действует только на ваш клиент, поэтому «я ввёл c_save(), и ничего не произошло» встречается так часто.

whitelist.txt использует те же ID и работает вместе с whitelist_slots в cluster.ini, чтобы резервировать слоты. blocklist.txt - это список банов, и сервер пишет в него, когда вы кого-то баните.

Справочник консольных команд#

Команды - это Lua, который вводится в консоль нужного шарда: команды для Леса - в Master, для Пещер - в Caves.

КомандаЧто делает
c_save()Сохранить этот шард сейчас
c_shutdown()Сохранить и остановить. c_shutdown(false) останавливает без сохранения
c_reset()Перезагрузить этот шард из последнего сохранения
c_rollback(n)Откатиться на n снапшотов
c_regenerateshard()Удалить и заново сгенерировать только этот шард
c_regenerateworld()Удалить и заново сгенерировать весь мир
c_announce("text")Сообщение всем игрокам
c_listallplayers()Подключённые игроки с их Klei ID
TheNet:Kick("KU_...")Кикнуть по ID
TheNet:Ban("KU_...")Забанить по ID и записать в список блокировок
c_despawn(player)Вернуть игрока к выбору персонажа
c_godmode(player)Переключить неуязвимость
c_spawn("prefab", n)Заспавнить n экземпляров префаба
c_give("prefab", n)Выдать предметы
c_countprefabs("prefab")Посчитать, сколько их есть в этом шарде
c_gonext("prefab")Телепортироваться к следующему экземпляру префаба
TheWorld:PushEvent("ms_nextcycle")Перейти к следующей части дня

Подвох в том, на кого направлена команда. В игре команды без аргумента-игрока действуют на вас - или на то, что вы выделили. В собственной консоли сервера никакого «вас» нет, и многие из этих команд по умолчанию берут первого игрока в списке. Поэтому c_give("goldnugget", 10), введённая в консоли панели, отдаст золото тому, кто оказался первым, а не тому, кто просил.

Вместо этого явно указывайте игрока:

lua
-- Look up a player by namelocal p = UserToPlayer("Wendy_main")c_godmode(p)c_despawn(p)-- Give items to one specific playerp.components.inventory:GiveItem(SpawnPrefab("goldnugget"))-- The connected players, in join orderfor i, v in ipairs(AllPlayers) do print(i, v.name, v.userid) end

c_countprefabs - инструмент админа, о котором часто забывают. В кластере, который начал лагать, обычно слишком много чего-то - брошенных предметов, посаженных деревьев, заспавненных существ, - и c_countprefabs("log") или c_countprefabs("evergreen") за секунды скажет, сколько их.

Откаты и снапшоты#

DST хранит снапшоты: точки сохранения, которые делает автосохранение, до max_snapshots из cluster.ini (по умолчанию 6). c_rollback(1) откатывает на один, c_rollback(3) - на три. Игроков отключает и заново подключает к восстановленному состоянию.

Беда в том, что кластер - это два мира. Если откатить Лес, но не Пещеры, игроки, находившиеся под землёй, сохраняют более новое состояние, а поверхность уходит назад, и два счётчика дней расходятся. Откатывайте оба шарда на одно и то же число, почти одновременно, и проверьте оба счётчика дней, прежде чем пускать людей обратно. Если сомневаетесь, надёжный путь - полное восстановление всей папки кластера из бэкапа при остановленных обоих шардах.

Кроме того, снапшоты лежат на том же диске, что и сохранение. Они спасают от «мы приняли плохое решение час назад», но не от «сервер удалили». Для этого нужен настоящий backup вне машины - аргументы за него в статье бэкапы, которые действительно восстанавливаются. На RE:NODE слоты для бэкапов входят в каждый тариф Don't Starve Together, хранятся вне машины и восстанавливаются кнопкой; вкладка Schedules может по cron-выражению отправить консольные команды c_announce("Saving for backup") и c_save(), а через минуту сделать backup.

Игроки также могут запустить голосование за откат или пересоздание мира, если vote_enabled = true. На публичном сервере решите, хотите ли вы давать игрокам такую власть.

Обновления и когда моды ломаются#

Обновления игры - главный источник проблем с модами в DST. Патчи Klei меняют внутренности, к которым цепляются моды, и каждый патч ломает часть модов, пока их авторы не догонят. Поскольку сервер заново скачивает моды при каждом запуске, сломанное обновление мода тоже доходит до вас без предупреждения.

Короткий порядок действий:

  1. Перед обновлением игры сделайте backup всей папки кластера.
  2. После обновления запустите Master и читайте его лог, пока загружаются моды. Сломанный мод выводит своё имя и ошибку Lua.
  3. Отключите сломанный мод в обоих файлах modoverrides.lua, перезапустите и проверьте мир.
  4. Включите его снова, когда автор опубликует исправление.

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

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

Моды указаны в setup, но не активны. Их нет в modoverrides.lua, или в ключе не хватает префикса workshop-.

Мод работает в Лесу и роняет Пещеры. Два файла modoverrides.lua различаются. Скопируйте один поверх другого.

Настройки мода игнорируются. Имя или значение опции не совпадает в точности с modinfo.lua мода. Сгенерируйте файл через игру.

Игроки не могут зайти после обновления мода. У их клиента старая копия. Перезапуск игры обычно запускает обновление из Workshop.

`c_give` выдала предметы не тому. Консоль сервера берёт первого игрока, если игрок не указан. Используйте UserToPlayer("name").

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

FAQ#

Нужно ли игрокам ставить моды сервера перед входом?

Нет. Моды, обязательные для всех клиентов, скачиваются автоматически, когда игрок заходит. Клиентские моды - выбор каждого игрока и никогда не обязательны.

Могут ли в Лесу и Пещерах быть разные моды?

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

Где найти параметры конфигурации мода?

В его modinfo.lua, в разделе configuration_options. Проще: выставьте опции в локальном мире в игре и скопируйте сгенерированный modoverrides.lua на сервер.

Действует ли c_rollback на оба шарда?

Считайте, что она действует на тот шард, в котором вы её выполнили, и откатывайте оба на одно и то же число. Потом проверьте счётчик дней в обоих мирах.

Как сделать кого-то админом без перезапуска?

Список админов читается при старте, поэтому надёжный способ - добавить Klei ID в adminlist.txt и перезапустить сервер в спокойный момент.


Комментарии

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

0/2000