Counter-Strike: Global Offensive интеграция игрового процесса

На этой странице описываются основы настройки интеграции состояния игры с запущенной Counter-Strike: Global Offensive.

Существует множество способов интеграции сторонних служб с игрой:
активация сценического освещения и пиротехники во время соревновательного матча, активация освещения или тактильных элементов в периферийных устройствах, подключенных к игровым ПК во время игры, дополнение трансляции оверлей с пользовательской интерактивной графикой, синхронизированной с состоянием игры, сбор всех изменений состояния игры для аннотирования, видео, записанных по запросу [англ VOD] и т. д.

По умолчанию игровой клиент может выявлять все состояния игры и отправлять уведомление об обновлении сразу после изменения состояния клиента игры в любую локальную или удаленную конечную точку HTTP POST с использованием JSON в качестве структуры состояния игры.  Ему просто нужно знать, где игрок хочет предоставить игровое состояние, и какие уведомления передавать. Этот руководство поможет третьим лицам разрабатывать свои инструменты и процессы интеграции с состоянием игры CS:GO.

Поиск каталога установки CS: GO

Клиенту CS:GO необходимо прочитать файлы конфигурации конечных точек, чтобы узнать назначение и компоненты состояния игры для отправки в конечную точку. Системные администраторы на турнирах знают, где игровой клиент установлен на компьютерах игроков турнира в то время, как они создают образ дисков для игроков, поэтому процесс обнаружения каталога установки не требуется. Драйверы клавиатуры или гарнитуры, которые реализуют конечную точку HTTP POST для активации интеграции периферийных устройств, могут побудить пользователя вручную найти существующий каталог установки CS:GO или попытаться автоматически найти его, используя следующий подход.

Каталог установки Steam в Windows можно найти в реестре под ключом HKEY_CURRENT_USER\Software\Valve\Steam, значение «SteamPath» содержит строку, именующую каталог установки Steam. Если Steam установлен в D:\Steam, тогда папки Steam библиотек будут перечислены в D:\Steam\steamapps\libraryfolders.vdf.

В OSX файл папок Steam библиотеки в большинстве случаев можно найти в ~/Library/Application Support/Steam/steamapps/libraryfolders.vdf.

В Linux файл папок Steam библиотеки в большинстве случаев можно найти в ~/.local/share/Steam/SteamApps/libraryfolders.vdf.

Автоматический поиск местоположения каталога CS:GO теперь может выполнять итерацию всех папок Steam Библиотеки пользователя, найденных в libraryfolders.vdf, включая само расположение libraryfolders.vdf, которое ищет общую установку CS:GO.

Если Steam установлен в D:\Steam и CS:GO установлена непосредственно в каталог установки Steam, тогда расположение файлов конфигурации CS:GO будет: "D:\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\cfg".

Чтобы интегрировать состояния игры для работы с вашей службой, вам нужно будет поместить текстовый файл с именем gamestate_integration_yourservicenamehere.cfg в каталог csgo/cfg, CS:GO подхватит его при следующем запуске игры. Различные службы могут размещать свои собственные файлы интеграции состояния игры в каталоге csgo/cfg, а игровой клиент будет передавать информацию во все конфигурации зарегистрированных служб.

Так, мой пример службы разместит конфигурационный файл здесь:

D:\Steam\steamapps\common\Counter-Strike Global Offensive\csgo\cfg\gamestate_integration_consolesample.cfg

Пример файла конфигурации

Вот пример файла конфигурации для интеграции собственного игрового процесса gamestate_integration_consolesample.cfg:

