RE:NODE

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

Плагины для CS2: Metamod:Source и CounterStrikeSharp

Почему SourceMod не работает на CS2, как установить Metamod:Source и CounterStrikeSharp, настроить администраторов и флаги и пережить обновление игры.

1 прочтений

Первое, что нужно знать о плагинах для Counter-Strike 2, - то, на чём в первый же день останавливается большинство: SourceMod не работает. Десять лет плагинов на SourcePawn, каждый когда-либо скачанный .smx, админ-меню, которое вы знаете наизусть - ничто из этого не запускается на Source 2. Стек плагинов CS2 - это Metamod:Source в его линейке для Source 2, а поверх него CounterStrikeSharp, который размещает плагины, написанные на C# под .NET. Экосистема моложе, меньше и построена с нуля, и именно там теперь живёт каждый серьёзный сервер сообщества CS2.

В этой статье - установка, настройка администраторов, плагины, которые стоят занятого места на диске, и то, о чём никто не пишет: что ломается, когда Valve выпускает обновление, и как вернуться в строй за десять минут, а не за выходные.

Что работает на CS2, а что нет#

ЧтоСтатус на CS2
Metamod:Source, линейка 2.xРаботает. Это фундамент
Metamod:Source 1.11 / 1.12Только Source 1. Не тот движок
SourceMod и плагины .smxНе запускается. Поддержки Source 2 нет
CounterStrikeSharpРаботает. Плагины на C# под .NET 8
CS2Fixes и другие нативные плагины MetamodРаботают, написаны на C++ прямо под Metamod
Интерфейс серверных плагинов Valve (plugin_load)На Source 2 это непрактичный путь

Два следствия. Во-первых, если руководство велит положить что-то в addons/sourcemod/plugins, это руководство по CS:GO, и всё остальное в нём тоже неверно. Во-вторых, когда вы ищете плагин для чего-то конкретного, вы смотрите релизы на GitHub, а не каталог плагинов: менеджера пакетов нет, установщика в панели нет и составленного каталога тоже нет. Вы скачиваете архив, выясняете, кто его написал, и распаковываете сами.

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

читается при запускесканирует plugins/Сервер CS2Source 2gameinfo.giдобавляет путь поискаMetamod:Sourceaddons/metamodcounterstrikesharp.vdfMetamod загружает егоCounterStrikeSharpхост .NET 8Ваш плагинMatchZy.dll
Как плагин на C# попадает внутрь CS2

Установка Metamod:Source#

Metamod - это загрузчик. Сам по себе он ничего в игре не меняет; он даёт другому коду поддерживаемый способ встать между движком и игровым модулем.

  1. Возьмите сборку Metamod:Source из линейки разработки 2.x на сайте AlliedModders. Стабильные загрузки 1.x предназначены для игр на Source 1 и не загрузятся. Берите пакет для Linux, если ваш сервер на Linux, а на хостинге с панелью так и есть.
  2. Распакуйте так, чтобы папка addons из архива оказалась в game/csgo/. У вас должно получиться game/csgo/addons/metamod/ с metaplugins.ini и папкой bin.
  3. Отредактируйте game/csgo/gameinfo.gi. Найдите блок SearchPaths и добавьте одну строку выше существующей записи Game csgo:
game/csgo/gameinfo.gi
		SearchPaths		{			Game_LowViolence	csgo_lv			Game	csgo/addons/metamod			Game	csgo			Game	core
  1. Перезапустите сервер и введите в консоли meta version.

Правка gameinfo.gi - это весь фокус, и она же самая частая причина, по которой рабочий сервер перестаёт загружать плагины. Этот файл принадлежит игре, поэтому запуск validate или крупное обновление заменяют его, и ваша строка исчезает. Ошибок нет; Metamod просто больше не подключён, плагины не загружаются, а сервер выглядит нормально. Если после обновления плагины пропали, проверьте gameinfo.gi раньше всего остального.

code
] meta listListing 1 plugin:  [01] CounterStrikeSharp (1.0.xxx) by roflmuffin

