Author Topic: В чём ошибка?  (Read 11870 times)

0 Members and 3 Guests are viewing this topic.

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
В чём ошибка?
« on: July 16, 2014, 10:40:08 PM »
как править этот код чтобы работал нормально
Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN (1197,43, 1197, 43, 14406087)  //Этот иф не правильно работает. Он должен запускаться только если в точке есть нужного цвета пиксель, а он всё-равно включается.
WAIT(1)           
DEFINE ($A, [0])
DEFINE ($B, [0])         
GETSCREEN //1
IF_PIXEL_IN(1106,287,1106,287, 10446592)
$B=$B+1
END_IF
GETSCREEN //2
IF_PIXEL_IN(1131,287,1131,287, 10446592)
$B=$B+1
END_IF
GETSCREEN //3
IF_PIXEL_IN(1156, 287, 1156, 287, 10446592)
$B=$B+1
END_IF
GETSCREEN //4
IF_PIXEL_IN(1181, 287, 1181, 287, 10446592)
$B=$B+1
END_IF
GETSCREEN  //5
IF_PIXEL_IN(1222, 287, 1222, 287, 10446592)
$B=$B+1
END_IF
GETSCREEN //6
IF_PIXEL_IN(1249, 287, 1249, 287, 10446592)
$B=$B+1
END_IF
GETSCREEN  //7
IF_PIXEL_IN(1276, 287, 1276, 287, 10446592)
$B=$B+1
END_IF
GETSCREEN //8
IF_PIXEL_IN(1303, 287, 1303, 287, 10446592)
$B=$B+1
END_IF
GETSCREEN  //9
IF_PIXEL_IN(1331, 287, 1331, 287, 10446592)
$B=$B+1
END_IF
$A=$B //во время работы тут ошибку указывает
IF($B = $A)
  #ps2_keyboard
   KEYPRESS(#F2)
ELSE
  IF($B>$A) 
  #ps2_keyboard
    KEYPRESS(#F3)
  ELSE
  #ps2_keyboard
    KEYPRESS(#F2)
   END_IF
   GETSCREEN
ELSE

END_IF

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чём ошибка?
« Reply #1 on: July 16, 2014, 11:30:06 PM »
Кто ж тя так кодить учил? Чувствуется какой нибудь Оупилот...  :D

Вот верный вариант:
Как я понял тебе нужно определить цвет в заданной точке, и если сошелся определить цвета еще в девяти точках. Если сошлись цвета в любой из девяти точек то нажать F3 а если нет то F2.
#ps2_keyboard или #ps2_mouse - нужно написать только один раз в начале скрипта, это включит альтернативный режим нажатий клавиш.

Code: (clickermann) [Select]
#ps2_keyboard

GETSCREEN
IF(PXL(1197,43) = 14406087)
   WAIT(1)
   GETSCREEN
   IF((PXL(1106,287) = 10446592)|(PXL(1131,287) = 10446592)|(PXL(1156, 287) = 10446592)|(PXL(1181, 287) = 10446592)|(PXL(1222, 287) = 10446592)|(PXL(1249, 287) = 10446592)|(PXL(1276, 287) = 10446592)|(PXL(1303, 287) = 10446592)|(PXL(1331, 287) = 10446592))
      KEYPRESS(#F3)
      WAITMS(100)
   ELSE
      KEYPRESS(#F2)
      WAITMS(100)
   END_IF
END_IF
WAITMS(50)

 

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #2 on: July 16, 2014, 11:36:15 PM »
с Ф2 и Ф3 немножко сложнее, 9 точек вдоль синей линии  (заполненной не полностью) если линия стала больше чем была то Ф3 если нет то Ф2. Инкриминировать переменную $B необходимо, к тому же по отдельности.
И ещё как инкриминировать $B передать это значение $A и чтобы $A сбрасывалось на 1 цикл позже, что бы по А можно было проверять как изменилась полоска

« Last Edit: July 17, 2014, 12:04:31 AM by kostya1234599 »

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #3 on: July 16, 2014, 11:37:03 PM »
Пиксельный бот для рыбалки самому делать это жуть, тем более на Lineage 2. Это не uoPilot это C++ и Pascal на мне так сказались)

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #4 on: July 16, 2014, 11:54:19 PM »
Ещё намекну про точки, только что в голову пришло.
изначально точек 5 примерно (полоска ХП рыбы и ловля рыбы начинаются так)
для ловли рыбы 2 действия (тянуть и подсекать)
и 2 ситуации
Если в ситуацию 1 нажать подходящее действие 1 (скажем тянуть) то ХП рыбы уменьшается, следовательно точек стало меньше, и мы сделали правильно и если действие не изменилось то можно продолжать нажимать действие 1 (с проверкой этих 9 точек), а если ситуация поменялась, мы использовали не подходящее действие 1 (тянуть) к ситуации 2 следовательно ХП рыбы увеличилось,а тогда и количество точек увеличится, значит нужно поменять действие. Думаю теперь понятно)
При необходимости для точности можно увеличить количество точек на этой проверочной полосе (её длинна 225 пикселей, но ХП начинается чуть правее середины)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чём ошибка?
« Reply #5 on: July 17, 2014, 12:17:20 AM »
Может полоску легче будет считать специальной функцией подсчета пикселов?

Code: (clickermann) [Select]
$count = PXLCOUNT (10,20, 100, 40, 255) // подсчет в заданной области количества заданного цвета и возвращение числа в переменную

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чём ошибка?
« Reply #6 on: July 17, 2014, 12:22:29 AM »
Как то так но про PXLCOUNT подумай.

Верно писать так
Code: (clickermann) [Select]
DEFINE ($A, 0)
DEFINE ($B, 0)
Но в данном скрипте это не нужно вообще.

Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN (1197,43, 1197, 43, 14406087)  //Этот иф не правильно работает. Он должен запускаться только если в точке есть нужного цвета пиксель, а он всё-равно включается.
   WAIT(1)
   GETSCREEN //1
   IF_PIXEL_IN(1106,287,1106,287, 10446592)
      $B=$B+1
   END_IF
   //2
   IF_PIXEL_IN(1131,287,1131,287, 10446592)
      $B=$B+1
   END_IF
   //3
   IF_PIXEL_IN(1156, 287, 1156, 287, 10446592)
      $B=$B+1
   END_IF
   //4
   IF_PIXEL_IN(1181, 287, 1181, 287, 10446592)
      $B=$B+1
   END_IF
   //5
   IF_PIXEL_IN(1222, 287, 1222, 287, 10446592)
      $B=$B+1
   END_IF
   //6
   IF_PIXEL_IN(1249, 287, 1249, 287, 10446592)
      $B=$B+1
   END_IF
   //7
   IF_PIXEL_IN(1276, 287, 1276, 287, 10446592)
      $B=$B+1
   END_IF
   //8
   IF_PIXEL_IN(1303, 287, 1303, 287, 10446592)
      $B=$B+1
   END_IF
   //9
   IF_PIXEL_IN(1331, 287, 1331, 287, 10446592)
      $B=$B+1
   END_IF
   
   $A=$B //во время работы тут ошибку указывает
   IF($B = $A)
      #ps2_keyboard
      KEYPRESS(#F2)
   ELSE
      IF($B>$A)
         #ps2_keyboard
         KEYPRESS(#F3)
      ELSE
         #ps2_keyboard
         KEYPRESS(#F2)
      END_IF
   END_IF
END_IF
WAITMS(50)
« Last Edit: July 17, 2014, 12:25:53 AM by Oraven »

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #7 on: July 17, 2014, 12:43:11 AM »
PXLCOUNT это мне очень пригодится, не подумал про это, но всё же вернусь к вопросу, почему в моём макросе, при не выполнении условия выполнилось действие?
Переработаю макрос относительно новых данных, наверное уже днём предложу новый вариант(корректированный), но от вопроса не отказываюсь, необходимо знать почему так произошло. Спасибо за понимание ;)
« Last Edit: July 17, 2014, 12:45:54 AM by kostya1234599 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чём ошибка?
« Reply #8 on: July 17, 2014, 12:46:18 AM »
Каждый IF должен завершаться своим END_IF и в каждом условии может быть одна альтернатива ELSE. А у тебя там путаница.

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #9 on: July 17, 2014, 01:12:47 AM »
Спасибо, это дало разъяснение)
Новый вопрос, у меня ступор в определении ( я уже описал как увеличивается или уменьшается полоска ХП рыбы). Я подсчитал сколько пикселей цвета  ХП рыбы (синего) и сколько не заполненного (почти чёрный). Как мне записывать данные о "измерении" синей полоски  так, чтобы можно было использовать их после следующего измерения для понимания как изменилась длинна полосы. Или как мне задействовать одно пробное действие перед "инициализацией"( перед тем как давать программе "осознанно" нажимать кнопки) ?

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #10 on: July 17, 2014, 01:28:32 AM »
Пока что новый код ( недоделанный ) вот такой:
Вместо "х" и "у" будут реальные числа.
Code: (clickermann) [Select]
#ps2_keyboard

GETSCREEN
IF(PXL(x,y) = 14406087) //проверка на появление окна рыбалки
   WHILE(PXL(x,y) = 14406087) //повтор цикла проверки и ловли до тех пор пока окно не закроется, т.е. пока рыбу не поймаю
      WAIT(1)
      M1:
      GETSCREEN
      IF(PXL(x-91,y+244) = 10446592) //проверка на появление полоски
         GETSCREEN
         $Blue=PXLCOUNT(x-91,y+244,x+134,y+244,10446592)
         $Black=PXLCOUNT(x-91,y+244,x+134,y+244,14406087)
         //сюда нужно придумать то на чём я застопорился
      ELSE
         WAIT(1)  //ждать 1 сек если полоска не появилась и начать заново проверку полоски
         GOTO(M1)
      END_IF
   END_CYC
ELSE
   // проверка на наличие спец. NPC Русалки (её можно поймать, плюшки даёт)
   //взять награду
   //закинуть удочку(т.к. закинул удочку то выполняется первый IF и рыбалка продолжается)
END_IF 

Что скажешь на этот раз? :)
« Last Edit: July 17, 2014, 08:55:09 AM by kostya1234599 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чём ошибка?
« Reply #11 on: July 17, 2014, 12:17:34 PM »
Наверное так
Code: (clickermann) [Select]
IF($Blue = $Blue2)
   // действие если не изменилась
ELSE
   $Blue2 = $Blue
   // действие если зменилась
END_IF

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #12 on: July 17, 2014, 12:31:29 PM »
не совсем, если бы полоска увеличивалась только от действий и т.д. то это подошло бы, но она ещё увеличивается каждую секунду примерно на миллиметр, что сложнее.
справился с действием от которого нужно отталкиваться, и дореализовал IF внешний, осталось к нему ELSE реализовать (он в логическом виде пока на бумаге) вот код:
Code: (clickermann) [Select]
#ps2_keyboard
DEFINE ($C, 0)
GETSCREEN
IF(PXL(x,y) = 14406087) //проверка на появление окна рыбалки
     M1:
     GETSCREEN
     IF(PXL(x-91,y+244) = 10446592) //проверка на появление полоски
        M2:
        GETSCREEN
        $Blue=PXLCOUNT(x-91,y+244,x+134,y+244,10446592)
        WAIT(1)
        IF($C != 1) // тот самый IF который делает 1 действие, от которого начинается проверка состояния поплавка по полоске
           $C=$C+1
           $A=$Blue
           KEYPRESS(#F2)
           GOTO(M2)
        ELSE
           GOTO(M3)
        END_IF
        M3:
        IF($A>$Blue)
           WAITMS(500)
           $A=$Blue
           KEYPRESS(#F2)
           GOTO(M2)
        ELSE
           WAITMS(500)
           $A=$Blue
           KEYPRESS(#F3)
           GOTO(M4)
        END_IF
        M4:
        GETSCREEN
        $Blue=PXLCOUNT(x-91,y+244,x+134,y+244,10446592)
        WAIT(1)
         IF($A<$Blue)
           WAITMS(500)
           $A=$Blue
           KEYPRESS(#F2)
           GOTO(M2)
        ELSE
           WAITMS(500)
           $A=$Blue
           KEYPRESS(#F3)
           GOTO(M4)
        END_IF
     ELSE
        WAIT(1)  //ждать 1 сек если полоска не появилась и начать заново проверку полоски
        GOTO(M1)
     END_IF
ELSE
  IF(PXL(x1,y1) = цв. русалки)
     WAITMS(10)
     KEYSTRING("/target ")
     KEYDOWN(#CTRL)
     KEYPRESS(#SHIFT)
     KEYUP(#CTRL)
     KEYDOWN(#SHIFT)
     KEYPRESS(#p)
     KEYUP(#SHIFT)
     KEYSTRING("jkjnfz")
     KEYDOWN(#SHIFT)
     KEYPRESS(#h)
     KEYUP(#SHIFT)
     KEYSTRING("ecfkrf")
     KEYDOWN(#CTRL)
     KEYPRESS(#SHIFT)
     KEYPRESS(#SHIFT)
     KEYUP(#CTRL)
     KEYPRESS(#ENTER) 
     KEYSTRING("/target ")
     KEYDOWN(#CTRL)
     KEYPRESS(#SHIFT)
     KEYUP(#CTRL)
     KEYDOWN(#SHIFT)
     KEYPRESS(#p)
     KEYUP(#SHIFT)
     KEYSTRING("jkjnfz")
     KEYDOWN(#SHIFT)
     KEYPRESS(#h)
     KEYUP(#SHIFT)
     KEYSTRING("ecfkrf")
     KEYDOWN(#CTRL)
     KEYPRESS(#SHIFT)
     KEYPRESS(#SHIFT)
     KEYUP(#CTRL)
     KEYPRESS(#ENTER) //набрать в чат "/target Золотая Русалка" 2 раза, учитывая смену языков. (во время работы макроса должен быть включёнными русский язык)
     LCLICK(x2,y2) //взять награду
     LCLICK(x3,y3) //закрыть окно русалки
     KEYPRESS(#F1)
     GOTO(M2)
  ELSE
     KEYPRESS(#F1)
     GOTO(M2)
  END_IF
END_IF
с координатами разберусь потом, напишу на С++ прогу чтобы создавала этот код в txt с нужными координатами.
Похоже что я доделал этот макрос , не считая вычисления координат, так ведь?
« Last Edit: July 18, 2014, 01:35:09 AM by kostya1234599 »

kostya1234599

  • Освоившийся
  • **
  • Posts: 25
    • View Profile
Re: В чём ошибка?
« Reply #13 on: July 18, 2014, 12:21:47 AM »
Посмотри пожалуйста сообщение выше, и прокомментируй, спасибо ^^ .

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чём ошибка?
« Reply #14 on: July 18, 2014, 12:41:41 AM »
IF($C != 1) Тут либо равно "=" либо неравно "!"но не все сразу же!

Зачем писать эти ГОТО если скрипт и так туда пойдет? Бессмысленно...

Code: (clickermann) [Select]
           GOTO(M3)
       END_IF
       M3: