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