PDA

Просмотр полной версии : ГАЙД по Macro plugin


4epT
13.02.2007, 15:43
САМЫЙ СВЕЖИЙ МАНУАЛ НА РУССКОМ (http://ragbot.ru/wiki/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD)

Этот гайд для макропланига версии 1.3.5 (это примерно кора версии не позже 1.9.4)

Щас есть макро плагин 2.0.1 (он для коры версии выше 2.0.0) В этой версии удалили некоторые опции(отладку), так что можно пользоваться этим гайдом.
Гайд для макро плагина версии 2.0.1 находится тут (http://wiki.openkore.com/index.php?title=Macro)

Что такое macro плагин? (http://ragbot.ru/forum/showpost.php?p=3297&postcount=2)
Установка macro плагина (http://ragbot.ru/forum/showpost.php?p=3298&postcount=3)
Настройка файлов (http://ragbot.ru/forum/showpost.php?p=3301&postcount=4)
Команды (http://ragbot.ru/forum/showpost.php?p=3305&postcount=5)
Синтаксис макроса (http://ragbot.ru/forum/showpost.php?p=3316&postcount=6)
Переменные
6.1 Собственные переменные (http://ragbot.ru/forum/showpost.php?p=3332&postcount=7)
6.2 Специальные переменные (http://ragbot.ru/forum/showpost.php?p=3333&postcount=8)
6.3 Вложенные переменные (http://ragbot.ru/forum/showpost.php?p=3335&postcount=9)

Операторы макроса (http://ragbot.ru/forum/showpost.php?p=3336&postcount=10)
Условия (http://ragbot.ru/forum/showpost.php?p=3337&postcount=11)
Специальные операторы (http://ragbot.ru/forum/showpost.php?p=3338&postcount=12)
Формирование "цепочки команд" (http://ragbot.ru/forum/showpost.php?p=3339&postcount=13)
Пример макроса (http://ragbot.ru/forum/showpost.php?p=3363&postcount=14)
Синтаксис автомакроса
Часть 1 (http://ragbot.ru/forum/showpost.php?p=3375&postcount=16)
Часть 2 (http://ragbot.ru/forum/showpost.php?p=3389&postcount=17)

Пример автомакроса (http://ragbot.ru/forum/showpost.php?p=3390&postcount=18)
Отладка (http://ragbot.ru/forum/showpost.php?p=3391&postcount=19)
Ограничения (http://ragbot.ru/forum/showpost.php?p=3392&postcount=20)
Специальная переменная $.lastMatchN и регулярные выражения (regexp) (http://ragbot.ru/forum/showpost.php?p=6117&postcount=21)


Оригинал мануала (http://wiki.openkore.com/index.php?title=Macro), также есть и на русском (http://ragbot.ru/wiki/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD)
Форум по обсуждению макросов (http://forums.openkore.com/viewforum.php?f=32) (на англ.)
Сборник макросов (http://ragbot.ru/forum/showthread.php?t=634)

Народ, кто заметит очепятки, недочёты, может где-то надо что-то дополнить, чтобы лучше понять, может кто-то понил то, что не понятно мне.. Не стесняйтесь пишите :)

4epT
13.02.2007, 15:47
1. Что такое macro плагин?

С этим плагином Вы сможете написать последовательность команд (макросов), которые бот будет выполнять вручную или в зависимости от ситуации (условия). Последняя версия - 1.3.5.

4epT
13.02.2007, 16:00
2. Установка macro плагина

Отмечу, что на нашем сайте плагин macro уже добавлен в OpenKore. Как и на многих других сайтах.

Скачайте macro plugin 1.3.5 (http://downloads.sourceforge.net/openkore/macro-1.3.5.zip).
Переместитесь в папку с ботом (думаю не надо объяснять что это).
В это папке создайте новую папку plugins (если она ещё не создана).
Из скаченного zip-файла извлеките файлы macro.pl и cvsdebug.pm, а также папку (со в сем содержимым) macro в папку plugins.
В папке control создайте новый файл macros.txt (если он ещё не создан). В это файл Вы будете писать свои макросы или автомакросы.
Так должно выглядеть дерево каталогов Вашего бота (исключая файлы самого OpenKorа):
OPENCORE
|-- openkore.pl
|-- CONTROL
| `-- macros.txt
|-- FIELDS
|-- LOGS
|-- PLUGINS
| |-- MACRO
| | |-- Automacro.pm
| | |-- Data.pm
| | |-- Parser.pm
| | |-- Script.pm
| | `-- Utilities.pm
| |-- macro.pl
| `-- cvsdebug.pm
|-- SCR
`-- TABLES

4epT
13.02.2007, 16:36
3. Настройка файлов

control/macros.txt

В этот файл вписываются сами макросы или автомакросы.
Внимание: если у вас в этом файле содержится русский текст, то файл необходимо сохранить в кодировке utf-8 и закомментировать 1 строчку знаком #.

Пример макроса, включающего команду "@autoloot 100" при заходе в игру:
###@autoloot 100###
automacro loot {
console /You are now in the game/
delay 4
call lootM
}
macro lootM {
do c @autoloot 100
}

control/timeouts.txt

В это файл добавьте строчку:
macro_delay <n>
<n> - пауза в секундах, которую плагин будет делать между командами.

Пример:
###macros###
macro_delay 1

control/config.txt

В это файл добавьте строчки:

macro_nowarn <значение>
<значение> - 0 или 1 - вкл. или выкл. раздражающие предупреждения когда автомакрос не использует команду call

macro_orphans <метод>
<метод> - terminate, reregister или reregister_safe

Например, если использовать команду "ai clear" во время работающего макроса, то этот макрос станет "одиночным". Это означает что макрос существует, но не может продолжатся, т.е. макрос остается без поддержки Искусственного Интеллекта (ИИ, он же AI) и не может действовать самостоятельно. До версии макроса 1.0.2 нужно было вручную вводить остановку макроса командой "macro stop". Начиная с версии 1.0.2 Вы можете выбрать определённый метод решения этой проблемы.

Есть три метода:
1. terminate - завершает макрос (аналогично команде "macro stop")
2. reregister - перерегистрация ИИ и отмена других входов. Это вызывает продолжение макроса
3. reregister_safe - перерегистрация ИИ и установка ожидания. Это означает, что макрос будет продолжен как только выполнятся все другие задачи.

macro_readmanual red/chili
Эта строчку нужна для того чтобы macro plugin загрузился. Т.е. проверка на внимательность. Без неё плагин выгрузится!

Пример:
###macros###
macro_readmanual red/chili
macro_nowarn 1
macro_orphans reregister

4epT
13.02.2007, 18:34
4. Команды

Для запуска макроса необходимо в командной строке написать:
macro <имя макроса>

Макрос можно запускать с различными опциями и параметрами:
macro <имя макроса> [опции] [-- параметр(ы)]

При запуске макроса можно воспользоваться следующими опциями:
-repeat <n>
Повторяет макрос n раз. n должно быть целым числом.
Т.е. если n=2, то макрос 1 раз выполнится и ещё 2 раза повторится.

-overrideAI
Отключает искусственный интеллект бота.

-macro_delay <n>
Устанавливает задержку между командами макроса в n секунд, игнорируя значение в timeouts.txt.

-exclusive
Не позволит автомакросу закончит этот макрос.

-orphan <метод>
Использует <метод> (terminate, reregister или reregister_safe) для обработки одиночного макроса. Про методы подробнее написано тут (http://ragbot.ru/forum/showpost.php?p=3301&postcount=4).


Параметр для макроса определяется после двойного тире (--). Эти параметры эквивалентны переменным от $.param1 до $.paramN.

Например:
Пусть файл macros.txt содержит следующее:
macro foo {
log Parametr 1 -> $.param1
log Parametr 2 -> $.param2
}
Если макрос foo запустить с параметрами abra и kadabra (macro foo -- abra kadabra), то на экране появится:

[macro] Parametr 1 -> abra
[macro] Parametr 2 -> kadabra

macro list
Показывает список всех доступных макросов.

macro stop
Останавливает текущий макрос.

macro pause
Приостанавливает запущенный макрос.

macro resume
Включает приостановленный макрос.

macro set <имя переменной> <значение>
Устанавливает (заменяет) переменной <имя переменной> значение <значение> или удаляет переменную, если значение не задано.

macro version
Выводит на экран версию macro плагина.

macro reset [<имя автомакроса>]
Сбрасывает "run-once" всех автомакросов или определённого автомакроса. Эту команду можно использовать для нескольких автомакросов сразу. Для этого имена автомакросов пишутся через пробел.

macro status
Показывает запущен ли макрос в настоящее время. Если макрос запущен, то показывает:
status: running << запущен
delay: 10s << задержка перед следующей командой
line: 3 << текущая строку макроса
override AI: no << настройка опции "-overrideAI"
paused: no << пауза макроса
finished: no << закончен ли макрос

4epT
13.02.2007, 21:38
5. Синтаксис макроса

Теоретически вы можете использовать любую консольную команду (http://ragbot.ru/forum/showthread.php?t=26) в макросе =)

# <комментарий>
Всё что находится за значком "#" OpenKore воспринимает как комментарий.

do <команда>
Выполнить <команду>. Со списком команд можно ознакомиться тут (http://hakore.bot.nu/openkore/manual/view.php?p=Console%20Commands). Например (бот пойдёт в пронту на координаты 123 234, затем сядет, а потом скажет в общий чат "hello world"):
macro foo {
do move 123 234 prontera
do sit
do c "hello world"
}log <текст>
Выводит <текст> на консоль (это текст увидите только Вы). Например:
macro foo {
log 3Ta koMaHDa BbIBoDuT TekcT B koHcoLb.
log Ee Mo)I(Ho uCnoLb30BaTb DL9 noDcka3ok!
}
pause <n>
Останавливает макрос на <n> секунд. Например:
macro foo {
log I'm here and...
pause 10
log now I'm here.
}call <имя макроса> <n>
Вызывает макрос с именем <имя макроса> <n> раз (n – целое число). Когда макрос <имя макроса> закончится, то текущий макрос продолжит работу.

release <имя автомакроса> | all
Включает закрытый автомакрос. Для включения всех автомакросов, используйте команду "release all".

lock <имя автомакроса>
Закрывает автомакрос и выключает его проверку.

stop
Немедленно завершает запущенный макрос.

set <опция> <значение>
Устанавливает <опции> соответствующее <значение>:
repeat <число раз>
overrideAI [0|1]
macro_delay <задержка>
exclusive [0|1]
orphan <метод>
Подробнее про опции макроса можно узнать тут (http://ragbot.ru/forum/showpost.php?p=3305&postcount=5).

4epT
14.02.2007, 00:51
6.1 Собственные переменные

Вы можете задавать и работать с собственными переменными.
Чтобы установить (или задать новое значение) переменную, используйте:
$<имя переменной> = <значение>

Для увеличения или уменьшения значения переменной на 1, используйте:
$<имя переменной>++ или $<имя переменной>--

Для вычислительных операций с переменными используйте команду @eval.
Переменную можно задать как список, состоящий из нескольких переменных, разделённых запятой:
$list = element one,element two,foo,bar,baz
Чтобы извлечь первую переменную из этого списка, используйте:
macro foo {
$list = element one,element two,foo,bar,baz
$var = [$list]
log nepeMeHHa9 "var" uMeeT 3Ha4eHue: $var (element one)
log nepeMeHHa9 "list" Tenepb uMeeT 3Ha4eHue: $list (element two,foo,bar,baz)
}
Отмечу, что <имя переменной> должно начинаться с буквы и не должно содержать ничего кроме букв и цифр.

Пример, отображающий основные операции с переменными:
macro foo {
$var1 = world
$var2 = hello
$var3 = $var2 $var1
log next line will yell out "hello world . world . hello"
do c $var3 . $var1 . $var2
$var4 = 47
log \$var4 is $var4
$var4++
log \$var4 is $var4
$var4 = @eval ($var4 + 52)
log \$var4 is $var4
}

4epT
14.02.2007, 01:04
6.2 Специальные переменные

Здесь представлены специальные переменные. Они начинаются с символов "$."

$.map - карта на которой вы находитесь ("prontera")
$.pos - ваша текущая позиция ("123 234")

$.time - текущее время как отметка пользователей Юникс ("1131116304"). Хз чё такое
$.datetime - текущее число и время ("Fri Nov 4 15:59:36 2005")

$.hp - текущее ХП
$.sp - текущее СП

$.lvl - текущий базовый левл
$.joblvl - текущий джоб левл

$.spirits - текущее количество сферок (для монка)

$.zeny - текущее количество баксов

$.status - текущие статусы (аги, блесс, перевес...). Хз чё такое

$.lastLogMsg - текст, запустивший последний автомакрос условием "console"

$.lastpub - имя игрока, который запустил последний автомакрос условием "pubm"
$.lastpubMsg - последнее его написанное сообщение

$.lastpm - имя игрока, который запустил последний автомакрос условием "pm"
$.lastpmMsg - последнее его написанное сообщение

$.lastguild - имя игрока, который запустил последний автомакрос условием "guild"
$.lastguildMsg - последнее его написанное сообщение

$.lastparty - имя игрока, который запустил последний автомакрос условием "party"
$.lastpartyMsg - последнее его написанное сообщение

$.lastMonster - имя монстра, который запустил последний автомакрос условием "monster"
$.lastMonsterPos - последняя известная позиция этого монстра ("123 234 prontera")

$.lastMatchN - текст регулярного выражения (regexp)

$.paramN - N-ый параметр при запуске макроса
Например если макрос запустить так: "macro foo -- abra kadabra", то $.param1 = abra, а $.param2 = kadabra. См. команды (http://ragbot.ru/forum/showpost.php?p=3305&postcount=5).

$.caller - имя последнего запущенного автомакроса

$.hooksaveN - value of a hash key (argument that's given with hook). Хз чё такое

4epT
14.02.2007, 01:06
6.3 Вложенные переменные

Вы можете определить динамические или вложенные переменные. Например:
macro foo {
$var = foo
log \$var is "foo"
${$var} = bar
log \$\$var is \$foo is "bar"
}

4epT
14.02.2007, 01:15
7. Операторы макроса

Macro плагин поддерживает только три оператора ("while", "if (...) + goto" и "goto"). Так как нет (видимой) нумерации строк, то Вы должны использовать метки которые определяются как:
:<имя метки>

Пример конструкции "while":
macro foo {
$i = 0
log the next lines will loop 11 times (0 .. 10)
while ($i <= 10) as exampleloop
log loop $i
$i++
end exampleloop
}

Пример конструкции "if" + "goto" (аналог if (...) then (...)):
проверяем условие равенста i=1
macro foo {
$i = @random ("1", "2")
if ($i = 1) goto one
goto end
:one
log i is one
log tra-ta-ta
:end
}

Однако короче будет "от противного", т.е. проверить условие "i не равно 1"
macro foo {
$i = @random ("1", "2")
if ($i != 1) goto end
log i is one
:end
log tra-ta-ta
}



Отмечу, что метки оператора goto не могут содержать ничего кроме букв и цифр. Например: "warp_to_payon" писать неправильно, правильно писать так: warpToPayon.

Оператор if (...), можно использовать только с последующим оператором goto. Т.е. написать как в обычных языках программирования:
if ($a != 2) $a = 3 <- нельзя!
Необходимо реализовать следующим образом:
if ($a != 2) goto end
$a = 3
:end
В случае если необходимо пользоваться конструкцией вида:
if (...)
then (...)
else (...)
то в макросах это будет выглядеть так:
macro foo {
$i = @random ("1", "2")
if ($i == 1) goto one
log i is two
goto end
:one
log i is one
goto end
:end
log tra-ta-ta
}

Пример конструкции "goto":

macro foo {
$i = 1
:plus
$i++
log i = $i
goto plus
}
Получился цикл: 1,2,3...

4epT
14.02.2007, 01:19
8. Условия

В макросах (например в операторе if) можно использовать следующие условия:

< меньше чем ...
<= меньше либо равно
== равно
> больше чем ...
>= больше или равно
!= не равно
~ содержится (<левая переменная> это элемент <правой переменной>, здесь правая переменная представляет собой лист переменных (см. пункт 6.1 (http://ragbot.ru/forum/showpost.php?p=3332&postcount=7))

4epT
14.02.2007, 01:39
9. Специальные операторы

@npc (<x> <y>)
Показывает ID НПЦ, находящегося на (<x>,<y>), или "-1" если НПЦ не найден.

@inventory (<имя вещи>)
Показывает ID <имя вещи>, находящейся у Вас в инвентаре, или "-1" если такая вещь не найдена.

@Inventory (<имя вещи>)
same as @inventory but returns all matching IDs as a comma-separated list or -1 if the item was not found.
Здесь переводить не стал, т.к. не понял смысла оператора, кто разберётся чем он отличается от "@inventory" поделитесь секретом.

@cart (<имя вещи>)
Показывает ID <имя вещи>, находящейся у Вас в телеге, или "-1" если такая вещь не найдена.

@Cart (<имя вещи>)
same as @cart but returns all matching IDs as a comma-separated list or -1 if the item was not found.

@storage (<имя вещи>)
Показывает ID <имя вещи>, находящейся у Вас в кафре (хранилище), или "-1" если такая вещь не найдена.

@Storage (<имя вещи>)
same as @storage but returns all matching IDs as a comma-separated list or -1 if the item was not found.

@player (<имя игрока>)
Показывает ID <имя игрока>, или "-1" если такой игрок не найден.

@vender (<имя игрока>)
Показывает ID торговца <имя игрока>, который открыл магазин, или "-1" если такой игрок не найден.

@store (<имя вещи>)
Показывает ID <имя вещи> в магазине торговца (тут уже НПЦ, а не человека), или "-1" если такая вещь не найдена.

@random ("<аргумент1>","<аргумент2>", ...)
Показывает случайным образом один из указанных аргументов. Аргументы обязательно писать в кавычках. Несколько аргументов разделяются запятыми.

@rand (<n>, <m>)
Показывает случайное число между <n> и <m> (включительно). Дробные числа округляются до целого значения (3.4 округляется до 3; а 3.5 до 4).

@invamount (<имя вещи>)
Показывает количество данной <имя вещи> в инвентаре.

@cartamount (<имя вещи>)
Показывает количество данной <имя вещи> в телеге.

@shopamount (<имя вещи>)
Показывает количество данной <имя вещи> в Вашем (открытом) магазине.

@storamount (<имя вещи>)
Показывает количество данной <имя вещи> в кафре.

@eval (<аргумент(ы)>)
Оценивает данный аргумент, или несколько аргументов.
Например, если аргумент "$v = 8", то результатом оператора "@eval ($v + 2)" будет число 10.

@arg ("<набор слов>", <n>)
Показывает <n>-ное слово из <набор слов>, или пробел, если <n> больше количества слов в <набор слов>.

@config (<параметр>)
Показывает значение параметра из config.txt.
Например строчка в макросе "log @config (username)" покажет на экране: "[macro][log] <ваш логин>".

4epT
14.02.2007, 01:48
10. Формирование "цепочки команд"

Вы можете запустить последовательность команд (одну за другой), не дожидаясь OpenKore-вского искусственного интеллекта или macro_delay или чего-то ещё. Для этого заключите эти команды в квадратные скобки: [ И ].
Пример, с нумерацией линий:
0 macro foo {
1 do <команда>
2 log <команда> BbInoLHeHa
3 [
4 do <команда1>
5 do <команда2>
6 log <команда1> u <команда2> BbInoLHeHbI
7 ]
8 log END
9 }
Линия 3 запускает "цепочку команд". Эта линия не имеет задержки.
Линии 4, 5 и 6 запускаются, как только предыдущая команда закончилась без задержки, и они не могут быть прерваны.
Линия 7 останавливает "цепочку команд" и после линии 8 команды пойдут с задержкой $macro_delay <секунд>.

4epT
14.02.2007, 18:23
11. Пример макроса

macro foo {
$foobegin = $.pos
do move 168 128 prt_in
do talk @npc (172 130)
do store
do buy @store (Silver Arrow) 10000
do move 280 198 prontera
do talk @npc (282 200)
do talk cont
do talk resp 1
do storage add @inventory (Silver Arrow) @eval (@invamount (Silver Arrow) - 1000)
do storage close
do move $foobegin
}
Если Вы находитесь в Пронте и вызовите макрос через команду (в консоле) "macro foo", то произойдёт следующие:


переменная "foobegin" принимает значение ваших текущих координат
бот идёт в оружейный магазин Пронты "168 128 prt_in"
бот заговорит с (кликнет на) НПЦ, находящегося на координатах 172 130
нажимает кнопку “buy”, чтобы посмотреть что он продаёт
покупает 10,000 Silver Arrow
идёт в восточным воротам Пронты на координаты "280 198"
разговаривает с кафрой
нажимает кнопку продолжить (talk cont)
выбирает хранилище (talk resp 1), оно открывается
кладёт в хранилище все Silver Arrow, кроме 1000 шт
закрывает хранилище (storage close)
возвращается на место где он был перед запуском макроса.

4epT
14.02.2007, 19:38
12. Синтаксис автомакроса (Часть 1)

Существует 2 схемы автомакроса:

1. Автомакрос, который вызывает отдельный макрос:
automacro foo {
<условие> <значение>
<условие> <значение1>, <значение2>
call <имя макроса>
}
2. Автомакрос, который содержит в себе тело макроса:
automacro mi {
<условие> <значение>
call {
do <команда>
do <команда>
}
}
Автомакрос - это макрос, который будет запущен тогда когда условия будут соответствовать заданным. (Например Вы настроили чтоб у Вас включался автомакрос при поднятие Jellopy. Допустим Вы убили поринга и из него выпал Jellopy. Если Вы поднимете Jellopy, то Ваш автомакрос запустится).
Далее АМ следует читать как автомакрос.

В тело АМ можно прописать выполнение следующих условий:

map <имя карты>
АМ запустится, когда Вы будете находиться на локации <имя карты>.

location [not] <имя карты> <x1> <y1> [<x2> <y2>] [, ...]
АМ запустится, когда Вы находитесь в (вне (not)) локации <имя карты>.
1. Если координаты <x1> <y1> и <x2> <y2> не заданы, то АМ будет запускаться, как и в случае "map <имя карты>".
2. Если указаны только координаты <x1> <y1>, то АМ запустится, если Вы, находясь на локации <имя карты>, попадёте на координаты <x1> <y1>.
3. Если указаны координаты <x1> <y1> и <x2> <y2>, то АМ запустится, если Вы, находясь на локации <имя карты>, попадёте в мнимый прямоугольник, где <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 <имя карты> | any [, ...]
АМ запустится, если Вы текущую локацию поменяли на <имя карты>. Если используется условие "mapchange any", то АМ будет запускаться при любом изменении локакци.
Отделённые запятыми аргументы определяются как условие OR (или).
У кого получится воспользоваться условием "mapchange any", отпишитесь, пожалуйста, а то у меня не получается.

hp <условие> <значение>[%]
АМ запустится, когда ваше HP будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение). Пусть у Вас всего 200 hp и у Вас отняли 40 hp, значит теперь Ваше абсолютное значение 160 hp а относительное 80% hp.
Несколько строк (от двух и более) определяются как условие AND (и).

sp <условие> <значение>[%]
Тоже самое, только по отношению к Вашему SP

spirit <условие> <значение>
АМ запустится, когда число сферок (у монка) будет удовлетворять <условие> <значение>.
Несколько строк (от двух и более) определяются как условие AND (и).

weight <условие> <значение>[%]
АМ запустится, когда Ваш вес будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение).
Несколько строк (от двух и более) определяются как условие AND (и).

cartweight <условие> <значение>[%]
АМ запустится, когда вес Вашей телеги будет удовлетворять <условие> <значение> (абсолютное значение) или <условие> <значение>% (процент) (относительное значение).
Несколько строк (от двух и более) определяются как условие AND (и).

zeny <условие> <значение>
АМ запустится, когда количество денег у Вас будет удовлетворять <условие> <значение>.
Несколько строк (от двух и более) определяются как условие AND (и).

soldout <условие> <количество слотов>
АМ запустится, когда количество проданных слотов в Вашем магазине будет удовлетворять <условие> <количество слотов>.
Несколько строк (от двух и более) определяются как условие AND (и).
Например у Вас в АМ прописано "soldout > 1". Пусть у Вас в магазине продаются 4 элу и 5 ори. АМ сработает тогда, когда у Вас купят все элу или все ори. Если у Вас купят 1 элу, то слот будет считаться не проданным и АМ не сработает.

status [not] <статус> [, ...]
АМ запустится, когда у Вас статус (нет статуса (not)) <статус>.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

inventory "<имя вещи>" <условие> <значение> [, ...]
АМ запустится, когда количество <имя вещи>, находящейся у Вас в инвентаре будет удовлетворять <условие> <значение>.
Отмечу, что<имя вещи> обязательно нужно писать в ""!
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

cart "<имя вещи>" <условие> <значение> [, ...]
АМ запустится, когда количество <имя вещи>, находящейся у Вас в телеге будет удовлетворять <условие> <значение>.
Отмечу, что<имя вещи> обязательно нужно писать в ""!
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

storage "<имя вещи>" <условие> <значение> [, ...]
АМ запустится, когда количество <имя вещи>, находящейся у Вас в кафре (хранилище) будет удовлетворять <условие> <значение>.
Отмечу, что<имя вещи> обязательно нужно писать в ""!
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

shop "<имя вещи>" <условие> <значение> [, ...]
АМ запустится, когда количество <имя вещи>, находящейся у Вас в магазине (открытом) будет удовлетворять <условие> <значение>.
Отмечу, что <имя вещи> обязательно нужно писать в ""!
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

base <условие> <уровень>
АМ запустится, когда Ваш базовый левл будет удовлетворять <условие> <уровень>.
Несколько строк (от двух и более) определяются как условие AND (и).

job <условие> <уровень>
АМ запустится, когда Ваш джоб левл будет удовлетворять <условие> <уровень>.
Несколько строк (от двух и более) определяются как условие AND (и).

class <профессия>
АМ запустится, если Ваша профессия: <профессия>.

spell <имя скила> [, ...]
АМ запустится, когда на Вас кто-нибудь будет кастовать <имя скила>.
Отделённые запятыми аргументы определяются как условие OR (или).

4epT
15.02.2007, 01:05
12. Синтаксис автомакроса (Часть 2)

monster <имя моба> [, ...]
АМ запустится, когда моб <имя моба> находится поблизости (в пределах видимости). Когда макрос вызван устанавливаются специальные переменные $.lastMonster и $.lastMonsterPos.
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

notMonster <список мобов>
АМ запустится, когда моб, находящийся возле Вас (в пределах видимости), не находится в <списке мобов>.
Имена мобов следует писать через запятую, соблюдая РеГиСтР.
Отделённые запятыми аргументы определяются как условие AND (и).

aggressives <условие> <число>
АМ запустится, когда число агрессивных монстров удовлетворяет условию: <условие> <число>.
Несколько строк (от двух и более) определяются как условие AND (и).

player <имя игрока> [, <число клеток>]
АМ запустится, если игрок <имя игрока> находится в пределах видимости или не дальше чем <число клеток>. В качестве имени можно использовать либо строго заданное: "4epT" (пишется в кавычках), либо шаблон: /4epT/ (пишется через слэш). Разничца в том, что на имя 4epTik первое условие не сработает (то что в кавычках), а второе сработает (т.е. слово 4epTik сожершит буквы 4epT)
Несколько строк (от двух и более) определяются как условие AND (и).

equipped [<слот>] <имя вещи> | none [, ...]
АМ запустится, когда <имя вещи> одето. Или не одето (none). Необязательно, но можно использовать <слот> (topHead, midHead, lowHead, leftHand, rightHand, robe, armor, shoes, leftAccessory, rightAccessory и arrow).
Отделённые запятыми аргументы определяются как условие OR (или).
Несколько строк (от двух и более) определяются как условие AND (и).

var <имя переменной> (unset | <условие> <значение>)
АМ запустится, если переменная <имя переменной> unset (не заданна) или удовлетворяет <условие> <значение>.
Несколько строк (от двух и более) определяются как условие AND(и).

varvar <имя вложенной переменной> (unset | <условие> <значение>)
АМ запустится, если вложенная переменная unset (не заданна) или удовлетворяет <условие> <значение>.
Несколько строк (от двух и более) определяются как условие AND(и).

console "<текст>" | /<набор символов>/[i]
АМ запустится, когда в консоле появится <текст> или если в консольном тексте сожержится символ (или слово) из <набор символов>.
<набор символов> нужно разделять знаком "|" (например console /kast|agi|bles/).
Параметр i (следует писать сразу после /<набор символов>/, без пробела) означает что <набор символов> становится нечувствительным к РеГиСтРу.
Устанавливается специальная переменная $.lastLogMsg.

Примеры:
1. Пусть в АМ есть строчка console "You are sitting.". Если в консоле набрать команду "sit", тот бот сядет и напишет "You are sitting." и АМ запустится.
2. Пусть в АМ есть строчка console /You/. Если в консольном тексте содержится слово "You", то АМ будет запускаться. Отмечу, что если бы бот писал "you are sitting.", то АМ бы не запустился.
3. Пусть в АМ есть строчка console /y/i. Если в консольном тексте содержится символ "y" или "Y", то АМ будет запускаться.
Следует различать консольный текст и текст чатов (приват, общий, пати, гилд). Т.е. если Вам в приват напишут сообщение, то оно появится у Вас в консоли, НО для OpenKore это сообщение не консольный текст!

pm ("<текст>" | /<набор символов>/[i]) [<имя игрока>]
АМ запустится, если в приватном сообщении появится <текст> или если полученный текст содержит символ(ы) из <набор символов>. Это условие можно установить для определённого игрока <имя игрока>. Параметр i означает что <набор символов> становится нечувствительным к РеГиСтРу.
Устанавливаются специальные переменные $.lastpm и $.lastpmMsg.

pubm "<текст>" | /<набор символов>/[i] [<число клеток>]
АМ запустится, если в общем чате появится <текст> или если полученный текст содержит символ(ы) из <набор символов>. Это условие можно установить для определённой дистанции (<число клеток>). Параметр i означает что <набор символов> становится нечувствительным к РеГиСтРу.
Устанавливаются специальные переменные $.lastpub и $.lastpubMsg.

party "<текст>" | /<набор символов>/[i]
АМ запустится, если в пати-чате появится <текст> или если полученный текст содержит символ(ы) из <набор символов>. Параметр i означает что <набор символов> становится нечувствительным к РеГиСтРу.
Устанавливаются специальные переменные $.lastparty и $.lastpartyMsg.

guild "<текст>" | /<набор символов>/[i]
АМ запустится, если в гилд-чате появится <текст> или если полученный текст содержит символ(ы) из <набор символов>. Параметр i означает что <набор символов> становится нечувствительным к РеГиСтРу.
Устанавливаются специальные переменные $.lastguild и $.lastguildMsg.

hook <hookname>
triggers when openkore calls <hookname>.
Без понятия что это. Если есть какие-то догадки, то пишите.

saveN <hash key>
(use in combination with hook)
Сохраняет значение <hash key> в переменные от .$hooksave1 до .$hooksaveN.
Без понятия что это. Если есть какие-то догадки, то пишите.

run-once 0 | 1
Если установлена "1", то АМ закроется, пока его не включат (см. команду release). Например, пусть АМ запускается, когда Ваш вес больше "1", т.е. он будет запускаться пока Вы находитесь в игре. OpenKore постоянно будет писать, что АМ запущен. Если Вы в тело АМ добавите строчку "run-once 1" (не важно в начале или в конце), то АМ выполнится 1 раз, после чего он "закроется".

overrideAI 0 | 1
Если установлена "1", то АМ будет игнорировать искусственный интеллект OpenKore. Т.е. АМ не будет использовать паузу при движении (“move”) и при смерти (”status death”).

delay <n>
АМ будет ждать <n> секунд, после чего продолжит свою работу.

timeout <n>
АМ будет ждать по крайней мере <n> секунд после чего перезапустится.
Это пригодится, если необходимо повторять какие-то действия периодически через определённый промежуток времени.

macro_delay <n>
Устанавливает macro_delay (задержку между командами макроса) в <n> секунд, игнорируя значение в файле timeouts.txt.

priority <номер>
Устанавливает приоритет АМ. АМ с меньшим номером запустится раньше. Если приоритет не установлен, то устанавливается "0".

exclusive 0 | 1
Если установлена "1", то этот АМ не может быть прерван другими АМ.

set <переменная> <значение>
Устанавливает <переменной> <значение>.
В одном АМ можно использовать несколько условий "set".

call <имя макроса>
Вызывает макрос <имя макроса>.

call {
<команда>
}
Выполняет <команду>. В одном блоке "call" можно использовать несколько команд.

orphan <метод>
Устанавливает метод для работы с одиночным макросам. См. macro_orphans.

4epT
15.02.2007, 01:07
13. Пример автомакроса

automacro autoloot {
console /You are now in the game/
call {
do c @autoloot 100
}
run-once 1
}
Когда бот подключается к серверу, то отправляет в консоль сообщение "You are now in the game". Условие "console /You are now in the game/" срабатывает и запускается автомакрос, т.е. выполняется команда "do c @autoloot 100" (тоже самое если в клиенте ввести "@autoloot 100"). Команда "@autoloot 100" поддерживается не на всех серверах!

4epT
15.02.2007, 01:11
14. Отладка[Внимание! Отладка была отключена в версии макро-плагина 2.0.1 (он для OpenKore версии 2.0.0 и выше)]

Отладка реализуется файлом cvsdebug.pm.
Добавьте macro_debug <уровень(ни)> в файл config.txt.
Существует следующие уровни отладки:

variable_trace - прослеживание переменных
command_preparsed - не анализирует командную строку
command_parsed - анализирует командную строку
parser_steps - анализирует шаги
function_call_macro - макро функции (маленький трафик)
function_call_auto - автомакро функции (большой трафик)
automacro_checks - автомакро проверка (большой трафик)
developers - полезные отладочные сообщения
full - полная отладка, все уровни
none - никаких сообщений отладки вообще.

Уровни отладки разделяются символом "|".
Пример:
macro_debug variable_trace|parser_steps
Чё это за отладка (как ей пользоваться) я так и не понил..

4epT
15.02.2007, 01:13
15. Ограничения


автомакрос проверяет console игнорируя следующие области: macro и cvsdebug.
не используйте закрывающие скобки ")" в ключевом слове аргумента, если эта закрывающая скобка не относится к самому аргументу.

Пример:
@random ("foo", "bar", "@eval (4 + 5)", "yatta") - разрешено
@random ("foo", "bar", ":-)", "yatta") - запрещено

4epT
17.04.2007, 00:46
16. Специальная переменная $.lastMatchN и регулярные выражения (regexp)

Рассмотрим работу переменной $.lastMatchN на следующем примере:
Допустим мы хотим уходить в хайд, когда вас пытаются азурить. Итак когда на вас используют азуру, то в консоли появляется строчка следующего типа:
Player 4epT (0) is casting Extremity Fist on you (time 920ms)
Азуру наносить на вас может не только игрок 4epT, поэтому чтобы скрываться ото всех арур нужно из этой строчки сделать шаблон.

"Player .* (0) is casting Extremity Fist on you (time 920ms)"
В языке Perl сочетание .* означает - любое число любых символов. Тем самым мы ушли от имени 4epT.

Как вы заметили, после имени игрока в нашем шаблоне находится (0) - это номер игрока (бот сам пронумеровывает игроков, по мере их появления в пределах видимости), т.е. один и тот же игрок в разное время может иметь разный номер. Поэтому этот шаблон не универсален. Он сработает только если игрок под номером 0 будет азурить вас.

В итоге получем шаблон:
"Player .* is casting Extremity Fist on you"
он читается как:
"Player любое кол-во символов is casting Extremity Fist on you"

Вернёмся к нашим яблокам, к специальной переменной $.lastMatchN.
Допустим мы хотим выцепить из этого шаблона имя игрока. Для этого заключим его в скобки:
"Player (.*) \(.*is casting Extremity Fist on you"
Тем самым мы присвоили переменной $.lastMatch1 значение .* (в нашем случае это будет имя игрока)
\( - это означет символ открывающейся скобки.

При составлении шаблонов можно использовать различные метасимволы и модификаторы (типо .*).
Памятка по регулярным выражениям (regexp) (http://rofan.ru/viewtopic.php?t=1302&start=0&postdays=0&postorder=asc&highlight=regexp)
незнаю есть ли смысл передирать её сюда..

Gans
09.07.2007, 13:10
Покрасьте меня в зеленый цвет, но я все равно не верю, что ОБЯЗАТЕЛЬНО дважды проверять одно и то же условие из-за того, что директива else недоступна! :mad:

if ($a == 1) goto one
if ($a != 1) goto two
:оne
$a = 0 goto end
:two
$a = 1
:endНа мой взгляд, оно должно быть таким:if (1 == $a) goto one
$a = 1
goto end
:оne
$a = 0
:end

Gans
09.07.2007, 13:12
аааа, я все понял, это просто безграмотно выдранный кусок из макроса, с таким началом:macro foo {
$i = @random ("1", "2", "3")
...Там, при обработке ТРЕХ условий, такая конструкция имеет право на жизнь. Но не в случае if...else!

...

А если мы манипулируем ДВУМЯ разными переменными в условии и присваивании, можно написать ЕЩЕ проще:

$b = 0
if (1 == $a) goto end
$b = 1
:end

4epT
09.07.2007, 13:41
Gans, ты шо свехнулся? :)
и при чём тут тичер?

Gans
09.07.2007, 13:48
чо, это твоё творчество? ;) ладно, тогда потру про него.

зы: ближе к телу, плз!

4epT
09.07.2007, 22:28
да это мой творчество, чё те тут не нравится? буду рад поспорить (исправить).
2 твоих примера в первом сообщении написаны безграмотно! а во втором сообщении 2 пример вообще не понятен..

Gans
10.07.2007, 00:10
"Ты... эээ... гонишь, сынок; мама - ЭТО Я!" (с) анигдод

Из четырех фрагметов кода первый - ТВОЙ из мануала.
Второй чем тебе не угодил?...
Третий, это просто заголовок, там ничего интересного.
Четвертый - а что с ним не так? В зависимости от содержимого переменной $a, переменной $b присваиваются разные значения. И чо тута непонятного? О_о

4epT
10.07.2007, 03:28
мда.. какая-то лажочка вышла.. кодга писал, я там спецом, чтоб понятнее было дописал, а щас сам не пойму чё зачушь :) это нада доработать ..

4epT
11.07.2007, 01:41
вродь подправил..

4epT
11.07.2007, 02:13
7. Операторы макроса

Macro плагин поддерживает только три оператора ("while", "if (...) + goto" и "goto"). Так как нет (видимой) нумерации строк, то Вы должны использовать метки которые определяются как:
:<имя метки>

Пример конструкции "while":
macro foo {
$i = 0
log the next lines will loop 11 times (0 .. 10)
while ($i <= 10) as exampleloop
log loop $i
$i++
end exampleloop
}

Пример конструкции "if" + "goto":

macro foo {
if ($i == 1) goto one
log i is two
goto end
:one
log i is one
:end
}
Отмечу, что метки оператора goto не могут содержать ничего кроме букв и цифр. Например: "warp_to_payon" писать неправильно, правильно писать так: warpToPayon.

Оператор if (...), можно использовать только с последующим оператором goto. Т.е. написать как в обычных языках программирования:
if ($a != 2) $a = 3 <- нельзя!
Необходимо реализовать следующим образом:
if ($a != 2) goto end
$a = 3
:end
В случае если необходимо пользоваться конструкцией вида:
if (...)
then (...)
else (...)

то в макросах это будет выглядеть так:
macro foo {
$i = @random ("1", "2", "3")
if ($i == 1) goto one
if ($i == 2) goto two
log i is three.
goto end
:one
log i is one
goto end
:two
log i is two
:end
}

Пример конструкции "goto":

macro foo {
$i = 1
:plus
$i++
log i = $i
goto plus
}

Gans
11.07.2007, 02:40
"Ох уж эти макросы. Ох уж эти макросники!"

Вызывает недоумение вот этот фрагмент:

if (...)
then (...)
else (...)

Может, чтобы не путатать юзера, лучше написать по-русски?

если (...)
тогда (...)
иначе (...)

?

И ваще, вот ЭТОТ фрагмент относится к вот ЭТОМУ макросу: (Пример конструкции "if" + "goto": )

А то, где у тебя написано, 1,2,3 - это не if-then-else, а простенькая реализация case (...).

Ну, и самый простой пример, вроде такого...

macro oyFoo {
if ($i <> 1) goto wrong
log correct, i contains 1
:wrong
}

...у тебя его нет. Может, так и надо, не знаю.

4epT
11.07.2007, 13:26
Если юзверь не запутается в if, then, else, то дальше ему читать не стоит, думаю ты со мной согласишься.

Так катит?

В случае если необходимо пользоваться конструкцией вида:
if (...)
then (...)
else (...)
то в макросах это будет выглядеть так:
macro foo {
$i = @random ("1", "2")
if ($i == 1) goto one
log i is two
goto end
:one
log i is one
goto end
:end
log tra-ta-ta
}


if (...)
then (...)
то в макросах это будет выглядеть так (проверяем условие равенста i=1, в макросах короче будет "от противного", т.е. проверить условие "i не равно 1"):
macro foo {
$i = @random ("1", "2")
if ($i != 1) goto end
log i is one
:end
log tra-ta-ta
}

Gans
11.07.2007, 21:34
Если юзверь не запутается в if, then, else, то дальше ему читать не стоит, думаю ты со мной согласишься.Я имел в виду лишь мелочь, то, что юзверь, увидев этот фгагмент, может вообразить существование команд then и else, только и всего.

Новые примеры... походу они еще бредовее старых. Лучше их не вводить. Раскраска логики - да, это выглядит неплохо.

4epT
12.07.2007, 00:12
почему бредовее? как раз показывают как составить 2 кончтрукции?

Gans
12.07.2007, 00:14
бредовые, потому што имхо так никто не пишет. ладно, не обращай внимания.

4epT
12.07.2007, 00:17
блин, а как пишут? я пытаюсь на доступном языке показать пример..

Gans
12.07.2007, 01:13
Всё, я зaткнулся. Сорри!
Если будет что-то по серьёзное, отпишусь, ну а спорить о мелочах резону нет.

Gans
12.07.2007, 01:17
Можно еще заметить, что с тех пор, как появились цепочки комманд, макросы вроде...

macro foo {
do move 123 234 prontera
do sit
do c "hello world"
}

...почти не имеют смысла.

Зачем они нужны, когда можно это сделать одной строкой?

move 123 234 prontera;;sit;;c "hello world"

Т.е.: смысл (и сила) макро появляется только если учавстуют специфические макросовский вещи - вроде условий, случайного принятия решения, пауз, запоминания координат, работы с переменными.

(Это тоже мелочь).

4epT
12.07.2007, 03:04
Gans, убрал на счёт "рун-онс/релиз" ;)

А эти нюбские макросы - это для примера типо..

кстати, цепочки команд действуют без задержки и сразу друг за другом, не дожидаясь пока выполнится предыдущая

Gans
12.07.2007, 11:33
Гррр, ну убрал и убрал.
А я-то cвой пост удалил, ты заметил?
Это потому, что какой-то шутник может рядом произнести эту фразу, и...

С другой стороны, а если оставить ран_онс/релиз,
сработает ли этот (изначальный) макрос (@autoloot) после команды relog?

Насчет цепочек, мда, пример с move возможно неудачен. Но всякое там лечение, и т.п. - идет на ура.

4epT
12.07.2007, 13:25
Насчет цепочек, мда, пример с move возможно неудачен. Но всякое там лечение, и т.п. - идет на ура.
Кстате, на счёт этого нада бы заметку начирикать

С другой стороны, а если оставить ран_онс/релиз,
сработает ли этот (изначальный) макрос (@autoloot) после команды relog?
На сколько я знаю после релога все "ран_онс" сбрасываются

4epT
13.07.2007, 01:37
Gans, в "doCommand" не все те условия срабатывания, что есть в макросах ;)

Gans
13.07.2007, 02:33
Gans, в "doCommand" не все те условия срабатывания, что есть в макросах ;)Это понятно, но взгляни-ка на историю написания плагина doCommand.
Кали пишет: "я задолбался трахацца с этими ненадежными триггерами на запуск макро, душа желала чего-то простого и понятного, и вот...".

"@eval (<аргумент(ы)>) Оценивает данный аргумент, ..."
может быть лучше "вычисляет выражение"?

@Inventory, @Cart, etc - возвращающие список - имею подозрение, что это для "афтарских" вещей (стрелы, бутылки, и т.п.), т.е. случай, когда несколько кучек стекируемых вещей с одинаковым названием могут лежать в одном месте. Надо проверить.

hook - вероятно, имеется в виду, что макросы можно подвешивать на хуки, которые обычно предназначены для плагинов.

4epT
13.07.2007, 13:13
@eval - нет это не вычисляет, а именно оценивает
@eval ($::players{$::playersID[$i]}->{jobID}) << что тут вычислять?

@Inventory, @Cart, etc - проверь, потомучто моим проверкам не поддаётся

hook - вероятно..

Gans
13.07.2007, 17:33
@eval ($::players{$::playersID[$i]}->{jobID}) << что тут вычислять?Если эта штука возвращает булев результат, можно сказать, что она что-то там оценивает.
Во всех остальных случаях - вычисляет.
$a="ccccc".$b."rrrr\n" - это тоже вычисление, хоть никаких цифр тут нет.

4epT
13.07.2007, 20:03
толковый словарь русского языка ушакова:
вычисление
1. посредством действий над числами найти искомое, высчитать.
2. результат этого действия, то, что получено посредством этого действия.

Малый энциклопедический словарь брокгауза и ефрона
вычисления, математ., выкладки, калькуляция, совокупность математических действий для составления расчетов, таблиц, применяемых как в научных работах, так и для практических целей; таковы таблицы астрономические, метеорологические, в различных областях статистики, в деле страхования, пенсионных касс. тарифов, арбитражей и тому подобн. задача означенного в.- составление таблиц, которые облегчили бы решение частного случая таким образом, чтобы простая справка в таблицах устраняла необходимость прибегать каждый раз к сложному вычислению.

толковый словарь русского языка ушакова:
оценить
1. определить стоимость чего-н., назначить определенную цену чему-н.
2. высказать то или иное мнение, суждение о ценности кого-чего-н., понять правильно значение, качество кого-чего-н

4epT
19.10.2007, 14:54
Внимание: если у вас в файле macros.txt содержится русский текст, то файл необходимо сохранить в кодировке utf-8.
С помошью Блокнота это можно сделать так:

Файл => Сохранить как... => кодировка: выбираешь utf-8 => сохраняешь документ...

Стандартный Виндузовский блокнот плохо сохраняет файлы в кодеровке UTF-8 (оставляет какие-то символы в начале файла), и при загрузке бот выдаст ошибку:
control\macros.txt: ignoring line 'automacro loot {' (munch, munch, strange block)
control\macros.txt: ignoring '}' (munch, munch, strange food)

Чтобы это исправить, нужно закомментировать первую строчку. Комментарий тоже нужно правельно написать:

#<пробел><любой текст>

Пример как правельно писать:
# macro
automacro loot {
***

4epT
06.05.2008, 20:36
открываем файл control\consolecolors.txt и дописываем там строчку:

[message]
macro yellow


Если ещё внимательно покапаться в этом файле, то можно узнать что существуют следующие цвета:
black, darkgrey, grey, white, red, darkred, yellow, brown, green, darkgreen, cyan, darkcyan, blue, darkblue, magenta, darkmagenta, default