meta list доказывает, что Metamod загрузился, и показывает, что он загрузил. Пустой список при выведенной версии означает, что Metamod работает, а загружать ему нечего. Полное отсутствие ответа означает, что gameinfo.gi неверен или сборка - для Source 1.

Установка CounterStrikeSharp#

CounterStrikeSharp - это плагин Metamod, который размещает среду выполнения .NET и открывает игру для C#. Его релизы бывают двух видов: с встроенной средой .NET и рассчитанные на установленный на машине .NET 8. На хостинге на контейнерах берите сборку со встроенной средой: вы не управляете тем, что установлено на узле, а встроенная сборка стоит несколько сотен мегабайт диска, а не обращения в поддержку.

  1. Распакуйте релиз в game/csgo/, чтобы addons/counterstrikesharp/ оказалась рядом с addons/metamod/.
  2. Убедитесь, что addons/metamod/counterstrikesharp.vdf существует. Именно этот файл сообщает Metamod, что его нужно загрузить.
  3. Перезапустите. meta list теперь должен показать CounterStrikeSharp, а css_plugins list - ответить.

Дерево, к которому нужно прийти:

code
game/csgo/addons/  metamod/    metaplugins.ini    counterstrikesharp.vdf  counterstrikesharp/    bin/    configs/      core.json      admins.json      admin_groups.json    gamedata/    logs/    plugins/      MatchZy/        MatchZy.dll

Плагины лежат на одну папку вглубь, и имя папки должно совпадать с именем DLL: plugins/MatchZy/MatchZy.dll загрузится, plugins/MatchZy.dll - нет. На этом правиле спотыкаются почти все, хотя бы раз.

configs/core.json стоит прочитать целиком, потому что он короткий, а три его настройки меняют поведение, из-за которого вы иначе потратите час. Триггеры чата определяют, какой префикс запускает команду в чате: по умолчанию ! для видимой команды и / для тихой. Горячая перезагрузка определяет, перезагрузится ли DLL, положенная на место, без перезапуска, - это удобно на тестовом сервере и плохая идея на боевом. И есть переключатель соблюдения правил Valve для серверов сообщества, который запрещает API плагинов делать то, за что серверы попадают в неприятности; по умолчанию он включён неспроста, об этом ниже.

Администраторы, группы и флаги#

Администраторы - это файл JSON, а не консольная команда. configs/admins.json сопоставляет Steam ID набору флагов:

addons/counterstrikesharp/configs/admins.json
{  "Anna": {    "identity": "76561198012345678",    "flags": ["@css/generic", "@css/kick", "@css/ban", "@css/changemap"],    "immunity": 80  },  "Moderator Jan": {    "identity": "76561198087654321",    "groups": ["#css/moderator"],    "immunity": 40  }}
addons/counterstrikesharp/configs/admin_groups.json
{  "#css/moderator": {    "flags": ["@css/generic", "@css/kick", "@css/chat"],    "immunity": 40  }}
ФлагЧто даёт
@css/rootВсё, включая флаги, которые добавят будущие плагины
@css/genericБазовая проверка «является администратором», с которой начинает большинство плагинов
@css/kickКик
@css/ban / @css/unbanБан и снятие банов
@css/slaySlay, slap и подобное
@css/changemapСмена карты
@css/cvarИзменение cvar из чата
@css/chatGag, mute, чат администраторов
@css/voteЗапуск голосований
@css/reservationДоступ к зарезервированному слоту
@css/cheatsПереключение sv_cheats, где это позволяет плагин

immunity - это число, и более высокое число нельзя тронуть более низким. Себе поставьте 100, доверенным модераторам 50, а тому, кто вежливо попросил, 10. Без значений immunity два администратора могут кикать друг друга по кругу, что смешно ровно один раз.

