Всем, привет, статья не имеет смысла, если вы не знаете, что с этим делать.

Сегодня я вам покажу, как средствами Steam Works создать свой сервер, чтобы он был виден ISteamApps/GetServersAtAddress (Если правильно я думаю: если мы получаем информацию о сервере через этот интерфейс, то он находится в мастер сервере?)

1. Скачиваем SDK Steam Works
2. Подключаем библиотеки (папка redistributable_bin)
3. Подключаем заголовочные файлы (папка public/steam)
4. Теперь сам код:
C++:
#include <steam_gameserver.h>
#include <isteamgameserver.h>

int main()
{
    SteamGameServer_Init(0, 27020, MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE, eServerModeAuthentication, "1.38.2.8");

    SteamGameServer()->SetProduct("730");
    SteamGameServer()->SetGameDescription("My server");
    SteamGameServer()->SetDedicatedServer(true);
    SteamGameServer()->SetModDir("csgo");

    SteamGameServer()->LogOn("Ваш токен");

    SteamGameServer()->SetBotPlayerCount(0);
    SteamGameServer()->SetMaxPlayerCount(32);
    SteamGameServer()->SetPasswordProtected(false);
    SteamGameServer()->SetRegion("255");
    SteamGameServer()->SetServerName("Server Test");
    SteamGameServer()->SetMapName("de_dust2");
    SteamGameServer()->SetSpectatorPort(0);

    SteamGameServer()->SetAdvertiseServerActive(true);
    SteamGameServer()->SetGameTags("fake_server");

    return 0;
}

Теперь по коду:
SteamGameServer_Init:
inline bool SteamGameServer_Init( uint32 unIP, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString )
/*
    unIP - IP адрес сервера (dec)     
    usGamePort - Порт, к которому будут подключаться клиенты для игры.
    usQueryPort - Порт, который будет управлять обязанностями, связанными с окном поиска серверов, и запросами информации от клиентов.
    eServerMode - Задаёт метод аутентификации сервера.
    pchVersionString - Строка с версией обычно представлена в формате x.x.x.x, она используется мастер-сервером для определения, что сервер устарел. (Будут перечислены только серверы с последней версией).

    Методы авторизации:
    eServerModeNoAuthentication - Не аутентифицировать сервер и не показывать в списке серверов
    eServerModeAuthentication - Аутентифицировать сервер, показывать его в списке серверов и без vac
    eServerModeAuthenticationAndSecure - Аутентифицировать сервер, показывать его в списке серверов и защищать игроков vac

    Про usQueryPort: Если вы передадите MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE в usQueryPort, API игрового сервера будет использовать режим GameSocketShare, что будет означать, что игра несет ответственность за отправку и получение UDP-пакетов для средства обновления мастер-сервера.
*/
LogOn:
SteamGameServer()->LogOn("Ваш токен");
/*
    Токен сервера https://steamcommunity.com/dev/managegameservers
*/
SetAdvertiseServerActive:
SteamGameServer()->SetAdvertiseServerActive(true);
/*Это метод отвечает за показ сервер в мастер сервере и за обратботку покетов на стороне нашего сервера*/

Чтобы узнать актуальную версию CSGO, то клик
Чего здесь не хватает? Ну например обработки A2S запросов, ваш сервер будет находиться в списке серверов, но получить от него информацию вы не сможете, так как нет обработки A2S и S2A запросов.
Смогут ли игроки подключиться к серверу ? Нет - так как нет логики по обработки пакетов между сервером и клиентом и нет открытого сокета, где мы будем получать и отправлять пакеты.
Зачем эта статья? Просто было скучно и решил написать ее, так как пример по Steam Works видел мало
Смогу ли я создавать свои фейк сервера с помощью этого примера? Ну кто знает, все в твоих руках!
Спасибо за внимание!

Так же рядом с исполняемым файлом создайте txt файл с названием steam_appid.txt и напишите в нем 730
steam_api.dll так же разместите с исполняемым файлом (можно найти в папке с сервером /bin) или если вы компилировали под x64, То библиотека и динамическая библиотека находятся в redistributable_bin/win64