Author Topic: Оптимизация  (Read 2111 times)

0 Members and 2 Guests are viewing this topic.

Denis

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Оптимизация
« on: March 09, 2015, 10:48:57 PM »
Доброго времени суток всем.
Есть такой вот скриптик:
Code: [Select]
#MAG

thread(rage,0)
   waitms(800)
   getscreen
   colormode(5,120,61,179,79)
   if_pixel_in(120,61,179,79,4161343)
      SETTHREAD (bot, 1)
      waitms(200)
      SETTHREAD (rage, 0)
   else
      getscreen
      if_pixel_in(1023,88,1024,88,1124919)
         wait(1)
         keypress(#7)
         waitms(200)
         keydown(#alt)
         keypress(#8)
         keyup(#alt)
         waitms(2000)
         keypress(#9)
         waitms(300)
         keypress(#F)
         wait(10)
      else
         keypress(#0)
         waitms(50)
         keypress(#3)
      end_if
   end_if
END_THREAD

THREAD(low, 0)
   waitms(500)
   getscreen
   colormode(5,5,128,38,226)
   if_pixel_in(5,128,38,226,2039679)
      SETTHREAD (bot, 0)
      waitms(200)
      SETTHREAD (rage, 1)
      waitms(200)
      SETTHREAD (low, 0)
   end_if
   waitms(500)
   getscreen
   colormode(5,130,61,179,79)
   if_pixel_in(130,61,179,79,4161343)
      SETTHREAD (low, 0)
   end_if
END_THREAD

THREAD(bot, 1)
   wait(1)
   $time=0
   $time2=0
   $time3=0
   
start:
   
   GETSCREEN  //áàô
   IF_PICTURE_IN (10,91,310,126,"buf.bmp",1,80)
   else
      IF (($_time_t-$time)>45)
         KEYPRESS(#9)
         $time=$_time_t
         wait(2)
      end_if
   end_if
   
   GETSCREEN  //áàô
   IF_PICTURE_IN (10,91,310,126,"buf2.bmp",1,85)
   else
      KEYPRESS(#6)
      wait(2)
   end_if
   
   GETSCREEN  //áàô
   IF_PICTURE_IN (10,91,310,126,"buf3.bmp",1,80)
   else
      keydown(#alt)
      KEYPRESS(#N)
      keyup(#alt)
      wait(1)
   end_if
   
   GETSCREEN  // ìàíà ðåãåí
   IF_PIXEL_IN (60,89,67,89,1124919)
      wait(1)
      goto(check)
   end_if
   
   GETSCREEN  // hp ðåãåí
   IF_PIXEL_IN (260,66,266,66,1124919)
      IF (($_time_t-$time3)>10)
         KEYPRESS(#7)
         $time3=$_time_t
         waitms(500)
      end_if
      waitms(500)
      keydown(#alt)
      keypress(#8)
      keyup(#alt)
      waitms(2000)
      goto(check)
   end_if
   
   GETSCREEN  // hp ðåãåí
   IF_PIXEL_IN (260,66,266,66,1124919)
      wait(1)
      goto(check)
   end_if
   
   turn:
   waitms(200)
   GETSCREEN
   IF_PIXEL_IN (877,66,887,67,1908102)
      keyup(#a)
      waitms(2000)
   else
      KEYDOWN(#a)
      waitms(200)
      KEYPRESS(#4)
      goto(turn)
   end_if
   
   agr:
   KEYPRESS(#2)
   waitms(rnd(200,300))
   KEYPRESS(#3)
   waitms(rnd(1200,1400))
   KEYPRESS(#3)
   waitms(rnd(200,400))
   KEYPRESS(#3)
   waitms(rnd(200,400))
     
   fight:
   waitms(100)
   GETSCREEN
   IF_PIXEL_IN (127,67,128,67,1124919)
      SETTHREAD (low, 1)
   end_if
   waitms(100)
   GETSCREEN
   IF_PIXEL_IN (845,87,849,87,12274992)
   waitms(100)
      GETSCREEN
      IF_PIXEL_IN (845,66,847,67,1908102)
         KEYPRESS(#3)
         waitms(rnd(100,200))
         GETSCREEN
         IF_PIXEL_IN (190,67,192,67,1124919)
            IF (($_time_t-$time2)>36)
               waitms(rnd(400,500))
               KEYPRESS(#5)
               waitms(900)
               KEYPRESS(#B)
               $time2=$_time_t
            end_if
         END_IF
      else
         KEYPRESS(#1)
         waitms(500)
         KEYPRESS(70)
      END_IF
      goto(fight)
   END_IF
   
   waitms(rnd(400,600))
   
   KEYPRESS(70)
   goto(start)
   
   check:
   GETSCREEN
   IF_PIXEL_IN (845,87,849,87,12274992)
      KEYPRESS(#0)
      waitms(rnd(100,200))
      KEYPRESS(#2)
      waitms(rnd(100,200))
      goto(fight)
   END_IF
   goto(start)
   
END_THREAD

Все работает вроде. Но проблема в том, что изначально он состоял из 10 строчек, а по мере роста так скажем моих навыков и желаний подрос до такого вот состояния. Теперь при воспроизведении скрипта идут подлагивания, учитывая, что он работает на виртуалке VMware. Можно ли его как-то оптимизировать?

Еще один момент. Выше изложенный скрипт представляет собой бота, стоящего на месте. Крутится вокруг себя и убивает всех в радиусе действия скилов. Изначально было желание накатать бота, который сможет двигаться, но моих способностей для этого не хватало. Пошерстив форум, решил реализовать это через выбор цели, и как только цель выбрана, искать так сказать ее след через:
Code: [Select]
if ($count=0)
      getscreen
      colormode(6,10,130,1800,920)
      if_picture_in(10,130,1800,920,"6.bmp",1,100)
         waitms(200)
         waitms(50)
         dblclick($_return1+10,$_return2+180)
         waitms(50)
         dblclick($_return1+10,$_return2+180)
         $count=1
         $time4=$_time_t
         goto(agr)
      else
         move(950,450)
         rdown(950,300)
         waitms(200)
         rup(950,300)
         goto(agr)
      end_if
   
Вроде находит и даже бежит к цели. Но периодически возникает проблема в том, что цель взятая в таргет, находится за пределами экрана или просто ее не находит. В таком случае приходся, почти как во всех играх, зажимать правую кнопку мыши и осматриваться вокруг( верх,низ,лево,право), пока цель не найдется. Может кто посоветовать, как реализовать в скрипте это осматривание?

И еще один вопросик насчет if_picture_in, можно ли осуществлять поиск двух файлов?
Пока использую такой способ:
Code: [Select]
GETSCREEN
IF_picture_IN (840,43,854,57,"mob1.bmp",1,10)
   keypress(#4)
   wait(2)
else
   IF_picture_IN (840,43,854,57,"mob2.bmp",1,10)
      keypress(#4)
      wait(2)
   else
      KEYDOWN(#Left)
      waitms(rnd(400,600))
      KEYUP(#Left)
      goto(start)
   end_if
end_if

Извиняюсь за множество букв  :D
« Last Edit: March 09, 2015, 10:53:10 PM by Denis »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Оптимизация
« Reply #1 on: March 10, 2015, 08:11:16 AM »
Что еще за "#MAG"?

У тебя скрипт состоит из одних потоков, но еще есть главный поток в котором ничего кроме "#MAG" нет. Нужно поставить в основной поток задержку.
   IF_PICTURE_IN (10,91,310,126,"buf.bmp",1,80) 1 в данном случае обозначает цвет прозрачности в картинке, у тебя он там точно есть? Если не нужно использовать прозрачность, пишется -1.

Code: (clickermann) [Select]
thread(rage,0)
   waitms(800)
   getscreen
   colormode(5,120,61,179,79)
   if_pixel_in(120,61,179,79,4161343)
      SETTHREAD (bot, 1)
      waitms(200)
      SETTHREAD (rage, 0)
   else
      getscreen
      if_pixel_in(1023,88,1024,88,1124919)
         wait(1)
         keypress(#7)
         waitms(200)
         keydown(#alt)
         keypress(#8)
         keyup(#alt)
         waitms(2000)
         keypress(#9)
         waitms(300)
         keypress(#F)
         wait(10)
      else
         keypress(#0)
         waitms(50)
         keypress(#3)
      end_if
   end_if
END_THREAD

THREAD(low, 0)
   waitms(500)
   getscreen
   colormode(5,5,128,38,226)
   if_pixel_in(5,128,38,226,2039679)
      SETTHREAD (bot, 0)
      waitms(200)
      SETTHREAD (rage, 1)
      waitms(200)
      SETTHREAD (low, 0)
   end_if
   waitms(500)
   getscreen
   colormode(5,130,61,179,79)
   if_pixel_in(130,61,179,79,4161343)
      SETTHREAD (low, 0)
   end_if
END_THREAD

THREAD(bot, 1)
   wait(1)
   $time=0
   $time2=0
   $time3=0
   
   start:
   
   GETSCREEN  //баф
   IF_PICTURE_IN (10,91,310,126,"buf.bmp",1,80)
   else
      IF(($_time_t-$time)>45)
         KEYPRESS(#9)
         $time=$_time_t
         wait(2)
      end_if
   end_if
   
   GETSCREEN  //баф
   IF_PICTURE_IN (10,91,310,126,"buf2.bmp",1,85)
   else
      KEYPRESS(#6)
      wait(2)
   end_if
   
   GETSCREEN  //баф
   IF_PICTURE_IN (10,91,310,126,"buf3.bmp",1,80)
   else
      keydown(#alt)
      KEYPRESS(#N)
      keyup(#alt)
      wait(1)
   end_if
   
   GETSCREEN  // мана реген
   IF_PIXEL_IN (60,89,67,89,1124919)
      wait(1)
      goto(check)
   end_if
   
   GETSCREEN  // hp реген
   IF_PIXEL_IN (260,66,266,66,1124919)
      IF (($_time_t-$time3)>10)
         KEYPRESS(#7)
         $time3=$_time_t
         waitms(500)
      end_if
      waitms(500)
      keydown(#alt)
      keypress(#8)
      keyup(#alt)
      waitms(2000)
      goto(check)
   end_if
   
   GETSCREEN  // hp реген
   IF_PIXEL_IN (260,66,266,66,1124919)
      wait(1)
      goto(check)
   end_if
   
   turn:
   waitms(200)
   GETSCREEN
   IF_PIXEL_IN (877,66,887,67,1908102)
      keyup(#a)
      waitms(2000)
   else
      KEYDOWN(#a)
      waitms(200)
      KEYPRESS(#4)
      goto(turn)
   end_if
   
   agr:
   KEYPRESS(#2)
   waitms(rnd(200,300))
   KEYPRESS(#3)
   waitms(rnd(1200,1400))
   KEYPRESS(#3)
   waitms(rnd(200,400))
   KEYPRESS(#3)
   waitms(rnd(200,400))
   
   fight:
   waitms(100)
   GETSCREEN
   IF_PIXEL_IN (127,67,128,67,1124919)
      SETTHREAD (low, 1)
   end_if
   waitms(100)
   GETSCREEN
   IF_PIXEL_IN (845,87,849,87,12274992)
      waitms(100)
      GETSCREEN
      IF_PIXEL_IN (845,66,847,67,1908102)
         KEYPRESS(#3)
         waitms(rnd(100,200))
         GETSCREEN
         IF_PIXEL_IN (190,67,192,67,1124919)
            IF (($_time_t-$time2)>36)
               waitms(rnd(400,500))
               KEYPRESS(#5)
               waitms(900)
               KEYPRESS(#B)
               $time2=$_time_t
            end_if
         END_IF
      else
         KEYPRESS(#1)
         waitms(500)
         KEYPRESS(70)
      END_IF
      goto(fight)
   END_IF
   
   waitms(rnd(400,600))
   
   KEYPRESS(70)
   goto(start)
   
   check:
   GETSCREEN
   IF_PIXEL_IN (845,87,849,87,12274992)
      KEYPRESS(#0)
      waitms(rnd(100,200))
      KEYPRESS(#2)
      waitms(rnd(100,200))
      goto(fight)
   END_IF
   goto(start)
   
END_THREAD

WAIT(60)

И еще один вопросик насчет if_picture_in, можно ли осуществлять поиск двух файлов?
Пока использую такой способ:
Это правильный способ, указывать можно только одну картинку.
« Last Edit: March 10, 2015, 08:14:08 AM by Oraven »

Denis

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Re: Оптимизация
« Reply #2 on: March 10, 2015, 08:05:42 PM »
Что еще за "#MAG"?

У тебя скрипт состоит из одних потоков, но еще есть главный поток в котором ничего кроме "#MAG" нет. Нужно поставить в основной поток задержку.
   IF_PICTURE_IN (10,91,310,126,"buf.bmp",1,80) 1 в данном случае обозначает цвет прозрачности в картинке, у тебя он там точно есть? Если не нужно использовать прозрачность, пишется -1.


"#MAG" - изначально, пока использовал старую версию кликера без потоков, это было типа просто название. А когда перешел на новый кликер, перевел все на потоки, про это даже и не подумал, спасибо.
Насчет прозрачности, даже не задумывался. Сделал скриншот, вырезал картинку, записал как в примере выше, все заработало, а надо там 1 или -1 не стал разбираться, раз работает.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Оптимизация
« Reply #3 on: March 10, 2015, 09:21:55 PM »
Название пишется таким образом
Code: (clickermann) [Select]
#name "СуперБот v1.2"будет отображаться в заголовке окна кликера, и в трее по наведению на значек.