"Console Sample v.1"
{
 "uri" "http://127.0.0.1:3000"
 "timeout" "5.0"
 "buffer"  "0.1"
 "throttle" "0.5"
 "heartbeat" "60.0"
 "auth"
 {
   "token" "CCWJu64ZV3JHDT8hZc"
 }
 "data"
 {
   "provider"            "1"    // общая информация о клиенте: имя игры, appid, Steam ID клиента, и т. д.
   "map"                 "1"    // карта, игровой-режим и текущая фаза матча («разминка», «пауза», «конец игры», «лайв») и текущий счет
   "round"               "1"    // фазы раунда («freezetime», «конец», «лайв»), состояние бомбы («установлена», «взорвано», «обезврежено»), и победитель раунда (если таковой имеется)
   "player_id"           "1"    // имя игрока, тег клана, слот наблюдателя (т.е. ключ, который необходимо нажать, чтобы наблюдать за этим игроком) и команда
   "player_state"        "1"    // состояние игрока для этого текущего раунда, такое как здоровье, броня, убийства за этот раунд и т. д.
   "player_weapons"      "1"    // характеристика оснащённого оружия
   "player_match_stats"  "1"    // статистика игрока, такая как убийства, помощь, счёт, смерти и СЦИ (самый ценный игрок)
 }
}

Вот пример файла конфигурации для сценографического освещения управляемого с системы наблюдателя турнира, подключённой к команде зрителей gamestate_integration_observerspectator.cfg.

"Observer All Players v.1"
{
 "uri" "http://10.0.1.3:8080"
 "timeout" "5.0"
 "buffer"  "0.1"
 "throttle" "0.1"
 "heartbeat" "30.0"
 "auth"
 {
   "token" "Q79v5tcxVQ8u"
 }
 "data"
 {
   "provider"            "1"
   "map"                 "1"
   "round"               "1"
   "player_id"           "1"
   "allplayers_id"       "1"    // То же самое, что и «player_id», но для всех игроков. 'allplayers' действительны только для HLTV и наблюдателей.
   "player_state"        "1"      
   "allplayers_state"    "1"      
   "allplayers_match_stats"  "1"  
   "allplayers_weapons"  "1"      
   "allplayers_position" "1"    // выводит позиции игрока в мире, действителен только для GOTV или наблюдателей.
   "phase_countdowns"    "1"    // делает обратный отсчёт каждой секунды, оставшейся для фазы игры, время окончания раунда, время до взрыва бомбы, freezetime. Действует только для GOTV или наблюдателей. 
   "allgrenades"    "1"         // выводит информацию обо всех гранатах и пламени от «коктейля Молотова» в мире, действительны только для GOTV или наблюдателей.
 }
}

Примечание: полезные данные allplayers_weapons стали доступны, начиная с версии игры 1.35.4.1, их рекомендуется использовать для активных точек локальной сети только в том случае, если размер и частота полезных данных значительно увеличиваются, когда они включены.

Важно: убедитесь, что файл конфигурации использует в кодировку UTF8 без BOM, иначе конфигурационный файл не будет загружен. Вы можете увидеть, был ли файл успешно загружен по выводу консоли, после запуска CS:GO.

Параметры секции конечной точки

uri: Игра будет делать POST-запросы на этот uri. Если конечной точке нужен трафик, который должен быть зашифрован в отправке, рекомендуется указывать безопасный uri и использовать SSL когда служба завершится. Клиент Steam автоматически использует SSL и проверяет сертификат конечной точки для назначения https.

■ timeout: Игра ожидает код ответа HTTP 2XX из запроса HTTP POST, и игра не будет пытаться отправить следующий HTTP POST запрос, пока предыдущий запрос все еще находится в отправке. Игра будет рассматривать запрос как тайм-аут, если ответ не получен в течение стольких секунд, и будет повторно отправлять сигналы в следующий раз с полным состоянием, опуская любые Дельта-вычисления. Если настройка не указана, будет использоваться малый тайм-аут по умолчанию 1,1 сек.

Примечание: Если ваша конечная точка никогда не получает блоки полезных данных JSON с именем “previously” или “added”  это может быть признаком того, что игровой клиент никогда не получает ответ HTTP 2XX и всегда считает запрос неудачным.

