Содержание

    Эксперимент с HotkeyNet: избавляемся от макросов

    Последний раз обновление для HotkeyNet выходило 6 лет назад. Но даже спустя столько времени эта тихая рабочая лошадка может тягаться с таким монстром, как ISBoxer. На самом деле, нас больше ограничивает загруженный скрипт, а не какие-то программные особенности. В этой статье мы испытаем HotkeyNet на прочность и попытаемся решить сложную игровую задачу - не добавляя в игру макросы, следовать за главным персонажем, переключать роль ведущего на любого героя в группе и атаковать одну и ту же цель.

    Эксперимент с HotkeyNet: избавляемся от макросов

    Многие, кому довелось прикоснуться к ISBoxer, были приятно удивлены, что можно, ничего не настраивая в игре, сразу отправляться на поиски приключений. А в конце пробного периода они уже не могли смотреть на HotkeyNet и другие подобные трансляторы клавиш. Писать десятки макросов и править их на нескольких компьютерах - занятие совсем неприятное.

    С HotkeyNet этого получится избежать, если игра обладает достаточно продвинутой системой действий, которым можно назначать клавиши. На этот раз объектом для эксперимента станет группа из пяти персонажей в World of Warcraft. В большинстве игр схожего жанра можно проделать те же действия и получить такой же результат.

    Если вы хотите лучше понимать, что здесь происходит, ознакомьтесь с основами написания скриптов HotkeyNet. Однако, знать всё необязательно - вы можете воспользоваться готовым скриптом в конце статьи.

     

    Подготовка к испытаниям

    К сожалению, полностью избежать правок в игре не удастся. Для альтернативного управления должны быть назначены минимум шесть горячих клавиш. В чистом клиенте WoW значение по умолчанию не было определено только для клавиши следования (follow target):

    Действие (en) Действие (ru) Горячая клавиша
    Target Party Member 1 Цель: 1-й член группы F2
    Target Party Member 2 Цель: 2-й член группы F3
    Target Party Member 3 Цель: 3-й член группы F4
    Target Party Member 4 Цель: 4-й член группы F5
    Assist Target Помочь цели F
    Follow Target Следовать за целью Alt+F

    Для выравнивания ракурса камеры я также закреплю на клавише End действие "SetView 4" (Восстановить ракурс 4) из раздела "Key Bindings > Camera Functions".

    Итак, связь наладили, едем дальше.

     

    Содействие главному персонажу

    Основой для управления нам послужит базовый скрипт на 5 окон. Но HotkeyNet ничего не знает о персонажах и их именах в игре. С внешним миром эту программу соединяют только названия окон и передаваемые в них нажатия. Напомню, мы собирались сделать так, чтобы ведущим становился тот герой, от лица которого осуществляется управление. Для этого мы определим активное окно и, в зависимости от результата, выберем цель одной из клавиш между F2 и F5.

    World of Warcraft и подобные ей игры устроены так, что свою группу каждый её участник видит по-разному. Из-за этого клавиши для взятия в цель одного и того же напарника часто отличаются:

    Выбор цели окно #1 окно #2 окно #3 окно #4 окно #5
    Target player1 F1 F2 F2 F2 F2
    Target player2 F2 F1 F3 F3 F3
    Target player3 F3 F3 F1 F4 F4
    Target player4 F4 F4 F4 F1 F5
    Target player5 F5 F5 F5 F5 F1

    Для демонстрации используются стандартные игровые настройки. Но можно подставлять свои значения, если у вас они отличаются.

    Закреплённые на основной панели клавиши убираем из списка "MainList" в скрипте и записываем отдельно:

    <KeyList AssistList 0-9, Minus, Plus>


    Далее создаём основу для новых горячих клавиш:

    <Hotkey ScrollLockOff AssistList; Ctrl AssistList; Alt AssistList>
    <If ActiveWinIs WoW1>
    // здесь будет какой-то код

    <Else If ActiveWinIs WoW2>
    // здесь будет какой-то код

    <Else If ActiveWinIs WoW3>
    // здесь будет какой-то код

    <Else If ActiveWinIs WoW4>
    // здесь будет какой-то код

    <Else If ActiveWinIs WoW5>
    // здесь будет какой-то код
    <EndIf>

    // атака по общей цели
    <SendLabel w1, w2, w3, w4, w5>
    <Key %Trigger%>

    Подробнее о том, что мы сейчас сделали:

    • Первая строка означает, что после нажатия на любую клавишу из списка "AssistList" с выключенной кнопкой ScrollLock, будут выполнены связанные с ней действия. Также это коснётся сочетаний этих клавиш с Ctrl или Alt.
    • Добавлено несколько условий, чтобы выполнить нужный участок кода в зависимости от того, какое окно было активно на момент вызова горячей клавиши.
    • В конце во все окна будет отправлено нажатие, которое вызвало горячую клавишу.


    Чтобы было легче вносить изменения, для повторяющихся участков применяются шаблоны. Сейчас именно такая ситуация - значительная часть кода будет повторяться. Поэтому я создам следующий шаблон с макрокомандами:

    <Template TargetMain>
    // отправка каких-то нажатий в какие-то четыре окна
    <SendLabel %1%>
    <Key %5%>
    <SendLabel %2%>
    <Key %6%>
    <SendLabel %3%>
    <Key %7%>
    <SendLabel %4%>
    <Key %8%>

    // отправка ещё какого-то нажатия в эти окна
    <SendLabel %1%, %2%, %3%, %4%>
    <Key %9%>
    <EndTemplate>


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

    <Hotkey ScrollLockOff AssistList; Ctrl AssistList; Alt AssistList>
    <If ActiveWinIs WoW1>
    <ApplyTemplate TargetMain w2 w3 w4 w5 F2 F2 F2 F2 F>

    <Else If ActiveWinIs WoW2>
    <ApplyTemplate TargetMain w1 w3 w4 w5 F2 F3 F3 F3 F>

    <Else If ActiveWinIs WoW3>
    <ApplyTemplate TargetMain w2 w1 w4 w5 F3 F3 F4 F4 F>

    <Else If ActiveWinIs WoW4>
    <ApplyTemplate TargetMain w2 w3 w1 w5 F4 F4 F4 F5 F>

    <Else If ActiveWinIs WoW5>
    <ApplyTemplate TargetMain w2 w3 w4 w1 F5 F5 F5 F5 F>
    <EndIf>

    // атака общей цели
    <SendLabel w1, w2, w3, w4, w5>
    <Key %Trigger%>

    Итак, если активно первое окно, то кнопка 2 передаст в остальные четыре окна нажатие F2 и сразу за ним F. Затем во все окна, включая главное, будет передано нажатие кнопки 2. Остальная часть списка "AssistList" работает почти так же, только нажатия будут другие.

     

    Переключение на другие окна

    В базовом скрипте за переключение между окнами отвечает другой шаблон под названием "Switch". В нём предусмотрена отправка в игру нажатий от Shift+1 до Shift+5 для активации макроса, в который раньше мы вручную добавляли команды "focus" и "follow". Теперь эту функцию будет выполнять наш новый шаблон вместе с отправкой Alt+F. Остальное в шаблоне "Switch" останется прежним.

    Можно заметить, что в исходном коде шаблон кнопок переключения уже получает пять макрокоманд с номерами окон. Воспользуемся ими. Нам остаётся только выбрать главаря клавишами F2-F5 и следовать за ним при помощи Alt+F:

    <Template Switch>  // шаблон для создания кнопок переключения
    <Hotkey ScrollLockOff Shift %1%>
    <SwitchColors %1% %2% %3% %4% %5%>
    <ResizeAndPosition %1% %2% %3% %4% %5%>

    <TargetWin WoW%1%>
    <SetActiveWin> // активация окна, на которое было произведено переключение

    <ApplyTemplate TargetMain w%2% w%3% w%4% w%5% %6% %7% %8% %9% "Alt F">
    <Key End>
    <Key End>
    <EndTemplate>


    <ApplyTemplate Switch 1 2 3 4 5 F2 F2 F2 F2>
    <ApplyTemplate Switch 2 1 3 4 5 F2 F3 F3 F3>
    <ApplyTemplate Switch 3 2 1 4 5 F3 F3 F4 F4>
    <ApplyTemplate Switch 4 2 3 1 5 F4 F4 F4 F5>
    <ApplyTemplate Switch 5 2 3 4 1 F5 F5 F5 F5>

    Поскольку шаблон "TargetMain" заканчивается отправкой нажатия в побочные окна, а шаблоны являются всего лишь фрагментами текста, сюда же легко вписалась клавиша для выравнивания угла обзора.

     

    Следование

    Только что мы настроили автоматическое следование после переключения. Но что, если мы захотим пользоваться одной отдельной комбинацией для следования за главным, которая будет работать во всех окнах. В базовом скрипте нечто подобное уже есть на клавише Space. Убьём сразу двух зайцев - добавим универсальную клавишу следования и поменяем устаревший вариант пробела:

    <Hotkey Alt F>  // следование за главным
    <If ActiveWinIs WoW1>
    <ApplyTemplate TargetMain w2 w3 w4 w5 F2 F2 F2 F2 %Trigger%>

    <Else If ActiveWinIs WoW2>
    <ApplyTemplate TargetMain w1 w3 w4 w5 F2 F3 F3 F3 %Trigger%>

    <Else If ActiveWinIs WoW3>
    <ApplyTemplate TargetMain w2 w1 w4 w5 F3 F3 F4 F4 %Trigger%>

    <Else If ActiveWinIs WoW4>
    <ApplyTemplate TargetMain w2 w3 w1 w5 F4 F4 F4 F5 %Trigger%>

    <Else If ActiveWinIs WoW5>
    <ApplyTemplate TargetMain w2 w3 w4 w1 F5 F5 F5 F5 %Trigger%>
    <HotkeyUp ScrollLockOff Space>
    <SendLabel w1, w2, w3, w4, w5>
    <KeyUp Space> // отпускание клавиши Пробел

    // следование за тем персонажем, от лица которого на данный момент осуществляется управление
    <SendPC local>
    <DoHotkey Hotkey Alt F>


    Не забываем дополнить список исключений, чтобы комбинация не назначалась дважды:

    <ApplyTemplate Assign "Alt MainList except F4, F">

     

    Остальные бонусы

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

    <Hotkey Shift 6>  // пятиконечная пентаграмма для шаманов
    <SendLabel w1, w2, w3, w4, w5>
    <KeyUp Shift>

    <SendLabel w1>
    <Key F4>
    <SendLabel w2>
    <Key F5>
    <SendLabel w3>
    <Key F2>
    <SendLabel w4>
    <Key F3>
    <SendLabel w5>
    <Key F4>

    <SendLabel w1, w2, w3, w4, w5>
    <Key %TriggerMainKey%> // активация цепного лечения клавишей 6


    Как расставить персонажей для такого эффекта, мы уже разбирали здесь.

    Построить всех друг за другом для шествия по городу теперь проще простого:

    <Hotkey Shift 7>  // следование друг за другом
    <SendLabel w2>
    <Key F2>
    <SendLabel w3>
    <Key F3>
    <SendLabel w4>
    <Key F4>
    <SendLabel w5>
    <Key F5>
    <SendLabel w2, w3, w4, w5>
    <Key Alt F>


    Раньше ни один серьёзный бой не обходился без макроса, позволяющего при обычном нажатии лечить всем одну и ту же цель, а с нажатой клавишей Alt лечить главного персонажа. Воспользуюсь ситуацией и добавлю эту функцию в таком виде:

    <Hotkey Alt 5, 6>  // лечение главного персонажа
    <SendFocusWin>
    <Key %Trigger%>

    <If ActiveWinIs WoW1>
    <ApplyTemplate TargetMain w2 w3 w4 w5 F2 F2 F2 F2 %TriggerMainKey%>

    <Else If ActiveWinIs WoW2>
    <ApplyTemplate TargetMain w1 w3 w4 w5 F2 F3 F3 F3 %TriggerMainKey%>

    <Else If ActiveWinIs WoW3>
    <ApplyTemplate TargetMain w2 w1 w4 w5 F3 F3 F4 F4 %TriggerMainKey%>

    <Else If ActiveWinIs WoW4>
    <ApplyTemplate TargetMain w2 w3 w1 w5 F4 F4 F4 F5 %TriggerMainKey%>

    <Else If ActiveWinIs WoW5>
    <ApplyTemplate TargetMain w2 w3 w4 w1 F5 F5 F5 F5 %TriggerMainKey%>


    Вернёмся назад и добавим новые клавиши в исключения, иначе ничего не получится:

    <Hotkey ScrollLockOff AssistList; Ctrl AssistList; Alt AssistList except 5, 6>
    // ...

     

    Ошибка или потеря соединения

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

    Герой, последний присоединившийся к группе, оказывается в конце списка. Соответственно, те, кто до этого располагался за ним, смещаются ближе к началу. Никакого хаоса в группе при этом нет, просто несколько персонажей поменялись местами. Вот и ответ! Поменяем местами названия окон:

    <Command Party>
    <RenameWin WoW1 WoW_1>
    <RenameWin WoW2 WoW_2>
    <RenameWin WoW3 WoW_3>
    <RenameWin WoW4 WoW_4>
    <RenameWin WoW5 WoW_5>

    <RenameWin WoW_%1% WoW1>
    <RenameWin WoW_%2% WoW2>
    <RenameWin WoW_%3% WoW3>
    <RenameWin WoW_%4% WoW4>
    <RenameWin WoW_%5% WoW5>

    <DoHotkey Hotkey Pause>

    Для надёжности переименование разделено на два этапа. А на время работы команды горячие клавиши отключаются, чтобы они нам не мешали.

    На месте макрокоманд должны оказаться номера окон, соответствующие новому порядку в группе. Для передачи этих значений скрипту, я воспользуюсь потрясающей командой ThirdPartyCommandLine:

    <Hotkey Ctrl Esc>
    <ThirdPartyCommandLine Party Oem2 Esc 100>
    <DoHotkey Hotkey Pause>

    Как она работает? Нажимаем в игре Ctrl+Esc, открывается игровой чат. Затем пишем прямо туда цифры, разделённые пробелом. Нажимаем Enter, после чего цифры моментально обрабатывает пользовательская команда "Party", и наша группа снова жизнеспособна!

    Ещё раз на примере. Представим на минуту, что третье окно закрылось с ошибкой. Как всегда, я нажимаю Ctrl+Alt+L, чтобы запустить недостающее окно. Захожу, принимаю приглашение в группу, а персонаж из третьего окна оказывается последним в списке у остальных участников. Четвёртый встал на место третьего, а пятый перешёл на место четвёртого. Но все они получают прежние нажатия.

    Глядя из главного окна на группу, видно, что окна распределились в порядке "1 2 4 5 3". Эти цифры и нужно ввести в чат после вызова команды. Скрипт затронут не будет, и при следующем входе порядок восстановится.

     

    Определение главного в рейде

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

    Ситуацию исправит один макрос с именами героев (если окон 10, то два таких макроса, отличающиеся лишь никами):

    /target [nomod, target=Nickname_1]
    /target [mod:ctrl, nomod:alt, target=Nickname_2]
    /target [nomod:ctrl, mod:alt, target=Nickname_3]
    /target [mod:shift, target=Nickname_4]
    /target [mod:ctrl, mod:alt, target=Nickname_5]

    Закрепите их там, где не применяются модификаторы Ctrl, Alt и Shift. Пускай это будyт F11 и F12. Что из этого получилось, смотрите далее.

     

    Подведём итоги

    Результаты эксперимента таковы:

    Код внутри незначительно изменён, чтобы его было легче править, но принцип работы не изменился. Я не стал делать это в ходе эксперимента, чтобы было проще понять алгоритм.

    Итак, программа HotkeyNet справилась с главной задачей. Теперь, создавая группу, не нужно добавлять макросы на следование, атаку или лечение. Кроме того, у нас продолжает работать смена главного, и освободилась цель в фокусе.

    Работает всё не так чисто, как с системой "FTL" в ISBoxer или со старыми добрыми макросами. Почти всё время в цели у побочных персонажей находится главный. Тем не менее по сравнению с игрой, основанной на макросах, большой разницы я не ощутил.

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

    Перед нами не стояла задача сделать всё идеально и без погрешностей, так что можно закрыть глаза на мелкие недостатки. Ведь HotkeyNet является бесплатной программой, а функционал её богаче чем у некоторых платных решений, в чём мы с вами только что убедились.

     


    Понравился материал? Расскажи друзьям!

    Комментарии (1)
      • автор

      Pashted

      написал 12 месяцев назад

      Материал пополнился ещё двумя скриптами. Теперь для рейдов не нужно готовить макросы на все заклинания - достаточно одного!

    Оставить комментарий
    Вы комментируете как Гость.
    Все поля, отмеченные звёздочкой *, являются обязательными.

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