Author Topic: Вопросы по скриптам  (Read 8335 times)

0 Members and 1 Guest are viewing this topic.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Вопросы по скриптам
« on: August 13, 2014, 02:35:05 PM »
Добрый день.
Что хочу получить знаю, но как это сделать в программе пока не совсем знаю.

Захожу в локацию:
Надо зарядить снаряжение (до 100%, но не всегда зарядка удачна). Т.е. должен быть цикл нажимания на кнопку "зарядка" пока не будет надпись "100%". Между нажатиями должна быть задержка 2-3 сек.
После зарядки (100%) идет ожидание до исчезновения надписи "Ожидание". Тут ожидание в 1-2 сек.
Нажимаем на босса.
Идет бой (ни на что мы не влияем).
После боя идет ремонт. В следующий бой можно войти после исчезновения надписи "В ремонте". После желательно ожидание в 1-2 сек (эти три строчки в цикле. может длиться 30 мин)
Бой заканчивается если при нажатии на босса появляется надпись, что он убит.

Ну как-то так. Подтолкните с циклами. И я думаю тут работа с картинками, типа пока есть определенная "надпись" или "картинка" ничего не делать.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: Вопросы по скриптам
« Reply #1 on: August 13, 2014, 08:32:48 PM »
Что, ни кто не может помочь ?  :(

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Вопросы по скриптам
« Reply #2 on: August 14, 2014, 12:53:07 AM »
100500 раз...

Code: (clickermann) [Select]
$check = 0
WHILE($check = 0) // ожидание 100%
   
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
      $check = 1
   ELSE
      LCLICK(10,10)
      WAIT(RND(2,3))
   END_IF   
   
END_CYC

Смысл тут в цикле с условием, пока переменная равна 0 цикл выполняется, но если функция найдет картинку то переменная изменится, цикл прервется и выполнение продолжится.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: Вопросы по скриптам
« Reply #3 on: August 14, 2014, 07:01:04 AM »
на чужих примерах не так понятно, тем более первый раз.
посмотрел я бот на Зомби, я в них не играл так что мне не понятен смысл.

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Вопросы по скриптам
« Reply #4 on: August 14, 2014, 12:25:42 PM »
Попробуем начать с конца. Разобьем задачу на несколько этапов, в каждом из которых выполняется как бы микро-сценарий. Это удобно записать используя подпрограммы.
Code: (clickermann) [Select]
Вход_в_локацию()
Зарядка_снаряжения()
Бой_с_боссом()

Вот вроде и всё, что требуется в задаче. :)
Теперь осталось только заполнить эти самые подпрограммы нужными командами. Например подпрограмма "Зарядка_снаряжения".
Code: (clickermann) [Select]
SUB(Зарядка_снаряжения) // Подпрограмма нажимания на кнопку "зарядка" пока не будет надпись "100%"

   $charge = 0 // Индикатор зарядки (0 - НЕ заряжено; 1 - заряжено)

   WHILE($charge = 0) // Цикл
      LCLICK(x,y) // Нажимаем на кнопку "зарядка" (впишите нужные значения x и y)
      WAITMS(100) // Небольшое ожидание (реакция игры на нажатие кнопки может быть не мгновенной)

      GETSCREEN // Захватываем изображение с экрана в буфер анализа Clickermann'а
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Заряжено.bmp", -1, 100) // Ищем в захваченном изображении картинку "Заряжено"
         $charge = 1 // Картинка "Заряжено" найдена (значение индикатора зарядки равное 1 позволит завершить цикл)
      ELSE
         WAITMS( RND(2,3) ) // Между нажатиями должна быть задержка 2-3 сек. (если картинка не найдена, цикл повторится)
      END_IF
   END_CYC
END_SUB

Это простейшее (слепое) выполнение определенного действия. В этом примере кликер будет кликать в координаты, в которых, предположительно, должна находиться кнопка "Зарядка". А вдруг ее там нет? Так кстати ставилась задача. Мне просто захотелось заострить на этом внимание. Но пока и так сойдет, а в дальнейшем, нужно будет заменить строку LCLICK(x,y) // Нажимаем на кнопку "зарядка" (строка №6) на цикл, в котором будет определяться есть ли на экране кнопка "Зарядка". И только в том случае, если такая кнопка есть, кликать по ней. Бот, который "видит", работает намного быстрее "слепого" тупого кликера, работающего на задержках (по принципу шарманки). Но ладно, пока не будем усложнять.
Еще один важный момент в постановке задачи...
Quote
После зарядки (100%) идет ожидание до исчезновения надписи "Ожидание".