css_admins_reload перечитывает оба файла без перезапуска, поэтому добавление модератора посреди вечера ничего не стоит. Используйте @css/root для одной учётной записи - вашей, а всех остальных собирайте из конкретных флагов. В поле identity указывается 17-значный SteamID64; status в консоли печатает идентификатор каждого подключённого игрока в нужном вам виде.

Плагины, которые стоит запускать#

ПлагинЧто делаетТребует
MatchZyМатчи 5 на 5: готовность, ножевой раунд, паузы, демо по картам, восстановление раундаCounterStrikeSharp
CS2-SimpleAdminБаны, mute, gag и slay с хранением в базе данных, общие для нескольких серверовCounterStrikeSharp, база данных
cs2-retakesРежим retakes с появлением на точках закладки и распределением оружияCounterStrikeSharp
CS2FixesИсправления на уровне движка и команды администратора, основа серверов Zombie EscapeТолько Metamod

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

Две категории заслуживают предупреждения, а не рекомендации. Всё, что меняет скины оружия, выдаёт предметы инвентаря или подделывает косметику, нарушает правила Valve для серверов, а наказание - бан токена входа игрового сервера, который уносит с собой сервер и может перейти за аккаунтом Steam на следующий токен. Плагины скинов популярны, и они реально, а не теоретически рискуют вашим токеном. А всё, что рекламирует «античит» для CS2, работает на эвристиках изнутри процесса сервера; что-то из этого полезно, но ничто не является VAC, и всё даёт ложные срабатывания, которые вам придётся разбирать.

Для матчевого сервера одного MatchZy хватает на весь вечер, а как его настроить, показано в статье сервер для соревновательных матчей CS2.

Установка, настройка и перезагрузка плагина#

Установка всегда одинаковой формы. Скачайте архив релиза, откройте его и убедитесь, что в нём есть путь addons/ или обычная папка плагина, и распакуйте в нужное место через файловый менеджер или по SFTP - данные для подключения есть в статье SFTP и файловый менеджер. Затем:

code
css_plugins listcss_plugins load MatchZycss_plugins unload MatchZycss_plugins reload MatchZy

Большинство плагинов создают свою конфигурацию при первой загрузке, а не поставляют её, поэтому последовательность такая: установить, запустить, остановить, затем отредактировать появившийся файл. Одни пишут в addons/counterstrikesharp/configs/plugins/<Name>/, другие кладут .cfg в game/csgo/cfg/, и авторитет в вопросе, куда именно, - только readme самого плагина. Если у плагина есть настройки, которых вы не находите, запустите сервер один раз и посмотрите, что изменилось на диске.

Ошибки плагинов пишутся в addons/counterstrikesharp/logs/, по одному файлу в день, и читаются они гораздо легче консоли, потому что трассировка стека C# в игровой консоли сворачивается в кашу. Когда плагин загрузился, но ничего не делает, в логе обычно есть одна строка с причиной, и обычно это отсутствующая зависимость или сигнатура gamedata, которая больше не совпадает.

Как пережить обновление CS2#

Valve обновляет CS2 без предупреждения и без оглядки на ваши плагины. Ломается три вещи, в порядке убывания вероятности:

  1. gameinfo.gi сброшен, поэтому Metamod вообще не загружается. Верните строку.
  2. Metamod или CounterStrikeSharp нужна новая сборка, потому что сместились внутренние смещения. Ничто из вашего этого не исправит; вы ждёте релиз, обычно это часы, а не дни.
  3. Gamedata плагина больше не совпадает, поэтому он загружается, а потом выбрасывает исключение, когда обращается к игре. Обновите плагин или его файл gamedata, если автор поставляет его отдельно.

Защита процедурная, а не техническая. Храните копию всей папки addons и вашего gameinfo.gi где-нибудь не на сервере, чтобы восстановление было копированием файлов. Не запускайте обновление игры за час до матча - обновляйтесь на следующий день, намеренно, с запасом времени на исправление. А если у вас запущено что-то важное, заведите второй, дешёвый сервер, который вы обновляете первым. Общая процедура описана в статье что делать, когда обновление мода всё сломало; CS2 - просто необычно быстрый её пример.

