Макро-плагин
Материал из RagBot
С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли 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>)
- 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) можно использовать следующие условия:
| Оператор | Описание |
|---|---|
| < | меньше |
| <= | меньше либо равно |
| = или == | равно |
| > | больше |
| >= | больше либо равно |
| != | не равно |
| ~ | <леваячасть> есть элемент <праваячасть>, где <праваячасть> список, разделенный символом запятой "," |
| =~ | <леваячасть> подпадает под регулярное выражение - 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)
Примеры оператора 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
Автомакрос
Автомакрос содержит условия, при удовлетворении всех заданных условий начинает работать связанный с автомакросом макрос или список команд.
Синтаксис
При выполнение всех условий вызывается макрос 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 (и).
- 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 конфига. Если параметр конфига 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 и может быть другие.
Есть два типа макросов:
- automacro – автомакросы, они срабатывают автоматически.
- 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
}
Разберём этот автомакрос строка за строкой,
- automacro sp { - Ключевое слово automacro говорит Kore о том, что это автомакрос. Далее пишется имя, которое вы дали автомакросу. В данном случае - sp. Дальще следует открывающая фигурная скобка “{“, после неё следует тело автомакроса.
- sp < 200 – После “{“ следует написать условия срабатывания автомакроса. В данном случае используется только одно условие, которое выполняеется, когда мана, количество SP у персонажа опускается ниже 200 единиц.
- call { – Ключевое слово “call” сообщает Kore что делать в том случае, если все условия выполняются и автомакрос срабатывает. Здесь пишутся команды. Открывающая скобка “{“ говорит Kore, что команды будут описаны прямо в теле автомакроса.
- do c sp low – “do” говорит Kore выполнить консольную команду, в данном случае "c sp low". Т.е. напечатать в общий чат фразу "sp low".
- } – Эта закрывающая скобка “}” говорит Kore, что команды кончились.
- timeout 10 – Этот параметр заботится о том, чтобы автомакрос срабатывал не чаще, чем один раз в десять секунд. Таким образом прист не будет спамить в чат каждые пол секунды.
- } – Эта закрывающая скобка “}” говорит Kore, что код автомакроса закончен.
Короче, если сп у бота будет меньше 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.