Пробовать это запрограммировать в сценарии было бы ошибкой. Отслеживать то, что должно исчезнуть, нельзя. А вдруг оно и не появлялось? Отслеживать нужно только явные сигналы, которые появляются, а не исчезают. Это намного надежнее. Тут логичнее было бы отслеживать появление чего то, что следует за этим ожиданием и может послужить сигналом для выполнения следующих действий. Можно вставить в скрипт проверочные функции типа - "Если в течение 5 минут кнопка ''Зарядка'' не появилась, то делаем то-то и то-то".

Теперь соберем всё в один скрипт:
Code: (clickermann) [Select]
WAITMS(500)

//-------------------------------- Подпрограммы

SUB(Вход_в_локацию) // Подпрограмма входа в локацию
   LCLICK(x,y) // Клик куда то там, или как то иначе
END_SUB
//--------------------------------
SUB(Зарядка_снаряжения) // Подпрограмма нажимания на кнопку "зарядка" пока не будет надпись "100%"
   
   $charge = 0 // Индикатор зарядки (0 - НЕ заряжено; 1 - заряжено)
   
   WHILE($charge = 0) // Цикл
      LCLICK(x,y) // Нажимаем на кнопку "зарядка" (впишите нужные значения x и y)
      WAITMS(100) // Небольшое ожидание (реакция игры на нажатие кнопки может быть не мгновенной)
     
      GETSCREEN // Захватываем изображение с экрана в буфер анализа Clickermann'а
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Заряжено.bmp", -1, 100) // Ищем в захваченном изображении картинку "Заряжено"
         $charge = 1 // Картинка "Заряжено" найдена (значение индикатора зарядки равное 1 позволит завершить цикл)
      ELSE
         WAITMS( RND(2,3) ) // Между нажатиями должна быть задержка 2-3 сек. (если картинка не найдена, цикл повторится)
      END_IF
   END_CYC
END_SUB
//--------------------------------
SUB(Бой_с_боссом)
   // Нажимаем на босса.
   // Идет бой (ни на что мы не влияем).
   // Бой заканчивается если при нажатии на босса появляется надпись, что он убит.
   
   $boss_killed = 0 // 0 - НЕ убит; 1 - убит
   
   WHILE($boss_killed = 0)

      LCLICK(x,y) // Нажимаем на босса
      WAITMS(100)

      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Босс убит.bmp", -1, 100)
         $boss_killed = 1 // Картинка "Босс убит" найдена
         HALT // Остановка сценария (или другое действие)
      END_IF

      WAIT(1) // Частота нажатия на босса
   END_CYC
END_SUB

//-------------------------------- Понеслась!

start:

Вход_в_локацию()
Зарядка_снаряжения()
Бой_с_боссом()

GOTO(start) // Для повтора сценария (или другое действие)