На RE:NODE обновление выполняется при запуске сервера, поэтому решение о том, когда принять обновление, - это решение о том, когда перезапускать, а вкладка Schedules - то место, где вы назначаете это на 05:00 во вторник, а не за пять минут до матча. Слоты backup входят в каждый тариф CS2, и разумная привычка - сделать backup вручную перед установкой любого плагина, потому что тогда откат - это одна кнопка, а не археологические раскопки.

Память, процессор и сколько на самом деле стоят плагины#

Ванильный сервер CS2 на десять игроков чувствует себя комфортно в 1 ГБ. CounterStrikeSharp приносит в процесс среду выполнения .NET, а поверх неё ещё несколько плагинов, и реалистичный минимум для сервера с плагинами - 2 ГБ: не потому, что плагины тяжёлые, а потому, что у среды есть рабочий набор, а сборщику мусора нужен запас. Если контейнер упирается в лимит памяти, его останавливают и запускают заново с чистого листа, а не оставляют работать на swap, что в вечер матча - худший из возможных исходов, поэтому берите с запасом, а не впритык.

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

Диагностика#

`meta list` ничего не печатает. Metamod не загружается. Проверьте строку в gameinfo.gi, проверьте, что распаковали сборку для Source 2, и проверьте, что путь - game/csgo/addons/metamod, а не csgo/addons/metamod.

Metamod загружается, но CounterStrikeSharp не появляется. Файл addons/metamod/counterstrikesharp.vdf отсутствует, либо вы взяли сборку без встроенной среды на машину без .NET 8.

`css_plugins list` показывает плагин, но его команды ничего не делают. Почти всегда дело во флагах администратора. Проверьте, что в admins.json есть ваш SteamID64, выполните css_admins_reload и убедитесь, что триггер чата из core.json совпадает с тем, что вы набираете.

Вчера всё работало, а сегодня ничего не работает. Обновление CS2. Начните с gameinfo.gi.

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

Команды чата печатаются в чат для всех. Это публичный триггер делает своё дело. Для команд администратора используйте тихий триггер, по умолчанию /.

FAQ#

Работает ли SourceMod на CS2?

Нет. SourceMod поддерживает игры на Source 1, такие как Team Fortress 2, Counter-Strike: Source и CS:GO. CS2 работает на Source 2, которого SourceMod не поддерживает, и конвертера для плагинов на SourcePawn нет. На практике заменой служит CounterStrikeSharp.

Могут ли плагины привести к VAC-бану моего сервера?

VAC банит клиентов, а не серверы. Риск для сервера - бан его токена входа игрового сервера, который Valve выдаёт за нарушение правил для серверов сообщества: раздачу предметов инвентаря, подделку скинов или искажение того, что представляет собой сервер. Обычные плагины администрирования, матчей и игровых режимов проблемой не являются.

Можно ли устанавливать плагины из панели без SSH?

Да. Всё здесь - файлы в game/csgo/, так что файлового менеджера или SFTP достаточно. Архивы можно распаковывать на месте, а редактор откроет gameinfo.gi и конфигурации JSON напрямую.

Куда добавлять администраторов для CS2?

В addons/counterstrikesharp/configs/admins.json, с ключом по имени, SteamID64 в identity и списком флагов @css/. Перезагрузить его на лету можно командой css_admins_reload.

Сколько памяти добавляет CounterStrikeSharp?

Достаточно, чтобы 1 ГБ перестал быть комфортным. Закладывайте 2 ГБ для сервера с CounterStrikeSharp и несколькими плагинами, а больше - если какой-то из них хранит состояние на каждого игрока.

Почему мои плагины перестали загружаться после обновления?

Потому что обновление переписало game/csgo/gameinfo.gi и убрало путь поиска Metamod. Верните строку и перезапустите. Если дело не в этом, Metamod или CounterStrikeSharp нужна сборка, соответствующая новой версии игры.


Комментарии

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

0/2000