Macroworld (part 2)

[Offline] в блоге [Offline]'s notes

Опубликовано: 17 июля 2013 в 08:03



Любой более-менее опытный игрок так или иначе использует макросы. Хотя многие, как ни странно, просто копируют их с разных форумов и сайтов, абсолютно не разбираясь в том, как эти макросы работают. В этой статье я попытался собрать о них наиболее полезную информацию и простым языком объяснить принципы их действия, начав с самых основ и заканчивая написанием скрипта, который одним кликом продаёт все серые предметы из сумок.
 
Как заставить абилку отображаться с другой иконкой? Как сделать запароленный канал чата? Как вызвать случайного маунта из нескольких? Как одним кликом выбрать цель цели второго активного босса в текущем бою? Если такие вопросы вызывают сложности, читайте часть 1. Если же с основами всё понятно, добро пожаловать в продолжение. Здесь будет интереснее.


Conditionals (macro options)

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

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

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

/cast [harm] Sinister Strike

Если цель дружественная или вообще не выбрана, такой макрос не сделает ничего, избавляя игрока от фразы наподобие «я не могу атаковать эту цель». Теперь вспомним макрос из первой части, в котором мы сапаем цель, если находимся в стесле, либо просто атакуем её в противном случае:

/cast [stealth] Sap; Sinister Strike

Здесь мы сначала проверяем, находится ли персонаж в режиме невидимости, а затем выполняем команду /cast с параметром Sap в случае положительного результата, либо с параметром Sinister Strike в случае отрицательного. Этот же макрос можно усложнить:

/cast [stealth, harm] Sap; [harm] Sinister Strike

Логика подробно и разноцветно показана на рисунке:



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

exists — цель существует (выбрана)
dead — цель существует и мертва
harm — цель существует, и её можно атаковать
help — цель существует и является дружественной
party — цель существует и находится в одной группе с персонажем
raid — цель существует и находится в одном рейде с персонажем
combat — персонаж в бою
stealth — персонаж в режиме невидимости
swimming — персонаж плавает
mounted — персонаж находится на средстве передвижения
flying — персонаж находится в воздухе на летающем средстве передвижения
indoors — персонаж находится в помещении
outdoors — персонаж находится на улице (не в помещении)
flyable — персонаж находится в зоне, где можно летать
petbattle — персонаж находится в режиме битвы питомцев

Если к началу любого из этих слов приписать no, то получим отрицание соответствующего условия. Например, nocombat будет означать "персонаж не в бою".



Некоторые условия требуют наличия своих собственных внутренних параметров. Эти параметры указываются сразу же после ключевого слова через двоеточие - условие:параметр.

Например, условие  equipped проверяет, одет ли предмет определённого типа на персонаже и требует название этого типа экипировки в качестве параметра. Вот в таком макросе

/equipslot [equipped:Shields] 17 Merciless Gladiator's Cleaver; 17 Crest of the Sha'tar

условие equipped:Shields означает "на персонаже надет щит" и используется для выбора действия: взять оружие (если надет щит) или взять щит (если он не надет).

Фактически, это позволяет сделать кнопку для переключения между несколькими типами оружия, которую можно юзать не заботясь о том, что именно надето сейчас, а иконка будет показывать результат такого переключения. Таким же образом можно не только переодевать одну вещь, но и вне боя менять сразу всю экипировку, используя встроенный менеджер сетов и соответствующую ему команду /equipset. Если у нас сет для танкования назван Tank, а сет на дд называется DPS, то для быстрого переключения можно юзать макрос:

/equipset [equipped:Shields] DPS; Tank

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

Другие типы экипировки, которые можно скормить условию equipped:

Spoiler
Броня:

Cloth
Leather
Mail
Plate
Shields


Оружие:

Bows
Crossbows
Daggers
Guns
Fishing Poles
Fist Weapons
Miscellaneous
One-Handed Axes
One-Handed Maces
One-Handed Swords
Polearms
Staves
Thrown
Two-Handed Axes
Two-Handed Maces
Two-Handed Swords
Wands