Описания подпрограмм можно редактировать по отдельности, не нарушая структуру сценария.
Собственно выполнение сценария начинается с метки start: . Всё что выше этой метки Clickermann прочитывает один раз при запуске скрипта и держит в памяти.
А из готовых подпрограмм, вида Подпрограмма(), уже очень удобно складывать свою "музыку" как композитор из нот складывает свою. :)

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: Вопросы по скриптам
« Reply #5 on: August 14, 2014, 03:24:08 PM »
Спасибо, попробую.
А теперь ответы на неточности :)
Quote
А вдруг ее там нет?
она всегда на одном месте. кстати, если зарядка 100% то кнопка "зарядка" тускнеет.
Quote
Бот, который "видит", работает намного быстрее "слепого" тупого кликера
а что такого ему и как показать, чтоб он быстрее и точнее работал??
Quote
Тут логичнее было бы отслеживать появление чего то, что следует за этим ожиданием и может послужить сигналом для выполнения следующих действий
попробую внимательно посмотреть, что появляется.
Бои идут каждый день в одно и тоже время (можно сделать привязку по времени). Бой с босом надо зациклить так как после боя идет ремонт (горит надпись "Ремонт"), опять же после ее исчезновения (тоже посмотрю что происходит в этот момент) нужно кликать на боссе и опять в бой (и все это безобразие длится 25-30 минут). Вот такая заморочка :)
а если сделать картинку где кнопка "ремонт" исчезла, и пусть скрип ее ищет, а после исчезновения жмет в бой (ну хотя б на первое время). делаю для себя.
« Last Edit: August 14, 2014, 03:48:08 PM by AndreySanich »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопросы по скриптам
« Reply #6 on: August 14, 2014, 04:27:20 PM »
Всё нормально, после задержки жди пропадания картинки с кнопкой.
Пример Андрея, только наоборот.
Code: (clickermann) [Select]
    WAIT(1)
    $check = 0
    WHILE($check = 0)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
         WAIT(2)
      ELSE
         $check = 1
      END_IF       
    END_CYC


Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Вопросы по скриптам
« Reply #7 on: August 14, 2014, 07:57:39 PM »
Quote
она всегда на одном месте. кстати, если зарядка 100% то кнопка "зарядка" тускнеет.
Не могу спорить, что кнопка "зарядка" всегда находится в одних и тех же координатах на экране, но можно привести множество примеров когда она внезапно может быть закрыта другими окнами или разного рода всплывающими сообщениями. Например, Adobe Flash Player решил уведомить пользователя о релизе новой версии или антивирус вдруг начал требовать обновления. Может разорваться соединение с сервером, тогда кнопки совсем другие будут на экране. Наконец окно игры может быть свёрнуто. В таком случае бот поступит так - "если на экране ничего не видно, значит надо нажать кнопку", и будет прав, потому, что так его запрограммировали. Другими словами, если такому боту показать чистый несомненно Рабочий стол Windows, то он радостно начнет чего то там кликать эмитируя действия игрока в игре. Вот я о чем. Тут реч идет о надежности бота и о его способности реагировать на внештатные ситуации. Кто играет в онлайн игры наверняка видели и не раз, как кто то из игроков, во время боя, в чате начинает писать что то вроде "4b223m5j1h23" причем вперемешку с текстом своего сообщения и повторяет это несколько раз. Это значит, что он забыл выключить свой "глупый" авто-кликер, который тупо нажимает заданную последовательность клавиш и всё (просто циклично перебирает бинды атакующих способностей). Он не может определить, что игрок открыл строку ввода текста, которая и перехватывает нажатия клавиш. Пример конечно не совсем удачный, просто как пример внештатной ситуации. Короче случиться может всякое, и "умный" скрипт должен точно знать куда тыкает, или хотя бы не тыкать в неизвестность.
Вообще, о какой игре идет реч в этой теме я даже смутно не представляю, поэтому не могу посоветовать что то конкретное, только шаблоны.

Quote
а что такого ему и как показать, чтоб он быстрее и точнее работал??
Тут всё просто, объясню на своем примере. Может кто то в этом примере узнает самого себя и вспомнит свой пройденный путь в познании Clickermann'а. :)
Для своего первого "бота" Бот-1 (для игры WoW) я использовал функцию записи сценария Clickermann'а. Посмотрел на скрипт, узрел логику и отредактировал задержки между кликами вручную. Это было не так уж и просто, все задержки были тщательно выверены с учетом пинга до игрового сервера, так, что каким бы запоздалым не был отклик сервера, бот всеравно бы кликнул по нужным координатам когда нужная кнопка на экране уже прорисовалась! Он предусмотрительно прокликивал все места, в которых могли появляться всплывающие окна, чтобы закрыть их! Например приглашения в группу или гильдию могут прийти в любое время и помешать основной работе скрипта. И мой "умный" бот закрывал все эти окна, даже когда их и в помине небыло. :) Координаты для кликов мыши были выставлены вручную, точно в середину кнопок, так, что даже если изображение сместится на несколько пикселей, мой бот все равно попадет по кнопке на экране!  Я им гордился! :) Тогда мне всё это казалось очень важным и правильным.

