UoKit.com Форумы > Кликер > UO Pilot > UO Pilot в онлайн играх
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
dimоn
Добрался, наконец-то, все никак руки не доходили...
В общем, появилось немного свободного времени, задался вопросом написания бота, самого обычного, для поиска, выноса мобов и разбора...
Пошарил поиск, видел несколько незаконченных тем, но решил создать новую, потому что работает немного по другой структуре.
Хотелось бы выразить благодарность DarkMaster'у Все-таки, не каждый человек, будет сидеть на каком-то форуме, что бы помочь народу с написанием какой-то, нужной им, лабуды, с целью их умственного развития...
Честно скажу, времени ушло много, но в основном это зависело от наличия свободного и в тот или иной момент, желания.

Не обошлось и без блок-схемы.
Только так смог собрать все посещающие голову мысли в единое целое.



Итак, значит бот построен по следующей структуре:




Блок поиска и нападения - это все индивидуально, в зависимости от хар-к и направленности.
Блок дропа, соответственно, от блока поиска, то есть от задач.
Хотелось бы разобрать блок боя.

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

Исходный код
set #h workwindow
set workwindow #h
:boy
while_not (1147, 456 72864) or (1154, 454 778406)


while_not 840, 204 936748

wait 2000
if 1190, 474 2249471
goto boy_okonchen
end_if
end_while

if 658, 214 16763649

if (731, 612 16777215 ) or ( 782, 612 16711665 )
if 731, 612 16777215

left 728, 615
wait 1000 + random (2500)
set #x 841 + random (210)
set #y 263 + random (200)
left #x #y
goto boy
end_if
if 782, 612 16711665

left 784, 613
wait 1000 + random (2500)
set #x 841 + random (210)
set #y 263 + random (200)
left #x #y
goto boy
end_if
else
if_not (733, 607 15592941) and ( 787, 615 8928750)
start_script 2
stop_script
end_if
end_if
else
if 989, 616 7484429

wait 1000
left 1007, 616
wait 1000
left 919, 644
wait 1000
else
start_script 2
stop_script
end_if


end_if


end_while
:boy_okonchen

If 1175, 455 92751


left 964, 516
wait 3500
left 788, 515
wait 1500
left 1000, 530
wait 1000
goto boy
end_if


start_script 3
pause_script
resume_script 0

stop_script


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

Следующей задачей был алгоритм хода, на случай, если ни квадрата, ни креста нет.
На самом деле, не придумал ничего проще, чем сходить по подсказке...

Исходный код
// (межстрочный интервал 10)
set #h workwindow
set workwindow #h

while_not #x1 > 0

set $l findimage (792, 210 1094, 517 (\image\стрелки\лево.bmp)%lv 2 20 1 5)
if ($l > 0)
set #x1 %lv[1 1]
set #y1 %lv[1 2]
set #x2 #x1 + 40
set #y2 #y1
end_if

set $v findimage (792, 210 1094, 517 (\image\стрелки\верх.bmp)%up 2 21 1 5)
if ($v > 0)
set #x1 %up[1 1]
set #y1 %up[1 2]
set #x2 #x1
set #y2 #y1 + 40
end_if
if_not 840, 204 936748
goto end
end_if
end_while

wait 1000
left #x1 #y1
wait 1000 + random (1500)
left #x2 #y2
left #x2 #y2
wait 1500

:end

start_script 1
stop_script


Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла

Долго мучался со стрелками, их вращением и считыванием именно той, которой нужно.
Так вроде работает.
Скрипт_0 - поиск, нападение, 1 - бой, 2 - ход, 3 - дроп, разбор, с него уходим "resume_script 1"

Народ, скрипт сырой, если появятся какие-то правки, замечания, изменения, не будьте единоличниками, выкладывайте.

Так же, выкладываю все на безвозмездной основе, попытки продать, как бота - это, как минимум свинство и того не стоит.

Что не понравилось, с сохранением у пилота, какая-то беда, и в настройках указал, сохранять при выходе: то, писал что-то, возьмет, не сохранит, то возьмет заменит чем-нибудь.. В общем беда.
Так же не понравилось и добавило объема - в пилоте, почему то, нет ф-ции отрицания... т.е. есть if_not, while_not, но нет not_and, not_or и пр. а это дополнительные проверки...
По крайней мере не нашел ни описания, к ним, ни синтаксиса.
Вверх
DarkMaster
Цитата
not_and, not_or и пр. а это дополнительные проверки...

это я так понимаю подразумевается отрицание условия? В нормальном виде это должно было бы выглядеть примерно так:
Код
if (1 > 2) and !(3 > 4)