Типы оружия:

One-Hand
Two-Hand


Вместо слова equipped можно использовать worn, которое работает точно так же.



Иногда условия могут принимать несколько параметров. Для их разделения используется символ "/", который здесь означает "или". В общем виде это можно записать так:

условие:параметр_1/параметр_2/.../параметр_N

Например, условие group проверяет, находится ли персонаж в группе или рейде:

group:party - персонаж находится в группе
group:raid - персонаж находится в рейде
group:party/raid - персонаж находится в группе или рейде

Аналогично работает условие spec, которым можно проверить, какой из двух наборов талантов на данный момент активен:

spec:1 - активна первая специализация
spec:2 - активна вторая специализация
spec:1/2 - активна первая или вторая специализация (фактически, любой спек)

Команда /usetalents с параметрами 1 или 2 переключает персонажа в соответствующий спек. Респекаться удобно вот таким макросом:

/usetalents [spec:1] 2; 1


So sweet stances, so cute forms...

Многие классы имеют несколько форм или стоек, в которых могут работать или не работать те или иные способности. Поэтому при использовании макроса бывает важно проверить, в какой форме или стойке в этот момент находится персонаж. Делается это с помощью условия stance или form, которые взаимозаменяемы и действуют абсолютно одинаково. В качестве параметров они принимают номера стоек от 0 до 6. Соответствие этих номеров формам различных классов показано в таблице:



Если у друида нет формы совуха или дерева, то формы для полётов вместо номера 6 будут иметь номер 5. Ноль всегда означает, что ни одна из форм не включена.

В качестве примера используем макрос для друля, который в форме медведя или кошки кастует Mangle, а вне какой-либо формы кастует Wrath:

/cast [form:1/3] Mangle; [noform] Wrath

Здесь вместо noform точно так же можно было использовать form:0 или stance:0.

Более сложный пример - макрос для воина:

#show [equipped:Shields] Shield Bash; Pummel
/cast [equipped:Shields,stance:1/2] Shield Bash; [equipped:Shields] Defensive Stance; [stance:3] Pummel; Berserker Stance


Во-первых, здесь мы заставляем метакоманду #show показывать иконку Shield Bash или Pummel в зависимости от того, надет ли на персонаже щит. Во-вторых, запускаем алгоритм действий, логика которого показана на картинке:



Для быстрого выхода из формы можно использовать макрос с командой /cancelform. Эта команда тоже способна принимать условия, например вот в таком виде у друида она сработает только для формы тюленя:

/cancelform [form:2]


Hold her keys, click her buttons...

Можно заставить макрос вести себя по разному, если мы используем его при зажатой кнопке Shift, Ctrl или Alt. Для этого используется условие mod или modifier c соответствующими параметрами:

mod:shift - зажат Shift
mod:ctrl - зажат Ctrl
mod:alt - зажат Alt

Если написать mod без параметров, то это будет эквивалентно записи mod:shift/ctrl/alt, т.е. "зажата любая из кнопок Shift, Ctrl и Alt ".

Пример использования для мага, где мы при зажатом шифте или альте делаем нямку, в противном случае делаем воду:

/cast [mod:shift/alt] Conjure Food; Conjure Water

Более сложный пример с извращениями для ханта:

/cast [mod:alt, mod:ctrl] Chimera Shot; [mod:ctrl] Arcane Shot; Steady Shot

Здесь мы кастуем Chimera Shot при одновременно зажатых Ctrl и Alt, Arcane Shot при зажатом Ctrl, либо Steady Shot во всех остальных случаях.

Условие mod можно юзать с некоторыми системными переменными. Например, если в настройках игры мы поставили, чтобы при какой-либо зажатой кнопке заклинание кастовалось на себя, то эта информация запишется в переменной SELFCAST, а макросом

/cast [mod:SELFCAST] Greater Heal

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



Можно заставить макрос вести себя по разному в зависимости от того, какой кнопкой мыши мы его кликнули. Для этого используется условие btn или button, которое принимает параметры от 1 до 5, соответствующие кнопкам мыши:

