PDA

Просмотр полной версии : Макрос: Автоматическая продажа варпов


4epT
28.05.2008, 19:21
Во первых всё нагло содрано отсюда (https://ro-fan.ru/viewtopic.php?t=5247), за что огромное спасибо Kissa2k.

Итак, мы решили написать макро для продажи варпов. Скажем так не самый лучший способ быстро получить много зеней, но это интересно, не правда ли?
Начнём, в этой теме я расскажу о своём макро и о том как на его можно модифицировать. Итак, настраиваем control/config.txt:
#Координаты где будет стоять наш продавец
lockMap prontera
lockMap_x 95
lockMap_y 65
#Для работы макро нужно выставить так
dealAuto 0
#и так
sitAuto_idle 0
Настройка config.txt закончена, теперь для работы моего макро нам понадобиться сделать небольшой хак исходников openkore:

1. Открываем файл src/Network/Receive.pm с помощью редактора Notepad++ или на худой конец Word Pad'ом (но не блокнотом, это важно)

2. Ищем там строчку:
my $amount = formatNumber($args->{amount});
и меняем её на такую
my $amount = $args->{amount};

3. Сохраняем. Готово!

Теперь сам макрос:
#Продажа варпа за деньги.
automacro createChatFirst {
console /Your Coordinates: /
location prontera 95 65 #Тут те же координаты что и в директиве lockMap в config.txt
delay 5
call {
do chat create "Айс - 5k" 2 0 pa55w0rd #Название и пароль чата
}
}
automacro createChatAfterWarp {
console /You opened Warp Portal on/
delay 5
call {
do chat create "Айс - 5k" 2 0 pa55w0rd #Название и пароль чата
}
}

automacro detectDeal {
console /Requests a Deal/
location prontera 95 65 #Тут те же координаты что и в директиве lockMap в config.txt
timeout 15
call acceptDeal
}

automacro detectZeny {
console /added (\d+) z to Deal/
timeout 15
call checkZeny
}

automacro detectFailedWarp {
console /(Casting failed: Requirement|Skill Warp Portal failed)/
call warp
}

macro acceptDeal {
pause @random ("0", "1", "2")
do deal
do deal
}

macro checkZeny {
if ($.lastMatch1 >= 5000) goto sell #Сколько зеней просим за варп?
do deal no
stop
:sell
pause 2
do deal
do chat leave
call warp

}

macro warp {
$x = @eval($::char->{pos}{x})
$y = @eval($::char->{pos}{y})
do deal
do sl 27 @eval($x + @random ("-2", "-1", "1", "2")) @eval($y + @random ("-2", "-1", "0", "1", "2"))
pause 2
do warp 1 #Номер варпа, который мы будем открывать.
}

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

Что-то стоит добавить:
- проверку на гемстоны
- автоматический сбор гемстонов из хранилища кафры
- сделать возможность продажи нескольких варпов одновременно.

Кстате найдено несколько багов:
1. Если запросить сделку у бота и тут же ее отменить, а потом сразу же еще раз кинуть то бот залипнет, из-за таймаута на обработку события предложения сделки.. т.е. если еще раз кинуть ему сделку, то мы увидим что якобы персонаж уже занят сделкой..
С другой стороны без таймаута нельзя, так как сделку могут кинуть тогда когда он уже открывает варп, т.е. тоже угроза залипания.. Хелп плз

2. Если боту флудить в приват сообщениями вроде "Requests a Deal", то он тоже будет залипать, так как сработает условие console //... как сделать так чтобы автомакрос запускался только при виде сообщения в консоли, а не скажем в паблик или приват чате? Плз, хелп


за обновлениями и дополнениями следить тут (http://rofan.ru/viewtopic.php?t=5247)

masterspirta
29.05.2008, 10:50
automacro detectDeal {
console /Requests a Deal/
location prontera 95 65
timeout 15
run-once 1
call acceptDeal
}
macro acceptDeal {
pause @random ("0", "1", "2")
do deal
do deal
release detectDeal
}

Теоретически проблема
1. Если запросить сделку у бота и тут же ее отменить, а потом сразу же еще раз кинуть то бот залипнет, из-за таймаута на обработку события предложения сделки.. т.е. если еще раз кинуть ему сделку, то мы увидим что якобы персонаж уже занят сделкой..
С другой стороны без таймаута нельзя, так как сделку могут кинуть тогда когда он уже открывает варп, т.е. тоже угроза залипания.. Хелп плз
решается с помощью run-once 1, эта опция не дас сработать АМ предложения сделки до тех пор пока работа макроса не будет завершина)
-------------------------------------------------
2. Если боту флудить в приват сообщениями вроде "Requests a Deal", то он тоже будет залипать, так как сработает условие console //... как сделать так чтобы автомакрос запускался только при виде сообщения в консоли, а не скажем в паблик или приват чате? Плз, хелп

Предлагаю тут вот какое решение проблемы....создать еще один автомакрос с большим приоритетом чем detectDeal, условием срабатывание которого будет
pubm /Requests a Deal/

--> в итоге если какой то сраный флудер с мозгами на опе начнет нам палки в колеса вставлять, в от вет можна будет пустить ему смайл дули!
------------------------------------------------
по поводу этого
- сделать возможность продажи нескольких варпов одновременно.
Фак мой мозг если оно у вас будет работать как часики!
ну а...
- проверку на гемстоны
- автоматический сбор гемстонов из хранилища кафры
кнешно нужно, и не тяжко...так что думаю каждый сам себе до пишет
------------------------------------------------
У меня вопрос
1. Открываем файл src/Network/Receive.pm с помощью редактора Notepad++ или на худой конец Word Pad'ом (но не блокнотом, это важно)

2. Ищем там строчку:
Цитата:
my $amount = formatNumber($args->{amount});
и меняем её на такую
Цитата:
my $amount = $args->{amount};
Зачем, для чего, почему не блокнотом, что означают переменные!

vitt
29.05.2008, 14:06
Зачем, для чего, почему не блокнотом, что означают переменные!
Не блокнотом, так как это хреновый редактор, и он хреново сохраняет файлы(например известный глюк с utf8, когда надо в начале файла несколько строчек закомментить).
А изменение для того, чтобы выводилось просто число, а не число, разделённое запятыми, т. е. 5000000 а не 5,000,000.

B@R@B@SHK@
11.06.2008, 17:39
Помогите*bravo* Я настраиваю все правильно, макрос прописываю и конфиги. Но когда бот в игре, он стоит на правильных координатах но чат не ставит и ничего не прадает. Помогите что за вата.:stop:

B@R@B@SHK@
11.06.2008, 19:37
Теперь я в конфиге прописал Uself_skill Warp и так далее. Но когда бот заходит в игру он начинает повсюду раскидывать варпы. А чат не ставит, помогите:)
Вот ошибка:

