eventMacro: различия между версиями

Материал из Руководство по OpenKore
Перейти к навигации Перейти к поиску
м Подправил пару ссылок на категорию консольные команды.
 
(не показано 47 промежуточных версий 2 участников)
Строка 1: Строка 1:
== Описание ==
== Описание ==
* Этот плагин представляет собой переделанный и обновлённый [[macro|macro плагин]] , написанный таким образом, чтобы потреблять меньше процессорной мощности. Имеет более расширенный функционал по сравнению со своим предшественником.
* Этот плагин представляет собой переделанный и обновлённый [[macro|macro плагин]], написанный таким образом, чтобы потреблять меньше процессорной мощности. Имеет более расширенный функционал по сравнению со своим предшественником.
* С помощью этого плагина, Вы сможете составлять блоки с условиями, называемые [[:Category:eventMacro_automacros|автомакросами]] (automacro) и блоки исполняемых инструкций, называемые макросами (macro).
* С помощью этого плагина, Вы сможете составлять блоки с условиями, называемые [[:Category:eventMacro_automacros|автомакросами]] (automacro) и блоки исполняемых инструкций, называемые макросами (macro).
* Автомакросы срабатывают при достижении условий, описанных в блоке (например, появление определённого слова в чате, или достижение определённого уровня, и т.д.). По результату срабатывания выполняется один или несколько макросов.
* Автомакросы срабатывают при достижении условий, описанных в блоке (например, появление определённого слова в чате, или достижение определённого уровня, и т.д.). По результату срабатывания выполняется один или несколько макросов.
Строка 133: Строка 133:
     yattayatta..
     yattayatta..
  }
  }
* Вы можете использовать любое имя для макроса (кроме символа "пробел"). Следите чтобы макросы не назывались одинаково, иначе не один из этих макросов не будет загружен.
* Вы можете использовать любое имя для макроса (кроме символа "пробел"). Следите, чтобы макросы не назывались одинаково, иначе ни один из этих макросов не будет загружен.
* Команды в макросе выполняются по порядку сверху вниз.
* Команды в макросе выполняются по порядку сверху вниз.
* В теле макроса можно использовать ТОЛЬКО специальные макро-команды. Чтобы вызвать в теле макроса [[Console Commands|консольную команду]], следует использовать макро-команду '''do'''.
* В теле макроса можно использовать ТОЛЬКО специальные макро-команды. Чтобы вызвать в теле макроса [[:Category:Console_Command|консольную команду]], следует использовать макро-команду '''do'''.


=== Макро-команды ===
=== Макро-команды ===


; do <''команда''>
; do <''команда''>
: выполняет <''команду''>, как будто она была набрана в консоли OpenKore. См. список [[Console Commands|консольных команд]].
: выполняет <''команду''>, как будто она была набрана в консоли OpenKore. См. список [[:Category:Console_Command|консольных команд]].


  macro foo {
  macro foo {
     do move 123 234 prontera
     do [[move]] 123 234 prontera
     do sit
     do [[sit]]
     do c привет!
     do [[c]] привет!
  }
  }


<span style="color:red">Команда ''[[ai|ai clear]]'' по умолчанию выключена в плагине, т.е. её не удастся выполнить через макрос.</span style><br>
<span style="color:red">Команда ''[[ai|ai clear]]'' по умолчанию выключена в плагине, т.е. её не удастся выполнить через макрос.</span style><br>
<span style="color:red">Если выполнится команда ''do ai off'', то макрос остановит своё выполнение. Также после команды ''do ai manual'' может остановиться проверка условий автомакросов (см. параметр [[eventMacro_CheckOnAI]])</span style>
<span style="color:red">Если выполнится команда ''do [[ai]] off'', то макрос остановит своё выполнение. Также после команды ''do [[ai]] manual'' может остановиться проверка условий автомакросов (см. параметр [[eventMacro_CheckOnAI]])</span style>


; log <''текст''>
; log <''текст''>
Строка 287: Строка 287:
  [eventmacro message] сумма 2 и 3 равна 5
  [eventmacro message] сумма 2 и 3 равна 5


'''У скаляров есть следующая функция:'''
; &defined($<''переменная''>})
: Функции &defined требуется указать <''переменную''>, существование которой следует проверить. Если <''переменная''> существует, то функция вернёт <code>1</code>, в противном случае - <code>0</code>.
: '''Примечание''': если значение переменной =0, то считается, что она существует, т.е. функция &defined вернёт "1".
macro defined {
  $var = 0;
  @array = (a, b)
  %hash = (a => 1, b => 2)
  log переменная \$var существует: &defined($var)
  log элемент 1 в массиве \@array - существует: &defined($array[1])
  log ключа "с" в хэше \%hash - не существует: &defined($hash{c})
}
: В консоли увидим:
[eventmacro message] переменная $var существует: 1
[eventmacro message] элемент 1 в массиве @array - существует: 1
[eventmacro message] ключа "с" в хэше %hash - не существует: 0
----


===== Массив =====
===== Массив =====
Строка 405: Строка 426:
: Обратите внимание, что функция &unshift сдвигает весь массив вправо, т.е. последний добавленный элемент 'Мая', оказывается на первом месте.
: Обратите внимание, что функция &unshift сдвигает весь массив вправо, т.е. последний добавленный элемент 'Мая', оказывается на первом месте.


----


===== Хэш =====
===== Хэш =====
Строка 424: Строка 446:
  [eventmacro message] Возраст Каи: 25 лет, а Намрока: 32 года
  [eventmacro message] Возраст Каи: 25 лет, а Намрока: 32 года


:* Элементы хеша - это обычные скаляры.
:* значения ключей хеша - это обычные скаляры.


:: Элементу хеша можно присвоить значение:
:: Значениям хеша можно присвоить данные:
  $name{first} = Гарри
  $name{first} = Гарри
  $name{last} = Поттер
  $name{last} = Поттер


:: Элемент хеша можно увеличить\уменьшить на единицу:
:: Числовые значения хеша можно увеличить\уменьшить на единицу:
  macro Counter {
  macro Counter {
     $hash{monterskilled} = 0
     $hash{monterskilled} = 0
Строка 440: Строка 462:
  }
  }


