Monthly Archives: October 2025

Как запустить своего хостбота в ICCup?

Written by elwood

Введение

Любой, кто играл в ICCup, знает, что в ICCup есть несколько вариантов создания игр. Основной – создать игру через команду /host (для доты) или /chost (в случае кастомок). В этом случае игра хостится одним из хостботов ICCup’a, до хоста всегда стабильный пинг (во всяком случае, предсказуемый, если играешь на одном и том же боте), а при игре в доту ещё и подключается ладдерная система (рейтинг, статистика). Эти преимущества улучшают качество игры, потому этот способ и стал таким популярным. Но ничто не мешает создать игру по-старинке, вручную: накликать в интерфейсе Battle.net ICCup’a создание Custom Game и стартовать. Но чтобы другие игроки могли к вашей игре подключиться, вам придётся заблаговременно получить внешний IP-адрес и пробросить порт 6112 к себе на компьютер.

Есть ещё сторонние хостботы, которые постоянно хостят кастомки в ICCup (в основном TD и другие самые популярные кастомки). И на некоторых даже ведётся статистика (рейтинг, кол-во побед). Как они это делают? Я попробовал разобраться, и вот что у меня получилось.

GHost++

Вообще хостботы для PVPGN-серверов существуют уже лет двадцать и были в своё время весьма популярны. Я взял базовый вариант GHost++ и попробовал его подключить к ICCup. Что такое GHost++ и как он работает? GHost++ это программа, которая умеет притворяться запущенным от имени игрока клиентом игры (war3.exe). Хостбот умеет подключаться к PVPGN/Battle.net серверу с логином-паролем игрока, хостить там игры, запускать их и писать в чаты сообщения. Для этого ему достаточно имитировать работу клиента игры на сетевом уровне: уметь логиниться по специальному протоколу, общаться с сервером, принимать входящие соединения от других игроков и обрабатывать их так же, как это делает клиент warcraft при хосте своей игры. Всё это умеет GHost++.

Скачать его можно здесь:
http://w3gh.ru/download/

Я использовал самый первый вариант, “оригинальная версия бота, основанная на трудах MrJag, наиболее стабильная версия из всех существующих, но и имеет менее всего возможностей”.

Она ведёт на архив гугл кода
https://code.google.com/archive/p/ghostplusplus/downloads

Конфигурация ghost++

Итак, мой конфиг ghost.cfg:

bot_war3path = C:\Warcraft III 1.26a\
bot_savereplays = 1
replay_war3version = 26
bot_virtualhostname = War3 Game
bot_hideipaddresses = 1
bot_autokickping = 700
bot_latency = 50
bot_defaultmap = gctd
bot_matchmakingmethod = 0
admingame_password = 12
lan_war3version = 26
autohost_maxgames = 1
autohost_startplayers = 8
autohost_gamename = [War3] Green Circle TD 9.9b
autohost_owner =
bnet_server = 127.0.0.1
bnet_serveralias = ICCup
bnet_username =
bnet_password = <пароль в iccup>
bnet_firstchannel = <канал, на который зайдёт бот>
bnet_rootadmin =
bnet_bnlsserver =
bnet_custom_war3version = 26

Конфигурация карт

В mapscfgs нужно положить конфиг карты gctd.cfg:

map_path = Maps\Download\Green Circle TD v9.9b.w3x
map_localpath = Green Circle TD v9.9b.w3x
map_type = w3x
map_numplayers = 9
map_numteams = 2
map_slot1 = 0 255 0 0 0 0 4 1 100
map_slot2 = 0 255 0 0 0 1 4 1 100
map_slot3 = 0 255 0 0 0 2 4 1 100
map_slot4 = 0 255 0 0 0 3 4 1 100
map_slot5 = 0 255 0 0 0 4 4 1 100
map_slot6 = 0 255 0 0 0 5 4 1 100
map_slot7 = 0 255 0 0 0 6 4 1 100
map_slot8 = 0 255 0 0 0 7 4 1 100
map_slot9 = 0 255 2 1 1 11 8 1 100