■ buffer: потому что несколько игровых событий имеют тенденцию происходить один за другим очень быстро, рекомендуется указать ненулевой буфер. Когда буферизация включена, игра будет собирать события в течение стольких секунд, чтобы сделать дельта-репорт. Для интеграции с локальным хостингом это менее проблематично и может быть настроено в соответствии с потребностями службы или настроено на 0.0, чтобы полностью отключить буферизацию. Если настройка не указана, будет использоваться буфер по умолчанию 0,1 сек.

■ throttle: для конечных точек с высоким трафиком этот параметр заставит игровой клиент не отправлять другой запрос, по крайней мере, через несколько секунд после получения предыдущего ответа HTTP 2XX, чтобы избежать уведомлений службы, когда состояние игры изменяется слишком часто. Если настройка не указана, будет использоваться throttle по умолчанию 1,0 сек.

■ heartbeat: даже если никакого изменения состояния игры не происходит, этот параметр указывает игре отправить запрос через столько секунд после получения предыдущего ответа HTTP 2XX. Служба может быть настроена так, чтобы игра считалась автономной или отключенной, если она не получала уведомление в течение значительного периода времени, превышающего интервал heartbeat.

Аутентификация игрового клиента

Оба примера cfg-файлов, показанных в этом документе, содержат необязательный раздел конфигурации "auth". В большинстве сценариев интеграции localhost или даже LAN эта секция может быть полностью пропущена, но когда он присутствует, поля в этом разделе будут передаваться в виде строковых полей JSON в конечную точку для аутентификации полезных данных. Для конечной точки рекомендуется также использовать SSL для защиты полезных данных отправки, содержащий блок аутентификации.

Компоненты состояния игры

Все состояния игры разделяются на независимые блоки, на которые служба может быть самостоятельно подписана.  У службы, обеспечивающей тактическую обратную связь для каждой запущенной пули, может возникнуть необходимость в получении полезных данных "player_weapons" и любых изменениях в данных о боеприпасах и ammo data, в то время как служба, аннотирующая видео-стрим, может подписаться только на компонент "map", чтобы отслеживать название карты и вести счёт побед в раундах.

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

Когда какие-либо данные сообщаемого компонента изменяются, игровой клиент запустит таймер буфера, а после того, как он истечет или сразу же, если буферизация отключена, сообщит о новом состоянии всей игры, а дельта-состояния будут вычисляться из полезных данных с последним успешным ответом HTTP 2XX от конечной точки. Для данных, которые были изменены из предыдущего отчета, глобальный блок "previously" будет содержать старое состояние измененного состояния игры, тогда как для новых данных глобальный блок "added" будет содержать корневые поля JSON, которые присутствуют в новом состоянии игры, но отсутствовали в старом игровом состоянии.

Пример конечных точек сервера HTTP POST

Пример реализации HTTP POST сервера, в котором игровая нагрузка отображается в консоли, предоставляется здесь с использованием framework отсюда. Вы можете сохранить предоставленный скрипт как mysample.js и выполнить узел mysample.js, чтобы запустить HTTP POST сервер на 3000 порту.

http = require('http');
fs = require('fs');
 
port = 3000;
host = '127.0.0.1';
 
server = http.createServer( function(req, res) {
 
    if (req.method == 'POST') {
        console.log("Handling POST request...");
        res.writeHead(200, {'Content-Type': 'text/html'});
 
        var body = '';
        req.on('data', function (data) {
            body += data;
        });
        req.on('end', function () {
            console.log("POST payload: " + body);
        	res.end( '' );
        });
    }
    else
    {
        console.log("Not expecting other request types...");
        res.writeHead(200, {'Content-Type': 'text/html'});
		var html = 'HTTP Server at http://' + host + ':' + port + '';
        res.end(html);
    }
 
});
 
server.listen(port, host);
console.log('Listening at http://' + host + ':' + port);

Источник

cs go, Game State Integration, steam, гайд, руководство

Читайте также