macro: различия между версиями
Manticora (обсуждение | вклад) продолжается перевод статьи про макро-плагин |
4epT (обсуждение | вклад) Нет описания правки |
||
(не показано 36 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли OpenKore или настроить автоматическое | С этим плагином можно написать последовательность команд и объединить их в макрос. Макрос можно запустить руками из консоли OpenKore или настроить автоматическое срабатываниe макроса в зависимости от некоторых условий при помощи автомакроса. Последняя версия макро-плагина - 2.0.3. | ||
== Установка == | == Установка == | ||
* Скачайте Macro plugin | * Скачайте 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. | ||
Строка 27: | Строка 28: | ||
== Консольные команды == | == Консольные команды == | ||
=== | Макро-плагин регистрирует одну-единственну консольную команду - '''macro'''. При помощи команды '''macro''' можно запускать макрос на выполнение, а также управлять выполнением макроса. | ||
=== Запуск макроса === | |||
Далее приведен синтаксис команды macro в случае запуска макроса на выполнение. | |||
macro <имямакроса> [опции] [-- параметр(ы)] | macro <имямакроса> [опции] [-- параметр(ы)] | ||
Запускает макрос <имямакроса>. | Запускает макрос <имямакроса>. | ||
Опции | '''Опции''' | ||
{| class="wikitable" border="1" cellspacing="0" | {| class="wikitable" border="1" cellspacing="0" | ||
|-style=background-color:#F9F9F9; | |-style=background-color:#F9F9F9; | ||
Строка 61: | Строка 63: | ||
|} | |} | ||
Параметры | '''Параметры''' | ||
Параметры для макроса определяются после двойного тире (--). Эти параметры будут доступны в теле макроса через переменные $.param1, $.param2 и т.д. Например: | Параметры для макроса определяются после двойного тире (--). Эти параметры будут доступны в теле макроса через переменные $.param1, $.param2 и т.д. Например: | ||
macro foo { | macro foo { | ||
log Parameter 1 is $.param1 | log Parameter 1 is $.param1 | ||
log Parameter 2 is $.param2 | log Parameter 2 is $.param2 | ||
} | } | ||
Если набрать в консоли '''''macro foo -- foo bar''''' то макрос выведет | Если набрать в консоли '''''macro foo -- foo bar''''' то макрос выведет | ||
Строка 76: | Строка 75: | ||
[macro] Parameter 2 is bar | [macro] Parameter 2 is bar | ||
=== Управление макросом === | |||
; macro list | ; macro list | ||
: Показывает список всех доступных макросов. | : Показывает список всех доступных макросов. | ||
Строка 90: | Строка 89: | ||
; macro version | ; macro version | ||
: Выводит на экран версию | : Выводит на экран версию макро-плагина. | ||
; macro reset [<''имямакроса''(''ов'')>] | ; macro reset [<''имямакроса''(''ов'')>] | ||
Строка 97: | Строка 96: | ||
; macro status | ; macro status | ||
: Показывает запущен ли какой-лиюо макрос в настоящее время. Если макрос запущен, то показывает: | : Показывает запущен ли какой-лиюо макрос в настоящее время. Если макрос запущен, то показывает: | ||
status: running << запущен | status: running << запущен | ||
delay: 10s << задержка перед следующей командой | delay: 10s << задержка перед следующей командой | ||
line: 3 << текущая строка макроса | line: 3 << текущая строка макроса | ||
override AI: no << настройка опции "-overrideAI" | override AI: no << настройка опции "-overrideAI" | ||
paused: no << поставлен ли марос на паузу | paused: no << поставлен ли марос на паузу | ||
finished: no << закончен ли макрос | finished: no << закончен ли макрос | ||
; macro varstack | |||
: Показать все переменные, используемые macro-плагином ([[macro#Специальные_переменные|специальные]] или [[macro#Работа_с_переменными|пользовательские]]). | |||
== Конфигурационные файлы == | == Конфигурационные файлы == | ||
; control/macros.txt | ; control/macros.txt | ||
: Пишите ваши макросы и автомакросы в этом файле. Вы можете изменить имя файла в параметре конфига ''macro_file''. Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать первую строчку знаком #. | : Пишите ваши макросы и автомакросы в этом файле. Вы можете изменить имя файла в параметре конфига ''macro_file''. Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать первую строчку знаком #. | ||
Строка 136: | Строка 137: | ||
|} | |} | ||
== | |||
== Макрос == | |||
macro MacroName { | macro MacroName { | ||
do this.. | do this.. | ||
Строка 142: | Строка 144: | ||
yattayatta.. | yattayatta.. | ||
} | } | ||
Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. | Имя макроса должно начинаться с латинской буквы, может содержать цифры и знак подчеркивания "_", но не может содержать знак пробела " ". Следите, чтобы макросы не назывались одинаково. Команды в макросе выполняются по порядку сверху вниз. Чтобы вызвать в теле макроса [[:Category:Console Command|консольную команду]], следует использовать команду macro-плагина do <''консольная команда''>. | ||
; do <''консольная команда''> | |||
; do <''команда''> | : Выполняет <''консольную команду''>, как будто бы она была набрана в консоли OpenKore. Список [[:Category:Console Command|консольных команд]]. | ||
: Выполняет | |||
macro foo { | macro foo { | ||
Строка 153: | Строка 154: | ||
do c hello world | do c hello world | ||
} | } | ||
; 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. | ||
log All your base are belong to us! | log All your base are belong to us! | ||
} | } | ||
; pause [<''n''>] | ; pause [<''n''>] | ||
: Останавливает макрос на '''n''' секунд. | : Останавливает макрос на '''n''' секунд. | ||
macro foo { | macro foo { | ||
log It's 10:00:00 | log It's 10:00:00 | ||
Строка 173: | Строка 170: | ||
log 10 seconds have passed after the first print. | log 10 seconds have passed after the first print. | ||
} | } | ||
; call <''имямакроса''> [<''n''>] | ; call <''имямакроса''> [<''n''>] | ||
: Вызывает макрос с именем <имямакроса> <n> раз (n – целое число). Когда макрос <имямакроса> закончится, то текущий макрос продолжит работу. | : Вызывает макрос с именем <имямакроса> <n> раз (n – целое число). Когда макрос <имямакроса> закончится, то текущий макрос продолжит работу. | ||
; release (<''имяавтомакроса''> | all) | ; release (<''имяавтомакроса''> | all) | ||
: Освобождает закрытый автомакрос, позволяя ему еще раз сработать, если выполнятся условия его срабатывания. Автомакрос мог быть закрыт условием "run-once 1" или командой "lock <''имяавтомакроса''>". Команда release all освобождает все закрытые в данный момент автомакросы. | : Освобождает закрытый автомакрос, позволяя ему еще раз сработать, если выполнятся условия его срабатывания. Автомакрос мог быть закрыт условием "run-once 1" или командой "lock <''имяавтомакроса''>". Команда release all освобождает все закрытые в данный момент автомакросы. | ||
; lock (<''имяавтомакроса''> | all) | ; lock (<''имяавтомакроса''> | all) | ||
: Закрывает автомакрос <''имяавтомакроса''> и выключает проверку условий срабатывания, не позволяя таким образом ему выполнится. Команда lock all закрывает все автомакросы. | : Закрывает автомакрос <''имяавтомакроса''> и выключает проверку условий срабатывания, не позволяя таким образом ему выполнится. Команда lock all закрывает все автомакросы. | ||
; stop | ; stop | ||
: Немедленно прерывает выполнение текущего макроса. | : Немедленно прерывает выполнение текущего макроса. | ||
; set <''опция''> <''значение''> | ; set <''опция''> <''значение''> | ||
Строка 200: | Строка 192: | ||
== | == Работа с переменными == | ||
Вы можете | Вы можете аботать со своими собственными переменными в теле макроса. Имя переменной начинается со знака доллара "$" и может содержать латинские буквы и цифры. Специально описывать переменную не надо. Достаточно лишь присвоить ей значение. Все переменные макроплагина - глобальные и доступны из любого места. | ||
Присвоить переменной значение: | |||
$<имя переменной> = <значение> | $<имя переменной> = <значение> | ||
Получить значение переменной: | |||
$<имя переменной> | |||
Пример: | |||
macro Hello { | macro Hello { | ||
$var = Hello | $var = Hello | ||
Строка 213: | Строка 209: | ||
На консоль выведется сообщение: | На консоль выведется сообщение: | ||
[log] Hello World! | [log] Hello World! | ||
Если командой log вы хотите вывести символ доллара "$", то вам следует использовать символ обратная косая черта "\". Например так "\$": | Если командой log вы хотите вывести символ доллара "$", то вам следует использовать символ обратная косая черта "\". Например так "\$": | ||
macro money { | macro money { | ||
log I have a lot of \$ | log I have a lot of \$ | ||
} | } | ||
Для увеличения или уменьшения значения переменной на 1, используйте: $<имяпеременной>++ или $<имяпеременной>-- | |||
Для увеличения или уменьшения значения переменной на 1, используйте: | |||
$<имяпеременной>++ или $<имяпеременной>-- | |||
macro Counter { | macro Counter { | ||
$counter = 0 | $counter = 0 | ||
Строка 248: | Строка 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 присвоено значение - строка, слова, разделенные запятыми. | ||
Тогда из этой строки можно сделать список слов, разделенных запятыми. После этого можно узнать первый элемент списка, как в следующем примере: | Тогда из этой строки можно сделать список слов, разделенных запятыми. После этого можно узнать первый элемент списка, как в следующем примере: | ||
macro foo { | macro foo { | ||
$list = banana, apple, strawberry, grape | $list = banana, apple, strawberry, grape | ||
Строка 300: | Строка 258: | ||
На консоли выведется: | На консоли выведется: | ||
log The first element from $list is | log The first element from $list is banana | ||
log $list contains apple, strawberry, grape | log Now $list contains apple, strawberry, grape | ||
Таким образом, можно по очереди достать из списка все слова, одно за другим, начиная с начала. | |||
'''''Напоминание:''''' Имена переменных состоят лишь из латинских букв и цифр. | '''''Напоминание:''''' Имена переменных состоят лишь из латинских букв и цифр. | ||
== Вложенные переменные == | == Вложенные переменные == | ||
Можно создать "динамические" или так называемые "вложенные переменные". То есть имя одной и той же переменной может изменяться на протяжении макроса. | Можно создать "динамические" или так называемые "вложенные переменные". То есть имя одной и той же переменной может изменяться на протяжении макроса. | ||
Например, обычная переменная выглядит так: | Например, обычная переменная выглядит так: | ||
$a = "hello" | $a = "hello" | ||
А вот так выглядит вложенная переменная: | А вот так выглядит вложенная переменная: | ||
${$a} = "world" | ${$a} = "world" | ||
Здесь $a хранит в себе имя вложенной переменной. Т.е. вложенной переменной с именем hello присвоено значение world. | Здесь $a хранит в себе имя вложенной переменной. Т.е. вложенной переменной с именем hello присвоено значение world. | ||
Строка 322: | Строка 282: | ||
На консоль выведется: | На консоль выведется: | ||
log Camila lives on Brazil | log Camila lives on Brazil | ||
Пример 2: | Пример 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] foo | [macro log] bar | ||
[macro log] bar | [macro log] Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20. | ||
[macro log] Создадим массив из 10 элементов, присвоим им случайные числа от 1 до 20. | [macro log] 1 19 | ||
[macro log] 1 19 | [macro log] 2 19 | ||
[macro log] 2 19 | [macro log] 3 20 | ||
[macro log] 3 20 | [macro log] 4 20 | ||
[macro log] 4 20 | [macro log] 5 4 | ||
[macro log] 5 4 | [macro log] 6 6 | ||
[macro log] 6 6 | [macro log] 7 20 | ||
[macro log] 7 20 | [macro log] 8 8 | ||
[macro log] 8 8 | [macro log] 9 13 | ||
[macro log] 9 13 | [macro log] 10 9 | ||
[macro log] 10 9 | [macro log] Выводим элементы массива и их значения задом наперед. | ||
[macro log] Выводим элементы массива и их значения задом наперед. | [macro log] 10 9 | ||
[macro log] 10 9 | [macro log] 9 13 | ||
[macro log] 9 13 | [macro log] 8 8 | ||
[macro log] 8 8 | [macro log] 7 20 | ||
[macro log] 7 20 | [macro log] 6 6 | ||
[macro log] 6 6 | [macro log] 5 4 | ||
[macro log] 5 4 | [macro log] 4 20 | ||
[macro log] 4 20 | [macro log] 3 20 | ||
[macro log] 3 20 | [macro log] 2 19 | ||
[macro log] 2 19 | [macro log] 1 19 | ||
[macro log] 1 19 | |||
== Специальные переменные == | == Специальные переменные == | ||
Есть специальные предопределенные макро-плагином переменные, их имена начинаются с символов доллара и точки: "$.". Они доступны только на чтение. | Есть специальные предопределенные макро-плагином переменные, их имена начинаются с символов доллара и точки: "$.". Они доступны только на чтение. | ||
Строка 395: | Строка 351: | ||
:* $.zeny - зеньги | :* $.zeny - зеньги | ||
:* $.status - список статусов персонажа, через запятую | :* $.status - список статусов персонажа, через запятую | ||
:* $.paramN - параметры, с которым был запущен макрос из консоли OpenKore (смотри [[ | :* $.paramN - параметры, с которым был запущен макрос из консоли OpenKore (смотри [[Макро-плагин#Консольные_команды|Консольные команды]]) | ||
:* $.caller - имя сработавшего автомакроса, который запустил на выполнение текущий макрос | :* $.caller - имя сработавшего автомакроса, который запустил на выполнение текущий макрос | ||
:* $.weight - вес инвентаря персонажа | :* $.weight - вес инвентаря персонажа | ||
:* $.maxweight - максимальная грузоподъемность персонажа | :* $.maxweight - максимальная грузоподъемность персонажа | ||
== Специальные ключевые слова == | == Специальные ключевые слова == | ||
Строка 435: | Строка 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''>) | ||
Строка 452: | Строка 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''>) | ||
Строка 471: | Строка 430: | ||
; @nick (<''word''>) | ; @nick (<''word''>) | ||
: | : Экранирует все метасимволы regexp и некоторые специальные символы perl с помощью '''\''' (обратный слэш). Придуман специально для экранирования некоторых имён персонажей. Например строчка | ||
[S] Namrok кричит: продам 'девственность каи', "шутка" | |||
будет преобразована в: | |||
\[S\]\ Namrok\ кричит:\ продам\ \'девственность\ каи\',\ \"шутка\" | |||
== Цепочка команд == | == Цепочка команд == | ||
Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками '''[''' и ''']'''. | Несколько команд выполняются друг за другом без задержки, если они объединены в цепочку команд квадратными скобками '''[''' и ''']'''. | ||
0 macro foo { | 0 macro foo { | ||
1 do whatever | 1 do whatever | ||
Строка 494: | Строка 455: | ||
Пример: | Пример: | ||
macro foo { | macro foo { | ||
$i = 1; pause 5; log \$i = $i; $ii = 2; $iii = 3; $i++; $ii--; lock automacroName; release automacroName; set overrideAI 1 | $i = 1; pause 5; log \$i = $i; $ii = 2; $iii = 3; $i++; $ii--; lock automacroName; release automacroName; set overrideAI 1 | ||
Строка 500: | Строка 460: | ||
Разделенные точкой с запятой "''';'''" команды не будут иметь задержки, совсем прям как в цепочке команд, за исключением некоторых команд, таких как '''pause''' и '''log'''. | Разделенные точкой с запятой "''';'''" команды не будут иметь задержки, совсем прям как в цепочке команд, за исключением некоторых команд, таких как '''pause''' и '''log'''. | ||
== Условия == | == Условия == | ||
В макросах (например в операторе if) можно использовать следующие условия: | В макросах (например в операторе if) можно использовать следующие условия: | ||
{| class="wikitable" border="1" cellspacing="0" | {| class="wikitable" border="1" cellspacing="0" | ||
Строка 523: | Строка 476: | ||
|align=center| меньше либо равно | |align=center| меньше либо равно | ||
|- | |- | ||
|align=center| == | |align=center| = или == | ||
|align=center| равно | |align=center| равно | ||
|- | |- | ||
Строка 539: | Строка 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 | ||
Строка 552: | Строка 505: | ||
==== Синтаксис оператора 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'''. | ||
Где | Где: | ||
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом (@xxx), специальной переменной ($.xxx), @eval, буквами и цифрами или даже perl'овой функцией [[ | :* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом (@xxx), специальной переменной ($.xxx), @eval, буквами и цифрами или даже perl'овой функцией [[macro#Perl_Subroutines|Perl Subroutines]]. | ||
:* <''label''>, имя существующей метки, может состоять только из латинских букв и цифр. | :* <''label''>, имя существующей метки, может состоять только из латинских букв и цифр. | ||
:* <''macro''>, имя существующего макрос. | :* <''macro''>, имя существующего макрос. | ||
:* <''n''>, сколько раз подряд должен отработать макрос. | :* <''n''>, сколько раз подряд должен отработать макрос. | ||
'''''Заметка:''''' | '''''Заметка:''''' | ||
Строка 579: | Строка 531: | ||
:* Если ''<n>'' больше нуля '''0''', вызванный макрос будет запущен '''n''' раз подряд, после чего вызвавший его макрос продолжит свою работу. | :* Если ''<n>'' больше нуля '''0''', вызванный макрос будет запущен '''n''' раз подряд, после чего вызвавший его макрос продолжит свою работу. | ||
'''''Заметка:''''' В операторе IF можно использовать такое количество выражений, сколько необходимо. | |||
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 ==== | ||
<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. | ||
Такого же эффекта можно достичь, используя '''call''' вместо '''goto'''. | Такого же эффекта можно достичь, используя '''call''' вместо '''goto'''. | ||
macro checknum { | macro checknum { | ||
$num = @rand(1, 3) | $num = @rand(1, 3) | ||
Строка 646: | Строка 593: | ||
end <loop> | end <loop> | ||
Где | Где: | ||
:* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами. | :* ''arg'' может быть переменной, вложенной переменной, специальным ключевым словом, @eval или буквами и цифрами. | ||
:* <loop> - название цикла. | :* <loop> - название цикла. | ||
:* Условие - [[macro#Условия|условие]]. | |||
==== Пример ==== | ==== Пример оператора WHILE ==== | ||
macro while { | macro while { | ||
$i = 0 | $i = 0 | ||
Строка 661: | Строка 608: | ||
На консоль выведется | На консоль выведется | ||
log | log $i = 0 | ||
log | log $i = 1 | ||
log | log $i = 2 | ||
log | log $i = 3 | ||
log | log $i = 4 | ||
log | log $i = 5 | ||
log | log $i = 6 | ||
log | log $i = 7 | ||
log | log $i = 8 | ||
log | 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> | |||
=== Условия в автомакросе === | === Условия в автомакросе === | ||
Автомакрос нуждается как минимум в одном условии или он никогда не сработает. В автомакросе может быть столько условий, сколько вы пожелаете. Некоторые условия устанавливают значения специальны переменных, которые вы потом можете использовать внутри макроса. | Автомакрос нуждается как минимум в одном условии или он никогда не сработает. В автомакросе может быть столько условий, сколько вы пожелаете. Некоторые условия устанавливают значения специальны переменных, которые вы потом можете использовать внутри макроса. | ||
; map <''mapname''> | ; map <''mapname''> | ||
Строка 718: | Строка 671: | ||
: Если указаны координаты <''x1''> <''y1''> и <''x2''> <''y2''>, то автомакрос запустится, если находясь на локации <''mapname''>, вы попадёте в мнимый прямоугольник, где <''x1''> <''y1''> - верхняя левая точка, а <''x2''> <''y2''> - нижняя правая точка. | : Если указаны координаты <''x1''> <''y1''> и <''x2''> <''y2''>, то автомакрос запустится, если находясь на локации <''mapname''>, вы попадёте в мнимый прямоугольник, где <''x1''> <''y1''> - верхняя левая точка, а <''x2''> <''y2''> - нижняя правая точка. | ||
<x1> <y1> _______ | <x1> <y1> _______ | ||
| | | | | | ||
Строка 726: | Строка 678: | ||
: Следует отметить, что <''x1''> < <''x2''> и <''y1''> > <''y2''> . | : Следует отметить, что <''x1''> < <''x2''> и <''y1''> > <''y2''> . | ||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или): | : Отделённые запятыми аргументы определяются как условие '''OR''' (или): | ||
location geffen, prontera 123 234 | location geffen, prontera 123 234 | ||
: Автомакрос запустится, если вы будете находиться в geffen или в prontera на координатах (123 234). | : Автомакрос запустится, если вы будете находиться в geffen или в prontera на координатах (123 234). | ||
: Несколько строк определяются как условие '''AND''' (и): | : Несколько строк определяются как условие '''AND''' (и): | ||
location not geffen | location not geffen | ||
location not prontera | location not prontera | ||
: Автомакрос будет запускаться, если вы находитесь вне geffen и вне prontera. | : Автомакрос будет запускаться, если вы находитесь вне geffen и вне prontera. | ||
; mapchange ( <''mapname''> | any | * ) [, ...] | ; mapchange ( <''mapname''> | any | * ) [, ...] | ||
Строка 744: | Строка 689: | ||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или). | : Отделённые запятыми аргументы определяются как условие '''OR''' (или). | ||
; hp <[[macro#Условия|условие]]> <''amount''>[%] | |||
; hp <[[ | |||
: Автомакрос сработает, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp. | : Автомакрос сработает, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; sp <[[macro#Условия|условие]]> <''amount''>[%] | |||
; sp <[[ | |||
: Автомакрос сработает, когда ваше SP будет удовлетворять заданному условию. | : Автомакрос сработает, когда ваше SP будет удовлетворять заданному условию. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; spirit <[[macro#Условия|условие]]> <''amount''> | |||
; spirit <[[ | |||
: Автомакрос сработает когда количество сферок у монка (или монеток у ганса) будет удовлетворять заданному условию. | : Автомакрос сработает когда количество сферок у монка (или монеток у ганса) будет удовлетворять заданному условию. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; weight <[[macro#Условия|условие]]> <''amount''>[%] | |||
; weight <[[ | |||
: Автомакрос сработает, когда вес инвентаря будет удовлетворять заданному условию. Можно использовать абсолютное значение <''amount''> или процентное <''amount''>%. | : Автомакрос сработает, когда вес инвентаря будет удовлетворять заданному условию. Можно использовать абсолютное значение <''amount''> или процентное <''amount''>%. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; cartweight <[[macro#Условия|условие]]> <''amount''>[%] | |||
; cartweight <[[ | |||
: Автомакрос сработает, когда вес телеги будет удовлетворять заданному условию. Можно использовать абсолютное значение <''amount''> или процентное <''amount''>%. | : Автомакрос сработает, когда вес телеги будет удовлетворять заданному условию. Можно использовать абсолютное значение <''amount''> или процентное <''amount''>%. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; zeny <[[macro#Условия|условие]]> <''amount''> | |||
; zeny <[[ | |||
: Автомакрос сработает, когда количество зенег будет удовлетворять заданному условию. | : Автомакрос сработает, когда количество зенег будет удовлетворять заданному условию. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; cash <[[macro#Условия|условие]]> <''amount''> | |||
: Автомакрос сработает, когда количество cash будет удовлетворять заданному условию. | |||
: Несколько строк определяются как условие '''AND''' (и). | |||
: Появилось в ревизии [http://sourceforge.net/p/openkore/code/8759/ 8759]. | |||
; soldout <[[ | ; soldout <[[macro#Условия|условие]]> <''slots''> | ||
: Автомакрос србаотает, когда количество слотов в вашем магазине будет удовлетворять заданному условию. Например в автомакросе прописано "soldout > 1". Пусть в магазине продаются 4 элу и 5 ори. Когда у вас купят все ори или все элу сработает автомакрос. Если купят всего 1 элу, то слот будет считаться не полностью проданным и автомакрос не сработает. | : Автомакрос србаотает, когда количество слотов в вашем магазине будет удовлетворять заданному условию. Например в автомакросе прописано "soldout > 1". Пусть в магазине продаются 4 элу и 5 ори. Когда у вас купят все ори или все элу сработает автомакрос. Если купят всего 1 элу, то слот будет считаться не полностью проданным и автомакрос не сработает. | ||
: Несколько строк определяются как условие '''AND''' (и). | |||
; status [not] <''status''> [, ...] | ; status [not] <''status''> [, ...] | ||
Строка 787: | Строка 728: | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; inventory "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...] | |||
; inventory "<''item''>" <[[ | |||
: Автомакрос сработает, когда количество вещей "<''item''>" в инвентаре будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | : Автомакрос сработает, когда количество вещей "<''item''>" в инвентаре будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | ||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или). | : Отделённые запятыми аргументы определяются как условие '''OR''' (или). | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; storage "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...] | |||
; storage "<''item''>" <[[ | |||
: Автомакрос сработает, когда количество вещей <''item''> на складе будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | : Автомакрос сработает, когда количество вещей <''item''> на складе будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | ||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или). | : Отделённые запятыми аргументы определяются как условие '''OR''' (или). | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; cart "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...] | |||
; cart "<''item''>" <[[ | |||
: Автомакрос сработает, когда количество вещей <''item''> в телеге будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | : Автомакрос сработает, когда количество вещей <''item''> в телеге будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | ||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или). | : Отделённые запятыми аргументы определяются как условие '''OR''' (или). | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; shop "<''item''>" <[[macro#Условия|условие]]> <''amount''> [, ...] | |||
; shop "<''item''>" <[[ | |||
: Автомакрос сработает, когда количество вещей <''item''> в открытом вами магазине будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | : Автомакрос сработает, когда количество вещей <''item''> в открытом вами магазине будет удовлетворять заданному условию. Имя вещи всегда писать в кавычках " ". | ||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или). | : Отделённые запятыми аргументы определяются как условие '''OR''' (или). | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; base <[[macro#Условия|условие]]> <''level''> | |||
; base <[[ | |||
: Автомакрос сработает, когда базовый уровень персонажа будет удовлетворять заданному условию. | : Автомакрос сработает, когда базовый уровень персонажа будет удовлетворять заданному условию. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; job <[[macro#Условия|условие]]> <''level''> | |||
; job <[[ | |||
: Автомакрос сработает, когда джоб уровень персонажа будет удовлетворять заданному условию. | : Автомакрос сработает, когда джоб уровень персонажа будет удовлетворять заданному условию. | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; class <''job''> | ; class <''job''> | ||
: Автомакрос сработает, когда класс персонажа, т.е. его профессия, будет <''job''>. Например class Novice или class Acolyte. | : Автомакрос сработает, когда класс персонажа, т.е. его профессия, будет <''job''>. Например class Novice или class Acolyte. | ||
; spell [party] <''spell''> [, ...] | ; spell [party] <''spell''> [, ...] | ||
Строка 841: | Строка 774: | ||
:* $.casterDist - возвращает дистанцию между персонажем и кастовавшим заклинание, из-за которого сработало условие spell в автомакросе. | :* $.casterDist - возвращает дистанцию между персонажем и кастовавшим заклинание, из-за которого сработало условие spell в автомакросе. | ||
; monster [not] <''monster(s) name''> <[[macro#Условия|условие]]> [<''distance''>] | |||
; monster [not] <''monster(s) name''> <[[ | : Автомакрос сработает, когда монстр <''monster(s) name''> рядом. Если дистанция <''distance''> не указаны, вместо неё берётся значение из конфига [[clientSight]]. | ||
: Автомакрос сработает, когда монстр <''monster(s) name''> рядом. Если дистанция <''distance''> не указаны, вместо неё берётся значение из конфига [[ | |||
: Отделённые запятыми аргументы определяются как условие '''OR''' (или). | : Отделённые запятыми аргументы определяются как условие '''OR''' (или). | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
Строка 853: | Строка 785: | ||
:* $.lastMonsterID - возвращает ID монстра, из-за которого сработало условие monster в автомакросе. | :* $.lastMonsterID - возвращает ID монстра, из-за которого сработало условие monster в автомакросе. | ||
:* $.lastMonsterCount - возвращает степень риска, исходящию от монстра, из-за которого сработало условие monster в автомакросе. | :* $.lastMonsterCount - возвращает степень риска, исходящию от монстра, из-за которого сработало условие monster в автомакросе. | ||
:* $.lastMonsterBinID - возвращает тип монстра (введено в ревизии [http://sourceforge.net/p/openkore/code/8509/ 8509]). | |||
; aggressives <[[macro#Условия|условие]]> <''number''> | |||
; aggressives <[[ | |||
: Автомакрос сработает, когда количество агрессивных монстров будет удовлетворять заданному условию. | : Автомакрос сработает, когда количество агрессивных монстров будет удовлетворять заданному условию. | ||
: Несколько строк определяются как условие '''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) [, ...] | ||
Строка 871: | Строка 808: | ||
: Несколько строк определяются как условие '''AND''' (и). | : Несколько строк определяются как условие '''AND''' (и). | ||
; var <''имя_переменной''> (unset | <[[macro#Условия|условия]]> <''значение''>) | |||
; var <'' | : Автомакрос сработает, когда <''переменная''> не определена <''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 | <[[macro#Условия|условия]]> <''значение''>) | |||
; varvar <''nested variable''> (unset | <[[ | |||
: Автомакрос сработает, когда вложенная переменная <''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]) | ||
: Автомакрос сработает, когда на консоли появится текст <''text''>, или появившийся на консоли текст удовлетворяет регулярному выражению <''regexp''>. | : Автомакрос сработает, когда на консоли появится текст <''text''>, или появившийся на консоли текст удовлетворяет регулярному выражению <''regexp''>. | ||
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу. | : Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу. | ||
:'''Присваивает значения переменным''': | :'''Присваивает значения переменным''': | ||
:* $.lastLogMsg - возвращает консольный текст, из-за которого сработало условие console в автомакросе. | :* $.lastLogMsg - возвращает консольный текст, из-за которого сработало условие console в автомакросе. | ||
:* $.lastMatchN - возвращает текст, который был заключен в круглые скобки в регулярном выражении. | :* $.lastMatchN - возвращает текст, который был заключен в круглые скобки в регулярном выражении. | ||
; pm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''player''>] | ; pm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''player''>] | ||
: Автомакрос сработает, когда в приватном сообщении появится <''text''> от игрока [<''player''>], или приватное сообщение удовлетворяет заданному регулярному выражению <regexp>. | : Автомакрос сработает, когда в приватном сообщении появится <''text''> от игрока [<''player''>], или приватное сообщение удовлетворяет заданному регулярному выражению <regexp>. | ||
: Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу. | : Параметр '''i''' (следует писать сразу после /<''regexp''>/, без пробела) означает, что регулярное выражение становится нечувствительным к РеГиСтРу. | ||
:'''Присваивает значения переменным''': | :'''Присваивает значения переменным''': | ||
:* $.lastpm - возвращает имя игрока, который написал приватное сообщение, из-за которого сработало условие pm в автомакросе. | :* $.lastpm - возвращает имя игрока, который написал приватное сообщение, из-за которого сработало условие pm в автомакросе. | ||
:* $.lastpmMsg - возвращает приватное сообщение, из-за которго сработало условие pm в автомакросе. | :* $.lastpmMsg - возвращает приватное сообщение, из-за которго сработало условие pm в автомакросе. | ||
; pubm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''distance''>] | ; pubm ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) [, <''distance''>] | ||
Строка 909: | Строка 851: | ||
:* $.lastpub - имя персонажа, который послал в общий чат сообщение, из-за которого сработало условие pubm в автомакросе. | :* $.lastpub - имя персонажа, который послал в общий чат сообщение, из-за которого сработало условие pubm в автомакросе. | ||
:* $.lastpubMsg - сообщение в общем чате, из-за которого сработало условие pubm в автомакросе. | :* $.lastpubMsg - сообщение в общем чате, из-за которого сработало условие pubm в автомакросе. | ||
; party ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) | ; party ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) | ||
Строка 918: | Строка 859: | ||
:* $.lastparty - имя персонажа, который послал в партийном чате сообщение, из-за которого сработало условие party в автомакросе. | :* $.lastparty - имя персонажа, который послал в партийном чате сообщение, из-за которого сработало условие party в автомакросе. | ||
:* $.lastpartyMsg - сообщение в партийном чате, из-за которого сработало условие party в автомакросе. | :* $.lastpartyMsg - сообщение в партийном чате, из-за которого сработало условие party в автомакросе. | ||
; guild ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) | ; guild ("<''text''>" | /<[http://www.regular-expressions.info/quickstart.html regexp]>/[i]) | ||
Строка 927: | Строка 867: | ||
:* $.lastguild - имя персонажа, который послал в гильдийном чате сообщение, из-за которого сработало условие guild в автомакросе. | :* $.lastguild - имя персонажа, который послал в гильдийном чате сообщение, из-за которого сработало условие guild в автомакросе. | ||
:* $.lastguildMsg - сообщение в гильдийном чате, из-за которого сработало условие guild в автомакросе. | :* $.lastguildMsg - сообщение в гильдийном чате, из-за которого сработало условие guild в автомакросе. | ||
; 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''' (или). | ||
:'''Присваивает значения переменным''': | :'''Присваивает значения переменным''': | ||
Строка 940: | Строка 879: | ||
:* $.lastGuildNameBinIDName - возвращает имя игрока, из-за которого сработало условие playerguild в автомакросе. | :* $.lastGuildNameBinIDName - возвращает имя игрока, из-за которого сработало условие playerguild в автомакросе. | ||
:* $.lastGuildNameBinIDJobName - возвращает класс, т.е. профессию игрока, из-за которого сработало условие playerguild в автомакросе. | :* $.lastGuildNameBinIDJobName - возвращает класс, т.е. профессию игрока, из-за которого сработало условие playerguild в автомакросе. | ||
; hook <''hookname''> | ; hook <''hookname''> | ||
: Автомакрос сработает, когда OpenKore вызовут хук <''hookname''>. | : Автомакрос сработает, когда OpenKore вызовут хук <''hookname''>. | ||
; save <''hash key''> (используется в комбинации с hook) | ; save <''hash key''> (используется в комбинации с hook) | ||
Строка 957: | Строка 894: | ||
} | } | ||
} | } | ||
; whenGround [not] <''spell''> | ; whenGround [not] <''spell''> | ||
: Автомакрос сработает, когда персонаж [не] находится в зоне действия площадного скила <''spell''>. | : Автомакрос сработает, когда персонаж [не] находится в зоне действия площадного скила <''spell''>. | ||
: Имена скилов через запятые рассматриваются как условие '''OR''' (или). | : Имена скилов через запятые рассматриваются как условие '''OR''' (или). | ||
; 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) | |||
} | |||
} | |||
; localtime <[[ | '''Источник:''' [http://forums.openkore.com/viewtopic.php?f=32&t=6444 areaSpell automacro syntax Macro 2.0.3-SVN] by '''ezza'''. | ||
: Автомакрос сработает, когда время на внутренних часах компьютера удовлетворяет условию <[[ | |||
; 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 первоисточник] | |||
; eval <perl expression> | |||
: Автомакрос сработает, когда указанное перловое выражение <perl expression> будет истинно, то есть иметь значение true. | |||
; run-once (0 | 1) | ; run-once (0 | 1) | ||
: Если этот параметр автомакроса установлен в '''1''', то после срабатывания автомакрос будет залочен, т.е. закрыт и не сможет больше проверять условия и срабатывать на них. Другими словами, автомакрос сработает только один раз. | : Если этот параметр автомакроса установлен в '''1''', то после срабатывания автомакрос будет залочен, т.е. закрыт и не сможет больше проверять условия и срабатывать на них. Другими словами, автомакрос сработает только один раз. | ||
: Используйте команду '''release''' в макросе, чтобы разлочить, т.е. отрыть автомакрос, чтобы он мог опять когда-нибудь сработать. | : Используйте команду '''release''' в макросе, чтобы разлочить, т.е. отрыть автомакрос, чтобы он мог опять когда-нибудь сработать. | ||
; overrideAI (0 | 1) | ; overrideAI (0 | 1) | ||
: Если этот параметр автомакроса установлен в '''1''', то вызываемый макрос будет игнорировать openkore'овый AI. Это | : Если этот параметр автомакроса установлен в '''1''', то вызываемый макрос будет игнорировать openkore'овый AI. Это значит, что не будет пауз от команд "move" или "status dead". | ||
; delay <''n''> | ; delay <''n''> | ||
: Если этот параметр автомакроса установлен, то после срабатывания автомакроса пройдёт <''n''> секунд перед тем, как будет запущен соответствующий макрос. | : Если этот параметр автомакроса установлен, то после срабатывания автомакроса пройдёт <''n''> секунд перед тем, как будет запущен соответствующий макрос. | ||
; timeout <''n''> | ; timeout <''n''> | ||
: Если этот параметр автомакроса установлен, то пройдет как минимум <''n''> секунд перед тем, как автомакрос сможет сработать снова. | : Если этот параметр автомакроса установлен, то пройдет как минимум <''n''> секунд перед тем, как автомакрос сможет сработать снова. | ||
; macro_delay <''n''> | ; macro_delay <''n''> | ||
: Если этот параметр автомакроса установлен, то он переопределяет глобальное значение macro-задержки для вызываемого макроса. | : Если этот параметр автомакроса установлен, то он переопределяет глобальное значение macro-задержки для вызываемого макроса. | ||
; priority <''num''> | ; priority <''num''> | ||
: Этот параметр автомакроса определяет, в какой очередности проверяются автомакросы на удовлетворение условий срабатывания. Чем меньше значение <''num''> этого параметра, тем меньше будет ждать автомакрос в очереди. Если параметр не задан, то предполагается, что '''priority 0''', т.е. проверяется в первую очередь. | : Этот параметр автомакроса определяет, в какой очередности проверяются автомакросы на удовлетворение условий срабатывания. Чем меньше значение <''num''> этого параметра, тем меньше будет ждать автомакрос в очереди. Если параметр не задан, то предполагается, что '''priority 0''', т.е. проверяется в первую очередь. | ||
; exclusive (0 | 1) | ; exclusive (0 | 1) | ||
: Если этот параметр автомакроса установлен в '''1''', то выполнение этого автомакроса не может быть прервано срабатыванием другого автомакроса. | : Если этот параметр автомакроса установлен в '''1''', то выполнение этого автомакроса не может быть прервано срабатыванием другого автомакроса. | ||
; set <''variable''> <''value''> | ; set <''variable''> <''value''> | ||
: Этот параметр автомакроса устанавливает переменной <''variable''> значение <''value''>. Этот параметр можно использовать несколько раз. | : Этот параметр автомакроса устанавливает переменной <''variable''> значение <''value''>. Этот параметр можно использовать несколько раз. | ||
; orphan <''method''> | ; orphan <''method''> | ||
Строка 1022: | Строка 972: | ||
Всегда закрывайте фигурные скобки '''{''' и '''}'''. | Всегда закрывайте фигурные скобки '''{''' и '''}'''. | ||
== Одиночные макросы == | == Одиночные макросы == | ||
Строка 1100: | Строка 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 | ||
Строка 1145: | Строка 1096: | ||
} | } | ||
== | == Комментарии в макросах == | ||
Комментарии в файле с макросами начинаются со знака #, всё после этого символа игнорируется макро-плагином. | Комментарии в файле с макросами начинаются со знака #, всё после этого символа игнорируется макро-плагином. | ||
:* Начинающиеся со знака # строки являются комментарием. | :* Начинающиеся со знака # строки являются комментарием. | ||
:* Всё после пробела и знака # также считается комментарием. | :* Всё после пробела и знака # также считается комментарием. | ||
Строка 1156: | Строка 1106: | ||
На консоль будет выведено: | На консоль будет выведено: | ||
[log] I'm Happy | |||
== Примеры | == Приложение. Примеры == | ||
Предполагается, что вы знаете как использовать консольные команды | Предполагается, что вы знаете как использовать [[:Категория:Console_Command|консольные команды]] OpenKore и понимаете, как они работают. | ||
Если это не так, прежде чем идти дальше, пробегитесь по разделу консольных команд [[ | Если это не так, прежде чем идти дальше, пробегитесь по разделу консольных команд [[:Категория:Console_Command|консольные команды]] и попробуйсте некоторые команды, например [[a]], [[ai]], [[move]], [[cart|cart get]], [[storage|storage add]], [[talk]], [[deal]], [[take]], [[sl]], [[sm]], [[relog]], [[pm]] и может быть другие. | ||
Есть два типа макросов: | Есть два типа макросов: | ||
#''' | #'''automacro''' – автомакросы, они срабатывают автоматически. | ||
#''' | #'''macro''' – просто макросы, они не срабатывают автоматически, их нужно запускать из консоли OpenKore руками или автомакросом. | ||
'''Автомакрос''' | '''Автомакрос''' | ||
Автомакрос - это макрос, который срабатывает автоматически, когда выполняются заданные условия. Вся суть автомакроса в проверке условий срабатывания. Если все условия автомакроса выполняются, то запускаются команды из блока call { ... } или вызывается call <'''имямакросса'''>. | Автомакрос - это макрос, который срабатывает автоматически, когда выполняются заданные условия. Вся суть автомакроса в проверке условий срабатывания. Если все условия автомакроса выполняются, то запускаются команды из блока call { ... } или вызывается call <'''имямакросса'''>. Формат автомакроса: | ||
automacro <name> { | automacro <name> { | ||
condition 1 | condition 1 | ||
Строка 1190: | Строка 1138: | ||
Наример, предположим, что вы играете руками в Ragnarok, но у вас есть ведомый прист под управлением OpenKore. Нужно сделать так, чтобы прист предупреждал, если у него осталось мало маны. Это можно сделать так: | Наример, предположим, что вы играете руками в Ragnarok, но у вас есть ведомый прист под управлением OpenKore. Нужно сделать так, чтобы прист предупреждал, если у него осталось мало маны. Это можно сделать так: | ||
automacro sp { | automacro sp { | ||
sp < 200 | sp < 200 | ||
Строка 1198: | Строка 1145: | ||
timeout 10 | timeout 10 | ||
} | } | ||
Разберём этот автомакрос строка за строкой, | Разберём этот автомакрос строка за строкой, | ||
#'''''automacro sp {''''' - Ключевое слово automacro говорит Kore о том, что это автомакрос. Далее пишется имя, которое вы дали автомакросу. В данном случае - sp. Дальще следует открывающая фигурная скобка “{“, после неё следует тело автомакроса. | #'''''automacro sp {''''' - Ключевое слово automacro говорит Kore о том, что это автомакрос. Далее пишется имя, которое вы дали автомакросу. В данном случае - sp. Дальще следует открывающая фигурная скобка “{“, после неё следует тело автомакроса. | ||
#'''''sp < 200''''' – После “{“ следует написать условия срабатывания автомакроса. В данном случае используется только одно условие, которое выполняеется, когда мана, количество SP у персонажа опускается ниже 200 единиц. | #'''''sp < 200''''' – После “{“ следует написать условия срабатывания автомакроса. В данном случае используется только одно условие, которое выполняеется, когда мана, количество SP у персонажа опускается ниже 200 единиц. | ||
Строка 1213: | Строка 1158: | ||
Следующий макрос демонстрирует как реагировать на всякие странные ситуации. Например металлинги могу стрипнуть оружие и тогда боту придётся туго. Настройте боту оружие по умолчанию и используйте следующий автомакрос. | Следующий макрос демонстрирует как реагировать на всякие странные ситуации. Например металлинги могу стрипнуть оружие и тогда боту придётся туго. Настройте боту оружие по умолчанию и используйте следующий автомакрос. Короче говоря, как только у персонажа стрипнут оружие, он телепортируется от моба и делает релог через 10 секунд. После релога бот сам оденет оружие, так как оно в конфиге было настроено как оружие по умолчанию. | ||
automacro strip { | automacro strip { | ||
status Strip Weapon | status Strip Weapon | ||
timeout 10 | |||
call { | call { | ||
do tele | do tele | ||
do relog 10 | do relog 10 | ||
} | } | ||
} | } | ||
Следующий автомакрос демонстрирует, как ако-производные с прокачанным скилом "варп портал" могут добираться до локации кача. Когда бот оказывается вне города по пути к lockMap, например на gef_fild07 - срабатывает данный автомакрос. "do ai manual" используется для того, чтобы ИИ Коры не вмешивался в действия макроса, в данном случае, чтобы бот не двигался. "pause" нужна для того, чтобы бот успел скастовать варп портал. | |||
automacro warp { | automacro warp { | ||
map gef_fild07 | map gef_fild07 | ||
Строка 1258: | Строка 1187: | ||
} | } | ||
В макро-плагине есть много полезных встроенных переменных, которые, например, хрянят позицию персонажа. Эти переменные начинаются со знаков "''$.''" и они уже были описаны выше. Следующий пример демонстрирует, как получить координаты 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 = /(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/ | |||
/(a | Знак плюс означает, что стоящий перед этим плюсом символ должен присутствовать в тексте один и более раз. Таким образом, если в общий чат скажут что-то типа "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 == | == 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'''. | |||
[[Category:Plugins]] | [[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.