macro

Материал из RO-fan
Перейти к: навигация, поиск

С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли 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 << закончен ли макрос


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

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

Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Команды в макросе выполняются по порядку сверху вниз. Чтобы вызвать в теле макроса консольную команду, следует использовать команду макроплагина 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 <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)
  • Заметим, что внутри каждой пары скобок есть символы AND или OR.

Где:

  • 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)

Ревизия 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> - название цикла.
  • Условие - Conditions.

Пример оператора 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 <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 (и).
cash <condition> <amount>
Автомакрос сработает, когда количество cash будет удовлетворять заданному условию.
Несколько строк определяются как условие AND (и).
Появилось в ревизии 8759.
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 в автомакросе.
  • $.lastMonsterBinID - возвращает тип монстра (введено в ревизии 8509).
aggressives <condition> <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 <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 конфига. Если параметр конфига 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 <condition> <time>
Автомакрос сработает, когда время на внутренних часах компьютера удовлетворяет условию <condition> <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.