macro
С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли OpenKore или настроить автоматическое срабатываниe макроса в зависимости от некоторых условий при помощи автомакроса. Последняя версия макро-плагина - 2.0.3.
Установка
- Скачайте Macro plugin: openkore-trunk.tar.gz.
- Перейдите в папку OpenKore (которая содержит файл openkore.pl) и создайте новую папку plugins, если её ещё там нет.
- В архиве с макро-плагином вы найдёте файл macro.pl и папку Macro. Распакуйте их в папку с плагинами - plugins.
- В папке control создайте пустой текстовый файл macros.txt. В этот файл вы будете помещать ваши макросы и автомакросы.
После установки дерево папок OpenKore должно выглядеть примерно так (не считая файлов самой OpenKore):
openkore |-- openkore.pl |-- control | |-- macros.txt |-- fields |-- logs |-- plugins | |-- Macro | | |-- Automacro.pm | | |-- Data.pm | | |-- Parser.pm | | |-- Script.pm | | |-- Utilities.pm | |-- macro.pl |-- src |-- tables
Консольные команды
Макро-плагин регистрирует одну-единственну консольную команду - macro. При помощи команды macro можно запускать макрос на выполнение, а также управлять выполнением макроса.
Запуск макроса
Далее приведен синтаксис команды macro в случае запуска макроса на выполнение.
macro <имямакроса> [опции] [-- параметр(ы)]
Запускает макрос <имямакроса>.
Опции
Опция | Значение | Описание |
---|---|---|
-repeat | n | повторяет макрос n раз |
-overrideAI | нет | отключает искуственный интеллект OpenKore |
-macro_delay | n | устанавливает задержку между командами макроса в n секунд, игнорируя значение macro_delay в файле timeouts.txt |
-exclusive | нет | не позволит автомакросу прервать выполнение этого макроса |
-orphan | <метод> | использует <метод> (terminate, reregister или reregister_safe) для обработки одиночного макроса |
Параметры Параметры для макроса определяются после двойного тире (--). Эти параметры будут доступны в теле макроса через переменные $.param1, $.param2 и т.д. Например:
macro foo { log Parameter 1 is $.param1 log Parameter 2 is $.param2 }
Если набрать в консоли macro foo -- foo bar то макрос выведет
[macro] Parameter 1 is foo [macro] Parameter 2 is bar
Управление макросом
- macro list
- Показывает список всех доступных макросов.
- macro stop
- Останавливает текущий макрос.
- macro pause
- Приостанавливает запущенный макрос.
- macro resume
- Включает приостановленный макрос.
- macro version
- Выводит на экран версию макро-плагина.
- macro reset [<имямакроса(ов)>]
- Сбрасывает "run-once" всех автомакросов или определённого автомакроса. Эту команду можно использовать для нескольких автомакросов сразу. Для этого имена автомакросов пишутся через пробел.
- macro status
- Показывает запущен ли какой-лиюо макрос в настоящее время. Если макрос запущен, то показывает:
status: running << запущен delay: 10s << задержка перед следующей командой line: 3 << текущая строка макроса override AI: no << настройка опции "-overrideAI" paused: no << поставлен ли марос на паузу finished: no << закончен ли макрос
- macro varstack
- Показать все переменные, используемые macro-плагином (специальные или пользовательские).
Конфигурационные файлы
- control/macros.txt
- Пишите ваши макросы и автомакросы в этом файле. Вы можете изменить имя файла в параметре конфига macro_file. Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать первую строчку знаком #.
- control/timeouts.txt
- В этот файл добавьте параметр macro_delay и напишите, сколько секунд будет длиться пауза между командами в теле макроса. Например, задержка в одну секунду: macro_delay 1
- control/config.txt
Параметр | Значение | Описание |
---|---|---|
macro_nowarn | 0 1 |
0 или 1 - вкл. или выкл. раздражающие предупреждения когда автомакрос не использует команду call |
macro_orphans | terminate reregister reregister_safe |
переопределяет поведение ИИ openkore в отношении "одиночных макросов". |
macro_file | имя файла | содержащий макросы файл (по умолчанию "macros.txt") |
macro_allowDebug | 0 1 |
console-check also processes openkore's debug messages (по умолчанию выкл: 0). Внимание: Затормаживает плагин. |
Макрос
macro MacroName { do this.. and that.. yattayatta.. }
Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Команды в макросе выполняются по порядку сверху вниз. Чтобы вызвать в теле макроса консольную команду, следует использовать команду macro-плагина do <консольная команда>.
- do <консольная команда>
- Выполняет <консольную команду>, как будто бы она была набрана в консоли OpenKore. Список консольных команд.
macro foo { do move 123 234 prontera do sit do c hello world }
- log <текст>
- Выводит <текст> на консоль. В тексте можно использовать переменные макро-плагина, типа $variable, а также специальные ключевые слова, типа @config, @rand и т.д.
macro foo { log This line logs a text to console. log All your base are belong to us! }
- pause [<n>]
- Останавливает макрос на n секунд.
macro foo { log It's 10:00:00 pause 10 log Now it's 10:00:10 log 10 seconds have passed after the first print. }
- call <имямакроса> [<n>]
- Вызывает макрос с именем <имямакроса> <n> раз (n – целое число). Когда макрос <имямакроса> закончится, то текущий макрос продолжит работу.
- release (<имяавтомакроса> | all)
- Освобождает закрытый автомакрос, позволяя ему еще раз сработать, если выполнятся условия его срабатывания. Автомакрос мог быть закрыт условием "run-once 1" или командой "lock <имяавтомакроса>". Команда release all освобождает все закрытые в данный момент автомакросы.
- lock (<имяавтомакроса> | all)
- Закрывает автомакрос <имяавтомакроса> и выключает проверку условий срабатывания, не позволяя таким образом ему выполнится. Команда lock all закрывает все автомакросы.
- stop
- Немедленно прерывает выполнение текущего макроса.
- set <опция> <значение>
- Устанавливает <опции> соответствующее <значение>:
- orphan <метод>
- macro_delay <задержка>
- overrideAI [0|1]
- repeat <числораз>
- exclusive [0|1]
Работа с переменными
Вы можете аботать со своими собственными переменными в теле макроса. Имя переменной начинается со знака доллара "$" и может содержать латинские буквы и цифры. Специально описывать переменную не надо. Достаточно лишь присвоить ей значение. Все переменные макроплагина - глобальные и доступны из любого места.
Присвоить переменной значение: $<имя переменной> = <значение>
Получить значение переменной: $<имя переменной>
Пример:
macro Hello { $var = Hello $var1 = World! log $var $var1 }
На консоль выведется сообщение:
[log] Hello World!
Если командой log вы хотите вывести символ доллара "$", то вам следует использовать символ обратная косая черта "\". Например так "\$":
macro money { log I have a lot of \$ }
Для увеличения или уменьшения значения переменной на 1, используйте: $<имяпеременной>++ или $<имяпеременной>--
macro Counter { $counter = 0 log Counter is at $counter $counter++ log Now it's $counter $counter-- log It's back to $counter }
На консоли выведется:
log Counter is at 0 log Now it's 1 log It's back to 0
Вы можете удалить созданную вами переменную присвоив ей значение 'undef' или 'unset', например:
$x = 1 log \$x is $x $x = undef # or you can use 'unset' log \$x now vanished: $x
Для скложения двух переменных, а также для других операций над переменными следует использовать @eval , например:
macro math { $num = 2 $num2 = 3 $result = @eval($num+$num2) log Сумма чисел $num и $num2 равна $result }
На консоли выведется:
log Сумма чисел 2 и 3 равна 5
Допустим, переменной $list присвоено значение - строка, слова, разделенные запятыми. Тогда из этой строки можно сделать список слов, разделенных запятыми. После этого можно узнать первый элемент списка, как в следующем примере:
macro foo { $list = banana, apple, strawberry, grape $var = [$list] log The first element of \$list is $var log Now \$list contains $list }
На консоли выведется:
log The first element from $list is banana log Now $list contains apple, strawberry, grape
Таким образом, можно по очереди достать из списка все слова, одно за другим, начиная с начала.
Напоминание: Имена переменных состоят лишь из латинских букв и цифр.
Вложенные переменные
Можно создать "динамические" или так называемые "вложенные переменные". То есть имя одной и той же переменной может изменяться на протяжении макроса. Например, обычная переменная выглядит так:
$a = "hello"
А вот так выглядит вложенная переменная:
${$a} = "world"
Здесь $a хранит в себе имя вложенной переменной. Т.е. вложенной переменной с именем hello присвоено значение world.
Пример 1:
macro foo { $name = Camila ${$name} = Brazil # Note: ${name} is equal to $Camila now log $name lives on ${$name} }
На консоль выведется:
log Camila lives on Brazil
Пример 2:
macro hh { $var = foo log $var ${$var} = bar log ${$var} log Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20. $i = 0 :zikl $i++ ${$i} = @rand(1,20) log $i ${$i} if ($i < 10) goto zikl log Выводим элементы массива и их значения задом наперед. $i = 11 :zikl2 $i-- log $i ${$i} if ($i > 1) goto zikl2 }
На консоль выведется:
[macro log] foo [macro log] bar [macro log] Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20. [macro log] 1 19 [macro log] 2 19 [macro log] 3 20 [macro log] 4 20 [macro log] 5 4 [macro log] 6 6 [macro log] 7 20 [macro log] 8 8 [macro log] 9 13 [macro log] 10 9 [macro log] Выводим элементы массива и их значения задом наперед. [macro log] 10 9 [macro log] 9 13 [macro log] 8 8 [macro log] 7 20 [macro log] 6 6 [macro log] 5 4 [macro log] 4 20 [macro log] 3 20 [macro log] 2 19 [macro log] 1 19
Специальные переменные
Есть специальные предопределенные макро-плагином переменные, их имена начинаются с символов доллара и точки: "$.". Они доступны только на чтение.
- $.map - карта, на которой вы находитесь ("prontera")
- $.pos - координаты вашей текущей позиции ("123 234")
- $.time - текущее время в unix-формате ("1131116304")
- $.datetime - текущее число и время ("Fri Nov 4 15:59:36 2005")
- $.hour - час
- $.minute - минута
- $.second - секунда
- $.hp - hp, жизнь
- $.sp - sp, мана
- $.lvl - базовый левел персонажа
- $.joblvl - джоб левел персонажа
- $.spirits - количество сферок у монка или монеток у ганса
- $.zeny - зеньги
- $.status - список статусов персонажа, через запятую
- $.paramN - параметры, с которым был запущен макрос из консоли OpenKore (смотри Консольные команды)
- $.caller - имя сработавшего автомакроса, который запустил на выполнение текущий макрос
- $.weight - вес инвентаря персонажа
- $.maxweight - максимальная грузоподъемность персонажа
Специальные ключевые слова
Специальные ключевые слова начинаются со знака "@", возвращают значение в зависимости от переданных в скобках параметров.
- @npc (<x> <y> | /regexp/i | "<name>")
- Возвращает ID неписи, которая находится по координатам <x> <y> или имя неписи совпадает с шаблоном regexp или именем неписи является <name>. Возвращает -1 если не было найдено подходящей неписи.
- @inventory (<item>)
- Возвращает ID вещи <item> в инвентаре. Если вещи <item> нет, возвращает -1.
- @Inventory (<item>)
- Также как и @inventory возвращает ID вещи <item> в инвентаре. Но если таких вещей в инвентаре несколько, то возвращает ID всех вещей списком, разделяя ID запятыми. Если нет такой вещи в инвентаре, возвращает -1.
- @invamount (<item>)
- Возвращает количество вещей <item> в инвентаре.
- @cart (<item>)
- Возвращает ID вещи <item> в телеге. Если вещи <item> нет, возвращает -1.
- @Cart (<item>)
- Также как и @cart возвращает ID вещи <item> в телеге. Но если таких вещей в инвентаре несколько, то возвращает ID всех вещей списком, разделяя ID запятыми. Если нет такой вещи в телеге, возвращает -1.
- @cartamount (<item>)
- Возвращает количество вещей <item> в телеге.
- @storage (<item>)
- Возвращает ID вещи <item> на складе. Если вещи <item> нет, возвращает -1.
- @Storage (<item>)
- Так же как и @storage возвращает ID вещи <item> на складе. Но если таких вещей несколько, то возвращает ID всех вещей списком, разделяя ID запятыми. Если нет такой вещи на складе, возвращает -1.
- @storamount (<item>)
- Возвращает количество <item> на складе.
- @player (<name>)
- Возвращает ID игрока <name>. Если игрока <name> не видно, возвращает -1.
- @monster (<name|ID>)
- Возвращает ID моба <name|ID>. Если моба <name|ID> не видно, возвращает -1.
- @vender (<name>)
- Возвращает ID продавца <name>. Если продавца <name> не видно, возвращает -1.
- @store (<name>)
- Возвращает ID вещи <name> в магазине неписи. Если вещи <name> в списке товаров нет, возвращает -1.
- @shopamount (<item>)
- Возвращает количество вещей <item> в магазине.
- @random ("<argument1>", "<argument2>", ...)
- Возращает случайным образом один из перечисленных в скобках аргументов.
- @rand (<n>, <m>)
- Возвращает случайное число в диапазоне от <n> до <m> включительно.
- @eval (<argument>)
- Оценивает, вычисляет значение аргумента <argument>. Например, если "$v = 8", то результатом оператора "@eval ($v + 2)" будет число 10. Содержимое @eval - это выражение на языке Perl, и это выражение не имеет ничего общего с синтаксисом макроплагина. Разве что тут можно использовать переменные макроплагина вида $var и подстановки типа @npc.
- @arg ("<argument>", <n>)
- Возвращает <n>-ое слово из строки "<argument>". Слова в строке разделяются знаками: ,.:;\"\'!?\r\n. Если <n> больше количества слов в строке, то возвращается пустая строка. Аргумент <n> может быть как целым числом, так и целочисленной переменной. Например:
- log @arg("aa, bb cc.dd",2)
- $n = 3
- log @arg("aa ! bb : cc . dd",$n)
- @config (<variable>)
- Возвращает значение параметра <variable> в конфиге config.txt.
- @venderitem (<name>)
- Возвращает ID вещи <name> в магазине игрока. Если вещи <name> в магазине игрока нет, возвращает -1.
- @venderprice (<indexID>)
- Возвращает цену вещи с ID <indexID> в магазине игрока.
- @nick (<word>)
- Экранирует все метасимволы regexp и некоторые специальные символы perl с помощью \ (обратный слэш). Придуман специально для экранирования некоторых имён персонажей. Например строчка
[S] Namrok кричит: продам 'девственность каи', "шутка"
будет преобразована в:
\[S\]\ Namrok\ кричит:\ продам\ \'девственность\ каи\',\ \"шутка\"
Цепочка команд
Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками [ и ].
0 macro foo { 1 do whatever 2 log yet another line 3 [ 4 do something 5 do something else 6 log foo 7 ] 8 log done 9 }
Строка 3 начинает цепочку команд и сама по себе не вносит никакой задержки. Строки 4, 5 и 6 выполняются сразу же, как только предыдущая команда завершится. В цепочке команд нет задержек и выполнение команд не может быть прервано. Строка 7 завершает цепочку команд и строка 8 будет выполнятся через положенную задерку в $macro_delay секунд.
Подстроки
Вместо использования по одной команде на строку, можно отделять команды между собой символом точки с запятой ";" и располагать их в одной строке. Таким образом можно сократить количество строк, особенно при использовании операций присвоения ($var = 1, ${$var} = 2), инкрементации (++), декрементации (--) и других (set, lock, release, log, pause, do). Подробнее: Forums
Пример:
macro foo { $i = 1; pause 5; log \$i = $i; $ii = 2; $iii = 3; $i++; $ii--; lock automacroName; release automacroName; set overrideAI 1 }
Разделенные точкой с запятой ";" команды не будут иметь задержки, совсем прям как в цепочке команд, за исключением некоторых команд, таких как pause и log.
Условия
В макросах (например в операторе if) можно использовать следующие условия:
Оператор | Описание |
---|---|
< | меньше |
<= | меньше либо равно |
= или == | равно |
> | больше |
>= | больше либо равно |
!= | не равно |
~ | <леваячасть> есть элемент <праваячасть>, где <праваячасть> список, разделенный символом запятой "," |
=~ | <леваячасть> подпадает под регулярное выражение - regexp из <праваячасть>. Подробнее: Forums |
arg .. arg2 | входит в диапазон значений между arg и arg2, где arg число, процент или переменная. |
Управление потоком и метки
Все высокоуровневые языки программирования, имея конструкции типа "if .. else", "while", "foreach", "for .. next", "do .. while" и вызов подпрограмм, сводятся к трём словам "if", "goto" и "while". Именно поэтому макро-плагин имеет только эти три ключевых слова. Так как нету видимой нумерации строк, для оператора goto требуются метки в теле макроса ":<имяметки>".
Оператор IF
Сейчас оператор if в макроплагине очень близок к perl-овому оператору if. Оператор if может принимать неограниченное количество выражений, разрешено использование регулярных выражений regexp, вместо and можно использовать && - логическое И, вместо or можно использовать || - логическое ИЛИ.
Синтаксис оператора IF
Можно использовать простое выражение:
if (arg1 <условие> arg2) (goto <label> | call <macro> [<n>] | stop)
Можно использовать простое выражение с уловием OR:
if (arg1 <условие> arg2 || arg3 <условие> arg4) (goto <label> | call <macro> <n> | stop)
Можно использовать простое выражение с уловием AND:
if (arg1 <условие> arg2 && arg3 <условие> arg4) (goto <label> | call <macro> <n> | stop)
Можно использовать простое выражение с обоими условиями OR и AND:
if ((arg1 <условие> arg2 || arg3 <условие> arg4) && arg5 <условие> arg6) (goto <label> | call <macro> <n> | stop) if ((arg1 <условие> arg2 && arg3 <условие> arg4) || arg5 <условие> arg6) (goto <label> | call <macro> <n> | stop) if ((arg1 <условие> arg2 && arg3 <условие> arg4) || (arg5 <условие> arg6 && arg7 <условие> arg8)) (goto <label> | call <macro> <n> | stop) if ((arg1 <условие> arg2 || arg3 <условие> arg4) && (arg5 <condition> arg6 || arg7 <condition> arg8)) (goto <label> | call <macro> <n> | stop)
- Заметим, что внутри каждой пары скобок есть символы AND или OR.
Где:
- arg может быть переменной, вложенной переменной, специальным ключевым словом (@xxx), специальной переменной ($.xxx), @eval, буквами и цифрами или даже perl'овой функцией Perl Subroutines.
- <label>, имя существующей метки, может состоять только из латинских букв и цифр.
- <macro>, имя существующего макрос.
- <n>, сколько раз подряд должен отработать макрос.
Заметка:
- Если <n> равно нулю 0 или даже неопределено undefined, вызванный макрос запустится один раз и остановится, после чего вызвавший его макрос прекратит свою работу.
- Если <n> больше нуля 0, вызванный макрос будет запущен n раз подряд, после чего вызвавший его макрос продолжит свою работу.
Заметка: В операторе IF можно использовать такое количество выражений, сколько необходимо.
if (arg1 <[macro#Условия|условие]]> arg2 || arg3 <условие> arg4 || ... || argN <условие> argN+1) (goto <label> | call <macro> <n> | stop)
Ревизия 8796, "If" postfix control.
Примеры оператора IF
macro checknum { $num = @rand(1, 3) if ($num == 1) goto one if ($num == 2) goto two if ($num == 3) goto three :one log \$num is 1 stop :two log \$num is 2 stop :three log \$num is 3 stop }
Вышеописанный макрос выведет в консоль $num is 1 если $num == 1, $num is 2 если $num == 2, $num is 3 если $num == 3. Такого же эффекта можно достичь, используя call вместо goto.
macro checknum { $num = @rand(1, 3) if ($num == 1) call one if ($num == 2) call two if ($num == 3) call three } macro one { log $num is 1 } macro two { log $num is 2 } macro three { log $num is 3 }
Более сложный макрос:
macro if { $i = 1 log \$i = $i if (((($i = 1 || $i < 5 || $i ~ 0 .. 5) && @eval(@eval($i - 1) - @eval($i - 0)) = -1) && ($i != 2 && $i > 0 && @eval($i - 1) = 0) && ($i != 2 && $i > 0 && @eval($i - 1) = 0)) && $i = 1) goto somewhere if (($i = 1 || $i < 5 || $i ~ 0 .. 5) && ($i != "" && $i > 0 && @eval($i - 1) = 0)) goto somewhere if (@eval (@eval($i-1) - 1) != "") goto somewhere if ((($i = 1) || ($i < 5 && $i ~ 0 .. 5)) && ($i != "" && $i > 0 && @eval($i - 1) > 0)) goto somewhere log ko stop :somewhere log OK }
Цикл по условию WHILE
В макросе while означает, что некоторые команды могут выполнится при определенных условиях несколько раз подряд, в цикле.
Синтаксис оператора WHILE
while (arg <condition> arg) as <loop> do bla bla ... end <loop>
Где:
- arg может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами.
- <loop> - название цикла.
- Условие - условие.
Пример оператора WHILE
macro while { $i = 0 while ($i < 10) as loop log \$i = $i $i++ end loop }
На консоль выведется
log $i = 0 log $i = 1 log $i = 2 log $i = 3 log $i = 4 log $i = 5 log $i = 6 log $i = 7 log $i = 8 log $i = 9
Оператор SWITCH/CASE
В ревизии 8782 добавились операторы switch и case. Смотри форум Implementation of switch/case.
Автомакрос
Автомакрос содержит условия, при удовлетворении всех заданных условий начинает работать связанный с автомакросом макрос или список команд.
Синтаксис
При выполнение всех условий вызывается макрос myMacro.
automacro <automacro name> { <conditions> call myMacro } macro myMacro { do move prontera do move payon }
Или же можно отказаться от написания отдельного макроса и поместить команды прямо в блоке call { ... } автомакроса. В этом случае макрос тоже создаётся, но будет безымянным и его нельзя вызвать по имени.
automacro <automacro name> { <conditions> call { do move prontera do move payon } }
Второй вариант полезен, если тело макроса не занимает много места, и нет нужды оформлять его отдельно. Первый вариант синтаксиса полезен, если вы хотите чтобы несколько автомакросов вызывали один и тот же макрос. Например:
automacro First { <conditions> call print } automacro Second { <conditions> call print } macro print { log $.caller triggered }
Условия в автомакросе
Автомакрос нуждается как минимум в одном условии или он никогда не сработает. В автомакросе может быть столько условий, сколько вы пожелаете. Некоторые условия устанавливают значения специальны переменных, которые вы потом можете использовать внутри макроса.
- map <mapname>
- Сработает, если текущая локация <mapname>.
- location [not] <mapname [<x1> <y1> [<x2> <y2>]] [, ...]
- Сработает, если текущая позиция [не] та, что указана в условии.
- Если координаты <x1> <y1> и <x2> <y2> не заданы, то автомакрос будет запускаться, как и в случае map <mapname>.
- Если указаны только координаты <x1> <y1>, то автомакрос запустится, если находясь на локации <mapname>, вы попадёте на координаты <x1> <y1>.
- Если указаны координаты <x1> <y1> и <x2> <y2>, то автомакрос запустится, если находясь на локации <mapname>, вы попадёте в мнимый прямоугольник, где <x1> <y1> - верхняя левая точка, а <x2> <y2> - нижняя правая точка.
<x1> <y1> _______ | | | | |_______| <x2> <y2>
- Следует отметить, что <x1> < <x2> и <y1> > <y2> .
- Отделённые запятыми аргументы определяются как условие OR (или):
location geffen, prontera 123 234
- Автомакрос запустится, если вы будете находиться в geffen или в prontera на координатах (123 234).
- Несколько строк определяются как условие AND (и):
location not geffen location not prontera
- Автомакрос будет запускаться, если вы находитесь вне geffen и вне prontera.
- mapchange ( <mapname> | any | * ) [, ...]
- Автомакрос запустится, если вы поменяли текущую локацию на <mapname>. Если аргументом является any или * , то автомакрос сработает при любом изменении локации.
- Отделённые запятыми аргументы определяются как условие OR (или).
- hp <условие> <amount>[%]
- Автомакрос сработает, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp.
- Несколько строк определяются как условие AND (и).
- sp <условие> <amount>[%]
- Автомакрос сработает, когда ваше SP будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- spirit <условие> <amount>
- Автомакрос сработает когда количество сферок у монка (или монеток у ганса) будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- weight <условие> <amount>[%]
- Автомакрос сработает, когда вес инвентаря будет удовлетворять заданному условию. Можно использовать абсолютное значение <amount> или процентное <amount>%.
- Несколько строк определяются как условие AND (и).
- cartweight <условие> <amount>[%]
- Автомакрос сработает, когда вес телеги будет удовлетворять заданному условию. Можно использовать абсолютное значение <amount> или процентное <amount>%.
- Несколько строк определяются как условие AND (и).
- zeny <условие> <amount>
- Автомакрос сработает, когда количество зенег будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- cash <условие> <amount>
- Автомакрос сработает, когда количество cash будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- Появилось в ревизии 8759.
- soldout <условие> <slots>
- Автомакрос србаотает, когда количество слотов в вашем магазине будет удовлетворять заданному условию. Например в автомакросе прописано "soldout > 1". Пусть в магазине продаются 4 элу и 5 ори. Когда у вас купят все ори или все элу сработает автомакрос. Если купят всего 1 элу, то слот будет считаться не полностью проданным и автомакрос не сработает.
- Несколько строк определяются как условие AND (и).
- status [not] <status> [, ...]
- Автомакрос сработает, когда на персонаже [не] висит статус <status>.
- Статусы "dead" и "muted" поддерживаются дополнительно.
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- inventory "<item>" <условие> <amount> [, ...]
- Автомакрос сработает, когда количество вещей "<item>" в инвентаре будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- storage "<item>" <условие> <amount> [, ...]
- Автомакрос сработает, когда количество вещей <item> на складе будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- cart "<item>" <условие> <amount> [, ...]
- Автомакрос сработает, когда количество вещей <item> в телеге будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- shop "<item>" <условие> <amount> [, ...]
- Автомакрос сработает, когда количество вещей <item> в открытом вами магазине будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ".
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- base <условие> <level>
- Автомакрос сработает, когда базовый уровень персонажа будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- job <условие> <level>
- Автомакрос сработает, когда джоб уровень персонажа будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- class <job>
- Автомакрос сработает, когда класс персонажа, т.е. его профессия, будет <job>. Например class Novice или class Acolyte.
- spell [party] <spell> [, ...]
- Автомакрос сработает, когда кто-то будет кастовать на персонажа заклинание <spell> или персонаж находится в зоне действия заклинания.
- Party support syntax is included (optional). Also trigger on party member (as a target) by other party or monster. Ex: "spell party Lord of Vermilion"
- Отделённые запятыми аргументы определяются как условие OR (или).
- Присваивает значения переменным:
- $.caster - возвращает кастовавшего заклинание (by player/monster), из-за которого сработало условие spell в автомакросе.
- $.casterName - возвращает имя игрока или монстра, из-за которого сработало условие spell в автомакросе.
- $.casterID - возвращает ID игрока или монстар, из-за которого сработало условие spell в автомакросе.
- $.casterPos - возвращает позицию игрока или монстра, с которой кастовалось заклинание, из-за которого сработало условие spell в автомакросе.
- $.casterSkill - возвращает имя заклинания или скила, из-за которого сработало условие spell в автомакросе.
- $.casterTarget - возвращает местоположение цели заклинания, из-за которого сработало условие spell в автомакросе.
- $.casterTargetName - возвращает имя сопартийца, который находится в радиусе заклинания, из-за которого сработало условие spell в автомакросе.
- $.casterDist - возвращает дистанцию между персонажем и кастовавшим заклинание, из-за которого сработало условие spell в автомакросе.
- monster [not] <monster(s) name> <условие> [<distance>]
- Автомакрос сработает, когда монстр <monster(s) name> рядом. Если дистанция <distance> не указаны, вместо неё берётся значение из конфига clientSight.
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- Присваивает значения переменным:
- $.lastMonster - возвращает имя монстра, из-за которого сработало условие monster в автомакросе.
- $.lastMonsterPos - возвращает позицию монстра, из-за которого сработало условие monster в автомакросе. Например: x, y map_name
- $.lastMonsterDist - возвращает дистанцию между персонажем и монстром, из-за которого сработало условие monster в автомакросе.
- $.lastMonsterID - возвращает ID монстра, из-за которого сработало условие monster в автомакросе.
- $.lastMonsterCount - возвращает степень риска, исходящию от монстра, из-за которого сработало условие monster в автомакросе.
- $.lastMonsterBinID - возвращает тип монстра (введено в ревизии 8509).
- aggressives <условие> <number>
- Автомакрос сработает, когда количество агрессивных монстров будет удовлетворять заданному условию.
- Несколько строк определяются как условие AND (и).
- player ("<player name>" | /<regexp>/[i]) [, <distance> ]
- Автомакрос сработает, когда игрок <player name> в пределах видимости и не дальше чем число клеток <distance>. В качестве имени можно использовать либо строго заданное: "4epT" (пишется в кавычках), либо шаблон: /4epT/ (пишется через слэш). Разница в том, что на имя 4epTik первое условие не сработает (то, что в кавычках), а второе сработает (так как слово 4epTik сожершит буквы 4epT).
- Несколько строк определяются как условие AND (и).
- Присваивает значения переменным:
- $.lastPlayerName - имя игрока (это и далее появилось в ревизии 8484).
- $.lastPlayerPos - местоположение игрока в виде: x, y map_name
- $.lastPlayerLevel - уровень игрока
- $.lastPlayerJob - профа игрока
- $.lastPlayerAccountId - ID учетки игрока (это и далее появилось в ревизии 8490).
- $.lastPlayerBinId - binID/index игрока
- equipped [<slot>] (<item> | none) [, ...]
- Автомакрос сработает, когда вещь <item> одета, или не одето ничего <none>. Необязательно, но можно указать слот <slot>.
- Спикок слотов topHead, midHead, lowHead, leftHand, rightHand, robe, armor, shoes, leftAccessory, rightAccessory и arrow.
- Отделённые запятыми аргументы определяются как условие OR (или).
- Несколько строк определяются как условие AND (и).
- var <имя_переменной> (unset | <условия> <значение>)
- Автомакрос сработает, когда <переменная> не определена <unset>, или удовлетворяет заданному условию.
- Несколько строк определяются как условие AND (и).
- Примечание: в этом параметре указывает ТОЛЬКО имя переменной без символа «$». Пример:
automacro variable { var test unset timeout 5 call { log test is unset: $test } } macro set_test { $test = 1 log variable \$test = $test }
- varvar <nested variable> (unset | <условия> <значение>)
- Автомакрос сработает, когда вложенная переменная <nested variable> не определена <unset>, или удовлетворяет заданному условию.
- Несколько строк определяются как условие AND (и).
- console ("<text>" | /<regexp>/[i])
- Автомакрос сработает, когда на консоли появится текст <text>, или появившийся на консоли текст удовлетворяет регулярному выражению <regexp>.
- Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
- Присваивает значения переменным:
- $.lastLogMsg - возвращает консольный текст, из-за которого сработало условие console в автомакросе.
- $.lastMatchN - возвращает текст, который был заключен в круглые скобки в регулярном выражении.
- pm ("<text>" | /<regexp>/[i]) [, <player>]
- Автомакрос сработает, когда в приватном сообщении появится <text> от игрока [<player>], или приватное сообщение удовлетворяет заданному регулярному выражению <regexp>.
- Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
- Присваивает значения переменным:
- $.lastpm - возвращает имя игрока, который написал приватное сообщение, из-за которого сработало условие pm в автомакросе.
- $.lastpmMsg - возвращает приватное сообщение, из-за которго сработало условие pm в автомакросе.
- pubm ("<text>" | /<regexp>/[i]) [, <distance>]
- Автомакрос сработает, когда в общем чате будет получено сообщение <text> [и дистанция между персонажем и говорившим не превишает <distance>], или сообщение удовлетворяет заданному регулярному выражению <regexp>.
- Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
- Присваивает значения переменными:
- $.lastpub - имя персонажа, который послал в общий чат сообщение, из-за которого сработало условие pubm в автомакросе.
- $.lastpubMsg - сообщение в общем чате, из-за которого сработало условие pubm в автомакросе.
- party ("<text>" | /<regexp>/[i])
- Автомакрос сработает, когда в партийном чате будет получено сообщение <text>, или сообщение удовлетворяет заданному регулярному выражению <regexp>.
- Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
- Присваивает значения переменным:
- $.lastparty - имя персонажа, который послал в партийном чате сообщение, из-за которого сработало условие party в автомакросе.
- $.lastpartyMsg - сообщение в партийном чате, из-за которого сработало условие party в автомакросе.
- guild ("<text>" | /<regexp>/[i])
- Автомакрос сработает, когда в гильдийном чате будет получено сообщение <text>, или сообщение удовлетворяет заданному регулярному выражению <regexp>.
- Параметр i (следует писать сразу после /<regexp>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу.
- Присваивает значения переменным:
- $.lastguild - имя персонажа, который послал в гильдийном чате сообщение, из-за которого сработало условие guild в автомакросе.
- $.lastguildMsg - сообщение в гильдийном чате, из-за которого сработало условие guild в автомакросе.
- playerguild (<guild list> [, ...] | <guild.txt>) [, <distance>]
- Автомакрос сработает, когда имя гильдии, в которой находится персонаж, совпадает с именем в списке <guild list> (где имена гильдий разделены запятыми (guild1, guild2, ..., guildN)), или в файле control/guild.txt. Имя гильдии получают из "hook-on-demand" пакета charNameUpdate или player. Дальнейшая информация на форуме OpenKore Forums.
- Если дистанция <distance> не указаны, использует значение clientSight из конфига.
- Список имён гильдий, разделенных запятыми, рассматривается как условие OR (или).
- Присваивает значения переменным:
- $.lastPlayerID - возвращает ID аккаунта игрока, из-за которого сработало условие playerguild в автомакросе.
- $.lastGuildName - возвращает имя гильдии игрока, из-за котогоро сработало условие playerguild в автомакросе.
- $.lastGuildNameBinID - возвращает ID игрока, из-за которого сработало условие playerguild в автомакросе.
- $.lastGuildNameBinIDDist - возвращает дистанцию от вашего персонажа, до персонажа, из-за которого сработало условие playerguild в автомакросе.
- $.lastGuildNameBinIDName - возвращает имя игрока, из-за которого сработало условие playerguild в автомакросе.
- $.lastGuildNameBinIDJobName - возвращает класс, т.е. профессию игрока, из-за которого сработало условие playerguild в автомакросе.
- hook <hookname>
- Автомакрос сработает, когда OpenKore вызовут хук <hookname>.
- save <hash key> (используется в комбинации с hook)
- Когда автомакрос сработает по условию hook, то это условие сохранит значение из хэша <hash key> в переменной $.hooksaveN.
automacro hook { hook packet_privMsg save MsgUser save Msg call { log Player $.hooksave1 said $.hooksave2 } }
- whenGround [not] <spell>
- Автомакрос сработает, когда персонаж [не] находится в зоне действия площадного скила <spell>.
- Имена скилов через запятые рассматриваются как условие OR (или).
- areaSpell <spell> [<distance>]
- Автомакрос сработает, когда кто-то использует умение и центр кастуемого на землю умения находится в пределах дистанции <distance> или, если дистанция не указана, в пределах видимости, указываемой в параметре конфига clientSight конфига. Если параметр конфига clientSight пуст, то используется значение по умолчанию - 20.
- Список аргументов через запятые, рассматривается как условие OR (или).
- Присваивает значения переменным:
- $.areaName - возвращает название умения, кастуемого по площади
- $.areaActor - возвращает тип актора (игрок, моб и так далее)
- $.areaSourceName - возвращает имя актора
- $.areaSourceID - возвращает идентификатор актора binID
- $.areaPos - возвращает координаты центра, где находится скастованное умение (например: 123 123 payon)
- $.areaDist - возвращает расстояние от вашего персонажа до центра умения
Пример:
automacro warp { areaSpell Warp Portal <= 7 # через запятую пишется список из имён умений, условий и дистанций # без условия и дистанции берётся расстояние $config(clientSight) # или 20 как значение по умолчанию. call { log Умение: $.areaName, тип актора: $.areaActor. log Умение $.areaName скастовано $.areaSourceName ($.areaSourceID) на координаты "$.areaPos" (дист= $.areaDist) } }
Источник: areaSpell automacro syntax Macro 2.0.3-SVN by ezza.
- localtime <условие> <time>
- Автомакрос сработает, когда время на внутренних часах компьютера удовлетворяет условию <условие> <time>.
- Формат времени <time> - 24-часовой. Например: 15:22:33 (час:минута:секунда)
- Несколько строк с условием localtime рассматриваются как условие AND (и).
- первоисточник
- eval <perl expression>
- Автомакрос сработает, когда указанное перловое выражение <perl expression> будет истинно, то есть иметь значение true.
- run-once (0 | 1)
- Если этот параметр автомакроса установлен в 1, то после срабатывания автомакрос будет залочен, т.е. закрыт и не сможет больше проверять условия и срабатывать на них. Другими словами, автомакрос сработает только один раз.
- Используйте команду release в макросе, чтобы разлочить, т.е. отрыть автомакрос, чтобы он мог опять когда-нибудь сработать.
- overrideAI (0 | 1)
- Если этот параметр автомакроса установлен в 1, то вызываемый макрос будет игнорировать openkore'овый AI. Это значит, что не будет пауз от команд "move" или "status dead".
- delay <n>
- Если этот параметр автомакроса установлен, то после срабатывания автомакроса пройдёт <n> секунд перед тем, как будет запущен соответствующий макрос.
- timeout <n>
- Если этот параметр автомакроса установлен, то пройдет как минимум <n> секунд перед тем, как автомакрос сможет сработать снова.
- macro_delay <n>
- Если этот параметр автомакроса установлен, то он переопределяет глобальное значение macro-задержки для вызываемого макроса.
- priority <num>
- Этот параметр автомакроса определяет, в какой очередности проверяются автомакросы на удовлетворение условий срабатывания. Чем меньше значение <num> этого параметра, тем меньше будет ждать автомакрос в очереди. Если параметр не задан, то предполагается, что priority 0, т.е. проверяется в первую очередь.
- exclusive (0 | 1)
- Если этот параметр автомакроса установлен в 1, то выполнение этого автомакроса не может быть прервано срабатыванием другого автомакроса.
- set <variable> <value>
- Этот параметр автомакроса устанавливает переменной <variable> значение <value>. Этот параметр можно использовать несколько раз.
- orphan <method>
- Этот параметр определяет метод для обработки макроса, если тот станет "одиночным" orphaned macros.
Пример
automacro sp { location prontera run-once 1 call { log i'm on prontera o/ } }
Всегда закрывайте фигурные скобки { и }.
Одиночные макросы
Иногда случается так, например когда используется команда ai clear во время работы макроса, что макрос становится "одиночным". Имеется в виду, что сам объект макроса есть в памяти, но макрос не может выполняться дальше. Ибо макросу нужен OpenKore'вый AI с "macro" или "deal" на первом месте очереди. После команды ai clear очередь этого самого AI очищается и объект "macro" уничтожается.
В связи с этим есть три метода:
terminate | останавливает, прерывает одиночный макрос (всёравно что команда в консоли macro stop) |
reregister | перерегистриурет одиночный макрос в очередь AI, перекрывая другие записи. Это означает принудительное продолжение макроса. |
reregister_safe | перерегистрирует одиночный макрос в очередь AI, когда AI простаивает и ему нечего делать. Это означает, что макрос продолжится после завершения других неотложных дел, стоящих в очереди к AI. |
Perl'овые подпрограммы
Макро-плагин поддерживает использование Perl'овых подпрограмм в файле macros.txt. Теперь можно создавать какую-нибудь простую функцию на Perl'е, не стесняя себя ограничениями команды eval.
Пример 1 - как создать Perl'овую подпрограмму в теле макроса.
macro sub { $list = Orange, Milk, Soya, Peach if (existsInList("$list", "PeAch")) goto ok log Not Match!!!; stop :ok log Match!!! $x = @eval(existsInList("$list", "PeAch")) log \$x = $x # $x here is 1 } sub existsInList { my ($list, $val) = @_; return 0 if ($val eq ""); my @array = split / *, */, $list; $val = lc($val); foreach (@array) { s/^\s+//; s/\s+$//; s/\s+/ /g; next if ($_ eq ""); return 1 if (lc($_) eq $val); } return 0; }
Пример 2 - как создать Perl'овую подпрограмму для записи значений в файл.
automacro confHP1 { hp > 85% exclusive 1 run-once 1 set setting Demon Pungus #becareful on your case, its case sensitive set attack 1 set teleport 0 set telesearch 1 call HP } automacro confHP2 { hp < 75% exclusive 1 run-once 1 set setting Demon Pungus set attack 1 set teleport 2 set telesearch 1 call HP } macro HP { #Getting the value of the $setting monster name Ex: $setting $exist1 $exist2 $exist3 $exist1 = @eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{attack_auto}:"None") $exist2 = @eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_auto}:"None") $exist3 = @eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_search}:"None") log Old Values are $setting $exist1 $exist2 $exist3 log Changing the values to $setting $attack $teleport $telesearch do eval Misc::mon_control("$::Macro::Data::varStack{setting}")->{attack_auto} = $attack; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_auto} = $teleport; Misc::mon_control("$::Macro::Data::varStack{setting}")->{teleport_search} = $telesearch; log Writting mon_control.txt with new values rewrite() # see the sub-routine function below log Reloading mon_control.txt do reload mon_control $exist1 = @eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{attack_auto}:"None") $exist2 = @eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_auto}:"None") $exist3 = @eval (defined Misc::mon_control("$setting")?Misc::mon_control("$setting")->{teleport_search}:"None") log New mon_control.txt Setting: $setting $exist1 $exist2 $exist3 log Macro done #if $teleport = 0 ; means the Higher automacro HP is currently triggered #if $teleport = 2 ; means the Lower automacro HP is currently triggered if ($teleport < 2) goto releaseHighHp :releaseLowHp release confHP1 stop :releaseHighHp release confHP2 stop } sub rewrite { my $monster = Misc::mon_control("$::Macro::Data::varStack{setting}"); my @lines = (); if (open(FILE, "<:utf8", Settings::getControlFilename("mon_control.txt"))) { while (<FILE>) { $_ =~ s/\x{FEFF}//g; chomp($_); if ($_ =~ /^#/ || $_ =~ /^\n/ || $_ =~ /^\r/) { push @lines,$_; next } $_ =~ /^(\d+|([a-zA-Z' ]+)*) -?\d/; if ("$::Macro::Data::varStack{setting}" eq $1 && defined $monster) { $_ = $1; $_ =~ s/\s+$//; push @lines,"$_" . " $monster->{attack_auto} $monster->{teleport_auto} $monster->{teleport_search} $monster->{attack_lvl} $monster->{attack_jlvl} $monster->{attack_hp} $monster->{attack_sp} $monster->{weight}" } else {push @lines,$_} } close FILE } open(FILE, ">:utf8", Settings::getControlFilename("mon_control.txt")); print FILE join "\n", @lines; close FILE; }
Комментарии в макросах
Комментарии в файле с макросами начинаются со знака #, всё после этого символа игнорируется макро-плагином.
- Начинающиеся со знака # строки являются комментарием.
- Всё после пробела и знака # также считается комментарием.
macro happy { # this is a comment line log I'm Happy # this is also a comment }
На консоль будет выведено:
[log] I'm Happy
Приложение. Примеры
Предполагается, что вы знаете как использовать консольные команды OpenKore и понимаете, как они работают. Если это не так, прежде чем идти дальше, пробегитесь по разделу консольных команд консольные команды и попробуйсте некоторые команды, например a, ai, move, cart get, storage add, talk, deal, take, sl, sm, relog, pm и может быть другие.
Есть два типа макросов:
- 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.