Author Archives: elwood

Как запустить своего хостбота в 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 и частично ручная работа)
  • собирать конфиг для карт, подключать карты к хостботу
  • хостить автоматически игры в цикле
  • управлять созданной игрой командами

What I have learned after installing Windows 11

Written by elwood
  1. Windows 11 media creation tool is very, very buggy… You should have a lot of patience and luck to create a working bootable USB stick.
  2. The Windows 11 installation process is also buggy. The result (whether the installation will complete or fail) depends on what you choose in the keyboard layout and/or language packs select boxes.
  3. Surprisingly, you still don’t need a Microsoft account to proceed with OS installation. However, you have to know how to avoid this requirement (you can simply enter a local username and ignore the error).
  4. Hardware detection sometimes doesn’t work, and you will likely have troubles with the activation process.
  5. Windows Update is as buggy as usual. During the first install it didn’t finish successfully, but after 3 or 4 reinstalls it finally finished OK.
  6. If you need to change the keyboard repeat rate, you have to run a custom command to launch the settings app O_O
  7. Sometimes OS starts to utilize 15% CPU in idle mode, and it doesn’t stop until you reboot your computer.
  8. There is the Hibernate mode that activates automatically while computer sleeping. To disable it, I removed Hibernate from allowed modes using this guide

Зачем использовать тайловые wm

Written by elwood

Так вышло, что уже немало лет (с 2016) я на рабочем ноутбуке пользуюсь исключительно тайловым window manager’ом (конкретно, awesome wm). Пожалуй, пришло время поделиться опытом и рассказать, почему я предпочитаю тайловые wm и чем они хороши для работы программиста.

О том, что такое тайловые wm и чем они отличаются от обычных десктопных окружений, можно почитать тут. Я же расскажу о своих сценариях использования. Что нужно программисту для работы? Джентельменский набор: браузер, мессенджер, терминалы, IDE/текстовый редактор, ну и прочие приложения (менеджер паролей, калькулятор, скриншотилка итд). Чаще всего работа ведётся в редакторе кода с переключением в браузер/мессенджер/терминал и обратно. Причём переключаться приходится часто, особенно это касается эмуляторов терминала: сессий зачастую бывает много (больше трёх), и хочется тратить на это минимум времени.

Что предлагает нам обычное десктопное окружение? Возьмём для примера GNOME. В нём приложения будут сгруппированы в таскбаре, и переключаться можно тремя способами: через Alt+Tab, мышкой (тыкая в нужную иконку), или с помощью комбинации Mod-клавиша+цифра (Win+цифра). Alt+Tab не удобен тем, что если приложений много, то приходится следить за количеством нажатий, и оно постоянно меняется. То есть чтобы знать, сколько раз надо нажать, нужно в голове держать стек переключений, и примерно прикидывать количество нажатий. Так себе способ. Второй способ с мышью очень медленный и заставляет тянуться за мышкой, вести её к нужному месту, нажимать, вести курсор обратно в рабочую область экрана. А если экземплятов приложения несколько, то придётся ещё одним щелчком выбрать нужный. Выглядит сложно. Третий способ хорош: за одно нажатие Win+3 вы переключаетесь на третье (по порядку) приложение в таскбаре. Но, к сожалению, этот способ не универсален: если у приложения запущено несколько экземпляров, то уточнить нужный можно лишь при помощи мыши. Так что, выбрать нужный терминал быстро не получится. Опять страдания.

Вот бы иметь возможность закрепить за каждой комбинацией клавиш какое-то приложение, и переключаться туда одним нажатием! Взять какие-нибудь простые комбинации вроде Win+1, Win+2.. А если приложение запущено в нескольких экземплярах, то либо выделить экземплярам по отдельной комбинации, либо разместить их окна рядом, на одном экране. Стойте-стойте. Кажется, мы изобрели тайлинг.

Действительно, если взять awesome, то в нём по умолчанию заведено 9 рабочих областей (“тегов”). Переключиться на тег можно комбинацией Win+<номер тега>. Win+ESC переключает тег на предыдущий (очень удобно возвращаться назад). Можно на каждое большое приложение (браузер, мессенджер, IDE) выделить по тегу целиком, а множество эмуляторов терминалов разместить в одном теге в неперекрывающемся режиме (в режиме тайлинга). Теперь доступ к каждому приложению действительно быстрый и удобный — в одно нажатие. Причём если придумать себе какую-то схему размещения приложений и всегда её придерживаться, то эти комбинации всегда будут одними и теми же. Например, у меня на теге 1 всегда открыт браузер, на теге 2 — телеграм, на третьем теге — эмулятор(ы) терминала, на 4-6 — IDE/текстовые редакторы, на 9 — keepass. 7 и 8 у меня запасные, на них закидываю приложения, которые нужны разово/нерегулярно, обычно эти теги пустые.

