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

Материал из Руководство по OpenKore
Перейти к навигации Перейти к поиску
начинаем переводить статью про макро-плагин
 
Нет описания правки
 
(не показано 37 промежуточных версий 2 участников)
Строка 1: Строка 1:
С этим плагином Вы сможете написать последовательность команд (макросов), которые бот будет выполнять вручную или в зависимости от ситуации (условия). Последняя версия - 2.0.3.
С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли OpenKore или настроить автоматическое срабатываниe макроса в зависимости от некоторых условий при помощи автомакроса. Последняя версия макро-плагина - 2.0.3.
 


== Установка ==
== Установка ==
* Скачайте Macro plugin. Вы можете взять его [http://bibian.ath.cx/?file=macro.tar.gz тут] или из [[SVN]].
* Скачайте Macro plugin: [http://openkore.svn.sourceforge.net/viewvc/openkore/plugins/macro/trunk/?view=tar openkore-trunk.tar.gz].
* Перейдите в папку OpenKore (''которая содержит файл openkore.pl'') и создайте новую папку '''plugins''', если её ещё там нет.  
* Перейдите в папку OpenKore (''которая содержит файл openkore.pl'') и создайте новую папку '''plugins''', если её ещё там нет.  
* В архиве с макро-плагином вы найдёте файл '''macro.pl''' и папку '''Macro'''. Распакуйте их в папку с плагинами - plugins.  
* В архиве с макро-плагином вы найдёте файл '''macro.pl''' и папку '''Macro'''. Распакуйте их в папку с плагинами - plugins.  
Строка 27: Строка 28:


== Консольные команды ==
== Консольные команды ==
=== Синтаксис ===
Макро-плагин регистрирует одну-единственну консольную команду - '''macro'''. При помощи команды '''macro''' можно запускать макрос на выполнение, а также управлять выполнением макроса.
=== Запуск макроса ===
Далее приведен синтаксис команды macro в случае запуска макроса на выполнение.
  macro <имямакроса> [опции] [-- параметр(ы)]
  macro <имямакроса> [опции] [-- параметр(ы)]


Запускает макрос <имямакроса>.
Запускает макрос <имямакроса>.


Опции
'''Опции'''
{| class="wikitable" border="1" cellspacing="0"
{| class="wikitable" border="1" cellspacing="0"
|-style=background-color:#F9F9F9;
|-style=background-color:#F9F9F9;
Строка 61: Строка 63:
|}
|}


Параметры
'''Параметры'''
Параметры для макроса определяются после двойного тире (--). Эти параметры будут доступны в теле макроса через переменные $.param1, $.param2 и т.д. Например:
Параметры для макроса определяются после двойного тире (--). Эти параметры будут доступны в теле макроса через переменные $.param1, $.param2 и т.д. Например:
  macro foo {
  macro foo {
   log Parameter 1 is $.param1
   log Parameter 1 is $.param1
   log Parameter 2 is $.param2
   log Parameter 2 is $.param2
  }
  }


Если набрать в консоли '''''macro foo -- foo bar''''' то макрос выведет
Если набрать в консоли '''''macro foo -- foo bar''''' то макрос выведет
Строка 76: Строка 75:
  [macro] Parameter 2 is bar
  [macro] Parameter 2 is bar


Консольные команды
=== Управление макросом ===
; macro list
; macro list
: Показывает список всех доступных макросов.
: Показывает список всех доступных макросов.
Строка 90: Строка 89:


; macro version
; macro version
: Выводит на экран версию макроплагина.
: Выводит на экран версию макро-плагина.


; macro reset [<''имямакроса''(''ов'')>]
; macro reset [<''имямакроса''(''ов'')>]
Строка 97: Строка 96:
; macro status
; macro status
: Показывает запущен ли какой-лиюо макрос в настоящее время. Если макрос запущен, то показывает:
: Показывает запущен ли какой-лиюо макрос в настоящее время. Если макрос запущен, то показывает:
status: running << запущен
status: running << запущен
delay: 10s << задержка перед следующей командой
delay: 10s << задержка перед следующей командой
line: 3 << текущая строка макроса
line: 3 << текущая строка макроса
override AI: no << настройка опции "-overrideAI"
override AI: no << настройка опции "-overrideAI"
paused: no << поставлен ли марос на паузу
paused: no << поставлен ли марос на паузу
finished: no << закончен ли макрос
finished: no << закончен ли макрос
; macro varstack
: Показать все переменные, используемые macro-плагином ([[macro#Специальные_переменные|специальные]] или [[macro#Работа_с_переменными|пользовательские]]).


== Конфигурационные файлы ==
== Конфигурационные файлы ==
; control/macros.txt
; control/macros.txt
: Пишите ваши макросы и автомакросы в этом файле. Вы можете изменить имя файла в параметре конфига ''macro_file''. Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать первую строчку знаком #.
: Пишите ваши макросы и автомакросы в этом файле. Вы можете изменить имя файла в параметре конфига ''macro_file''. Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать первую строчку знаком #.
Строка 136: Строка 137:
|}
|}


== Синтаксис макроса ==
 
== Макрос ==
  macro MacroName {
  macro MacroName {
     do this..
     do this..
Строка 142: Строка 144:
     yattayatta..
     yattayatta..
  }
  }
Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Все консольные команды Openkore могут быть использованы в макросе - [[Console Commands]].
Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Команды в макросе выполняются по порядку сверху вниз. Чтобы вызвать в теле макроса [[:Category:Console Command|консольную команду]], следует использовать команду macro-плагина do <''консольная команда''>.


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


  macro foo {
  macro foo {
Строка 153: Строка 154:
     do c hello world
     do c hello world
  }
  }


; log <''текст''>
; log <''текст''>
: Выводит <''текст''> на консоль.
: Выводит <''текст''> на консоль. В тексте можно использовать переменные макро-плагина, типа $variable, а также специальные ключевые слова, типа @config, @rand и т.д.
 
  macro foo {
  macro foo {
   log This line logs a text to console.
   log This line logs a text to console.
   log All your base are belong to us!
   log All your base are belong to us!
  }
  }


; pause [<''n''>]  
; pause [<''n''>]  
: Останавливает макрос на '''n''' секунд.
: Останавливает макрос на '''n''' секунд.
  macro foo {
  macro foo {
     log It's 10:00:00
     log It's 10:00:00
Строка 173: Строка 170:
     log 10 seconds have passed after the first print.
     log 10 seconds have passed after the first print.
  }
  }


; call <''имямакроса''> [<''n''>]  
; call <''имямакроса''> [<''n''>]  
: Вызывает макрос с именем <имямакроса> <n> раз (n – целое число). Когда макрос <имямакроса> закончится, то текущий макрос продолжит работу.
: Вызывает макрос с именем <имямакроса> <n> раз (n – целое число). Когда макрос <имямакроса> закончится, то текущий макрос продолжит работу.


; release (<''имяавтомакроса''> | all)
; release (<''имяавтомакроса''> | all)
: Освобождает закрытый автомакрос, позволяя ему еще раз сработать, если выполнятся условия его срабатывания. Автомакрос мог быть закрыт условием "run-once 1" или командой "lock <''имяавтомакроса''>". Команда release all освобождает все закрытые в данный момент автомакросы.
: Освобождает закрытый автомакрос, позволяя ему еще раз сработать, если выполнятся условия его срабатывания. Автомакрос мог быть закрыт условием "run-once 1" или командой "lock <''имяавтомакроса''>". Команда release all освобождает все закрытые в данный момент автомакросы.


; lock (<''имяавтомакроса''> | all)
; lock (<''имяавтомакроса''> | all)
: Закрывает автомакрос <''имяавтомакроса''> и выключает проверку условий срабатывания, не позволяя таким образом ему выполнится. Команда lock all закрывает все автомакросы.
: Закрывает автомакрос <''имяавтомакроса''> и выключает проверку условий срабатывания, не позволяя таким образом ему выполнится. Команда lock all закрывает все автомакросы.


; stop
; stop
: Немедленно прерывает выполнение текущего макроса.
: Немедленно прерывает выполнение текущего макроса.


; set <''опция''> <''значение''>
; set <''опция''> <''значение''>
Строка 200: Строка 192:




=== Создание и работа с переменными ===
== Работа с переменными ==
Вы можете создать и работать со своими собственными переменными в теле макроса. Имя переменной начинается со знака доллара "$" и может содержать латинские буквы и цифры.
Вы можете аботать со своими собственными переменными в теле макроса. Имя переменной начинается со знака доллара "$" и может содержать латинские буквы и цифры. Специально описывать переменную не надо. Достаточно лишь присвоить ей значение. Все переменные макроплагина - глобальные и доступны из любого места.
Чтобы создать переменную или присвоить ей новое значение, используйте операцию присваивания:
 
Присвоить переменной значение:
$<имя переменной> = <значение>
$<имя переменной> = <значение>
Чтобы обратиться к значению переменной, надо написать её имя, например ''$variable''.


Получить значение переменной:
$<имя переменной>
Пример:
  macro Hello {
  macro Hello {
     $var = Hello
     $var = Hello
Строка 213: Строка 209:


На консоль выведется сообщение:
На консоль выведется сообщение:
  [log] Hello World!
  [log] Hello World!


Если командой log вы хотите вывести символ доллара "$", то вам следует использовать символ обратная косая черта "\". Например так "\$":
Если командой log вы хотите вывести символ доллара "$", то вам следует использовать символ обратная косая черта "\". Например так "\$":
  macro money {
  macro money {
     log I have a lot of \$
     log I have a lot of \$
  }
  }


 
Для увеличения или уменьшения значения переменной на 1, используйте: $<имяпеременной>++ или $<имяпеременной>--
Для увеличения или уменьшения значения переменной на 1, используйте:
$<имяпеременной>++ или $<имяпеременной>--
 
  macro Counter {
  macro Counter {
     $counter = 0
     $counter = 0
Строка 248: Строка 237:
  log \$x now vanished: $x
  log \$x now vanished: $x
   
   
Для складывания двух переменных, а также для других операций над переменными следует использовать  ''''' @eval ''''', например:  
Для скложения двух переменных, а также для других операций над переменными следует использовать  ''''' @eval ''''', например:  
 
  macro math {
  macro math {
     $num = 2
     $num = 2
     $num2 = 3
     $num2 = 3
     $result = @eval($num+$num2)
     $result = @eval($num+$num2)
     log $num + $num2 = $result
     log Сумма чисел $num и $num2 равна $result
  }
  }


На консоли выведется:
На консоли выведется:
  log 2 + 3 = 5
  log Сумма чисел 2 и 3 равна 5
 
 
Можно использовать @eval внутри другого @eval, например:
 
macro math {
    $num = 2
    $num2 = 3
    $result = @eval(@eval($num+$num2) - @eval($num+$num2))
    log ($num + $num2) - ($num + $num2) = $result
}
 
 
{| class="wikitable" border="1" cellspacing="0"
|-style=background-color:#F9F9F9;
! Оператор
! Описание
|-
|align=center| +
|align=center| Сложение
|-
|align=center| -
|align=center| Вычитание
|-
|align=center| *
|align=center| Умножение
|-
|align=center| /
|align=center| Деление
|}


Допустим, переменной $list присвоено значение - строка, слова, разделенные запятыми.
Допустим, переменной $list присвоено значение - строка, слова, разделенные запятыми.
Тогда из этой строки можно сделать список слов, разделенных запятыми. После этого можно узнать первый элемент списка, как в следующем примере:
Тогда из этой строки можно сделать список слов, разделенных запятыми. После этого можно узнать первый элемент списка, как в следующем примере:
  macro foo {
  macro foo {
   $list = banana, apple, strawberry, grape
   $list = banana, apple, strawberry, grape
Строка 300: Строка 258:


На консоли выведется:
На консоли выведется:
  log The first element from $list is Banana
  log The first element from $list is banana
  log $list contains apple, strawberry, grape
  log Now $list contains apple, strawberry, grape


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


'''''Напоминание:''''' Имена переменных состоят лишь из латинских букв и цифр.
'''''Напоминание:''''' Имена переменных состоят лишь из латинских букв и цифр.


== Вложенные переменные ==
== Вложенные переменные ==
Можно создать "динамические" или так называемые "вложенные переменные". То есть имя одной и той же переменной может изменяться на протяжении макроса.  
Можно создать "динамические" или так называемые "вложенные переменные". То есть имя одной и той же переменной может изменяться на протяжении макроса.  
Например, обычная переменная выглядит так:
Например, обычная переменная выглядит так:
$a = "hello"
$a = "hello"
А вот так выглядит вложенная переменная:
А вот так выглядит вложенная переменная:
${$a} = "world"
${$a} = "world"
Здесь $a хранит в себе имя вложенной переменной. Т.е. вложенной переменной с именем hello присвоено значение world.
Здесь $a хранит в себе имя вложенной переменной. Т.е. вложенной переменной с именем hello присвоено значение world.


Строка 322: Строка 282:


На консоль выведется:
На консоль выведется:
  log Camila lives on Brazil
  log Camila lives on Brazil


Пример 2:
Пример 2:
macro hh {
$var = foo
log $var
${$var} = bar
log ${$var}
   
   
macro hh {
log Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20.
$var = foo
$i = 0
log $var
:zikl
${$var} = bar
$i++
log ${$var}
${$i} = @rand(1,20)
 
log $i ${$i}
log Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20.
if ($i < 10) goto zikl
$i = 0
:zikl
log Выводим элементы массива и их значения задом наперед.
$i++
$i = 11
${$i} = @rand(1,20)
:zikl2
log $i ${$i}
$i--
if ($i < 10) goto zikl
log $i ${$i}
if ($i > 1) goto zikl2
log Выводим элементы массива и их значения задом наперед.
}
$i = 11
:zikl2
$i--
log $i ${$i}
if ($i > 1) goto zikl2
 
}


На консоль выведется:  
На консоль выведется:  
[macro log] foo
[macro log] bar
[macro log] Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20.
[macro log] 1 19
[macro log] 2 19
[macro log] 3 20
[macro log] 4 20
[macro log] 5 4
[macro log] 6 6
[macro log] 7 20
[macro log] 8 8
[macro log] 9 13
[macro log] 10 9
[macro log] Выводим элементы массива и их значения задом наперед.
[macro log] 10 9
[macro log] 9 13
[macro log] 8 8
[macro log] 7 20
[macro log] 6 6
[macro log] 5 4
[macro log] 4 20
[macro log] 3 20
[macro log] 2 19
[macro log] 1 19


[macro log] foo
[macro log] bar
[macro log] Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20.
[macro log] 1 19
[macro log] 2 19
[macro log] 3 20
[macro log] 4 20
[macro log] 5 4
[macro log] 6 6
[macro log] 7 20
[macro log] 8 8
[macro log] 9 13
[macro log] 10 9
[macro log] Выводим элементы массива и их значения задом наперед.
[macro log] 10 9
[macro log] 9 13
[macro log] 8 8
[macro log] 7 20
[macro log] 6 6
[macro log] 5 4
[macro log] 4 20
[macro log] 3 20
[macro log] 2 19
[macro log] 1 19


 
== Специальные переменные ==
== Специальные переменные ==  
Есть специальные предопределенные макро-плагином переменные, их имена начинаются с символов доллара и точки: "$.". Они доступны только на чтение.
Есть специальные предопределенные макро-плагином переменные, их имена начинаются с символов доллара и точки: "$.". Они доступны только на чтение.


Строка 395: Строка 351:
:* $.zeny - зеньги
:* $.zeny - зеньги
:* $.status - список статусов персонажа, через запятую
:* $.status - список статусов персонажа, через запятую
:* $.paramN - параметры, с которым был запущен макрос из консоли OpenKore (смотри [[Macro plugin#Commands|Commands]])
:* $.paramN - параметры, с которым был запущен макрос из консоли OpenKore (смотри [[Макро-плагин#Консольные_команды|Консольные команды]])
:* $.caller - имя сработавшего автомакроса, который запустил на выполнение текущий макрос
:* $.caller - имя сработавшего автомакроса, который запустил на выполнение текущий макрос
:* $.weight - вес инвентаря персонажа
:* $.weight - вес инвентаря персонажа
:* $.maxweight - максимальная грузоподъемность персонажа
:* $.maxweight - максимальная грузоподъемность персонажа


== Специальные ключевые слова ==
== Специальные ключевые слова ==
Строка 435: Строка 392:
; @player (<''name''>)
; @player (<''name''>)
: Возвращает ID игрока <''name''>. Если игрока <''name''> не видно, возвращает -1.
: Возвращает ID игрока <''name''>. Если игрока <''name''> не видно, возвращает -1.
; @monster (<''name|ID''>)
: Возвращает ID моба <''name|ID''>. Если моба <''name|ID''> не видно, возвращает -1.


; @vender (<''name''>)
; @vender (<''name''>)
Строка 452: Строка 412:


; @eval (<''argument''>)
; @eval (<''argument''>)
: Оценивает, вычисляет значение аргумента <''argument''>. Например, если "$v = 8", то результатом оператора "@eval ($v + 2)" будет число 10.
: Оценивает, вычисляет значение аргумента <''argument''>. Например, если "$v = 8", то результатом оператора "@eval ($v + 2)" будет число 10. ''Содержимое @eval - это выражение на языке Perl, и это выражение не имеет ничего общего с синтаксисом макроплагина. Разве что тут можно использовать переменные макроплагина вида $var и подстановки типа @npc''.
 


; @arg ("<''argument''>", <''n''>)
; @arg ("<''argument''>", <''n''>)
Строка 471: Строка 430:


; @nick (<''word''>)
; @nick (<''word''>)
: Escapes all the regexp metacharacters and some of the perl special characters with '''\''' (a backslash). Especially for player's name.
: Экранирует все метасимволы regexp и некоторые специальные символы perl с помощью '''\''' (обратный слэш). Придуман специально для экранирования некоторых имён персонажей. Например строчка
[S] Namrok кричит: продам 'девственность каи', "шутка"
будет преобразована в:
\[S\]\ Namrok\ кричит:\ продам\ \'девственность\ каи\',\ \"шутка\"


== Цепочка команд ==
== Цепочка команд ==
Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками '''[''' и ''']'''.
Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками '''[''' и ''']'''.
  0 macro foo {
  0 macro foo {
  1  do whatever
  1  do whatever
Строка 494: Строка 455:


Пример:
Пример:
  macro foo {
  macro foo {
     $i = 1; pause 5; log \$i = $i; $ii = 2; $iii = 3; $i++; $ii--; lock automacroName; release automacroName; set overrideAI 1
     $i = 1; pause 5; log \$i = $i; $ii = 2; $iii = 3; $i++; $ii--; lock automacroName; release automacroName; set overrideAI 1
Строка 500: Строка 460:


Разделенные точкой с запятой "''';'''" команды не будут иметь задержки, совсем прям как в цепочке команд, за исключением некоторых команд, таких как '''pause''' и '''log'''.
Разделенные точкой с запятой "''';'''" команды не будут иметь задержки, совсем прям как в цепочке команд, за исключением некоторых команд, таких как '''pause''' и '''log'''.


== Условия ==
== Условия ==
В макросах (например в операторе if) можно использовать следующие условия:
В макросах (например в операторе if) можно использовать следующие условия:
< меньше чем ...
<= меньше либо равно
== равно
> больше чем ...
>= больше или равно
!= не равно
~ содержится (<левая переменная> это элемент <правой переменной>, здесь правая переменная представляет собой лист переменных (см. пункт 6.1)


{| class="wikitable" border="1" cellspacing="0"
{| class="wikitable" border="1" cellspacing="0"
Строка 523: Строка 476:
|align=center| меньше либо равно
|align=center| меньше либо равно
|-
|-
|align=center| ==
|align=center| = или ==
|align=center| равно
|align=center| равно
|-
|-
Строка 539: Строка 492:
|-
|-
|align=center| =~
|align=center| =~
|align=center| проверяет регулярное выражение regexp. Подробнее: [http://forums.openkore.com/viewtopic.php?f=32&t=966&start=73 ''Forums'']
|align=center| <леваячасть> подпадает под [http://perldoc.perl.org/perlre.html регулярное выражение - regexp] из <праваячасть>. Подробнее: [http://forums.openkore.com/viewtopic.php?f=32&t=966&start=73 ''Forums'']
|-
|-
|align=center| arg .. arg2
|align=center| arg .. arg2
Строка 552: Строка 505:


==== Синтаксис оператора IF ====
==== Синтаксис оператора IF ====
Можно использовать простое выражение;
Можно использовать простое выражение:
  if (arg1 <[[Macro plugin#Conditions|Conditions]]> arg2) (goto <label> | call <macro> [<n>] | stop)
  if (arg1 <[[macro#Условия|условие]]> arg2) (goto <label> | call <macro> [<n>] | stop)


Можно использовать простое выражение с уловием '''OR''';
Можно использовать простое выражение с уловием '''OR''':
  if (arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 || arg3 <[[Macro plugin#Conditions|Conditions]]> arg4) (goto <label> | call <macro> <n> | stop)
  if (arg1 <[[macro#Условия|условие]]> arg2 || arg3 <[[macro#Условия|условие]]> arg4) (goto <label> | call <macro> <n> | stop)


Можно использовать простое выражение с уловием '''AND''';
Можно использовать простое выражение с уловием '''AND''':
  if (arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 && arg3 <[[Macro plugin#Conditions|Conditions]]> arg4) (goto <label> | call <macro> <n> | stop)
  if (arg1 <[[macro#Условия|условие]]> arg2 && arg3 <[[macro#Условия|условие]]> arg4) (goto <label> | call <macro> <n> | stop)


Можно использовать простое выражение с обоими условиями '''OR''' и '''AND''';
Можно использовать простое выражение с обоими условиями '''OR''' и '''AND''':
  if ((arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 || arg3 <[[Macro plugin#Conditions|Conditions]]> arg4) && arg5 <[[Macro plugin#Conditions|Conditions]]> arg6) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[macro#Условия|условие]]> arg2 || arg3 <[[macro#Условия|условие]]> arg4) && arg5 <[[macro#Условия|условие]]> arg6) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 && arg3 <[[Macro plugin#Conditions|Conditions]]> arg4) || arg5 <[[Macro plugin#Conditions|Conditions]]> arg6) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[macro#Условия|условие]]> arg2 && arg3 <[[macro#Условия|условие]]> arg4) || arg5 <[[macro#Условия|условие]]> arg6) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 && arg3 <[[Macro plugin#Conditions|Conditions]]> arg4) || (arg5 <[[Macro plugin#Conditions|Conditions]]> arg6 && arg7 <[[Macro plugin#Conditions|Conditions]]> arg8)) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[macro#Условия|условие]]> arg2 && arg3 <[[macro#Условия|условие]]> arg4) || (arg5 <[[macro#Условия|условие]]> arg6 && arg7 <[[macro#Условия|условие]]> arg8)) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 || arg3 <[[Macro plugin#Conditions|Conditions]]> arg4) && (arg5 <condition> arg6 || arg7 <condition> arg8)) (goto <label> | call <macro> <n> | stop)
  if ((arg1 <[[macro#Условия|условие]]> arg2 || arg3 <[[macro#Условия|условие]]> arg4) && (arg5 <condition> arg6 || arg7 <condition> arg8)) (goto <label> | call <macro> <n> | stop)
:* Notice inside of each brackets containing the '''AND''' and '''OR''' symbols.
:* Заметим, что внутри каждой пары скобок есть символы '''AND''' или '''OR'''.


Где;
Где:
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом (@xxx), специальной переменной ($.xxx), @eval, буквами и цифрами или даже perl'овой функцией [[Macro plugin#Perl_Subroutines|Perl Subroutines]].
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом (@xxx), специальной переменной ($.xxx), @eval, буквами и цифрами или даже perl'овой функцией [[macro#Perl_Subroutines|Perl Subroutines]].
:* <''label''>, имя существующей метки, может состоять только из латинских букв и цифр.
:* <''label''>, имя существующей метки, может состоять только из латинских букв и цифр.
:* <''macro''>, имя существующего макрос.
:* <''macro''>, имя существующего макрос.
:* <''n''>, сколько раз подряд должен отработать макрос.
:* <''n''>, сколько раз подряд должен отработать макрос.


'''''Заметка:'''''
'''''Заметка:'''''
Строка 579: Строка 531:
:* Если ''<n>'' больше нуля '''0''', вызванный макрос будет запущен '''n''' раз подряд, после чего вызвавший его макрос продолжит свою работу.
:* Если ''<n>'' больше нуля '''0''', вызванный макрос будет запущен '''n''' раз подряд, после чего вызвавший его макрос продолжит свою работу.


'''''Заметка:''''' В операторе IF можно использовать такое количество выражений, сколько необходимо.
if (arg1 <[macro#Условия|условие]]> arg2 || arg3 <[[macro#Условия|условие]]> arg4 || ... || arg'''''N''''' <[[macro#Условия|условие]]> arg'''''N+1''''') (goto <label> | call <macro> <n> | stop)


'''''Заметка²:''''' В операторе IF можно использовать такое количество выражений, сколько необходимо.
Ревизия [http://sourceforge.net/p/openkore/code/8796/ 8796], "If" postfix control.
if (arg1 <[[Macro plugin#Conditions|Conditions]]> arg2 || arg3 <[[Macro plugin#Conditions|Conditions]]> arg4 || ... || arg'''''N''''' <[[Macro plugin#Conditions|Conditions]]> arg'''''N+1''''') (goto <label> | call <macro> <n> | stop)
 
Где;
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами.
:* All the conditions is up to the '''''N'''''th argument <[[Macro plugin#Conditions|Conditions]]> '''''N+1'''''th argument.
:* While '''''N''''' is an integer number/s which is greater than zero.


==== Примеры ====
==== Примеры оператора IF ====
macro checknum {
<pre>macro checknum {
    $num = @rand(1, 3)
    $num = @rand(1, 3)
    if ($num == 1) goto one
    if ($num == 1) goto one
    if ($num == 2) goto two
    if ($num == 2) goto two
    if ($num == 3) goto three
    if ($num == 3) goto three
    :one
    :one
    log \$num is 1
log \$num is 1
    stop
stop
    :one
    :two
    log \$num is 2
log \$num is 2
    stop
stop
    :one
    :three
    log \$num is 3
log \$num is 3
    stop
stop
}
}</pre>


Вышеописанный макрос выведет в консоль '''\$num is 1''' если $num == 1, '''\$num is 2''' если $num == 2, '''\$num is 3''' если $num == 3.
Вышеописанный макрос выведет в консоль '''$num is 1''' если $num == 1, '''$num is 2''' если $num == 2, '''$num is 3''' если $num == 3.
Такого же эффекта можно достичь, используя '''call''' вместо '''goto'''.
Такого же эффекта можно достичь, используя '''call''' вместо '''goto'''.
  macro checknum {
  macro checknum {
     $num = @rand(1, 3)
     $num = @rand(1, 3)
Строка 646: Строка 593:
  end <loop>
  end <loop>


Где;
Где:
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами.
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами.
:* <loop> - название цикла.
:* <loop> - название цикла.
Условия [[Macro plugin#Conditions|Conditions]].
:* Условие - [[macro#Условия|условие]].


==== Пример ====
==== Пример оператора WHILE ====
  macro while {
  macro while {
     $i = 0
     $i = 0
Строка 661: Строка 608:


На консоль выведется
На консоль выведется
  log \$i = 0
  log $i = 0
  log \$i = 1
  log $i = 1
  log \$i = 2
  log $i = 2
  log \$i = 3
  log $i = 3
  log \$i = 4
  log $i = 4
  log \$i = 5
  log $i = 5
  log \$i = 6
  log $i = 6
  log \$i = 7
  log $i = 7
  log \$i = 8
  log $i = 8
  log \$i = 9
  log $i = 9


== Автомакросы ==
=== Оператор SWITCH/CASE ===
Автомакрос содержит условия, при удовлетворении всех заданных условий начинает работать связанный с автомакросом макрос.
В ревизии [http://sourceforge.net/p/openkore/code/8782/ 8782] добавились операторы '''switch''' и '''case'''. Смотри форум [http://forums.openkore.com/viewtopic.php?f=36&t=161476 Implementation of switch/case].
 
== Автомакрос ==
Автомакрос содержит условия, при удовлетворении всех заданных условий начинает работать связанный с автомакросом макрос или список команд.


=== Синтаксис ===
=== Синтаксис ===
При выполнение всех условий вызывается макрос <macro>.
При выполнение всех условий вызывается макрос myMacro.
automacro <name> {
<pre>automacro <automacro name> {
    <conditions> <values>
    <conditions>
    call <macro>
    call myMacro
}
}
macro myMacro {
    do move prontera
    do move payon
}</pre>


При выполнении всех условий макрос не вызывается, но выполняются команды <commands> в фигурных скобках
Или же можно отказаться от написания отдельного макроса и поместить команды прямо в блоке call { ... } автомакроса. В этом случае макрос тоже создаётся, но будет безымянным и его нельзя вызвать по имени.
automacro <name> {
<pre>automacro <automacro name> {
    <condition> <values>
    <conditions>
    call {
    call {
          <commands>
do move prontera
        }
do move payon
}
    }
}</pre>


Второй вариант полезен, если тело макроса не занимает много места, и нет нужды оформлять его отдельно.
Второй вариант полезен, если тело макроса не занимает много места, и нет нужды оформлять его отдельно.
Первый вариант синтаксиса полезен, если вы хотите чтобы несколько автомакросов вызывали один и тот же макрос. Например:
Первый вариант синтаксиса полезен, если вы хотите чтобы несколько автомакросов вызывали один и тот же макрос. Например:
<pre>automacro First {
automacro First {
    <conditions>  
    <conditions>  
    call print
    call print
}
}
automacro Second {
  automacro Second {
    <conditions>  
    <conditions>  
    call print
    call print
}
}
macro print {
macro print {
    log $.caller triggered
    log $.caller triggered
}</pre>
}


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


; map <''mapname''>
; map <''mapname''>
: Сработает, если текущая локация <''mapname''>.  
: Сработает, если текущая локация <''mapname''>.  


; location [not] <''mapname'' [<''x1''> <''y1''> [<''x2''> <''y2''>]] [, ...]
; location [not] <''mapname'' [<''x1''> <''y1''> [<''x2''> <''y2''>]] [, ...]
Строка 719: Строка 671:
: Если указаны координаты <''x1''> <''y1''> и <''x2''> <''y2''>, то автомакрос запустится, если находясь на локации <''mapname''>, вы попадёте в мнимый прямоугольник, где <''x1''> <''y1''> - верхняя левая точка, а <''x2''> <''y2''> - нижняя правая точка.
: Если указаны координаты <''x1''> <''y1''> и <''x2''> <''y2''>, то автомакрос запустится, если находясь на локации <''mapname''>, вы попадёте в мнимый прямоугольник, где <''x1''> <''y1''> - верхняя левая точка, а <''x2''> <''y2''> - нижняя правая точка.


Код:
<x1> <y1> _______
<x1> <y1> _______
          |      |
        |      |
          |      |
        |      |
          |_______|
        |_______|
                  <x2> <y2>
                  <x2> <y2>
: Следует отметить, что <''x1''> < <''x2''> и <''y1''> > <''y2''> .
Отмечу, что <''x1''> < <''x2''> и <''y1''> > <''y2''> .
 
: Отделённые запятыми аргументы определяются как условие '''OR''' (или):
: Отделённые запятыми аргументы определяются как условие '''OR''' (или):
Код:
  location geffen, prontera 123 234
  location geffen, prontera 123 234
: автомакрос будет запускаться, если Вы будете находиться в geffen или в prontera на координатах (123 234).
: Автомакрос запустится, если вы будете находиться в geffen или в prontera на координатах (123 234).
 
: Несколько строк определяются как условие '''AND''' (и):
: Несколько строк определяются как условие '''AND''' (и):
Код:
  location not geffen
  location not geffen
  location not prontera
  location not prontera
 
: Автомакрос будет запускаться, если вы находитесь вне geffen и вне prontera.
: автомакрос будет запускаться, если вы находитесь вне geffen и вне prontera.
 


; mapchange ( <''mapname''> | any | * ) [, ...]
; mapchange ( <''mapname''> | any | * ) [, ...]
: Triggers when changing map to <''mapname''>. If the argument is '''any''' or '''*''' (asterisk or star) then it triggers on any map change.  
: Автомакрос запустится, если вы поменяли текущую локацию на <''mapname''>. Если аргументом является '''any''' или '''*''' , то автомакрос сработает при любом изменении локации.  
: Comma-separated arguments are treated as '''OR''' conditions.  
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).


; hp <[[macro#Условия|условие]]> <''amount''>[%]
: Автомакрос сработает, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp.
: Несколько строк определяются как условие '''AND''' (и).


; hp <[[Macro plugin#Conditions|condition]]> <''amount''>[%]
; sp <[[macro#Условия|условие]]> <''amount''>[%]
: Triggers when your hp matches the defined condition.
: Автомакрос сработает, когда ваше SP будет удовлетворять заданному условию.
: Multiple lines are treated as '''AND''' Conditions.
: Несколько строк определяются как условие '''AND''' (и).  


; spirit <[[macro#Условия|условие]]> <''amount''>
: Автомакрос сработает когда количество сферок у монка (или монеток у ганса) будет удовлетворять заданному условию.
: Несколько строк определяются как условие '''AND''' (и).


; sp <[[Macro plugin#Conditions|condition]]> <''amount''>[%]
; weight <[[macro#Условия|условие]]> <''amount''>[%]
: Triggers when your sp matches the defined condition.  
: Автомакрос сработает, когда вес инвентаря будет удовлетворять заданному условию. Можно использовать абсолютное значение <''amount''> или процентное <''amount''>%.  
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  


; cartweight <[[macro#Условия|условие]]> <''amount''>[%]
: Автомакрос сработает, когда вес телеги будет удовлетворять заданному условию. Можно использовать абсолютное значение <''amount''> или процентное <''amount''>%.
: Несколько строк определяются как условие '''AND''' (и).


; spirit <[[Macro plugin#Conditions|condition]]> <''amount''>
; zeny <[[macro#Условия|условие]]> <''amount''>
: Triggers when your spirits match <condition> <''amount''>.  
: Автомакрос сработает, когда количество зенег будет удовлетворять заданному условию.  
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  


; cash <[[macro#Условия|условие]]> <''amount''>
: Автомакрос сработает, когда количество cash будет удовлетворять заданному условию.
: Несколько строк определяются как условие '''AND''' (и).
: Появилось в ревизии [http://sourceforge.net/p/openkore/code/8759/ 8759].


; weight <[[Macro plugin#Conditions|condition]]> <''amount''>[%]
; soldout <[[macro#Условия|условие]]> <''slots''>
: Triggers when your weight matches <''condition''> <''amount''> (absolute value) or <''condition''> <''amount''> percent (relative value).  
: Автомакрос србаотает, когда количество слотов в вашем магазине будет удовлетворять заданному условию. Например в автомакросе прописано "soldout > 1". Пусть в магазине продаются 4 элу и 5 ори. Когда у вас купят все ори или все элу сработает автомакрос. Если купят всего 1 элу, то слот будет считаться не полностью проданным и автомакрос не сработает.
: Multiple lines are treated as '''AND''' conditions.
: Несколько строк определяются как условие '''AND''' (и).  
 
 
; cartweight <[[Macro plugin#Conditions|condition]]> <''amount''>[%]
: Triggers when your cart weight matches <''condition''> <''amount''> (absolute value) or <''condition''> <''amount''> percent (relative value).  
: Multiple lines are treated as '''AND''' conditions.  
 
 
; zeny <[[Macro plugin#Conditions|condition]]> <''amount''>
: Triggers when your zeny amount matches <''condition''> <''amount''>.  
: Multiple lines are treated as '''AND''' conditions.
 
 
; soldout <[[Macro plugin#Conditions|condition]]> <''slots''>
: Triggers when the amount of sold out item slots in your shop matches <''condition''> <''slots''>.  
: Multiple lines are treated as '''AND''' conditions.  
 


; status [not] <''status''> [, ...]
; status [not] <''status''> [, ...]
: Triggers when you are [not] <''status''>.  
: Автомакрос сработает, когда на персонаже [не] висит статус <''status''>.  
: The statuses "'''dead'''" and "'''muted'''" are supported additionally.
: Статусы "'''dead'''" и "'''muted'''" поддерживаются дополнительно.  
: Comma-separated arguments are treated as '''OR''' conditions.
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Multiple lines are treated as '''AND''' conditions.
: Несколько строк определяются как условие '''AND''' (и).  
 
 
; inventory "<''item''>" <[[Macro plugin#Conditions|condition]]> <''amount''> [, ...]
: Triggers when you have <''condition''> <''amount''> of <''item''> in your inventory.
: Comma-separated arguments are treated as '''OR''' conditions.
: Multiple lines are treated as '''AND''' conditions.
 
 
; storage "<''item''>" <[[Macro plugin#Conditions|condition]]> <''amount''> [, ...]
: Triggers when you have <''condition''> <''amount''> of <''item''> in your storage.
: Comma-separated arguments are treated as '''OR''' conditions.
: Multiple lines are treated as '''AND''' conditions.
 
 
; cart "<''item''>" <[[Macro plugin#Conditions|condition]]> <''amount''> [, ...]
: Triggers when you have <''condition''> <''amount''> of <''item''> in your cart.  
: Comma-separated arguments are treated as '''OR''' conditions.  
: Multiple lines are treated as '''AND''' conditions.  


; inventory "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...]
: Автомакрос сработает, когда количество вещей "<''item''>" в инвентаре будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Несколько строк определяются как условие '''AND''' (и).


; shop "<''item''>" <[[Macro plugin#Conditions|condition]]> <''amount''> [, ...]
; storage "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...]
: Triggers when you have <''condition''> <''amount''> of <''item''> in your shop.  
: Автомакрос сработает, когда количество вещей <''item''> на складе будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
: Comma-separated arguments are treated as '''OR''' conditions.  
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  


; cart "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...]
: Автомакрос сработает, когда количество вещей <''item''> в телеге будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Несколько строк определяются как условие '''AND''' (и).


; base <[[Macro plugin#Conditions|condition]]> <''level''>
; shop "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...]
: Triggers when your base level matches <''condition''> <''level''>.  
: Автомакрос сработает, когда количество вещей <''item''> в открытом вами магазине будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
: Multiple lines are treated as '''AND''' conditions.  
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Несколько строк определяются как условие '''AND''' (и).  


; base <[[macro#Условия|условие]]> <''level''>
: Автомакрос сработает, когда базовый уровень персонажа будет удовлетворять заданному условию.
: Несколько строк определяются как условие '''AND''' (и).


; job <[[Macro plugin#Conditions|condition]]> <''level''>
; job <[[macro#Условия|условие]]> <''level''>
: Triggers when your job level matches <condition> <''level''>.  
: Автомакрос сработает, когда джоб уровень персонажа будет удовлетворять заданному условию.  
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  
 


; class <''job''>
; class <''job''>
: Triggers when your job is <''job''>  
: Автомакрос сработает, когда класс персонажа, т.е. его профессия, будет <''job''>. Например class Novice или class Acolyte.
 


; spell [party] <''spell''> [, ...]
; spell [party] <''spell''> [, ...]
: Triggers when someone casts <''spell''> on you or you are in its scope.  
: Автомакрос сработает, когда кто-то будет кастовать на персонажа заклинание <''spell''> или персонаж находится в зоне действия заклинания.  
: Party support syntax is included (''optional''). Also trigger on party member (''as a target'') by other party or monster. '''Ex''': "spell party Lord of Vermilion"
: Party support syntax is included (''optional''). Also trigger on party member (''as a target'') by other party or monster. '''Ex''': "spell party Lord of Vermilion"
: Comma-separated arguments are treated as '''OR''' conditions.
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
 
:'''Set variables''':
:* $.caster - returns the actor (''by player/monster'') which triggered the last spell syntax on you/party member/in range spell.
:* $.casterName - returns the name of player/monster which triggered the last spell syntax on you/party member/in range spell.
:* $.casterID - returns the ID of player/monster which triggered the last spell syntax on you/party member/in range spell.
:* $.casterPos - returns the last position of player/monster which triggered the last spell syntax on you/party member/in range spell (''x y'').
:* $.casterSkill - returns the skill name which triggered the last spell syntax on you/party member/in range spell.
:* $.casterTarget - returns the "location of spell" which triggered the last spell syntax on you/party member/in range spell.
:* $.casterTargetName - returns the name of the party member that is in the range of the triggered (''as a target'') last spell syntax.
:* $.casterDist - returns the distance (''between the caster and YOU'') which triggered the last spell syntax on you/party member/in range sp


:'''Присваивает значения переменным''':
:* $.caster - возвращает кастовавшего заклинание (''by player/monster''), из-за которого сработало условие spell в автомакросе.
:* $.casterName - возвращает имя игрока или монстра, из-за которого сработало условие spell в автомакросе.
:* $.casterID - возвращает ID игрока или монстар, из-за которого сработало условие spell в автомакросе.
:* $.casterPos - возвращает позицию игрока или монстра, с которой кастовалось заклинание, из-за которого сработало условие spell в автомакросе.
:* $.casterSkill - возвращает имя заклинания или скила, из-за которого сработало условие spell в автомакросе.
:* $.casterTarget - возвращает местоположение цели заклинания, из-за которого сработало условие spell в автомакросе.
:* $.casterTargetName - возвращает имя сопартийца, который находится в радиусе заклинания, из-за которого сработало условие spell в автомакросе.
:* $.casterDist - возвращает дистанцию между персонажем и кастовавшим заклинание, из-за которого сработало условие spell в автомакросе.


; monster [not] <''monster(s) name''> <[[Macro plugin#Conditions|condition]]> [<''distance''>]
; monster [not] <''monster(s) name''> <[[macro#Условия|условие]]> [<''distance''>]
: Triggers when <''monster(s) name''> is near. If <''distance''> is not set, it will consider the value from [[Config.txt#clientSight|clientSight]].
: Автомакрос сработает, когда монстр <''monster(s) name''> рядом. Если дистанция <''distance''> не указаны, вместо неё берётся значение из конфига  [[clientSight]].
: Comma-separated arguments are treated as '''OR''' conditions.  
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  


:'''Set variables''':
:'''Присваивает значения  переменным''':
:* $.lastMonster - name of the last monster that triggered the automacro.
:* $.lastMonster - возвращает имя монстра, из-за которого сработало условие monster в автомакросе.
:* $.lastMonsterPos - triggered monster position. '''Ex''': x, y map_name
:* $.lastMonsterPos - возвращает позицию монстра, из-за которого сработало условие monster в автомакросе. '''Например''': x, y map_name
:* $.lastMonsterDist - distance between the triggered monster and you.
:* $.lastMonsterDist - возвращает дистанцию между персонажем и монстром, из-за которого сработало условие monster в автомакросе.
:* $.lastMonsterID - the ID of the triggered monster.
:* $.lastMonsterID - возвращает ID монстра, из-за которого сработало условие monster в автомакросе.
:* $.lastMonsterCount - risk point (''available only for monster syntax'')
:* $.lastMonsterCount - возвращает степень риска, исходящию от монстра, из-за которого сработало условие monster в автомакросе.
 
:* $.lastMonsterBinID - возвращает тип монстра (введено в ревизии [http://sourceforge.net/p/openkore/code/8509/ 8509]).
 
; aggressives <[[Macro plugin#Conditions|condition]]>  <''number''>
: Triggers at <''number''> of aggressives.  
: Multiple lines are treated as '''AND''' conditions.  


; aggressives <[[macro#Условия|условие]]>  <''number''>
: Автомакрос сработает, когда количество агрессивных монстров будет удовлетворять заданному условию.
: Несколько строк определяются как условие '''AND''' (и).


; player ("<''player name''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''distance''> ]
; player ("<''player name''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''distance''> ]
: Triggers when <''player name''> is on screen and not more than <''distance''> blocks away.  
: Автомакрос сработает, когда игрок <''player name''> в пределах видимости и не дальше чем число клеток <''distance''>. В качестве имени можно использовать либо строго заданное: "4epT" (пишется в кавычках), либо шаблон: /4epT/ (пишется через слэш). Разница в том, что на имя 4epTik первое условие не сработает (то, что в кавычках), а второе сработает (так как слово 4epTik сожершит буквы 4epT).
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  
 
:'''Присваивает значения  переменным''':
:* $.lastPlayerName - имя игрока (это и далее появилось в ревизии [http://sourceforge.net/p/openkore/code/8484/ 8484]).
:* $.lastPlayerPos - местоположение игрока в виде: x, y map_name
:* $.lastPlayerLevel - уровень игрока
:* $.lastPlayerJob - профа игрока
:* $.lastPlayerAccountId - ID учетки игрока (это и далее появилось в ревизии [http://sourceforge.net/p/openkore/code/8490/ 8490]).
:* $.lastPlayerBinId - binID/index игрока


; equipped [<''slot''>] (<''item''> | none) [, ...]
; equipped [<''slot''>] (<''item''> | none) [, ...]
: Triggers when <''item''> or none is equipped [in slot <''slot''>]
: Автомакрос сработает, когда вещь <''item''> одета, или не одето ничего <''none''>. Необязательно, но можно указать слот <''slot''>.
: Slots are '''topHead''', '''midHead''', '''lowHead''', '''leftHand''', '''rightHand''', '''robe''', '''armor''', '''shoes''', '''leftAccessory''', '''rightAccessory''' and '''arrow'''.  
: Спикок слотов '''topHead''', '''midHead''', '''lowHead''', '''leftHand''', '''rightHand''', '''robe''', '''armor''', '''shoes''', '''leftAccessory''', '''rightAccessory''' и '''arrow'''.  
: Comma-separated arguments are treated as '''OR''' conditions.  
: Отделённые запятыми аргументы определяются как условие '''OR''' (или).
: Multiple lines are treated as '''AND''' conditions.  
: Несколько строк определяются как условие '''AND''' (и).  


; var <''имя_переменной''> (unset | <[[macro#Условия|условия]]> <''значение''>)
: Автомакрос сработает, когда <''переменная''> не определена <''unset''>, или удовлетворяет заданному условию.
: Несколько строк определяются как условие '''AND''' (и).
: '''Примечание:''' в этом параметре указывает ТОЛЬКО имя переменной без символа «$». Пример:
automacro variable {
  var test unset
  timeout 5
  call {
    log test is unset: $test
  }
}
macro set_test {
  $test = 1
  log variable \$test = $test
}


; var <''variable''> (unset | <[[Macro plugin#Conditions|condition]]> <''value''>)
; varvar <''nested variable''> (unset | <[[macro#Условия|условия]]> <''значение''>)
: Triggers when <''variable''> is either unset or matches <''condition''> <''value''>.
: Автомакрос сработает, когда вложенная переменная <''nested variable''> не определена <''unset''>, или удовлетворяет заданному условию.  
: Multiple lines are treated as '''AND''' conditions.
: Несколько строк определяются как условие '''AND''' (и).
 
 
; varvar <''nested variable''> (unset | <[[Macro plugin#Conditions|condition]]> <''value''>)
: Triggers when <''nested variable''> is either unset or matches <''condition''> <''value''>.  
: Multiple lines are treated as '''AND''' conditions.  
 


; console ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i])
; console ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i])
: Triggers when <''text''> is received on console or the text received matches <regexp>.  
: Автомакрос сработает, когда на консоли появится текст <''text''>, или появившийся на консоли текст удовлетворяет регулярному выражению <''regexp''>.  
: The ''i'' switch means the regexp is case-insensitive.
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
 
:'''Set variables''':
:* $.lastLogMsg - the console text that trigerred the automacro.
:* $.lastMatchN - backreference from regexp.


:'''Присваивает значения переменным''':
:* $.lastLogMsg - возвращает консольный текст, из-за которого сработало условие console в автомакросе.
:* $.lastMatchN - возвращает текст, который был заключен в круглые скобки в регулярном выражении.


; pm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''player''>]
; pm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''player''>]
: Triggers when <''text''> is received by PM [from <''player''>] or the text received matches <regexp>.  
: Автомакрос сработает, когда в приватном сообщении появится <''text''> от игрока [<''player''>], или приватное сообщение удовлетворяет заданному регулярному выражению <regexp>.  
: The ''i'' switch means the regexp is case-insensitive.
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.  
 
:'''Set variables''':
:* $.lastpm - the name of the player who PMed you
:* $.lastpmMsg - the message


:'''Присваивает значения переменным''':
:* $.lastpm - возвращает имя игрока, который написал приватное сообщение, из-за которого сработало условие pm в автомакросе.
:* $.lastpmMsg - возвращает приватное сообщение, из-за которго сработало условие pm в автомакросе.


; pubm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''distance''>]
; pubm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''distance''>]
: Triggers when a public message [within a distance of <''distance''>] is received and it is <''text''> or matches <regexp>  
: Автомакрос сработает, когда в общем чате будет получено сообщение <''text''> [и дистанция между персонажем и говорившим не превишает <''distance''>], или сообщение удовлетворяет заданному регулярному выражению <regexp>.
: The ''i'' switch means the regexp is case-insensitive.
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.  
 
:'''Set variables''':
:* $.lastpub - player's name
:* $.lastpubMsg - player's message


:'''Присваивает значения переменными''':
:* $.lastpub - имя персонажа, который послал в общий чат сообщение, из-за которого сработало условие pubm в автомакросе.
:* $.lastpubMsg - сообщение в общем чате, из-за которого сработало условие pubm в автомакросе.


; party ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i])
; party ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i])
: Triggers when <''text''> is received by party chat or the text received matches <regexp>.  
: Автомакрос сработает, когда в партийном чате будет получено сообщение <''text''>, или сообщение удовлетворяет заданному регулярному выражению <regexp>.  
: The ''i'' switch means the regexp is case-insensitive.
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.  
 
:'''Set variable'''s:
:* $.lastparty - player's name
:* $.lastpartyMsg - player's message


:'''Присваивает значения переменным''':
:* $.lastparty - имя персонажа, который послал в партийном чате сообщение, из-за которого сработало условие party в автомакросе.
:* $.lastpartyMsg - сообщение в партийном чате, из-за которого сработало условие party в автомакросе.
   
   
; guild ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i])
; guild ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i])
: Triggers when <''text''> is received by guild chat or the text received matches <regexp>.  
: Автомакрос сработает, когда в гильдийном чате будет получено сообщение <''text''>, или сообщение удовлетворяет заданному регулярному выражению <regexp>.  
: The ''i'' switch means the regexp is case-insensitive.
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.  
:'''Set variables''':
:* $.lastguild - player's name
:* $.lastguildMsg - player's message


:'''Присваивает значения переменным''':
:* $.lastguild - имя персонажа, который послал в гильдийном чате сообщение, из-за которого сработало условие guild в автомакросе.
:* $.lastguildMsg - сообщение в гильдийном чате, из-за которого сработало условие guild в автомакросе.


; playerguild (<''guild list''> [, ...] | <''guild.txt''>) ['', <distance>'']
; playerguild (<''guild list''> [, ...] | <''guild.txt''>) ['', <distance>'']
: Trigers when guild list (guild1, guild2, ..., guild'''''N''''') or lists of guilds inside control/guild.txt matches player's guild name when '''charNameUpdate''' or '''player''' hook-on-demand packets is received. Further discussion could be found at [http://forums.openkore.com/viewtopic.php?f=32&t=6417 ''Forums''].
: Автомакрос сработает, когда имя гильдии, в которой находится персонаж, совпадает с именем в списке <''guild list''> (где имена гильдий разделены запятыми (guild1, guild2, ..., guild'''''N''''')), или в файле control/guild.txt. Имя гильдии получают из "hook-on-demand" пакета '''charNameUpdate''' или '''player'''. Дальнейшая информация на форуме OpenKore [http://forums.openkore.com/viewtopic.php?f=32&t=6417 ''Forums''].
: If <''distance''> is not defined, [[Config.txt#clientSight|clientSight]] value will be considered.
: Если дистанция <''distance''> не указаны, использует значение [[clientSight]] из конфига.
: Comma-separated guild list are treated as '''OR''' conditions.  
: Список имён гильдий, разделенных запятыми, рассматривается как условие '''OR''' (или).  
:'''Set variables''':
:'''Присваивает значения переменным''':
:* $.lastPlayerID - return the account ID of the player that trigger the syntax
:* $.lastPlayerID - возвращает ID аккаунта игрока, из-за которого сработало условие playerguild в автомакросе.
:* $.lastGuildName - return the guild name of the player that trigger the syntax
:* $.lastGuildName - возвращает имя гильдии игрока, из-за котогоро сработало условие playerguild в автомакросе.
:* $.lastGuildNameBinID - return the ID of the player that trigger the syntax
:* $.lastGuildNameBinID - возвращает ID игрока, из-за которого сработало условие playerguild в автомакросе.
:* $.lastGuildNameBinIDDist - return the distance(from you) of the player that trigger the syntax
:* $.lastGuildNameBinIDDist - возвращает дистанцию от вашего персонажа, до персонажа, из-за которого сработало условие playerguild в автомакросе.
:* $.lastGuildNameBinIDName - return the player's name that trigger the syntax
:* $.lastGuildNameBinIDName - возвращает имя игрока, из-за которого сработало условие playerguild в автомакросе.
:* $.lastGuildNameBinIDJobName - return the job class of the player that trigger the syntax
:* $.lastGuildNameBinIDJobName - возвращает класс, т.е. профессию игрока, из-за которого сработало условие playerguild в автомакросе.
 


; hook <''hookname''>
; hook <''hookname''>
: Triggers when openkore calls <''hookname''>.  
: Автомакрос сработает, когда OpenKore вызовут хук <''hookname''>.  


 
; save <''hash key''> (используется в комбинации с hook)  
; save <''hash key''> (use in combination with hook)  
: Когда автомакрос сработает по условию hook, то это условие сохранит значение из хэша <''hash key''> в переменной '''$.hooksaveN'''.
: Saves the value of <''hash key''> in a variable '''$.hooksaveN'''.


  automacro hook {
  automacro hook {
Строка 956: Строка 895:
  }
  }


; whenGround [not] <''spell''>
: Автомакрос сработает, когда персонаж [не] находится в зоне действия площадного скила <''spell''>.
: Имена скилов через запятые рассматриваются как условие '''OR''' (или).


; whenGround [not] <''spell''>
; areaSpell <''spell''> [<''distance''>]
: Triggers when we are in the effect of ground status.
: Автомакрос сработает, когда кто-то использует умение и центр кастуемого на землю умения находится в пределах дистанции <''distance''> или, если дистанция не указана, в пределах видимости, указываемой в параметре конфига [[clientSight]] конфига. Если параметр конфига [[clientSight]] пуст, то используется значение по умолчанию - '''20'''.
: Comma-separated list will be treated as '''OR''' condition
: Список аргументов через запятые, рассматривается как условие '''OR''' (или).
:'''Присваивает значения переменным''':
:*$.areaName - возвращает название умения, кастуемого по площади
:*$.areaActor - возвращает тип актора (игрок, моб и так далее)
:*$.areaSourceName - возвращает имя актора
:*$.areaSourceID - возвращает идентификатор актора binID
:*$.areaPos - возвращает координаты центра, где находится скастованное умение (например: '''123 123 payon''')
:*$.areaDist - возвращает расстояние от вашего персонажа до центра умения


'''Пример:'''


; areaSpell <''spell''> [<''distance''>]
automacro warp {
: Triggers when someone uses an area of spell (centre) that is in the scope of the distance condition from you. If <''distance''> is not defined, it will consider [[Config.txt#clientSight|clientSight]] value.
      areaSpell Warp Portal <= 7  # через запятую пишется список из имён умений, условий и дистанций
: Comma-separated arguments are treated as '''OR''' conditions.
                                  # без условия и дистанции берётся расстояние $config(clientSight)
                                  # или 20 как значение по умолчанию.
      call {
          log Умение: $.areaName, тип актора: $.areaActor.
          log Умение $.areaName скастовано $.areaSourceName ($.areaSourceID) на координаты "$.areaPos" (дист= $.areaDist)
      }
}


'''Источник:''' [http://forums.openkore.com/viewtopic.php?f=32&t=6444 areaSpell automacro syntax Macro 2.0.3-SVN] by '''ezza'''.


; localtime <[[Macro plugin#Conditions|condition]]> <''time''>
; localtime <[[macro#Условия|условие]]> <''time''>
: Triggers when CPU clock time matches the given <[[Macro plugin#Conditions|condition]]> <''time''>.  
: Автомакрос сработает, когда время на внутренних часах компьютера удовлетворяет условию <[[macro#Условия|условие]]> <''time''>.  
: Time is on 24h format. Ex: 11:22:33 (hour:minute:second)
: Формат времени <''time''> - 24-часовой. Например: 15:22:33 (час:минута:секунда)
: Multiple lines are treated as '''AND''' conditions.
: Несколько строк с условием localtime рассматриваются как условие '''AND''' (и).
: [http://forums.openkore.com/viewtopic.php?f=32&t=2444 первоисточник]


; eval <perl expression>
: Автомакрос сработает, когда указанное перловое выражение <perl expression> будет истинно, то есть иметь значение true.


; run-once (0 | 1)
; run-once (0 | 1)
: When set to '''1''' the automacro will be locked after being triggered.  
: Если этот параметр автомакроса установлен в '''1''', то после срабатывания автомакрос будет залочен, т.е. закрыт и не сможет больше проверять условия и срабатывать на них. Другими словами, автомакрос сработает только один раз.  
: Use the macro command '''release''' to unlock this automacro.  
: Используйте команду '''release''' в макросе, чтобы разлочить, т.е. отрыть автомакрос, чтобы он мог опять когда-нибудь сработать.  
 


; overrideAI (0 | 1)
; overrideAI (0 | 1)
: When set to '''1''', the macro ignores openkore's AI. This means it won't pause upon "move" or "status dead".  
: Если этот параметр автомакроса установлен в '''1''', то вызываемый макрос будет игнорировать openkore'овый AI. Это значит, что не будет пауз от команд "move" или "status dead".  
 


; delay <''n''>
; delay <''n''>
: Waits for <''n''> seconds before calling the corresponding macro.  
: Если этот параметр автомакроса установлен, то после срабатывания автомакроса пройдёт <''n''> секунд перед тем, как будет запущен соответствующий макрос.  
 


; timeout <''n''>
; timeout <''n''>
: Waits at least for <''n''> seconds before this automacro can be triggered again.  
: Если этот параметр автомакроса установлен, то пройдет как минимум <''n''> секунд перед тем, как автомакрос сможет сработать снова.  
 


; macro_delay <''n''>
; macro_delay <''n''>
: Overrides the global macro delay setting for the called macro.  
: Если этот параметр автомакроса установлен, то он переопределяет глобальное значение macro-задержки для вызываемого макроса.
 


; priority <''num''>
; priority <''num''>
: Chooses which automacros should be checked before others. The smaller the <''num''> is, the sooner the automacro gets checked. If priority is not given, the priority is assumed to be '''0'''. ('''zero''': ''check first'').  
: Этот параметр автомакроса определяет, в какой очередности проверяются автомакросы на удовлетворение условий срабатывания. Чем меньше значение <''num''> этого параметра, тем меньше будет ждать автомакрос в очереди. Если параметр не задан, то предполагается, что '''priority 0''', т.е. проверяется в первую очередь.
 


; exclusive (0 | 1)
; exclusive (0 | 1)
: Automacros which have exclusive set cannot be interrupted by other automacros.  
: Если этот параметр автомакроса установлен в '''1''', то выполнение этого автомакроса не может быть прервано срабатыванием другого автомакроса.  
 


; set <''variable''> <''value''>
; set <''variable''> <''value''>
: Sets variable <''variable''> to <''value''>. You can have multiple set lines per automacro.  
: Этот параметр автомакроса устанавливает переменной <''variable''> значение <''value''>. Этот параметр можно использовать несколько раз.
 


; orphan <''method''>
; orphan <''method''>
: Sets the method of how to deal with [[Macro plugin#Orphaned Macros|orphaned macros]].
: Этот параметр определяет метод для обработки макроса, если тот станет "одиночным" [[Macro plugin#Orphaned Macros|orphaned macros]].


=== Example ===
=== Пример ===
  automacro sp {
  automacro sp {
     location prontera
     location prontera
Строка 1019: Строка 971:




Always remember, when opening a '''{''', always close it with a '''}'''.
Всегда закрывайте фигурные скобки '''{''' и '''}'''.


== Orphaned Macros ==
 
It may happen - for example by using ''ai clear'' while a macro is running - that a macro becomes orphaned. That means the macro object exists but cannot continue because it requires the AI queue to contain the entry "macro" (or "deal") at the first place. When the AI queue gets cleared, the "macro" entry vanishes.
== Одиночные макросы ==
There are three methods:  
Иногда случается так, например когда используется команда ''ai clear'' во время работы макроса, что макрос становится "одиночным". Имеется в виду, что сам объект макроса есть в памяти, но макрос не может выполняться дальше. Ибо макросу нужен OpenKore'вый AI с "macro" или "deal" на первом месте очереди. После команды ''ai clear'' очередь этого самого AI очищается и объект "macro" уничтожается.
 
В связи с этим есть три метода:  


{| class="wikitable" border="1" cellspacing="0"
{| class="wikitable" border="1" cellspacing="0"
Строка 1029: Строка 983:
|-
|-
|align=center| terminate  
|align=center| terminate  
|align=center| terminates the macro (''equivalent to macro stop'')  
|align=center| останавливает, прерывает одиночный макрос (''всёравно что команда в консоли macro stop'')  
|-
|-
|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 простаивает и ему нечего делать. Это означает, что макрос продолжится после завершения других неотложных дел, стоящих в очереди к AI.  
|}
|}




== Perl Subroutines ==
== Perl'овые подпрограммы ==
Macro plugin support Perl subroutines in macros. You can now create any simple Perl function without limitations from the '''eval''' command.  
Макро-плагин поддерживает использование Perl'овых подпрограмм в файле macros.txt. Теперь можно создавать какую-нибудь простую функцию на Perl'е, не стесняя себя ограничениями команды '''eval'''.


Example No.1 - how to create a Perl Subroutine function in Macro
Пример 1 - как создать Perl'овую подпрограмму в теле макроса.
  macro sub {
  macro sub {
   $list = Orange, Milk, Soya, Peach
   $list = Orange, Milk, Soya, Peach
Строка 1068: Строка 1022:




Example No.2 - how to create a re-writable file function using Perl Subroutine in Macro
Пример 2 - как создать Perl'овую подпрограмму для записи значений в файл.
  automacro confHP1 {
  automacro confHP1 {
     hp > 85%
     hp > 85%
Строка 1096: Строка 1050:
         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
Строка 1140: Строка 1096:
  }
  }


== Comments ==  
== Комментарии в макросах ==  
The macro files allow comments, i.e. lines that are ignored by the macro plugin.
Комментарии в файле с макросами начинаются со знака #, всё после этого символа игнорируется макро-плагином.
:* 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
       # this is a comment line
Строка 1149: Строка 1105:
  }
  }


Will print:
На консоль будет выведено:
 
  [log] I'm Happy
  [log] I'm Happy


== 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.
== Приложение. Примеры ==


Предполагается, что вы знаете как использовать [[:Категория:Console_Command|консольные команды]] OpenKore и понимаете, как они работают.
Если это не так, прежде чем идти дальше, пробегитесь по разделу консольных команд [[:Категория:Console_Command|консольные команды]] и попробуйсте некоторые команды, например [[a]], [[ai]], [[move]], [[cart|cart get]], [[storage|storage add]], [[talk]], [[deal]], [[take]], [[sl]], [[sm]], [[relog]], [[pm]] и может быть другие.


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




'''Automacros'''
'''Автомакрос'''
 
Automacros are macros which automatically trigger when certain conditions are met, just like how blocks in config.txt trigger depending on the conditions set in them.
 
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...


Автомакрос - это макрос, который срабатывает автоматически, когда выполняются заданные условия. Вся суть автомакроса в проверке условий срабатывания. Если все условия автомакроса выполняются, то запускаются команды из блока call { ... } или вызывается call <'''имямакросса'''>. Формат автомакроса:
  automacro <name> {
  automacro <name> {
         condition 1
         condition 1
Строка 1186: Строка 1137:




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....
Наример, предположим, что вы играете руками в Ragnarok, но у вас есть ведомый прист под управлением OpenKore. Нужно сделать так, чтобы прист предупреждал, если у него осталось мало маны. Это можно сделать так:
 
  automacro sp {
  automacro sp {
     sp < 200
     sp < 200
Строка 1196: Строка 1146:
  }
  }


Разберём этот автомакрос строка за строкой,
#'''''automacro sp {''''' - Ключевое слово automacro говорит Kore о том, что это автомакрос. Далее пишется имя, которое вы дали автомакросу. В данном случае - sp. Дальще следует открывающая фигурная скобка “{“, после неё следует тело автомакроса.
#'''''sp < 200''''' – После “{“ следует написать условия срабатывания автомакроса. В данном случае используется только одно условие, которое выполняеется, когда мана, количество SP у персонажа опускается ниже 200 единиц.
#'''''call {''''' – Ключевое слово “call” сообщает Kore что делать в том случае, если все условия выполняются и автомакрос срабатывает. Здесь пишутся команды. Открывающая скобка “{“ говорит Kore, что команды будут описаны прямо в теле автомакроса.
#'''''do c sp low''''' – “do” говорит Kore выполнить консольную команду, в данном случае "c sp low". Т.е. напечатать в общий чат фразу "sp low".
#'''''}''''' – Эта закрывающая скобка “}” говорит Kore, что команды кончились.
#'''''timeout 10''''' – Этот параметр заботится о том, чтобы автомакрос срабатывал не чаще, чем один раз в десять секунд. Таким образом прист не будет спамить в чат каждые пол секунды.
#'''''}''''' – Эта закрывающая скобка “}” говорит Kore, что код автомакроса закончен.


Taking it line by line,
Короче, если сп у бота будет меньше 200, он будет говорит в общий чат "sp low".


#'''''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.
#'''''sp < 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.
#'''''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.
#'''''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.
#'''''}''''' – This closing bracket “}” tells Kore that the commands have ended.
#'''''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.
#'''''}''''' – 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.
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.


Следующий макрос демонстрирует как реагировать на всякие странные ситуации. Например металлинги могу стрипнуть оружие и тогда боту придётся туго. Настройте боту оружие по умолчанию и используйте следующий автомакрос. Короче говоря, как только у персонажа стрипнут оружие, он телепортируется от моба и делает релог через 10 секунд. После релога бот сам оденет оружие, так как оно в конфиге было настроено как оружие по умолчанию.
  automacro strip {
  automacro strip {
     status Strip Weapon
     status Strip Weapon
    timeout 10
     call {
     call {
       do tele
       do tele
       do relog 10
       do relog 10
     }
     }
    timeout 10
  }
  }




Taking it line by line....
Следующий автомакрос демонстрирует, как ако-производные с прокачанным скилом "варп портал" могут добираться до локации кача. Когда бот оказывается вне города по пути к lockMap, например на gef_fild07 - срабатывает данный автомакрос. "do ai manual" используется для того, чтобы ИИ Коры не вмешивался в действия макроса, в данном случае, чтобы бот не двигался. "pause" нужна для того, чтобы бот успел скастовать варп портал.
 
#'''''automacro strip {''''' - Tell Kore this is an automacro, and it's name is "strip". The '{' tells Kore the code of the automacro starts here.
#'''''status Strip Weapon''''' - The only condition in this macro. This checks your list of statuses for the status "Strip Weapon". Thus, when you are stripped by a Metaling, you get the "Strip Weapon" status and this condition will be fulfilled.
#'''''call {''''' - The word "call" and "{" tells Kore that the commands to be executed start after the '{'
#'''''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 relog 10''''' - Tells Kore to relogin in 10 seconds, because when you login again, your "strip weapon" status is cleared.
#'''''}''''' - The closing bracket '}' tells Kore the commands have ended.
#'''''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.
#'''''}''''' - 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.
 
 
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 {
     map gef_fild07
     map gef_fild07
Строка 1255: Строка 1187:
  }
  }


В макро-плагине есть много полезных встроенных переменных, которые, например, хрянят позицию персонажа. Эти переменные начинаются со знаков "''$.''" и они уже были описаны выше. Следующий пример демонстрирует, как получить координаты x и y по отдельности. '''$.pos''' хранит позицию персонажа в виде "123 34". Код, для получения ''x'' и ''y'' координат:
$px = @arg ("$.pos", 1)
$py = @arg ("$.pos", 2)


Taking it line by line,
Координата ''x'' - первое слово в строке '''$.pos''', поэтому нужно поставить "'''1'''". Координата ''y'' - второе слово в строке'''$.pos''', значит ставим "'''2'''".
 
#'''''automacro warp {''''' - As explained, the automacro's name is warp, and “{“ indicates that the automacro begins.
#'''''map get_fild07''''' - The first condition, the automacro will only trigger if the map is gef_fild07.
#'''''inventory “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.
#'''''call {''''' - Tells Kore that the commands start here.
#'''''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.
#'''''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.
#'''''do move 319 187''''' - The “move” console command is used to move your bot to a set location.
#'''''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).
#'''''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.
#'''''do warp 1''''' - Console command “warp” is used to select memo location 1.
#'''''pause 1''''' - 1 second delay to allow the portal to form.
#'''''do move 316 188''''' - Move to the portal and Voila! You have been warped to the map.
#'''''do ai on''''' - You set ai to manual at the beginning of this macro, so now you need to turn it back on.
#'''''}''''' - Closing bracket indicates end of commands.
#'''''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.
#'''''}''''' - Closing bracket indicates end of automacro code.
 
''Note the use of appropriate delays and timeouts in this automacro.''
 
 
The macro plugin also has many useful built-in variables which give you your position for example. It's all listed in the macro 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,
 
  $px = @arg ("$.pos", 1)
  $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''''.


If you have a “'''monster'''” condition in your automacro, '''$.lastmonsterpos''' gives the position of that monster. To extract the ''x'' and ''y'' coordinates the code is,
Если в автомакросе есть условие "'''monster'''", то переменная '''$.lastmonsterpos''' будет хранить позицию этого монстра. Чтобы вытащить координаты ''x'' и ''y'' из этой переменной, используем следующий код:


  $mx = @arg ("$.lastMonsterPos", 1)
$mx = @arg ("$.lastMonsterPos", 1)
  $my = @arg ("$.lastMonsterPos", 2)
$my = @arg ("$.lastMonsterPos", 2)




'''run-once против timeout'''


"'''run-once'''"
Часто в автомакросах используется условие run-once вместо условия timeout. Таким образом автомакрос срабатывает один раз. Чтобы автомакрос мог сработать еще раз - применяют команду releaese, как правило эта команда стоит в конце вызываемого макроса. Однако из-за различных причин макрос может зависнуть, не выполнившись до конца и не разблокировав автомакрос командой release. Таким образом автомакрос полностью теряет работоспособность. Чтобы этого избежать, не надо пользоваться условием run-once вместо условия timeout. Используйте условие timeout.


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.


'''automacro против macro'''


'''The normal macros'''
В трех вышеприведённых примерах всё делается исключительно средствами автомакроса (имеется ввиду использование call { команды }, а не call имямакроса). Возникает логичный вопрос, зачем нужны простые макросы? Дело в том, что не всё можно сделать, используя только автомакросы. Так, например, невозможно использовать встроенные переменные, такие как $.pos, в автомакросе. Если выводится ошибка типа “''not an automacro variable''”, то это нельзя сделать автомакросом - необходимо использовать конструкцию call <имямакроса>, вызывая таким образом макрос.


In the 3 examples given, everything was done using automacros. So you're probably wondering what the point of macros is if everything can be done using automacros. Well, not everything can be done using automacros. For example, it is not possible to use macro variables such as $.pos in an automacro. So, if you get errors like “''not an automacro variable''”, it means that it cannot be done in an automacro but has to be done using a macro. In such a case, the automacro needs to call a macro.


'''Регулярные выражения - regexp'''


'''Regular Expressions'''
Иногда в макросе нужно сравнить, например, имена персонажей вокруг вас с определенным именем или его частью. Вот в этом случае нужны регулярные выражения. Не всем и не сразу приходится сталкиваться с регулярными выражениями в макро-плагине, но чем больше вы занимаетесь макрописанием, тем больше вам надо знать про регулярные выражения. Посетите страницу http://www.regular-expressions.info/quickstart.html, где очень хорошо объясняется, что такое и как функционируют регулярные выражения. Вот краткий пример, чтобы продемонстрировать regexp:
 
Sometimes, in a macro, you need to compare, say the names of characters near you to see if it matches a certain name. This is where regular expressions come in handy. If you're new to macros, you can read this later as it can be a bit complicated, the more advanced regexps can look hellish =P Visit http://www.regular-expressions.info/quickstart.html where it's explained fairly well. I'm just going to put down some basics here.


  $.lastpubMsg = /(A|a)uto (S|s)torage/
  $.lastpubMsg = /(A|a)uto (S|s)torage/


Here, '''$.lastpubMsg''' is your macro variable holding the last public chat message. A regular expression can just be plain text so it could have been /auto storage/ or /auto/ and Kore would have checked if the public chat contained "auto storage" or "auto".
Здесь '''$.lastpubMsg''' - переменная макроплагина, хранящая последнее сообщение из общего чата. Регулярное выражение может быть просто чистым текстом, например  /auto storage/ или /auto/. Тогда это выражение сработает, когда в общем чате появится сообщение, содержащее "auto storage" или "auto".


However, here we have used the "'''|'''" symbol which means "'''or'''". Notice ''''A'''' and ''''a'''' are contained in brackets with a ''''|'''' between them. It means both ''''auto'''' and ''''Auto'''' are checked for. Similarly, both ''''storage'''' and ''''Storage'''' are checked for.  
Тем не менне мы использовали символ "'''|'''", означающий "'''или'''". Заметьте, что ''''A'''' и ''''a'''' стоят в круглых скобках и разделены символом палки ''''|''''. Это значит, что шаблону подойду оба слова ''''auto'''' и ''''Auto''''. Таким же образом оба слова ''''storage'''' и ''''Storage'''' тоже подпадают под это регулярное выражение.  


Допустим, что первый символ ''''A'''' или ''''a'''' может повторяться несколько раз. Тогда следует изменить регулярное выражение, добавив знаки плюс ''''+'''':


Now suppose you want to check for repetition, say 'aauto storage' also, then you may use:
/(a+|A+)uto (S|s)torage/


  /(a+|A+)uto (S|s)torage/  
Знак плюс означает, что стоящий перед этим плюсом символ должен присутствовать в тексте один и более раз. Таким образом, если в общий чат скажут что-то типа "aaaaaaaaaauto storage", то регулярное выражение найдет совпадение в тексте. В регулярных выражениях знак плюс ''''+'''' относится к группе так называемых квантификаторов. Кроме плюса есть и другие квантификаторы:
:* '''*''' символ перед знаком умножить может не встречаться вообще, или встречаться сколько угодно раз. Еще говорят - встретиться ноль или более раз. Например, регулярное выражение /(a*|A*)uto Storage/ найдет совпадение в строке "uto storage".
:* '''+''' символ перед знаком плюс должен встретиться хотя бы один раз. Еще говорят - встретиться один или более раз.
:*'''?''' символ перед вопросительным знаком должен встретиться в тексте не более одного раза, или не встретиться вообще. Еще говорят - встретиться один раз или ни разу. Например, регулярное выражение /(a?|A?)uto Storage/ найдет совпадение в строке "uto storage" и "auto storage", но не сработает на "aaaauto storage".


Notice I've used a ''''+''''. This tells Kore that the character it is directly after, in this instance ''''a'''' or ''''A'''', should be present one or more times. So even if someone says "aaaaaaaaaauto storage', it will be valid. Other checks like the ''''+'''' are:
:* '''*''' matches 0 or more times '''e.g.''' /(a*|A*)uto Storage/ so "uto storage" will also work.
:* '''+''' matches 1 or more times '''e.g.''' as above.
:*'''?''' matches 1 or 0 times '''e.g.''' /(a?|A?)uto Storage/ so "uto storage" and "auto storage" work but "aaaauto storage" won't.


Таким образом, если надо проверить строку на наличие слова "Kobold" - просто пишем /Kobold/. Тогда регулярное выражение сработает, если где-то в строке встретилось слово "Kobold". В случае с "Kobold-1" и "Kobold-2" можно обойтись и /Kobold-(1|2)/.


So if you want to check for "Kobold" just do /Kobold/ and if "Kobold" is anywhere in the string, it will be valid. For Kobold-1 and Kobold-2 only it will be /Kobold-(1|2)/.
Регулярные выражения очень часто пригождаются в условии автомакроса - "console /<regexp>/".


Regexps may also come in handy when you're using the "console /<regexp>/" condition in automacros, if you need to check for a variety of trigger texts.
Это всего лишь основы, объяснённые на пальцах, читайте мануалы по регэкспам.


These are just the basics. I recommend referring to the link provided above if you need to make a more complicated regexp.
== Как писать макросы ==
Теперь, когда вы прочитали весь этот длинный мануал, и столько всего узнали, попробуйте написать свой собственный макрос. Изложенная далее шпаргалка поможет вам в этом творческом процессе.


== How to write a macro ==
* Определитесь, при каких именно услових должен срабатывать ваш автомакрос (а при каких - нет)
Now that you have some idea of what a macro is, try writing one
* Продумайте последовательно шаги, которые должен выполнить ваш бот, чтобы достичь цели.
* Удостоверьтесь, что везде проставленны паузы.
* Удостоверьтесь, что в автомакросе есть условие "timeout" или "run-once", чтобы автомакрос не зациклился, срабатывая по сто раз в секунду.
* Закоментируйте первую строку в файле macros.txt - поставьте сиивол # в самое начало первой строки файла macros.txt.
* Поместите написанный код в файл macros.txt и запустите openkore. Если openkore уже запущена, напишите в консоли "reload macros.txt". Если всё в порядке - то никаких сообщений об ошибках не будет. Но если есть синтаксические ошибки, например вы пропустили "}", тогда вы получите ошибку и макрос не будет работать. Ошибку найти, исправить, файл macros.txt сохранить, в консоли написать "reload macros.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 macros.txt and start the bot or reload macros.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 macros.txt again to check if you corrected it properly or not.


== FAQ ==
== FAQ ==
; I have an automacro that checks for the amount of an item in my inventory / cart to be less than a given value or equal to zero (''e.g. inventory "red potion" <= 30'') but that automacro triggers also on map change. Why is that so and what should I do?  
; У меня есть автомакрос, который проверяет количество итемов в инвентаре/телеге - нет итемов, или их меньше какого-то числа? Например ''inventory "red potion" <= 30''. Но этот автомакрос срабатывает при каждой смене локации. Почему это так и что делать?
: When you're changing the map all items vanish from your inventory for a short time. That happens with the official client, too. To avoid this, add an additional check for an item that you always carry with you, like inventory "Jellopy" > 0
: Когда вы меняете локацию - список итемов в инвентаре полностью уничтожается на краткий миг. Такое случается и с официальным клиентом. Чтобы избежать такого ложного срабатывания добавьте еще одно условие в автомакрос - проверка на итем, который всегда есть с вами - например так: inventory "Jellopy" > 0.
 


; 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" или расставьте паузы "pause" между командами.


; Openkore ругается на файл macros.txt.
: Всегда сохраняйте файл macros.txt в формате UTF-8, желательно без BOM и ставьте комментарий в первой строке - символ #.
: Избегайте использования стандартного виндового Notepad. Вместо него используйте Notepad++, ('''Format > UTF-8 (without BOM)''')


; I'm getting Malformed UTF-8 character (''fatal''), what is this?
: This error happens when your macros.txt is not saved in UTF-8 encoding.
: To solve it, open your macros.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.)'''
: If you're using Notepad++ or other text editor, go to '''Format > UTF-8 (without BOM)''' and save.


== Author ==
== Авторы ==
The macro plugin was written by '''arachno'''.
Макро-плагин был написан '''arachno'''. В настоящее время исправления вносятся '''ezza'''.
Special thanks to '''ezza''' who is updating the macro plugin now.
Перевод данной статьи осуществил '''manticora''', при использовании более раннего перевода от '''4epT'''.


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

Текущая версия от 02:43, 12 августа 2021

С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли OpenKore или настроить автоматическое срабатываниe макроса в зависимости от некоторых условий при помощи автомакроса. Последняя версия макро-плагина - 2.0.3.


Установка

  • Скачайте Macro plugin: openkore-trunk.tar.gz.
  • Перейдите в папку OpenKore (которая содержит файл openkore.pl) и создайте новую папку plugins, если её ещё там нет.
  • В архиве с макро-плагином вы найдёте файл macro.pl и папку Macro. Распакуйте их в папку с плагинами - plugins.
  • В папке control создайте пустой текстовый файл macros.txt. В этот файл вы будете помещать ваши макросы и автомакросы.


После установки дерево папок OpenKore должно выглядеть примерно так (не считая файлов самой OpenKore):

openkore
|-- openkore.pl
|-- control
|   |-- macros.txt
|-- fields
|-- logs
|-- plugins
|   |-- Macro
|   |   |-- Automacro.pm
|   |   |-- Data.pm
|   |   |-- Parser.pm
|   |   |-- Script.pm
|   |   |-- Utilities.pm
|   |-- macro.pl
|-- src
|-- tables

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

Макро-плагин регистрирует одну-единственну консольную команду - macro. При помощи команды macro можно запускать макрос на выполнение, а также управлять выполнением макроса.

Запуск макроса

Далее приведен синтаксис команды macro в случае запуска макроса на выполнение.

macro <имямакроса> [опции] [-- параметр(ы)]

Запускает макрос <имямакроса>.

Опции

Опция Значение Описание
-repeat n повторяет макрос n раз
-overrideAI нет отключает искуственный интеллект OpenKore
-macro_delay n устанавливает задержку между командами макроса в n секунд, игнорируя значение macro_delay в файле timeouts.txt
-exclusive нет не позволит автомакросу прервать выполнение этого макроса
-orphan <метод> использует <метод> (terminate, reregister или reregister_safe) для обработки одиночного макроса

Параметры Параметры для макроса определяются после двойного тире (--). Эти параметры будут доступны в теле макроса через переменные $.param1, $.param2 и т.д. Например:

macro foo {
 log Parameter 1 is $.param1
 log Parameter 2 is $.param2
}

Если набрать в консоли macro foo -- foo bar то макрос выведет

[macro] Parameter 1 is foo
[macro] Parameter 2 is bar

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

macro list
Показывает список всех доступных макросов.
macro stop
Останавливает текущий макрос.
macro pause
Приостанавливает запущенный макрос.
macro resume
Включает приостановленный макрос.
macro version
Выводит на экран версию макро-плагина.
macro reset [<имямакроса(ов)>]
Сбрасывает "run-once" всех автомакросов или определённого автомакроса. Эту команду можно использовать для нескольких автомакросов сразу. Для этого имена автомакросов пишутся через пробел.
macro status
Показывает запущен ли какой-лиюо макрос в настоящее время. Если макрос запущен, то показывает:
status: running << запущен
delay: 10s << задержка перед следующей командой
line: 3 << текущая строка макроса
override AI: no << настройка опции "-overrideAI"
paused: no << поставлен ли марос на паузу
finished: no << закончен ли макрос
macro varstack
Показать все переменные, используемые macro-плагином (специальные или пользовательские).

Конфигурационные файлы

control/macros.txt
Пишите ваши макросы и автомакросы в этом файле. Вы можете изменить имя файла в параметре конфига macro_file. Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать первую строчку знаком #.
control/timeouts.txt
В этот файл добавьте параметр macro_delay и напишите, сколько секунд будет длиться пауза между командами в теле макроса. Например, задержка в одну секунду: macro_delay 1
control/config.txt
Параметр Значение Описание
macro_nowarn 0
1
0 или 1 - вкл. или выкл. раздражающие предупреждения когда автомакрос не использует команду call
macro_orphans terminate
reregister
reregister_safe
переопределяет поведение ИИ openkore в отношении "одиночных макросов".
macro_file имя файла содержащий макросы файл (по умолчанию "macros.txt")
macro_allowDebug 0
1
console-check also processes openkore's debug messages (по умолчанию выкл: 0). Внимание: Затормаживает плагин.


Макрос

macro MacroName {
   do this..
   and that..
   yattayatta..
}

Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Команды в макросе выполняются по порядку сверху вниз. Чтобы вызвать в теле макроса консольную команду, следует использовать команду macro-плагина do <консольная команда>.

do <консольная команда>
Выполняет <консольную команду>, как будто бы она была набрана в консоли OpenKore. Список консольных команд.
macro foo {
   do move 123 234 prontera
   do sit
   do c hello world
}
log <текст>
Выводит <текст> на консоль. В тексте можно использовать переменные макро-плагина, типа $variable, а также специальные ключевые слова, типа @config, @rand и т.д.
macro foo {
  log This line logs a text to console.
  log All your base are belong to us!
}
pause [<n>]
Останавливает макрос на n секунд.
macro foo {
   log It's 10:00:00
   pause 10
   log Now it's 10:00:10 
   log 10 seconds have passed after the first print.
}
call <имямакроса> [<n>]
Вызывает макрос с именем <имямакроса> <n> раз (n – целое число). Когда макрос <имямакроса> закончится, то текущий макрос продолжит работу.
release (<имяавтомакроса> | all)
Освобождает закрытый автомакрос, позволяя ему еще раз сработать, если выполнятся условия его срабатывания. Автомакрос мог быть закрыт условием "run-once 1" или командой "lock <имяавтомакроса>". Команда release all освобождает все закрытые в данный момент автомакросы.
lock (<имяавтомакроса> | all)
Закрывает автомакрос <имяавтомакроса> и выключает проверку условий срабатывания, не позволяя таким образом ему выполнится. Команда lock all закрывает все автомакросы.
stop
Немедленно прерывает выполнение текущего макроса.
set <опция> <значение>
Устанавливает <опции> соответствующее <значение>:
  • orphan <метод>
  • macro_delay <задержка>
  • overrideAI [0|1]
  • repeat <числораз>
  • exclusive [0|1]


Работа с переменными

Вы можете аботать со своими собственными переменными в теле макроса. Имя переменной начинается со знака доллара "$" и может содержать латинские буквы и цифры. Специально описывать переменную не надо. Достаточно лишь присвоить ей значение. Все переменные макроплагина - глобальные и доступны из любого места.

Присвоить переменной значение: $<имя переменной> = <значение>

Получить значение переменной: $<имя переменной>

Пример:

macro Hello {
   $var = Hello
   $var1 = World!
   log $var $var1
}

На консоль выведется сообщение:

[log] Hello World!

Если командой log вы хотите вывести символ доллара "$", то вам следует использовать символ обратная косая черта "\". Например так "\$":

macro money {
   log I have a lot of \$
}

Для увеличения или уменьшения значения переменной на 1, используйте: $<имяпеременной>++ или $<имяпеременной>--

macro Counter {
    $counter = 0
    log Counter is at $counter
    $counter++
    log Now it's $counter
    $counter--
    log It's back to $counter
}

На консоли выведется:

log Counter is at 0
log Now it's 1
log It's back to 0

Вы можете удалить созданную вами переменную присвоив ей значение 'undef' или 'unset', например:

$x = 1
log \$x is $x
$x = undef  # or you can use 'unset'
log \$x now vanished: $x

Для скложения двух переменных, а также для других операций над переменными следует использовать @eval , например:

macro math {
    $num = 2
    $num2 = 3
    $result = @eval($num+$num2)
    log Сумма чисел $num и $num2 равна $result
}

На консоли выведется:

log Сумма чисел 2 и 3 равна 5

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

macro foo {
  $list = banana, apple, strawberry, grape
  $var = [$list]
  log The first element of \$list is $var
  log Now \$list contains $list
}

На консоли выведется:

log The first element from $list is banana
log Now $list contains apple, strawberry, grape

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

Напоминание: Имена переменных состоят лишь из латинских букв и цифр.


Вложенные переменные

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

$a = "hello"

А вот так выглядит вложенная переменная:

${$a} = "world"

Здесь $a хранит в себе имя вложенной переменной. Т.е. вложенной переменной с именем hello присвоено значение world.

Пример 1:

macro foo {
    $name = Camila
    ${$name} = Brazil   # Note: ${name} is equal to $Camila now
    log $name lives on ${$name}
}

На консоль выведется:

log Camila lives on Brazil

Пример 2:

macro hh {
	$var = foo
	log $var
	${$var} = bar
	log ${$var}

	log Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20.
	$i = 0
	:zikl
		$i++
		${$i} = @rand(1,20)
		log $i ${$i}
	if ($i < 10) goto zikl
	
	log Выводим элементы массива и их значения задом наперед.
	$i = 11
	:zikl2
		$i--
		log $i ${$i}
	if ($i > 1) goto zikl2
}

На консоль выведется:

[macro log] foo
[macro log] bar
[macro log] Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20.
[macro log] 1 19
[macro log] 2 19
[macro log] 3 20
[macro log] 4 20
[macro log] 5 4
[macro log] 6 6
[macro log] 7 20
[macro log] 8 8
[macro log] 9 13
[macro log] 10 9
[macro log] Выводим элементы массива и их значения задом наперед.
[macro log] 10 9
[macro log] 9 13
[macro log] 8 8
[macro log] 7 20
[macro log] 6 6
[macro log] 5 4
[macro log] 4 20
[macro log] 3 20
[macro log] 2 19
[macro log] 1 19


Специальные переменные

Есть специальные предопределенные макро-плагином переменные, их имена начинаются с символов доллара и точки: "$.". Они доступны только на чтение.

  • $.map - карта, на которой вы находитесь ("prontera")
  • $.pos - координаты вашей текущей позиции ("123 234")
  • $.time - текущее время в unix-формате ("1131116304")
  • $.datetime - текущее число и время ("Fri Nov 4 15:59:36 2005")
  • $.hour - час
  • $.minute - минута
  • $.second - секунда
  • $.hp - hp, жизнь
  • $.sp - sp, мана
  • $.lvl - базовый левел персонажа
  • $.joblvl - джоб левел персонажа
  • $.spirits - количество сферок у монка или монеток у ганса
  • $.zeny - зеньги
  • $.status - список статусов персонажа, через запятую
  • $.paramN - параметры, с которым был запущен макрос из консоли OpenKore (смотри Консольные команды)
  • $.caller - имя сработавшего автомакроса, который запустил на выполнение текущий макрос
  • $.weight - вес инвентаря персонажа
  • $.maxweight - максимальная грузоподъемность персонажа


Специальные ключевые слова

Специальные ключевые слова начинаются со знака "@", возвращают значение в зависимости от переданных в скобках параметров.

@npc (<x> <y> | /regexp/i | "<name>")
Возвращает ID неписи, которая находится по координатам <x> <y> или имя неписи совпадает с шаблоном regexp или именем неписи является <name>. Возвращает -1 если не было найдено подходящей неписи.
@inventory (<item>)
Возвращает ID вещи <item> в инвентаре. Если вещи <item> нет, возвращает -1.
@Inventory (<item>)
Также как и @inventory возвращает ID вещи <item> в инвентаре. Но если таких вещей в инвентаре несколько, то возвращает ID всех вещей списком, разделяя ID запятыми. Если нет такой вещи в инвентаре, возвращает -1.
@invamount (<item>)
Возвращает количество вещей <item> в инвентаре.
@cart (<item>)
Возвращает ID вещи <item> в телеге. Если вещи <item> нет, возвращает -1.
@Cart (<item>)
Также как и @cart возвращает ID вещи <item> в телеге. Но если таких вещей в инвентаре несколько, то возвращает ID всех вещей списком, разделяя ID запятыми. Если нет такой вещи в телеге, возвращает -1.
@cartamount (<item>)
Возвращает количество вещей <item> в телеге.
@storage (<item>)
Возвращает ID вещи <item> на складе. Если вещи <item> нет, возвращает -1.
@Storage (<item>)
Так же как и @storage возвращает ID вещи <item> на складе. Но если таких вещей несколько, то возвращает ID всех вещей списком, разделяя ID запятыми. Если нет такой вещи на складе, возвращает -1.
@storamount (<item>)
Возвращает количество <item> на складе.
@player (<name>)
Возвращает ID игрока <name>. Если игрока <name> не видно, возвращает -1.
@monster (<name|ID>)
Возвращает ID моба <name|ID>. Если моба <name|ID> не видно, возвращает -1.
@vender (<name>)
Возвращает ID продавца <name>. Если продавца <name> не видно, возвращает -1.
@store (<name>)
Возвращает ID вещи <name> в магазине неписи. Если вещи <name> в списке товаров нет, возвращает -1.
@shopamount (<item>)
Возвращает количество вещей <item> в магазине.
@random ("<argument1>", "<argument2>", ...)
Возращает случайным образом один из перечисленных в скобках аргументов.
@rand (<n>, <m>)
Возвращает случайное число в диапазоне от <n> до <m> включительно.
@eval (<argument>)
Оценивает, вычисляет значение аргумента <argument>. Например, если "$v = 8", то результатом оператора "@eval ($v + 2)" будет число 10. Содержимое @eval - это выражение на языке Perl, и это выражение не имеет ничего общего с синтаксисом макроплагина. Разве что тут можно использовать переменные макроплагина вида $var и подстановки типа @npc.
@arg ("<argument>", <n>)
Возвращает <n>-ое слово из строки "<argument>". Слова в строке разделяются знаками: ,.:;\"\'!?\r\n. Если <n> больше количества слов в строке, то возвращается пустая строка. Аргумент <n> может быть как целым числом, так и целочисленной переменной. Например:
log @arg("aa, bb cc.dd",2)
$n = 3
log @arg("aa ! bb : cc . dd",$n)
@config (<variable>)
Возвращает значение параметра <variable> в конфиге config.txt.
@venderitem (<name>)
Возвращает ID вещи <name> в магазине игрока. Если вещи <name> в магазине игрока нет, возвращает -1.
@venderprice (<indexID>)
Возвращает цену вещи с ID <indexID> в магазине игрока.
@nick (<word>)
Экранирует все метасимволы regexp и некоторые специальные символы perl с помощью \ (обратный слэш). Придуман специально для экранирования некоторых имён персонажей. Например строчка
[S] Namrok кричит: продам 'девственность каи', "шутка"

будет преобразована в:

\[S\]\ Namrok\ кричит:\ продам\ \'девственность\ каи\',\ \"шутка\"

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

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

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 секунд.


Подстроки

Вместо использования по одной команде на строку, можно отделять команды между собой символом точки с запятой ";" и располагать их в одной строке. Таким образом можно сократить количество строк, особенно при использовании операций присвоения ($var = 1, ${$var} = 2), инкрементации (++), декрементации (--) и других (set, lock, release, log, pause, do). Подробнее: Forums

Пример:

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

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


Условия

В макросах (например в операторе if) можно использовать следующие условия:

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

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

Все высокоуровневые языки программирования, имея конструкции типа "if .. else", "while", "foreach", "for .. next", "do .. while" и вызов подпрограмм, сводятся к трём словам "if", "goto" и "while". Именно поэтому макро-плагин имеет только эти три ключевых слова. Так как нету видимой нумерации строк, для оператора goto требуются метки в теле макроса ":<имяметки>".

Оператор IF

Сейчас оператор if в макроплагине очень близок к perl-овому оператору if. Оператор if может принимать неограниченное количество выражений, разрешено использование регулярных выражений regexp, вместо and можно использовать && - логическое И, вместо or можно использовать || - логическое ИЛИ.

Синтаксис оператора IF

Можно использовать простое выражение:

if (arg1 <условие> arg2) (goto <label> | call <macro> [<n>] | stop)

Можно использовать простое выражение с уловием OR:

if (arg1 <условие> arg2 || arg3 <условие> arg4) (goto <label> | call <macro> <n> | stop)

Можно использовать простое выражение с уловием AND:

if (arg1 <условие> arg2 && arg3 <условие> arg4) (goto <label> | call <macro> <n> | stop)

Можно использовать простое выражение с обоими условиями OR и AND:

if ((arg1 <условие> arg2 || arg3 <условие> arg4) && arg5 <условие> arg6) (goto <label> | call <macro> <n> | stop)
if ((arg1 <условие> arg2 && arg3 <условие> arg4) || arg5 <условие> arg6) (goto <label> | call <macro> <n> | stop)
if ((arg1 <условие> arg2 && arg3 <условие> arg4) || (arg5 <условие> arg6 && arg7 <условие> arg8)) (goto <label> | call <macro> <n> | stop)
if ((arg1 <условие> arg2 || arg3 <условие> arg4) && (arg5 <condition> arg6 || arg7 <condition> arg8)) (goto <label> | call <macro> <n> | stop)
  • Заметим, что внутри каждой пары скобок есть символы AND или OR.

Где:

  • arg может быть переменной, вложенной переменной, специальным ключевым словом (@xxx), специальной переменной ($.xxx), @eval, буквами и цифрами или даже perl'овой функцией Perl Subroutines.
  • <label>, имя существующей метки, может состоять только из латинских букв и цифр.
  • <macro>, имя существующего макрос.
  • <n>, сколько раз подряд должен отработать макрос.

Заметка:

  • Если <n> равно нулю 0 или даже неопределено undefined, вызванный макрос запустится один раз и остановится, после чего вызвавший его макрос прекратит свою работу.
  • Если <n> больше нуля 0, вызванный макрос будет запущен n раз подряд, после чего вызвавший его макрос продолжит свою работу.

Заметка: В операторе IF можно использовать такое количество выражений, сколько необходимо.

if (arg1 <[macro#Условия|условие]]> arg2 || arg3 <условие> arg4 || ... || argN <условие> argN+1) (goto <label> | call <macro> <n> | stop)

Ревизия 8796, "If" postfix control.

Примеры оператора IF

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

Вышеописанный макрос выведет в консоль $num is 1 если $num == 1, $num is 2 если $num == 2, $num is 3 если $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 is 1
}
macro two {
    log $num is 2
}
macro three {
    log $num is 3
}

Более сложный макрос:

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

while (arg <condition> arg) as <loop>
    do bla bla
    ...
end <loop>

Где:

  • arg может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами.
  • <loop> - название цикла.
  • Условие - условие.

Пример оператора WHILE

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

На консоль выведется

log $i = 0
log $i = 1
log $i = 2
log $i = 3
log $i = 4
log $i = 5
log $i = 6
log $i = 7
log $i = 8
log $i = 9

Оператор SWITCH/CASE

В ревизии 8782 добавились операторы switch и case. Смотри форум Implementation of switch/case.

Автомакрос

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

Синтаксис

При выполнение всех условий вызывается макрос myMacro.

automacro <automacro name> {
    <conditions>
    call myMacro
}
macro myMacro {
    do move prontera
    do move payon
}

Или же можно отказаться от написания отдельного макроса и поместить команды прямо в блоке call { ... } автомакроса. В этом случае макрос тоже создаётся, но будет безымянным и его нельзя вызвать по имени.

automacro <automacro name> {
    <conditions>
    call {
		do move prontera
		do move payon
    }
}

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

automacro First {
    <conditions> 
    call print
}
 automacro Second {
    <conditions> 
    call print
}
macro print {
    log $.caller triggered
}

Условия в автомакросе

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

map <mapname>
Сработает, если текущая локация <mapname>.
location [not] <mapname [<x1> <y1> [<x2> <y2>]] [, ...]
Сработает, если текущая позиция [не] та, что указана в условии.
Если координаты <x1> <y1> и <x2> <y2> не заданы, то автомакрос будет запускаться, как и в случае map <mapname>.
Если указаны только координаты <x1> <y1>, то автомакрос запустится, если находясь на локации <mapname>, вы попадёте на координаты <x1> <y1>.
Если указаны координаты <x1> <y1> и <x2> <y2>, то автомакрос запустится, если находясь на локации <mapname>, вы попадёте в мнимый прямоугольник, где <x1> <y1> - верхняя левая точка, а <x2> <y2> - нижняя правая точка.
<x1> <y1> _______
         |       |
         |       |
         |_______|
                  <x2> <y2>
Следует отметить, что <x1> < <x2> и <y1> > <y2> .
Отделённые запятыми аргументы определяются как условие OR (или):
location geffen, prontera 123 234
Автомакрос запустится, если вы будете находиться в geffen или в prontera на координатах (123 234).
Несколько строк определяются как условие AND (и):
location not geffen
location not prontera
Автомакрос будет запускаться, если вы находитесь вне geffen и вне prontera.
mapchange ( <mapname> | any | * ) [, ...]
Автомакрос запустится, если вы поменяли текущую локацию на <mapname>. Если аргументом является any или * , то автомакрос сработает при любом изменении локации.
Отделённые запятыми аргументы определяются как условие OR (или).
hp <условие> <amount>[%]
Автомакрос сработает, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp.
Несколько строк определяются как условие AND (и).
sp <условие> <amount>[%]
Автомакрос сработает, когда ваше SP будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
spirit <условие> <amount>
Автомакрос сработает когда количество сферок у монка (или монеток у ганса) будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
weight <условие> <amount>[%]
Автомакрос сработает, когда вес инвентаря будет удовлетворять заданному условию. Можно использовать абсолютное значение <amount> или процентное <amount>%.
Несколько строк определяются как условие AND (и).
cartweight <условие> <amount>[%]
Автомакрос сработает, когда вес телеги будет удовлетворять заданному условию. Можно использовать абсолютное значение <amount> или процентное <amount>%.
Несколько строк определяются как условие AND (и).
zeny <условие> <amount>
Автомакрос сработает, когда количество зенег будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
cash <условие> <amount>
Автомакрос сработает, когда количество cash будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
Появилось в ревизии 8759.
soldout <условие> <slots>
Автомакрос србаотает, когда количество слотов в вашем магазине будет удовлетворять заданному условию. Например в автомакросе прописано "soldout > 1". Пусть в магазине продаются 4 элу и 5 ори. Когда у вас купят все ори или все элу сработает автомакрос. Если купят всего 1 элу, то слот будет считаться не полностью проданным и автомакрос не сработает.
Несколько строк определяются как условие AND (и).
status [not] <status> [, ...]
Автомакрос сработает, когда на персонаже [не] висит статус <status>.
Статусы "dead" и "muted" поддерживаются дополнительно.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
inventory "<item>" <условие> <amount> [, ...]
Автомакрос сработает, когда количество вещей "<item>" в инвентаре будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
storage "<item>" <условие> <amount> [, ...]
Автомакрос сработает, когда количество вещей <item> на складе будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
cart "<item>" <условие> <amount> [, ...]
Автомакрос сработает, когда количество вещей <item> в телеге будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
shop "<item>" <условие> <amount> [, ...]
Автомакрос сработает, когда количество вещей <item> в открытом вами магазине будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
base <условие> <level>
Автомакрос сработает, когда базовый уровень персонажа будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
job <условие> <level>
Автомакрос сработает, когда джоб уровень персонажа будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
class <job>
Автомакрос сработает, когда класс персонажа, т.е. его профессия, будет <job>. Например class Novice или class Acolyte.
spell [party] <spell> [, ...]
Автомакрос сработает, когда кто-то будет кастовать на персонажа заклинание <spell> или персонаж находится в зоне действия заклинания.
Party support syntax is included (optional). Also trigger on party member (as a target) by other party or monster. Ex: "spell party Lord of Vermilion"
Отделённые запятыми аргументы определяются как условие OR (или).
Присваивает значения переменным:
  • $.caster - возвращает кастовавшего заклинание (by player/monster), из-за которого сработало условие spell в автомакросе.
  • $.casterName - возвращает имя игрока или монстра, из-за которого сработало условие spell в автомакросе.
  • $.casterID - возвращает ID игрока или монстар, из-за которого сработало условие spell в автомакросе.
  • $.casterPos - возвращает позицию игрока или монстра, с которой кастовалось заклинание, из-за которого сработало условие spell в автомакросе.
  • $.casterSkill - возвращает имя заклинания или скила, из-за которого сработало условие spell в автомакросе.
  • $.casterTarget - возвращает местоположение цели заклинания, из-за которого сработало условие spell в автомакросе.
  • $.casterTargetName - возвращает имя сопартийца, который находится в радиусе заклинания, из-за которого сработало условие spell в автомакросе.
  • $.casterDist - возвращает дистанцию между персонажем и кастовавшим заклинание, из-за которого сработало условие spell в автомакросе.
monster [not] <monster(s) name> <условие> [<distance>]
Автомакрос сработает, когда монстр <monster(s) name> рядом. Если дистанция <distance> не указаны, вместо неё берётся значение из конфига clientSight.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
Присваивает значения переменным:
  • $.lastMonster - возвращает имя монстра, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterPos - возвращает позицию монстра, из-за которого сработало условие monster в автомакросе. Например: x, y map_name
  • $.lastMonsterDist - возвращает дистанцию между персонажем и монстром, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterID - возвращает ID монстра, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterCount - возвращает степень риска, исходящию от монстра, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterBinID - возвращает тип монстра (введено в ревизии 8509).
aggressives <условие> <number>
Автомакрос сработает, когда количество агрессивных монстров будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
player ("<player name>" | /<regexp>/[i]) [, <distance> ]
Автомакрос сработает, когда игрок <player name> в пределах видимости и не дальше чем число клеток <distance>. В качестве имени можно использовать либо строго заданное: "4epT" (пишется в кавычках), либо шаблон: /4epT/ (пишется через слэш). Разница в том, что на имя 4epTik первое условие не сработает (то, что в кавычках), а второе сработает (так как слово 4epTik сожершит буквы 4epT).
Несколько строк определяются как условие AND (и).
Присваивает значения переменным:
  • $.lastPlayerName - имя игрока (это и далее появилось в ревизии 8484).
  • $.lastPlayerPos - местоположение игрока в виде: x, y map_name
  • $.lastPlayerLevel - уровень игрока
  • $.lastPlayerJob - профа игрока
  • $.lastPlayerAccountId - ID учетки игрока (это и далее появилось в ревизии 8490).
  • $.lastPlayerBinId - binID/index игрока
equipped [<slot>] (<item> | none) [, ...]
Автомакрос сработает, когда вещь <item> одета, или не одето ничего <none>. Необязательно, но можно указать слот <slot>.
Спикок слотов topHead, midHead, lowHead, leftHand, rightHand, robe, armor, shoes, leftAccessory, rightAccessory и arrow.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
var <имя_переменной> (unset | <условия> <значение>)
Автомакрос сработает, когда <переменная> не определена <unset>, или удовлетворяет заданному условию.
Несколько строк определяются как условие AND (и).
Примечание: в этом параметре указывает ТОЛЬКО имя переменной без символа «$». Пример:
automacro variable {
  var test unset
  timeout 5
  call {
    log test is unset: $test
  }
}
macro set_test {
  $test = 1
  log variable \$test = $test
}
varvar <nested variable> (unset | <условия> <значение>)
Автомакрос сработает, когда вложенная переменная <nested variable> не определена <unset>, или удовлетворяет заданному условию.
Несколько строк определяются как условие AND (и).
console ("<text>" | /<regexp>/[i])
Автомакрос сработает, когда на консоли появится текст <text>, или появившийся на консоли текст удовлетворяет регулярному выражению <regexp>.
Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
Присваивает значения переменным:
  • $.lastLogMsg - возвращает консольный текст, из-за которого сработало условие console в автомакросе.
  • $.lastMatchN - возвращает текст, который был заключен в круглые скобки в регулярном выражении.
pm ("<text>" | /<regexp>/[i]) [, <player>]
Автомакрос сработает, когда в приватном сообщении появится <text> от игрока [<player>], или приватное сообщение удовлетворяет заданному регулярному выражению <regexp>.
Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
Присваивает значения переменным:
  • $.lastpm - возвращает имя игрока, который написал приватное сообщение, из-за которого сработало условие pm в автомакросе.
  • $.lastpmMsg - возвращает приватное сообщение, из-за которго сработало условие pm в автомакросе.
pubm ("<text>" | /<regexp>/[i]) [, <distance>]
Автомакрос сработает, когда в общем чате будет получено сообщение <text> [и дистанция между персонажем и говорившим не превишает <distance>], или сообщение удовлетворяет заданному регулярному выражению <regexp>.
Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
Присваивает значения переменными:
  • $.lastpub - имя персонажа, который послал в общий чат сообщение, из-за которого сработало условие pubm в автомакросе.
  • $.lastpubMsg - сообщение в общем чате, из-за которого сработало условие pubm в автомакросе.
party ("<text>" | /<regexp>/[i])
Автомакрос сработает, когда в партийном чате будет получено сообщение <text>, или сообщение удовлетворяет заданному регулярному выражению <regexp>.
Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
Присваивает значения переменным:
  • $.lastparty - имя персонажа, который послал в партийном чате сообщение, из-за которого сработало условие party в автомакросе.
  • $.lastpartyMsg - сообщение в партийном чате, из-за которого сработало условие party в автомакросе.
guild ("<text>" | /<regexp>/[i])
Автомакрос сработает, когда в гильдийном чате будет получено сообщение <text>, или сообщение удовлетворяет заданному регулярному выражению <regexp>.
Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
Присваивает значения переменным:
  • $.lastguild - имя персонажа, который послал в гильдийном чате сообщение, из-за которого сработало условие guild в автомакросе.
  • $.lastguildMsg - сообщение в гильдийном чате, из-за которого сработало условие guild в автомакросе.
playerguild (<guild list> [, ...] | <guild.txt>) [, <distance>]
Автомакрос сработает, когда имя гильдии, в которой находится персонаж, совпадает с именем в списке <guild list> (где имена гильдий разделены запятыми (guild1, guild2, ..., guildN)), или в файле control/guild.txt. Имя гильдии получают из "hook-on-demand" пакета charNameUpdate или player. Дальнейшая информация на форуме OpenKore Forums.
Если дистанция <distance> не указаны, использует значение clientSight из конфига.
Список имён гильдий, разделенных запятыми, рассматривается как условие OR (или).
Присваивает значения переменным:
  • $.lastPlayerID - возвращает ID аккаунта игрока, из-за которого сработало условие playerguild в автомакросе.
  • $.lastGuildName - возвращает имя гильдии игрока, из-за котогоро сработало условие playerguild в автомакросе.
  • $.lastGuildNameBinID - возвращает ID игрока, из-за которого сработало условие playerguild в автомакросе.
  • $.lastGuildNameBinIDDist - возвращает дистанцию от вашего персонажа, до персонажа, из-за которого сработало условие playerguild в автомакросе.
  • $.lastGuildNameBinIDName - возвращает имя игрока, из-за которого сработало условие playerguild в автомакросе.
  • $.lastGuildNameBinIDJobName - возвращает класс, т.е. профессию игрока, из-за которого сработало условие playerguild в автомакросе.
hook <hookname>
Автомакрос сработает, когда OpenKore вызовут хук <hookname>.
save <hash key> (используется в комбинации с hook)
Когда автомакрос сработает по условию hook, то это условие сохранит значение из хэша <hash key> в переменной $.hooksaveN.
automacro hook {
   hook packet_privMsg
   save MsgUser
   save Msg
   call {
         log Player $.hooksave1 said $.hooksave2
         }
}
whenGround [not] <spell>
Автомакрос сработает, когда персонаж [не] находится в зоне действия площадного скила <spell>.
Имена скилов через запятые рассматриваются как условие OR (или).
areaSpell <spell> [<distance>]
Автомакрос сработает, когда кто-то использует умение и центр кастуемого на землю умения находится в пределах дистанции <distance> или, если дистанция не указана, в пределах видимости, указываемой в параметре конфига clientSight конфига. Если параметр конфига clientSight пуст, то используется значение по умолчанию - 20.
Список аргументов через запятые, рассматривается как условие OR (или).
Присваивает значения переменным:
  • $.areaName - возвращает название умения, кастуемого по площади
  • $.areaActor - возвращает тип актора (игрок, моб и так далее)
  • $.areaSourceName - возвращает имя актора
  • $.areaSourceID - возвращает идентификатор актора binID
  • $.areaPos - возвращает координаты центра, где находится скастованное умение (например: 123 123 payon)
  • $.areaDist - возвращает расстояние от вашего персонажа до центра умения

Пример:

automacro warp {
     areaSpell Warp Portal <= 7  # через запятую пишется список из имён умений, условий и дистанций
                                 # без условия и дистанции берётся расстояние $config(clientSight)
                                 # или 20 как значение по умолчанию.
     call {
          log Умение: $.areaName, тип актора: $.areaActor.
          log Умение $.areaName скастовано $.areaSourceName ($.areaSourceID) на координаты "$.areaPos" (дист= $.areaDist)
     }
}

Источник: areaSpell automacro syntax Macro 2.0.3-SVN by ezza.

localtime <условие> <time>
Автомакрос сработает, когда время на внутренних часах компьютера удовлетворяет условию <условие> <time>.
Формат времени <time> - 24-часовой. Например: 15:22:33 (час:минута:секунда)
Несколько строк с условием localtime рассматриваются как условие AND (и).
первоисточник
eval <perl expression>
Автомакрос сработает, когда указанное перловое выражение <perl expression> будет истинно, то есть иметь значение true.
run-once (0 | 1)
Если этот параметр автомакроса установлен в 1, то после срабатывания автомакрос будет залочен, т.е. закрыт и не сможет больше проверять условия и срабатывать на них. Другими словами, автомакрос сработает только один раз.
Используйте команду release в макросе, чтобы разлочить, т.е. отрыть автомакрос, чтобы он мог опять когда-нибудь сработать.
overrideAI (0 | 1)
Если этот параметр автомакроса установлен в 1, то вызываемый макрос будет игнорировать openkore'овый AI. Это значит, что не будет пауз от команд "move" или "status dead".
delay <n>
Если этот параметр автомакроса установлен, то после срабатывания автомакроса пройдёт <n> секунд перед тем, как будет запущен соответствующий макрос.
timeout <n>
Если этот параметр автомакроса установлен, то пройдет как минимум <n> секунд перед тем, как автомакрос сможет сработать снова.
macro_delay <n>
Если этот параметр автомакроса установлен, то он переопределяет глобальное значение macro-задержки для вызываемого макроса.
priority <num>
Этот параметр автомакроса определяет, в какой очередности проверяются автомакросы на удовлетворение условий срабатывания. Чем меньше значение <num> этого параметра, тем меньше будет ждать автомакрос в очереди. Если параметр не задан, то предполагается, что priority 0, т.е. проверяется в первую очередь.
exclusive (0 | 1)
Если этот параметр автомакроса установлен в 1, то выполнение этого автомакроса не может быть прервано срабатыванием другого автомакроса.
set <variable> <value>
Этот параметр автомакроса устанавливает переменной <variable> значение <value>. Этот параметр можно использовать несколько раз.
orphan <method>
Этот параметр определяет метод для обработки макроса, если тот станет "одиночным" orphaned macros.

Пример

automacro sp {
   location prontera
   run-once 1
   call {
       log i'm on prontera o/
   }
}


Всегда закрывайте фигурные скобки { и }.


Одиночные макросы

Иногда случается так, например когда используется команда ai clear во время работы макроса, что макрос становится "одиночным". Имеется в виду, что сам объект макроса есть в памяти, но макрос не может выполняться дальше. Ибо макросу нужен OpenKore'вый AI с "macro" или "deal" на первом месте очереди. После команды ai clear очередь этого самого AI очищается и объект "macro" уничтожается.

В связи с этим есть три метода:

terminate останавливает, прерывает одиночный макрос (всёравно что команда в консоли macro stop)
reregister перерегистриурет одиночный макрос в очередь AI, перекрывая другие записи. Это означает принудительное продолжение макроса.
reregister_safe перерегистрирует одиночный макрос в очередь AI, когда AI простаивает и ему нечего делать. Это означает, что макрос продолжится после завершения других неотложных дел, стоящих в очереди к AI.


Perl'овые подпрограммы

Макро-плагин поддерживает использование Perl'овых подпрограмм в файле macros.txt. Теперь можно создавать какую-нибудь простую функцию на Perl'е, не стесняя себя ограничениями команды eval.

Пример 1 - как создать 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;
}


Пример 2 - как создать Perl'овую подпрограмму для записи значений в файл.

automacro confHP1 {
   hp > 85%
   exclusive 1
   run-once 1
   set setting Demon Pungus   #becareful on your case, its case sensitive
   set attack 1
   set teleport 0
   set telesearch 1
   call HP
}
automacro confHP2 {
   hp < 75%
   exclusive 1
   run-once 1
   set setting Demon Pungus
   set attack 1
   set teleport 2
   set 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;
}

Комментарии в макросах

Комментарии в файле с макросами начинаются со знака #, всё после этого символа игнорируется макро-плагином.

  • Начинающиеся со знака # строки являются комментарием.
  • Всё после пробела и знака # также считается комментарием.
macro happy {
     # this is a comment line
    log I'm Happy # this is also a comment
}

На консоль будет выведено:

[log] I'm Happy


Приложение. Примеры

Предполагается, что вы знаете как использовать консольные команды OpenKore и понимаете, как они работают. Если это не так, прежде чем идти дальше, пробегитесь по разделу консольных команд консольные команды и попробуйсте некоторые команды, например a, ai, move, cart get, storage add, talk, deal, take, sl, sm, relog, pm и может быть другие.

Есть два типа макросов:

  1. automacro – автомакросы, они срабатывают автоматически.
  2. macro – просто макросы, они не срабатывают автоматически, их нужно запускать из консоли OpenKore руками или автомакросом.


Автомакрос

Автомакрос - это макрос, который срабатывает автоматически, когда выполняются заданные условия. Вся суть автомакроса в проверке условий срабатывания. Если все условия автомакроса выполняются, то запускаются команды из блока call { ... } или вызывается call <имямакросса>. Формат автомакроса:

automacro <name> {
        condition 1
        condition 2
        …...
        …...
        call {
                command 1
                command 2
                …..
                …..
        }
        timeout <n seconds> #(if necessary)
}


Наример, предположим, что вы играете руками в Ragnarok, но у вас есть ведомый прист под управлением OpenKore. Нужно сделать так, чтобы прист предупреждал, если у него осталось мало маны. Это можно сделать так:

automacro sp {
   sp < 200
   call {
      do c sp low
   }
   timeout 10
}

Разберём этот автомакрос строка за строкой,

  1. automacro sp { - Ключевое слово automacro говорит Kore о том, что это автомакрос. Далее пишется имя, которое вы дали автомакросу. В данном случае - sp. Дальще следует открывающая фигурная скобка “{“, после неё следует тело автомакроса.
  2. sp < 200 – После “{“ следует написать условия срабатывания автомакроса. В данном случае используется только одно условие, которое выполняеется, когда мана, количество SP у персонажа опускается ниже 200 единиц.
  3. call { – Ключевое слово “call” сообщает Kore что делать в том случае, если все условия выполняются и автомакрос срабатывает. Здесь пишутся команды. Открывающая скобка “{“ говорит Kore, что команды будут описаны прямо в теле автомакроса.
  4. do c sp low – “do” говорит Kore выполнить консольную команду, в данном случае "c sp low". Т.е. напечатать в общий чат фразу "sp low".
  5. } – Эта закрывающая скобка “}” говорит Kore, что команды кончились.
  6. timeout 10 – Этот параметр заботится о том, чтобы автомакрос срабатывал не чаще, чем один раз в десять секунд. Таким образом прист не будет спамить в чат каждые пол секунды.
  7. } – Эта закрывающая скобка “}” говорит Kore, что код автомакроса закончен.

Короче, если сп у бота будет меньше 200, он будет говорит в общий чат "sp low".


Следующий макрос демонстрирует как реагировать на всякие странные ситуации. Например металлинги могу стрипнуть оружие и тогда боту придётся туго. Настройте боту оружие по умолчанию и используйте следующий автомакрос. Короче говоря, как только у персонажа стрипнут оружие, он телепортируется от моба и делает релог через 10 секунд. После релога бот сам оденет оружие, так как оно в конфиге было настроено как оружие по умолчанию.

automacro strip {
   status Strip Weapon
   timeout 10
   call {
      do tele
      do relog 10
   }
}


Следующий автомакрос демонстрирует, как ако-производные с прокачанным скилом "варп портал" могут добираться до локации кача. Когда бот оказывается вне города по пути к lockMap, например на gef_fild07 - срабатывает данный автомакрос. "do ai manual" используется для того, чтобы ИИ Коры не вмешивался в действия макроса, в данном случае, чтобы бот не двигался. "pause" нужна для того, чтобы бот успел скастовать варп портал.

automacro warp {
   map gef_fild07
   inventory "Blue Gemstone" > 0
   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
   }
   timeout 20
}

В макро-плагине есть много полезных встроенных переменных, которые, например, хрянят позицию персонажа. Эти переменные начинаются со знаков "$." и они уже были описаны выше. Следующий пример демонстрирует, как получить координаты x и y по отдельности. $.pos хранит позицию персонажа в виде "123 34". Код, для получения x и y координат:

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

Координата x - первое слово в строке $.pos, поэтому нужно поставить "1". Координата y - второе слово в строке$.pos, значит ставим "2".

Если в автомакросе есть условие "monster", то переменная $.lastmonsterpos будет хранить позицию этого монстра. Чтобы вытащить координаты x и y из этой переменной, используем следующий код:

$mx = @arg ("$.lastMonsterPos", 1)
$my = @arg ("$.lastMonsterPos", 2)


run-once против timeout

Часто в автомакросах используется условие run-once вместо условия timeout. Таким образом автомакрос срабатывает один раз. Чтобы автомакрос мог сработать еще раз - применяют команду releaese, как правило эта команда стоит в конце вызываемого макроса. Однако из-за различных причин макрос может зависнуть, не выполнившись до конца и не разблокировав автомакрос командой release. Таким образом автомакрос полностью теряет работоспособность. Чтобы этого избежать, не надо пользоваться условием run-once вместо условия timeout. Используйте условие timeout.


automacro против macro

В трех вышеприведённых примерах всё делается исключительно средствами автомакроса (имеется ввиду использование call { команды }, а не call имямакроса). Возникает логичный вопрос, зачем нужны простые макросы? Дело в том, что не всё можно сделать, используя только автомакросы. Так, например, невозможно использовать встроенные переменные, такие как $.pos, в автомакросе. Если выводится ошибка типа “not an automacro variable”, то это нельзя сделать автомакросом - необходимо использовать конструкцию call <имямакроса>, вызывая таким образом макрос.


Регулярные выражения - regexp

Иногда в макросе нужно сравнить, например, имена персонажей вокруг вас с определенным именем или его частью. Вот в этом случае нужны регулярные выражения. Не всем и не сразу приходится сталкиваться с регулярными выражениями в макро-плагине, но чем больше вы занимаетесь макрописанием, тем больше вам надо знать про регулярные выражения. Посетите страницу http://www.regular-expressions.info/quickstart.html, где очень хорошо объясняется, что такое и как функционируют регулярные выражения. Вот краткий пример, чтобы продемонстрировать regexp:

$.lastpubMsg = /(A|a)uto (S|s)torage/

Здесь $.lastpubMsg - переменная макроплагина, хранящая последнее сообщение из общего чата. Регулярное выражение может быть просто чистым текстом, например /auto storage/ или /auto/. Тогда это выражение сработает, когда в общем чате появится сообщение, содержащее "auto storage" или "auto".

Тем не менне мы использовали символ "|", означающий "или". Заметьте, что 'A' и 'a' стоят в круглых скобках и разделены символом палки '|'. Это значит, что шаблону подойду оба слова 'auto' и 'Auto'. Таким же образом оба слова 'storage' и 'Storage' тоже подпадают под это регулярное выражение.

Допустим, что первый символ 'A' или 'a' может повторяться несколько раз. Тогда следует изменить регулярное выражение, добавив знаки плюс '+':

/(a+|A+)uto (S|s)torage/ 

Знак плюс означает, что стоящий перед этим плюсом символ должен присутствовать в тексте один и более раз. Таким образом, если в общий чат скажут что-то типа "aaaaaaaaaauto storage", то регулярное выражение найдет совпадение в тексте. В регулярных выражениях знак плюс '+' относится к группе так называемых квантификаторов. Кроме плюса есть и другие квантификаторы:

  • * символ перед знаком умножить может не встречаться вообще, или встречаться сколько угодно раз. Еще говорят - встретиться ноль или более раз. Например, регулярное выражение /(a*|A*)uto Storage/ найдет совпадение в строке "uto storage".
  • + символ перед знаком плюс должен встретиться хотя бы один раз. Еще говорят - встретиться один или более раз.
  • ? символ перед вопросительным знаком должен встретиться в тексте не более одного раза, или не встретиться вообще. Еще говорят - встретиться один раз или ни разу. Например, регулярное выражение /(a?|A?)uto Storage/ найдет совпадение в строке "uto storage" и "auto storage", но не сработает на "aaaauto storage".


Таким образом, если надо проверить строку на наличие слова "Kobold" - просто пишем /Kobold/. Тогда регулярное выражение сработает, если где-то в строке встретилось слово "Kobold". В случае с "Kobold-1" и "Kobold-2" можно обойтись и /Kobold-(1|2)/.

Регулярные выражения очень часто пригождаются в условии автомакроса - "console /<regexp>/".

Это всего лишь основы, объяснённые на пальцах, читайте мануалы по регэкспам.

Как писать макросы

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

  • Определитесь, при каких именно услових должен срабатывать ваш автомакрос (а при каких - нет)
  • Продумайте последовательно шаги, которые должен выполнить ваш бот, чтобы достичь цели.
  • Удостоверьтесь, что везде проставленны паузы.
  • Удостоверьтесь, что в автомакросе есть условие "timeout" или "run-once", чтобы автомакрос не зациклился, срабатывая по сто раз в секунду.
  • Закоментируйте первую строку в файле macros.txt - поставьте сиивол # в самое начало первой строки файла macros.txt.
  • Поместите написанный код в файл macros.txt и запустите openkore. Если openkore уже запущена, напишите в консоли "reload macros.txt". Если всё в порядке - то никаких сообщений об ошибках не будет. Но если есть синтаксические ошибки, например вы пропустили "}", тогда вы получите ошибку и макрос не будет работать. Ошибку найти, исправить, файл macros.txt сохранить, в консоли написать "reload macros.txt", заново запустить макрос.


FAQ

У меня есть автомакрос, который проверяет количество итемов в инвентаре/телеге - нет итемов, или их меньше какого-то числа? Например inventory "red potion" <= 30. Но этот автомакрос срабатывает при каждой смене локации. Почему это так и что делать?
Когда вы меняете локацию - список итемов в инвентаре полностью уничтожается на краткий миг. Такое случается и с официальным клиентом. Чтобы избежать такого ложного срабатывания добавьте еще одно условие в автомакрос - проверка на итем, который всегда есть с вами - например так: inventory "Jellopy" > 0.
Меня отсоединило от мап-сервера в то время, как работал макрос!
Значит ваш макрос слал команды слишком быстро. Увеличьте задержку "macro_delay" или расставьте паузы "pause" между командами.
Openkore ругается на файл macros.txt.
Всегда сохраняйте файл macros.txt в формате UTF-8, желательно без BOM и ставьте комментарий в первой строке - символ #.
Избегайте использования стандартного виндового Notepad. Вместо него используйте Notepad++, (Format > UTF-8 (without BOM))


Авторы

Макро-плагин был написан arachno. В настоящее время исправления вносятся ezza. Перевод данной статьи осуществил manticora, при использовании более раннего перевода от 4epT.