А однажды настал день, когда я узнал, что Clickermann может распознавать изображение на экране... И мой бот стал видеть! Это был прорыв! Теперь он не бездействовал отсчитывая время до предполагаемого появления кнопок, теперь он больше не делал поправку в 30 секунд на возможную задержку отклика сервера. Теперь он в цикле отслеживал события в игре и мгновенно нажимал едва появляющуюся кнопку, как только цвета пикселей совпадали. Скорость стала просто космической! Он стал реагировать на события, перестал кликать в неизвестность, он стал "умным". Так появился Бот-2.

Бот-3 уже стал не только видеть, но и научился ориентироваться в пространстве и ходить по маршруту с высокой точностью. Он получил очень быстрый движок, который делит полный оборот персонажа вокруг своей оси в 360° на 108 секторов. Поворот на 1 сектор равен нажатию на кнопку поворота длительностью в 16 миллисекунд. Определяет на бегу куда смотрит персонаж по положению всего лишь одного пикселя на поле 9x12 (это в худшем случае) и сразу коррекция движения, очень быстро. Может бегать и прыгать в игре так, как не бегают боты, не рационально, как игрок, которому охота попрыгать и подурачиться (прописывается любой маршрут). Я его "вынашивал" в голове только несколько месяцев. В планах еще была защита от проверок на бота, тестировал опытные образцы, но так и не собрал все модули в одно целое, сменились интересы, забросил... Очень им горжусь на данном этапе своего развития. :)

Короче выбирать вам, либо делать Бота-1 или сразу Бота-2, т.е. сразу учить его реагировать на события в игре.
Еще пример навеяло, для тех кто в теме про игру WoW: :) Умный бот не будет стараться пробить бабл паладина оружием или магией, он увидит бабл, прекратит атаки и будет ждать пока бабл не спадет. Как ни крути а отслеживать графику придется.

Quote
Тут логичнее было бы отслеживать появление чего то, что следует за этим ожиданием и может послужить сигналом для выполнения следующих действий
Да, именно, бот должен отслеживать сигнал, который ему даст команду на выполнение какого то действия. Например, как игрок определяет, что можно атаковать босса? Видимо он попадает на какую то игровую площадку на которой сидит этот самый босс? Наверно там есть какие то характерные изображения, кнопки и т.д. Что то же служит сигналом для атаки? Это надо найти и заложить уникальное изображение в память бота, для сравнения с изображением на экране.
 
Вот, написал. :) Написал много, бестолково. Сорри если кого утомил. Может кому то это всё пригодится. :)

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: Вопросы по скриптам
« Reply #8 on: August 14, 2014, 09:18:36 PM »
Спасибо. нормально написал.
Я возможно сказать на стадии бот-1 - кликает туда где должны быть окна и клавиши. понимаю, что это не совсем хорошо, но возможно на более сложный вариант не хватит мозгов, так как с программированием и языками я не дружу.
По игре нет смены декораций после ремонта - только пропадает надпись и все.
Ну если не надоем то поможешь ?! Если можно то личными сообщениями.

blackhawk2k

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Вопросы по скриптам
« Reply #9 on: August 16, 2014, 12:29:03 AM »
AndreySanich
на каком сервере играешь в GL? :) у меня есть скрипт, сам писал, он конечно примитивный, но работает :) а и он для VIP5 и выше
« Last Edit: August 16, 2014, 12:30:35 AM by blackhawk2k »

Sania

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: Вопросы по скриптам
« Reply #10 on: January 29, 2017, 10:42:05 AM »

Теперь соберем всё в один скрипт:
Code: (clickermann) [Select]
WAITMS(500)

//-------------------------------- Подпрограммы

SUB(Вход_в_локацию) // Подпрограмма входа в локацию
   LCLICK(x,y) // Клик куда то там, или как то иначе
END_SUB
//--------------------------------
SUB(Зарядка_снаряжения) // Подпрограмма нажимания на кнопку "зарядка" пока не будет надпись "100%"
   
   $charge = 0 // Индикатор зарядки (0 - НЕ заряжено; 1 - заряжено)
   
   WHILE($charge = 0) // Цикл
      LCLICK(x,y) // Нажимаем на кнопку "зарядка" (впишите нужные значения x и y)
      WAITMS(100) // Небольшое ожидание (реакция игры на нажатие кнопки может быть не мгновенной)
     
      GETSCREEN // Захватываем изображение с экрана в буфер анализа Clickermann'а
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Заряжено.bmp", -1, 100) // Ищем в захваченном изображении картинку "Заряжено"
         $charge = 1 // Картинка "Заряжено" найдена (значение индикатора зарядки равное 1 позволит завершить цикл)
      ELSE
         WAITMS( RND(2,3) ) // Между нажатиями должна быть задержка 2-3 сек. (если картинка не найдена, цикл повторится)
      END_IF
   END_CYC