Теперь давайте рассмотрим визуальную составляющую. Обычные десктопные окружения предлагают нам окошки, которые обильно сдобрены дополнительными элементами: заголовок, меню, рамки окна, элементы управления окном (минимизация, максимизация, крестик закрытия). Причём с каждым новым релизом размер заголовков увеличивается. В результате процент полезной области экрана уменьшается. А ведь иногда приходится работать и с экрана ноутбука! В некоторых окружениях есть настройки, позволяющие уменьшить их размер (gnome-tweak-tool) и настроить шрифты. Но убрать их полностью нельзя.

Awesome же позволяет полностью убрать заголовки и рамки вокруг окон, целиком отдав пространство экрана приложению. То же касается и таскбара: в awesome его нет, а полоска тегов вместе со статус-баром занимают буквально десяток пикселей (впрочем, при желании это можно попытаться настроить). Интересно ещё, что у эмулятора терминала Konsole можно отключить меню, и терминал занимает целиком 100% экрана. Для программистов, которым часто бывает нужно отображать много текста на одном экране, это очень полезная фича. Вот так, например, выглядит мой терминал

Что ещё полезного может предложить awesome?
Хочу отметить возможность вешать кастомные команды на хоткеи. Эта возможность есть и в других DE, но чаще всего там возможности настройки ограничены. Здесь же можно развернуться на полную. Например, можно настроить запуск эмулятора терминала с открытием ssh-сессии на выделенный в браузере (или в редакторе) хост. У меня есть такой хоткей. Я выделяю ip адрес мышкой, нажимаю Win+Ctrl+S, и у меня открывается ssh туда. Быстро и удобно. Аналогично я сделал хоткеи для подключения по RDP к Windows-машине. И для открытия тикета в Яндекс.Трекере (аналоге JIRA): нужно лишь выделить название тикета и нажать комбинацию клавиш.

Подведём итоги. Преимущества тайлинговых wm и awesome в частности:
– удобное и быстрое переключение между приложениями (критически важно для работы и психического здоровья!)
– минимизация неиспользуемого пространства (важно для работы!)
– кастомизация хоткеев, возможность обходиться без мыши во многих случаях
А ещё:
– высокая скорость работы и низкое потребление ресурсов (актуально в сравнении с GNOME)
– независимость от того, куда свернут разработчики DE в следующем релизе: не нужно привыкать к решениям, которые показались разработчикам перспективными

Конечно, есть и минусы. Среди них:
– Высокий порог входа. Даже поставить такой wm не всегда простая задача для новичка в мире nix.
– Проблемы интеграции с DE. Если поставить awesome на Ubuntu с GNOME, то в awesome может не работать автодетект мониторов, переключение раскладки, локскрин. Эти неудобья придётся решать самостоятельно.

Но если однажды потратить некоторое время и получить рабочую конфигурацию, то высок шанс того, что обратно уже не захочется возвращаться.

Напоследок приведу смешную пасту про тайлинг.

Ты совершенно не понимаешь, в чём суть тайлинга. Тайлинг - это не юнити/макообразное run-or-raise. Это не однопиксельные декорации окон. Это не теги вместо воркспейсов, не функционал поиска по 3.5 окон и не простыни конфигов на луа, хаскеле и прочих борщеязычках. Тайлинг - это концепция, при которой юзеры могут почувствовать себя полноправными хозяевами каждого пикселя своего несчастного экранчика - жадными, прагматичными, ленивыми юзерами, которыми они на самом деле и являются.
У кедерастов упала плазма - мы смеёмся. Гномосеки увеличили область заголовка окна ещё в полтора раза - мы смеёмся и жмём Mod4 + B. Мерзософт придумал очередную плиточную бредоидею для нового шиндошса - мы смеёмся и меняем раскладку окон. Нам говорят «без трея не прожить» - мы смеёмся и накатываем патч. Вэйланд, мир, гномощель, юнити - нам пофиг. Мы бездушно поделим экран на ровные части, наши предпочтения основаны на количестве строк кода, хоткеи - наша стихия, мы - истинное лицо управления окнами.

В следующих статьях я расскажу, как конкретно взять Ubuntu 20.04 и настроить в ней awesome wm до минимально рабочего состояния.