Макросы для чайников
Душесос 19 мар 2011, 20:59
Пристыдили, каюсь, забросил. Правда, не было уверенности в том, что эта тема кому-то полезна, резонанса не вызвала. Ну, что же, есть свободные несколько часов, можно написать еще главку.
Никакого по-настоящему сложного задания на проверку я не придумал, последняя глава была очень простой. Надеюсь, вы научились посылать питомца в атаку и отзывать его, включать автоматическую стрельбу и вставлять в макросы подсказки.
VI. Ситуация резко усложняется
Условные модификаторы команд.
Довольно часто (практически всегда) основная причина, заставляющая вас искать утешение в макросах, выглядит так: "Я хочу, чтобы при нажатии на кнопку происходило А, но если <что-нибудь>, то происходило B". Иными (программистскими) словами, нам нужны конструкции условных переходов типа "если-то-иначе". Если бы макросы не позволяли их строить, цена была бы им грошик и гайда они бы не стоили. По счастью, они это умеют.
Для того, чтобы использовать это умение, нам нужно узнать, по каким правилам нам такие условия записать. Иными (программистскими) словами, мы должны узнать синтаксис команды.
Он не слишком сложный. Если помните, все макро-команды мы записывали так:
- Код:
/команда к_чему_применить
На самом деле, это был сокращенный вариант полной записи команды. В общем случае, любая команда может быть записана так:
- Код:
/команда [условие1] к_чему_применить_если_условие1_выполнено; [условие2_если_не_выполнено_условие1] к_чему_применить_если_условие2_выполнено; ... (повторять до полного удовлетворения)
Вот еще одна попытка объяснить ту же структуру, более формальная, покороче:
- Код:
/команда [если] то действие1; [иначе, если] то действие2; ...
Сразу приведу пример, для наглядности. Если зажат модификатор alt, то нужно прокастить Бич агонии, а если не зажат, то Бич судьбы:
- Код:
/cast [mod:alt] Бич агонии; Бич судьбы
В этом примере я пропустил второе условие. То есть, если условие [mod:alt] не выполнено, то без дополнительных условий и экивоков мы переходим к Бичу судьбы.
А вот если, например, написать так:
- Код:
/cast [mod:alt] Бич агонии; [mod:shift] Бич судьбы
то при нажатии альта уйдет Агония, при шифте Судьба, а без модификаторов не произойдет вообще ничего.
И довольно важный момент для понимания: условия проверяются слева направо, если самое левое условие не выполнено, алгоритм переходит к следующему, по цепочке. Как только соответствие найдено, исполняется, что должно. То есть в предыдущем макросе, если вы зажмете альт и шифт одновременно, будет найден альт и в цель уйдет агония, ваш зажатый шифт макрос даже искать не станет.
В частных случаях можно опустить любую часть этой конструкции, кроме самой команды. Приведу столбик из макросов по мере уменьшения их "полноты", все рабочие:
- Код:
/cast [mod:alt] Бич агонии; [mod:shift] Бич судьбы; [] Порча
Пустые квадратные скобки иногда можно встретить в макросах, такие макросы пишут программисты. Это означает "если что угодно" и эквивалентно тому, чтобы вообще ничего не писать:
- Код:
/cast [mod:alt] Бич агонии; [mod:shift] Бич судьбы; Порча
Здесь я задал 3 вложенных проверки на условия. А вот макрос, в котором эта регулярная структура опущена, всего с одним условием на проверку:
- Код:
/cast [mod:alt] Горение души
/cast Камень здоровья
Макрос в любом случае съест камень, но при нажатом alt он сделает это под горением. В этом макросе в первой строке нет дополнительных условий и нет указаний что делать, если условие не выполнено. Таким образом, если alt не зажат, первая строчка просто ничего не делает.
Во второй строке этого макроса мы видим еще более вырожденный случай записи, каким мы привыкли его писать в предыдущих главах. На самом деле, тут, конечно же, тоже есть условие типа "что угодно", написанное в опущенных квадратных скобках и выполняющееся всегда. То есть, на самом деле, там вот так, просто мы не стали это писать (мы же не программисты):
- Код:
/cast [mod:alt] Горение души
/cast [] Камень здоровья
Наконец, самый вырожденный способ записи:
- Код:
/petattaсk
Как вы уже, наверное, догадались, в этой записи есть и параметры, и цель применения команды. В действительности, эта запись эквивалентна полной записи команды:
- Код:
/petattaсk [] target
Умный ВоВ нас понимает с полуслова, но это не должно вас путать. Даже когда команда записана в упрощенном виде, в глубине души она все равно всегда имеет структуру, которую я описал в самом начале:
- Код:
/команда [если] то действие1; [иначе, если] то действие2; ...
Эта особенность записи может приводить к шокирующим результатам, если о ней забыть. Например, очень просто поставить символ ";" в конце строки, создав тем самым пустой набор условий и целей выполнения команды после этого символа. Если до него в макросе стоят наборы условий, сумма которых гарантированно выполняется, до этого пустого набора макрос не доберется и ошибка не возникнет. Но если возникнет ситуация, когда макрос доберется до этой точки с запятой, вы получите ошибку исполнения макроса (если вы не поняли эту ремарку - просто запомните, что ";" в конце строки в макросах ставить не нужно).
Все эти условные переходы применимы ко всем командам, не только типа "cast". Например, вот макрос, который будет искать Душесоса и кидать в него Омоложение, но только в том случае, если он живой. А если неживой, то даже в цель его не заберет, а Омоложение уйдет в текущую цель.
- Код:
/target [nodead] Душесос
/cast Омоложение
Пока вы перевариваете синтаксис, я вывалю на вас список условий, которые могут быть использованы в макросах.
A) Условия состояния цели: help, harm, dead, party, raid и exists
1. Условие [help] определяет, является ли ваша цель той, на которую допустимо накладывать дружественные заклинания.
2. Условие [harm] работает по принципу [help] только для атакующих заклинаний, проверяя цель на допустимость атакующих заклинаний для вашей цели.
- Код:
/cast [help] Омоложение; [harm] Лунный огонь
Если состояние [help] истинно, дальше выполняется заклинание Омоложение, и макрос переходит к следующей строке. В противном случае (у вас или нету цели, или вы не можете использовать дружеское заклинание на текущую цель), неудача приводит к обработке следующего условия. Теперь макрос проверяет состояние [harm]. Если условие истинно, используется Лунный огонь. Если нет – (опять же нет цели, или цели невозможно навредить) больше ничего не выполняется, так как условий больше нет.
3. Условие [dead] вернет истину, если у вас есть цель, и она мертва.
4. Условия [party] и [raid] возвращают истину, если цель находится в вашей группе или рейде.
5. Условие [exists] определяет существует ли цель заклинания. Другими словами, если у вас нету цели, условие вернет ложь. Во многих случаях можно легко обойтись без условия [exists], поскольку [help], [harm], [dead], [party], и [raid] включают в себя это условие (если уж цель дружественна, значит она, как минимум, есть и проверять ее наличие дополнительно не нужно).
B) Условия состояния персонажа: group, combat, stance, stealth, channeling, pet и equipped (worn)
1. Условие [group] проверяет, состоите ли вы в группе. Кроме этого, она содержит два подусловия:
- [group:party] проверяет, состоите ли вы в группе до 5 ппл, то же самое, что просто [group] [group:raid] проверяет, состоите ли вы в рейде (вхождение в обычную группу заставит вернуть ложь)
2. Условие [combat] истинно, если вы находитесь в бою.
3. Условие [stance].
Стойка - это общее название всех ситуаций, когда определенные умения требуют нахождения в каких-либо формах или состояниях. Ауры паладинов (хоть они и находятся на панели форм) и аспекты охотников не являются стойками, поскольку не требуют "быть в состоянии Х".
В простейшем случае [stance] означает, что вы находитесь в любой из стоек/форм. Это не слишком часто полезно, поэтому обычно условие используется с дополнительным параметром - номером стойки (или списком номеров стоек). В общем случае записывается это так: [stance:1/2/.../n] где n - это номер стойки.
Тут есть мелкий трюк: [stance:0] означает состояние "без стойки", что позволяет использовать условия вроде [stance:0/3] чтобы проверить, находитесь ли вы в стойке 3, или вообще без стоек.
Стойки сами по себе имеют такие же порядковые номера, как их положение на панели стоек/форм. К примеру, формы друида начиная с Медведя, Аква-формы, Кота и Формы для путешествий будет иметь номера стоек с 1 по 4. Приведу номера всех стоек для всех классов:
Воин
- Стойка 1 Боевая стойка Стойка 2 Оборонительная стойка Стойка 3 Стойка берсерка
- Стойка 1 Облик медведя Стойка 2 Водный облик Стойка 3 Облик кошки Стойка 4 Походный облик Стойка 5 Облик лунного совуха / Древо жизни Стойка 6 Облик птицы
Жрец
- Стойка 1 Облик Тьмы
- Стойка 1 Незаметность
- Стойка 1 Призрачный волк
Пример использования для воина. Если вы не в боевой стойке, первое нажатие переведет в нее, а второе (после отката ГКД) всадит Превосходство. Если вы уже в стойке, просто уйдет Превосходство.
4. Условие [stealth] используется для проверки состояния невидимости. Разбойникам может показаться, что, поскольку у разбойников нет других стоек, эта опция работает идентично [stance]. Однако, [stealth] применимо к расовому умению ночных эльфов, невидимости магов и любой другой невидимости, не связанной со стойками.
5. Условие [channeling].
Существует класс поддерживаемых заклинаний, так называемых потоковых. Обычно, если вы вливаете заклинание (т.е. выполняете чэннелинг) и начинаете накладывать другое, оно прервет процесс вливания. Условие [channeling] позволяет избежать таких случаев (с использованием префикса no, описанным ниже), либо, наоборот, создавать макросы на действия, связанные с тем, что вы поддерживаете какое-то заклинание. Ну, например, вы бегаете в афли в ПвП с суккубой и хотите кастить страх сами, но если вы поддерживаете Похищение жизни или души, страховать себя поцелуем от девочки, а не прерывать каст:
- Код:
/cast [channeling] Соблазн; Страх
Очевидно, это не самый умный стиль игры, но хорошо иллюстрирует данное условие.
Условие [channeling] без дополнительных параметров отвечает любому заклинанию, но можно также использовать произвольный список имен заклинаний для проверки. Вот так:
- Код:
/cast [channeling: Похищение жизни] Соблазн; Страх
6. Условие [pet].
Все классы с питомцами должны оценить полезность этого условия. Она позволяет выбирать нужное действие в зависимости от активного питомца. Можно указать имя питомца или его тип (Voidwalker, Boar, Imp, Wolf и т.д.). Само по себе [pet] означает любого из питомцев, однако можно написать [pet: Джажеми] или [pet: Voidwalker] для указания конкретного пета по его имени или типу. В общем случае список питомцев записывается так: [pet:P1/P2/.../Pn], где Pn - имя или тип питомца. Например, [pet: Джажеми/Хэлкрито].
Вот пример макроса, позволяющий магам выбирать между заклинанием Холод у элементаля и своим собственным заклинанием Кольцо льда:
- Код:
/cast [pet] Холод ; Кольцо льда
Если у вас есть питомец, то будет предпринята попытка запустить Холод, если нет - Кольцо льда
Или макрос на использование абилок петов чернокнижника с использованием их имен:
- Код:
/cast [pet: Хэлкрито] Жертвоприношение; [pet: Джажеми] Пожирание магии
Если со мной Хэлкрито, прикроюсь щитом от него, а если Джажеми, пусть съест положительный эффект с цели.
7. Условие [equipped] или [worn] позволяет определять надет ли заданный тип предмета. Условие [equipped] полностью идентично условию [worn], экономящему несколько символов. Типом предмета может быть номер ячейки инвентаря, и собственно, тип или подтип предмета. За подробностями к списку типов обращайтесь на wowwiki, иначе я никогда не закончу эту главу. Синтаксис: [equipped: <тип предмета>]. Это может быть полезно, скажем, воинам, которые не могут использовать ряд умений, если не экипирован щит. Таким образом, можно изменять поведение одной и той же кнопки в зависимости от того, в какой вы стойке и что на вас надето.
C) Еще несколько малозначимых условий, для справки: mounted, swimming, flying, indoors, outdoors и flyable
1. Условия [mounted], [swimming], [flying], [indoors] и [outdoors] проверяют, соответственно, верхом ли вы, находитесь в воде, в полете, внутри, или вне помещения. Вряд ли стоит описывать их детально. Эти условия не имеют модификаторов и применимы только к вашему персонажу. Наиболее реальные применения для этих условий я вижу в области управления средствами передвижения.
2. Условие [flyable] проверяет, находитесь ли вы в зоне, где возможны полеты. Даже с приходом Катаклизма остались зоны, где это условие вернет ложь. Ну, аналогично предыдущему, в макросах на маунтов имеет применение.
D) Условия управления вводом: modifier (mod), button (btn), actionbar (bar) и bonusbar
1. Условие [modifier] предназначено для проверки нажатий клавиш-модификаторов. Клавиши-модификаторы хороший способ сберечь место на панелях действий, уменьшить количество кнопок для запоминания, а также путь к принятию определенных решений. Разумное использование модификаторов - упаковка нескольких заклинаний в одну кнопку, либо "подбафывание" заклинаний дополнительными эффектами при зажатом модификаторе. Примеры использования я уже приводил.
Условие [modifier] аналогично условию [mod], экономящему несколько символов. Без дополнительных параметров условие возвращает истину, если нажата любая из клавиш-модификаторов. Список параметров устанавливается в том же формате, что и для других условий: [mod: alt/shift/ctrl].
Будьте внимательны с установкой кнопок в ваших макросах. Если вы свяжите кнопку А с макросом, имеющим в себе, к примеру, модификатор [mod:shift], и при этом существует клавиатурная комбинация shift-A, связанная с чем-либо еще, макрос не выполнится, так как клавиатурные комбинации имеют больший приоритет. Аналогично тому, что вы не сможете назначить в ВоВ в качестве клавиатурной комбинации alt-f4 или alt-tab.
Немного необязательной информации. В то время как клавиатурными модификаторами могут быть только shift, ctrl или alt, существует также набор системных переменных, которые также можно использовать в качестве модификаторов условий. Скажем, переменная SELFCAST означает «если включен модификатор на автоматическое использование заклинаний на себя» (значение этого модификатора устанавливается в настройках игры). Если в макросе вы пропишете эту переменную в формате [mod: SELFCAST], то при переопределении кнопки в интерфейсе переопределится и поведение макроса. Если придумаете, зачем это нужно, расскажите. Тем не менее, вот некоторые другие из переменных и их значения по умолчанию:
- AUTOLOOTTOGGLE (shift) – авто-сбор предметов STICKYCAMERA (ctrl) – статичная камера SPLITSTACK (shift) – разделение стопок PICKUPACTION (shift) – действие для подбора предметов COMPAREITEMS (shift) – сравнение предметов OPENALLBAGS (shift) – открытие всех сумок QUESTWATCHTOGGLE (shift) – слежение за квестами
2. Условие [button] или [btn] делает примерно тот же трюк, что и [mod], но в зависимости от того, какая кнопка мыши использована для активирования макроса. Синтаксис: [btn:1/2…/5]. Номера кнопок с 1 по 5 соответствуют левой, правой и средней кнопкам, а также кнопкам 4 и 5 (если такие есть на вашей мышке). Если ваш макрос активируется по нажатию с клавиатуры, это также удовлетворяет условию [btn:1].
Таким образом, вы можете задать "стандартное" поведение кнопки при нажатии с клавиатуры, либо "нестандартное" при нажатии нелевой кнопкой мышки на кнопку на панели. Для боевых условий это может сгодиться для "съесть камень" или "бинтоваться" кликом правой клавишей по кнопке, которая с клавиатуры делает что-то важное. В рамках минимизации кнопок на панели и компактизации интерфейса. Зато для призыва аж 5 разных маунтов можно использовать всего одну кнопку и мышиное пианино.
3. Условие [actionbar] или [bar], синтаксис: [bar:1/2…/6]. Интерфейс по умолчанию предоставляет некоторое число страниц для панели действий. Эти страницы применимы только к нежней левой панели действия, видимой в интерфейсе по умолчанию. Данное условие позволяет наделать макросов, которые соответствуют разным страницам панели действий, и разместить их на других панелях. Один из примеров, позволяющий охотникам создавать "псевдостойки" с помощью аспектов (уж не знаю, насколько это имеет смысл, использую в качестве иллюстрации):
- Код:
/swapactionbar 1 2
/cast [actionbar:1] Дух ястреба; Дух лисицы
Этот макрос переключается между панелями действий 1 и 2. Когда он переключает панель на номер 1, он использует Дух ястреба, когда на номер 2 – использует Дух лисицы.
4. Условие [bonusbar], синтаксис: [bonusbar:1/2…/5]. Любой из классов, чьи панели действий основаны на определенных условиях (стойки, режим скрытности, владение и так далее), используют дополнительную, «бонусную панель», которая заменяет страницу 1 основной панели действий. Данное условие проверяет, активирована ли эта панель.
Например, когда жрец контролирует ум какой либо цели, его панель действий использует «бонусную» панель №5. Значит, можно сделать следующий макрос для переключений:
- Код:
/cast [nobonusbar:5] Контроль над разумом
/cancelaura Контроль над разумом
Для детального описания по классам и их бонусным панелям, читайте wowwiki.
Префикс no
К любому из перечисленных условий можно добавить префикс "no". Например, [nodead] будет правдой, если ваша цель не мертва, а [noharm] - если ваша цель не враждебна. Это, кстати, имеет смысл, поскольку "невраждебна" не означает "дружественна" (например, труп сопартийца не является легальной целью дружественных заклинаний, как и враждебных). Аналогично, [nomod:alt] будет правдой, если альт не нажат. Ну и так далее.
Объединение различных условий
Все эти условия можно комбинировать как по принципу " условие И условие", так и по принципу "условие ИЛИ условие", а также комбинировать И и ИЛИ. Вы, наверное, догадывались, но сказать и описать синтаксис, нужно.
Делается это так:
- Условие И условие
Условия, которые должны быть выполнены одновременно, перечисляются в квадратных скобках через запятую.
- Код: Выделить всё
/cast [nostance, swimming] Водный облик; [nostance, outdoors] Походный облик
Если вы не в форме И в воде, то Водный облик, иначе если вы не в форме И на пленере, то Походный облик. - Условие ИЛИ условие
Условия, истинность любого из которых вас устраивает, перечисляются в отдельных квадратных скобках.
- Код:
/cast [mod:alt] [btn:2] Жизнеотвод; Похищение жизни
Если зажат Alt, ИЛИ макрос активирован правой кнопкой мыши, то Жизнеотвод, иначе - Похищение жизни.
Тут есть важный момент для понимания: условия будут проверяться также слева направо, если первая скобка не выполняется, происходит переход к проверке второй. Таким образом, можно создавать последовательности проверок, задавая им приоритет. Актуальный пример такого подхода приведен ниже, в разделе target=unit. Можно создать цепочку, заканчивающуюся условием, "а если ничего из этого не случилось, то просто скастить, без условий". Для этого добавляют в конец цепочки квадратные скобки и оставляют пустыми. Что-то вроде такого (хотя именно в такой реализации это и лишено смысла, но для нормального жизнеспособного примера опять не хватает изложенного материала)
- Код:
/cast [mod:alt] [btn:2] [] Жизнеотвод
- Комбинирование И и ИЛИ
Эти условия можно объединять, и в этом основная сила. Синтаксис от этого не меняется. Ну, скажем, можно построить такой макрос:
- Код:
/cast [help, dead] [target=targettarget, help, dead] [target=mouseover, help, dead] [target=focus, help, dead] Возрождение
Макрос делает кучу проверок на тему БР: мертва ли ваша цель И можно ли поднять; ИЛИ мертва ли цель вашей цели И можно ли ее поднять; ИЛИ есть ли у вас под мышью поднимаемый мертвец; ИЛИ является ли ваш фокус поднимаемым мертвецом.
Про новое условие target=unit, использованное в этом макросе, читаем прямо сейчас.
target=unit (@unit)
В дополнения к проверке условий, система макро опций предоставляет способ назначать цели для разных действий. Назначение целей записывается так же, как условия, хотя условием не является и всегда возвращает истину. Это вносит некоторую путаницу, конечно, но зато унифицирует запись. То есть запись такого вида
- Код:
/cast [target=player] Омоложение
отправляет заклинание в самого игрока, не меняя его текущую цель. Псевдоусловие [target=player] всегда истинно, поэтому писать что-то вроде
- Код:
/cast [target=player] Омоложение; [mod:alt] Буйный рост
абсолютно бессмысленно, до второго условия макрос никогда не доберется. Следующая запись полностью идентична первой и позволяет сэкономить знаки:
- Код:
/cast [@player] Омоложение
В качестве цели может быть использована любая цель для прицеливания из списка, который я приводил в одной из предыдущих глав для команды /target.
Кроме установки цели для выполняемого действия, опция [target=] также задает цель для проверки условий. То есть, если мы скомбинируем ее с другими условиями, то эти условия будут проверяться не на вашей текущей цели, а на цели, прописанной в параметре [target=]. Это, разумеется, очень логично. Вот макрос, помогающий понять, как это работает:
- Код:
/cast [help] [target=targettarget, help] [target=player] Омоложение
Сначала макрос проверяет на срабатывание условие [help]. Если оно истинно, управление передается команде /cast c параметром Омоложение (Омоложение уходит в текущую цель). Если нет – переходит к следующему условию, [target=targettarget, help]. Здесь происходит та же проверка на дружественность цели, но в этот раз определяется, является ли цель вашей цели дружественной. Если так, выполняется /cast Омоложение, но целью для команды /cast устанавливается цель вашей цели. Если же нужная цель так и не найдена (цель вашей цели не существует или не является дружественной), макрос перейдет к следующему условию, [target=player]. Так как действительных условий здесь нет, оно всегда будет истинно, что приведет к накладыванию Омоложения на самого игрока.
Теперь вы знаете более, чем достаточно, для написания любой, самой хитрой кнопки вашей мечты. Впрочем, подозреваю, у вас пока нет чутья на то, что со всем этим богатством возможностей можно сделать. Поэтому следующую главу, когда я доберусь до ее написания, я постараюсь посвятить примерам того, как это богатство можно применить. Ибо теория без практики мертва.
Часть первая
Часть вторая
Часть третья
Часть четвертая и пятая
Часть шестая и последняя
"Бывшего ГМа и РЛа" как-то грустно звучит =(
ОтветитьУдалитьЗамечательный гайд, только поправь там petattak на petattack, для проформы.
ОтветитьУдалить2Няшель: у я в ВоВ больше не играю, так что моего бывшего - все точно :) А грстно... Ну да, всегда грустно, когда кончается эпоха.
ОтветитьУдалить2Палыч: по моему скромному мнению гайд - самый лучший из всех. :) Поэтому я и утащил его к себе, а то фиг бы его кто-нибудь нашел. Спасибо за правки - подредактировал.
Добрый день, нужен макрос на быстрое разделения паков то есть, имеется пак 20 штук, нажав на макрос нужно чтобы он отделил сразу 1-19 штук и я уже сам ложил куда мне удобно,
ОтветитьУдалитьвозможно ли такое?
к сожалению, автор гайда уже не играет. И достаточно давно. так что узнать его мнение я не могу. А я сам, к сожалению, не особо разбираюсь в макросах :(
ОтветитьУдалитьну вот наконец-то я нашел то что искал довольно длительное время. это лучший гайд котороый мог бы быть по макросам. и думаю он никогда не перестанет быть актуальным для тех кто играет в вовку. респект и уважуха. спасибо огромное
ОтветитьУдалитьДа, гайд отличный. Я очень рад, что я его сохранил для истории :)
УдалитьЯ очень долго ищу нормальные макросы на энха в паче 3.3.5а (лк) наткнулся на гайд по созданию всё что тут было перечислено вообще не работает! Все комбинации. Моя примитивная цель состояла в том что-бы забиндить на 1 кнопку 4 скила ну или хотябы 2 не showtolltip не castguence не работают с энхом или я рак прошу объясните как мне это зделать?
ОтветитьУдалитьЭто пиратка, я так понимаю? Достаточно проверить - там вообще макросы работают, хоть какие-нибудь? Дело в том, что в современном ВоВ макросы хранятся на сервер. Боюсь, что пираты могли тупо не реализовать эту часть.
УдалитьА все, что тут написано - работает. проверено лично :)