END_SUB
//--------------------------------
SUB(Бой_с_боссом)
   // Нажимаем на босса.
   // Идет бой (ни на что мы не влияем).
   // Бой заканчивается если при нажатии на босса появляется надпись, что он убит.
   
   $boss_killed = 0 // 0 - НЕ убит; 1 - убит
   
   WHILE($boss_killed = 0)

      LCLICK(x,y) // Нажимаем на босса
      WAITMS(100)

      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Босс убит.bmp", -1, 100)
         $boss_killed = 1 // Картинка "Босс убит" найдена
         HALT // Остановка сценария (или другое действие)
      END_IF

      WAIT(1) // Частота нажатия на босса
   END_CYC
END_SUB

//-------------------------------- Понеслась!

start:

Вход_в_локацию()
Зарядка_снаряжения()
Бой_с_боссом()

GOTO(start) // Для повтора сценария (или другое действие)

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

start:

Вход_в_локацию()
Зарядка_снаряжения()
Бой_с_боссом()



Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Вопросы по скриптам
« Reply #11 on: January 29, 2017, 10:51:19 AM »
Если в подпрограмме нет параметров то ничего просто ()
Там есть LCLICK(x,y) можно использовать переменные, а значения передавать в вызове.

Code: (clickermann) [Select]
WAITMS(500)

//-------------------------------- Подпрограммы

SUB(Вход_в_локацию, $x,$y) // Подпрограмма входа в локацию
   LCLICK($x,$y) // Клик куда то там, или как то иначе
END_SUB
//--------------------------------
SUB(Зарядка_снаряжения, $x,$y) // Подпрограмма нажимания на кнопку "зарядка" пока не будет надпись "100%"
   
   $charge = 0 // Индикатор зарядки (0 - НЕ заряжено; 1 - заряжено)
   
   WHILE($charge = 0) // Цикл
      LCLICK($x,$y) // Нажимаем на кнопку "зарядка" (впишите нужные значения x и y)
      WAITMS(100) // Небольшое ожидание (реакция игры на нажатие кнопки может быть не мгновенной)
     
      GETSCREEN // Захватываем изображение с экрана в буфер анализа Clickermann'а
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Заряжено.bmp", -1, 100) // Ищем в захваченном изображении картинку "Заряжено"
         $charge = 1 // Картинка "Заряжено" найдена (значение индикатора зарядки равное 1 позволит завершить цикл)
      ELSE
         WAITMS( RND(2,3) ) // Между нажатиями должна быть задержка 2-3 сек. (если картинка не найдена, цикл повторится)
      END_IF
   END_CYC
END_SUB
//--------------------------------
SUB(Бой_с_боссом, $x,$y)
   // Нажимаем на босса.
   // Идет бой (ни на что мы не влияем).
   // Бой заканчивается если при нажатии на босса появляется надпись, что он убит.
   
   $boss_killed = 0 // 0 - НЕ убит; 1 - убит
   
   WHILE($boss_killed = 0)
     
      LCLICK($x,$y) // Нажимаем на босса
      WAITMS(100)
     
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Босс убит.bmp", -1, 100)
         $boss_killed = 1 // Картинка "Босс убит" найдена
         HALT // Остановка сценария (или другое действие)
      END_IF
     
      WAIT(1) // Частота нажатия на босса
   END_CYC
END_SUB

//-------------------------------- Понеслась!

start:

Вход_в_локацию(100,100) // координата
Зарядка_снаряжения(100,100)
Бой_с_боссом(100,100)

GOTO(start) // Для повтора сценария (или другое действие)

Sania

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: Вопросы по скриптам
« Reply #12 on: January 29, 2017, 11:06:34 AM »
агаааа,понял,спасибо)))