истинность второго выражения при этом должна была бы измениться на противоположность, в пилоте этого действительно не хватает.

Просьба выложить скрипт в виде кода под спойлером. Шанс того, что аттач отвалится намного выше, чем пост умрет.
Вверх
dimоn
Цитата(DarkMaster @ 10.2.2015, 18:09)


Код
 !(3 > 4)

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


Да, именно про это!

Цитата(DarkMaster @ 10.2.2015, 18:09)

Просьба выложить скрипт в виде кода под спойлером. Шанс того, что аттач отвалится намного выше, чем пост умрет.

Сделал.
Вверх
dimоn
Тишина, гробовая.. Навязывается вопрос, это вообще кому-нибудь интересно?

Переделал блок хода. Работает, практически без промашек..
Код
// межстрочный интервал - к минимуму
set #h workwindow    
set workwindow #h

while_not ((($V > 0) xor ($l > 0)) and (#x1 > 0)) or  ($kv > 0) or ($kr > 0) or ($d <= 0)  

set $v findimage (792, 210 1094, 517  (\verkh.bmp)%up 2 21 1 5)
set $v1 findimage (792, 210 1094, 517  (\verkh1.bmp)%up1 2 20 1 5)
set $l findimage (792, 210 1094, 517   (\levo.bmp)%lv 2 21 1 5)
set $l1 findimage (792, 210 1094, 517   (\levo1.bmp)%lv1 2 20 1 5)

  if ($v > 0)  or ($vl > 0)
   if_not ($l > 0)  or ($l1 > 0)
     if $v >. 0
   set #x1 %up[1 1]
   set #y1 %up[1 2]
   set #x2 #x1
   set #y2 #y1 + 40
     else
   set #x1 %up1[1 1]
   set #x1 #x1 + 15
   set #y1 %up1[1 2]
   set #x2 #x1
   set #y2 #y1 + 40
      end_if
   end_if
  end_if  
  
  if ($l > 0)  or ($l1 > 0)
   if_not ($v > 0) or ($v1 > 0)
      if $l > 0
   set #x1 %lv[1 1]
   set #y1 %lv[1 2]
   set #x2 #x1 + 40
   set #y2 #y1
      else
   set #x1 %lv1[1 1]
   set #y1 %lv1[1 2]
   set #y1 #y1 + 15
   set #x2 #x1 + 40
   set #y2 #y1
      end_if
   end_if
  end_if
  
set $d findimage (716, 156 920, 330    (\ход.bmp)%p 2 90 1 5)
set $kv findimage (598, 548 968, 710     (\квадрат.bmp)%p 2 90 1 5)  
set $kr findimage (598, 548 968, 710     (\крест.bmp)%p 2 90 1 5)  

end_while

  if (#x1 > 0)
     wait 1000
     left #x1 #y1
     wait 1000  + random (1500)
     left #x2 #y2
     left #x2 #y2
     wait 1500
   end_if

start_script  1
stop_script


основной блок тоже немного видоизменился, но еще оттестирован. Кому интересно, попозже тоже могу выкинуть...
Вверх
cirus
Цитата
Навязывается вопрос, это вообще кому-нибудь интересно?

Может кому-то и пригодится когда-нибудь.
Цитата
if $v >. 0

Точка явно лишняя.
Вверх
DarkMaster
Цитата
Навязывается вопрос, это вообще кому-нибудь интересно?

Пилот скачивают сотни тысяч раз. Сколько людей при этом пишет? На форуме достаточно много людей, которые просто читают и берут необходимый код. Я сам так года два сидел. По небесам и лички мне прилетали. Так что кому-то точно было нужно
Вверх
dimоn
Цитата(cirus @ 10.4.2015, 2:45)

Точка явно лишняя.

Почему? Что в ней не так?
Вверх
dimоn
Цитата(dimоn @ 10.4.2015, 11:09)

Почему? Что в ней не так?


А, я понял..

Нет, она не лишняя. Косяк во вращении стрелок. В какой момент скрин их поймает неизвестно, поэтому на проверку сделал по две картинки одного и две другого и условие со строгим или.
Так вот, если поймает не тот поиск, то дергать из массивов координаты будет проблемно, большая вероятность холостого тыка, а если вообще не поступят, скрипт может и слететь. То есть потеряет смысл.

Или это не к той строчке?
Вверх
cirus
Так смысл точки в условии в чём?
Код
if $v >. 0
if $v > 0     //так не будет работать что ли?

Вверх
dimоn
Не знаю, куда написать, тему создавать, смысла, особо, не вижу, если что перенесите месседж...
Подскажите, а никак нельзя, к примеру в команде findimage, за один прострел проверить две картинки?
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.