vitt
13.06.2008, 19:34
Теперь я в конфиге прописал Uself_skill Warp
Молодец, но такого в инструкции нету xD

B@R@B@SHK@
14.06.2008, 18:58
Молодец, но такого в инструкции нету xD

Хм=)):)) Ну как тогда, я вот на форуме рофана скопировал конфигу он вроде чат ставит, но дил кидаешь он нифига, пишет что зен мало:p

Добавлено через 9 часов 7 минут 58 секунд
Всё разобрался=)) Макрос клевый, за день вчера заработал 400к:) Осталось тока с 1 разобратся, как сделать чтоб бот послесмерти на кафру не улетал=-o

ranche
13.04.2009, 00:58
блин у мну он деюшку берет а варп не открывает скажите плз чё дописать надо чтоб открывал? говорит якобы скил варп непрально прописан я в макросах не силёно но как не вертел все равно не полуилось((((((

4epT
13.04.2009, 02:19
а по конкретнее, что пишет? желательно лог консоли

ranche
21.04.2009, 18:25
macro warp {
$x = @eval($::char->{pos}{x})
$y = @eval($::char->{pos}{y})
do deal
do sl 27 @eval($x + @random ("-2", "-1", "1", "2")) @eval($y + @random ("-2", "-1", "0", "1", "2"))
pause 2
do warp 1

здесь проблема я думаю, сорь но лог выложить немогу(

Добавлено через 2 минуты
Syntax error in function 'sl' (Use Skill on Location)
Usage: sl <skill #> <x> <y> [level
вот лог на рофане такаяже проблема у ребят была но там глухо чегот((
p.s если не затруднит можеш пжалуйста рабочий кинуть

CERBER
28.05.2009, 11:10
automacro createChatFirst {
console /Your Coordinates:/
delay 5
call {
if (@config(warp_payed) == 1) goto openWarp
do chat create "МСК 5k ЭЙН 7к АЙС 8к~(дил)" 2 0 pa55w0rd
pause @random (0, 1)
do sit
stop
:openWarp
call chooseWarp
}
}

automacro createChatAfterWarp {
console /You opened Warp Portal on/
call {
do conf warp_payed 0
pause 5
do chat create "МСК 5k ЭЙН 7к АЙС 8к~(дил)" 2 0 pa55w0rd
pause @random (0, 1)
do sit
}
}

automacro detectDeal {
console /Requests a Deal/
timeout 15
call {
pause @random (2, 3)
do deal
do deal
}
}

automacro rejectLongDeal {
console /You finalized the Deal/
delay 15
call {
do deal no
}
}
automacro detectZeny {
console /added (\d+) z to Deal/
timeout 15
call {
if (@config(warp_price1) >= @config(warp_price2)) goto firstCheck
$min = @config(warp_price1)
goto firstCheckFinish
:firstCheck
$min = @config(warp_price2)
:firstCheckFinish
if ($min >= @config(warp_price2)) goto secondCheck
goto secondCheckFinish
:secondCheck
$min = @config(warp_price3)
:secondCheckFinish

if ($.lastMatch1 >= $min ) goto accept
pause 2
do deal no
stop
:accept
pause 2
do deal

}
}
automacro checkZeny {
console /^You gained (\d+) zeny./
call {
if ($.lastMatch1 >=8000 @config(warp_price3)) goto warpdest3
if ($.lastMatch1 >=5000 @config(warp_price2)) goto warpdest2
if ($.lastMatch1 >=7000 @config(warp_price1)) goto warpdest1
do deal no
stop
:warpdest3
do conf warp_dest 3
goto end
:warpdest2
do conf warp_dest 2
goto end
:warpdest1
do conf warp_dest 1
:end
do conf warp_payed 1
pause @rand(1,2)
do chat leave
call chooseWarp
}
}

automacro detectFailedWarp {
console /(Casting failed: Requirement|Skill Warp Portal failed)/
call chooseWarp
}

macro chooseWarp{
do stand
pause @rand(0, 1)
$x = @eval($::char->{pos}{x})
$y = @eval($::char->{pos}{y})
do sl 27 @eval($x + @random ("-2", "-1", "1", "2")) @eval($y + @random ("-2", "-1", "0", "1", "2"))
log делаем варп
if ( @config(warp_dest) == 1 ) goto warpdest1
if ( @config(warp_dest) == 2 ) goto warpdest2
if ( @config(warp_dest) == 3 ) goto warpdest3
:warpdest3
pause @rand(1,2)
do warp 1

:warpdest2
pause @rand(1,2)
do warp 2

:warpdest1
pause @rand(1,2)
do warp 3

:end
}
В config всё правильно. Мой бот берет деньги но не телепортирует вчём проблема?:(

4epT
28.05.2009, 19:00
а ты тут пипец какие телепаты...

masterspirta
01.06.2009, 16:25
Делай как я когда есть куча функций или макросов в данном случаи, и он работает некоректно но нет ошибок. То бери поэтапно проверяй роботу макроса с помощью вывода в консоль инфы про выполненую операцию
//do console запусчен автотрактор checkZeny
//do console полученно lastMatch1 бабла
//do console выполнено условие lastMatch1 >=8000
//do console запущен макрос chooseWarp
и тдалие....
Знание того что все твои переменные принимают правильные значения и функции коректно обработывают оные, всегда облегчает задачу поиска пропущенной буквы или запетой в толстых скриптах...
И ваще написание чото подобного или сложнее нужно сразу так и делать для того что бы видеть сразу в каком месте проблемка...