1 - левая кнопка (по умолчанию)
2 - правая кнопка
3 - средняя кнопка
4 и 5 - кнопка 4 и кнопка 5

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

/userandom [nobtn:2, flyable, nomounted] Ebon Gryphon; [nomounted] Black Battlestrider, Swift Green Mechanostrider
/dismount [noflying] [btn:2]


Здесь логика такова:

- если мы не на маунте, левый клик выберет грифона в зоне с разрешёнными полётами или случайного из двух наземных маунтов в бесполётной зоне, правый клик всегда выберет случайного из двух наземных маунтов

- если мы на маунте, левый клик заставит персонажа слезть только когда он не в воздухе, правый клик заставит слезть всегда.

Хватит заваливать любимыми маунтами боковые панельки, засуньте их всех в один макрос.


Show me your units

Когда шла речь командах для выбора цели, был приведён список UnitID, которые можно использовать в качестве параметра для таких команд, и которые фактически являются ссылками на различные окружающие объекты относительно текущего состояния персонажа. Многие из показанных выше ключевых слов для проверки условий (такие как harm, dead, exists и т.д.) проверяют состояние текущей цели, т.е. по умолчанию привязаны к юниту target. Похожим образом ведут себя и некоторые команды, например /focus так же по умолчанию принимает параметр target и устанавливает в качестве фокуса текущую цель.

Так вот, существует возможность привязать эти ключевые слова и команды вместо target к любому другому UnitID. Чтобы это сделать, нужно в качестве одного из условий указать соответствующий UnitID с символом @ впереди него. Таким образом, например, в записи [@party3, dead] условие dead вместо текущей цели проверит, мёртв ли третий персонаж в группе.

Вот в таком макросе

/cast [@mouseover, harm] Corruption; Life Tap

условие harm будет применяться к объекту под курсором мыши, поскольку его UnitID по умолчанию target заменён на mouseover, а в случае невыполнения условия команда /cast Life Tap скастуется как обычно, поскольку никаких модификаторов перед этим заклинанием нет.

Ещё один пример: команда

/focus [dead] [noharm]

выберет цель в фокус, если цель мертва или не враждебна, а команда

/focus [@focus, dead] [@focus, noharm]

выберет цель в фокус, если текущий объект в фокусе мёртв или не враждебен.



Что нам даёт вся эта хрень? Допустим, мы играем магом, и РЛ хочет, чтобы мы постоянно контролили определённую цель. Заранее сохраняем её в фокус и, когда необходимо, кастуем на неё овцу, не меняя текущего таргета:

/cast [@focus] Polymorph

Усложним задачу. Допустим, у нас кривой РЛ, и цели раздать нормально не может. Тогда делаем так:

/focus [@focus, noharm] [@focus, dead] [mod:shift]
/cast [@focus, exists] Polymorph


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

В некоторых случаях можно заставить одну и ту же команду в макросе применяться к разным UnitID в зависимости от поставленных условий. Для этого, в частности, можно юзануть пустые условия [ ], которые всегда означают "да". Молчание - знак согласия:

/cast [@focus, help] [ ] Holy Light

Здесь мы хилим фокус, если там дружественный юнит, либо хилим текущую цель в противном случае. Так происходит потому, что хил в этом макросе должен скастоваться при выполнении первого или второго условия. Срабатывание первого заставит команду /cast к привязаться юниту focus. Если же первое условие не выполняется, то второе выполняется всегда, заставив хил скастоваться на юнит по умолчанию, т.е. на цель.


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

В продолжении:

- полезные команды и макросы для боя и рейдов
- системные команды и управление интерфейсом
- использование WoW API и обещанный скрипт на продажу серых предметов


to be continued...
  • 4891
  • 2

Комментарии:

70479 fcb26f6991fd3a198a693a8e96217198
17 июля 2013 в 11:16
СПАСИБО!!! вынес в закладки
Default avatar
18 июля 2013 в 18:44
Спасибо за любовь к Русскому языку ;)