В Garry's Mod две совершенно разные системы контента, и почти любая проблема вида «игроки видят знаки ERROR» происходит от того, что их путают. Одна - то, что сервер загружает и запускает: аддоны в garrysmod/addons/ или коллекция мастерской, смонтированная при старте. Другая - то, что клиенты скачивают, прежде чем смогут что-либо из этого увидеть: предметы мастерской, которые для них загружает Steam, и отдельные файлы, скачиваемые по HTTP с хоста FastDL. Аддон, смонтированный на сервере, не попадает к игрокам, а указание игрокам что-то скачать не заставляет сервер это запускать. Когда это стало ясно, остальное - механика.
Что запускает сервер#
На практике сервер загружает контент из трёх мест:
- Папки в `garrysmod/addons/`. Устаревший аддон - это папка с обычными каталогами
lua/,models/,materials/,sound/,maps/,resource/, и монтируется она так, как если бы эти файлы лежали прямо вgarrysmod/. - Файлы `.gma` в `garrysmod/addons/`. Упакованный формат. Результат тот же, только один файл вместо дерева. Инструмент
gmadиз папкиbin/сервера распаковывает его, если нужно заглянуть внутрь или отдавать его файлы другим способом. - Коллекция мастерской, монтируемая при запуске параметром
+host_workshop_collection. Предметы скачиваются вgarrysmod/cache/workshop/как файлы.gmaи монтируются оттуда.
Всё, что нужно самому серверу для работы, - админ-модификации, ваш игровой режим, серверные скрипты, - относится к addons/ и устанавливается вручную. Не кладите это в клиентскую коллекцию: вы просто так будете отправлять интерфейс админ-мода каждому входящему игроку. То же разделение, но со стороны игрового режима, есть в руководстве по серверу DarkRP.
Каждый путь к файлу должен быть в нижнем регистре. Garry's Mod в Linux различает регистр, и аддон с Materials/Models/Thing.vmt работает на тестовом сервере с Windows и даёт фиолетовую шахматную доску на настоящем. Это самая частая единичная причина контента, который «у меня работает».
Коллекции мастерской#
Коллекция - самый простой способ запустить сервер, и для большинства серверов это правильный ответ.
- Создайте коллекцию в мастерской Steam для Garry's Mod, добавьте аддоны, нужные каждому игроку, и сделайте её Public.
- Возьмите ID из URL - число после
?id=. - Добавьте
+host_workshop_collection 2519472571в параметры запуска или впишите его в поле на вкладке Startup, которое даёт ваша панель.
При запуске сервер получает список предметов коллекции, скачивает то, чего у него ещё нет, и монтирует. Подключающимся клиентам велят скачать те же предметы, и делает это для них Steam - не за счёт вашего канала, а в их кэш мастерской Steam, где он остаётся до следующего раза.
Чтобы прочитать содержимое коллекции, нужен ключ Steam Web API, передаваемый в командной строке через -authkey. Вы генерируете его на странице разработчика Steam для своего аккаунта. Если консоль сообщает, что не удалось получить коллекцию, сначала проверьте этот ключ, а текущее требование уточните в вики Garry's Mod, потому что за годы оно менялось.
$ ./srcds_run -game garrysmod -console -port 27015 \ -authkey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \ +host_workshop_collection 2519472571 \ +gamemode darkrp +map rp_downtown_v4c_v2 +maxplayers 40В чём коллекция сильна: в обновлениях. Когда автор аддона выпускает исправление, сервер подхватывает его при следующем перезапуске, а Steam у каждого клиента обновляется в соответствии. Аддоны, загруженные вручную, этого не делают, а расхождение между сервером и клиентом в том, какая версия аддона установлена, - вот как получаются ошибки, которые никто не может воспроизвести.
В чём она плоха: в размере. Всё, что есть в коллекции, - это загрузка для каждого нового игрока, а частичного входа нет. Коллекция в четыре гигабайта - это десять минут ожидания на хорошем соединении, прежде чем кто-либо увидит ваш сервер, и большинство ждать не станет.
Копия на сервере тоже копится. Уберите предмет из коллекции, и его .gma навсегда останется в garrysmod/cache/workshop/. На тарифе с 10 или 20 ГБ диска это стоит время от времени чистить; удалите папку кэша, и сервер заново скачает только то, что сейчас перечислено в коллекции.
resource.AddWorkshop - для более тонкого контроля#
host_workshop_collection - это всё или ничего. Когда вам нужно, чтобы клиенты скачали конкретный аддон, не привязывая его к смонтированной на сервере коллекции, или чтобы список хранился в системе контроля версий, а не на странице Steam, используйте resource.AddWorkshop в файле автозапуска сервера:
resource.AddWorkshop("104815552") -- map packresource.AddWorkshop("2151453461") -- shared propsresource.AddWorkshop("180530595") -- weapon baseID - это строка, а не число. Файл выполняется при запуске сервера, поэтому изменения требуют перезапуска.
Это добавляет аддон в список загрузок клиента. На сервере он ничего не монтирует, и это как раз то, что нужно для контента, который требуется только клиенту для отрисовки, - и как раз ловушка, если вы решили, что аддон этим установлен. Если аддон нужен и серверу, он всё равно должен быть в коллекции или в addons/.
Оба подхода могут сосуществовать. Обычная схема на большом сервере - небольшая коллекция для того, что сервер действительно монтирует, плюс список resource.AddWorkshop для клиентского контента, хранимый в файле рядом с остальной конфигурацией. Общая механика контента мастерской на выделенных серверах для разных игр описана в статье моды из Steam Workshop на выделенных серверах.
Отдельные файлы и медленный способ их отправки#
Не всё есть в мастерской. Пользовательские карты, логотип, шрифт, набор звуков, который вы сделали сами, - это отдельные файлы в папках самого сервера, и клиентам они тоже нужны. Сообщить об этом клиенту можно через resource.AddFile:
resource.AddFile("maps/rp_yourmap_v2.bsp")resource.AddFile("materials/logo/banner.vmt")resource.AddFile("materials/logo/banner.vtf")resource.AddSingleFile("sound/ambient/radio_loop.wav")Пути отсчитываются от garrysmod/. resource.AddFile для .mdl также ставит в очередь сопутствующие файлы модели; resource.AddSingleFile добавляет ровно один файл и больше ничего.
Вот что люди упускают. Если ничего больше не настроено, эти файлы отправляются по собственному сетевому каналу игры, который медленный по замыслу: он создавался для иконки сервера, а не для пакета контента. net_maxfilesize ограничивает размер любого отдельного файла, и значение по умолчанию скромное. Игрок, заходящий на сервер с пятьюдесятью мегабайтами отдельных файлов в игровом канале, просидит на экране загрузки достаточно долго, чтобы передумать.
Эту проблему и решает FastDL.
Настройка FastDL#
FastDL - это просто веб-сервер. Вы кладёте копию контента в каталог, повторяющий структуру garrysmod/, и сообщаете игровому серверу, где он лежит:
sv_downloadurl "https://files.yourserver.net/gmod"sv_allowdownload 1sv_allowupload 0URL указывает на каталог, содержащий models/, materials/, sound/, maps/, resource/ и particles/ - те же имена, та же вложенность, всё в нижнем регистре. Клиент, которому нужен materials/logo/banner.vtf, запрашивает ровно этот путь под вашим URL. Список каталога не нужен, и включать его не следует.
HTTPS работает, и его стоит использовать. Ненадёжно работает URL с перенаправлением, поэтому указывайте настоящее расположение, а не сокращатель ссылок или перенаправляющий входной адрес.
sv_allowdownload 1 должен оставаться включённым: именно он разрешает любые загрузки клиентов, в том числе по HTTP. Отключив его, вы не заставите игроков иметь контент заранее, а просто оставите их без него.
Сжимайте всё. Клиент запрашивает banner.vtf.bz2 раньше, чем banner.vtf, так что загрузите сжатую копию, и загрузка станет во много раз меньше:
$ cd /var/www/gmod$ find . -type f ! -name '*.bz2' -exec bzip2 -k {} \;-k сохраняет оригинал, и пока вы тестируете, это стоит делать. Когда настройке можно доверять, хватит одних файлов .bz2.
Где разместить: подойдёт любой статический веб-хостинг, ему нужны диск и трафик, а не процессор. Небольшой тариф веб-хостинга прекрасно отдаёт каталог, принимает файлы по SFTP или через файловый менеджер и включает слот прокси: направьте запись A на показанный адрес, и сертификат будет выпущен и продлён за вас, так что https://files.yourserver.net работает без вашего участия в certbot. DNS-сторона описана в статье ваш домен и его сертификат.
Одно честное замечание о трафике: хост FastDL, отдающий пакет на 2 ГБ каждому новому игроку в загруженный вечер, гоняет настоящий трафик. Безлимит означает, что с вас не берут плату за гигабайт, а не то, что забивать общий канал можно сколько угодно; трафик и справедливое использование - версия этого разговора, который никто не любит вести потом.
Какая система для какого контента#
| Контент | Сервер получает из | Клиент получает из |
|---|---|---|
| Аддон мастерской, нужный всем | коллекции | Steam |
| Клиентский контент мастерской | не монтируется | resource.AddWorkshop |
| Админ-мод, серверные скрипты | addons/ | ниоткуда |
| Пользовательская карта, которой нет в мастерской | maps/ | FastDL |
| Ваши собственные материалы и звуки | addons/ | FastDL |
Честный вариант по умолчанию для нового сервера: выкладывайте в мастерскую всё, что можно, и используйте коллекцию, а FastDL оставьте для горстки того, чего там нет. Доставка через Steam быстрее вашей, кэшируется на машине игрока между сеансами и сама обновляется. Серверы, выкладывающие на FastDL зеркало всего своего контента из мастерской, обычно решают проблему, которую сами выдумали.
Как держать загрузку небольшой#
Именно это решает, зайдут ли люди во второй раз.
- Проверяйте коллекцию по размеру, а не по количеству. Один пакет транспорта с высоким разрешением может весить больше тридцати скриптов. Размер показан на странице каждого предмета в мастерской.
- Удалите дублирующиеся базы оружия. На большинстве серверов копятся три пересекающихся пакета, потому что каждый новый аддон приносил свой.
- Пакеты пропов - для карт, которые их используют. Если на них не ссылается ни карта, ни профессия, это чистая загрузка.
- Решите, что обязательно, а что приятно. Игроку не нужны собственные модели персонажей вашего штата модераторов, чтобы играть.
- Проверьте реальное число. Зайдите с аккаунта Steam, который никогда не бывал на сервере, с обычного соединения и засеките время. Меньше двух минут - хорошо. Больше пяти - и вы теряете людей.
Диск на сервере тоже важен. Установка Garry's Mod занимает несколько гигабайт ещё до аддонов, кэш мастерской растёт вместе с коллекцией, а демо и журналы накапливаются. Быстрое хранилище сокращает время монтирования при запуске, а это большая часть того, что вы ощущаете при перезапуске; реальные цифры - в статье что на самом деле меняет NVMe.
Устранение неполадок: пропавший контент#
Фиолетово-чёрная шахматная доска. Пропал материал. Либо клиент его не скачал, либо на сервере с Linux неверен регистр в пути, либо аддон поставляет .vmt без .vtf.
Знаки ERROR, парящие в мире. Пропала модель. Те же три причины, другой тип файла.
Видят только некоторые игроки. Их cl_downloadfilter выставлен не в all. none блокирует все загрузки, а nosounds блокирует звук; и то и другое люди один раз задали много лет назад и забыли. Изменить это за них нельзя, но можно им сказать.
Все качают вечно, а потом происходит тайм-аут. Неверен путь FastDL. Откройте в браузере URL одного конкретного файла: если https://files.yourserver.net/gmod/materials/logo/banner.vtf.bz2 не скачивается, не скачает и игра. Ошибка 404 здесь - вся проблема.
Коллекция мастерской не загрузилась. Посмотрите в консоли при запуске получение коллекции, убедитесь, что коллекция Public, и проверьте ключ API. Приватная коллекция или коллекция только для друзей с точки зрения сервера падает молча.
Контент работает локально и ломается на сервере. В девяти случаях из десяти виноват регистр. Переименуйте всё в нижний регистр, включая имена каталогов, и перезапустите.
Аддон обновился, и теперь ничего не работает. Аддоны мастерской обновляются у вас из-под ног. Если сервер стабилен и должен оставаться таким на время мероприятия, это довод в пользу аддонов .gma, установленных вручную на эту неделю; где они лежат, описано в базовом руководстве по настройке сервера.
На RE:NODE файловый менеджер распаковывает загруженный архив на месте, так что .gma или пакет контента попадает прямо в addons/, а SFTP справляется с массовой загрузкой, когда коллекция слишком велика, чтобы перетаскивать её в браузер. Консоль не фильтруется, и именно там появляются получение коллекции и каждая жалоба на пропавший файл. Слоты резервных копий есть в каждом тарифе, и ими стоит пользоваться перед проверкой аддонов, а не после.
FAQ#
Игроки скачивают аддоны с моего сервера или из Steam?
Из Steam - всё, что входит в коллекцию мастерской или добавлено через resource.AddWorkshop. С вашего сервера или вашего хоста FastDL приходят только отдельные файлы: пользовательские карты, ваши собственные материалы и звуки.
Нужен ли FastDL, если я использую мастерскую?
Только для контента, которого нет в мастерской. Большинству серверов он нужен для пользовательской карты и горстки файлов, и ни для чего больше. Если всё, что вы запускаете, - аддоны мастерской, FastDL можно вообще пропустить.
Почему сервер монтирует аддоны, которых нет у клиентов?
Потому что это два списка. Сервер монтирует то, что лежит в addons/ и в коллекции; клиенты скачивают то, что им велят коллекция и вызовы resource.Add. Админ-мод сознательно входит в первый список и не входит во второй.
Насколько большой должна быть моя коллекция?
Достаточно небольшой, чтобы новый игрок заходил менее чем за две минуты. На практике это означает держать обязательный для клиента контент заметно меньше гигабайта. Аддоны только для сервера в него не входят, и это ещё одна причина держать их вне коллекции.
Нужен ли мне ключ Steam Web API?
Для host_workshop_collection да: серверу он нужен, чтобы прочитать список предметов коллекции, и передаётся через -authkey. Аддонам, установленным вручную в addons/, ключ не нужен совсем.
Можно ли разместить FastDL на самом игровом сервере?
Нет. Игровой тариф запускает игру, а не веб-сервер. Используйте любой статический веб-хостинг для этого каталога, укажите на него sv_downloadurl и храните файлы сжатыми через bzip2.




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