macro

Материал из Руководство по OpenKore
Версия от 21:55, 3 февраля 2010; Manticora (обсуждение | вклад) (продолжается перевод статьи про макро-плагин)
Перейти к навигации Перейти к поиску

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

Установка

  • Скачайте Macro plugin. Вы можете взять его тут или из SVN.
  • Перейдите в папку 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 <имямакроса> [опции] [-- параметр(ы)]


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

Опции

Опция Значение Описание
-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 << закончен ли макрос

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

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..
}

Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Все консольные команды Openkore могут быть использованы в макросе - Console Commands.


do <команда>
Выполняет консольную <команду>. Список команд консоли Console Commands.
macro foo {
   do move 123 234 prontera
   do sit
   do c hello world
}


log <текст>
Выводит <текст> на консоль.
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]


Создание и работа с переменными

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

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


Можно использовать @eval внутри другого @eval, например:

macro math {
    $num = 2
    $num2 = 3
    $result = @eval(@eval($num+$num2) - @eval($num+$num2))
    log ($num + $num2) - ($num + $num2) = $result
}


Оператор Описание
+ Сложение
- Вычитание
* Умножение
/ Деление

Допустим, переменной $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 $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 (смотри Commands)
  • $.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.
@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.


@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>)
Escapes all the regexp metacharacters and some of the perl special characters with \ (a backslash). Especially for player's name.

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

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

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) можно использовать следующие условия:

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

Оператор Описание
< меньше
<= меньше либо равно
== равно
> больше
>= больше либо равно
!= не равно
~ <леваячасть> есть элемент <праваячасть>, где <праваячасть> список, разделенный символом запятой ","
=~ проверяет регулярное выражение 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 <Conditions> arg2) (goto <label> | call <macro> [<n>] | stop)

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

if (arg1 <Conditions> arg2 || arg3 <Conditions> arg4) (goto <label> | call <macro> <n> | stop)

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

if (arg1 <Conditions> arg2 && arg3 <Conditions> arg4) (goto <label> | call <macro> <n> | stop)

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

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

Где;

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


Заметка:

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


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

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

Где;

  • arg может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами.
  • All the conditions is up to the Nth argument <Conditions> N+1th argument.
  • While N is an integer number/s which is greater than zero.

Примеры

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
    :one
    log \$num is 2
    stop
    :one
    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> - название цикла.

Условия Conditions.

Пример

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

Автомакросы

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

Синтаксис

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

automacro <name> {
    <conditions> <values>
    call <macro>
}

При выполнении всех условий макрос не вызывается, но выполняются команды <commands> в фигурных скобках

automacro <name> {
    <condition> <values>
    call {
          <commands>
        }
}

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

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 <condition> <amount>[%]
Автомакрос сработает, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp.
Несколько строк определяются как условие AND (и).


sp <condition> <amount>[%]
Автомакрос сработает, когда ваше SP будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).


spirit <condition> <amount>
Автомакрос сработает когда количество сферок у монка (или монеток у ганса) будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).


weight <condition> <amount>[%]
Автомакрос сработает, когда вес инвентаря будет удовлетворять заданному условию. Можно использовать абсолютное значение <amount> или процентное <amount>%.
Несколько строк определяются как условие AND (и).


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


zeny <condition> <amount>
Автомакрос сработает, когда количество зенег будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).


soldout <condition> <slots>
Автомакрос србаотает, когда количество слотов в вашем магазине будет удовлетворять заданному условию. Например в автомакросе прописано "soldout > 1". Пусть в магазине продаются 4 элу и 5 ори. Когда у вас купят все ори или все элу сработает автомакрос. Если купят всего 1 элу, то слот будет считаться не полностью проданным и автомакрос не сработает.
: Несколько строк определяются как условие AND (и). 


status [not] <status> [, ...]
Автомакрос сработает, когда на персонаже [не] висит статус <status>.
Статусы "dead" и "muted" поддерживаются дополнительно.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).


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


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


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


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


base <condition> <level>
Автомакрос сработает, когда базовый уровень персонажа будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).