:: Элемент хеша можно уничтожить, присвоив ему специальное слово '''undef''' или '''unset''':
:: Значение ключа хеша можно уничтожить, присвоив ему специальное слово '''undef''' или '''unset''':
  macro undef {
  macro undef {
     $myhash{value} = 1
     $myhash{value} = 1
Строка 452: Строка 474:
  [eventmacro message] $myhash{value} теперь уничтожена:
  [eventmacro message] $myhash{value} теперь уничтожена:


:* Для хеша есть функция '''&delete''', которая удаляет ключ из хеша:
; Функции для работы с хэшами
  macro delete {
: Существует две функции, которые предназначены для работы с хэшами:
    %fruitsprice = (apple => 1000, banana => 700)
:# '''&delete''': удаляет пару ключ\значение
    log Хэш \%fruitsprice состоит из  %fruitsprice элеметов
:# '''&exists''': проверяет существует ли значение у заданного ключа
    log Цена на яблоки: $fruitsprice{apple}, а на бананы: $fruitsprice{banana}
 
    &delete($fruitsprice{apple})
; &delete($<''хэш''>{<''ключ''>})
    log Хэш \%fruitsprice состоит из %fruitsprice элемента
: Функции &delete требуется указать ключ хэша, который следует удалить, например: <code>&delete ( $hash{key} )</code>
    log Цена на бананы: $fruitsprice{banana}
 
    log Цена на яблоки удалена: $fruitsprice{apple}
; &exists($<''хэш''>{<''ключ''>})
: Функции &exists требуется указать ключ хэша, который следует проверить. Если у заданного <''ключа''>есть значение, то функция вернёт <code>1</code>, в противном случае - <code>0</code>. Например: <code>&exists ( $hash{key} )</code>
 
: Пример
  macro hash {
    %fruitsprice = (apple => 1000, banana => 700)
    log Хэш \%fruitsprice состоит из  %fruitsprice элементов
    log Цена на яблоки: $fruitsprice{apple}, а на бананы: $fruitsprice{banana}
    &delete($fruitsprice{apple})
    log Хэш \%fruitsprice состоит из %fruitsprice элемента
      if ( &exists($fruitsprice{apple}) ) {
        log Цена на яблоки: $fruitsprice{banana}
      } else {
        log В хэше нет яблок
      }
      if ( &exists($fruitsprice{banana}) ) {
        log Цена на бананы: $fruitsprice{banana}
      } else {
        log В хэше нет бананов
      }
  }
  }


: В консоли увидим:
: В консоли увидим:
  [eventmacro message] Хэш %fruitsprice состоит из 2 элеметов
  [eventmacro message] Хэш %fruitsprice состоит из 2 элементов
  [eventmacro message] Цена на яблоки: 1000, а на бананы: 700
  [eventmacro message] Цена на яблоки: 1000, а на бананы: 700
  [eventmacro message] Хэш %fruitsprice состоит из 1 элемента
  [eventmacro message] Хэш %fruitsprice состоит из 1 элемента
[eventmacro message] В хэше нет яблок
  [eventmacro message] Цена на бананы: 700
  [eventmacro message] Цена на бананы: 700
[eventmacro message] Цена на яблоки удалена:


== Особые переменные ==  
----
В макро-языке есть особые переменные, названия которых начинаются с точки. Они создаются самим плагином eventMacro.
 
=== Особые переменные ===  
В эвент-макросе есть особые переменные, названия которых начинаются с точки. Они автоматически создаются плагином eventMacro.


{|class="indextable" style="text-align:center;"
{|class="indextable" style="text-align:center;"
!Переменная
!Переменная
!Что в ней лежит
!Описание
!Пример
!Пример
|-
|-
|$.time
|$.time
|Текущее время в виде unix timestamp
|текущее время в виде unix timestamp
|1482275422
|1482275422
|-
|-
|$.datetime
|$.datetime
|Текущая дата и время
|текущая дата и время
|Tue Dec 20 21:22:34 2016
|Tue Dec 20 21:22:34 2016
|-
|-
|$.second
|$.second
|Которая сейчас секунда на часах (0 - 59)
|текущее значение секунд (0 - 59)
|53
|53
|-
|-
|$.minute
|$.minute
|Какая сейчас минута (0 - 59)
|текущее значение минут (0 - 59)
|34
|34
|-
|-
|$.hour
|$.hour
|Какой час в 24-х часовом формате
|текущее значение часов в 24-х часовом формате
|14
|14
|-
|-
|$.dayofmonth
|$.dayofmonth
|День месяца
|день месяца
|19
|19
|-
|-
|$.dayofweek
|$.dayofweek
|День недели (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
|день недели (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
|Wednesday
|Wednesday
|-
|-
|$.map
|$.map
|Местонахождение персонажа, локация
|местонахождение персонажа, локация
|prontera
|prontera
|-
|-
|$.incity
|$.incity
|[[References#.D0.B1.D1.83.D0.BB.D0.B5.D0.B2_.D1.84.D0.BB.D0.B0.D0.B3|булиев_флаг]], 1 если персонаж в городе, иначе 0
|[[References#булев флаг|булев_флаг]], 1 если персонаж в городе, иначе 0
|1
|1
|-
|-
|$.inlockmap
|$.inlockmap
|[[References#.D0.B1.D1.83.D0.BB.D0.B5.D0.B2_.D1.84.D0.BB.D0.B0.D0.B3|булиев_флаг]], 1 если персонаж в lockMap, иначе 0
|[[References#булев флаг|булев_флаг]], 1 если персонаж на [[lockMap]], иначе 0
|1
|1
|-
|-
|$.job
|$.job
|Профессия персонажа
|профессия персонажа
|Swordman
|Swordman
|-
|-
|$.pos
|$.pos
|Координаты персонажа
|координаты персонажа
|123 234
|123 234
|-
|-
|$.name
|$.name
|Имя персонажа
|имя персонажа
|Henrybk
|ya4ept
|-
|-
|$.hp
|$.hp
|Текущее HP (жизнь)
|значение HP (жизнь)
|2304
|2304
|-
|-
|$.sp
|$.sp
|Текущее SP (мана)
|значение SP (мана)
|345
|345
|-
|-
|$.lvl
|$.lvl
|Текущий базовый уровень
|значение базового уровня
|175
|175
|-
|-
|$.joblvl
|$.joblvl
|Текущий профессиональный уровень
|значение профессионального уровня
|60
|60
|-
|-
|$.spirits
|$.spirits
|Number of current spirit spheres or coin flip's coins
|количество сферок у монка или монеток у ганса
|3
|3
|-
|-
|$.zeny
|$.zeny
|Количество денег, зени
|количество денег (зени)
|8478341
|8478341
|-
|-
|$.weight
|$.weight
|Переносимый персонажем вес
|вес инвентаря персонажа
|1948
|1948
|-
|-
|$.weightpercent  
|$.weightpercent  
|Загруженность персонажа в процентах
|загруженность персонажа в процентах
|81.5
|81.5
|-
|-
|$.maxweight
|$.maxweight
|Максимальный переносимый персонажем вес
|максимальная грузоподъемность персонажа
|2400
|2400
|-
|-
|$.status
|$.status
|Список висящих на персонаже статусов
|список висящих на персонаже статусов (см. файл statusnametable.txt)
|Attention Concentrate,Endure,Two-Hand Quicken
|Attention Concentrate,Endure,Two-Hand Quicken
|-
|-
|$.statushandle
|$.statushandle
|Список висящих на персонаже статусов, в виде констант
|список висящих на персонаже статусов, в виде констант
|SM_ENDURE,KN_TWOHANDQUICKEN
|SM_ENDURE,KN_TWOHANDQUICKEN
|-
|-
|$.inventoryitems
|$.inventoryitems
|Количество предметов в инвентаре
|количество предметов в инвентаре
|13
|13
|-
|-
|$.cartweight
|$.cartweight
|Текущий вес предметов в телеге
|вес предметов в телеге
|800
|800
|-
|-
|$.cartweightpercent
|$.cartweightpercent
|Текущая загруженность телеги в процентах
|загруженность телеги в процентах
|10
|10
|-
|-
|$.cartmaxweight
|$.cartmaxweight
|Максимальный возможный вес предметов в телеге
|максимальная грузоподъемность телеги
|8000
|8000
|-
|-
|$.cartitems
|$.cartitems
|Текущее количество предметов в телеге
|количество предметов в телеге
|21
|21
|-
|-
|$.cartmaxitems
|$.cartmaxitems
|Максимально возможное количество предметов в телеге
|максимально возможное количество предметов в телеге
|100
|100
|-
|-
|$.shopopen
|$.shopopen
|1 если магазин открыт, иначе 0
|[[References#булев флаг|булев_флаг]], 1 если магазин открыт, иначе 0
|0
|0
|-
|-
|$.storageopen
|$.storageopen
|1 если открыт склад, иначе 0
|[[References#булев флаг|булев_флаг]], 1 если открыт склад, иначе 0
|1
|1
|-
|-
|$.storageitems
|$.storageitems
|Количество предметов на складе
|количество предметов на складе
|432
|432
|-
|-
|$.storagemaxitems
|$.storagemaxitems
|Максимально возможное количество предметов на складе
|максимально возможное количество предметов на складе
|600
|600
|-
|-
|$.param[N]
|$.param[N]
|Аргументы командной строки (see [[EventMacro#Syntax|Syntax]])
|аргументы командной строки (см. [[eventMacro#Синтаксис|Синтаксис]])
|''N/A''
| -
|-
|-  
|$.caller
|$.caller
|Название последнего сработавшего автомакроса
|название последнего сработавшего автомакроса
|''N/A''
| -
|-
|-
|}
|}


== Функции макро-языка ==
----


Функции макро-языка имеют вид '''&<название>(<аргументы>)''', ими можно пользоваться почти везде внутри блока '''macro''' за исключением '''goto''', '''end'', определении меток в коде, названия макроса в '''call''', '''set'''. Все функции кроме <code>&nick()</code> могут принимать переменные в качестве аргументов.
=== Функции эвент-макроса ===


; &npc (<''x''> <''y''> | /[http://www.regular-expressions.info/quickstart.html regexp]/i | "<''name''>")
Функции макро-языка имеют вид '''&<название> (<аргументы>)'''. Функциями можно пользоваться почти везде внутри блока '''macro''' (кроме '''goto''', '''end''', названиях меток (label), названиях макроса в конструкциях '''call''' и '''set'''). Все функции кроме <code>&nick()</code> могут принимать переменные в качестве аргументов.
: Вернёт индекс неписи, стоящей на заданных коордантах <''x''> <''y''>. Можно попробовать найти непись по её имени или воспользоваться шаблоном, под который должно подходить имя. Если непись найти не удалось, возвращает .1.


; &questStatus (<''questID''>)
; &questStatus (<''questID''>)
Строка 643: Строка 685:
: Вернет количество завершенных квестов, т.е. со статусом "complete".
: Вернет количество завершенных квестов, т.е. со статусом "complete".


; &inventory (<''item''>)
: Вернёт индекс предмета <''item''> в инвентаре, если такого предмета нет, то вернёт -1.


; &Inventory (<''item''>)
; &inventory (<''имя_предмета''> | <''ID_предмета''>)
: Как и '''&inventory''' вернёт индекс предмета <''item''> в инвентаре, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то вернёт -1.
: Вернёт индекс предмета в инвентаре. В качестве аргумента принимает имя предмета или его ИД. Если такого предмета нет, то возвращает -1.
 
; &Inventory (<''имя_предмета''> | <''ID_предмета''>)
: Как и '''&inventory''' вернёт индекс предмета в инвентаре, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то возвращает  -1.
 
; &invamount (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт количество указанного предмета в инвентаре. Если такого предмета нет, то возвращает 0.
 
; &InventoryType (usable|equip|card|etc)
: Вернёт список индексов предметов заданного типа (через запятую), находящихся в инвентаре. Если таких предметов нет, то вернёт <code>-1</code>.


; &invamount (<''item''>)
: Вернёт количество предмета <''item''> в инвентаре.


; &cart (<''item''>)
; &cart (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт индекс предмета <''item''> в телеге. Если такого предмета нет, то вернёт -1.
: Вернёт индекс указанного предмета в телеге. Если такого предмета нет, то возвращает -1.


; &Cart (<''item''>)
; &Cart (<''имя_предмета''> | <''ID_предмета''>)
: Как и '''&cart''' вернёт индекс предмета в телеге, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то вернёт -1.
: Как и '''&cart''' вернёт индекс предмета в телеге, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то возвращает -1.


; &cartamount (<''item''>)
; &cartamount (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт количество предмета <''item''> в телеге.
: Вернёт количество предмета в телеге. Если такого предмета нет, то возвращает 0.


; &storage (<''item''>)
: Вернёт индекс предмета <''item''> на складе. Если такого предмета на складе нет, то вернёт -1.


; &Storage (<''item''>)
; &storage (<''имя_предмета''> | <''ID_предмета''>)
: Как и '''&storage''' вернёт индекс предмета <''item''> на складе, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то вернёт -1.
: Вернёт индекс указанного предмета на складе. Если такого предмета на складе нет, то возвращает -1.


; &storamount (<''item''>)
; &Storage (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт количество предмета <''item''> на складе.
: Как и '''&storage''' вернёт индекс предмета на складе, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то возвращает -1.


; &player (<''name''>)
; &storamount (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт индекс игрока <''name''>. Если такого игрока нет в пределах видимости, то вернёт -1.
: Вернёт количество предмета на складе. Если такого предмета нет, то возвращает 0.


; &monster (<''name|ID''>)
: Вернёт индекс моба по его имени или коду. Если такого моба в пределах видимости нет, то вернёт -1.


; &vender (<''name''>)
; &vender (<''name''>)
: Вернёт индекс продавца <''name''>, если такого продавца не видно, то вернёт -1.
: Вернёт индекс продавца (игрока) с именем <''name''>. Если такого продавца нет в пределах видимости, то возвращает -1.
 
; &venderitem (<''имя_предмета'' | <''ID_предмета''>)
: Вернёт индекс предмета в магазине у торгаша (игрока). Если такого предмета в магазине нет, то возвращает -1.


; &store (<''name''>)
; &venderprice (<''имя_предмета''> | <''indexID''>)
: Ищёт заданный предмет в открытом магазине и возвращает его индекс, если такого предмета нет, то вернёт -1.
: Вернёт цену предмета в магазине у торгаша (игрока). В качестве аргумента принимает имя предмета или его индекс (который можно получить через функцию выше &venderitem).


; &shopamount (<''item''>)
; &venderamount (<''индекс_предмета''>)
: Возвращает количество предмета <''item''>, продающегося в магазине.
: Вернёт количество предметов у торгаша (игрока). Если такого предмета в магазине нет, то возвращает -1.


; &random ("<''argument1''>", "<''argument2''>", ...)
: Вернёт случайное значение из заданного списка.


; &rand (<''n''>, <''m''>)
; &store (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт случайное число из от <''n''> до <''m''>, включительно.
: Ищёт заданный предмет в открытом магазине (НЦП) и возвращает его индекс. Если такого предмета нет, то возвращает -1.
 
; &shopamount (<''имя_предмета''> | <''ID_предмета''>)
: Вернёт количество предметов, продающихся в магазине (НПЦ).


; &eval (<''argument''>)
: Подставляет в аргументе значения переменных и @(), а затем отдаёт его  интерпретатору Perl, он прогоняет полученное выражение и возвращает результат.


; &arg ("<''argument''>", <''n''>)
; &npc (<''x''> <''y''> | "<''NPC_name''>" | /[http://www.regular-expressions.info/quickstart.html regexp]/i)
: Вернёт <''n''>-ое по счёту слово из аргумента, если такого слова нет, то вернёт пустую строку.
: Вернёт индекс неписи, стоящей на заданных координатах <''x''> <''y''> или с именем <''NPC_name''> или если имя НПЦ соответствует шаблону regexp. Если непись найти не удалось, то возвращает -1.


; &config (<''variable''>)
; &player (<''name''>)
: Вернёт значение параметра <''variable''> из конфига config.txt.
: Вернёт индекс игрока с именем <''name''>. Если такого игрока нет в пределах видимости, то возвращает -1.


; &venderitem (<''name''>)
; &monster (<''имя_моба''> | <''ID''>)
: Вернёт индекс предмета <''name''> в магазине у торгаша. Если такого предмета в магазине нет, то вернёт -1.
: Вернёт индекс моба. В качестве аргумента принимает имя моба или его ИД. Если такого моба нет в пределах видимости, то возвращает -1.


; &venderprice (<''indexID''>)
: Возвращает цену предмета с индексом <''indexID''> в магазине у торгаша.


; &nick (<''word''>)
; &config (<''параметр''>)
: Escapes all the regexp metacharacters and some of the perl special characters with '''\''' (a backslash). Especially for player's name.
: Вернёт значение <''параметра''> из [[:Category:config.txt|config.txt]]


; &InventoryType (usable|equip|card|etc)
; &random ("<''параметр 1''>", "<''параметр 2''>", $var, ...)
: Вернёт список предметов заданного типа (через запятую), находящихся в инвентаре. Если таких предметов нет, то вернёт <code>-1</code>.
: Вернёт один из перечисленных в скобках параметров. Параметры необходимо указывать в кавычках. В качестве параметров можно указывать переменные.


; @array = &split (<''separator''>, <''variable''>)
; &rand (<''n''>, <''m''>)
: Uses separator to create an array from another variable (ex: $list = a,b,c,d; @array = split(',', $list))
: Вернёт случайное число в диапазоне от <''n''> до <''m''> включительно.


; @array = &keys (<''%hash''>)
; &eval (<''параметр''>)
: Creates an array from the keys of a hash
: Вычисляет значение <''параметра''>. Например, если "$v = 8", то результатом функции <code>&eval ($v + 2)</code> будет число 10. Параметр функции '''&eval''' - это выражение на языке Perl, и оно не имеет ничего общего с синтаксисом эвент-макроса. В <''параметре''> можно использовать переменные эвент-макроса вида <tt>$var</tt> и результаты других <tt>&<функций></tt>, например: <code>warning &eval(&rand(0,5) + 1)</code>


; @array = &values (<''%hash''>)
; &arg ("<''строка''>", <''n''>)
: Creates an array from the values of a hash
: Вернёт <''n''>-ое слово из <''строки''>. Слова в строке разделяются знаками: <code> ,.:;\"\'!?\r\n</code>. Если <''n''> больше количества слов в строке, то возвращается пустая строка. Аргумент <''n''> может быть как целым числом, так и целочисленной переменной. Например:
$n = 3
log &arg("aa ! bb : cc . dd",$n)


== Цепочка команд ==
; &nick (<''строка''>)
Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками '''[''' и ''']'''.
: Экранирует все метасимволы regexp и некоторые специальные символы perl с помощью \ (обратного слэша). Придуман специально для экранирования некоторых имён персонажей. Например, ник "}|{oJIA" будет преобразован в "\}|\{oJIA"


  0 macro foo {
; &split (<''разделитель''>, <''переменная''>)
  1  do whatever
: Создаёт массив из <''переменной''> на основе <''разделителя''>. Вывод этой функции обязательно должен присваиваться массиву. Например:
macro split {
  $list = a~b~c
  log переменная: $list
  @array = &split('~', $list)
  log размер массива: @array, array[1]=$array[1]
}
 
; &keys (<''%хэш''>)
: Создаёт массив из ключей <''хэша''>. Вывод этой функции обязательно должен присваиваться массиву. Например:
macro split {
  %hash = (a => "foo", b => "bar")
  log размер хэша: %hash
  @array = &keys (%hash)
  log размер массива: @array, array[1]=$array[1]
}
 
; &values (<''%хэш''>)
: Создаёт массив из ключей <''хэша''>. Вывод этой функции обязательно должен присваиваться массиву.
 
; &listlength (<''список_разделённый_запятой''>)
: Вернёт количество элементов в списке разделённом запятой, например:
macro listlength {
    log количество элементов: &listlength(a, b, c)
}
 
; &strip (<''текст''>)
: Удаляет из <''текста''> круглые скобки <code>( )</code>, например:
macro strip {
    $text = (привет))))) мир)
    log текст без скобок: "&strip($text)"
}
 
----
 
=== Цепочка команд ===
Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками '''[''' и ''']'''.
 
  0 macro foo {
  1  do whatever
  2  log yet another line
  2  log yet another line
  3  [
  3  [
Строка 737: Строка 821:
Строка 3 начинает цепочку команд и сама по себе не вносит никакой задержки. Строки 4, 5 и 6 выполняются сразу же, как только предыдущая команда завершится. В цепочке команд нет задержек и выполнение команд не может быть прервано. Строка 7 завершает цепочку команд и строка 8 будет выполнятся через положенную задерку в $macro_delay секунд.
Строка 3 начинает цепочку команд и сама по себе не вносит никакой задержки. Строки 4, 5 и 6 выполняются сразу же, как только предыдущая команда завершится. В цепочке команд нет задержек и выполнение команд не может быть прервано. Строка 7 завершает цепочку команд и строка 8 будет выполнятся через положенную задерку в $macro_delay секунд.


== Подстроки ==
----
 
=== Подстроки ===
Вместо использования по одной команде на строку, можно отделять команды между собой символом точки с запятой "''';'''" и располагать их в одной строке.
Вместо использования по одной команде на строку, можно отделять команды между собой символом точки с запятой "''';'''" и располагать их в одной строке.


Строка 746: Строка 832:
Разделенные точкой с запятой "''';'''" команды будут выполняться с обычной задержной macro_delay.
Разделенные точкой с запятой "''';'''" команды будут выполняться с обычной задержной macro_delay.


== Операторы сравнения ==
----
 
=== Операторы сравнения ===
Плагин eventMacro предлагает следующие операторы сравнения:
Плагин eventMacro предлагает следующие операторы сравнения:


Строка 781: Строка 869:
|}
|}


== Управление потоком и метки ==  
=== Управление потоком и метки ===
* Как и в большинстве языков программирования, в плагине eventMacro реализованы привычные конскруции типа "''if .. else''", "''while''", "''foreach''", "''for .. next''", "''do .. while''" и некоторые другие.
* Как и в большинстве языков программирования, в плагине eventMacro реализованы привычные конструции типа "''if .. else''", "''while''", "''foreach''", "''for .. next''", "''do .. while''" и некоторые другие.
* Кроме того есть операции "'''if'''", "'''else'''", "'''elsif'''", "'''switch'''", "'''case'''", "'''goto'''" и "'''while'''". При помощи '''label''' можно ставить метки в коде.
* Кроме того есть операции "'''if'''", "'''else'''", "'''elsif'''", "'''switch'''", "'''case'''", "'''goto'''" и "'''while'''". При помощи '''label''' можно ставить метки в коде.


=== Синтаксис условных операторов ===
----
==== If ====
 
==== Синтаксис условных операторов ====
===== If =====
Right now, macro ''if'' conditions are very close to the perl ''if'' statements. It accepts unlimited number of statements in just one ''if'' condition line, regexp matching is allowed (unfortunately, no backreference using parenthesis) and the use of '''&&''' for '''and''' meaning and '''||''' for '''or''' meaning.
Right now, macro ''if'' conditions are very close to the perl ''if'' statements. It accepts unlimited number of statements in just one ''if'' condition line, regexp matching is allowed (unfortunately, no backreference using parenthesis) and the use of '''&&''' for '''and''' meaning and '''||''' for '''or''' meaning.


Строка 810: Строка 900:
:* <''macro''>, название макроса
:* <''macro''>, название макроса
:* <''parameters''> параметры макроса, внутри макроса можно к ним обратиться как $.param[0], $param[1] и т.д.
:* <''parameters''> параметры макроса, внутри макроса можно к ним обратиться как $.param[0], $param[1] и т.д.
:* < ''{'' >, начало блока команд, которые запустятся, если условие истинно. Блок команд закрывается соответсвующей фигурной скобкой ''}''.
:* < ''{'' >, начало блока команд, которые запустятся, если условие истинно. Блок команд закрывается соответствующей фигурной скобкой ''}''.




'''''Note²:''''' If statements are unlimited, you can use as many statements as you want.
'''''Примечание:''''' Внутри скобок можно использовать неограниченное количество сравнений.
  if (arg1 <[[eventMacro#Operators|Operators]]> arg2 || arg3 <[[eventMacro#Operators|Operators]]> arg4 || ... || arg'''''N''''' <[[eventMacro#Operators|Operators]]> arg'''''N+1''''') (goto <label> | call <macro> <parameters> | stop)
  if (arg1 <[[eventMacro#Operators|Operators]]> arg2 || arg3 <[[eventMacro#Operators|Operators]]> arg4 || ... || arg'''''N''''' <[[eventMacro#Operators|Operators]]> arg'''''N+1''''') (goto <label> | call <macro> <parameters> | stop)


Строка 821: Строка 911:
:* While '''''N''''' is an integer number/s which is greater than zero.
:* While '''''N''''' is an integer number/s which is greater than zero.


===== Postfix control =====
----
Another way to use the ''if'' is to put it at the end of the command.
 
'''Постфиксный if'''
 
Кроме того, можно использовать ''if'' после команды.


  <command> if (arg1 <[[eventMacro#Operators|Operators]]> arg2)
  <command> if (arg1 <[[eventMacro#Operators|Operators]]> arg2)


The command before the ''if'' statement will only be executed if the condition is true.
Т.е. команда перед ''if'' запустится только тогда, когда условие истинно. Условие пишется по точно таким же правилам, как было сказано выше.
The way to create the condition is the same as previously explained.


In this example below, the two commands are equivalent:
В следующем примере обе команды равнозначны и делают одно и то же:


  call buy if ($.zeny > 1000)
  call buy if ($.zeny > 1000)
  if ($.zeny > 1000) call buy
  if ($.zeny > 1000) call buy


==== Else ====
----
In case ''if'' is used with open braces ( { ), it's possible to use the command '''else''' along closed braces (  } ) in the end of the command block ''if'', to start a new command block that will be executed if ''if'' is false.  
 
===== Else =====
В случае, если ''if'' использовался с фигурными скобками ( { ), то можно использовать '''else''' после закрывающей фигурной скобки (  } ).  


  if (arg1 <[[eventMacro#Operators|Operators]]> arg2) {
  if (arg1 <[[eventMacro#Operators|Operators]]> arg2) {
Строка 843: Строка 937:
     commandN
     commandN
  } else {
  } else {
     command1
     command3
     command2
     command4
     ...
     ...
     commandN
     commandN
  }
  }
В этом случае если условие в круглых скобках истинно, то выполнятся только команды 1 и 2, если условие ложное, то выполнятся только команды 3 и 4.


In this case, the first command block will be executed if the condition turns out being true. If it's false, the second command block (preceding by '''else''') will be executed.


'''''Note:''''' Inside braces you're allowed to use tons of commands.<br>
'''''Примечание:''''' в фигурных скобках можно использовать неограниченное количество команд.<br>
'''''Note:''''' It is not compulsory to wear '''else'''.
'''''Примечание:''''' ветка '''else''' - не обязательна.


==== Elsif ====
----
It is like the else + if. The '''elsif''' is in the same place ''else'' with the difference being added conditions to its command block is executed if its conditions are true.
 
===== Elsif =====
Этот оператор работает как else + if одновременно. Оператор '''elsif''' нужен для проверки следующего условия. Оператор '''else''' срабатывает, когда ни одно условие не выполнилось.


  if (arg1 <[[eventMacro#Operators|Operators]]> arg2) {
  if (arg1 <[[eventMacro#Operators|Operators]]> arg2) {
Строка 863: Строка 959:
     comandoN
     comandoN
  } elsif (arg1 <[[eventMacro#Operators|Operators]]> arg2) {
  } elsif (arg1 <[[eventMacro#Operators|Operators]]> arg2) {
     command1
     command3
     command2
     command4
     ...
     ...
     commandN
     commandN
  } else {
  } else {
     command1
     command5
     command2
     command6
     ...
     ...
     commandN
     commandN
  }
  }
В этом случае если первое условие истинно, то будут выполнены только команды 1 и 2, если оно ложное, то далее идёт проверка второго условия. Если второе условие истинно, то будут выполнены только команды 3 и 4. Если оба условия ложные, то будут выполнены только команды 5 и 6.


In this case, the first block of commands will be executed if the condition is true. If it is false, the second block of commands (preceded by the '''elsif''') will be executed if its condition is true. Should also be false, the command blocks ''else'' to be executed.


'''''Note:''''' As in the ''else'', inside braces of '''elsif''' you're allowed to use tons of commands.<br>
'''''Примечание:''''' ветки '''elsif''' и '''else''' - не обязательны.
'''''Note:''''' It is not compulsory to wear the ''else'' or '''elsif'''.
----


==== Switch/case ====
===== Switch/case =====
It's similar to ''if'' followed by enumerous ''elsif''. It's useful to leave the code cleaner when the paramater being analyzed is the same, this way you don't need to repeat it.
Этот оператор напоминает ''if'' с кучей последующих ''elseif''. Данный оператор будет полезным, когда необходимо проверить одну переменную на разные условия.


  switch (arg1) {
  switch (arg1) {
     case (<[[eventMacro#Operators|Operators]]> arg2) (goto <label> | call <macro> <parameters> | stop | {)
     case (<[[eventMacro#Operators|Operators]]> arg2) (goto <label> | call <macro> <parameters> | stop | {)
         (If you use "{", the commands should be used here and in a separated line that should be closed with the block "}")
         (Если вы используете "{", то команды для выполнения должна находиться здесь. Каждая команда должна быть написана в новой строчке. В конце обязательно должна быть закрывающая скобка "}")
     case (<[[eventMacro#Operators|Operators]]> arg2) (goto <label> | call <macro> <parameters> | stop | {)
     case (<[[eventMacro#Operators|Operators]]> arg2) (goto <label> | call <macro> <parameters> | stop | {)
         (If you use "{", the commands should be used here and in a separated line that should be closed with the block "}")
         (Если вы используете "{", то команды для выполнения должна находиться здесь. Каждая команда должна быть написана в новой строчке. В конце обязательно должна быть закрывающая скобка "}")
     ...
     ...
     else (goto <label> | call <macro> <parameters> | stop | {)
     else (goto <label> | call <macro> <parameters> | stop | {)
         (If you use "{", the commands should be used here and in a separated line that should be closed with the block "}")
         (Если вы используете "{", то команды для выполнения должна находиться здесь. Каждая команда должна быть написана в новой строчке. В конце обязательно должна быть закрывающая скобка "}")
  }
  }


'''''Note:''''' The use of ''else'' is optional.
'''''Примечание:''''' если не сработал ни один ''case'', тогда отработает ''else''.<br>
'''''Note:''''' In case that no ''case'' ends being true, ''else'' will be activate if it exists.
'''''Примечание:''''' использовать ''else'' не обязательно.
 
----
 
===== Примеры с условными операторами =====
Этот макрос двигает персонажа в случайном направлении: на север, юг, восток или запад.


==== Examples ====
This macro will go a random walk
  macro walk {
  macro walk {
     $num = &rand(1, 4)
     $num = &rand(1, 4)
     if ($num == 1) {
     if ($num == 1) {
         do c I will follow the path 1
         do [[c]] я пойду в сторону 1 (на север)
         do north
         do [[north]]
     }
     }
     if ($num == 2) {
     if ($num == 2) {
         do c I will follow the path 2
         do [[c]] я пойду в сторону 2 (на юг)
         do south
         do [[south]]
     }
     }
     if ($num == 3) {
     if ($num == 3) {
         do c I will follow the path 3
         do [[c]] я пойду в сторону 3 (на восток)
         do east
         do [[east]]
     }
     }
     if ($num == 4) {
     if ($num == 4) {
         do c I will follow the path 4
         do [[c]] я пойду в сторону 4 (на запад)
         do west
         do [[west]]
     }
     }
  }
  }


Simplified version of the above macro, using postfix control.
Давайте перепишем этот макрос с постфиксным if:
 
  macro walk {
  macro walk {
     $num = &rand(1, 4)
     $num = &rand(1, 4)
     do c I will follow the path $num
     do [[c]] я пойду в сторону $num
     do north if ($num == 1)
     do [[north]] if ($num == 1)
     do south if ($num == 2)
     do [[south]] if ($num == 2)
     do east  if ($num == 3)
     do [[east]] if ($num == 3)
     do west  if ($num == 4)
     do [[west]] if ($num == 4)
  }
  }


The following macro will tell if you've over 1.000z or 1.000z or less.
Следующий макрос использует конструкцию if/else, чтобы определить, есть ли у персонажа больше 1000 зени или нет.
 
  macro checkZeny {
  macro checkZeny {
     if ($.zeny > 1000) {
     if ($.zeny > 1000) {
       do c I've over 1.000z!  
       do [[c]] У меня больше 1.000z!  
     } else {
     } else {
       do c I've 1.000z or less...
       do [[c]] у меня 1.000z или меньше...
     }
     }
  }
  }


A little more complete than the above macro. Informa has more than 1.000z, has exactly 1.000z or has less than 1.000z with emoticons
Чуть усложнённый пример, чтобы узнать сколько зени в кармане: больше тысячи, ровно тысяча или меньше. В зависимости от этого выдаются разные смайлики.
 
  macro checkZeny {
  macro checkZeny {
     if ($.zeny > 1000) {
     if ($.zeny > 1000) {
       do c I've over 1.000z!  
       do [[c]] у меня больше 1.000z!  
       do e money
       do [[e]] money
     } elsif ($.zeny == 1000) {
     } elsif ($.zeny == 1000) {
       do c I have exactly 1.000z.
       do [[c]] у меня ровно 1.000z.
       do e !
       do [[e]] !
     } else {
     } else {
       do c I've 1.000z or less...
       do [[c]] у меня меньше 1.000z
       do e panic
       do [[e]] panic
     }
     }
  }
  }


Similar to the above but with a different syntax
Переработаем предыдущий макрос, с использованием switch/case:
 
  macro checkZeny {
  macro checkZeny {
     switch ($.zeny) {
     switch ($.zeny) {
         case (> 1000) {
         case (> 1000) {
             do c I've over 1.000z!  
             do [[c]] у меня больше 1.000z!  
             do e money
             do [[e]] money
         }
         }
         case (== 1000) {
         case (== 1000) {
             do c I have exactly 1.000z.
             do [[c]] у меня ровно 1.000z.
             do e !
             do [[e]] !
         }
         }
         else {
         else {
             do c I've 1.000z or less...
             do [[c]] у меня меньше 1.000z
             do e panic
             do [[e]] panic
         }
         }
     }
     }
  }
  }


The below macro will print '''\$num is 1''' if $num == 1, '''\$num is 2''' if $num == 2, '''\$num is 3''' if $num == 3.
Следующий макрос показывает использование if вместе с goto:
 
  macro checknum {
  macro checknum {
     $num = &rand(1, 3)
     $num = &rand(1, 3)
Строка 975: Строка 1079:
     if ($num == 3) goto three
     if ($num == 3) goto three
     :one
     :one
     log \$num is 1
     log \$num = 1
     stop
     stop
     :two
     :two
     log \$num is 2
     log \$num = 2
     stop
     stop
     :three
     :three
     log \$num is 3
     log \$num = 3
    stop
  }
  }


The above macro can be written using '''call''' instead of '''goto'''.
Переработаем предыдущий макрос, с использованием '''call''' вместо '''goto'''.


  macro checknum {
  macro checknum {
Строка 994: Строка 1097:
  }
  }
  macro one {
  macro one {
     log $num is 1
     log $num = 1
  }
  }
  macro two {
  macro two {
     log $num is 2
     log $num = 2
  }
  }
  macro three {
  macro three {
     log $num is 3
     log $num = 3
  }
  }




A more complicated macro
Сложный макрос, где переменная $i, равная 1, подвергается изощрённым проверкам и так и сяк.
 
  macro if {
  macro if {
   $i = 1
   $i = 1
Строка 1018: Строка 1122:
  }
  }


=== WHILE Loop ===
----
A ''while'' in macros means that certain commands will be ran while the defined conditions are met.
 
==== Syntax ====
==== Цикл while ====
Цикл по условию ''while'' запускает команды раз за разом до тех пор, пока условие не перестанет быть истинным.
===== Синктаксис =====
  while (arg <condition> arg) {
  while (arg <condition> arg) {
     do bla bla
     do bla bla
Строка 1026: Строка 1132:
  }
  }


Where;
причём
:* ''arg'' can be a variable, a nested variable, a special keyword, &eval or letters and numbers.
:* ''arg'' - может переменной, вложенной переменной, ключевым словом, &eval, числом или строкой.
Conditions can be found on [[eventMacro#Operators|Operators]].
Операторы сравнения смотри тут: [[eventMacro#Operators|Operators]].


==== Examples ====
===== Пример =====
Пробежим цикл десять раз, от $i равного 0 до 9.
  macro while {
  macro while {
     $i = 0
     $i = 0
Строка 1039: Строка 1146:
  }
  }


The result is
Вывод на консоль:
  [eventmacro log] \$i = 0
  [eventmacro log] \$i = 0
  [eventmacro log] \$i = 1
  [eventmacro log] \$i = 1
Строка 1051: Строка 1158:
  [eventmacro log] \$i = 9
  [eventmacro log] \$i = 9


== Automacros ==
== Автомакросы ==


At this point, you can define macros and call them, typing 'eventMacro <macro name>' in OpenKore's console input.
На данный момент вы научились объявлять макросы и вызывать их, набирая в консоли OpenKore 'eventMacro <macro name>'.


Automacro is an automatic trigger for calling your macros, just like blocks in config.txt are automatic triggers for certain AI actions.
Автомакрос нужен для того, чтобы автоматически запускать макрос при срабатывании некоторых условий.


Automacro block consists of:
Автомакрос состоит из:
* One or more '''Parameters''' ('''call''' being the only required one).
* одного или нескольких '''параметров''' (параметр '''call''' среди них единственный обязательный).
* One or more '''Conditions'''.
* одного или нескольких '''условий'''.


Automacro does not trigger if there is currently running macro in exclusive mode. Otherwise, automacro clears macro queue (which means that all currently running macros are stopped) before call.
Автомакрос не сработает, если в данный момент исполняется макрос в т.н. эксклюзивном режиме. В любом другом случае очередь макросов очищается (другими словами, всё останавливается) и уже тогда запускается нужный макрос.


The point of automacro is that you use them to check for certain conditions and call your macro when all conditions are fulfilled.
Ещё раз - мы используем автомакрос для проверки неких условий, если они выполняются, то автомакрос срабатывает и запускает указанный макрос.


=== Parameters ===
=== Параметры ===


:* Each parameter can only be used once.
:* Каждый параметр упоминается не больше одного раза.
:* Parameters define the way the automacro or the called macro will work.
:* Параметры определяют, каким образом будет работать автомакрос или вызванный им макрос.
:* Most parameters have a default value that will be used when it is not defined.
:* У большинства параметров есть значение по умолчанию.


; call
; call
:* '''call''' is the only required parameter in every automacro.
:* '''call''' - это единственный обязательный параметр в каждом автомакросе.
:* '''call''' defines which macro the automacro will execute.
:* '''call''' определяет, какой макрос будет запущен.
:* '''call''' can be a macro name or a macro block.
:* '''call''' может быть названием макроса или блоком команд.


Example when using a macro name:
Пример с использованием названия макроса:
  automacro <automacro name> {
  automacro <название автомакроса> {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     # for example:
     # например:
     do move prontera
     do [[move]] prontera
     do move payon
     do [[move]] payon
  }
  }


Example when using a macro block:
Пример с использованием блока команд:
  automacro <automacro name> {
  automacro <название автомакроса> {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     call {
     call {
         <macro instructions (and only them, as this is regular macro)>
         <тут обычные инструкции макроса>
         # for example:
         # например:
         do move prontera
         do [[move]] prontera
         do move payon
         do [[move]] payon
     }
     }
  }
  }




:* Two examples above do the same thing.
:* Оба примера выше равнозначны и делают то же самое.
:* Note that the macro block used in the call parameter has the same rules as a normal macro block.
:* Обратите внимание, что блок команд в параметре call подчиняется тем же правилам что и обычный macro-блок.


 
Синтаксис первого автомакроса удобен, когда у вас есть несколько автомакросов, которые могут вызывать один и тот же макрос:
The first syntax is useful if you want more than one automacro to call one simple macro:
  automacro First {
  automacro First {
     <conditions>  
     <одни условия>  
     call print
     call print
  }
  }
  automacro Second {
  automacro Second {
     <conditions>  
     <другие условия>  
     call print
     call print
  }
  }
Строка 1119: Строка 1225:


; delay
; delay
:* '''delay''' is an optional parameter.
:* '''delay''' - необязательный параметр.
:* '''delay''' defines the time in seconds to wait before executing the macro in call parameter.
:* '''delay''' определяет время в секундах, которое пройдёт перед тем, как запустится макрос из параметра call.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* Must have a numeric value.
:* Значением параметра может быть только число.


  automacro <automacro name> {
  automacro <название автомакроса> {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     delay 5
     delay 5
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This is being logged 5 seconds after the automacro activated
     log Текст будет напечатан через 5 секунд, после того, как сработает автомакрос.
  }
  }


; run-once
; run-once
:* '''run-once''' is an optional parameter.
:* '''run-once''' - необязательный параметр.
:* '''run-once''' defines if the automacro can activate only once, or multiple times.
:* '''run-once''' определяет, сколько раз может сработать автомакрос - только один раз или неограниченное количество раз.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* When it's value is 1 the automacro will only activate once, when it's 0 it can activate multiple times.
:* Если 1 , то автомакрос сработает лишь однажды, если 0, то может сработать много раз.
:* To make an automacro with run-once value of 1 which already was already activated be able to run again you can use the command 'release' [[eventMacro#Macro Syntax|Macro Syntax]].
:* Чтобы уже сработавшему автомакросу с run-once 1 разрешить сработать ещё раз, можно использовать команду 'release' [[eventMacro#Macro Syntax|Macro Syntax]].


  automacro myautomacro {
  automacro myautomacro {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     run-once 1
     run-once 1
     call myMacro
     call myMacro
  }
  }
  automacro myaotherauto {
  automacro myaotherauto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     run-once 0
     run-once 0
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This macro will be called by myautomacro only once
     log Данный макрос может быть вызван из myautomacro только один раз,
     log but this macro can be called by myaotherauto many times
     log но из myaotherauto он может быть вызван много раз.
  }
  }


; CheckOnAI
; CheckOnAI
:* '''CheckOnAI''' is an optional parameter.
:* '''CheckOnAI''' - необязательный параметр.
:* '''CheckOnAI''' defines in which AI states the automacro can activate.
:* '''CheckOnAI''' определяет, в каком режиме AI может сработать автомакрос.
:* The default value for this parameter can be set in the config key eventMacro_CheckOnAI [[eventMacro#Configuration files|Configuration files]].
:* Значение по умолчанию можно установить в параметре конфига eventMacro_CheckOnAI [[eventMacro#Configuration files|Configuration files]].
:* If not used in the automacro the default value will be used, which is the config key eventMacro_CheckOnAI.
:* Если не указать данный параметр в автомакросе, то будет использовано значение по умолчанию, которое берётся из параметра конфига eventMacro_CheckOnAI.
:* If eventMacro_CheckOnAI is not set in the config the default value will be used, which is: auto
:* Если в конфиге не прописано значение по умолчанию eventMacro_CheckOnAI, то используется: auto
:* It's values can be a combination of auto, manual and off, separated by comma.
:* Значение параметра - список через запятую следующих слов: auto, manual и off.


  automacro MyAuto {
  automacro MyAuto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     CheckOnAI manual
     CheckOnAI manual
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This macro will only be called by MyAuto when AI is manual
     log Автомакрос MyAuto сработает только в ручном режиме бота (manual)
  }
  }
   
   
  automacro MyAuto2 {
  automacro MyAuto2 {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     CheckOnAI manual, off
     CheckOnAI manual, off
     call myMacro
     call myMacro
  }
  }
  macro myMacro2 {
  macro myMacro2 {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This macro will only be called by MyAuto2 when AI is manual or off
     log Автомакрос MyAuto2 сработает в режимах manual или off.
  }
  }


; disabled
; disabled
:* '''disabled''' is an optional parameter.
:* '''disabled''' - необязательный параметр.
:* '''disabled''' defines if the automacro is active of not.
:* '''disabled''' определяет, активен ли автомакрос.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* When it's value is 1 the automacro won't activate ever, when it's 0 it can activate normally.
:* Если 1, то автомакрос не активен и не сможет сработать. Если 0, то сработает при наступлении условий.


  automacro MyAuto {
  automacro MyAuto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     disabled 1
     disabled 1
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This macro will never be called by MyAuto
     log Автомакрос MyAuto никогда не сработает, он выключен.
  }
  }
   
   
  automacro MyAuto2 {
  automacro MyAuto2 {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     disabled 0
     disabled 0
     call myMacro
     call myMacro
  }
  }
  macro myMacro2 {
  macro myMacro2 {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This macro will be called by MyAuto2 normally
     log Автомакрос MyAuto2 сработает как положено при наступлении условий.
  }
  }


; overrideAI
; overrideAI
:* '''overrideAI''' is an optional parameter.
:* '''overrideAI''' - необязательный параметр.
:* '''overrideAI''' defines if eventMacro will put itself in the AI queue.
:* '''overrideAI''' определяет, занесёт ли плагин eventMacro макро-команды в очередь задач AI.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* When it's value is 0 the macro will be put into AI queue as 'eventMacro' and the next macro command will only be run if current AI is 'eventMacro'.
:* Если 0, то команды макроса попадают в очередь задач AI как 'eventMacro' и каждая команда сработает только тогда, когда до неё дойдёт очередь, т.е. AI переключится на задачу 'eventMacro'.
:* When it's value is 1 the macro will not be put into AI queue and the next macro command will always be run.
:* Если 1, то команды макроса не попадут в очередь задач AI и не будут управляться ею. Команды тупо выполняются одна за другой с интервалом macro_delay.
:* It's important to note that when it's value is 1 since it won't be put into AI queue normal AI functions will continue as normal, like mob hunting or autostorage.
:* It's important to note that when it's value is 1 since it won't be put into AI queue normal AI functions will continue as normal, like mob hunting or autostorage.


  automacro MyAuto {
  automacro MyAuto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     overrideAI 0
     overrideAI 0
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     do move prontera
     do [[move]] prontera
     log This will only be printed when the 'move prontera' has been completed, since 'move' takes the first place in AI queue.
     log До этой строки макроса дело дойдёт только тогда, когда бот дойдёт до Пронтеры, т.е. довольно длительная команда 'move prontera' выполнится. Ибо в списке задач AI команда 'move' стоит первая в очереди.
  }
  }
   
   
  automacro MyAuto2 {
  automacro MyAuto2 {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     overrideAI 1
     overrideAI 1
     call myMacro
     call myMacro
  }
  }
  macro myMacro2 {
  macro myMacro2 {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     do move prontera
     do [[move]] prontera
     log This will be printed after a macro_delay has passed before the last command, because it won't check AI queue.
     log До этой строки макроса дело дойдёт практически сразу, через короткий промежуток macro_delay, потому что оно работает без оглядки на очередь команд AI.
  }
  }


; exclusive
; exclusive
:* '''exclusive''' is an optional parameter.
:* '''exclusive''' - необязательный параметр.
:* '''exclusive''' defines if the macro can be interrupted or not.
:* '''exclusive''' определяет, может ли исполнение макроса быть прервано.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* When it's value is 0 the macro can be interrupted by other automacros.
:* Если 0, то исполнение макроса может быть прервано другим автомакросом.
:* When it's value is 1 the macro can not be interrupted by other automacros.
:* Если 1, то исполнение макроса невозможно прервать другим автомакросом.


  automacro MyAuto {
  automacro MyAuto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     exclusive 0
     exclusive 0
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This would probably cause a bug because the automacro would activate every AI cycle since the macro is interruptible.
     log Исполнение макроса может быть прервано в любой момент, что может привести к ошибке.
  }
  }
   
   
  automacro MyAuto2 {
  automacro MyAuto2 {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     exclusive 1
     exclusive 1
     call myMacro
     call myMacro
  }
  }
  macro myMacro2 {
  macro myMacro2 {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log Since exclusive is 1 the macro is now uninterruptible and will work properly.
     log Так как exclusive равен 1, то макрос нельзя прервать и он отработает полностью.
  }
  }


; priority
; priority
:* '''priority''' is an optional parameter.
:* '''priority''' - необязательный параметр.
:* '''priority''' defines the priority for activation the automacro has between all automacros, the lower the priority, the sooner ir will be checked.
:* '''priority''' определяет очерёдность срабатывания автомакросов. Чем меньше номер, тем раньше до него дойдёт очередь.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* Must have a numeric value.
:* Значение должно быть числом.


  automacro MyAuto {
  automacro MyAuto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     priority 5
     priority 5
     call {
     call {
         log This automacro will be checked after MyAuto2 because it's priority is higher
         log Этот автомакрос стоит в очереди после MyAuto2, потому он и сработает позже.
     }
     }
  }
  }
   
   
  automacro MyAuto2 {
  automacro MyAuto2 {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     priority 2
     priority 2
     call {
     call {
         log This automacro will be checked before MyAuto because it's priority is lower
         log Этот автомакрос сработает раньше MyAuto, потому что он первый в очереди.
     }
     }
  }
  }


; macro_delay
; macro_delay
:* '''macro_delay''' is an optional parameter.
:* '''macro_delay''' - необязательный параметр.
:* '''macro_delay''' defines the time in seconds to wait between macro commands.
:* '''macro_delay''' определяет паузу между выполнениями команд в макросе, измеряется в секундах.
:* If not used in the automacro the default value will be used, which is: 1.
:* Значение по умолчанию: 1.
:* Must have a numeric value.
:* Значение должно быть числом.


  automacro MyAuto {
  automacro MyAuto {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     macro_delay 2
     macro_delay 2
     call {
     call {
         log This will be printed at the macro execution
         log Этот текст выведется при запуске макроса.
         log This will be printed 2 seconds after
         log А этот текст напечатается через две секунды.
     }
     }
  }
  }
   
   
  automacro MyAuto2 {
  automacro MyAuto2 {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     macro_delay 5
     macro_delay 5
     call {
     call {
         log This will be printed at the macro execution
         log Этот текст выведется при запуске макроса.
         log This will be printed 5 seconds after
         log А этот текст напечатается через пять секунд.
     }
     }
  }
  }


; orphan
; orphan
:* '''orphan''' is an optional parameter.
:* '''orphan''' - необязательный параметр.
:* '''orphan''' defines how will eventMacro deal with macros when 'eventMacro' is cleaned out of AI queue.
:* '''orphan''' определяет, что будет делать плагин eventMacro делать с макросами в том случае, когда плагин уберут из очереди задач AI.
:* The default value for this parameter can be set in the config key eventMacro_orphans [[eventMacro#Configuration files|Configuration files]].
:* Значение по умолчанию можно настроить в параметре конфига eventMacro_orphans [[eventMacro#Configuration files|Configuration files]].
:* If not used in the automacro the default value will be used, which is the config key eventMacro_orphans.
:* Если параметр не указан в автомакросе, то тогда будет использовано значение из параметра конфига eventMacro_orphans.
:* If eventMacro_orphans is not set in the config the default value will be used, which is: terminate
:* Если и в конфиге не указан параметр eventMacro_orphans, тогда используется значение: terminate
:* The valid values and their descriptions are the following:
:* Возможные значения параметра:


{|class="indextable" style="text-align:center;"
{|class="indextable" style="text-align:center;"
! Value
! Значение
! Description
! Описание
|-
|-
|align=center| terminate  
|align=center| terminate  
|align=center| terminates the macro (''equivalent to eventMacro stop'')
|align=center| прервать, остановить работу макроса (''равнозначно команде eventMacro stop'')
|-
|-
|align=center| terminate_last_call
|align=center| terminate_last_call
|align=center| terminates only the last call of the queue, this means that if macro 'mac1' called 'mac2' which called 'mac3', who got orphaned, only 'mac3' gets terminated, and queue returns to 'mac2'.
|align=center| прервать только последний вызванный макрос. Таким образом, если макрос 'mac1' вызвал 'mac2', который в свою очередь вызвал 'mac3', то только 'mac3' будет прерван, а вызвавший его макрос 'mac2' продолжит работу.
|-
|-
|align=center| reregister  
|align=center| reregister  
|align=center| re-registers to AI queue, overriding other entries. This means to force the continuation of the macro.  
|align=center| заново регистрирует макросы в очередь задач AI, затирая другие записи. Таким образом брошенный макрос сможет сразу же продолжить работу.
|-
|-
|align=center| reregister_safe
|align=center| reregister_safe
|align=center| re-registers to AI queue when AI gets idle. This means the macro will continue when all other tasks are done.  
|align=center| заново регистрирует макросы в очередь задач AI, когда она пустеет и AI нечего делать. Это означает, что макрос продолжит работать только после завершения всех остальных задач.
|}
|}


; repeat
; repeat
:* '''repeat''' is an optional parameter.
:* '''repeat''' - необязательный параметр.
:* '''repeat''' defines how many times the macro defined by call will be called.
:* '''repeat''' определяет сколько раз подряд будет запущен макрос.
:* If not used in the automacro the default value will be used, which is: 1.
:* Значение по умолчанию: 1.
:* Must have a numeric value.
:* Значение должно быть числом.


  automacro <automacro name> {
  automacro <automacro name> {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     repeat 3
     repeat 3
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This message will be printed 3 times, because the macro will be called 3 times
     log Это сообщение будет напечатано трижды, потому что макрос будет вызван три раза.
  }
  }


; timeout
; timeout
:* '''timeout''' is an optional parameter.
:* '''timeout''' - необязательный параметр.
:* '''timeout''' defines the time in seconds before this automacro can activate again after an activation.
:* '''timeout''' - определяет, через какое время этот автомакрос может сработать снова.
:* If not used in the automacro the default value will be used, which is: 0.
:* Значение по умолчанию: 0.
:* Must have a numeric value.
:* Значение должно быть числом.


  automacro <automacro name> {
  automacro <automacro name> {
     <automacro conditions and parameters (and only them)>
     <тут только условия и параметры автомакроса>
     timeout 60
     timeout 60
     call myMacro
     call myMacro
  }
  }
  macro myMacro {
  macro myMacro {
     <macro instructions (and only them, as this is regular macro)>
     <тут обычные инструкции макроса>
     log This macro will only be called every 60 seconds
     log Этот макрос будет вызываться не чаще одного раза в минуту.
  }
  }


=== Conditions ===
=== Условия ===


:* Conditions are separated into 2 categories: state and event.
:* Условия делятся на две категории: состояние и событие.
:* Most conditions set special variables when the automacro activates.
:* Большинство условий присваивают некие значения специальным переменным, когда автомакрос срабатывает.
:* Most conditions accept variables in their code.
:* В большинстве условий можно использовать переменные.
:* Each automacro can only have one event condition.
:* Каждый автомакрос может срабатывать только на одно событие.
:* Most state conditions can be used more than once in each automacro.
:* Большинство условий состояния может быть использовано более одного раза в автомакросе.
:* Each condition will have it's detailed explanation below.
:* Для каждого условие далее следует подробное описание.
:* eventMacro has a modular condition system, each file inside eventMacro/Condition is a condition.
:* Плагин eventMacro устроен так, что для каждого условия есть свой модуль - файл pm. Все файлы в папке eventMacro/Condition - это условия автомакросов.


==== State ====
==== Состояние ====
:* State conditions have a defined status of true or false.
:* Условные выражения состояний возвращают true или false.
:* An automacro will only activate when all of it's state conditions are true.
:* Автомакрос сработает только если все ого условия состояний будут true.




;BaseLevel
;BaseLevel
:* Description: Checks the player base level.
:* Описание: Проверяет базовый уровень персонажа.
:* Does not support percentages.
:* Не поддерживает проценты прогресса.


: Syntax:
: Синтаксис:
  BaseLevel <[[EventMacro#Math condition operators|Math condition operators]]>
  BaseLevel <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  BaseLevel >= 30
  BaseLevel >= 30


: Set variables:
: Устанавливает значение переменной:
  $.BaseLevelLast => Saves the last level that made BaseLevel become true
  $.BaseLevelLast => в переменную записывается базовый уровень, при котором условное выражение стало true




;JobLevel
;JobLevel
:* Description: Checks the player job level.
:* Описание: Проверяет профессиональный уровень персонажа.
:* Does not support percentages.
:* Не поддерживает проценты прогресса.


: Syntax:
: Синтаксис:
  JobLevel <[[EventMacro#Math condition operators|Math condition operators]]>
  JobLevel <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  JobLevel = 70
  JobLevel = 70


: Set variables:
: Устанавливает значение переменной:
  $.JobLevelLast => Saves the last job level that made JobLevel become true
  $.JobLevelLast => в переменную записывается профессиональный уровень, при котором выражение стало true




;CartCurrentWeight
;CartCurrentWeight
:* Description: Checks the player's cart current weight.
:* Описание: Смотрит вес предметов в телеге.
:* Supports percentages.
:* Может работать с процентами.


: Syntax:
: Синтаксис:
  CartCurrentWeight <[[EventMacro#Math condition operators|Math condition operators]]>
  CartCurrentWeight <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Примеры:
  CartCurrentWeight > 80%
  CartCurrentWeight > 80%
  CartCurrentWeight > 4000
  CartCurrentWeight > 4000


: Set variables:
: Устанавливает значения переменных:
  $.CartCurrentWeightLast => Saves the last cart weight that made CartCurrentWeight become true
  $.CartCurrentWeightLast => запоминает вес предметов в телеге, при котором выполнилось условие
  $.CartCurrentWeightLastPercent => Saves the last cart weight percentage that made CartCurrentWeight become true
  $.CartCurrentWeightLastPercent => запоминает вес предметов в телеге в процентах от максимального, при котором выполнилось условие




;CartMaxWeight
;CartMaxWeight
:* Description: Checks the player's cart max weight.
:* Описание: Проверяет вместимость телеги, т.е. максимальный вес предметов в телеге.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  CartMaxWeight <[[EventMacro#Math condition operators|Math condition operators]]>
  CartMaxWeight <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  CartMaxWeight > 4000
  CartMaxWeight > 4000


: Set variables:
: Устанавливает значение переменной:
  $.CartMaxWeightLast => Saves the last cart max weight that made CartMaxWeight become true
  $.CartMaxWeightLast => запоминает вместимость телеги на момент срабатывания условия




;CartCurrentSize
;CartCurrentSize
:* Description: Checks the player's cart current item quantity.
:* Описание: Проверяет количество предметов в телеге.
:* Supports percentages.
:* Может работать с процентами.


: Syntax:
: Синтаксис:
  CartCurrentSize <[[EventMacro#Math condition operators|Math condition operators]]>
  CartCurrentSize <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Примеры:
  CartCurrentSize > 80%
  CartCurrentSize > 80%
  CartCurrentSize > 4000
  CartCurrentSize > 4000


: Set variables:
: Устанавливает значение переменных:
  $.CartCurrentSizeLast => Saves the last cart item quantity that made CartCurrentSize become true
  $.CartCurrentSizeLast => запоминает количество предметов в телеге на момент срабатывания условия
  $.CartCurrentSizeLastPercent => Saves the last cart item quantity percentage that made CartCurrentSize become true
  $.CartCurrentSizeLastPercent => запоминает количество предметов в телеге в процентах от максимального на момент срабатывания условия




;CartMaxSize
;CartMaxSize
:* Description: Checks the player's cart max item quantity.
:* Описание: Проверить вместимость телеги в предметах.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  CartMaxSize <[[EventMacro#Math condition operators|Math condition operators]]>
  CartMaxSize <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  CartMaxSize > 4000
  CartMaxSize > 4000


: Set variables:
: Устанавливает значение переменной:
  $.CartMaxSizeLast => Saves the last cart max item quantity that made CartMaxSize become true
  $.CartMaxSizeLast => запоминает максимальную вместимость телеги на момент срабатывания условия




;CharCurrentWeight
;CharCurrentWeight
:* Description: Checks the player's current weight.
:* Описание: проверяет текущий вес инвентаря у персонажа.
:* Supports percentages.
:* Может работать с процентами.


: Syntax:
: Синтаксис:
  CharCurrentWeight <[[EventMacro#Math condition operators|Math condition operators]]>
  CharCurrentWeight <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Примеры:
  CharCurrentWeight > 80%
  CharCurrentWeight > 80%
  CharCurrentWeight > 4000
  CharCurrentWeight > 4000


: Set variables:
: Устанавливает значения переменных:
  $.CharCurrentWeightLast => Saves the last player weight that made CharCurrentWeight become true
  $.CharCurrentWeightLast => запоминает вес инвентаря персонажа на момент срабатывания условия
  $.CharCurrentWeightLastPercent => Saves the last player weight percentage that made CharCurrentWeight become true
  $.CharCurrentWeightLastPercent => запоминает вес инвентаря персонажа в процентах от максимальной загрузки на момент срабатывания условия




;CharMaxWeight
;CharMaxWeight
:* Description: Checks the player's max weight.
:* Описание: проверяет максимально переносимый груз в инвентаре персонажа.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  CharMaxWeight <[[EventMacro#Math condition operators|Math condition operators]]>
  CharMaxWeight <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  CharMaxWeight > 4000
  CharMaxWeight > 4000


: Set variables:
: Устанавливает значение переменной:
  $.CharMaxWeightLast => Saves the last player max weight that made CharMaxWeight become true
  $.CharMaxWeightLast => запоминает максимально переносимый груз в инвентаре персонажа на момент срабатывания условия




;FreeStatPoints
;FreeStatPoints
:* Description: Checks the player's free stat points.
:* Описание: проверяет нераспределённые стат-поинты.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  FreeStatPoints <[[EventMacro#Math condition operators|Math condition operators]]>
  FreeStatPoints <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  FreeStatPoints > 20
  FreeStatPoints > 20


: Set variables:
: Устанавливает значение переменной:
  $.FreeStatPointsLast => Saves the last amount of free stat points that made FreeStatPoints become true
  $.FreeStatPointsLast => запоминает количество свободных стат-поинтов на момент срабатывания условия




;FreeSkillPoints
;FreeSkillPoints
:* Description: Checks the player's free skill points.
:* Описание: проверяет количество свободных очков умений.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  FreeSkillPoints <[[EventMacro#Math condition operators|Math condition operators]]>
  FreeSkillPoints <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  FreeSkillPoints > 20
  FreeSkillPoints > 20


: Set variables:
: Устанавливает значение переменной:
  $.FreeSkillPointsLast => Saves the last amount of free skill points that made FreeSkillPoints become true
  $.FreeSkillPointsLast => запоминает количество свободных очков умений на момент срабатывания условия




;CurrentHP
;CurrentHP
:* Description: Checks the player's current hp.
:* Описание: проверяет количество очков жизни (т.е. hp) у персонажа.
:* Supports percentages.
:* Может работать с процентами.


: Syntax:
: Синтаксис:
  CurrentHP <[[EventMacro#Math condition operators|Math condition operators]]>
  CurrentHP <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Примеры:
  CurrentHP > 80%
  CurrentHP > 80%
  CurrentHP > 4000
  CurrentHP > 4000


: Set variables:
: Устанавливает значение переменных:
  $.CurrentHPLast => Saves the last player hp that made CurrentHP become true
  $.CurrentHPLast => запоминает, сколько было здоровья у персонажа на момент проверки условия
  $.CurrentHPLastPercent => Saves the last player hp percentage that made CurrentHP become true
  $.CurrentHPLastPercent => то же самое, но в процентах




;MaxHP
;MaxHP
:* Description: Checks the player's max hp.
:* Описание: проверяет, какое максимальное количество hp может быть у персонажа.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  MaxHP <[[EventMacro#Math condition operators|Math condition operators]]>
  MaxHP <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  MaxHP > 4000
  MaxHP > 4000


: Set variables:
: Устанавливает значение переменной:
  $.MaxHPLast => Saves the last player max hp that made MaxHP become true
  $.MaxHPLast => запоминает, какое максимальное количество hp могло быть у персонажа на момент проверки условия




;CurrentSP
;CurrentSP
:* Description: Checks the player's current sp.
:* Описание: запоминает текущее значение sp у персонажа.
:* Supports percentages.
:* Работает с процентами.


: Syntax:
: Синтаксис:
  CurrentSP <[[EventMacro#Math condition operators|Math condition operators]]>
  CurrentSP <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  CurrentSP > 80%
  CurrentSP > 80%
  CurrentSP > 4000
  CurrentSP > 4000


: Set variables:
: Устанавливает значение переменной:
  $.CurrentSPLast => Saves the last player sp that made CurrentSP become true
  $.CurrentSPLast => запоминает текущее значение sp на момент проверки условия
  $.CurrentSPLastPercent => Saves the last player sp percentage that made CurrentSP become true
  $.CurrentSPLastPercent => то же самое, в процентах




;MaxSP
;MaxSP
:* Description: Checks the player's max sp.
:* Описание: проверяет максимально возможное количество sp у персонажа.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  MaxSP <[[EventMacro#Math condition operators|Math condition operators]]>
  MaxSP <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  MaxSP > 4000
  MaxSP > 4000


: Set variables:
: Устанавливает значение переменной:
  $.MaxSPLast => Saves the last player max sp that made MaxSP become true
  $.MaxSPLast => запоминает максимально возможное количество sp у персонажа на момент проверки условия




;InInventory
;InInventory
:* Description: Checks if the player has a certain quantity of an item in the inventory, uses item name.
:* Описание: по названию предмета проверяет его количество у персонажа в инвентаре.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  InInventory "<item name>" <[[EventMacro#Math condition operators|Math condition operators]]>
  InInventory "<название предмета>" <[[EventMacro#Math condition operators|Math condition operators]]>


: Note the quotation marks.
: Обратите внимание на кавычки, это важно.


: Example:
: Пример:
  InInventory "Red Potion" < 10
  InInventory "Red Potion" < 10


: Set variables:
: Устанавливает значение переменной:
  $.InInventoryLast => Saves the name of the last item that made InInventory become true
  $.InInventoryLast => запоминает название проверяемого предмета
  $.InInventoryLastAmount => Saves the amount in inventory of the last item that made InInventory become true
  $.InInventoryLastAmount => запоминает количество предметов




;InInventoryID
;InInventoryID
:* Description: Checks if the player has a certain quantity of an item in the inventory, uses item ID.
:* Описание: по идентификатору предмета проверяет его количество у персонажа в инвентаре.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  InInventoryID <item ID> <[[EventMacro#Math condition operators|Math condition operators]]>
  InInventoryID <идентификатор предмета> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  InInventoryID 501 < 10
  InInventoryID 501 < 10


: Set variables:
: Устанавливает значение переменной:
  $.InInventoryIDLast => Saves the ID of the last item that made InInventoryID become true
  $.InInventoryIDLast => запоминает идентификатор предмета
  $.InInventoryIDLastAmount => Saves the amount in inventory of the last item that made InInventoryID become true
  $.InInventoryIDLastAmount => запоминает количество предмета на момент срабатывания условия




;InStorage
;InStorage
:* Description: Checks if the player has a certain quantity of an item in the storage, uses item name.
:* Описание: по названию предмета проверяет его количество на складе.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  InStorage "<item name>" <[[EventMacro#Math condition operators|Math condition operators]]>
  InStorage "<название предмета>" <[[EventMacro#Math condition operators|Math condition operators]]>


: Note the quotation marks.
: Обратите внимание на кавычки.


: Example:
: Пример:
  InStorage "Blue Potion" > 100
  InStorage "Blue Potion" > 100


: Set variables:
: Устанавливает значение переменной:
  $.InStorageLast => Saves the name of the last item that made InStorage become true
  $.InStorageLast => запоминает название предмета
  $.InStorageLastAmount => Saves the amount in storage of the last item that made InStorage become true
  $.InStorageLastAmount => запоминает количество на момент срабатывания условия




;InStorageID
;InStorageID
:* Description: Checks if the player has a certain quantity of an item in the storage, uses item ID.
:* Описание: по идентификатору предмета проверят его количество на складе.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  InStorageID <item ID> <[[EventMacro#Math condition operators|Math condition operators]]>
  InStorageID <item ID> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  InStorageID 507 100..500
  InStorageID 507 100..500


: Set variables:
: Устанавливает значение переменной:
  $.InStorageIDLast => Saves the ID of the last item that made InStorageID become true
  $.InStorageIDLast => запоминает идентификатор предмета
  $.InStorageIDLastAmount => Saves the amount in storage of the last item that made InStorageID become true
  $.InStorageIDLastAmount => запоминает количество предметов на складе на момент срабатывания условия




;InCart
;InCart
:* Description: Checks if the player has a certain quantity of an item in the cart, uses item name.
:* Описание: по названию предмета смотрит его количество в телеге.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  InCart "<item name>" <[[EventMacro#Math condition operators|Math condition operators]]>
  InCart "название предмета" <[[EventMacro#Math condition operators|Math condition operators]]>


: Note the quotation marks.
: Обратите внимание на кавычки.


: Example:
: Пример:
  InCart "Blue Potion" > 100
  InCart "Blue Potion" > 100


: Set variables:
: Устанавливает значение переменной:
  $.InCartLast => Saves the name of the last item that made InCart become true
  $.InCartLast => запоминает название предмета
  $.InCartLastAmount => Saves the amount in cart of the last item that made InCart become true
  $.InCartLastAmount => запоминает количество на момент срабатывания условия




;InCartID
;InCartID
:* Description: Checks if the player has a certain quantity of an item in the cart, uses item ID.
:* Описание: по идентификатору предмета смотрит его количество в телеге.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  InCartID <item ID> <[[EventMacro#Math condition operators|Math condition operators]]>
  InCartID <идентификатор предмета> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  InCartID 507 100..500
  InCartID 507 100..500


: Set variables:
: Устанавливает значение переменной:
  $.InCartIDLast => Saves the ID of the last item that made InCartID become true
  $.InCartIDLast => запоминает идентификатор предмета
  $.InCartIDLastAmount => Saves the amount in cart of the last item that made InCartID become true
  $.InCartIDLastAmount => запоминает количество в телеге на момент срабатывания условия




;InventoryCurrentSize
;InventoryCurrentSize
:* Description: Checks the player current item count.
:* Описание: проверяет текущее количество предметов в инвентаре (ячейки).
:* Supports percentages. (but it won't change anything since you can have 100 items max)
:* Работает с процентами. (но смысла в этом особого нет ибо места в инвентаре как раз на 100 предметов)


: Syntax:
: Синтаксис:
  InventoryCurrentSize <[[EventMacro#Math condition operators|Math condition operators]]>
  InventoryCurrentSize <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  InventoryCurrentSize > 70%
  InventoryCurrentSize > 70%
  InventoryCurrentSize > 30
  InventoryCurrentSize > 30


: Set variables:
: Устанавливает значение переменной:
  $.InventoryCurrentSizeLast => Saves the last player item count that made InventoryCurrentSize become true
  $.InventoryCurrentSizeLast => запоминает количество занятых ячеек в инвентаре персонажа на момент срабатывания условия




;SkillLevel
;SkillLevel
:* Description: Checks if the player has a certain level of a certain skill, uses skill Id or Handle.
:* Описание: по идентификатору умения или по константе проверяет, насколько умение прокачано.
:* Does not support percentages.
:* Не работает с процентами.
 
: Syntax:
SkillLevel "<skill ID or Handle>" <[[EventMacro#Math condition operators|Math condition operators]]>


: Note the quotation marks.
: Синтаксис:
SkillLevel <идентификатор умения или константа> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  SkillLevel NV_FIRSTAID = 0
  SkillLevel NV_FIRSTAID = 0
  SkillLevel 10 > 5
  SkillLevel 10 > 5


: Set variables:
: Устанавливает значение переменной:
  $.SkillLevelLastName => Saves the name of the last skill that made SkillLevel become true
  $.SkillLevelLastName => запоминает название умения
  $.SkillLevelLastID => Saves the ID of the last skill that made SkillLevel become true
  $.SkillLevelLastID => запоминает идентификатор умения
  $.SkillLevelLastHandle => Saves the Handle of the last skill that made SkillLevel become true
  $.SkillLevelLastHandle => запоминает константу
  $.SkillLevelLastLevel => Saves the level of the last skill that made SkillLevel become true
  $.SkillLevelLastLevel => собственно запоминает уровень, на который было прокачано умение на момент срабатывания условия




;Zeny
;Zeny
:* Description: Checks the player current zeny.
:* Описание: проверяет, сколько у персонажа зени.
:* Does not support percentages.
:* Не работает с процентами.


: Syntax:
: Синтаксис:
  Zeny <[[EventMacro#Math condition operators|Math condition operators]]>
  Zeny <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  Zeny > 500000
  Zeny > 500000


: Set variables:
: Устанавливает значение переменной:
  $.ZenyLast => Saves the last zeny amount that made Zeny become true
  $.ZenyLast => запоминает количество зени на момент срабатывания условия




;StorageOpened
;StorageOpened
:* Description: Is true if storage is opened and it is set to 1 or storage is not opened and it is set to 0.
:* Описание: истина, если 1 и персонаж открыл склад. Также истина, если 0 и склад закрыт. Смотря что хотим проверить.


: Syntax:
: Синтаксис:
  StorageOpened <1|0>
  StorageOpened <1|0>


: Example:
: Пример:
  StorageOpened 1
  StorageOpened 1
;ShopOpened
:* Описание: истина, если 1 и персонаж открыл свою торговую лавку. Также истина, если 0 и торговая лавка не открыта. Смотря что хотим проверить.
: Синтаксис:
ShopOpened <1|0>
: Пример:
ShopOpened 1




;InChatRoom
;InChatRoom
:* Description: Is true if you are in a chat room and it is set to 1 or you are not in a chat room and it is set to 0.
:* Описание: истина, если 1 и персонаж находится в чат-комнате. Также истина, если 0 и персонаж не находится в чат-комнате.


: Syntax:
: Синтаксис:
  InChatRoom <1|0>
  InChatRoom <1|0>


: Example:
: Пример:
  InChatRoom 0
  InChatRoom 0




;ChatRoomNear
;ChatRoomNear
:* Description: Checks if there is a npc near which name matches the given regex.
:* Описание: по регулярному выражению проверяет, есть ли рядом подходящая чат-комната.
 
Примечание переводчика: Тут не хватает синтаксиса, примера и описания переменных для ChatRoomNear.
 


: Syntax:
Примечание переводчика: Тут не хватает описания про NpcNear.
 
: Синтаксис:
  NpcNear <[[EventMacro#Regex|Regex]]>
  NpcNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  NpcNear /kafra/
  NpcNear /kafra/
  NpcNear /special agent/
  NpcNear /special agent/


: Set variables:
: Устанавливает значение переменной:
  $.ChatRoomNearLastID => Saves the ID of the last chat room that made ChatRoomNear become true
  $.ChatRoomNearLastID => Saves the ID of the last chat room that made ChatRoomNear become true
  $.ChatRoomNearLastOwnerID => Saves the ID of the owner of the last chat room that made ChatRoomNear become true
  $.ChatRoomNearLastOwnerID => Saves the ID of the owner of the last chat room that made ChatRoomNear become true
Строка 1775: Строка 1894:


;InMap
;InMap
:* Description: Checks if the current map match one of the given maps.
:* Описание: проверяет, находится ли персонаж на одной из перечисленных локаций.


: Syntax:
: Синтаксис:
  InMap <comma separated list of maps>
  InMap <список локаций>


: Map can be a variable.
: Название локации может быть переменной.


: Example:
: Пример:
  InMap prontra, geffen, gef_fild10
  InMap prontra, geffen, gef_fild10


: Set variables:
: Устанавливает значение переменной:
  $.InMapLast => Saves the last map that made InMap become true
  $.InMapLast => запоминает локацию, которая вызвала срабатывание условия




;InLockMap
;InLockMap
:* Description: Is true if you are in lockmap and it is set to 1 or you are not in lockmap and it is set to 0.
:* Описание: истина, если 1 и персонаж находится на локмапе. Также истина, если 0 и персонаж не на локмапе.


: Syntax:
: Синтаксис:
  InLockMap <1|0>
  InLockMap <1|0>


: Example:
: Пример:
  InLockMap 1
  InLockMap 1




;InSaveMap
;InSaveMap
:* Description: Is true if you are in savemap and it is set to 1 or you are not in savemap and it is set to 0.
:* Описание: истина, если 1 и персонаж находится на локации, где у него точка сохранения. Также истина, если 0 и персонаж не находится на локации с его точкой сохранения.


: Syntax:
: Синтаксис:
  InSaveMap <1|0>
  InSaveMap <1|0>


: Example:
: Пример:
  InSaveMap 0
  InSaveMap 0




;IsInCoordinate
;IsInCoordinate
:* Description: Checks if the current coordinates match one of the given ones.
:* Описание: проверяет, находится ли персонаж по указанным координатам.


: Syntax:
: Синтаксис:
  IsInCoordinate <comma separated list of pairs of x and y coordinates>
  IsInCoordinate <разделённый запятыми список пар координат x и y>


: It also accepts ranges in place of coordinates. (like 100..200 for x and 50..100 for y)
: Кроме точных координат понимает также диапазоны. (типа 100..200 вместо координаты x и 50..100 вместо координаты y)


: Example:
: Пример:
  IsInCoordinate 100 150
  IsInCoordinate 100 150
  IsInCoordinate 120 100, 115 289, 158 236
  IsInCoordinate 120 100, 115 289, 158 236
Строка 1823: Строка 1942:
  IsInCoordinate 30..35 40..45
  IsInCoordinate 30..35 40..45


: Set variables:
: Устанавливает значение переменной:
  $.IsInCoordinateLast => Saves the last coordinate that made IsInCoordinate become true
  $.IsInCoordinateLast => запоминает координаты, при которых сработало условие
  $.IsInCoordinateLastMemberIndex => Saves the list index in condition that made IsInCoordinate become true
  $.IsInCoordinateLastMemberIndex => запоминает номер в списке, к которому подошли координаты персонажа




;IsInMapAndCoordinate
;IsInMapAndCoordinate
:* Description: Checks if the current map and/or coordinates match one of the given maps.
:* Описание: проверяет, находится ли персонаж по заданным координатам.


: Syntax:
: Синтаксис:
  IsInMapAndCoordinate <comma separated list of pairs of x and y coordinates and/or maps>
  IsInMapAndCoordinate <список локаций и координат>


: It also accepts ranges in place of coordinates. (like 100..200 for x and 50..100 for y)
: Можно использовать диапазоны чисел, например 100..200 50..100
: You can use map, coordinates or map with coordinates
: Можно проверять только по названию локации, только по координатам или всё вместе - локацию с координатами


: Example:
: Пример:
  IsInMapAndCoordinate 100 150
  IsInMapAndCoordinate 100 150
  IsInMapAndCoordinate prontera
  IsInMapAndCoordinate prontera
Строка 1845: Строка 1964:
  IsInMapAndCoordinate gef_fild10 20..80 200, payon 50 60
  IsInMapAndCoordinate gef_fild10 20..80 200, payon 50 60


: Set variables:
: Устанавливает значение переменной:
  $.IsInMapAndCoordinateLast => Saves the last coordinate that made IsInMapAndCoordinate become true
  $.IsInMapAndCoordinateLast => запоминает координаты, которые привели к срабатыванию условия
  $.IsInMapAndCoordinateLastMemberIndex => Saves the list index in condition that made IsInMapAndCoordinate become true
  $.IsInMapAndCoordinateLastMemberIndex => запоминает номер элемента из списка локаций и координат, который привёл к срабатыванию условия




;InPvP
;InPvP
:* Description: Checks if the current pvp type of the map matches the given type.
:* Описание: проверяет локацию на заданный режим pvp.


: Syntax:
: Синтаксис:
  InPvP <comma separated list of pvp types>
  InPvP <список режимов pvp>


: Valid pvp types: '''pvp''', '''gvg''' and '''battleground'''
: Режимы: '''pvp''', '''gvg''' и '''battleground'''.


: Example:
: Пример:
  InPvP battleground, pvp
  InPvP battleground, pvp


: Set variables:
: Устанавливает значение переменной:
  $.InPvPLast => Saves the last pvp type that made InPvP become true
  $.InPvPLast => запоминает режим pvp, который привёл к срабатыванию условия




;InCity
;InCity
:* Description: Checks if the player is in a city or not.
:* Описание: проверяет, находится ли персонаж в городе или нет.


: Syntax:
: Синтаксис:
  InCity <0 | 1>
  InCity <0 | 1>


: When value is 0: Only true if map is not a city
: Если 0, то сработает не в городе
: When value is 1: Only true if map is a city
: Если 1, то сработает в городу


: Example:
: Пример:
  InCity 1
  InCity 1


: Set variables:
: Устанавливает значение переменной:
  $.InCityLast => Saves the name of the last map that made InCity become true
  $.InCityLast => запоминает название локации на которой условие сработало




;InMapRegex
;InMapRegex
:* Description: Checks if the current map matches the given regex.
:* Описание: Соответствует ли название текущей локации заданному в regex шаблону.


: Syntax:
: Синтаксис:
  InMapRegex <[[EventMacro#Regex|Regex]]>
  InMapRegex <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  InMapRegex /field\d+$/
  InMapRegex /field\d+$/
  InMapRegex /^pay/
  InMapRegex /^pay/


: Set variables:
: Устанавливает значение переменной:
  $.InMapRegexLast => Saves the name of the last map that made InMapRegex become true
  $.InMapRegexLast => запоминает название локации, при котором условие InMapRegex стало true




;NpcNear
;NpcNear
:* Description: Checks if there is a npc near which name matches the given regex.
:* Описание: Есть ли поблизости непись, имя которой подпадает под заданный regex-шаблон.


: Syntax:
: Синтаксис:
  NpcNear <[[EventMacro#Regex|Regex]]>
  NpcNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  NpcNear /kafra/
  NpcNear /kafra/
  NpcNear /special agent/
  NpcNear /special agent/


: Set variables:
: Устанавливает значение переменной:
  $.NpcNearLast => Saves the name of the last npc that made NpcNear become true
  $.NpcNearLast => запоминает имя неписи
  $.NpcNearLastPos => Saves the position of the last npc that made NpcNear become true (can be used for 'talknpc' command)
  $.NpcNearLastPos => запоминает местоположение неписи, можно использовать в дальнейшем для команды 'talknpc'
  $.NpcNearLastBinId => Saves the openkore ID of the last npc that made NpcNear become true (can be used for 'talk' command)
  $.NpcNearLastBinId => запоминает индекс неписи в списке openkore, можно в дальнейшем использовать в команде 'talk'
  $.NpcNearLastDist => Saves the distance of the last npc that made NpcNear become true
  $.NpcNearLastDist => запоминает дистанцию до обнаруженной неписи




;NpcNearDist
;NpcNearDist
:* Description: Checks if there is a npc in a given distance which name matches the given regex.
:* Описание: Есть ли на определённом удалении непись, имя которой подпадает под заданный regex-шаблон.


: Syntax:
: Синтаксис:
  NpcNearDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  NpcNearDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  NpcNearDist /kafra/ <= 4
  NpcNearDist /kafra/ <= 4
  NpcNearDist /special agent/ >= 5
  NpcNearDist /special agent/ >= 5


: Set variables:
: Устанавливает значение переменной:
  $.NpcNearDistLast => Saves the name of the last npc that made NpcNearDist become true
  $.NpcNearDistLast => запоминает имя неписи
  $.NpcNearDistLastPos => Saves the position of the last npc that made NpcNearDist become true (can be used for 'talknpc' command)
  $.NpcNearDistLastPos => запоминает местоположение неписи, можно использовать в дальнейшем для команды 'talknpc'
  $.NpcNearDistLastBinId => Saves the openkore ID of the last npc that made NpcNearDist become true (can be used for 'talk' command)
  $.NpcNearDistLastBinId => запоминает индекс неписи в списке openkore, можно в дальнейшем использовать в команде 'talk'
  $.NpcNearDistLastDist => Saves the distance of the last npc that made NpcNearDist become true
  $.NpcNearDistLastDist => запоминает дистанцию до обнаруженной неписи




;NpcNotNear
;NpcNotNear
:* Description: Checks if there's no npc near which name matches the given regex.
:* Описание: Проверяет, что поблизости нет неписи с заданным в regex именем.


: Syntax:
: Синтаксис:
  NpcNotNear <[[EventMacro#Regex|Regex]]>
  NpcNotNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  NpcNotNear /kafra/
  NpcNotNear /kafra/
  NpcNotNear /special agent/
  NpcNotNear /special agent/


: Sets no variables
: Не создаёт никаких переменных




;PlayerNear
;PlayerNear
:* Description: Checks if there is a player near which name matches the given regex.
:* Описание: Есть ли рядом игроки с заданным в regex именем.


: Syntax:
: Синтаксис:
  PlayerNear <[[EventMacro#Regex|Regex]]>
  PlayerNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  PlayerNear /john/
  PlayerNear /john/
  PlayerNear /henry the best TM/i
  PlayerNear /henry the best TM/i


: Set variables:
: Устанавливает значение переменной:
  $.PlayerNearLast => Saves the name of the last player that made PlayerNear become true
  $.PlayerNearLast => запоминает имя персонажа
  $.PlayerNearLastPos => Saves the position of the last player that made PlayerNear become true
  $.PlayerNearLastPos => запоминает местоположение персонажа
  $.PlayerNearLastBinId => Saves the openkore ID of the last player that made PlayerNear become true
  $.PlayerNearLastBinId => запоминает номер игрока в списке openkore
  $.PlayerNearLastDist => Saves the distance of the last player that made PlayerNear become true
  $.PlayerNearLastDist => запоминает расстояние до игрока




;PlayerNearDist
;PlayerNearDist
:* Description: Checks if there is a player in a given distance which name matches the given regex.
:* Описание: Есть ли на указанном расстоянии игроки с именем, совпадающим с regex-шаблоном.


: Syntax:
: Синтаксис:
  PlayerNearDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PlayerNearDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  PlayerNearDist /bad gm/ < 10
  PlayerNearDist /bad gm/ < 10
  PlayerNearDist /good guy healer/ <5
  PlayerNearDist /good guy healer/ <5


: Set variables:
: Устанавливает значение переменной:
  $.PlayerNearDistLast => Saves the name of the last player that made PlayerNearDist become true
  $.PlayerNearDistLast => Запоминает имя игрока
  $.PlayerNearDistLastPos => Saves the position of the last player that made PlayerNearDist become true
  $.PlayerNearDistLastPos => Запоминает местоположение игрока
  $.PlayerNearDistLastBinId => Saves the openkore ID of the last player that made PlayerNearDist become true
  $.PlayerNearDistLastBinId => Запоминает номер игрока в списке openkore
  $.PlayerNearDistLastDist => Saves the distance of the last player that made PlayerNearDist become true
  $.PlayerNearDistLastDist => Запоминает расстояние до игрока




;PlayerNotNear
;PlayerNotNear
:* Description: Checks if there's no player near which name matches the given regex.
:* Описание: Удостоверяется, что рядом нет игрока с похожим на regex-шаблон именем.


: Syntax:
: Синтаксис:
  PlayerNotNear <[[EventMacro#Regex|Regex]]>
  PlayerNotNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  PlayerNotNear /the guy I need to see/
  PlayerNotNear /the guy I need to see/
  PlayerNotNear /^(john|george|paul|ringo)$/i
  PlayerNotNear /^(john|george|paul|ringo)$/i


: Sets no variables
: Не создаёт никаких переменных




;MobNear
;MobNear
:* Description: Checks if there is a mob near which name matches the given regex.
:* Описание: Проверяет, есть ли рядом моб с заданным в regex названием.


: Syntax:
: Синтаксис:
  MobNear <[[EventMacro#Regex|Regex]]>
  MobNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  MobNear /(edga|maya|ifrit|bad mvps)/i
  MobNear /(edga|maya|ifrit|bad mvps)/i
  MobNear /oring/
  MobNear /oring/


: Set variables:
: Устанавливает значение переменной:
  $.MobNearLast => Saves the name of the last mob that made MobNear become true
  $.MobNearLast => запоминает название моба
  $.MobNearLastPos => Saves the position of the last mob that made MobNear become true
  $.MobNearLastPos => хранит местоположение моба
  $.MobNearLastBinId => Saves the openkore ID of the last mob that made MobNear become true
  $.MobNearLastBinId => запоминает номер моба в списке openkore
  $.MobNearLastDist => Saves the distance of the last mob that made MobNear become true
  $.MobNearLastDist => расстояние до моба




;MobNearDist
;MobNearDist
:* Description: Checks if there is a mob in a given distance which name matches the given regex.
:* Описание: есть ли на заданном расстоянии моб с названием, подходящим под regex.


: Syntax:
: Синтаксис:
  MobNearDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  MobNearDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  MobNearDist /(Poporing|Drops|Poring|Marin)/ < 3
  MobNearDist /(Poporing|Drops|Poring|Marin)/ < 3


: Set variables:
: Устанавливает значение переменной:
  $.MobNearDistLast => Saves the name of the last mob that made MobNearDist become true
  $.MobNearDistLast => запоминает название найденного моба
  $.MobNearDistLastPos => Saves the position of the last mob that made MobNearDist become true
  $.MobNearDistLastPos => запоминает местоположение моба
  $.MobNearDistLastBinId => Saves the openkore ID of the last mob that made MobNearDist become true
  $.MobNearDistLastBinId => номер моба в списке openkore
  $.MobNearDistLastDist => Saves the distance of the last mob that made MobNearDist become true
  $.MobNearDistLastDist => расстояние до моба




;MobNotNear
;MobNotNear
:* Description: Checks if there's no mob near which name matches the given regex.
:* Описание: Удостоверяется, что рядом нет моба с заданным в regex названием.


: Syntax:
: Синтаксис:
  MobNotNear <[[EventMacro#Regex|Regex]]>
  MobNotNear <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  MobNotNear /mvp I am look for/
  MobNotNear /mvp I am look for/
  MobNotNear /edga/i
  MobNotNear /edga/i


: Sets no variables
: Не создаёт никаких переменных




;JobID
;JobID
:* Description: Checks if the [http://nn.ai4rei.net/dev/npclist/ Job ID] of the current player job matches one of the given ones.
:* Описание: Входит ли профессия персонажа в заданный список профессий. Профессии обозначаются числовым кодом. См. [http://nn.ai4rei.net/dev/npclist/ Job ID]


: Syntax:
: Синтаксис:
  JobID <job ID 1>, <job ID 2>, <job ID 3>, etc
  JobID <job ID 1>, <job ID 2>, <job ID 3>, и т.д.


: Example:
: Пример:
  JobID 6, 4053
  JobID 6, 4053


: Set variables:
: Устанавливает значение переменной:
  $.JobIDLast => Saves the ID of the last job that made JobID become true
  $.JobIDLast => запоминает идентификатор профессии персонажа




;JobIDNot
;JobIDNot
:* Description: Checks if the [http://nn.ai4rei.net/dev/npclist/ Job ID] of the current player job does not match the given one.
:* Описание: Проверяет, что профессия персонажа не входит в заданный список. Профессия обозначается числовым кодом. См. [http://nn.ai4rei.net/dev/npclist/ Job ID]


: Syntax:
: Синтаксис:
  JobIDNot <job ID>
  JobIDNot <job ID>


: Example:
: Пример:
  JobIDNot 6
  JobIDNot 6


: Set variables:
: Устанавливает значение переменной:
  $.JobIDNotLast => Saves the ID of the condition that made JobIDNot become true
  $.JobIDNotLast => запоминает профессию персонажа




;IsEquippedID
;IsEquippedID
:* Description: Checks if the player has an item equipped which ID matches the given one.
:* Описание: проверяет, одета та или иная экипировка в заданном слоте.


: Syntax:
: Синтаксис:
  IsEquippedID <comma separated list of pairs of equip place and ID>
  IsEquippedID <список пар значений место и идентификатор, разделяется запятой>


: Example:
: Пример:
  IsEquippedID topHead 5055
  IsEquippedID topHead 5055
  IsEquippedID rightHand 13040, topHead 5055
  IsEquippedID rightHand 13040, topHead 5055
  IsEquippedID topHead 5055, leftHand 2112, robe 2510, shoes 2414, armor 2352, rightHand 1243
  IsEquippedID topHead 5055, leftHand 2112, robe 2510, shoes 2414, armor 2352, rightHand 1243


: Set variables:
: Устанавливает значение переменной:
  $.IsEquippedIDLastID => Saves the id of the last equip which made IsEquippedID become true
  $.IsEquippedIDLastID => запоминает идентификатор эквипа
  $.IsEquippedIDLastName => Saves the name of the last equip which made IsEquippedID become true
  $.IsEquippedIDLastName => запоминает название эквипа
  $.IsEquippedIDLastSlot => Saves the slot of the last equip which made IsEquippedID become true
  $.IsEquippedIDLastSlot => запоминает слот, т.е. место экипировки
  $.IsEquippedIDLastListIndex => Saves the index in the condition list of the last equip which made IsEquippedID become true
  $.IsEquippedIDLastListIndex => запоминает индекс, номер позиции в списке, которая привела к срабатыванию условия




;IsNotEquippedID
;IsNotEquippedID
:* Description: Checks if the player doesn't have an item equipped which ID matches the given one.
:* Описание: проверяет, что указанная экипировка не одета в заданный слот


: Syntax:
: Синтаксис:
  IsNotEquippedID <comma separated list of pairs of equip place and ID>
  IsNotEquippedID <список пар значений место и идентификатор, разделяется запятой>


: Example:
: Пример:
  IsNotEquippedID topHead 5055
  IsNotEquippedID topHead 5055
  IsNotEquippedID rightHand 13040, topHead 5055
  IsNotEquippedID rightHand 13040, topHead 5055
  IsNotEquippedID topHead 5055, leftHand 2112, robe 2510, shoes 2414, armor 2352, rightHand 1243
  IsNotEquippedID topHead 5055, leftHand 2112, robe 2510, shoes 2414, armor 2352, rightHand 1243


: Set variables:
: Устанавливает значение переменной:
  $.IsNotEquippedIDLastIsEmpty => Saves wheter the slot was empty ot not
  $.IsNotEquippedIDLastIsEmpty => запоминает, был ли слот пустой
  $.IsNotEquippedIDLastSlot => Saves the slot which made IsNotEquippedID become true
  $.IsNotEquippedIDLastSlot => запоминает слот, на котором сработало условие IsNotEquippedID




;ConfigKey
;ConfigKey
:* Description: Checks if the one or more of the given config keys match it's desired value.
:* Описание: проверяет несколько параметров конфига на то, что они соответствуют заданным значениям.


: Syntax:
: Синтаксис:
  ConfigKey <comma separated list of pairs of config key and value>
  ConfigKey <список пар параметр конфига и его значение, разделённый запятыми>


: Config key and config value can be variables. (as in ConfigKey attackAuto $myattack or ConfigKey $vars{atk} 2)
: И параметр конфига и тем более его значение может быть представлено переменными. Т.е. attackAuto $myattack или $vars{atk} 2, где $vars{atk} содержит название параметра конфига.


: Example:
: Пример:
  ConfigKey attackAuto 2, itemsTakeAuto 2
  ConfigKey attackAuto 2, itemsTakeAuto 2


: Set variables:
: Устанавливает значение переменной:
  $.ConfigKeyLastKey => Saves the key of the last config key that made ConfigKey become true
  $.ConfigKeyLastKey => запоминает параметр конфига, при котором сработало условие
  $.ConfigKeyLastValue => Saves the value of the last config key that made ConfigKey become true
  $.ConfigKeyLastValue => запоминает значение параметра
  $.ConfigKeyLastMemberIndex => Saves the list index in condition list that made ConfigKey become true
  $.ConfigKeyLastMemberIndex => запоминает позицию из списка, которая привела к срабатыванию условия ConfigKey




;ConfigKeyNot
;ConfigKeyNot
:* Description: Checks if the at least one of the config key pairs doesn't match their desired value.
:* Описание: проверяет, что хотя бы один параметр конфига из заданного списка не соответствует нужному значению.


: Syntax:
: Синтаксис:
  ConfigKeyNot <comma separated list of pairs of config key and value>
  ConfigKeyNot <список пар параметр конфига и его значение, разделённый запятыми>


: Config key and config value can be variables. (as in ConfigKeyNot attackAuto $myattack or ConfigKeyNot $vars{atk} 2)
: И параметр конфига и тем более его значение может быть представлено переменными. Т.е. ConfigKeyNot attackAuto $myattack или ConfigKeyNot $vars{atk} 2, где $vars{atk} содержит название параметра конфига.


: Example:
: Пример:
  ConfigKeyNot $vars{atk} 2
  ConfigKeyNot $vars{atk} 2
  ConfigKeyNot itemsTakeAuto 1, attackAuto 2
  ConfigKeyNot itemsTakeAuto 1, attackAuto 2


: Set variables:
: Устанавливает значение переменной:
  $.ConfigKeyNotLastKey => Saves the key of the last config key that made ConfigKeyNot become true
  $.ConfigKeyNotLastKey => запоминает название параметра конфига, проверка которого привела к срабатыванию условия ConfigKeyNot
  $.ConfigKeyNotLastWantedValue => Saves the desired value specified in the condifion of the last config key that made ConfigKeyNot become true
  $.ConfigKeyNotLastWantedValue => хранит требуемое значение параметра конфига
  $.ConfigKeyNotLastKeyValue => Saves the value of the last config key that made ConfigKeyNot become true
  $.ConfigKeyNotLastKeyValue => хранит текущее значение параметра конфига
  $.ConfigKeyNotLastMemberIndex => Saves the list index in condition list that made ConfigKeyNot become true
  $.ConfigKeyNotLastMemberIndex => запоминает номер позиции в списке, которая привела к срабатыванию условия


: Note: Good to be sure your keys are the way you want, example below.
: Примечание: Хорошо подходит для того, чтобы удостовериться, что параметры конфига настроены так, как вам надо. Например:
  automacro ConfigWasWrong {
  automacro ConfigWasWrong {
     exclusive 1
     exclusive 1
Строка 2137: Строка 2256:
     ConfigKeyNot itemsTakeAuto 2, attackAuto 2
     ConfigKeyNot itemsTakeAuto 2, attackAuto 2
     call {
     call {
         log There is a config key with the wrong configuration
         log Обнаружен неправильно настроенный параметр конфига
         log The key is $.ConfigKeyNotLastKey
         log Параметр: $.ConfigKeyNotLastKey
         log The wanted value is $.ConfigKeyNotLastWantedValue
         log Требуемое значение: $.ConfigKeyNotLastWantedValue
         log The current key Value is $.ConfigKeyNotLastKeyValue
         log Текущее значение: $.ConfigKeyNotLastKeyValue
         log The Index is $.ConfigKeyNotLastMemberIndex
         log Индекс в списке проверок: $.ConfigKeyNotLastMemberIndex
         log Changing value of key $.ConfigKeyNotLastKey from $.ConfigKeyNotLastKeyValue to $.ConfigKeyNotLastWantedValue
         log Автоматически выставляем подходящее значение для $.ConfigKeyNotLastKey. Меняем его с $.ConfigKeyNotLastKeyValue на $.ConfigKeyNotLastWantedValue
         do conf $.ConfigKeyNotLastKey $.ConfigKeyNotLastWantedValue
         do [[conf]] $.ConfigKeyNotLastKey $.ConfigKeyNotLastWantedValue
     }
     }
  }
  }


This macro will make sure all config keys specified in ConfigKeyNot have the desired value.
Все перечисленные в условии ConfigKeyNot параметры конфига получат требуемые значения.




;ConfigKeyNotExist
;ConfigKeyNotExist
:* Description: Checks if the at least one of the config keys doesn't exist in config.txt.
:* Описание: проверяет, что хотя бы один параметр из списка отсутствует в файле config.txt.


: Syntax:
: Синтаксис:
  ConfigKeyNotExist <comma separated list config keys>
  ConfigKeyNotExist <список параметров через запятую>


: Config key can be a variable
: Может быть переменной


: Example:
: Пример:
  ConfigKeyNotExist gameGuard, saveMap
  ConfigKeyNotExist gameGuard, saveMap


: Set variables:
: Устанавливает значение переменной:
  $.ConfigKeyNotExistLastKey => Saves the last config key that made ConfigKeyNotExist become true
  $.ConfigKeyNotExistLastKey => запоминает параметр конфига, которого нет в config.txt
  $.ConfigKeyNotExistLastMemberIndex => Saves the list index in condition list that made ConfigKeyNotExist become true
  $.ConfigKeyNotExistLastMemberIndex => запоминает номер из списка параметров, на котором сработало условие ConfigKeyNotExist


: Note: Good to be sure your custom config keys were added (can auto-configure plugins), example below with perl sub to add missing keys:
: Примечание: Пригодится для добавления нестандартных параметров конфига, например от каких-нибудь плагинов. В нижеследующем примере среди прочего используется подпрограмма на perl для добавления отсутствующего параметра:
  automacro AddgameGuardMissingKey {
  automacro AddgameGuardMissingKey {
     exclusive 1
     exclusive 1
Строка 2187: Строка 2306:
     call {
     call {
         $wantedkey = $.ConfigKeyNotExistLastKey
         $wantedkey = $.ConfigKeyNotExistLastKey
         $wantedvalue = c \@autoloot
         $wantedvalue = [[c]] \@autoloot
         call AddMissingKey
         call AddMissingKey
     }
     }
Строка 2193: Строка 2312:
   
   
  macro AddMissingKey {
  macro AddMissingKey {
     log There is a missing key in config.txt
     log В файле config.txt нет одного важного параметра
     log The key is $wantedkey
     log Параметр называется $wantedkey
     log The wanted value for it is is $wantedvalue
     log Его значение должно быть $wantedvalue
     log Adding key $wantedkey with value $wantedvalue with perl sub 'add_key'
     log Добавим параметр $wantedkey равный $wantedvalue при помощи подпрограммы на perl - 'add_key'
     add_key("$wantedkey","$wantedvalue")
     add_key("$wantedkey","$wantedvalue")
  }
  }
Строка 2205: Строка 2324:
  }
  }


This macro will make sure you added the config keys for gameGuard and cmdOnLogin plugin.
Данный макрос добавит параметры конфига для плагинов gameGuard и cmdOnLogin.




;InProgressBar
;InProgressBar
:* Description: Checks if the player is waiting for a progress bar to end.
:* Описание: Проверяет, ожидает ли игрок окончания какого-либо процесса.


: Syntax:
: Синтаксис:
  InProgressBar <0 | 1>
  InProgressBar <0 | 1>


: When value is 0: Only true if not waiting for a progress bar
: Если 0, то сработает, если игрок не ждёт т.н. progress bar
: When value is 1: Only true if waiting for a progress bar
: Если 1, то сработает, если игрок в данный момент ожидает окончания некоего progress bar


: Example:
: Пример:
  InProgressBar 1
  InProgressBar 1


: Sets no variables
: Не создаёт переменных




;StatusActiveHandle
;StatusActiveHandle
:* Description: Checks if the player has one of the given status, uses status HANDLE.
:* Описание: Проверяет, наложен ли на игрока какой-нибудь статус из списка. Статусы задаются константами.


: Syntax:
: Синтаксис:
  StatusActiveHandle <comma separated list of status handles>
  StatusActiveHandle <список статусов в виде констант>


: Status handle can be a variable
: Может быть переменной


: Example:
: Пример:
  StatusActiveHandle EFST_INC_AGI, EFST_IMPOSITIO
  StatusActiveHandle EFST_INC_AGI, EFST_IMPOSITIO


: Set variables:
: Устанавливает значение переменной:
  $.StatusActiveHandleLastName => Saves the name of the last stauts that made StatusActiveHandle become true
  $.StatusActiveHandleLastName => запоминает название статуса
  $.StatusActiveHandleLastHandle => Saves the handle of the last stauts that made StatusActiveHandle become true
  $.StatusActiveHandleLastHandle => запоминает константу, которая описывает статус
  $.StatusActiveHandleLastListIndex => Saves the list index in condition of the last stauts that made StatusActiveHandle become true
  $.StatusActiveHandleLastListIndex => запоминает номер в списке статусов, который сработал в условии StatusActiveHandle




;StatusInactiveHandle
;StatusInactiveHandle
:* Description: Checks if the player doesn't have one of the given status, uses status HANDLE.
:* Описание: Проверяет, что у игрока нет ни одного из перечисленных статусов. Для описания статуса используется специальная константа.


: Syntax:
: Синтаксис:
  StatusInactiveHandle <comma separated list of status handles>
  StatusInactiveHandle <список статусов в виде констант>


: Status handle can be a variable
: Может быть переменной


: Example:
: Пример:
  StatusInactiveHandle EFST_BLESSING, EFST_CONCENTRATION
  StatusInactiveHandle EFST_BLESSING, EFST_CONCENTRATION


: Set variables:
: Устанавливает значение переменной:
  $.StatusInactiveHandleLastName => Saves the name of the last stauts that made StatusInactiveHandle become true
  $.StatusInactiveHandleLastName => запоминает название статуса
  $.StatusInactiveHandleLastHandle => Saves the handle of the last stauts that made StatusInactiveHandle become true
  $.StatusInactiveHandleLastHandle => запоминает константу
  $.StatusInactiveHandleLastListIndex => Saves the list index in condition of the last stauts that made StatusInactiveHandle become true
  $.StatusInactiveHandleLastListIndex => запоминает номер в списке статусов, который сработал в условии StatusInactiveHandle




;QuestActive
;QuestActive
:* Description: Checks if the player has one of the given quests active, uses quest ID (use command 'quest list' to see ID).
:* Описание: Проверяет, активен ли у персонажа один из перечисленных квестов. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.


: Syntax:
: Синтаксис:
  QuestActive <comma separated list of quests ID>
  QuestActive <список идентификаторов квестов>


: Quest ID can be a variable
: Идентификатор может быть представлен переменной


: Example:
: Пример:
  QuestActive 7121, 7122
  QuestActive 7121, 7122


: Set variables:
: Устанавливает значение переменной:
  $.QuestActiveLastID => Saves the ID of the last quest that made QuestActive become true
  $.QuestActiveLastID => запоминает идентификатор квеста
  $.QuestActiveLastListIndex => Saves the list index in condition of the last quest that made QuestActive become true
  $.QuestActiveLastListIndex => запоминает позицию из списка квестов




;QuestInactive
;QuestInactive
:* Description: Checks if the player has of the given quests inactive, uses quest ID (use command 'quest list' to see ID).
:* Описание: Проверяет неактивные квесты у персонажа. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.


: Syntax:
: Синтаксис:
  QuestInactive <comma separated list of quests ID>
  QuestInactive <список идентификаторов квестов>


: Quest ID can be a variable
: Идентификатор может быть представлен переменной


: Example:
: Пример:
  QuestInactive 7121, 7122
  QuestInactive 7121, 7122


: Set variables:
: Устанавливает значение переменной:
  $.QuestInactiveLastID => Saves the ID of the last quest that made QuestInactive become true
  $.QuestInactiveLastID => запоминает идентификатор квеста
  $.QuestInactiveLastListIndex => Saves the list index in condition of the last quest that made QuestInactive become true
  $.QuestInactiveLastListIndex => запоминает позицию из списка квестов




;QuestOnTime
;QuestOnTime
:* Description: Checks if the player has one of the given quests active, and this quest has a timer that hasn't ended yet, uses quest ID (use command 'quest list' to see ID).
:* Описание: Проверяет, есть ли у персонажа заданный квест, для которого ещё тикает таймер. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.


: Syntax:
: Синтаксис:
  QuestOnTime <comma separated list of quests ID>
  QuestOnTime <список идентификаторов квестов>


: Quest ID can be a variable
: Идентификатор может быть представлен переменной


: Example:
: Пример:
  QuestOnTime 7121, 7122
  QuestOnTime 7121, 7122


: Set variables:
: Устанавливает значение переменной:
  $.QuestOnTimeLastID => Saves the ID of the last quest that made QuestOnTime become true
  $.QuestOnTimeLastID => запоминает идентификатор квеста
  $.QuestOnTimeLastListIndex => Saves the list index in condition of the last quest that made QuestOnTime become true
  $.QuestOnTimeLastListIndex => запоминает позицию из списка квестов




;QuestTimeOverdue
;QuestTimeOverdue
:* Description: Checks if the player has one of the given quests active, and this quest has a timer that has already ended, uses quest ID (use command 'quest list' to see ID).
:* Описание: Проверяет, есть ли у персонажа заданный квест, для которого таймер уже истёк. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.


: Syntax:
: Синтаксис:
  QuestTimeOverdue <comma separated list of quests ID>
  QuestTimeOverdue <список идентификаторов квестов>


: Quest ID can be a variable
: Идентификатор может быть представлен переменной


: Example:
: Пример:
  QuestTimeOverdue 7121, 7122
  QuestTimeOverdue 7121, 7122


: Set variables:
: Устанавливает значение переменной:
  $.QuestTimeOverdueLastID => Saves the ID of the last quest that made QuestTimeOverdue become true
  $.QuestTimeOverdueLastID => запоминает идентификатор квеста
  $.QuestTimeOverdueLastListIndex => Saves the list index in condition of the last quest that made QuestTimeOverdue become true
  $.QuestTimeOverdueLastListIndex => запоминает позицию из списка квестов




;QuestHuntCompleted
;QuestHuntCompleted
:* Description: Checks if the player has one of the given quests active, and this quest has a hunt mission which wasn't completed yet, uses quest ID and Mob ID (use command 'quest list' to see ID).
:* Описание: Проверяет, есть ли среди перечисленных квестов на охоту за мобами какой-то завершенный. В списке используются идентификаторы квестов и идентификаторы мобов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.


: Syntax:
: Синтаксис:
  QuestHuntCompleted <comma separated list of pairs of quests ID and Mob ID>
  QuestHuntCompleted <пары значений - идентификатор квеста и идентификатор моба>


: Quest ID and/or Mob ID can be variables
: Идентификаторы квестов и мобов могут быть представлены переменными


: Example:
: Пример:
  QuestHuntCompleted 7122 1002, 7127 1004
  QuestHuntCompleted 7122 1002, 7127 1004


: Set variables:
: Устанавливает значение переменной:
  $.QuestHuntCompletedLastQuestID => Saves the Quest ID of the last quest that made QuestHuntCompleted become true
  $.QuestHuntCompletedLastQuestID => идентификатор квеста
  $.QuestHuntCompletedLastMobID => Saves the Mob ID of the last quest that made QuestHuntCompleted become true
  $.QuestHuntCompletedLastMobID => идентификатор моба
  $.QuestHuntCompletedLastListIndex => Saves the list index in condition of the last quest that made QuestHuntCompleted become true
  $.QuestHuntCompletedLastListIndex => запоминает позицию из списка, которая заставила сработать условие




;QuestHuntOngoing
;QuestHuntOngoing
:* Description: Checks if the player has one of the given quests active, and this quest has a hunt mission which has not been completed yet, uses quest ID and Mob ID (use command 'quest list' to see ID).
:* Описание: Проверяет незаконченные квесты на охоту за мобами. В списке используются идентификаторы квестов и идентификаторы мобов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.


: Syntax:
: Синтаксис:
  QuestHuntOngoing <comma separated list of pairs of quests ID and Mob ID>
  QuestHuntOngoing <пары значений - идентификатор квеста и идентификатор моба>


: Quest ID and/or Mob ID can be variables
: Идентификаторы квестов и мобов могут быть представлены переменными


: Example:
: Пример:
  QuestHuntOngoing 7122 1002, 7127 1004
  QuestHuntOngoing 7122 1002, 7127 1004


: Set variables:
: Устанавливает значение переменной:
  $.QuestHuntOngoingLastQuestID => Saves the Quest ID of the last quest that made QuestHuntOngoing become true
  $.QuestHuntOngoingLastQuestID => идентификатор квеста
  $.QuestHuntOngoingLastMobID => Saves the Mob ID of the last quest that made QuestHuntOngoing become true
  $.QuestHuntOngoingLastMobID => идентификатор моба
  $.QuestHuntOngoingLastListIndex => Saves the list index in condition of the last quest that made QuestHuntOngoing become true
  $.QuestHuntOngoingLastListIndex => запоминает позицию из списка, которая заставила сработать условие




;NoPlayerNear
;NoPlayerNear
:* Description: Checks if there are any players near, it's true when there's none.
:* Описание: Проверяет, что поблизости нет никаких других игроков.


: Syntax:
: Синтаксис:
  NoPlayerNear 1
  NoPlayerNear 1


: Example:
: Пример:
  NoPlayerNear 1
  NoPlayerNear 1


: Sets no variables.
: Не порождает переменных.




;NoPortalNear
;NoPortalNear
:* Description: Checks if there are any portals near, it's true when there's none.
:* Описание: Проверяет, что поблизости нет ни одного портала.


: Syntax:
: Синтаксис:
  NoPortalNear 1
  NoPortalNear 1


: Example:
: Пример:
  NoPortalNear 1
  NoPortalNear 1


: Sets no variables.
: Не использует переменные.




;NoMobNear
;NoMobNear
:* Description: Checks if there are any mobs near, it's true when there's none.
:* Описание: Удостовериться, что рядом нет ни одного моба.


: Syntax:
: Синтаксис:
  NoMobNear 1
  NoMobNear 1


: Example:
: Пример:
  NoMobNear 1
  NoMobNear 1


: Sets no variables.
: Нет переменных.




;NoNpcNear
;NoNpcNear
:* Description: Checks if there are any npcs near, it's true when there's none.
:* Описание: Проверка на отсутствие рядом неписей.


: Syntax:
: Синтаксис:
  NoNpcNear 1
  NoNpcNear 1


: Example:
: Пример:
  NoNpcNear 1
  NoNpcNear 1


: Sets no variables.
: Не использует переменные.




;PlayerNearCount
;PlayerNearCount
:* Description: Checks if the number of players near match the given math condition.
:* Описание: Сравнивает количество находящихся рядом игроков с заданным условием.


: Syntax:
: Синтаксис:
  PlayerNearCount <[[EventMacro#Math condition operators|Math condition operators]]>
  PlayerNearCount <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  PlayerNearCount > 5
  PlayerNearCount > 5


: Set variables:
: Устанавливает значение переменной:
  $.PlayerNearCountLast => Saves the number of players that made PlayerNearCount become true
  $.PlayerNearCountLast => запоминает количество игроков рядом с персонажем




;NpcNearCount
;NpcNearCount
:* Description: Checks if the number of npcs near match the given math condition.
:* Описание: Сравнивает количество находящихся рядом неписей с заданным условием.


: Syntax:
: Синтаксис:
  NpcNearCount <[[EventMacro#Math condition operators|Math condition operators]]>
  NpcNearCount <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  NpcNearCount > 5
  NpcNearCount > 5


: Set variables:
: Устанавливает значение переменной:
  $.NpcNearCountLast => Saves the number of npcs that made NpcNearCount become true
  $.NpcNearCountLast => запоминает количество находящихся рядом неписей




;MobNearCount
;MobNearCount
:* Description: Checks if the number of mobs near match the given math condition.
:* Описание: Сравнивает количество находящихся рядом неписей с заданным условием.


: Syntax:
: Синтаксис:
  MobNearCount <[[EventMacro#Math condition operators|Math condition operators]]>
  MobNearCount <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  MobNearCount > 10
  MobNearCount > 10


: Set variables:
: Устанавливает значение переменной:
  $.MobNearCountLast => Saves the number of mobs that made MobNearCount become true
  $.MobNearCountLast => запоминает количество мобов рядом с персонажем




;PortalNearCount
;PortalNearCount
:* Description: Checks if the number of portals near match the given math condition.
:* Описание: Сравнивает количество находящихся рядом порталов с заданным условием.


: Syntax:
: Синтаксис:
  PortalNearCount <[[EventMacro#Math condition operators|Math condition operators]]>
  PortalNearCount <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  PortalNearCount > 5
  PortalNearCount > 5


: Set variables:
: Устанавливает значение переменной:
  $.PortalNearCountLast => Saves the number of portals that made PortalNearCount become true
  $.PortalNearCountLast => запоминает количество порталов рядом с персонажем


==== Event ====
==== События ====
:* Event conditions don't have a defined status of true or false, they are only checked once an event happens.
:* События не имеют значения true или false, они просто случаются.
:* When this event happens, the condition is checked, if it is true, and all the state conditions are also true, the automacro activates.
:* Когда происходит некоторое событие, то соответствующее условие проверяется. Если информация в событии соответствует ожидаемой и все условия состояния выполняются (т.е. все их условия возвращают true), то автомакрос срабатывает.
:* You can only have one event condition in each automacro.
:* Каждый автомакрос может реагировать только на одно событие.




;PubMsg
;PubMsg
:* Description: Is checked on public messages, is true when the message matches the given regex.
:* Описание: условие проверяется при поступлении публичного сообщения, если сообщение подпадает под regex-шаблон, то условие возвращает true, т.е. автомакрос срабатывает.


: Syntax:
: Синтаксис:
  PubMsg <[[EventMacro#Regex|Regex]]>
  PubMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  PubMsg /(buff|bless)/
  PubMsg /(buff|bless)/


: Set variables:
: Устанавливает значение переменной:
  $.PubMsgLastName => Saves the name of the player which message activated PubMsg
  $.PubMsgLastName => запоминает имя игрока, отправившего публичное сообщение
  $.PubMsgLastMsg => Saves the message which activated PubMsg
  $.PubMsgLastMsg => запоминает сообщение




;PubMsgDist
;PubMsgDist
:* Description: Is checked on public messages, is true when the message matches the given regex and the distance match the given condition.
:* Описание: событие наступает при получении публичного сообщения, сообщение проверяется на соответствие regex-шаблону и расстояния до говорящего. Если проверка пройдена, то возвращается true и автомакрос срабатывает.


: Syntax:
: Синтаксис:
  PubMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PubMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  PubMsgDist /(buff|bless)/ < 5
  PubMsgDist /(buff|bless)/ < 5


: Set variables:
: Устанавливает значения переменных:
  $.PubMsgDistLastName => Saves the name of the player which message activated PubMsgDist
  $.PubMsgDistLastName => запоминает имя игрока, публичное сообщение от которого привело к срабатыванию события PubMsgDist
  $.PubMsgDistLastMsg => Saves the message which activated PubMsgDist
  $.PubMsgDistLastMsg => запоминает само публичное сообщение
  $.PubMsgDistLastPos => Saves the position of the player which message activated PubMsgDist
  $.PubMsgDistLastPos => запоминает координаты игрока
  $.PubMsgDistLastDist => Saves the distance to the player which message activated PubMsgDist
  $.PubMsgDistLastDist => запоминает расстояние до игрока
  $.PubMsgDistLastID => Saves the openkore ID of the player which message activated PubMsgDist
  $.PubMsgDistLastID => запоминает опенкоровский номер игрока




;PubMsgName
;PubMsgName
:* Description: Is checked on public messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex.
:* Описание: событие наступает при получении публичного сообщения, сообщение проверятся на соответствие regex-шаблону, а также проверяется имя игрока (тоже regexp). Если проверка пройдена, то возвращается true и автомакрос срабатывает.


: Syntax:
: Синтаксис:
  PubMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>
  PubMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  PubMsgName /(buff|bless)/ /Player to buff/
  PubMsgName /(buff|bless)/ /Player to buff/
  PubMsgName /stop/ /GM/
  PubMsgName /stop/ /GM/


: Set variables:
: Устанавливает значения переменных:
  $.PubMsgNameLastName => Saves the name of the player which message activated PubMsgName
  $.PubMsgNameLastName => Запоминает имя игрока, сообщение которого привело к срабатыванию события PubMsgName
  $.PubMsgNameLastMsg => Saves the message which activated PubMsgName
  $.PubMsgNameLastMsg => Запоминает само сообщение




;PubMsgNameDist
;PubMsgNameDist
:* Description: Is checked on public messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex and the distance matches the condition.
:* Описание: событие наступает при получении публичного сообщения, проверяется текст сообщения, имя игрока и дистанция до него. Если текст и имя игрока отвечают заданным regex-шаблонам и расстояние до игрока тоже удовлетворяет заданному условнию, то возвращается true и автомакрос срабатывает.


: Syntax:
: Синтаксис:
  PubMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PubMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  PubMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  PubMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  PubMsgNameDist /stop/ /GM/ >= 4
  PubMsgNameDist /stop/ /GM/ >= 4


: Set variables:
: Устанавливает значения переменных:
  $.PubMsgNameDistLastName => Saves the name of the player which message activated PubMsgNameDist
  $.PubMsgNameDistLastName => Запоминает игрока, сообщение которого привело к срабатыванию события PubMsgNameDist
  $.PubMsgNameDistLastMsg => Saves the message which activated PubMsgNameDist
  $.PubMsgNameDistLastMsg => Запоминает само сообщение
  $.PubMsgNameDistLastPos => Saves the position of the player which message activated PubMsgNameDist
  $.PubMsgNameDistLastPos => Запоминает координаты игрока
  $.PubMsgNameDistLastDist => Saves the distance to the player which message activated PubMsgNameDist
  $.PubMsgNameDistLastDist => Запоминает расстояние до игрока
  $.PubMsgNameDistLastID => Saves the openkore ID of the player which message activated PubMsgNameDist
  $.PubMsgNameDistLastID => Запоминает опенкоровский номер игрока




;PrivMsg
;PrivMsg
:* Description: Is checked on private messages, is true when the message matches the given regex.
:* Описание: событие наступает при получении личного сообщения, если сообщение подпадает под regex-шаблон, то условие возвращает true, т.е. автомакрос срабатывает.


: Syntax:
: Синтаксис:
  PrivMsg <[[EventMacro#Regex|Regex]]>
  PrivMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  PrivMsg /(buff|bless)/
  PrivMsg /(buff|bless)/


: Set variables:
: Устанавливает значения переменных:
  $.PrivMsgLastName => Saves the name of the player which message activated PrivMsg
  $.PrivMsgLastName => Запоминает имя игрока, сообщение которого привело к срабатыванию события PrivMsg
  $.PrivMsgLastMsg => Saves the message which activated PrivMsg
  $.PrivMsgLastMsg => Запоминает само сообщение




;PrivMsgDist
;PrivMsgDist
:* Description: Is checked on private messages, is true when the message matches the given regex and the distance match the given condition.
:* Описание: событие наступает при получении личного сообщения, оно проверяется regexp-шаблоном и на расстояние до игрока. Если условия выполняются, то автомакрос срабатывает.


: Syntax:
: Синтаксис:
  PrivMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PrivMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  PrivMsgDist /(buff|bless)/ < 5
  PrivMsgDist /(buff|bless)/ < 5


: Set variables:
: Устанавливает значения переменных:
  $.PrivMsgDistLastName => Saves the name of the player which message activated PrivMsgDist
  $.PrivMsgDistLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PrivMsgDist
  $.PrivMsgDistLastMsg => Saves the message which activated PrivMsgDist
  $.PrivMsgDistLastMsg => Запоминает само сообщение
  $.PrivMsgDistLastPos => Saves the position of the player which message activated PrivMsgDist
  $.PrivMsgDistLastPos => Запоминает координаты игрока
  $.PrivMsgDistLastDist => Saves the distance to the player which message activated PrivMsgDist
  $.PrivMsgDistLastDist => Запоминает расстояние до игрока
  $.PrivMsgDistLastID => Saves the openkore ID of the player which message activated PrivMsgDist
  $.PrivMsgDistLastID => Запоминает опенкоровский номер игрока




;PrivMsgName
;PrivMsgName
:* Description: Is checked on private messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex.
:* Описание: событие наступает при получении личного сообщения, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам.


: Syntax:
: Синтаксис:
  PrivMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>
  PrivMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  PrivMsgName /(buff|bless)/ /Player to buff/
  PrivMsgName /(buff|bless)/ /Player to buff/
  PrivMsgName /stop/ /GM/
  PrivMsgName /stop/ /GM/


: Set variables:
: Устанавливает значения переменных:
  $.PrivMsgNameLastName => Saves the name of the player which message activated PrivMsgName
  $.PrivMsgNameLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PrivMsgName
  $.PrivMsgNameLastMsg => Saves the message which activated PrivMsgName
  $.PrivMsgNameLastMsg => Запоминает само сообщение




;PrivMsgNameDist
;PrivMsgNameDist
:* Description: Is checked on private messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex and the distance matches the condition.
:* Описание: событие наступает при получении личного сообщения, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам, а также после проверки расстояния до игрока.


: Syntax:
: Синтаксис:
  PrivMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PrivMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  PrivMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  PrivMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  PrivMsgNameDist /stop/ /GM/ >= 4
  PrivMsgNameDist /stop/ /GM/ >= 4


: Set variables:
: Устанавливает значения переменных:
  $.PrivMsgNameDistLastName => Saves the name of the player which message activated PrivMsgNameDist
  $.PrivMsgNameDistLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PrivMsgNameDist
  $.PrivMsgNameDistLastMsg => Saves the message which activated PrivMsgNameDist
  $.PrivMsgNameDistLastMsg => Запоминает само сообщение
  $.PrivMsgNameDistLastPos => Saves the position of the player which message activated PrivMsgNameDist
  $.PrivMsgNameDistLastPos => Запоминает координаты игрока
  $.PrivMsgNameDistLastDist => Saves the distance to the player which message activated PrivMsgNameDist
  $.PrivMsgNameDistLastDist => Запоминает расстояние до игрока
  $.PrivMsgNameDistLastID => Saves the openkore ID of the player which message activated PrivMsgNameDist
  $.PrivMsgNameDistLastID => Запоминает опенкоровский номер игрока




;PartyMsg
;PartyMsg
:* Description: Is checked on party messages, is true when the message matches the given regex.
:* Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения на соответствие regexp-шаблону.


: Syntax:
: Синтаксис:
  PartyMsg <[[EventMacro#Regex|Regex]]>
  PartyMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  PartyMsg /(buff|bless)/
  PartyMsg /(buff|bless)/


: Set variables:
: Устанавливает значения переменных:
  $.PartyMsgLastName => Saves the name of the player which message activated PartyMsg
  $.PartyMsgLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PartyMsg
  $.PartyMsgLastMsg => Saves the message which activated PartyMsg
  $.PartyMsgLastMsg => Запоминает само сообщение




;PartyMsgDist
;PartyMsgDist
:* Description: Is checked on party messages, is true when the message matches the given regex and the distance match the given condition.
:* Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения на соответствие regexp-шаблону и расстояния до игрока.


: Syntax:
: Синтаксис:
  PartyMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PartyMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  PartyMsgDist /(buff|bless)/ < 5
  PartyMsgDist /(buff|bless)/ < 5


: Set variables:
: Устанавливает значения переменных:
  $.PartyMsgDistLastName => Saves the name of the player which message activated PartyMsgDist
  $.PartyMsgDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события PartyMsgDist
  $.PartyMsgDistLastMsg => Saves the message which activated PartyMsgDist
  $.PartyMsgDistLastMsg => Запоминает само сообщение
  $.PartyMsgDistLastPos => Saves the position of the player which message activated PartyMsgDist
  $.PartyMsgDistLastPos => Запоминает координаты игрока
  $.PartyMsgDistLastDist => Saves the distance to the player which message activated PartyMsgDist
  $.PartyMsgDistLastDist => Запоминает расстояние до игрока
  $.PartyMsgDistLastID => Saves the openkore ID of the player which message activated PartyMsgDist
  $.PartyMsgDistLastID => Запоминает опенкоровский номер игрока




;PartyMsgName
;PartyMsgName
:* Description: Is checked on party messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex.
:* Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам.


: Syntax:
: Синтаксис:
  PartyMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>
  PartyMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  PartyMsgName /(buff|bless)/ /Player to buff/
  PartyMsgName /(buff|bless)/ /Player to buff/
  PartyMsgName /stop/ /GM/
  PartyMsgName /stop/ /GM/


: Set variables:
: Устанавливает значения переменных:
  $.PartyMsgNameLastName => Saves the name of the player which message activated PartyMsgName
  $.PartyMsgNameLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PartyMsgName
  $.PartyMsgNameLastMsg => Saves the message which activated PartyMsgName
  $.PartyMsgNameLastMsg => Запоминает само сообщение




;PartyMsgNameDist
;PartyMsgNameDist
:* Description: Is checked on party messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex and the distance matches the condition.
:* Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам, а также после проверки расстояния до игрока.


: Syntax:
: Синтаксис:
  PartyMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  PartyMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  PartyMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  PartyMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  PartyMsgNameDist /stop/ /GM/ >= 4
  PartyMsgNameDist /stop/ /GM/ >= 4


: Set variables:
: Устанавливает значение переменной:
  $.PartyMsgNameDistLastName => Saves the name of the player which message activated PartyMsgNameDist
  $.PartyMsgNameDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события PartyMsgNameDist
  $.PartyMsgNameDistLastMsg => Saves the message which activated PartyMsgNameDist
  $.PartyMsgNameDistLastMsg => Запоминает само сообщение
  $.PartyMsgNameDistLastPos => Saves the position of the player which message activated PartyMsgNameDist
  $.PartyMsgNameDistLastPos => Запоминает координаты игрока
  $.PartyMsgNameDistLastDist => Saves the distance to the player which message activated PartyMsgNameDist
  $.PartyMsgNameDistLastDist => Запоминает расстояние до игрока
  $.PartyMsgNameDistLastID => Saves the openkore ID of the player which message activated PartyMsgNameDist
  $.PartyMsgNameDistLastID => Запоминает опенкоровский номер игрока




;GuildMsg
;GuildMsg
:* Description: Is checked on guild messages, is true when the message matches the given regex.
:* Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает, если сообщение совпадает с regexp-шаблоном.


: Syntax:
: Синтаксис:
  GuildMsg <[[EventMacro#Regex|Regex]]>
  GuildMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  GuildMsg /(buff|bless)/
  GuildMsg /(buff|bless)/


: Set variables:
: Устанавливает значения переменных:
  $.GuildMsgLastName => Saves the name of the player which message activated GuildMsg
  $.GuildMsgLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsg
  $.GuildMsgLastMsg => Saves the message which activated GuildMsg
  $.GuildMsgLastMsg => Запоминает само сообщение




;GuildMsgDist
;GuildMsgDist
:* Description: Is checked on guild messages, is true when the message matches the given regex and the distance match the given condition.
:* Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает после проверки сообщения на совпадение с regexp-шаблоном и проверки расстояния до игрока.


: Syntax:
: Синтаксис:
  GuildMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  GuildMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  GuildMsgDist /(buff|bless)/ < 5
  GuildMsgDist /(buff|bless)/ < 5


: Set variables:
: Устанавливает значение переменной:
  $.GuildMsgDistLastName => Saves the name of the player which message activated GuildMsgDist
  $.GuildMsgDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsgDist
  $.GuildMsgDistLastMsg => Saves the message which activated GuildMsgDist
  $.GuildMsgDistLastMsg => Запоминает само сообщение
  $.GuildMsgDistLastPos => Saves the position of the player which message activated GuildMsgDist
  $.GuildMsgDistLastPos => Запоминает координаты игрока
  $.GuildMsgDistLastDist => Saves the distance to the player which message activated GuildMsgDist
  $.GuildMsgDistLastDist => Запоминает расстояние до игрока
  $.GuildMsgDistLastID => Saves the openkore ID of the player which message activated GuildMsgDist
  $.GuildMsgDistLastID => Запоминает опенкоровский номер игрока




;GuildMsgName
;GuildMsgName
:* Description: Is checked on guild messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex.
:* Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам.


: Syntax:
: Синтаксис:
  GuildMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>
  GuildMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  GuildMsgName /(buff|bless)/ /Player to buff/
  GuildMsgName /(buff|bless)/ /Player to buff/
  GuildMsgName /stop/ /GM/
  GuildMsgName /stop/ /GM/


: Set variables:
: Устанавливает значения переменных:
  $.GuildMsgNameLastName => Saves the name of the player which message activated GuildMsgName
  $.GuildMsgNameLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsgName
  $.GuildMsgNameLastMsg => Saves the message which activated GuildMsgName
  $.GuildMsgNameLastMsg => Запоминает само сообщение




;GuildMsgNameDist
;GuildMsgNameDist
:* Description: Is checked on guild messages, is true when the message matches the given regex and the name of the player which sent it also matches it's given regex and the distance matches the condition.
:* Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам, а также расстояния до игрока.


: Syntax:
: Синтаксис:
  GuildMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  GuildMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: The first regex is for the message, the second one is for the player name
: Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.


: Example:
: Пример:
  GuildMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  GuildMsgNameDist /(buff|bless)/ /Player to buff/ < 3
  GuildMsgNameDist /stop/ /GM/ >= 4
  GuildMsgNameDist /stop/ /GM/ >= 4


: Set variables:
: Устанавливает значение переменной:
  $.GuildMsgNameDistLastName => Saves the name of the player which message activated GuildMsgNameDist
  $.GuildMsgNameDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsgNameDist
  $.GuildMsgNameDistLastMsg => Saves the message which activated GuildMsgNameDist
  $.GuildMsgNameDistLastMsg => Запоминает само сообщение
  $.GuildMsgNameDistLastPos => Saves the position of the player which message activated GuildMsgNameDist
  $.GuildMsgNameDistLastPos => Запоминает координаты игрока
  $.GuildMsgNameDistLastDist => Saves the distance to the player which message activated GuildMsgNameDist
  $.GuildMsgNameDistLastDist => Запоминает расстояние до игрока
  $.GuildMsgNameDistLastID => Saves the openkore ID of the player which message activated GuildMsgNameDist
  $.GuildMsgNameDistLastID => Запоминает опенкоровский номер игрока




;NpcMsg
;NpcMsg
:* Description: Is checked on npc conversation messages, is true when the message matches the given regex.
:* Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения на совпадение с regexp-шаблоном.


: Syntax:
: Синтаксис:
  NpcMsg <[[EventMacro#Regex|Regex]]>
  NpcMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  NpcMsg /your return point was saved/
  NpcMsg /your return point was saved/


: Set variables:
: Устанавливает значения переменных:
  $.NpcMsgLastName => Saves the name of the npc which message activated NpcMsg
  $.NpcMsgLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsg
  $.NpcMsgLastMsg => Saves the message which activated NpcMsg
  $.NpcMsgLastMsg => Запоминает само сообщение




;NpcMsgDist
;NpcMsgDist
:* Description: Is checked on npc conversation messages, is true when the message matches the given regex and the distance match the given condition.
:* Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения на совпадение с regexp-шаблоном и проверки расстояния до неписи.


: Syntax:
: Синтаксис:
  NpcMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  NpcMsgDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  NpcMsgDist /please come near to me/ > 5
  NpcMsgDist /please come near to me/ > 5


: Set variables:
: Устанавливает значения переменных:
  $.NpcMsgDistLastName => Saves the name of the npc which message activated NpcMsgDist
  $.NpcMsgDistLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsgDist
  $.NpcMsgDistLastMsg => Saves the message which activated NpcMsgDist
  $.NpcMsgDistLastMsg => Запоминает само сообщение
  $.NpcMsgDistLastPos => Saves the position of the npc which message activated NpcMsgDist
  $.NpcMsgDistLastPos => Запоминает координаты неписи
  $.NpcMsgDistLastDist => Saves the distance to the npc which message activated NpcMsgDist
  $.NpcMsgDistLastDist => Запоминает расстояние до неписи
  $.NpcMsgDistLastID => Saves the openkore ID of the npc which message activated NpcMsgDist
  $.NpcMsgDistLastID => Запоминает опенкоровский номер неписи




;NpcMsgName
;NpcMsgName
:* Description: Is checked on npc conversation messages, is true when the message matches the given regex and the name of the npc which sent it also matches it's given regex.
:* Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения и имени неписи на совпадение с regexp-шаблонами.


: Syntax:
: Синтаксис:
  NpcMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>
  NpcMsgName <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]>


: The first regex is for the message, the second one is for the npc name
: Первый regexp-шаблон - для сообщения, а второй - для имени неписи


: Example:
: Пример:
  NpcMsgName /You don't have zeny/ /kafra/
  NpcMsgName /You don't have zeny/ /kafra/


: Set variables:
: Устанавливает значения переменных:
  $.NpcMsgNameLastName => Saves the name of the npc which message activated NpcMsgName
  $.NpcMsgNameLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsgName
  $.NpcMsgNameLastMsg => Saves the message which activated NpcMsgName
  $.NpcMsgNameLastMsg => Запоминает само сообщение




;NpcMsgNameDist
;NpcMsgNameDist
:* Description: Is checked on npc conversation messages, is true when the message matches the given regex and the name of the npc which sent it also matches it's given regex and the distance matches the condition.
:* Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения и имени неписи на совпадение с regexp-шаблонами, а также после проверки расстояния до неписи.


: Syntax:
: Синтаксис:
  NpcMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>
  NpcMsgNameDist <[[EventMacro#Regex|Regex]]> <[[EventMacro#Regex|Regex]]> <[[EventMacro#Math condition operators|Math condition operators]]>


: The first regex is for the message, the second one is for the npc name
: Первый regexp-шаблон - для сообщения, а второй - для имени неписи


: Example:
: Пример:
  NpcMsgNameDist /You need to be closer to punch me/ /punchable npc/ > 5
  NpcMsgNameDist /You need to be closer to punch me/ /punchable npc/ > 5


: Set variables:
: Устанавливает значение переменной:
  $.NpcMsgNameDistLastName => Saves the name of the npc which message activated NpcMsgNameDist
  $.NpcMsgNameDistLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsgNameDist
  $.NpcMsgNameDistLastMsg => Saves the message which activated NpcMsgNameDist
  $.NpcMsgNameDistLastMsg => Запоминает само сообщение
  $.NpcMsgNameDistLastPos => Saves the position of the npc which message activated NpcMsgNameDist
  $.NpcMsgNameDistLastPos => Запоминает координаты неписи
  $.NpcMsgNameDistLastDist => Saves the distance to the npc which message activated NpcMsgNameDist
  $.NpcMsgNameDistLastDist => Запоминает расстояние до неписи
  $.NpcMsgNameDistLastID => Saves the openkore ID of the npc which message activated NpcMsgNameDist
  $.NpcMsgNameDistLastID => Запоминает опенкоровский номер неписи




;LocalMsg
;LocalMsg
:* Description: Is checked on local broadcast messages, is true when the message matches the given regex.
:* Описание: событие наступает при получении местного оповещения, например при перелётах на дирижабле. Автомакрос сработает, если сообщение подойдёт к regexp-шаблону.


: Syntax:
: Синтаксис:
  LocalMsg <[[EventMacro#Regex|Regex]]>
  LocalMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  LocalMsg /airship is arriving/
  LocalMsg /airship is arriving/


: Set variables:
: Устанавливает значение переменной:
  $.LocalMsgLastMsg => Saves the message which activated LocalMsg
  $.LocalMsgLastMsg => Запоминает сообщение, которое привело к срабатыванию события LocalMsg




;BusMsg
;BusMsg
:* Description: Is checked on bus system messages, is true when the message matches the given regex.
:* Описание: событие проверяет сообщения, поступающие по bus-шине. Автомакрос сработает, если сообщение совпадёт с regexp-шаблоном.


: Syntax:
: Синтаксис:
  BusMsg <[[EventMacro#Regex|Regex]]>
  BusMsg <[[EventMacro#Regex|Regex]]>


: Example:
: Пример:
  BusMsg /gm near/
  BusMsg /gm near/


: Set variables:
: Устанавливает значение переменной:
  $.BusMsgLastMsg => Saves the message which activated BusMsg
  $.BusMsgLastMsg => Запоминает сообщение, которое привело к срабатыванию события BusMsg




;MapLoaded
;MapLoaded
:* Description: Is checked everytime a map change event occur (teleport, map changes), is true if the current map match one of the given ones.
:* Описание: событие наступает каждый раз, когда сменяется локация персонажа, т.е. при телепортации и переходах на другую локацию. Автомакрос сработает, если персонаж попал на одну из локаций в указанном списке.


: Syntax:
: Синтаксис:
  MapLoaded <comma separated list of maps>
  MapLoaded <список локаций, локации разделяются запятыми>


: Map can be a variable.
: Вместо названия локации можно использовать переменную.


: Example:
: Пример:
  MapLoaded prontra, geffen, gef_fild10
  MapLoaded prontra, geffen, gef_fild10


: Set variables:
: Устанавливает значение переменной:
  $.MapLoadedLast => Saves the last map that made MapLoaded become true
  $.MapLoadedLast => Запоминает название локации, которая привела к срабатыванию события MapLoaded




;OnCharLogIn
;OnCharLogIn
:* Description: Is always true, activates everytime the character logs into the game.
:* Описание: событие наступает каждый раз, когда персонаж заходит в игру.


: Syntax:
: Синтаксис:
  OnCharLogIn 1
  OnCharLogIn 1


: Example:
: Пример:
  OnCharLogIn 1
  OnCharLogIn 1


: Sets no variables
: Нет никаких переменных.




;ZenyChanged
;ZenyChanged
:* Description: Is checked everytime the amount of zeny changes, is true if the math condition is true.
:* Описание: событие наступает всякий раз, когда у персонажа изменияется количество зени. Автомакрос сработает, если выполнится заданное условие.
:* Supports percentages. (based on total zeny before change and change amount)
:* Может работать с процентами, где 100% - это количество зени до изменения.


: Syntax:
: Синтаксис:
  ZennyChanged <[[EventMacro#Math condition operators|Math condition operators]]>
  ZennyChanged <[[EventMacro#Math condition operators|Math condition operators]]>


: Example:
: Пример:
  ZennyChanged > 10%
  ZennyChanged > 10%
  ZennyChanged >= 1000
  ZennyChanged >= 1000


: Set variables:
: Устанавливает значения переменных:
  $.ZennyChangedLastChange => Saves the amount of zenny changed that made ZennyChanged activate
  $.ZennyChangedLastChange => Запоминает количество зени, которое привело к срабатыванию события ZennyChanged
  $.ZennyChangedLastZennyAfter => Saves the amount of zenny left after the change that made ZennyChanged activate
  $.ZennyChangedLastZennyAfter => Запоминает количество зени после срабатывания события, т.е. сколько зени есть на текущий момент




;SimpleHookEvent
;SimpleHookEvent
:* Description: Is checked every time the hook you set, is triggered.
:* Описание: Событие наступает всякий раз, когда внутри openkore срабатывает заданный хук (т.е. опять же - событие).


: Syntax:
: Синтаксис:
  SimpleHookEvent <hook name>
  SimpleHookEvent <hook name>


: Example:
: Пример:
  SimpleHookEvent target_died
  SimpleHookEvent target_died


: Set all variables the hook have as:
: Все переменные события сохраняются в переменных вида:
  $.SimpleHookEventLast<capitalized variable name>
  $.SimpleHookEventLast<capitalized variable name>


: Example:
: Пример:
  $.SimpleHookEventLastMonster => monster ID in target_died hook
  $.SimpleHookEventLastMonster => идентификатор моба из хука target_died


=== Extras ===
=== Приложения ===


==== Math condition operators ====
==== Операторы сравнения ====


(<|<=|=|==|!=|!|>=|>|)\s*($number_qr%?|$general_wider_variable_qr)(?:\s*\.\.\s*($number_qr%?|$general_wider_variable_qr))
(<|<=|=|==|!=|!|>=|>|)\s*($number_qr%?|$general_wider_variable_qr)(?:\s*\.\.\s*($number_qr%?|$general_wider_variable_qr))


{|class="indextable" style="text-align:center;"
{|class="indextable" style="text-align:center;"
!Operator
!Оператор
!Description
!Описание
!Example
!Пример
|-
|-
|align=center| '''< <value>'''
|align=center| '''< <value>'''
|align=center| lower than <value>
|align=center| меньше чем <value>
|aling=center| '''< 50'''
|aling=center| '''< 50'''
|-
|-
|align=center| '''> <value>'''
|align=center| '''> <value>'''
|align=center| higher than <value>
|align=center| больше чем <value>
|aling=center| '''> 20'''
|aling=center| '''> 20'''
|-
|-
|align=center| '''<= <value>'''
|align=center| '''<= <value>'''
|align=center| lower or equal to <value>
|align=center| меньше либо равно <value>
|aling=center| '''<= 10'''
|aling=center| '''<= 10'''
|-
|-
|align=center| '''>= <value>'''
|align=center| '''>= <value>'''
|align=center| higher or equal to <value>
|align=center| больше либо равно <value>
|aling=center| '''>= 25'''
|aling=center| '''>= 25'''
|-
|-
|align=center| '''= <value> | == <value> | <value>'''
|align=center| '''= <value> | == <value> | <value>'''
|align=center| equal to <value>
|align=center| равно <value>
|aling=center| '''= 150 | == 150 | 150'''
|aling=center| '''= 150 | == 150 | 150'''
|-
|-
|align=center| '''!= <value> | ! <value>'''
|align=center| '''!= <value> | ! <value>'''
|align=center| not equal to <value>
|align=center| не равно <value>
|aling=center| '''! 1000 | != 1000'''
|aling=center| '''! 1000 | != 1000'''
|-
|-
|align=center| '''<value1>..<value2>'''
|align=center| '''<value1>..<value2>'''
|align=center| between <value1> and <value2>
|align=center| в диапазоне от <value1> до <value2>
|aling=center| '''20..80'''
|aling=center| '''20..80'''
|}
|}


:* Note: <value> can be a number or a variable.
:* Примечание: <value> может быть числом или переменной.
Examples:
Примеры:
  Math_condition >= 50 # Only true if higher or equal to 50
  Math_condition >= 50 # условие истинно, если величина больше либо равна 50
  Math_condition < $variable # Only true if lower than $variable value
  Math_condition < $variable # условие истинно, если величина меньше, чем переменная $variable
 
:* Note2: <value> can be a percentage (even if it is a variable).
Examples:
Math_condition <= 10% # Only true if lower or equal to 10%
Math_condition != $variable # $variable value can be something like '50%', in which case it would only be true if different than 50%


:* Примечание: <value> может быть процентной величиной (переменная тоже может хранить проценты).
Примеры:
Math_condition <= 10% # меньше либо равно 10%
Math_condition != $variable # в переменной $variable может быть '50%'


==== Regex ====
==== Regex ====


: To learn about regex plese refer to this link: [http://www.regular-expressions.info/quickstart.html regexp tutorial]
: Про регулярные выражения, т.е. regexp, можно почитать тут: [http://www.regular-expressions.info/quickstart.html regexp tutorial]
: Note: Regex in conditions support all types of variables
: Имейте в виду, что regex в условиях умеют работать со всеми типами переменных
 


== Perl Subroutines ==
== Подпрограммы Perl ==
eventMacro plugin support Perl subroutines in macros. You can now create any simple Perl function without limitations from the '''eval''' command.  
Плагин eventMacro устроен так, что можно написать самую настоящую подпрограмму на языке Perl, а затем вызвать её в макросе. Раньше вы были бы ограничены возможностями команды '''eval''', теперь таких ограничений нет.


Example No.1 - how to create a Perl Subroutine function in Macro
Первый пример покажет, как можно описать подпрограмму existsInList на языке Perl, которая я бы проверяла, есть ли в списке искомый элемент.
  macro sub {
  macro sub {
     $list = Orange, Milk, Soya, Peach
     $list = Orange, Milk, Soya, Peach
Строка 2968: Строка 3085:




Example No.2 - how to create a re-writable file function using Perl Subroutine in Macro
Во втором примере приводится подпрограмма rewrite. В её задачу входит чтение и перезапись файла mon_control.txt.
  automacro confHP1 {
  automacro confHP1 {
     CurrentHP > 85%
     CurrentHP > 85%
Строка 3002: Строка 3119:
     log Old Values are $setting $exist1 $exist2 $exist3
     log Old Values are $setting $exist1 $exist2 $exist3
     log Changing the values to $setting $attack $teleport $telesearch
     log Changing the values to $setting $attack $teleport $telesearch
     do eval Misc::mon_control("$::Macro::Data::varStack{setting}")->{attack_auto} = $attack; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_auto} = $teleport; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_search} = $telesearch
     do [[eval]] Misc::mon_control("$::Macro::Data::varStack{setting}")->{attack_auto} = $attack; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_auto} = $teleport; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_search} = $telesearch
     log Writting mon_control.txt with new values
     log Writting mon_control.txt with new values
     rewrite()  # see the sub-routine function below
     rewrite()  # see the sub-routine function below
     log Reloading mon_control.txt
     log Reloading mon_control.txt
     do reload mon_control
     do [[reload]] mon_control
     $exist1 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{attack_auto}:"None")
     $exist1 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{attack_auto}:"None")
     $exist2 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_auto}:"None")
     $exist2 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_auto}:"None")
Строка 3048: Строка 3165:
  }
  }


== Comments ==  
== Комментарии ==  
The macro files allow comments, i.e. lines that are ignored by the eventMacro plugin.
В макросах можно оставлять комментарии, т.е. это заметки для человека, плагин eventMacro не будет обращать на этот текст внимания.
:* Lines starting with a # will be treated as a comment.
:* Если в начале строки стоит #, то вся строка - комментарий.
:* Everything after a space and followed by a # will also be ignored.
:* Если в середине строки стоит пробел и #, то вся остальная строка тоже будет комментарием.
  macro happy {
  macro happy {
     #this is a comment line
     #данная строка целиком - комментарий
     log I'm Happy # this is also a comment
     log Всё хорошо # это тоже комментарий
  }
  }


Will print:
На консоль будет выведено:
  [eventmacro log] I'm Happy
  [eventmacro log] Всё хорошо
 
== Examples with Explanations ==


I assume you already know how to use [[Console Commands]] and understand how they work. If not, before going further, read through all [[Console Commands]] and try out ones like ''a'', ''ai'', ''move'', ''cart get'', ''storage add'', ''talk'', ''deal'', ''take'', direction commands, ''sl'', ''sm'', ''relog'', ''pm'' and others.
== Примеры с пояснениями ==


Keep another page with this manual open for cross reference.
Я предполагаю, что вы уже умеете пользоваться [[:Category:Console_Command|консольными командами]] и понимаете, как они работают. Если это не так, то пробегитесь по разделу [[:Category:Console_Command|консольные команды]] и попробуйте например ''[[a]]'', ''[[ai]]'', ''[[move]]'', ''[[cart]] get'', ''[[storage]] add'', ''[[talk]]'', ''[[deal]]'', ''[[take]]'', ''[[sl]]'', ''[[sm]]'', ''[[relog]]'', ''[[pm]]'' и т.д.


Держите под рукой документацию на консольные команды, чтобы обращаться к ней по ходу дела.


Итак, есть два вида блоков
Okay, so there are 2 types of blocks
Okay, so there are 2 types of blocks
#'''automacros''' – these trigger automatically
#'''автомакросы''' – срабатывают автоматически
#'''macros''' – these do not trigger automatically but need to be called manually or by an automacro
#'''макросы''' – не срабатывают автоматически, их надо вызывать руками из консоли или вызывать из автомакроса




'''Automacros'''
'''Автомакросы'''


Automacros automatically trigger when certain conditions are met, just like how blocks in config.txt trigger depending on the conditions set in them.
Автомакросы срабатывают автоматически, когда выполняется ряд условий. Прямо как блоки в config.txt срабатывают в зависимости от описанных в них условий.


The point of automacros is that you use them to check for conditions. When the condition is fulfilled, you can either respond to it in the automacro or call a macro to do it. The format for automacro is...
Смысл автомакросов заключается в том, что они проверяют условия. Если условия выполняются, то будут выполнены некие команды. Команды можно писать прямо в автомакросе или вынести в отдельный макрос и вызвать их по имени макроса. Автомакросы выглядят так:


  automacro <name> {
  automacro <НазваниеАвтомакроса> {
         condition 1
         Первое условие
         condition 2
         Второе условие
         …...
         и т.д.
         …...
         …...
         call {
         call {
                 command 1
                 Команда 1
                 command 2
                 Команда 2
                 ..
                 и т.д.
                 …..
                 …..
         }
         }
         timeout <n seconds> #(if necessary)
         timeout <n секунды> #(по желанию)
  }
  }


 
Предположим, что вы играете лично, но за вами бегает прист под управлением openkore. Вы бы хотели, чтобы бот предупреждал вас в чате, когда у него остаётся мало маны. Для этого можно написать следующий автомакрос.
For example, suppose you're playing manually but your slave priest is on Kore, and you want it to warn you if it's running out of sp, you can use an automacro like this....


  automacro sp {
  automacro sp {
Строка 3099: Строка 3215:
     timeout 10
     timeout 10
     call {
     call {
       do c sp low
       do [[c]] мало маны
     }
     }
  }
  }




Taking it line by line,
Давайте разберём автомакрос строка за строкой:


#'''''automacro sp {''''' - you need to put automacro to tell kore that its an automacro. Then you put the name of the macro, in this case its “sp”. Then you need to put an opening bracket “{“ which tells Kore that the automacro's code begins there.
#'''''automacro sp {''''' - сначала надо объявить автомакрос, написав ключевое слово automacro, потом дать автомакросу название, в данном случае “sp”. Затем идёт открывающая фигурная скобка “{“, с которой начинается тело автомакроса.
#'''''CurrentSP < 200''''' – After the “{“, you put the conditions on successive lines. Here, there is only one condition and I think its clear that the condition is that sp should be below 200.
#'''''CurrentSP < 200''''' – в теле необходимо записать условия срабатывания автомакроса, по одному на каждой строке. В данном примере у нас есть только одно условие; данное выражение истинно, когда количество маны у персонажа опустится ниже двухсот единиц.
#'''''timeout 10''''' – This isn't a condition or a command, it works the same way it works in normal Kore blocks, so this automacro cannot trigger within 10 seconds of it already having been triggered. I ALWAYS put timeouts, so even if my conditions are faulty, the automacro doesn't spam and mess up whatever my bot is doing. Otherwise if your automacro is messed up then you could die or something, so its better to put an appropriate timeout.
#'''''timeout 10''''' – данное выражение - это не условие и не команда, а параметр. Он работает также, как и в обычных блоках в конфиге, то есть не даёт срабатывать автомакросу в течение следующих десяти секунд с последнего раза. Я всегда использую timeout, чтобы автомакросы не запускались раз за разом, если я напутал в условиях.
#'''''call {''''' – The word “call” tells Kore that now you're going to be putting commands, not conditions. The opening bracket “{“ tells Kore that the commands will start now. These commands are the ones that will get carried out when the conditions are met, here when sp goes below 200.
#'''''call {''''' – ключевое слово “call” определяет, что произойдёт, когда сработает автомакрос. После открывающей фигурной скобки “{“ нужно будет написать команды.
#'''''do c sp low''''' – “do” tells Kore that this is a command, something to be done. After “do”, just leave a space and type in the console command you want to execute exactly the way you do in the Kore console.
#'''''do [[c]] мало маны''''' – тут идёт собственно макрокоманда “do”, которая в данном случае вызывает консольную команду “c”, чтобы написать в чат, что у бота осталось мало маны.
#'''''}''''' – This closing bracket “}” tells Kore that the commands have ended.
#'''''}''''' – эта фигурная скобка закрывает блок с командами.
#'''''}''''' – This closing bracket “}” tells Kore that your automacro code has ended.
#'''''}''''' – вторая фигурная скобка закрывает тело автомакроса.


So basically whenever, the bot's sp goes below 200, it says in public chat “sp low”. This also has the advantage of making your bot not look like a bot =p.
Короче говоря, если у бота будет меньше 200 единиц маны, он напишет в чат “мало маны”. Таким образом бот станет чуть больше походить на человека =p.




Here's another macro which illustrates how you can use macros to handle weird situations which Kore is not equipped to deal with. When fighting against metalings, they often strip you and then your oh-so-smart bot punches! To get around this, put the weapon you use in default auto equip and use this macro.
Вот другой пример, который показывает, как бот может бороться с внезапной пропажей оружия. Например металлинги очень любят выбивать оружие из рук и тогда ваш глупый бот будет драться кулаками. Чтобы обойти данную проблему, следует прописать в конфиге стандартное оружие и применить следующий автомакрос.


  automacro strip {
  automacro strip {
Строка 3123: Строка 3239:
     timeout 10
     timeout 10
     call {
     call {
       do tele
       do [[tele]]
       do relog 10
       do [[relog]] 10
     }
     }
  }
  }




Taking it line by line....
Разберём данный пример.


#'''''automacro strip {''''' - Tell Kore this is an automacro, and it's name is "strip". The '{' tells Kore the code of the automacro starts here.
#'''''automacro strip {''''' - объявляем автомакрос "strip", после '{' начнётся описание автомакроса.
#'''''StatusActiveHandle EFST_NOEQUIPWEAPON''''' - The only condition in this macro. This checks your list of statuses for the status handle "EFST_NOEQUIPWEAPON". Thus, when you are stripped by a Metaling, you get the "EFST_NOEQUIPWEAPON" status and this condition will be fulfilled.
#'''''StatusActiveHandle EFST_NOEQUIPWEAPON''''' - единственное условие автомакроса, которое пробегается по списку статусов персонажа в поиске "EFST_NOEQUIPWEAPON". Данный статус накладывается, когда металлинг выбивает оружие у бота из рук.
#'''''timeout 10''''' - Ensures automacro is not spammed, and 10 seconds is enough time to execute the automacro. So after 10 seconds, if for some reason you are still stripped, this automacro will trigger again. However, if you re-login and are stripped within 10 seconds, then macro will not trigger again untill the 10 seconds are up.
#'''''timeout 10''''' - обезопасим себя от слишком частого срабатывания автомакроса. Десяти секунд будет достаточно, чтобы описанный далее макрос успел полностью отработать.
#'''''call {''''' - The word "call" and "{" tells Kore that the commands to be executed start after the '{'
#'''''call {''''' - после ключевого слова "call" и фигурной скобки "{" пойдут команды.
#'''''do tele''''' - "do" tells Kore that what comes after is a console command to be carried out. Here, the command is "tele" so you teleport away from the Metaling, so that in case you lag or something, you aren't killed while executing the next instruction which is.....
#'''''do [[tele]]''''' - макрокоманда "do" запускает консольную команду "tele", чтобы сбежать от металлинга телепортом, чтобы не помереть от него безоружным.
#'''''do relog 10''''' - Tells Kore to relogin in 10 seconds, because when you login again, your "strip weapon" status is cleared.
#'''''do [[relog]] 10''''' - данная команда говорит боту перезайти в игру, потому что после захода в игру статус "strip weapon" пропадёт.
#'''''}''''' - The closing bracket '}' tells Kore the commands have ended.
#'''''}''''' - первая фигурная скобка '}' закрывает блок с командами.
#'''''}''''' - The closing bracket '}' tells Kore the macro code has ended.
#'''''}''''' - вторая фигурная скобка '}' закрывает описание автомакроса.


Summarising, on being stripped, you teleport away from the monster and then relogin, with a timeout of 10 seconds to ensure that the automacro is not spammed. Since the weapon you're using is filled in the default weapon option, after re-logging in, Kore will automatically re-equip that weapon.
В итоге, если с бота сняли оружие, он телепортируется от моба и перезаходит в игру. Второй раз автомакрос сработает не раньше, чем через 10 секунд. Так как в конфиге прописано оружие по умолчанию, то после входа в игру бот автоматически возьмёт в руки оружие.




Let's try a more complicated macro. If you have a priest, you would want it to warp back to its lockmap or the nearest warp-able map near its lockmap. This macro does it. From the savemap, the bot takes the same route to the lockmap each time. So in the first map outside the town, just set it to move to a designated tile, and cast warp on a nearby tile, and then move to that tile. You will need delays to allow the spell to be cast and commands to be completed.
Перейдём к более сложному макросу. Если у вас есть прист, то вы бы наверное хотели, чтобы он открывал портал прямо на локацию кача или ближайшую к ней локацию, доступную через варп. Данный макрос как раз этим и занимается. Предположим, что прист сохранился в Геффене и всегда выходит из города влево, чтобы добраться до нужной локации. Тогда на первой же локации за городом надо отвести его в сторонку, вызвать варп и зайти в него. Между командами расставим паузы, чтобы команды успели отработать.


  automacro warp {
  automacro warp {
Строка 3150: Строка 3266:
     timeout 20
     timeout 20
     call {
     call {
         do ai manual
         do [[ai]] manual
         pause 1
         pause 1
         do move 319 187
         do [[move]] 319 187
         do sl 27 316 188
         do [[sl]] 27 316 188
         pause 2
         pause 2
         do warp 1
         do [[warp]] 1
         pause 1
         pause 1
         do move 316 188
         do [[move]] 316 188
         do ai on
         do [[ai]] on
     }
     }
  }
  }




Taking it line by line,
Итак, давайте посмотрим:


#'''''automacro warp {''''' - As explained, the automacro's name is warp, and “{“ indicates that the automacro begins.
#'''''automacro warp {''''' - объявляем автомакрос "warp", после фигурной скобки “{“ начинается описание собственно автомакроса.
#'''''InMap get_fild07''''' - The first condition, the automacro will only trigger if the map is gef_fild07.
#'''''InMap get_fild07''''' - первое условие, автомакрос сработает только на локе слева от Геффена, т.е. на gef_fild07.
#'''''InInventory “Blue Gemstone” > 0''''' - Second condition, ensures there is atleast one blue gemstone in the inventory so that warp portal can be cast. Obviously you need a getAuto in config.txt for the gemstones.
#'''''InInventory “Blue Gemstone” > 0''''' - второе условие проверяет, что в инвентаре есть необходимый для вызова варп-портала расходник. Было бы неплохо прописать в конфиге getAuto для синих камней.
#'''''timeout 20''''' - Ensures that the bot does not spam the automacro. The timeout should be large enough to allow the completion of the automacro, so that the automacro does not trigger again while it is in execution.
#'''''timeout 20''''' - на всякий случай, чтобы автомакрос не срабатывал каждую секунду. Двадцати секунд должно быть достаточно для выполнения команд макроса, чтобы автомакрос не сработал повторно, перебивая таким образом последовательность команд макроса.
#'''''call {''''' - Tells Kore that the commands start here.
#'''''call {''''' - команды макроса начнутся со следующей строки.
#'''''do ai manual''''' - Frequently, I use this command in the more complicated and longer macros, so that Kore doesn't get diverted into doing something else while your macro is running, for example, attacking a monster or gathering up an item. In this case I'm using it so that the bot doesn't continue walking.
#'''''do [[ai]] manual''''' - данной командой openkore переводится в ручной режим, я часто так делаю в длинных и сложных макросах, чтобы openkore своим автоматическим поведением не помешала выполнению команд. В данном случае команда нужна, чтобы бот не шел дальше.
#'''''pause 1''''' - Inserts a delay of 1 second before the next command is carried out, VERY IMPORTANT. If you don't use delays then Kore can and will miss steps in the macro and the result is a mess.
#'''''pause 1''''' - очень важно расставлять паузы, чтобы команды точно успели отработать и не помешали друг другу.
#'''''do move 319 187''''' - The “move” console command is used to move your bot to a set location.
#'''''do [[move]] 319 187''''' - консольная команда "move" отправит бота по указанным координатам.
#'''''do sl 27 316 188''''' - The “sl” console command is used to make your priest cast warp portal on a convenient spot near your location, in this case (316,188).
#'''''do [[sl]] 27 316 188''''' - консольной командой "sl" будет вызван варп-портал недалеко от бота, в данном случае по координатам (316,188).
#'''''pause 2''''' - Very Important. A delay of 2 seconds is put, allowing enough time to cast warp portal. If you priest has low dex, this delay should be increased.
#'''''pause 2''''' - очень важно дать пару секунд времени на вызов портала, если у приста мало dex, то паузу стоит увеличить.
#'''''do warp 1''''' - Console command “warp” is used to select memo location 1.
#'''''do [[warp]] 1''''' - консольной командой "warp" выбираем из списка пункт назначения под номером один.
#'''''pause 1''''' - 1 second delay to allow the portal to form.
#'''''pause 1''''' - одна секунда задержки на создание портала.
#'''''do move 316 188''''' - Move to the portal and Voila! You have been warped to the map.
#'''''do [[move]] 316 188''''' - заходим в портал, персонаж варпнулся на нужную локацию.
#'''''do ai on''''' - You set ai to manual at the beginning of this macro, so now you need to turn it back on.
#'''''do [[ai]] on''''' - в конце макроса включаем автоматический режим openkore обратно.
#'''''}''''' - Closing bracket indicates end of commands.
#'''''}''''' - первая фигурная скобка закрывает блок команд.
#'''''}''''' - Closing bracket indicates end of automacro code.
#'''''}''''' - вторая фигурная скобка закрывает автомакрос.


''Note the use of appropriate delays and timeouts in this automacro.''
''Обратите внимание, что паузы в сумме укладываются в отведённое в timeout время для автомакроса.''




The EventMacro plugin also has many useful built-in variables which give you your position for example. It's all listed in the eventMacro manual. I just want to show how to extract your position from these variables.
Мы закончили рассматривать большие примеры автомакросов. Давайте напоследок глянем несколько небольших примеров, которые занимают всего пару строк.


'''$.pos''' gives you your position. Now to get your ''x'' and ''y'' coordinates the code is,
Плагин eventMacro предоставляет много встроенных переменных. Например в переменной $.pos лежат координаты персонажа. Давайте посмотрим, как можно извлечь из нее отдельно координаты ''x'' и ''y''.
 
Итак, в переменной '''$.pos''' лежат координаты персонажа. А вот так можно достать из неё ''x'' и ''y'':


   $px = &arg ("$.pos", 1)
   $px = &arg ("$.pos", 1)
   $py = &arg ("$.pos", 2)
   $py = &arg ("$.pos", 2)


Here, the ''x'' coordinate is the 1st value in '''$.pos''' so we have a ''''1''''. Similarly, the ''y'' coordinate is the second value in '''$.pos''' so we have a ''''2''''.
Где координата ''x'' стоит на первом месте в '''$.pos''', поэтому пишем ''''1''''. Соответственно координата ''y'' стоит на втором месте в '''$.pos''', поэтому для неё нужна цифра ''''2''''.


If you have a “'''MobNear'''” condition in your automacro, '''$.MobNearLastPos''' gives the position of that monster. To extract the ''x'' and ''y'' coordinates the code is,
Второй похожий пример. Если в автомакросе есть условие “'''MobNear'''”, то в макросе будет переменная '''$.MobNearLastPos''' с координатами моба. Чтобы достать оттуда отдельно координаты ''x'' и ''y'' повторим уже описанный выше приём:


   $mx = &arg ("$.MobNearLastPos", 1)
   $mx = &arg ("$.MobNearLastPos", 1)
Строка 3201: Строка 3319:
"'''run-once'''"
"'''run-once'''"


Frequently, the run-once condition is used instead of a timeout. It allows the automacro to run only once so that the automacro isn't spammed. To get the automacro to run again, a release command needs to be executed. However, due to a rogue situation that the macro hangs and the release macro isn't executed, your automacro is effectively stuck. To get around this, use a timeout instead of using run-once.
Часто вместо параметра timeout используют run-once 1, который даёт автомакросу сработать только один раз, после чего автомакрос блокируется. Если же требуется автомакрос разблокировать, то для этого есть соответствующая команда. Однако по необъяснимой причине бывает так, что макрос зависает и команда на разблокирование автомакроса не срабатывает. В итоге автомакрос как был заблокирован, так и остался. Чтобы избежать данной неприятности используйте лучше timeout.


== Как написать макрос ==
Пусть у вас появилось желание написать макрос, попробуйте данный алгоритм:


== How to write a macro ==
* Уточните условия срабатывания автомакроса. Запишите их в теле автомакроса.
Now that you have some idea of what a macro is, try writing one
* Шаг за шагом продумайте, какие действия должен совершить бот, чтобы достигнуть результата. Запишите команды в call { ... }.
* Расставьте между командами макроса необходимые паузы.
* Используйте в автомакросе timeout или run-once, чтобы предотвратить немедленное повторное срабатывание автомакроса.
* Код автомакроса сохраниете в файле eventMacros.txt, запустите бота или если он уже запущен, перечитайте файл. Если в коде закралась синтаксическая ошибка, например вы забыли написать "}", то вы получите сообщение об ошибке и макрос не сработает. Найдите и исправьте ошибку, перечитайте файл eventMacros.txt. При наступлении условий автомакрос сработает и выполнит код.


* Figure out under exactly what conditions you want your automacro to trigger
== Собрание макросов ==
*Logically think out the steps your bot needs to perform in the automacro. Go step by step over this carefully.
*Ensure you have inserted appropriate pauses between the steps.
*Ensure you have a timeout or a run-once in your macro to prevent spamming of it.
*Now put the code in eventMacros.txt and start the bot or reload eventMacros.txt. If all is fine you won't get any error messages. But if there is a problem in the syntax, say you missed out a “}”, then you will get an error message and the macro won't work. Figure out what the error is, correct it, and reload eventMacros.txt again to check if you corrected it properly or not.


== Collected Macros ==
Я бы хотел поделиться парочкой полезных макросов, надеюсь никто не против.


I would like to share some useful macros, hopefully not angering anyone here.
'''Определение предметов при помощи увеличительного стекла'''


'''Identify with Magnifier'''
Пусть у вас в инвентаре лежит неопределённая экипировка и вы хотите её распознать, используя для этого увеличительные стекла. Введите в консоли команду "eventMacro id", чтобы распознать один предмет. Вводите команду столько раз, сколько потребуется, чтобы распознать все. Вам не нужно указывать, какой предмет распознавать. Макрос возьмёт первый попавшийся.
 
You got unidentified Items in your inventory and want to identify them using magnifiers? Use "eventMacro id" on console until all items are identified. You don't have to type anything else, the macro will identify the first item found, after that the second and so on.


  macro id {
  macro id {
     $id = &inventory(Magnifier)
     $id = &inventory(Magnifier)
     do is $id
     do [[is]] $id
     pause 1
     pause 1
     do identify 0
     do [[identify]] 0
  }
  }


'''Automatically refine Rough Stones (Ori / Elu)'''
'''Обогащение руды (Ori / Elu)'''


This macro, once called, will automatically walk to the prontera forge and refine Rough Ori / Elu as long as there are more than 5 in your inventory. I did not find something like that yet, please post everything (better) I may have missed.
Макрос ref отправит бота в кузнецу Пронтеры и будет до упора обменивать пять единиц руды на один металл Ori / Elu. Возможно у вас есть идеи, как улучшить макрос?


Just fire ''eventMacro ref'' to start. To stop manually, type ''eventMacro stop''.
Чтобы запустить макрос введите ''eventMacro ref''. Чтобы прервать выполнение макроса введите ''eventMacro stop''.


  macro ref {
  macro ref {
     do move prt_in 59 60
     do [[move]] prt_in 59 60
     call ref-while
     call ref-while
  }
  }
Строка 3242: Строка 3359:
     log start refining with
     log start refining with
     $ori = &invamount(Rough Oridecon)
     $ori = &invamount(Rough Oridecon)
     $elu = &invamount(Rough Elunium)
     $elu = &invamount(Rough Elunium)
     log I have $ori Rough Oridecons
     log I have $ori Rough Oridecons
     log I have $elu Rough Eluniums
     log I have $elu Rough Eluniums
     while (&invamount(Rough Oridecon) > 4) {
     while (&invamount(Rough Oridecon) > 4) {
         do talk 0
         do [[talk]] 0 # примечание переводчика: а мы точно попадём на нужную непись?
         pause 0.8
         pause 0.8
         do talk resp 0
         do [[talk]] resp 0
         call ref-while
         call ref-while # примечание переводчика: а это точно нужно? Зачем рекурсия из цикла?
     }
     }
     while (&inventory(Rough Elunium) > 4) {
     while (&inventory(Rough Elunium) > 4) {
         do talk 0
         do [[talk]] 0
         pause 0.8
         pause 0.8
         do talk resp 1
         do [[talk]] resp 1
         call ref-while
         call ref-while
     }
     }
     stop
     stop # примечание переводчика: а это точно нужно? Зачем останавливать макрос, ведь это и так последняя строка?
  }
  }


== FAQ ==
== FAQ ==
; I get disconnected from map server when running a macro!
; Меня отключило от сервера локации, когда я запустил макрос. В чем дело?
: The commands are sent too fast. Increase macro_delay or add pause lines between your do commands
: Команды макроса отправлялись слишком быстро. Увеличьте macro_delay или расставьте паузы между командами




; I'm getting Malformed UTF-8 character (''fatal''), what is this?
; У меня проблемы в кодировкой UTF-8. В чем дело?
: This error happens when your eventMacros.txt is not saved in UTF-8 encoding.
: Данная ошибка всплывает, когда файл eventMacros.txt сохранён в отличной от UTF-8 кодировке.
: To solve it, open your eventMacros.txt and if you're using Notepad, when you are going to save, change Encoding to '''UTF-8'''. '''(If that does not help - do not use Notepad.)'''
: Откройте файл eventMacros.txt программой Notepad и при сохранении надо выбрать кодировку '''UTF-8'''. '''(Если не помогло - не используйте Notepad.)'''
: If you're using Notepad++ or other text editor, go to '''Format > UTF-8 (without BOM)''' and save.
: Откройте файл eventMacros.txt программой Notepad++, в главном меню надо выбрать '''Format > UTF-8 (without BOM)''' и сохранить файл.


== Author ==
== Авторы-программисты ==
: EventMacro was written by '''Henrybk'''.
: '''Henrybk''' написал плагин eventMacro.
: EventMacro was based on macro plugin which was first written by '''arachno''' has various contributors like ezza, daigaku, keplerbr, eternalhavest and technologyguild.
: Предком плагина eventMacro был macro-плагин, его написал '''arachno''', затем руку приложили ezza, daigaku, keplerbr, eternalhavest и technologyguild.
: EventMacro was beta tested by '''emjustin'''.  
: '''emjustin''' протестировал eventMacro.  
: Some of the most important ideas and functions were developed by '''allanon'''.
: '''allanon''' придумал и запрограммировал некоторые весьма важные функции плагина eventMacro.


[[Category:Plugins]]
[[Category:Plugins]]

Текущая версия от 11:09, 7 августа 2023

Описание

  • Этот плагин представляет собой переделанный и обновлённый macro плагин, написанный таким образом, чтобы потреблять меньше процессорной мощности. Имеет более расширенный функционал по сравнению со своим предшественником.
  • С помощью этого плагина, Вы сможете составлять блоки с условиями, называемые автомакросами (automacro) и блоки исполняемых инструкций, называемые макросами (macro).
  • Автомакросы срабатывают при достижении условий, описанных в блоке (например, появление определённого слова в чате, или достижение определённого уровня, и т.д.). По результату срабатывания выполняется один или несколько макросов.
  • Макросы могут быть простыми (например, «сказать что-то в чате» или «сохранить предметы в кафре»), или сложными (например, «выполнить полный квест»). Макросы вызываются несколькими способами: автомакросами, вручную консольной командой eventMacro <название_макроса>, либо инструкцией call <название_макроса>.

* Старые макросы не совместимы с эвент-макросами! Их следует переписать, используя новый синтаксис эвент-макросов.

Установка

  • eventMacro по умолчанию включён в стандартную версию OpenKore.
  • Чтобы начать использовать плагин, просто создайте в папке control файл eventMacros.txt и наполните файл эвент-макросами.

Консольные команды

Синтаксис

eventMacro [MACRO|auto|list|status|check|stop|pause|unpause|var_get|var_set|enable|disable|include] [extra]
eventMacro <MACRO>
  • Запустить макрос с названием <MACRO>. При запуске можно использовать предустановленные опции, либо произвольные параметры.
Опция Значение Описание
-repeat | -r n (целое_число) Повторяет выполнение макроса n раз
-overrideAI игнорирует ИИ (см. описание ниже)
-macro_delay секунды задержка между выполняемыми командами в макросе
-exclusive Запрещает прерывать выполнение макроса другими автомакросами
-orphan terminate
reregister
reregister_safe
terminate_last_call
Что делать с макросами которые были удалены из очереди ИИ (AI queue)

Макросы можно запускать с произвольными параметрами. Они указываются с помощью двойной черты +пробел -- , либо просто через пробел. Эти параметры сохраняются в массиве @.param. Пример:

macro showParam {
 log Parameter 1 is $.param[0]
 log Parameter 2 is $.param[1]
}

Если запустить макрос с помощью консольной команды eventMacro showParam -- foo bar (либо eventMacro showParam foo bar), то он выведет в консоль:

[eventmacro log] Parameter 1 is foo
[eventmacro log] Parameter 2 is bar
eventMacro auto <AUTOMACRO>
Получить информацию об автомакросе с названием <AUTOMACRO> и его условиях
eventMacro list
Получить список доступных макросов и автомакросов
eventMacro status [macro|automacro]
Получить текущее состояние макросов или автомакросов
eventMacro check (force_stop|force_start|resume)
Указать состояние проверки автомакросов:
  • eventMacro check force_stop - принудительно остановить проверку условий автомакросов
  • eventMacro check force_start - принудительно остановить проверку условий автомакросов
  • eventMacro check resume - вернуть проверку условий автомакросов в нормальное состояние
eventMacro stop
Отменить выполнение текущего макроса
eventMacro pause
Поставить на паузу текущий макрос
eventMacro unpause
Возобновить выполнение текущего макроса
eventMacro var_get [<var_name>]
Показать значение переменной <var_name>, либо если параметр не указан, всех переменных. С помощью этой команды можно посмотреть значения следующих переменных: скаляра ($var_name), массива (@var_name) или хэша (%var_name)
eventMacro var_set <var_name> <value>
Присвоить значение <value> переменной <var_name>
eventMacro enable [automacro]
Включить один, либо если параметр не указан, все автомакросы
eventMacro disable [automacro]
Выключить один, либо если параметр не указан, все автомакросы
eventMacro include (on | off | list) [filename or pattern]
Включить или отключить дополнительный файл, подключенный с помощью !include, в файле eventMacros.txt

Примечание. Консольную команду "eventMacro" писать очень долго и не удобно. В конфиге OpenKore можно назначить синоним на эту команду, например: " alias_em eventMacro".

Файлы настроек

control/eventMacros.txt
Поместите свои эвент-макросы и автомакросы в этот файл. Вы можете изменить имя файла в настройке конфига eventMacro_file.
control/timeouts.txt
Добавтьте параметр eventMacro_delay и укажите количество секунд которые плагин должен подождать между выполнением команд.
control/config.txt
Параметр Значение По умолчанию Описание
eventMacro_orphans terminate
reregister
reregister_safe
terminate_last_call
terminate Что делать с макросами которые были удалены из очереди ИИ (AI queue)
eventMacro_file имя файла eventMacros.txt файл с эвент-макросами и автомакросами
eventMacro_CheckOnAI список 'auto', 'manual' и\или 'off' auto При каких значениях ИИ должны проверяться автомакросы

Синтаксис эвент-макросов

macro MacroName {
   do this..
   and that..
   yattayatta..
}
  • Вы можете использовать любое имя для макроса (кроме символа "пробел"). Следите, чтобы макросы не назывались одинаково, иначе ни один из этих макросов не будет загружен.
  • Команды в макросе выполняются по порядку сверху вниз.
  • В теле макроса можно использовать ТОЛЬКО специальные макро-команды. Чтобы вызвать в теле макроса консольную команду, следует использовать макро-команду do.

Макро-команды

do <команда>
выполняет <команду>, как будто она была набрана в консоли OpenKore. См. список консольных команд.
macro foo {
   do move 123 234 prontera
   do sit
   do c привет!
}

Команда ai clear по умолчанию выключена в плагине, т.е. её не удастся выполнить через макрос.
Если выполнится команда do ai off, то макрос остановит своё выполнение. Также после команды do ai manual может остановиться проверка условий автомакросов (см. параметр eventMacro_CheckOnAI)

log <текст>
warning <текст>
error <текст>
выводит <текст> в консоль. В тексте можно использовать переменные эвент-макроса ($var_name), специальные переменные ($.***) а также специальные ключевые слова (&config, &rand и т.д.). Эту макро-команду удобно использовать для отладки своих эвент-макросов.
macro foo {
  log Эта строка записывает текст в консоль.
  warning Бот достиг $.lvl уровня
}
pause <секунды>
останавливает эвент-макрос на указанное количество секунд.
macro foo {
   log сейчас 10:00:00
   pause 10
   log теперь 10:00:10 
   log после первого сообщения прошло 10 секунд.
}

макро-команда pause останавливает не только выполнение эвент-макроса, но и все действия OpenKore.

call <MACRO> [<параметры>]
выполняет другой макрос с произвольным именем <MACRO>, также можно указать произвольные <параметры>. После выполнения эвент-макроса <MACRO> продолжится выполняться текущий макрос.
В имени <MACRO> можно использовать переменные (например: call $killmacro)
macro foo {
   $killmacro = bar
   log сейчас будет выполняться макрос bar
   call $killmacro
}
lock (<AUTOMACRO> | all)
выключает автомакрос с произвольным именем <AUTOMACRO> (т.е. прекращается проверка его условий срабатывания). Выключенный автомарос никогда не выполнится. Команда lock all выключает все автомакросы. Включить автомакрос обратно можно с помощью команды code>release.
release (<AUTOMACRO> | all)
включает обратно заблокированный автомакрос с произвольным именем <AUTOMACRO> или включает все автомакросы при использовании release all (Автомакрос может быть заблокирован условием run-once 1 или командой lock). Включённый автомакрос может повторно запуститься если выполнятся все условия его срабатывания.
stop
немедленно прерывает выполнение текущего макроса.
include (on | off | list) [<имя_файла или шаблон_имени>]
включает или выключает строчки !include в файле eventMacros.txt.
set <опция> <значение>
устанавливает значения следующим опциям:

Переменные

  • В эвент-макросе есть возможность работать с переменными. Объявлять переменные не нужно. Все переменные макросов - глобальные, т.е. переменная из одного макроса может быть использована в другом макросе.
  • Система переменных в eventMacro основывается на типах данных языка Perl. Переменные могут быть скалярами, массивами и хешами.
  • В названии переменной можно использовать только буквы и цифры.
  • Если Вы хотите использовать какую-либо переменную без подстановки её значения, то следует экранировать её с помощью "\" (например, \$var).

Типы переменных

Скаляр
  • Скалярная переменная содержит только одну величину, например, число и\или текст.
  • Скалярные переменные начинаются со знака $.
Массив
  • Переменная массив содержит список величин (элементов).
  • У каждого элемента в массиве есть свой индекс, который указывает на позицию в списке.
  • Первый элемент массива имеет индекс 0, а последний - длина массива минус один.
  • Массивы начинаются со знака @.
Хэш
  • Переменная хэш содержит пары величин.
  • Каждая пара состоит из ключа и значения.
  • Каждый ключ имеет только одно значение, но несколько ключей могут иметь одинаковые значения.
  • Хэши начинаются со знака %.

Объявление и использование

Скаляр
  • Присвоить переменной значение: $variable = значение
  • Получить значение переменной (НО это касается только макросов, для автомакросов есть другой синтаксис, как и для параметров конфига и т.п.): $variable
macro Hello {
   $var = Hello
   $var1 = World!
   log $var $var1
}
Данный макрос выведет на консоль:
[eventmacro message] Hello World!
  • Увеличить на 1 значение переменной: $variable++ или уменьшить $variable--
macro Counter {
    $counter = 0
    log Значение счётчика: $counter
    $counter++
    log Новое значение: $counter
    $counter--
    log Прежнее значение: $counter
}
В консоли увидим:
[eventmacro message] Значение счётчика: 0
[eventmacro message] Новое значение: 1
[eventmacro message] Прежнее значение: 0
  • Переменную можно удалить, присвоив ей специальное значение undef или unset:
macro undef {
    $counter = 0
    $x = 1
    log \$x = $x
    $x = undef  # также можно использовать 'unset'
    log \$x теперь уничтожена: $x
}
В консоли увидим:
[eventmacro message] $x = 1
[eventmacro message] $x теперь уничтожена:
  • Операция присвоения не вычисляет значение справа от знака равно, а тупо подставляет вместо переменных их величины. Для расчетов нужно вызывать функцию &eval().
macro math {
    $num = 2
    $num2 = 3
    $result = $num+$num2
    $result2 = &eval($num+$num2)
    log обычная подстановка значений переменных \$result = $result
    log сумма $num и $num2 равна $result2
}
В консоли увидим:
[eventmacro message] обычная подстановка значений переменных $result = 2+3
[eventmacro message] сумма 2 и 3 равна 5


У скаляров есть следующая функция:

&defined($<переменная>})
Функции &defined требуется указать <переменную>, существование которой следует проверить. Если <переменная> существует, то функция вернёт 1, в противном случае - 0.
Примечание: если значение переменной =0, то считается, что она существует, т.е. функция &defined вернёт "1".
macro defined {
  $var = 0;
  @array = (a, b)
  %hash = (a => 1, b => 2)
  log переменная \$var существует: &defined($var)
  log элемент 1 в массиве \@array - существует: &defined($array[1])
  log ключа "с" в хэше \%hash - не существует: &defined($hash{c})
}
В консоли увидим:
[eventmacro message] переменная $var существует: 1
[eventmacro message] элемент 1 в массиве @array - существует: 1
[eventmacro message] ключа "с" в хэше %hash - не существует: 0

Массив
  • Присвоить массиву несколько значений можно указав их в скобках через запятую: @variable = (member0, member1, member2)
  • Получить доступ к конкретному элементу массива можно по его индексу. Для этого нужно вместо знака @ подставить $ и в квадратных скобках [...] указать индекс элемента: $variable[0]
  • Узнать длину массива: @variable
macro Hello {
   @var = (drops, poring)
   log Кол-во элементов в массиве \@var = @var, первый элемент: $var[0], второй элемент: $var[1]
}
В консоли увидим:
[eventmacro message] Кол-во элементов в массиве @var = 2, первый элемент: drops, второй элемент: poring
  • Отдельные элементы массива - это скалярные переменные.
Элементам массива можно присвоить значение:
$myarray[0] = Гарри
$myarray[1] = Поттер
Увеличить\уменьшить элемент массива на единицу:
macro Counter {
    $counterArray[1] = 0
    log Значение элемента \$counterArray[1]: $counterArray[1]
    $counterArray[1]++
    log Новое значение: $counterArray[1]
    $counterArray[1]--
    log Прежнее значение: $counterArray[1]
}
В консоли увидим:
[eventmacro message] Значение элемента $counterArray[1]: 0
[eventmacro message] Новое значение: 1
[eventmacro message] Прежнее значение: 0
Удаление элемента массива:
macro undef {
    $var[5] = 1
    log значение элемента \$var[5]: $var[5]
    $var[5] = undef  # также можно использовать 'unset'
    log значение элемента \$var[5] теперь уничтожено: $var[5]
}
В консоли увидим:
[eventmacro message] значение элемента $var[5]: 1
[eventmacro message] значение элемента $var[5] теперь уничтожено:
Функции для работы с массивами
Существует четыре функции, которые предназначены для работы с массивами:
  1. &push: добавляет элемент в конец массива, увеличивая таким образом длину массива на единицу.
  2. &pop: убирает элемент из конца массива, уменьшая таким образом длину массива на единицу.
  3. &shift: убирает первый элемент массива, сдвигая таким образом все остальные элементы массива влево, ближе к началу и уменьшает на единицу длину массива.
  4. &unshift: добавляет новый элемент в начало массива и сдвигает все остальные элементы вправо, ближе к концу массива, увеличивает длину массива на 1.
&push(@array, newmember)
Функции &push требуется два аргумента: массив и его новый элемент.
Пример создания массива с помощью функции &push:
macro push {
    &push(@monsters, Поринг)
    &push(@monsters, Волк)
    &push(@monsters, Мая)
    log Массив \@monsters состоит из @monsters элементов: $monsters[0], $monsters[1] и $monsters[2]
}
В консоли увидим:
[eventmacro message] Массив @monsters состоит из 3 элементов: Поринг, Волк и Мая
&pop(@array)
Функции &pop нужен только один аргумент - массив, из которого надо вытолкнуть последний элемент.
Пример массива в котором сначала было три элемента, потом из него вытолкнули два последних элемента и остался только один:
macro pop {
    @jobs = (нуб, вор, охотник)
    log Массив \@jobs состоит из @jobs элементов: $jobs[0], $jobs[1] и $jobs[2]
    &pop(@jobs)
    log Теперь массив \@jobs состоит из @jobs элементов: $jobs[0], $jobs[1]
    &pop(@jobs)
    log Теперь массив \@jobs состоит из @jobs элемента: $jobs[0]
}
В консоли увидим:
[eventmacro message] Массив @jobs состоит из 3 элементов: нуб, вор и охотник
[eventmacro message] Теперь массив @jobs состоит из 2 элементов: нуб, вор
[eventmacro message] Теперь массив @jobs состоит из 1 элемента: нуб
&shift(@array)
Функции &shift нужен только один аргумент - массив, из которого надо вытолкнуть первый элемент.
Пример массива в котором сначала было три элемента, потом из него вытолкнули два первых элемента и остался только один:
macro shift {
    @jobs = (нуб, вор, охотник)
    log Массив \@jobs состоит из @jobs элементов: $jobs[0], $jobs[1] и $jobs[2]
    &shift(@jobs)
    log Теперь массив \@jobs состоит из @jobs элементов: $jobs[0] и $jobs[1]
    &shift(@jobs)
    log Теперь массив \@jobs состоит из @jobs элемента: $jobs[0]
}
В консоли увидим:
[eventmacro message] Массив @jobs состоит из 3 элементов: нуб, вор и охотник
[eventmacro message] Теперь массив @jobs состоит из 2 элементов: вор и охотник
[eventmacro message] Теперь массив @jobs состоит из 1 элемента: охотник
Обратите внимание, что функция &shift сдвигает весь массив влево, т.е. после первого сдвига элемент 'охотник' переместится с индекса 2 на 1, а после второго сдвига получит индекс 0.
&unshift(@array, newmember)
Функция &unshift требует два аргумента - массив и его новый элемент, который после сдвига массива вправо попадёт на освободившееся место в начале.
Пример создания массива с помощью функции &unshift:
macro unshift {
    &unshift(@monsters, Поринг)
    &unshift(@monsters, Волк)
    &unshift(@monsters, Мая)
    log Массив \@monsters состоит из @monsters элементов: $monsters[0], $monsters[1] и $monsters[2]
}
В консоли увидим:
[eventmacro message] Массив \@monsters состоит из @monsters элементов: Мая, Волк, Поринг
Обратите внимание, что функция &unshift сдвигает весь массив вправо, т.е. последний добавленный элемент 'Мая', оказывается на первом месте.

Хэш
  • Чтобы инициализировать переменную типа хэш, нужно в круглых скобках прописать через запятую список пар: "ключ => значение": %variable = (key1 => value1, key2 => value2)
  • Чтобы обратиться к элементу хэша, нужно использовать знак $ вместо % и в фигурных скобках { } написать ключ: $variable{key1}
  • Ключ может состоять из букв и цифр.
  • Получить количество элементов (т.е. пар) в хеше: %variable
macro Hello {
   %ages = (Kaya => 25, Namrok => 32)
   log Возраст Каи: $ages{Kaya} лет, а Намрока: $ages{Namrok} года
}
В консоли увидим:
[eventmacro message] Возраст Каи: 25 лет, а Намрока: 32 года
  • значения ключей хеша - это обычные скаляры.
Значениям хеша можно присвоить данные:
$name{first} = Гарри
$name{last} = Поттер
Числовые значения хеша можно увеличить\уменьшить на единицу:
macro Counter {
    $hash{monterskilled} = 0
    log Значение \$hash{monterskilled}: $hash{monterskilled}
    $hash{monterskilled}++
    log Новое значение: $hash{monterskilled}
    $hash{monterskilled}--
    log Прежнее значение: $hash{monterskilled}
}
Значение ключа хеша можно уничтожить, присвоив ему специальное слово undef или unset:
macro undef {
    $myhash{value} = 1
    log Значение \$myhash{value}: $myhash{value}
    $myhash{value} = undef  # также можно использовать 'unset'
    log \$myhash{value} теперь уничтожена: $myhash{value}
}
В консоли увидим:
[eventmacro message] Значение $myhash{value}: 1
[eventmacro message] $myhash{value} теперь уничтожена:
Функции для работы с хэшами
Существует две функции, которые предназначены для работы с хэшами:
  1. &delete: удаляет пару ключ\значение
  2. &exists: проверяет существует ли значение у заданного ключа
&delete($<хэш>{<ключ>})
Функции &delete требуется указать ключ хэша, который следует удалить, например: &delete ( $hash{key} )
&exists($<хэш>{<ключ>})
Функции &exists требуется указать ключ хэша, который следует проверить. Если у заданного <ключа>есть значение, то функция вернёт 1, в противном случае - 0. Например: &exists ( $hash{key} )
Пример
macro hash {
   %fruitsprice = (apple => 1000, banana => 700)
   log Хэш \%fruitsprice состоит из  %fruitsprice элементов
   log Цена на яблоки: $fruitsprice{apple}, а на бананы: $fruitsprice{banana}
   &delete($fruitsprice{apple})
   log Хэш \%fruitsprice состоит из %fruitsprice элемента
     if ( &exists($fruitsprice{apple}) ) {
       log Цена на яблоки: $fruitsprice{banana}
     } else {
       log В хэше нет яблок
     }
     if ( &exists($fruitsprice{banana}) ) {
       log Цена на бананы: $fruitsprice{banana}
     } else {
       log В хэше нет бананов
     }
}
В консоли увидим:
[eventmacro message] Хэш %fruitsprice состоит из 2 элементов
[eventmacro message] Цена на яблоки: 1000, а на бананы: 700
[eventmacro message] Хэш %fruitsprice состоит из 1 элемента
[eventmacro message] В хэше нет яблок
[eventmacro message] Цена на бананы: 700

Особые переменные

В эвент-макросе есть особые переменные, названия которых начинаются с точки. Они автоматически создаются плагином eventMacro.

Переменная Описание Пример
$.time текущее время в виде unix timestamp 1482275422
$.datetime текущая дата и время Tue Dec 20 21:22:34 2016
$.second текущее значение секунд (0 - 59) 53
$.minute текущее значение минут (0 - 59) 34
$.hour текущее значение часов в 24-х часовом формате 14
$.dayofmonth день месяца 19
$.dayofweek день недели (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) Wednesday
$.map местонахождение персонажа, локация prontera
$.incity булев_флаг, 1 если персонаж в городе, иначе 0 1
$.inlockmap булев_флаг, 1 если персонаж на lockMap, иначе 0 1
$.job профессия персонажа Swordman
$.pos координаты персонажа 123 234
$.name имя персонажа ya4ept
$.hp значение HP (жизнь) 2304
$.sp значение SP (мана) 345
$.lvl значение базового уровня 175
$.joblvl значение профессионального уровня 60
$.spirits количество сферок у монка или монеток у ганса 3
$.zeny количество денег (зени) 8478341
$.weight вес инвентаря персонажа 1948
$.weightpercent загруженность персонажа в процентах 81.5
$.maxweight максимальная грузоподъемность персонажа 2400
$.status список висящих на персонаже статусов (см. файл statusnametable.txt) Attention Concentrate,Endure,Two-Hand Quicken
$.statushandle список висящих на персонаже статусов, в виде констант SM_ENDURE,KN_TWOHANDQUICKEN
$.inventoryitems количество предметов в инвентаре 13
$.cartweight вес предметов в телеге 800
$.cartweightpercent загруженность телеги в процентах 10
$.cartmaxweight максимальная грузоподъемность телеги 8000
$.cartitems количество предметов в телеге 21
$.cartmaxitems максимально возможное количество предметов в телеге 100
$.shopopen булев_флаг, 1 если магазин открыт, иначе 0 0
$.storageopen булев_флаг, 1 если открыт склад, иначе 0 1
$.storageitems количество предметов на складе 432
$.storagemaxitems максимально возможное количество предметов на складе 600
$.param[N] аргументы командной строки (см. Синтаксис) -
$.caller название последнего сработавшего автомакроса -

Функции эвент-макроса

Функции макро-языка имеют вид &<название> (<аргументы>). Функциями можно пользоваться почти везде внутри блока macro (кроме goto, end, названиях меток (label), названиях макроса в конструкциях call и set). Все функции кроме &nick() могут принимать переменные в качестве аргументов.

&questStatus (<questID>)
Вернёт статус квеста по его <questID>, возможные значения: "inactive", "incomplete" или "complete".
&questInactiveCount (<questID1>,<questID2>,<questID3>,etc)
Вернёт количество взятых, но не активных (т.е. "inactive"), квестов.
&questIncompleteCount (<questID1>,<questID2>,<questID3>,etc)
Вернёт количество взятых, но незавершенных (т.е. "incomplete"), квестов.
&questCompleteCount (<questID1>,<questID2>,<questID3>,etc)
Вернет количество завершенных квестов, т.е. со статусом "complete".


&inventory (<имя_предмета> | <ID_предмета>)
Вернёт индекс предмета в инвентаре. В качестве аргумента принимает имя предмета или его ИД. Если такого предмета нет, то возвращает -1.
&Inventory (<имя_предмета> | <ID_предмета>)
Как и &inventory вернёт индекс предмета в инвентаре, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то возвращает -1.
&invamount (<имя_предмета> | <ID_предмета>)
Вернёт количество указанного предмета в инвентаре. Если такого предмета нет, то возвращает 0.
&InventoryType (usable|equip|card|etc)
Вернёт список индексов предметов заданного типа (через запятую), находящихся в инвентаре. Если таких предметов нет, то вернёт -1.


&cart (<имя_предмета> | <ID_предмета>)
Вернёт индекс указанного предмета в телеге. Если такого предмета нет, то возвращает -1.
&Cart (<имя_предмета> | <ID_предмета>)
Как и &cart вернёт индекс предмета в телеге, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то возвращает -1.
&cartamount (<имя_предмета> | <ID_предмета>)
Вернёт количество предмета в телеге. Если такого предмета нет, то возвращает 0.


&storage (<имя_предмета> | <ID_предмета>)
Вернёт индекс указанного предмета на складе. Если такого предмета на складе нет, то возвращает -1.
&Storage (<имя_предмета> | <ID_предмета>)
Как и &storage вернёт индекс предмета на складе, но если таких предметов несколько - вернёт список их индексов через запятую. Если такого предмета нет, то возвращает -1.
&storamount (<имя_предмета> | <ID_предмета>)
Вернёт количество предмета на складе. Если такого предмета нет, то возвращает 0.


&vender (<name>)
Вернёт индекс продавца (игрока) с именем <name>. Если такого продавца нет в пределах видимости, то возвращает -1.
&venderitem (<имя_предмета | <ID_предмета>)
Вернёт индекс предмета в магазине у торгаша (игрока). Если такого предмета в магазине нет, то возвращает -1.
&venderprice (<имя_предмета> | <indexID>)
Вернёт цену предмета в магазине у торгаша (игрока). В качестве аргумента принимает имя предмета или его индекс (который можно получить через функцию выше &venderitem).
&venderamount (<индекс_предмета>)
Вернёт количество предметов у торгаша (игрока). Если такого предмета в магазине нет, то возвращает -1.


&store (<имя_предмета> | <ID_предмета>)
Ищёт заданный предмет в открытом магазине (НЦП) и возвращает его индекс. Если такого предмета нет, то возвращает -1.
&shopamount (<имя_предмета> | <ID_предмета>)
Вернёт количество предметов, продающихся в магазине (НПЦ).


&npc (<x> <y> | "<NPC_name>" | /regexp/i)
Вернёт индекс неписи, стоящей на заданных координатах <x> <y> или с именем <NPC_name> или если имя НПЦ соответствует шаблону regexp. Если непись найти не удалось, то возвращает -1.
&player (<name>)
Вернёт индекс игрока с именем <name>. Если такого игрока нет в пределах видимости, то возвращает -1.
&monster (<имя_моба> | <ID>)
Вернёт индекс моба. В качестве аргумента принимает имя моба или его ИД. Если такого моба нет в пределах видимости, то возвращает -1.


&config (<параметр>)
Вернёт значение <параметра> из config.txt
&random ("<параметр 1>", "<параметр 2>", $var, ...)
Вернёт один из перечисленных в скобках параметров. Параметры необходимо указывать в кавычках. В качестве параметров можно указывать переменные.
&rand (<n>, <m>)
Вернёт случайное число в диапазоне от <n> до <m> включительно.
&eval (<параметр>)
Вычисляет значение <параметра>. Например, если "$v = 8", то результатом функции &eval ($v + 2) будет число 10. Параметр функции &eval - это выражение на языке Perl, и оно не имеет ничего общего с синтаксисом эвент-макроса. В <параметре> можно использовать переменные эвент-макроса вида $var и результаты других &<функций>, например: warning &eval(&rand(0,5) + 1)
&arg ("<строка>", <n>)
Вернёт <n>-ое слово из <строки>. Слова в строке разделяются знаками: ,.:;\"\'!?\r\n. Если <n> больше количества слов в строке, то возвращается пустая строка. Аргумент <n> может быть как целым числом, так и целочисленной переменной. Например:
$n = 3
log &arg("aa ! bb : cc . dd",$n)
&nick (<строка>)
Экранирует все метасимволы regexp и некоторые специальные символы perl с помощью \ (обратного слэша). Придуман специально для экранирования некоторых имён персонажей. Например, ник "}|{oJIA" будет преобразован в "\}|\{oJIA"
&split (<разделитель>, <переменная>)
Создаёт массив из <переменной> на основе <разделителя>. Вывод этой функции обязательно должен присваиваться массиву. Например:
macro split {
  $list = a~b~c
  log переменная: $list
  @array = &split('~', $list)
  log размер массива: @array, array[1]=$array[1]
}
&keys (<%хэш>)
Создаёт массив из ключей <хэша>. Вывод этой функции обязательно должен присваиваться массиву. Например:
macro split {
  %hash = (a => "foo", b => "bar")
  log размер хэша: %hash
  @array = &keys (%hash)
  log размер массива: @array, array[1]=$array[1]
}
&values (<%хэш>)
Создаёт массив из ключей <хэша>. Вывод этой функции обязательно должен присваиваться массиву.
&listlength (<список_разделённый_запятой>)
Вернёт количество элементов в списке разделённом запятой, например:
macro listlength {
   log количество элементов: &listlength(a, b, c)
}
&strip (<текст>)
Удаляет из <текста> круглые скобки ( ), например:
macro strip {
   $text = (привет))))) мир)
   log текст без скобок: "&strip($text)"
}

Цепочка команд

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

0 macro foo {
1  do whatever
2  log yet another line
3  [
4     do something
5     do something else
6     log foo
7  ]
8  log done
9 }

Строка 3 начинает цепочку команд и сама по себе не вносит никакой задержки. Строки 4, 5 и 6 выполняются сразу же, как только предыдущая команда завершится. В цепочке команд нет задержек и выполнение команд не может быть прервано. Строка 7 завершает цепочку команд и строка 8 будет выполнятся через положенную задерку в $macro_delay секунд.


Подстроки

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

macro foo {
    $i = 1; pause 5; log \$i = $i; $ii = 2; $iii = 3; $i++; $ii--; lock automacroName; release automacroName; set overrideAI 1
}

Разделенные точкой с запятой ";" команды будут выполняться с обычной задержной macro_delay.


Операторы сравнения

Плагин eventMacro предлагает следующие операторы сравнения:

Оператор Описание
< меньше
<= меньше, либо равно
== или = равенство, см. (link)
> больше
>= больше, либо равно
!= неравенство
~ <леваячасть> есть элемент <праваячасть>, где <праваячасть> список, разделенный символом запятой ","
=~ <леваячасть> подпадает под регулярное выражение - regexp из <праваячасть>. Подробнее: Forums
arg .. arg2 диапазон значений между arg и arg2, где arg число, процент или переменная.

Управление потоком и метки

  • Как и в большинстве языков программирования, в плагине eventMacro реализованы привычные конструции типа "if .. else", "while", "foreach", "for .. next", "do .. while" и некоторые другие.
  • Кроме того есть операции "if", "else", "elsif", "switch", "case", "goto" и "while". При помощи label можно ставить метки в коде.

Синтаксис условных операторов

If

Right now, macro if conditions are very close to the perl if statements. It accepts unlimited number of statements in just one if condition line, regexp matching is allowed (unfortunately, no backreference using parenthesis) and the use of && for and meaning and || for or meaning.

Можно использовать простое выражение, которое проверяет одно условие:

if (arg1 <Operators> arg2) (goto <label> | call <macro> [<parameters>] | stop | { )

Проверка двух условий, объединённых оператором или, хотя бы одно условие должно быть истинным:

if (arg1 <Operators> arg2 || arg3 <Operators> arg4) (goto <label> | call <macro> <parameters> | stop | { )

Проверка двух условий, объединённых оператором и, оба условия должны быть истинными:

if (arg1 <Operators> arg2 && arg3 <Operators> arg4) (goto <label> | call <macro> <parameters> | stop | { )

Примеры использования обоих операторов:

if ((arg1 <Operators> arg2 || arg3 <Operators> arg4) && arg5 <Operators> arg6) (goto <label> | call <macro> <parameters> | stop | { )
if ((arg1 <Operators> arg2 && arg3 <Operators> arg4) || arg5 <Operators> arg6) (goto <label> | call <macro> <parameters> | stop | { )
if ((arg1 <Operators> arg2 && arg3 <Operators> arg4) || (arg5 <Operators> arg6 && arg7 <Operators> arg8)) (goto <label> | call <macro> <parameters> | stop | { )
if ((arg1 <Operators> arg2 || arg3 <Operators> arg4) && (arg5 <condition> arg6 || arg7 <condition> arg8)) (goto <label> | call <macro> <parameters> | stop | { )
  • Notice inside of each brackets containing the AND and OR symbols.

причём

  • arg может быть переменной, a nested variable, a special keyword, &eval, текстом или числом или даже Perl Subroutines функцией.
  • <label>, название метки в коде, может быть только из букв и цифр.
  • <macro>, название макроса
  • <parameters> параметры макроса, внутри макроса можно к ним обратиться как $.param[0], $param[1] и т.д.
  • < { >, начало блока команд, которые запустятся, если условие истинно. Блок команд закрывается соответствующей фигурной скобкой }.


Примечание: Внутри скобок можно использовать неограниченное количество сравнений.

if (arg1 <Operators> arg2 || arg3 <Operators> arg4 || ... || argN <Operators> argN+1) (goto <label> | call <macro> <parameters> | stop)

Where;

  • arg can be a variable, a nested variable, a special keyword, &eval or letters and numbers.
  • All the conditions is up to the Nth argument <Operators> N+1th argument.
  • While N is an integer number/s which is greater than zero.

Постфиксный if

Кроме того, можно использовать if после команды.

<command> if (arg1 <Operators> arg2)

Т.е. команда перед if запустится только тогда, когда условие истинно. Условие пишется по точно таким же правилам, как было сказано выше.

В следующем примере обе команды равнозначны и делают одно и то же:

call buy if ($.zeny > 1000)
if ($.zeny > 1000) call buy

Else

В случае, если if использовался с фигурными скобками ( { ), то можно использовать else после закрывающей фигурной скобки ( } ).

if (arg1 <Operators> arg2) {
   command1
   command2
   ...
   commandN
} else {
   command3
   command4
   ...
   commandN
}

В этом случае если условие в круглых скобках истинно, то выполнятся только команды 1 и 2, если условие ложное, то выполнятся только команды 3 и 4.


Примечание: в фигурных скобках можно использовать неограниченное количество команд.
Примечание: ветка else - не обязательна.


Elsif

Этот оператор работает как else + if одновременно. Оператор elsif нужен для проверки следующего условия. Оператор else срабатывает, когда ни одно условие не выполнилось.

if (arg1 <Operators> arg2) {
   command1
   command2
   ...
   comandoN
} elsif (arg1 <Operators> arg2) {
   command3
   command4
   ...
   commandN
} else {
   command5
   command6
   ...
   commandN
}

В этом случае если первое условие истинно, то будут выполнены только команды 1 и 2, если оно ложное, то далее идёт проверка второго условия. Если второе условие истинно, то будут выполнены только команды 3 и 4. Если оба условия ложные, то будут выполнены только команды 5 и 6.


Примечание: ветки elsif и else - не обязательны.


Switch/case

Этот оператор напоминает if с кучей последующих elseif. Данный оператор будет полезным, когда необходимо проверить одну переменную на разные условия.

switch (arg1) {
    case (<Operators> arg2) (goto <label> | call <macro> <parameters> | stop | {)
        (Если вы используете "{", то команды для выполнения должна находиться здесь. Каждая команда должна быть написана в новой строчке. В конце обязательно должна быть закрывающая скобка "}")
    case (<Operators> arg2) (goto <label> | call <macro> <parameters> | stop | {)
        (Если вы используете "{", то команды для выполнения должна находиться здесь. Каждая команда должна быть написана в новой строчке. В конце обязательно должна быть закрывающая скобка "}")
    ...
    else (goto <label> | call <macro> <parameters> | stop | {)
        (Если вы используете "{", то команды для выполнения должна находиться здесь. Каждая команда должна быть написана в новой строчке. В конце обязательно должна быть закрывающая скобка "}")
}

Примечание: если не сработал ни один case, тогда отработает else.
Примечание: использовать else не обязательно.


Примеры с условными операторами

Этот макрос двигает персонажа в случайном направлении: на север, юг, восток или запад.

macro walk {
   $num = &rand(1, 4)
   if ($num == 1) {
       do c я пойду в сторону 1 (на север)
       do north
   }
   if ($num == 2) {
       do c я пойду в сторону 2 (на юг)
       do south
   }
   if ($num == 3) {
       do c я пойду в сторону 3 (на восток)
       do east
   }
   if ($num == 4) {
       do c я пойду в сторону 4 (на запад)
       do west
   }
}

Давайте перепишем этот макрос с постфиксным if:

macro walk {
   $num = &rand(1, 4)
   do c я пойду в сторону $num
   do north if ($num == 1)
   do south if ($num == 2)
   do east  if ($num == 3)
   do west  if ($num == 4)
}

Следующий макрос использует конструкцию if/else, чтобы определить, есть ли у персонажа больше 1000 зени или нет.

macro checkZeny {
   if ($.zeny > 1000) {
      do c У меня больше 1.000z! 
   } else {
      do c у меня 1.000z или меньше...
   }
}

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

macro checkZeny {
   if ($.zeny > 1000) {
      do c у меня больше 1.000z! 
      do e money
   } elsif ($.zeny == 1000) {
      do c у меня ровно 1.000z.
      do e !
   } else {
      do c у меня меньше 1.000z
      do e panic
   }
}

Переработаем предыдущий макрос, с использованием switch/case:

macro checkZeny {
    switch ($.zeny) {
        case (> 1000) {
            do c у меня больше 1.000z! 
            do e money
        }
        case (== 1000) {
            do c у меня ровно 1.000z.
            do e !
        }
        else {
            do c у меня меньше 1.000z
            do e panic
        }
    }
}

Следующий макрос показывает использование if вместе с goto:

macro checknum {
    $num = &rand(1, 3)
    if ($num == 1) goto one
    if ($num == 2) goto two
    if ($num == 3) goto three
    :one
    log \$num = 1
    stop
    :two
    log \$num = 2
    stop
    :three
    log \$num = 3
}

Переработаем предыдущий макрос, с использованием call вместо goto.

macro checknum {
    $num = &rand(1, 3)
    if ($num == 1) call one
    if ($num == 2) call two
    if ($num == 3) call three
}
macro one {
    log $num = 1
}
macro two {
    log $num = 2
}
macro three {
    log $num = 3
}


Сложный макрос, где переменная $i, равная 1, подвергается изощрённым проверкам и так и сяк.

macro if {
 $i = 1
 log \$i = $i
 if (((($i = 1 || $i < 5 || $i ~ 0 .. 5) && &eval(&eval($i - 1) - &eval($i - 0)) = -1) && ($i != 2 && $i > 0 && &eval($i - 1) = 0) && ($i != 2 && $i > 0 && &eval($i - 1) = 0)) && $i = 1) goto somewhere
 if (($i = 1 || $i < 5 || $i ~ 0 .. 5) && ($i != "" && $i > 0 && &eval($i - 1) = 0)) goto somewhere
 if (&eval (&eval($i-1) - 1) != "") goto somewhere
 if ((($i = 1) || ($i < 5 && $i ~ 0 .. 5)) && ($i != "" && $i > 0 && &eval($i - 1) > 0)) goto somewhere
 log ko
 stop
:somewhere
 log OK
}

Цикл while

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

Синктаксис
while (arg <condition> arg) {
    do bla bla
    ...
}

причём

  • arg - может переменной, вложенной переменной, ключевым словом, &eval, числом или строкой.

Операторы сравнения смотри тут: Operators.

Пример

Пробежим цикл десять раз, от $i равного 0 до 9.

macro while {
    $i = 0
    while ($i < 10) {
    log \$i = $i
    $i++
    }
}

Вывод на консоль:

[eventmacro log] \$i = 0
[eventmacro log] \$i = 1
[eventmacro log] \$i = 2
[eventmacro log] \$i = 3
[eventmacro log] \$i = 4
[eventmacro log] \$i = 5
[eventmacro log] \$i = 6
[eventmacro log] \$i = 7
[eventmacro log] \$i = 8
[eventmacro log] \$i = 9

Автомакросы

На данный момент вы научились объявлять макросы и вызывать их, набирая в консоли OpenKore 'eventMacro <macro name>'.

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

Автомакрос состоит из:

  • одного или нескольких параметров (параметр call среди них единственный обязательный).
  • одного или нескольких условий.

Автомакрос не сработает, если в данный момент исполняется макрос в т.н. эксклюзивном режиме. В любом другом случае очередь макросов очищается (другими словами, всё останавливается) и уже тогда запускается нужный макрос.

Ещё раз - мы используем автомакрос для проверки неких условий, если они выполняются, то автомакрос срабатывает и запускает указанный макрос.

Параметры

  • Каждый параметр упоминается не больше одного раза.
  • Параметры определяют, каким образом будет работать автомакрос или вызванный им макрос.
  • У большинства параметров есть значение по умолчанию.
call
  • call - это единственный обязательный параметр в каждом автомакросе.
  • call определяет, какой макрос будет запущен.
  • call может быть названием макроса или блоком команд.

Пример с использованием названия макроса:

automacro <название автомакроса> {
    <тут только условия и параметры автомакроса>
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    # например:
    do move prontera
    do move payon
}

Пример с использованием блока команд:

automacro <название автомакроса> {
    <тут только условия и параметры автомакроса>
    call {
        <тут обычные инструкции макроса>
        # например:
        do move prontera
        do move payon
    }
}


  • Оба примера выше равнозначны и делают то же самое.
  • Обратите внимание, что блок команд в параметре call подчиняется тем же правилам что и обычный macro-блок.

Синтаксис первого автомакроса удобен, когда у вас есть несколько автомакросов, которые могут вызывать один и тот же макрос:

automacro First {
    <одни условия> 
    call print
}
automacro Second {
    <другие условия> 
    call print
}
macro print {
    log $.caller triggered
}


delay
  • delay - необязательный параметр.
  • delay определяет время в секундах, которое пройдёт перед тем, как запустится макрос из параметра call.
  • Значение по умолчанию: 0.
  • Значением параметра может быть только число.
automacro <название автомакроса> {
    <тут только условия и параметры автомакроса>
    delay 5
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Текст будет напечатан через 5 секунд, после того, как сработает автомакрос.
}
run-once
  • run-once - необязательный параметр.
  • run-once определяет, сколько раз может сработать автомакрос - только один раз или неограниченное количество раз.
  • Значение по умолчанию: 0.
  • Если 1 , то автомакрос сработает лишь однажды, если 0, то может сработать много раз.
  • Чтобы уже сработавшему автомакросу с run-once 1 разрешить сработать ещё раз, можно использовать команду 'release' Macro Syntax.
automacro myautomacro {
    <тут только условия и параметры автомакроса>
    run-once 1
    call myMacro
}
automacro myaotherauto {
    <тут только условия и параметры автомакроса>
    run-once 0
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Данный макрос может быть вызван из myautomacro только один раз,
    log но из myaotherauto он может быть вызван много раз.
}
CheckOnAI
  • CheckOnAI - необязательный параметр.
  • CheckOnAI определяет, в каком режиме AI может сработать автомакрос.
  • Значение по умолчанию можно установить в параметре конфига eventMacro_CheckOnAI Configuration files.
  • Если не указать данный параметр в автомакросе, то будет использовано значение по умолчанию, которое берётся из параметра конфига eventMacro_CheckOnAI.
  • Если в конфиге не прописано значение по умолчанию eventMacro_CheckOnAI, то используется: auto
  • Значение параметра - список через запятую следующих слов: auto, manual и off.
automacro MyAuto {
    <тут только условия и параметры автомакроса>
    CheckOnAI manual
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Автомакрос MyAuto сработает только в ручном режиме бота (manual)
}

automacro MyAuto2 {
    <тут только условия и параметры автомакроса>
    CheckOnAI manual, off
    call myMacro
}
macro myMacro2 {
    <тут обычные инструкции макроса>
    log Автомакрос MyAuto2 сработает в режимах manual или off.
}
disabled
  • disabled - необязательный параметр.
  • disabled определяет, активен ли автомакрос.
  • Значение по умолчанию: 0.
  • Если 1, то автомакрос не активен и не сможет сработать. Если 0, то сработает при наступлении условий.
automacro MyAuto {
    <тут только условия и параметры автомакроса>
    disabled 1
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Автомакрос MyAuto никогда не сработает, он выключен.
}

automacro MyAuto2 {
    <тут только условия и параметры автомакроса>
    disabled 0
    call myMacro
}
macro myMacro2 {
    <тут обычные инструкции макроса>
    log Автомакрос MyAuto2 сработает как положено при наступлении условий.
}
overrideAI
  • overrideAI - необязательный параметр.
  • overrideAI определяет, занесёт ли плагин eventMacro макро-команды в очередь задач AI.
  • Значение по умолчанию: 0.
  • Если 0, то команды макроса попадают в очередь задач AI как 'eventMacro' и каждая команда сработает только тогда, когда до неё дойдёт очередь, т.е. AI переключится на задачу 'eventMacro'.
  • Если 1, то команды макроса не попадут в очередь задач AI и не будут управляться ею. Команды тупо выполняются одна за другой с интервалом macro_delay.
  • It's important to note that when it's value is 1 since it won't be put into AI queue normal AI functions will continue as normal, like mob hunting or autostorage.
automacro MyAuto {
    <тут только условия и параметры автомакроса>
    overrideAI 0
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    do move prontera
    log До этой строки макроса дело дойдёт только тогда, когда бот дойдёт до Пронтеры, т.е. довольно длительная команда 'move prontera' выполнится. Ибо в списке задач AI команда 'move' стоит первая в очереди.
}

automacro MyAuto2 {
    <тут только условия и параметры автомакроса>
    overrideAI 1
    call myMacro
}
macro myMacro2 {
    <тут обычные инструкции макроса>
    do move prontera
    log До этой строки макроса дело дойдёт практически сразу, через короткий промежуток macro_delay, потому что оно работает без оглядки на очередь команд AI.
}
exclusive
  • exclusive - необязательный параметр.
  • exclusive определяет, может ли исполнение макроса быть прервано.
  • Значение по умолчанию: 0.
  • Если 0, то исполнение макроса может быть прервано другим автомакросом.
  • Если 1, то исполнение макроса невозможно прервать другим автомакросом.
automacro MyAuto {
    <тут только условия и параметры автомакроса>
    exclusive 0
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Исполнение макроса может быть прервано в любой момент, что может привести к ошибке.
}

automacro MyAuto2 {
    <тут только условия и параметры автомакроса>
    exclusive 1
    call myMacro
}
macro myMacro2 {
    <тут обычные инструкции макроса>
    log Так как exclusive равен 1, то макрос нельзя прервать и он отработает полностью.
}
priority
  • priority - необязательный параметр.
  • priority определяет очерёдность срабатывания автомакросов. Чем меньше номер, тем раньше до него дойдёт очередь.
  • Значение по умолчанию: 0.
  • Значение должно быть числом.
automacro MyAuto {
    <тут только условия и параметры автомакроса>
    priority 5
    call {
        log Этот автомакрос стоит в очереди после MyAuto2, потому он и сработает позже.
    }
}

automacro MyAuto2 {
    <тут только условия и параметры автомакроса>
    priority 2
    call {
        log Этот автомакрос сработает раньше MyAuto, потому что он первый в очереди.
    }
}
macro_delay
  • macro_delay - необязательный параметр.
  • macro_delay определяет паузу между выполнениями команд в макросе, измеряется в секундах.
  • Значение по умолчанию: 1.
  • Значение должно быть числом.
automacro MyAuto {
    <тут только условия и параметры автомакроса>
    macro_delay 2
    call {
        log Этот текст выведется при запуске макроса.
        log А этот текст напечатается через две секунды.
    }
}

automacro MyAuto2 {
    <тут только условия и параметры автомакроса>
    macro_delay 5
    call {
        log Этот текст выведется при запуске макроса.
        log А этот текст напечатается через пять секунд.
    }
}
orphan
  • orphan - необязательный параметр.
  • orphan определяет, что будет делать плагин eventMacro делать с макросами в том случае, когда плагин уберут из очереди задач AI.
  • Значение по умолчанию можно настроить в параметре конфига eventMacro_orphans Configuration files.
  • Если параметр не указан в автомакросе, то тогда будет использовано значение из параметра конфига eventMacro_orphans.
  • Если и в конфиге не указан параметр eventMacro_orphans, тогда используется значение: terminate
  • Возможные значения параметра:
Значение Описание
terminate прервать, остановить работу макроса (равнозначно команде eventMacro stop)
terminate_last_call прервать только последний вызванный макрос. Таким образом, если макрос 'mac1' вызвал 'mac2', который в свою очередь вызвал 'mac3', то только 'mac3' будет прерван, а вызвавший его макрос 'mac2' продолжит работу.
reregister заново регистрирует макросы в очередь задач AI, затирая другие записи. Таким образом брошенный макрос сможет сразу же продолжить работу.
reregister_safe заново регистрирует макросы в очередь задач AI, когда она пустеет и AI нечего делать. Это означает, что макрос продолжит работать только после завершения всех остальных задач.
repeat
  • repeat - необязательный параметр.
  • repeat определяет сколько раз подряд будет запущен макрос.
  • Значение по умолчанию: 1.
  • Значение должно быть числом.
automacro <automacro name> {
    <тут только условия и параметры автомакроса>
    repeat 3
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Это сообщение будет напечатано трижды, потому что макрос будет вызван три раза.
}
timeout
  • timeout - необязательный параметр.
  • timeout - определяет, через какое время этот автомакрос может сработать снова.
  • Значение по умолчанию: 0.
  • Значение должно быть числом.
automacro <automacro name> {
    <тут только условия и параметры автомакроса>
    timeout 60
    call myMacro
}
macro myMacro {
    <тут обычные инструкции макроса>
    log Этот макрос будет вызываться не чаще одного раза в минуту.
}

Условия

  • Условия делятся на две категории: состояние и событие.
  • Большинство условий присваивают некие значения специальным переменным, когда автомакрос срабатывает.
  • В большинстве условий можно использовать переменные.
  • Каждый автомакрос может срабатывать только на одно событие.
  • Большинство условий состояния может быть использовано более одного раза в автомакросе.
  • Для каждого условие далее следует подробное описание.
  • Плагин eventMacro устроен так, что для каждого условия есть свой модуль - файл pm. Все файлы в папке eventMacro/Condition - это условия автомакросов.

Состояние

  • Условные выражения состояний возвращают true или false.
  • Автомакрос сработает только если все ого условия состояний будут true.


BaseLevel
  • Описание: Проверяет базовый уровень персонажа.
  • Не поддерживает проценты прогресса.
Синтаксис:
BaseLevel <Math condition operators>
Пример:
BaseLevel >= 30
Устанавливает значение переменной:
$.BaseLevelLast => в переменную записывается базовый уровень, при котором условное выражение стало true


JobLevel
  • Описание: Проверяет профессиональный уровень персонажа.
  • Не поддерживает проценты прогресса.
Синтаксис:
JobLevel <Math condition operators>
Пример:
JobLevel = 70
Устанавливает значение переменной:
$.JobLevelLast => в переменную записывается профессиональный уровень, при котором выражение стало true


CartCurrentWeight
  • Описание: Смотрит вес предметов в телеге.
  • Может работать с процентами.
Синтаксис:
CartCurrentWeight <Math condition operators>
Примеры:
CartCurrentWeight > 80%
CartCurrentWeight > 4000
Устанавливает значения переменных:
$.CartCurrentWeightLast => запоминает вес предметов в телеге, при котором выполнилось условие
$.CartCurrentWeightLastPercent => запоминает вес предметов в телеге в процентах от максимального, при котором выполнилось условие


CartMaxWeight
  • Описание: Проверяет вместимость телеги, т.е. максимальный вес предметов в телеге.
  • Не работает с процентами.
Синтаксис:
CartMaxWeight <Math condition operators>
Пример:
CartMaxWeight > 4000
Устанавливает значение переменной:
$.CartMaxWeightLast => запоминает вместимость телеги на момент срабатывания условия


CartCurrentSize
  • Описание: Проверяет количество предметов в телеге.
  • Может работать с процентами.
Синтаксис:
CartCurrentSize <Math condition operators>
Примеры:
CartCurrentSize > 80%
CartCurrentSize > 4000
Устанавливает значение переменных:
$.CartCurrentSizeLast => запоминает количество предметов в телеге на момент срабатывания условия
$.CartCurrentSizeLastPercent => запоминает количество предметов в телеге в процентах от максимального на момент срабатывания условия


CartMaxSize
  • Описание: Проверить вместимость телеги в предметах.
  • Не работает с процентами.
Синтаксис:
CartMaxSize <Math condition operators>
Пример:
CartMaxSize > 4000
Устанавливает значение переменной:
$.CartMaxSizeLast => запоминает максимальную вместимость телеги на момент срабатывания условия


CharCurrentWeight
  • Описание: проверяет текущий вес инвентаря у персонажа.
  • Может работать с процентами.
Синтаксис:
CharCurrentWeight <Math condition operators>
Примеры:
CharCurrentWeight > 80%
CharCurrentWeight > 4000
Устанавливает значения переменных:
$.CharCurrentWeightLast => запоминает вес инвентаря персонажа на момент срабатывания условия
$.CharCurrentWeightLastPercent => запоминает вес инвентаря персонажа в процентах от максимальной загрузки на момент срабатывания условия


CharMaxWeight
  • Описание: проверяет максимально переносимый груз в инвентаре персонажа.
  • Не работает с процентами.
Синтаксис:
CharMaxWeight <Math condition operators>
Пример:
CharMaxWeight > 4000
Устанавливает значение переменной:
$.CharMaxWeightLast => запоминает максимально переносимый груз в инвентаре персонажа на момент срабатывания условия


FreeStatPoints
  • Описание: проверяет нераспределённые стат-поинты.
  • Не работает с процентами.
Синтаксис:
FreeStatPoints <Math condition operators>
Пример:
FreeStatPoints > 20
Устанавливает значение переменной:
$.FreeStatPointsLast => запоминает количество свободных стат-поинтов на момент срабатывания условия


FreeSkillPoints
  • Описание: проверяет количество свободных очков умений.
  • Не работает с процентами.
Синтаксис:
FreeSkillPoints <Math condition operators>
Пример:
FreeSkillPoints > 20
Устанавливает значение переменной:
$.FreeSkillPointsLast => запоминает количество свободных очков умений на момент срабатывания условия


CurrentHP
  • Описание: проверяет количество очков жизни (т.е. hp) у персонажа.
  • Может работать с процентами.
Синтаксис:
CurrentHP <Math condition operators>
Примеры:
CurrentHP > 80%
CurrentHP > 4000
Устанавливает значение переменных:
$.CurrentHPLast => запоминает, сколько было здоровья у персонажа на момент проверки условия
$.CurrentHPLastPercent => то же самое, но в процентах


MaxHP
  • Описание: проверяет, какое максимальное количество hp может быть у персонажа.
  • Не работает с процентами.
Синтаксис:
MaxHP <Math condition operators>
Пример:
MaxHP > 4000
Устанавливает значение переменной:
$.MaxHPLast => запоминает, какое максимальное количество hp могло быть у персонажа на момент проверки условия


CurrentSP
  • Описание: запоминает текущее значение sp у персонажа.
  • Работает с процентами.
Синтаксис:
CurrentSP <Math condition operators>
Пример:
CurrentSP > 80%
CurrentSP > 4000
Устанавливает значение переменной:
$.CurrentSPLast => запоминает текущее значение sp на момент проверки условия
$.CurrentSPLastPercent => то же самое, в процентах


MaxSP
  • Описание: проверяет максимально возможное количество sp у персонажа.
  • Не работает с процентами.
Синтаксис:
MaxSP <Math condition operators>
Пример:
MaxSP > 4000
Устанавливает значение переменной:
$.MaxSPLast => запоминает максимально возможное количество sp у персонажа на момент проверки условия


InInventory
  • Описание: по названию предмета проверяет его количество у персонажа в инвентаре.
  • Не работает с процентами.
Синтаксис:
InInventory "<название предмета>" <Math condition operators>
Обратите внимание на кавычки, это важно.
Пример:
InInventory "Red Potion" < 10
Устанавливает значение переменной:
$.InInventoryLast => запоминает название проверяемого предмета
$.InInventoryLastAmount => запоминает количество предметов


InInventoryID
  • Описание: по идентификатору предмета проверяет его количество у персонажа в инвентаре.
  • Не работает с процентами.
Синтаксис:
InInventoryID <идентификатор предмета> <Math condition operators>
Пример:
InInventoryID 501 < 10
Устанавливает значение переменной:
$.InInventoryIDLast => запоминает идентификатор предмета
$.InInventoryIDLastAmount => запоминает количество предмета на момент срабатывания условия


InStorage
  • Описание: по названию предмета проверяет его количество на складе.
  • Не работает с процентами.
Синтаксис:
InStorage "<название предмета>" <Math condition operators>
Обратите внимание на кавычки.
Пример:
InStorage "Blue Potion" > 100
Устанавливает значение переменной:
$.InStorageLast => запоминает название предмета
$.InStorageLastAmount => запоминает количество на момент срабатывания условия


InStorageID
  • Описание: по идентификатору предмета проверят его количество на складе.
  • Не работает с процентами.
Синтаксис:
InStorageID <item ID> <Math condition operators>
Пример:
InStorageID 507 100..500
Устанавливает значение переменной:
$.InStorageIDLast => запоминает идентификатор предмета
$.InStorageIDLastAmount => запоминает количество предметов на складе на момент срабатывания условия


InCart
  • Описание: по названию предмета смотрит его количество в телеге.
  • Не работает с процентами.
Синтаксис:
InCart "название предмета" <Math condition operators>
Обратите внимание на кавычки.
Пример:
InCart "Blue Potion" > 100
Устанавливает значение переменной:
$.InCartLast => запоминает название предмета
$.InCartLastAmount => запоминает количество на момент срабатывания условия


InCartID
  • Описание: по идентификатору предмета смотрит его количество в телеге.
  • Не работает с процентами.
Синтаксис:
InCartID <идентификатор предмета> <Math condition operators>
Пример:
InCartID 507 100..500
Устанавливает значение переменной:
$.InCartIDLast => запоминает идентификатор предмета
$.InCartIDLastAmount => запоминает количество в телеге на момент срабатывания условия


InventoryCurrentSize
  • Описание: проверяет текущее количество предметов в инвентаре (ячейки).
  • Работает с процентами. (но смысла в этом особого нет ибо места в инвентаре как раз на 100 предметов)
Синтаксис:
InventoryCurrentSize <Math condition operators>
Пример:
InventoryCurrentSize > 70%
InventoryCurrentSize > 30
Устанавливает значение переменной:
$.InventoryCurrentSizeLast => запоминает количество занятых ячеек в инвентаре персонажа на момент срабатывания условия


SkillLevel
  • Описание: по идентификатору умения или по константе проверяет, насколько умение прокачано.
  • Не работает с процентами.
Синтаксис:
SkillLevel <идентификатор умения или константа> <Math condition operators>
Пример:
SkillLevel NV_FIRSTAID = 0
SkillLevel 10 > 5
Устанавливает значение переменной:
$.SkillLevelLastName => запоминает название умения
$.SkillLevelLastID => запоминает идентификатор умения
$.SkillLevelLastHandle => запоминает константу
$.SkillLevelLastLevel => собственно запоминает уровень, на который было прокачано умение на момент срабатывания условия


Zeny
  • Описание: проверяет, сколько у персонажа зени.
  • Не работает с процентами.
Синтаксис:
Zeny <Math condition operators>
Пример:
Zeny > 500000
Устанавливает значение переменной:
$.ZenyLast => запоминает количество зени на момент срабатывания условия


StorageOpened
  • Описание: истина, если 1 и персонаж открыл склад. Также истина, если 0 и склад закрыт. Смотря что хотим проверить.
Синтаксис:
StorageOpened <1|0>
Пример:
StorageOpened 1


ShopOpened
  • Описание: истина, если 1 и персонаж открыл свою торговую лавку. Также истина, если 0 и торговая лавка не открыта. Смотря что хотим проверить.
Синтаксис:
ShopOpened <1|0>
Пример:
ShopOpened 1


InChatRoom
  • Описание: истина, если 1 и персонаж находится в чат-комнате. Также истина, если 0 и персонаж не находится в чат-комнате.
Синтаксис:
InChatRoom <1|0>
Пример:
InChatRoom 0


ChatRoomNear
  • Описание: по регулярному выражению проверяет, есть ли рядом подходящая чат-комната.

Примечание переводчика: Тут не хватает синтаксиса, примера и описания переменных для ChatRoomNear.


Примечание переводчика: Тут не хватает описания про NpcNear.

Синтаксис:
NpcNear <Regex>
Пример:
NpcNear /kafra/
NpcNear /special agent/
Устанавливает значение переменной:
$.ChatRoomNearLastID => Saves the ID of the last chat room that made ChatRoomNear become true
$.ChatRoomNearLastOwnerID => Saves the ID of the owner of the last chat room that made ChatRoomNear become true
$.ChatRoomNearLastOwnerName => Saves the name of the owner of the last chat room that made ChatRoomNear become true
$.ChatRoomNearLastTitle => Saves the title of the last chat room that made ChatRoomNear become true


InMap
  • Описание: проверяет, находится ли персонаж на одной из перечисленных локаций.
Синтаксис:
InMap <список локаций>
Название локации может быть переменной.
Пример:
InMap prontra, geffen, gef_fild10
Устанавливает значение переменной:
$.InMapLast => запоминает локацию, которая вызвала срабатывание условия


InLockMap
  • Описание: истина, если 1 и персонаж находится на локмапе. Также истина, если 0 и персонаж не на локмапе.
Синтаксис:
InLockMap <1|0>
Пример:
InLockMap 1


InSaveMap
  • Описание: истина, если 1 и персонаж находится на локации, где у него точка сохранения. Также истина, если 0 и персонаж не находится на локации с его точкой сохранения.
Синтаксис:
InSaveMap <1|0>
Пример:
InSaveMap 0


IsInCoordinate
  • Описание: проверяет, находится ли персонаж по указанным координатам.
Синтаксис:
IsInCoordinate <разделённый запятыми список пар координат x и y>
Кроме точных координат понимает также диапазоны. (типа 100..200 вместо координаты x и 50..100 вместо координаты y)
Пример:
IsInCoordinate 100 150
IsInCoordinate 120 100, 115 289, 158 236
IsInCoordinate 20..80 200, 50 60, 80 90..150, 100..200 150..200
IsInCoordinate 30..35 40..45
Устанавливает значение переменной:
$.IsInCoordinateLast => запоминает координаты, при которых сработало условие
$.IsInCoordinateLastMemberIndex => запоминает номер в списке, к которому подошли координаты персонажа


IsInMapAndCoordinate
  • Описание: проверяет, находится ли персонаж по заданным координатам.
Синтаксис:
IsInMapAndCoordinate <список локаций и координат>
Можно использовать диапазоны чисел, например 100..200 50..100
Можно проверять только по названию локации, только по координатам или всё вместе - локацию с координатами
Пример:
IsInMapAndCoordinate 100 150
IsInMapAndCoordinate prontera
IsInMapAndCoordinate prontra, geffen, gef_fild10
IsInMapAndCoordinate 120 100, 115 289, 158 236
IsInMapAndCoordinate prontera, 100 200, gef_fild10 100..150 250
IsInMapAndCoordinate gef_fild10 20..80 200, payon 50 60
Устанавливает значение переменной:
$.IsInMapAndCoordinateLast => запоминает координаты, которые привели к срабатыванию условия
$.IsInMapAndCoordinateLastMemberIndex => запоминает номер элемента из списка локаций и координат, который привёл к срабатыванию условия


InPvP
  • Описание: проверяет локацию на заданный режим pvp.
Синтаксис:
InPvP <список режимов pvp>
Режимы: pvp, gvg и battleground.
Пример:
InPvP battleground, pvp
Устанавливает значение переменной:
$.InPvPLast => запоминает режим pvp, который привёл к срабатыванию условия


InCity
  • Описание: проверяет, находится ли персонаж в городе или нет.
Синтаксис:
InCity <0 | 1>
Если 0, то сработает не в городе
Если 1, то сработает в городу
Пример:
InCity 1
Устанавливает значение переменной:
$.InCityLast => запоминает название локации на которой условие сработало


InMapRegex
  • Описание: Соответствует ли название текущей локации заданному в regex шаблону.
Синтаксис:
InMapRegex <Regex>
Пример:
InMapRegex /field\d+$/
InMapRegex /^pay/
Устанавливает значение переменной:
$.InMapRegexLast => запоминает название локации, при котором условие InMapRegex стало true


NpcNear
  • Описание: Есть ли поблизости непись, имя которой подпадает под заданный regex-шаблон.
Синтаксис:
NpcNear <Regex>
Пример:
NpcNear /kafra/
NpcNear /special agent/
Устанавливает значение переменной:
$.NpcNearLast => запоминает имя неписи
$.NpcNearLastPos => запоминает местоположение неписи, можно использовать в дальнейшем для команды 'talknpc'
$.NpcNearLastBinId => запоминает индекс неписи в списке openkore, можно в дальнейшем использовать в команде 'talk'
$.NpcNearLastDist => запоминает дистанцию до обнаруженной неписи


NpcNearDist
  • Описание: Есть ли на определённом удалении непись, имя которой подпадает под заданный regex-шаблон.
Синтаксис:
NpcNearDist <Regex> <Math condition operators>
Пример:
NpcNearDist /kafra/ <= 4
NpcNearDist /special agent/ >= 5
Устанавливает значение переменной:
$.NpcNearDistLast => запоминает имя неписи
$.NpcNearDistLastPos => запоминает местоположение неписи, можно использовать в дальнейшем для команды 'talknpc'
$.NpcNearDistLastBinId => запоминает индекс неписи в списке openkore, можно в дальнейшем использовать в команде 'talk'
$.NpcNearDistLastDist => запоминает дистанцию до обнаруженной неписи


NpcNotNear
  • Описание: Проверяет, что поблизости нет неписи с заданным в regex именем.
Синтаксис:
NpcNotNear <Regex>
Пример:
NpcNotNear /kafra/
NpcNotNear /special agent/
Не создаёт никаких переменных


PlayerNear
  • Описание: Есть ли рядом игроки с заданным в regex именем.
Синтаксис:
PlayerNear <Regex>
Пример:
PlayerNear /john/
PlayerNear /henry the best TM/i
Устанавливает значение переменной:
$.PlayerNearLast => запоминает имя персонажа
$.PlayerNearLastPos => запоминает местоположение персонажа
$.PlayerNearLastBinId => запоминает номер игрока в списке openkore
$.PlayerNearLastDist => запоминает расстояние до игрока


PlayerNearDist
  • Описание: Есть ли на указанном расстоянии игроки с именем, совпадающим с regex-шаблоном.
Синтаксис:
PlayerNearDist <Regex> <Math condition operators>
Пример:
PlayerNearDist /bad gm/ < 10
PlayerNearDist /good guy healer/ <5
Устанавливает значение переменной:
$.PlayerNearDistLast => Запоминает имя игрока
$.PlayerNearDistLastPos => Запоминает местоположение игрока
$.PlayerNearDistLastBinId => Запоминает номер игрока в списке openkore
$.PlayerNearDistLastDist => Запоминает расстояние до игрока


PlayerNotNear
  • Описание: Удостоверяется, что рядом нет игрока с похожим на regex-шаблон именем.
Синтаксис:
PlayerNotNear <Regex>
Пример:
PlayerNotNear /the guy I need to see/
PlayerNotNear /^(john|george|paul|ringo)$/i
Не создаёт никаких переменных


MobNear
  • Описание: Проверяет, есть ли рядом моб с заданным в regex названием.
Синтаксис:
MobNear <Regex>
Пример:
MobNear /(edga|maya|ifrit|bad mvps)/i
MobNear /oring/
Устанавливает значение переменной:
$.MobNearLast => запоминает название моба
$.MobNearLastPos => хранит местоположение моба
$.MobNearLastBinId => запоминает номер моба в списке openkore
$.MobNearLastDist => расстояние до моба


MobNearDist
  • Описание: есть ли на заданном расстоянии моб с названием, подходящим под regex.
Синтаксис:
MobNearDist <Regex> <Math condition operators>
Пример:
MobNearDist /(Poporing|Drops|Poring|Marin)/ < 3
Устанавливает значение переменной:
$.MobNearDistLast => запоминает название найденного моба
$.MobNearDistLastPos => запоминает местоположение моба
$.MobNearDistLastBinId => номер моба в списке openkore
$.MobNearDistLastDist => расстояние до моба


MobNotNear
  • Описание: Удостоверяется, что рядом нет моба с заданным в regex названием.
Синтаксис:
MobNotNear <Regex>
Пример:
MobNotNear /mvp I am look for/
MobNotNear /edga/i
Не создаёт никаких переменных


JobID
  • Описание: Входит ли профессия персонажа в заданный список профессий. Профессии обозначаются числовым кодом. См. Job ID
Синтаксис:
JobID <job ID 1>, <job ID 2>, <job ID 3>, и т.д.
Пример:
JobID 6, 4053
Устанавливает значение переменной:
$.JobIDLast => запоминает идентификатор профессии персонажа


JobIDNot
  • Описание: Проверяет, что профессия персонажа не входит в заданный список. Профессия обозначается числовым кодом. См. Job ID
Синтаксис:
JobIDNot <job ID>
Пример:
JobIDNot 6
Устанавливает значение переменной:
$.JobIDNotLast => запоминает профессию персонажа


IsEquippedID
  • Описание: проверяет, одета та или иная экипировка в заданном слоте.
Синтаксис:
IsEquippedID <список пар значений место и идентификатор, разделяется запятой>
Пример:
IsEquippedID topHead 5055
IsEquippedID rightHand 13040, topHead 5055
IsEquippedID topHead 5055, leftHand 2112, robe 2510, shoes 2414, armor 2352, rightHand 1243
Устанавливает значение переменной:
$.IsEquippedIDLastID => запоминает идентификатор эквипа
$.IsEquippedIDLastName => запоминает название эквипа
$.IsEquippedIDLastSlot => запоминает слот, т.е. место экипировки
$.IsEquippedIDLastListIndex => запоминает индекс, номер позиции в списке, которая привела к срабатыванию условия


IsNotEquippedID
  • Описание: проверяет, что указанная экипировка не одета в заданный слот
Синтаксис:
IsNotEquippedID <список пар значений место и идентификатор, разделяется запятой>
Пример:
IsNotEquippedID topHead 5055
IsNotEquippedID rightHand 13040, topHead 5055
IsNotEquippedID topHead 5055, leftHand 2112, robe 2510, shoes 2414, armor 2352, rightHand 1243
Устанавливает значение переменной:
$.IsNotEquippedIDLastIsEmpty => запоминает, был ли слот пустой
$.IsNotEquippedIDLastSlot => запоминает слот, на котором сработало условие IsNotEquippedID


ConfigKey
  • Описание: проверяет несколько параметров конфига на то, что они соответствуют заданным значениям.
Синтаксис:
ConfigKey <список пар параметр конфига и его значение, разделённый запятыми>
И параметр конфига и тем более его значение может быть представлено переменными. Т.е. attackAuto $myattack или $vars{atk} 2, где $vars{atk} содержит название параметра конфига.
Пример:
ConfigKey attackAuto 2, itemsTakeAuto 2
Устанавливает значение переменной:
$.ConfigKeyLastKey => запоминает параметр конфига, при котором сработало условие
$.ConfigKeyLastValue => запоминает значение параметра
$.ConfigKeyLastMemberIndex => запоминает позицию из списка, которая привела к срабатыванию условия ConfigKey


ConfigKeyNot
  • Описание: проверяет, что хотя бы один параметр конфига из заданного списка не соответствует нужному значению.
Синтаксис:
ConfigKeyNot <список пар параметр конфига и его значение, разделённый запятыми>
И параметр конфига и тем более его значение может быть представлено переменными. Т.е. ConfigKeyNot attackAuto $myattack или ConfigKeyNot $vars{atk} 2, где $vars{atk} содержит название параметра конфига.
Пример:
ConfigKeyNot $vars{atk} 2
ConfigKeyNot itemsTakeAuto 1, attackAuto 2
Устанавливает значение переменной:
$.ConfigKeyNotLastKey => запоминает название параметра конфига, проверка которого привела к срабатыванию условия ConfigKeyNot
$.ConfigKeyNotLastWantedValue => хранит требуемое значение параметра конфига
$.ConfigKeyNotLastKeyValue => хранит текущее значение параметра конфига
$.ConfigKeyNotLastMemberIndex => запоминает номер позиции в списке, которая привела к срабатыванию условия
Примечание: Хорошо подходит для того, чтобы удостовериться, что параметры конфига настроены так, как вам надо. Например:
automacro ConfigWasWrong {
    exclusive 1
    timeout 10
    overrideAI 1
    ConfigKeyNot itemsTakeAuto 2, attackAuto 2
    call {
        log Обнаружен неправильно настроенный параметр конфига
        log Параметр: $.ConfigKeyNotLastKey
        log Требуемое значение: $.ConfigKeyNotLastWantedValue
        log Текущее значение: $.ConfigKeyNotLastKeyValue
        log Индекс в списке проверок: $.ConfigKeyNotLastMemberIndex
        log Автоматически выставляем подходящее значение для $.ConfigKeyNotLastKey. Меняем его с $.ConfigKeyNotLastKeyValue на $.ConfigKeyNotLastWantedValue
        do conf $.ConfigKeyNotLastKey $.ConfigKeyNotLastWantedValue
    }
}

Все перечисленные в условии ConfigKeyNot параметры конфига получат требуемые значения.


ConfigKeyNotExist
  • Описание: проверяет, что хотя бы один параметр из списка отсутствует в файле config.txt.
Синтаксис:
ConfigKeyNotExist <список параметров через запятую>
Может быть переменной
Пример:
ConfigKeyNotExist gameGuard, saveMap
Устанавливает значение переменной:
$.ConfigKeyNotExistLastKey => запоминает параметр конфига, которого нет в config.txt
$.ConfigKeyNotExistLastMemberIndex => запоминает номер из списка параметров, на котором сработало условие ConfigKeyNotExist
Примечание: Пригодится для добавления нестандартных параметров конфига, например от каких-нибудь плагинов. В нижеследующем примере среди прочего используется подпрограмма на perl для добавления отсутствующего параметра:
automacro AddgameGuardMissingKey {
    exclusive 1
    timeout 10
    overrideAI 1
    CheckOnAI auto, manual, off
    ConfigKeyNotExist gameGuard
    call {
        $wantedkey = $.ConfigKeyNotExistLastKey
        $wantedvalue = 1
        call AddMissingKey
    }
}

automacro AddcmdOnLoginMissingKey {
    exclusive 1
    timeout 10
    overrideAI 1
    CheckOnAI auto, manual, off
    ConfigKeyNotExist cmdOnLogin
    call {
        $wantedkey = $.ConfigKeyNotExistLastKey
        $wantedvalue = c \@autoloot
        call AddMissingKey
    }
}

macro AddMissingKey {
    log В файле config.txt нет одного важного параметра
    log Параметр называется $wantedkey
    log Его значение должно быть $wantedvalue
    log Добавим параметр $wantedkey равный $wantedvalue при помощи подпрограммы на perl - 'add_key'
    add_key("$wantedkey","$wantedvalue")
}

sub add_key {
    my ($key, $value) = @_;
    configModify($key, $value);
}

Данный макрос добавит параметры конфига для плагинов gameGuard и cmdOnLogin.


InProgressBar
  • Описание: Проверяет, ожидает ли игрок окончания какого-либо процесса.
Синтаксис:
InProgressBar <0 | 1>
Если 0, то сработает, если игрок не ждёт т.н. progress bar
Если 1, то сработает, если игрок в данный момент ожидает окончания некоего progress bar
Пример:
InProgressBar 1
Не создаёт переменных


StatusActiveHandle
  • Описание: Проверяет, наложен ли на игрока какой-нибудь статус из списка. Статусы задаются константами.
Синтаксис:
StatusActiveHandle <список статусов в виде констант>
Может быть переменной
Пример:
StatusActiveHandle EFST_INC_AGI, EFST_IMPOSITIO
Устанавливает значение переменной:
$.StatusActiveHandleLastName => запоминает название статуса
$.StatusActiveHandleLastHandle => запоминает константу, которая описывает статус
$.StatusActiveHandleLastListIndex => запоминает номер в списке статусов, который сработал в условии StatusActiveHandle


StatusInactiveHandle
  • Описание: Проверяет, что у игрока нет ни одного из перечисленных статусов. Для описания статуса используется специальная константа.
Синтаксис:
StatusInactiveHandle <список статусов в виде констант>
Может быть переменной
Пример:
StatusInactiveHandle EFST_BLESSING, EFST_CONCENTRATION
Устанавливает значение переменной:
$.StatusInactiveHandleLastName => запоминает название статуса
$.StatusInactiveHandleLastHandle => запоминает константу
$.StatusInactiveHandleLastListIndex => запоминает номер в списке статусов, который сработал в условии StatusInactiveHandle


QuestActive
  • Описание: Проверяет, активен ли у персонажа один из перечисленных квестов. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.
Синтаксис:
QuestActive <список идентификаторов квестов>
Идентификатор может быть представлен переменной
Пример:
QuestActive 7121, 7122
Устанавливает значение переменной:
$.QuestActiveLastID => запоминает идентификатор квеста
$.QuestActiveLastListIndex => запоминает позицию из списка квестов


QuestInactive
  • Описание: Проверяет неактивные квесты у персонажа. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.
Синтаксис:
QuestInactive <список идентификаторов квестов>
Идентификатор может быть представлен переменной
Пример:
QuestInactive 7121, 7122
Устанавливает значение переменной:
$.QuestInactiveLastID => запоминает идентификатор квеста
$.QuestInactiveLastListIndex => запоминает позицию из списка квестов


QuestOnTime
  • Описание: Проверяет, есть ли у персонажа заданный квест, для которого ещё тикает таймер. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.
Синтаксис:
QuestOnTime <список идентификаторов квестов>
Идентификатор может быть представлен переменной
Пример:
QuestOnTime 7121, 7122
Устанавливает значение переменной:
$.QuestOnTimeLastID => запоминает идентификатор квеста
$.QuestOnTimeLastListIndex => запоминает позицию из списка квестов


QuestTimeOverdue
  • Описание: Проверяет, есть ли у персонажа заданный квест, для которого таймер уже истёк. В списке используются идентификаторы квестов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.
Синтаксис:
QuestTimeOverdue <список идентификаторов квестов>
Идентификатор может быть представлен переменной
Пример:
QuestTimeOverdue 7121, 7122
Устанавливает значение переменной:
$.QuestTimeOverdueLastID => запоминает идентификатор квеста
$.QuestTimeOverdueLastListIndex => запоминает позицию из списка квестов


QuestHuntCompleted
  • Описание: Проверяет, есть ли среди перечисленных квестов на охоту за мобами какой-то завершенный. В списке используются идентификаторы квестов и идентификаторы мобов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.
Синтаксис:
QuestHuntCompleted <пары значений - идентификатор квеста и идентификатор моба>
Идентификаторы квестов и мобов могут быть представлены переменными
Пример:
QuestHuntCompleted 7122 1002, 7127 1004
Устанавливает значение переменной:
$.QuestHuntCompletedLastQuestID => идентификатор квеста
$.QuestHuntCompletedLastMobID => идентификатор моба
$.QuestHuntCompletedLastListIndex => запоминает позицию из списка, которая заставила сработать условие


QuestHuntOngoing
  • Описание: Проверяет незаконченные квесты на охоту за мобами. В списке используются идентификаторы квестов и идентификаторы мобов. Чтобы посмотреть, какой у квеста идентификатор, воспользуйтесь консольной командой 'quest list'.
Синтаксис:
QuestHuntOngoing <пары значений - идентификатор квеста и идентификатор моба>
Идентификаторы квестов и мобов могут быть представлены переменными
Пример:
QuestHuntOngoing 7122 1002, 7127 1004
Устанавливает значение переменной:
$.QuestHuntOngoingLastQuestID => идентификатор квеста
$.QuestHuntOngoingLastMobID => идентификатор моба
$.QuestHuntOngoingLastListIndex => запоминает позицию из списка, которая заставила сработать условие


NoPlayerNear
  • Описание: Проверяет, что поблизости нет никаких других игроков.
Синтаксис:
NoPlayerNear 1
Пример:
NoPlayerNear 1
Не порождает переменных.


NoPortalNear
  • Описание: Проверяет, что поблизости нет ни одного портала.
Синтаксис:
NoPortalNear 1
Пример:
NoPortalNear 1
Не использует переменные.


NoMobNear
  • Описание: Удостовериться, что рядом нет ни одного моба.
Синтаксис:
NoMobNear 1
Пример:
NoMobNear 1
Нет переменных.


NoNpcNear
  • Описание: Проверка на отсутствие рядом неписей.
Синтаксис:
NoNpcNear 1
Пример:
NoNpcNear 1
Не использует переменные.


PlayerNearCount
  • Описание: Сравнивает количество находящихся рядом игроков с заданным условием.
Синтаксис:
PlayerNearCount <Math condition operators>
Пример:
PlayerNearCount > 5
Устанавливает значение переменной:
$.PlayerNearCountLast => запоминает количество игроков рядом с персонажем


NpcNearCount
  • Описание: Сравнивает количество находящихся рядом неписей с заданным условием.
Синтаксис:
NpcNearCount <Math condition operators>
Пример:
NpcNearCount > 5
Устанавливает значение переменной:
$.NpcNearCountLast => запоминает количество находящихся рядом неписей


MobNearCount
  • Описание: Сравнивает количество находящихся рядом неписей с заданным условием.
Синтаксис:
MobNearCount <Math condition operators>
Пример:
MobNearCount > 10
Устанавливает значение переменной:
$.MobNearCountLast => запоминает количество мобов рядом с персонажем


PortalNearCount
  • Описание: Сравнивает количество находящихся рядом порталов с заданным условием.
Синтаксис:
PortalNearCount <Math condition operators>
Пример:
PortalNearCount > 5
Устанавливает значение переменной:
$.PortalNearCountLast => запоминает количество порталов рядом с персонажем

События

  • События не имеют значения true или false, они просто случаются.
  • Когда происходит некоторое событие, то соответствующее условие проверяется. Если информация в событии соответствует ожидаемой и все условия состояния выполняются (т.е. все их условия возвращают true), то автомакрос срабатывает.
  • Каждый автомакрос может реагировать только на одно событие.


PubMsg
  • Описание: условие проверяется при поступлении публичного сообщения, если сообщение подпадает под regex-шаблон, то условие возвращает true, т.е. автомакрос срабатывает.
Синтаксис:
PubMsg <Regex>
Пример:
PubMsg /(buff|bless)/
Устанавливает значение переменной:
$.PubMsgLastName => запоминает имя игрока, отправившего публичное сообщение
$.PubMsgLastMsg => запоминает сообщение


PubMsgDist
  • Описание: событие наступает при получении публичного сообщения, сообщение проверяется на соответствие regex-шаблону и расстояния до говорящего. Если проверка пройдена, то возвращается true и автомакрос срабатывает.
Синтаксис:
PubMsgDist <Regex> <Math condition operators>
Пример:
PubMsgDist /(buff|bless)/ < 5
Устанавливает значения переменных:
$.PubMsgDistLastName => запоминает имя игрока, публичное сообщение от которого привело к срабатыванию события PubMsgDist
$.PubMsgDistLastMsg => запоминает само публичное сообщение
$.PubMsgDistLastPos => запоминает координаты игрока
$.PubMsgDistLastDist => запоминает расстояние до игрока
$.PubMsgDistLastID => запоминает опенкоровский номер игрока


PubMsgName
  • Описание: событие наступает при получении публичного сообщения, сообщение проверятся на соответствие regex-шаблону, а также проверяется имя игрока (тоже regexp). Если проверка пройдена, то возвращается true и автомакрос срабатывает.
Синтаксис:
PubMsgName <Regex> <Regex>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
PubMsgName /(buff|bless)/ /Player to buff/
PubMsgName /stop/ /GM/
Устанавливает значения переменных:
$.PubMsgNameLastName => Запоминает имя игрока, сообщение которого привело к срабатыванию события PubMsgName
$.PubMsgNameLastMsg => Запоминает само сообщение


PubMsgNameDist
  • Описание: событие наступает при получении публичного сообщения, проверяется текст сообщения, имя игрока и дистанция до него. Если текст и имя игрока отвечают заданным regex-шаблонам и расстояние до игрока тоже удовлетворяет заданному условнию, то возвращается true и автомакрос срабатывает.
Синтаксис:
PubMsgNameDist <Regex> <Regex> <Math condition operators>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
PubMsgNameDist /(buff|bless)/ /Player to buff/ < 3
PubMsgNameDist /stop/ /GM/ >= 4
Устанавливает значения переменных:
$.PubMsgNameDistLastName => Запоминает игрока, сообщение которого привело к срабатыванию события PubMsgNameDist
$.PubMsgNameDistLastMsg => Запоминает само сообщение
$.PubMsgNameDistLastPos => Запоминает координаты игрока
$.PubMsgNameDistLastDist => Запоминает расстояние до игрока
$.PubMsgNameDistLastID => Запоминает опенкоровский номер игрока


PrivMsg
  • Описание: событие наступает при получении личного сообщения, если сообщение подпадает под regex-шаблон, то условие возвращает true, т.е. автомакрос срабатывает.
Синтаксис:
PrivMsg <Regex>
Пример:
PrivMsg /(buff|bless)/
Устанавливает значения переменных:
$.PrivMsgLastName => Запоминает имя игрока, сообщение которого привело к срабатыванию события PrivMsg
$.PrivMsgLastMsg => Запоминает само сообщение


PrivMsgDist
  • Описание: событие наступает при получении личного сообщения, оно проверяется regexp-шаблоном и на расстояние до игрока. Если условия выполняются, то автомакрос срабатывает.
Синтаксис:
PrivMsgDist <Regex> <Math condition operators>
Пример:
PrivMsgDist /(buff|bless)/ < 5
Устанавливает значения переменных:
$.PrivMsgDistLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PrivMsgDist
$.PrivMsgDistLastMsg => Запоминает само сообщение
$.PrivMsgDistLastPos => Запоминает координаты игрока
$.PrivMsgDistLastDist => Запоминает расстояние до игрока
$.PrivMsgDistLastID => Запоминает опенкоровский номер игрока


PrivMsgName
  • Описание: событие наступает при получении личного сообщения, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам.
Синтаксис:
PrivMsgName <Regex> <Regex>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
PrivMsgName /(buff|bless)/ /Player to buff/
PrivMsgName /stop/ /GM/
Устанавливает значения переменных:
$.PrivMsgNameLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PrivMsgName
$.PrivMsgNameLastMsg => Запоминает само сообщение


PrivMsgNameDist
  • Описание: событие наступает при получении личного сообщения, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам, а также после проверки расстояния до игрока.
Синтаксис:
PrivMsgNameDist <Regex> <Regex> <Math condition operators>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
PrivMsgNameDist /(buff|bless)/ /Player to buff/ < 3
PrivMsgNameDist /stop/ /GM/ >= 4
Устанавливает значения переменных:
$.PrivMsgNameDistLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PrivMsgNameDist
$.PrivMsgNameDistLastMsg => Запоминает само сообщение
$.PrivMsgNameDistLastPos => Запоминает координаты игрока
$.PrivMsgNameDistLastDist => Запоминает расстояние до игрока
$.PrivMsgNameDistLastID => Запоминает опенкоровский номер игрока


PartyMsg
  • Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения на соответствие regexp-шаблону.
Синтаксис:
PartyMsg <Regex>
Пример:
PartyMsg /(buff|bless)/
Устанавливает значения переменных:
$.PartyMsgLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PartyMsg
$.PartyMsgLastMsg => Запоминает само сообщение


PartyMsgDist
  • Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения на соответствие regexp-шаблону и расстояния до игрока.
Синтаксис:
PartyMsgDist <Regex> <Math condition operators>
Пример:
PartyMsgDist /(buff|bless)/ < 5
Устанавливает значения переменных:
$.PartyMsgDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события PartyMsgDist
$.PartyMsgDistLastMsg => Запоминает само сообщение
$.PartyMsgDistLastPos => Запоминает координаты игрока
$.PartyMsgDistLastDist => Запоминает расстояние до игрока
$.PartyMsgDistLastID => Запоминает опенкоровский номер игрока


PartyMsgName
  • Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам.
Синтаксис:
PartyMsgName <Regex> <Regex>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
PartyMsgName /(buff|bless)/ /Player to buff/
PartyMsgName /stop/ /GM/
Устанавливает значения переменных:
$.PartyMsgNameLastName => Запоминает имя игрока, личное сообщение от которого привело к срабатыванию события PartyMsgName
$.PartyMsgNameLastMsg => Запоминает само сообщение


PartyMsgNameDist
  • Описание: событие наступает при получении сообщения в пати-чат, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам, а также после проверки расстояния до игрока.
Синтаксис:
PartyMsgNameDist <Regex> <Regex> <Math condition operators>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
PartyMsgNameDist /(buff|bless)/ /Player to buff/ < 3
PartyMsgNameDist /stop/ /GM/ >= 4
Устанавливает значение переменной:
$.PartyMsgNameDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события PartyMsgNameDist
$.PartyMsgNameDistLastMsg => Запоминает само сообщение
$.PartyMsgNameDistLastPos => Запоминает координаты игрока
$.PartyMsgNameDistLastDist => Запоминает расстояние до игрока
$.PartyMsgNameDistLastID => Запоминает опенкоровский номер игрока


GuildMsg
  • Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает, если сообщение совпадает с regexp-шаблоном.
Синтаксис:
GuildMsg <Regex>
Пример:
GuildMsg /(buff|bless)/
Устанавливает значения переменных:
$.GuildMsgLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsg
$.GuildMsgLastMsg => Запоминает само сообщение


GuildMsgDist
  • Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает после проверки сообщения на совпадение с regexp-шаблоном и проверки расстояния до игрока.
Синтаксис:
GuildMsgDist <Regex> <Math condition operators>
Пример:
GuildMsgDist /(buff|bless)/ < 5
Устанавливает значение переменной:
$.GuildMsgDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsgDist
$.GuildMsgDistLastMsg => Запоминает само сообщение
$.GuildMsgDistLastPos => Запоминает координаты игрока
$.GuildMsgDistLastDist => Запоминает расстояние до игрока
$.GuildMsgDistLastID => Запоминает опенкоровский номер игрока


GuildMsgName
  • Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам.
Синтаксис:
GuildMsgName <Regex> <Regex>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
GuildMsgName /(buff|bless)/ /Player to buff/
GuildMsgName /stop/ /GM/
Устанавливает значения переменных:
$.GuildMsgNameLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsgName
$.GuildMsgNameLastMsg => Запоминает само сообщение


GuildMsgNameDist
  • Описание: событие наступает при получении сообщения в чате гильдии, автомакрос сработает после проверки сообщения и имени игрока на соответствие заданным regexp-шаблонам, а также расстояния до игрока.
Синтаксис:
GuildMsgNameDist <Regex> <Regex> <Math condition operators>
Первый regexp-шаблон отвечает за проверку сообщения, а второй - за имя игрока.
Пример:
GuildMsgNameDist /(buff|bless)/ /Player to buff/ < 3
GuildMsgNameDist /stop/ /GM/ >= 4
Устанавливает значение переменной:
$.GuildMsgNameDistLastName => Запоминает имя игрока, сообщение от которого привело к срабатыванию события GuildMsgNameDist
$.GuildMsgNameDistLastMsg => Запоминает само сообщение
$.GuildMsgNameDistLastPos => Запоминает координаты игрока
$.GuildMsgNameDistLastDist => Запоминает расстояние до игрока
$.GuildMsgNameDistLastID => Запоминает опенкоровский номер игрока


NpcMsg
  • Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения на совпадение с regexp-шаблоном.
Синтаксис:
NpcMsg <Regex>
Пример:
NpcMsg /your return point was saved/
Устанавливает значения переменных:
$.NpcMsgLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsg
$.NpcMsgLastMsg => Запоминает само сообщение


NpcMsgDist
  • Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения на совпадение с regexp-шаблоном и проверки расстояния до неписи.
Синтаксис:
NpcMsgDist <Regex> <Math condition operators>
Пример:
NpcMsgDist /please come near to me/ > 5
Устанавливает значения переменных:
$.NpcMsgDistLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsgDist
$.NpcMsgDistLastMsg => Запоминает само сообщение
$.NpcMsgDistLastPos => Запоминает координаты неписи
$.NpcMsgDistLastDist => Запоминает расстояние до неписи
$.NpcMsgDistLastID => Запоминает опенкоровский номер неписи


NpcMsgName
  • Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения и имени неписи на совпадение с regexp-шаблонами.
Синтаксис:
NpcMsgName <Regex> <Regex>
Первый regexp-шаблон - для сообщения, а второй - для имени неписи
Пример:
NpcMsgName /You don't have zeny/ /kafra/
Устанавливает значения переменных:
$.NpcMsgNameLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsgName
$.NpcMsgNameLastMsg => Запоминает само сообщение


NpcMsgNameDist
  • Описание: событие наступает при получении сообщения от неписи, автомакрос сработает после проверки сообщения и имени неписи на совпадение с regexp-шаблонами, а также после проверки расстояния до неписи.
Синтаксис:
NpcMsgNameDist <Regex> <Regex> <Math condition operators>
Первый regexp-шаблон - для сообщения, а второй - для имени неписи
Пример:
NpcMsgNameDist /You need to be closer to punch me/ /punchable npc/ > 5
Устанавливает значение переменной:
$.NpcMsgNameDistLastName => Запоминает имя неписи, чьё сообщение привело к срабатыванию события NpcMsgNameDist
$.NpcMsgNameDistLastMsg => Запоминает само сообщение
$.NpcMsgNameDistLastPos => Запоминает координаты неписи
$.NpcMsgNameDistLastDist => Запоминает расстояние до неписи
$.NpcMsgNameDistLastID => Запоминает опенкоровский номер неписи


LocalMsg
  • Описание: событие наступает при получении местного оповещения, например при перелётах на дирижабле. Автомакрос сработает, если сообщение подойдёт к regexp-шаблону.
Синтаксис:
LocalMsg <Regex>
Пример:
LocalMsg /airship is arriving/
Устанавливает значение переменной:
$.LocalMsgLastMsg => Запоминает сообщение, которое привело к срабатыванию события LocalMsg


BusMsg
  • Описание: событие проверяет сообщения, поступающие по bus-шине. Автомакрос сработает, если сообщение совпадёт с regexp-шаблоном.
Синтаксис:
BusMsg <Regex>
Пример:
BusMsg /gm near/
Устанавливает значение переменной:
$.BusMsgLastMsg => Запоминает сообщение, которое привело к срабатыванию события BusMsg


MapLoaded
  • Описание: событие наступает каждый раз, когда сменяется локация персонажа, т.е. при телепортации и переходах на другую локацию. Автомакрос сработает, если персонаж попал на одну из локаций в указанном списке.
Синтаксис:
MapLoaded <список локаций, локации разделяются запятыми>
Вместо названия локации можно использовать переменную.
Пример:
MapLoaded prontra, geffen, gef_fild10
Устанавливает значение переменной:
$.MapLoadedLast => Запоминает название локации, которая привела к срабатыванию события MapLoaded


OnCharLogIn
  • Описание: событие наступает каждый раз, когда персонаж заходит в игру.
Синтаксис:
OnCharLogIn 1
Пример:
OnCharLogIn 1
Нет никаких переменных.


ZenyChanged
  • Описание: событие наступает всякий раз, когда у персонажа изменияется количество зени. Автомакрос сработает, если выполнится заданное условие.
  • Может работать с процентами, где 100% - это количество зени до изменения.
Синтаксис:
ZennyChanged <Math condition operators>
Пример:
ZennyChanged > 10%
ZennyChanged >= 1000
Устанавливает значения переменных:
$.ZennyChangedLastChange => Запоминает количество зени, которое привело к срабатыванию события ZennyChanged
$.ZennyChangedLastZennyAfter => Запоминает количество зени после срабатывания события, т.е. сколько зени есть на текущий момент


SimpleHookEvent
  • Описание: Событие наступает всякий раз, когда внутри openkore срабатывает заданный хук (т.е. опять же - событие).
Синтаксис:
SimpleHookEvent <hook name>
Пример:
SimpleHookEvent target_died
Все переменные события сохраняются в переменных вида:
$.SimpleHookEventLast<capitalized variable name>
Пример:
$.SimpleHookEventLastMonster => идентификатор моба из хука target_died

Приложения

Операторы сравнения

(<|<=|=|==|!=|!|>=|>|)\s*($number_qr%?|$general_wider_variable_qr)(?:\s*\.\.\s*($number_qr%?|$general_wider_variable_qr))

Оператор Описание Пример
< <value> меньше чем <value> < 50
> <value> больше чем <value> > 20
<= <value> меньше либо равно <value> <= 10
>= <value> больше либо равно <value> >= 25
= <value> | == <value> | <value> равно <value> = 150 | == 150 | 150
!= <value> | ! <value> не равно <value> ! 1000 | != 1000
<value1>..<value2> в диапазоне от <value1> до <value2> 20..80
  • Примечание: <value> может быть числом или переменной.

Примеры:

Math_condition >= 50 # условие истинно, если величина больше либо равна 50
Math_condition < $variable # условие истинно, если величина меньше, чем переменная $variable
  • Примечание: <value> может быть процентной величиной (переменная тоже может хранить проценты).

Примеры:

Math_condition <= 10% # меньше либо равно 10%
Math_condition != $variable # в переменной $variable может быть '50%'

Regex

Про регулярные выражения, т.е. regexp, можно почитать тут: regexp tutorial
Имейте в виду, что regex в условиях умеют работать со всеми типами переменных

Подпрограммы Perl

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

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

macro sub {
    $list = Orange, Milk, Soya, Peach
    if (existsInList("$list", "PeAch")) goto ok 
    log Not Match!!!; stop
    :ok
    log Match!!!
    $x = &eval(existsInList("$list", "PeAch"))
    log \$x = $x   # $x here is 1
}
sub existsInList {
    my ($list, $val) = @_;
    return 0 if ($val eq "");
    my @array = split / *, */, $list;
    $val = lc($val);
    foreach (@array) {
        s/^\s+//;
        s/\s+$//;
        s/\s+/ /g;
        next if $_ eq "";
        return 1 if lc eq $val;
    }
    return 0;
}


Во втором примере приводится подпрограмма rewrite. В её задачу входит чтение и перезапись файла mon_control.txt.

automacro confHP1 {
    CurrentHP > 85%
    exclusive 1
    run-once 1
    call {
        $setting = Demon Pungus #becareful on your case, its case sensitive
        $attack = 1
        $teleport = 0
        $telesearch = 1
        call HP
    }
}

automacro confHP2 {
    CurrentHP < 75%
    exclusive 1
    run-once 1
    call {
        $setting = Demon Pungus #becareful on your case, its case sensitive
        $attack = 1
        $teleport = 2
        $telesearch = 1
        call HP
    }
}

macro HP {
    #Getting the value of the $setting monster name Ex: $setting $exist1 $exist2 $exist3
    $exist1 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{attack_auto}:"None")
    $exist2 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_auto}:"None")
    $exist3 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_search}:"None")
    log Old Values are $setting $exist1 $exist2 $exist3
    log Changing the values to $setting $attack $teleport $telesearch
    do eval Misc::mon_control("$::Macro::Data::varStack{setting}")->{attack_auto} = $attack; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_auto} = $teleport; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_search} = $telesearch
    log Writting mon_control.txt with new values
    rewrite()  # see the sub-routine function below
    log Reloading mon_control.txt
    do reload mon_control
    $exist1 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{attack_auto}:"None")
    $exist2 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_auto}:"None")
    $exist3 = &eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_search}:"None")
    log New mon_control.txt Setting: $setting $exist1 $exist2 $exist3
    log Macro done
    #if $teleport = 0 ; means the Higher automacro HP is currently triggered
    #if $teleport = 2 ; means the Lower automacro HP is currently triggered
    if ($teleport < 2) goto releaseHighHp
    :releaseLowHp
        release confHP1
        stop
    :releaseHighHp
        release confHP2
        stop
}

sub rewrite {
    my $monster = Misc::mon_control("$::Macro::Data::varStack{setting}");
    my @lines = ();
    if (open(FILE, "<:utf8", Settings::getControlFilename("mon_control.txt"))) {
        while (<FILE>) {
            s/\x{FEFF}//g; chomp;
            if (/^#/ || /^\n/ || /^\r/) {
                push @lines,$_;
                next
            }
            /^(\d+|([a-zA-Z' ]+)*) -?\d/;
            if ("$::Macro::Data::varStack{setting}" eq $1 && defined $monster) {
                $_ = $1; s/\s+$//;
                push(@lines, ($_ . " $monster->{attack_auto} $monster->{teleport_auto} $monster->{teleport_search} $monster->{attack_lvl} $monster->{attack_jlvl} $monster->{attack_hp} $monster->{attack_sp} $monster->{weight}"));
            } else {
                push(@lines, $_);
            }
        }
        close FILE
    }
    open(FILE, ">:utf8", Settings::getControlFilename("mon_control.txt"));
    print FILE join "\n", @lines;
    close FILE;
}

Комментарии

В макросах можно оставлять комментарии, т.е. это заметки для человека, плагин eventMacro не будет обращать на этот текст внимания.

  • Если в начале строки стоит #, то вся строка - комментарий.
  • Если в середине строки стоит пробел и #, то вся остальная строка тоже будет комментарием.
macro happy {
    #данная строка целиком - комментарий
    log Всё хорошо # это тоже комментарий
}

На консоль будет выведено:

[eventmacro log] Всё хорошо

Примеры с пояснениями

Я предполагаю, что вы уже умеете пользоваться консольными командами и понимаете, как они работают. Если это не так, то пробегитесь по разделу консольные команды и попробуйте например a, ai, move, cart get, storage add, talk, deal, take, sl, sm, relog, pm и т.д.

Держите под рукой документацию на консольные команды, чтобы обращаться к ней по ходу дела.

Итак, есть два вида блоков Okay, so there are 2 types of blocks

  1. автомакросы – срабатывают автоматически
  2. макросы – не срабатывают автоматически, их надо вызывать руками из консоли или вызывать из автомакроса


Автомакросы

Автомакросы срабатывают автоматически, когда выполняется ряд условий. Прямо как блоки в config.txt срабатывают в зависимости от описанных в них условий.

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

automacro <НазваниеАвтомакроса> {
        Первое условие
        Второе условие
        и т.д.
        …...
        call {
                Команда 1
                Команда 2
                и т.д.
                …..
        }
        timeout <n секунды> #(по желанию)
}

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

automacro sp {
   CurrentSP < 200
   timeout 10
   call {
      do c мало маны
   }
}


Давайте разберём автомакрос строка за строкой:

  1. automacro sp { - сначала надо объявить автомакрос, написав ключевое слово automacro, потом дать автомакросу название, в данном случае “sp”. Затем идёт открывающая фигурная скобка “{“, с которой начинается тело автомакроса.
  2. CurrentSP < 200 – в теле необходимо записать условия срабатывания автомакроса, по одному на каждой строке. В данном примере у нас есть только одно условие; данное выражение истинно, когда количество маны у персонажа опустится ниже двухсот единиц.
  3. timeout 10 – данное выражение - это не условие и не команда, а параметр. Он работает также, как и в обычных блоках в конфиге, то есть не даёт срабатывать автомакросу в течение следующих десяти секунд с последнего раза. Я всегда использую timeout, чтобы автомакросы не запускались раз за разом, если я напутал в условиях.
  4. call { – ключевое слово “call” определяет, что произойдёт, когда сработает автомакрос. После открывающей фигурной скобки “{“ нужно будет написать команды.
  5. do c мало маны – тут идёт собственно макрокоманда “do”, которая в данном случае вызывает консольную команду “c”, чтобы написать в чат, что у бота осталось мало маны.
  6. } – эта фигурная скобка закрывает блок с командами.
  7. } – вторая фигурная скобка закрывает тело автомакроса.

Короче говоря, если у бота будет меньше 200 единиц маны, он напишет в чат “мало маны”. Таким образом бот станет чуть больше походить на человека =p.


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

automacro strip {
   StatusActiveHandle EFST_NOEQUIPWEAPON
   timeout 10
   call {
      do tele
      do relog 10
   }
}


Разберём данный пример.

  1. automacro strip { - объявляем автомакрос "strip", после '{' начнётся описание автомакроса.
  2. StatusActiveHandle EFST_NOEQUIPWEAPON - единственное условие автомакроса, которое пробегается по списку статусов персонажа в поиске "EFST_NOEQUIPWEAPON". Данный статус накладывается, когда металлинг выбивает оружие у бота из рук.
  3. timeout 10 - обезопасим себя от слишком частого срабатывания автомакроса. Десяти секунд будет достаточно, чтобы описанный далее макрос успел полностью отработать.
  4. call { - после ключевого слова "call" и фигурной скобки "{" пойдут команды.
  5. do tele - макрокоманда "do" запускает консольную команду "tele", чтобы сбежать от металлинга телепортом, чтобы не помереть от него безоружным.
  6. do relog 10 - данная команда говорит боту перезайти в игру, потому что после захода в игру статус "strip weapon" пропадёт.
  7. } - первая фигурная скобка '}' закрывает блок с командами.
  8. } - вторая фигурная скобка '}' закрывает описание автомакроса.

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


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

automacro warp {
    InMap gef_fild07
    InInventory "Blue Gemstone" > 0
    timeout 20
    call {
        do ai manual
        pause 1
        do move 319 187
        do sl 27 316 188
        pause 2
        do warp 1
        pause 1
        do move 316 188
        do ai on
    }
}


Итак, давайте посмотрим:

  1. automacro warp { - объявляем автомакрос "warp", после фигурной скобки “{“ начинается описание собственно автомакроса.
  2. InMap get_fild07 - первое условие, автомакрос сработает только на локе слева от Геффена, т.е. на gef_fild07.
  3. InInventory “Blue Gemstone” > 0 - второе условие проверяет, что в инвентаре есть необходимый для вызова варп-портала расходник. Было бы неплохо прописать в конфиге getAuto для синих камней.
  4. timeout 20 - на всякий случай, чтобы автомакрос не срабатывал каждую секунду. Двадцати секунд должно быть достаточно для выполнения команд макроса, чтобы автомакрос не сработал повторно, перебивая таким образом последовательность команд макроса.
  5. call { - команды макроса начнутся со следующей строки.
  6. do ai manual - данной командой openkore переводится в ручной режим, я часто так делаю в длинных и сложных макросах, чтобы openkore своим автоматическим поведением не помешала выполнению команд. В данном случае команда нужна, чтобы бот не шел дальше.
  7. pause 1 - очень важно расставлять паузы, чтобы команды точно успели отработать и не помешали друг другу.
  8. do move 319 187 - консольная команда "move" отправит бота по указанным координатам.
  9. do sl 27 316 188 - консольной командой "sl" будет вызван варп-портал недалеко от бота, в данном случае по координатам (316,188).
  10. pause 2 - очень важно дать пару секунд времени на вызов портала, если у приста мало dex, то паузу стоит увеличить.
  11. do warp 1 - консольной командой "warp" выбираем из списка пункт назначения под номером один.
  12. pause 1 - одна секунда задержки на создание портала.
  13. do move 316 188 - заходим в портал, персонаж варпнулся на нужную локацию.
  14. do ai on - в конце макроса включаем автоматический режим openkore обратно.
  15. } - первая фигурная скобка закрывает блок команд.
  16. } - вторая фигурная скобка закрывает автомакрос.

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


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

Плагин eventMacro предоставляет много встроенных переменных. Например в переменной $.pos лежат координаты персонажа. Давайте посмотрим, как можно извлечь из нее отдельно координаты x и y.

Итак, в переменной $.pos лежат координаты персонажа. А вот так можно достать из неё x и y:

  $px = &arg ("$.pos", 1)
  $py = &arg ("$.pos", 2)

Где координата x стоит на первом месте в $.pos, поэтому пишем '1'. Соответственно координата y стоит на втором месте в $.pos, поэтому для неё нужна цифра '2'.

Второй похожий пример. Если в автомакросе есть условие “MobNear”, то в макросе будет переменная $.MobNearLastPos с координатами моба. Чтобы достать оттуда отдельно координаты x и y повторим уже описанный выше приём:

  $mx = &arg ("$.MobNearLastPos", 1)
  $my = &arg ("$.MobNearLastPos", 2)

"run-once"

Часто вместо параметра timeout используют run-once 1, который даёт автомакросу сработать только один раз, после чего автомакрос блокируется. Если же требуется автомакрос разблокировать, то для этого есть соответствующая команда. Однако по необъяснимой причине бывает так, что макрос зависает и команда на разблокирование автомакроса не срабатывает. В итоге автомакрос как был заблокирован, так и остался. Чтобы избежать данной неприятности используйте лучше timeout.

Как написать макрос

Пусть у вас появилось желание написать макрос, попробуйте данный алгоритм:

  • Уточните условия срабатывания автомакроса. Запишите их в теле автомакроса.
  • Шаг за шагом продумайте, какие действия должен совершить бот, чтобы достигнуть результата. Запишите команды в call { ... }.
  • Расставьте между командами макроса необходимые паузы.
  • Используйте в автомакросе timeout или run-once, чтобы предотвратить немедленное повторное срабатывание автомакроса.
  • Код автомакроса сохраниете в файле eventMacros.txt, запустите бота или если он уже запущен, перечитайте файл. Если в коде закралась синтаксическая ошибка, например вы забыли написать "}", то вы получите сообщение об ошибке и макрос не сработает. Найдите и исправьте ошибку, перечитайте файл eventMacros.txt. При наступлении условий автомакрос сработает и выполнит код.

Собрание макросов

Я бы хотел поделиться парочкой полезных макросов, надеюсь никто не против.

Определение предметов при помощи увеличительного стекла

Пусть у вас в инвентаре лежит неопределённая экипировка и вы хотите её распознать, используя для этого увеличительные стекла. Введите в консоли команду "eventMacro id", чтобы распознать один предмет. Вводите команду столько раз, сколько потребуется, чтобы распознать все. Вам не нужно указывать, какой предмет распознавать. Макрос возьмёт первый попавшийся.

macro id {
    $id = &inventory(Magnifier)
    do is $id
    pause 1
    do identify 0
}

Обогащение руды (Ori / Elu)

Макрос ref отправит бота в кузнецу Пронтеры и будет до упора обменивать пять единиц руды на один металл Ori / Elu. Возможно у вас есть идеи, как улучшить макрос?

Чтобы запустить макрос введите eventMacro ref. Чтобы прервать выполнение макроса введите eventMacro stop.

macro ref {
    do move prt_in 59 60
    call ref-while
}

macro ref-while {
    log start refining with
    $ori = &invamount(Rough Oridecon)
    $elu = &invamount(Rough Elunium)
    log I have $ori Rough Oridecons
    log I have $elu Rough Eluniums
    while (&invamount(Rough Oridecon) > 4) {
        do talk 0 # примечание переводчика: а мы точно попадём на нужную непись?
        pause 0.8
        do talk resp 0
        call ref-while # примечание переводчика: а это точно нужно? Зачем рекурсия из цикла?
    }
    while (&inventory(Rough Elunium) > 4) {
        do talk 0
        pause 0.8
        do talk resp 1
        call ref-while
    }
    stop # примечание переводчика: а это точно нужно? Зачем останавливать макрос, ведь это и так последняя строка?
}

FAQ

Меня отключило от сервера локации, когда я запустил макрос. В чем дело?
Команды макроса отправлялись слишком быстро. Увеличьте macro_delay или расставьте паузы между командами


У меня проблемы в кодировкой UTF-8. В чем дело?
Данная ошибка всплывает, когда файл eventMacros.txt сохранён в отличной от UTF-8 кодировке.
Откройте файл eventMacros.txt программой Notepad и при сохранении надо выбрать кодировку UTF-8. (Если не помогло - не используйте Notepad.)
Откройте файл eventMacros.txt программой Notepad++, в главном меню надо выбрать Format > UTF-8 (without BOM) и сохранить файл.

Авторы-программисты

Henrybk написал плагин eventMacro.
Предком плагина eventMacro был macro-плагин, его написал arachno, затем руку приложили ezza, daigaku, keplerbr, eternalhavest и technologyguild.
emjustin протестировал eventMacro.
allanon придумал и запрограммировал некоторые весьма важные функции плагина eventMacro.