а в maps — сам файл карты (в моём случае это Green Circle TD v9.9b.w3x). Карта будет доступна для создания по имени gctd (по названию конфигурационного файла). Собственно, мы и используем её в основном конфиге в ключе bot_defaultmap. Как собирать конфиг карты это отдельная тема и зависит от карты, тут в целом написано, что первые 8 слотов играют каждый в своей тиме, а девятый слот это компьютер. Пример конфига для Legion TD Mega x3:

map_path = Maps\Download\Legion TD MegaOZGame v 2.6a.w3x
map_localpath = Legion TD MegaOZGame v 2.6a.w3x
map_type = w3x
map_numplayers = 10
map_numteams = 2

map_slot1 = 0 255 0 0 0 0 1 1 100
map_slot2 = 0 255 0 0 0 1 1 1 100
map_slot3 = 0 255 0 0 0 2 1 1 100
map_slot4 = 0 255 0 0 0 3 1 1 100
map_slot5 = 0 255 0 0 1 4 1 1 100
map_slot6 = 0 255 0 0 1 5 1 1 100
map_slot7 = 0 255 0 0 1 6 1 1 100
map_slot8 = 0 255 0 0 1 7 1 1 100
map_slot9 = 0 255 2 1 0 8 1 1 100
map_slot10 = 0 255 2 1 1 9 1 1 100

Здесь 2 команды по 4 игрока и два компьютера по одному на тиму (так нужно для работы карты).

Запуск

В случае с ICCup нам ещё понадобится установленный ICCup Launcher и Warcraft 3. Зачем? Дело в том, что ICCup это не простой PVPGN-сервер, и к нему нельзя подключиться без включенного антихака. Если посмотреть с помощью Wireshark на сетевое взаимодействие с сервером ICCup, то там есть пакеты, в которых клиент уведомляет сервер о том, что антихак был запущен. Если этого рукопожатия нет, сервер на попытку авторизации отвечает “Неверный пароль”. По этой же причине bnet_server должен быть 127.0.0.1, а bnet_serveralias=ICCup, это нужно из-за того, что ICCup сервер мимикрирует под настоящий Battle.net сервер, и авторизация должна выполняться как к оригинальному Battle.net, а не как к PVPGN-серверу с упрощённой схемой валидации пароля. (Этот факт пришлось долго дебажить, используя Wireshark и исходники ghost++, в них есть место (https://github.com/ghostBot/ghostplusplus/blob/6ba90f426e96f80fe013a468d1e07151a510adbe/ghost/bnet.cpp#L851), где в зависимости от указанного password_hash_type выбирается алгоритм генерации пруфа пароля. В случае ICCup это должна быть ветка “battle.net logon”). А 127.0.0.1 потому, что ICCup Launcher создаёт локальный прокси, и клиент игры работает через него.

Запуск хостбота выглядит следующим образом.

  1. Запускаем ICCup Launcher, в Warcraft 3 уже должен быть настроен автологин
  2. Запускаем из лаунчера Warcraft c автологином, но в момент, когда варкрафт скачивает данные (Downloading data), нажимаем ESC
    так мы ловим момент, когда прокси успело уведомить сервер о том, что антихак подключен, но логин ещё не случился
  3. Сворачиваем Warcraft и запускаем ghost.exe

Ждём какое-то время, и бот создаст игру. После этого можно (с другого компьютера и с другого логина) зайти в ICCup и войти в эту игру. Можно ещё с текущего запущенного варкрафта зайти в LAN games и там зайти в эту же игру, но в этом случае после финиша следующая игра, созданная ботом, уже будет сломана (к ней нельзя будет подключиться извне). Почему так – неизвестно, похоже на баг работы с сетью внутри GHost++. Поэтому если хочется, чтобы хостбот рехостил игры нормально, в LAN к себе лучше не заходить.

Зайдя в канал, указанный в bnet_firstchannel, или в лобби созданной ботом игры под аккаунтом, указанным в bnet_rootadmin, можно админить бота командами. А внутри лобби игры можно админить игру. Список команд можно посмотреть в документации к ghost++.

Чему мы научились

  • понимать схему взаимодействия хостботов и PVPGN-серверов типа ICCup
  • логиниться в ICCup хостботом (к сожалению, тут нужен Windows и частично ручная работа)
  • собирать конфиг для карт, подключать карты к хостботу
  • хостить автоматически игры в цикле
  • управлять созданной игрой командами