job <condition> <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> <condition> [<distance>]
Автомакрос сработает, когда монстр <monster(s) name> рядом. Если дистанция <distance> не указаны, вместо неё берётся значение из конфига clientSight.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).
Присваивает значения переменным:
  • $.lastMonster - возвращает имя монстра, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterPos - возвращает позицию монстра, из-за которого сработало условие monster в автомакросе. Например: x, y map_name
  • $.lastMonsterDist - возвращает дистанцию между персонажем и монстром, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterID - возвращает ID монстра, из-за которого сработало условие monster в автомакросе.
  • $.lastMonsterCount - возвращает степень риска, исходящию от монстра, из-за которого сработало условие monster в автомакросе.


aggressives <condition> <number>
Автомакрос сработает, когда количество агрессивных монстров будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).


player ("<player name>" | /<regexp>/[i]) [, <distance> ]
Автомакрос сработает, когда игрок <player name> в пределах видимости и не дальшк чем число клеток <distance>. В качестве имени можно использовать либо строго заданное: "4epT" (пишется в кавычках), либо шаблон: /4epT/ (пишется через слэш). Разница в том, что на имя 4epTik первое условие не сработает (то, что в кавычках), а второе сработает (так как слово 4epTik сожершит буквы 4epT).
Несколько строк определяются как условие AND (и).


equipped [<slot>] (<item> | none) [, ...]
Автомакрос сработает, когда вещь <item> одета, или не одето ничего <none>. Необязательно, но можно указать слот <slot>.
Спикок слотов topHead, midHead, lowHead, leftHand, rightHand, robe, armor, shoes, leftAccessory, rightAccessory и arrow.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк определяются как условие AND (и).


var <variable> (unset | <condition> <value>)
Автомакрос сработает, когда переменная <variable> не определена <unset>, или удовлетворяет заданному условию.
Несколько строк определяются как условие AND (и).


varvar <nested variable> (unset | <condition> <value>)
Автомакрос сработает, когда вложенная переменная <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 конфига.
Список аргументов через запятые, рассматривается как условие OR (или).


localtime <condition> <time>
Автомакрос сработает, когда время на внутренних часах компьютера удовлетворяет условию <condition> <time>.
Формат времени <time> - 24-часовой. Например: 15:22:33 (час:минута:секунда)
Несколько строк с условием localtime рассматриваются как условие AND (и).


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;
}

Комментарий

Комментарии в файле с макросами начинаются со знака #, всё после этого символа игнорируется макро-плагином. The macro files allow comments, i.e. lines that are ignored by the macro plugin.

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

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

[log] I'm Happy

Примеры и пояснения

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

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

  1. automacros – эти срабатывают автоматически.
  2. macros – эти не срабатывают автоматически, их нужно запускать из консоли 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".


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

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


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

  1. automacro strip { - это автомакрос, назван Strip, "{" - начинает тело автомакроса
  2. status Strip Weapon - условие срабатывания автомакроса - статус: оружие стрипнуто
  3. call { - после "call" и "{" пишутся команды,
  4. 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.....
  5. do relog 10 - Tells Kore to relogin in 10 seconds, because when you login again, your "strip weapon" status is cleared.
  6. } - The closing bracket '}' tells Kore the commands have ended.
  7. 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.
  8. } - 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 {
   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
}


Taking it line by line,

  1. automacro warp { - As explained, the automacro's name is warp, and “{“ indicates that the automacro begins.
  2. map get_fild07 - The first condition, the automacro will only trigger if the map is gef_fild07.
  3. 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.
  4. call { - Tells Kore that the commands start here.
  5. 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.
  6. 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.
  7. do move 319 187 - The “move” console command is used to move your bot to a set location.
  8. 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).
  9. 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.
  10. do warp 1 - Console command “warp” is used to select memo location 1.
  11. pause 1 - 1 second delay to allow the portal to form.
  12. do move 316 188 - Move to the portal and Voila! You have been warped to the map.
  13. do ai on - You set ai to manual at the beginning of this macro, so now you need to turn it back on.
  14. } - Closing bracket indicates end of commands.
  15. 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.
  16. } - 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,

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


"run-once"

Frequently, the run-once condition is used instead of a timeout. It allows the automacro to run only once so that the automacro isn't spammed. To get the automacro to run again, a release command needs to be executed. However, due to a rogue situation that the macro hangs and the release macro isn't executed, your automacro is effectively stuck. To get around this, use a timeout instead of using run-once.


The normal macros

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.


Regular Expressions

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/

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".

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.


Now suppose you want to check for repetition, say 'aauto storage' also, then you may use:

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

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.


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)/.

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

  • 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

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?
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


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


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. Special thanks to ezza who is updating the macro plugin now.