Author Topic: Скрипт рыбалки. Иногда перестает реагировать.  (Read 4507 times)

0 Members and 1 Guest are viewing this topic.

Andrey_Zloy_Bok

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Всем добрый день! На форуме тут нашел не большой скрипт для рыбалке в одной игре. Дописал его для себя, все работает, ловит как надо. Но есть проблема. В игре предусмотрено, что если ты не делаешь никаких действий, то через 15 мин тебя выкидывает из игры. Так вот с некоторой периодичностью игра перестает видеть действия кликера. Когда это происходит - я не знаю. Может и через час, может и через 3 часа случиться. Подхожу к компьютеру, вижу что кликер все еще работает, мышку возвращает на исходную позицию и т.д.. Но в игре скорее всего перестаю выполняться действия и по этому выкидывает из игры. Выкидывает точно из-за простоя, потому что когда к компьютеру подходишь, висит это окошко что через 15 мин вы будете отключены. Сам скрипт чуть ниже. Посмотрите пожалуйста, в чем может быть причина? Привязка к окну не работает. Когда её включаешь, кликер привязывается к окну, но когда кликер запускаешь - только экран начинает моргать и все, никаких действий в игре не происходит.

Code: (clickermann) [Select]
//Проверяем, активна ли левая кнопка мыши и если да, то
//нажимаем ее


WAITMS(1000)

new:
$check=0
WHILE($check=0)
   GETSCREEN
   IF(PXL(991,1015) = 16739801)
      LCLICK($_return1, $_return2)
      $check=1
      WAITMS(1500)
   ELSE
      WAITMS(1000)
   END_IF
END_CYC
WAITMS(5)

//Проверяем правую кнопку мыши

$check=0
WHILE($check=0)
   GETSCREEN
   IF(PXL(991,1015) = 16739801)
      WAITMS(1000)
      GOTO(new)
   END_IF
   IF(PXL(1030,1008) = 16735702)
      $check=1
      WAITMS(2000)
   ELSE
      WAITMS(1500)
     
   END_IF
END_CYC
WAITMS(500)


//Если поймалась необходимая рыба, то подсекаем, иначе ждем когда рыба отцепится и начинаем скрипт сначала
$check=0
WHILE($check=0)
   GETSCREEN
   IF(PXL(795,981) = 3289650)
      RCLICK($_return1, $_return2)
      $check=1
      WAITMS(500)
   ELSE
      WAITMS(10000)
      GOTO(new)
   END_IF
END_CYC
WAITMS(2000)

//Тащим рыбу, пока не загорится кнопка вытаскивания

$check=0
KEYDOWN(#Q)
WHILE($check=0)
   GETSCREEN
   IF(PXL(918,936) = 8902946)
      WAITMS(1000)
      KEYUP(#Q)
      WAITMS(50)
      KEYPRESS(#1)
      $check=1
   ELSE
      WAITMS(1000)
   END_IF
END_CYC
WAITMS(3000)
GOTO(new)
WAITMS(1000)
« Last Edit: April 18, 2017, 10:53:01 AM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Выпрыгивать из циклов через GOTO нельзя, это приводит к глюкам.
Где у тебя функция которая возвращает в $_return1, $_return2 координаты? PXL этого конечно не делает.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вот исправленный скрипт
Code: (clickermann) [Select]
//Проверяем, активна ли левая кнопка мыши и если да, то
//нажимаем ее

WAITMS(1000)

new:
$check=0
WHILE($check=0)
   GETSCREEN
   IF(PXL(991,1015) = 16739801)
      LCLICK(991,1015)
      $check=1
      WAITMS(1500)
   ELSE
      WAITMS(1000)
   END_IF
END_CYC

//Проверяем правую кнопку мыши
$check=0
WHILE($check=0)
   GETSCREEN
   IF(PXL(991,1015) = 16739801)
      WAITMS(1000)
      $check=2
   ELSE
      IF(PXL(1030,1008) = 16735702)
         $check=1
         WAITMS(2000)
      ELSE
         WAITMS(1500)
      END_IF
   END_IF
END_CYC
IF($check=2)
   GOTO(new)
END_IF
WAITMS(500)


//Если поймалась необходимая рыба, то подсекаем, иначе ждем когда рыба отцепится и начинаем скрипт сначала
GETSCREEN
IF(PXL(795,981) = 3289650)
   RCLICK(795,981)
   WAITMS(500)
ELSE
   WAITMS(10000)
   GOTO(new)
END_IF
WAITMS(2000)

//Тащим рыбу, пока не загорится кнопка вытаскивания

$check=0
KEYDOWN(#Q)
WHILE($check=0)
   GETSCREEN
   IF(PXL(918,936) = 8902946)
      WAITMS(1000)
      KEYUP(#Q)
      WAITMS(50)
      KEYPRESS(#1)
      $check=1
   ELSE
      WAITMS(1000)
   END_IF
END_CYC
WAITMS(2000)

Andrey_Zloy_Bok

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Хм, но без координат оно работало.. Но я попробую этот вариант, посмотрим что выйдет из этого. А как тогда правильно выйти из скрипта, если не GOTO ?
аааа, все ,увидел! Спасибо большое! Я попробую!

Andrey_Zloy_Bok

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
В общем проблема все равно осталась. В какой-то момент скрипт просто перестал щелкать по кнопкам в игре и в итоге выкинуло из игры.. В чем может быть проблема еще?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Очевидно застревает в каком то из циклов. Чтобы понять что происходит перед условиями напиши запись в лог чтобы понять какой цикл или условие в данный момент началось.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А может причина в другом?
Не буду называть игру, но там тоже выбрасывает за бездействие и (внезапно) действия связанные с забросом-выловом не считаются.
Сделали просто, после каждого цикла ловли двигаем персонажем пару секунд, хватает поворотов туда-сюда.


Andrey_Zloy_Bok

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
А может причина в другом?
Не буду называть игру, но там тоже выбрасывает за бездействие и (внезапно) действия связанные с забросом-выловом не считаются.
Сделали просто, после каждого цикла ловли двигаем персонажем пару секунд, хватает поворотов туда-сюда.
Очень похоже что мы об одной игре говорим..)
А как правильно заставить двигаться персонажа?

KEYPRESS(#A)
WAITMS(3000)
KEYPRESS(#D)
WAITMS(3000)

Так оно как-то криво работает и иногда он раза 3-4 подвигается прежде чем закинуть

Andrey_Zloy_Bok

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
В общем сделал вот так - не помогло.. //Ïðîâåðÿåì, àêòèâíà ëè ëåâàÿ êíîïêà ìûøè è åñëè äà, òî
//íàæèìàåì åå
 
WAITMS(1000)
 
new:

KEYDOWN(#A)
WAITMS(1500)
KEYUP(#A)
WAITMS(50)
KEYDOWN(#D)
WAITMS(1500)
KEYUP(#D)
WAITMS(50)



Заметил сегодня вот такую штуку. В общем поставил кликер на 2ух компах. На обоих в итоге вылетело, но на одно пропаботало часа 4, а на другом всего час. Еще заметил на 1 компе. В общем подошел к компу, там окно что меня выкинуло. Есть окно в котором можно вводить символы. Скрипт по идее должен бы был вводить там A,D периодически. Но ничего не происходило. Не останавливая скрипт я залогинился в игру - опять ничего не происходит, потом я сам щелкнул мышкой, что бы закинуть удочку и о чудо, скрипт снова сам начал работать и персонаж начал двигаться.

Получается, что кликер просто отваливается от окна и по этому в итоге персонажа выкидывает из игры за бездействие.
Как можно решить эту проблему? Попробовать режим PS\2 ?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Получается, что кликер просто отваливается от окна и по этому в итоге персонажа выкидывает из игры за бездействие.
Скрипт же не работает в привязке, поэтому он отваливаться ни от куда не может.

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

Скорее всего скрипт написан примитивно. Не учтены все нюансы и не предусмотрена обработка нештатных ситуаций.
Твоей полной версии кода тоже не видно. Что комментировать?
Скажу только что вон там, в местах бесконечных ожиданий в цикле, не предусмотрен момент когда преведущее действие не произошло - кнопка не прожалась. Точнее прожалась, но не вовремя или из-за лагов игра не отреагировала. И всё. Мы ждём бесконечно цвет, который никогда не появится.
Нужно или проверять действие или ограничивать циклы ожидания по времени. Примеры таких циклов есть в шаблонах.
« Last Edit: April 19, 2017, 09:44:10 AM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Кнопка "Шаблоны" в редакторе.

Вот пример первого цикла из поста Андрея. (Твоего кода нет до сих пор).
Code: (clickermann) [Select]
$time = $_ms + 30000  // ждём не более 30 сек
WHILE($time > $_ms)
    GETSCREEN   
    IF(PXL(991,1015) = 16739801)
        $time = 0
        LCLICK(991, 1015)
        WAITMS(500)
    END_IF
    WAITMS(1000)
END_CYC

// если нужно действие когда время вышло, а не нашлось
IF($time ! 0)
    // время истекло, картинка не найдена
END_IF


Andrey_Zloy_Bok

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Code: (clickermann) [Select]
//Проверяем, активна ли левая кнопка мыши и если да, то
//нажимаем ее
 
WAITMS(1000)


LOGWRITE ("начало")
LOGSHOW (1, 100,100)


new:

KEYDOWN(#A)
WAITMS(1500)
KEYUP(#A)
WAITMS(50)
KEYDOWN(#D)
WAITMS(1500)
KEYUP(#D)
WAITMS(50)

$check=0
$time = $_time_t + 30
print("Время1=", $time)
WHILE(($check=0) & ($time > $_time_t))
print("Время реальное=", $_time_t)
   GETSCREEN
   LOGWRITE ("ищем левую кнопку")
   IF(PXL(991,1015) = 16739801)
    WAITMS(500)
    LOGWRITE ("нашли левую")
      LCLICK(991,1015)
      WAITMS(500)
      LCLICK(991,1015)
      $check=1
      WAITMS(1500)
   ELSE
      WAITMS(1000)
   END_IF
END_CYC


 
//Проверяем правую кнопку мыши
$check=0
$time = $_time_t + 40
WHILE(($check=0) & ($time > $_time_t))
   GETSCREEN
   LOGWRITE ("ищем правую кнопку")
   IF(PXL(991,1015) = 16739801)
    LOGWRITE ("горит левая, переходим на верх")
      WAITMS(1000)
      $check=2
   ELSE
      IF(PXL(1030,1008) = 16735702)
         $check=1
         LOGWRITE ("нашли правую кнопку")
         WAITMS(2000)
      ELSE
         WAITMS(1500)
      END_IF
   END_IF
END_CYC
IF($check=2)
   GOTO(new)
END_IF
WAITMS(500)
 
 
//Если поймалась необходимая рыба, то подсекаем, иначе ждем когда рыба отцепится и начинаем скрипт сначала
GETSCREEN
IF((PXL(795,981) = 3289650) & (PXL(1030,1008) = 16735702))
LOGWRITE ("Поймалась необходимая рыба")
   RCLICK(795,981)
   WAITMS(500)
ELSE
   WAITMS(10000)
   LOGWRITE ("Поймалась рыба, ждем и переходим на верх")
   GOTO(new)
END_IF
WAITMS(2000)
 
//Тащим рыбу, пока не загорится кнопка вытаскивания
 
$check=0
$time = $_time_t + 50
KEYDOWN(#Q)
WHILE(($check=0)  & ($time > $_time_t))
   GETSCREEN
   LOGWRITE ("Тащим рыбу, пока не загорится 1")
   IF(PXL(918,936) = 8902946)
      WAITMS(1000)
      LOGWRITE ("Скил загорелся, вытаскиваем")
      KEYUP(#Q)
      WAITMS(50)
      KEYPRESS(#1)
      $check=1
   ELSE
      WAITMS(1000)
   END_IF
END_CYC

IF($check=0)
LOGWRITE ("Просто отжимаем Q, цикл подвис")
KEYUP(#Q)
   WAITMS(50)
END_IF

WAITMS(3000)
GOTO(new)
WAITMS(2000)


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

Отсюда вопрос. Можно ли как-то сделать так, что бы скрипт сам создавал новый txt (имя файла будет время в данную секунду) каждый раз, когда он начинается заного. Куда этот код вставить я знаю, как записать необходимые данные в этот файл я тоже знаю. У меня только вопрос как создать файл?
Я бы мог создать всего 1 файл и туда записывать, но боюсь что к утру там будет очень много текста и не подвиснет ли из-за этого кликер? По этому хочу разбить каждый проход скрипта на разные файлы, пусть их лучше будет 2к, но я точно смогу увидеть где была проблема


P.S. И это... Это как бы я и есть, Андрей))))


P.P.S Я вижу, что можно записать в лог, сохранить в лог, очистить лог. А нет ли команды создать файл и сохранить туда лог?
« Last Edit: April 19, 2017, 12:31:58 PM by Andrey_Zloy_Bok »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Конечно есть, но это не команда а директива. Пишем в верхней части скрипта
Code: (clickermann) [Select]
#logfileИ лог будет писаться в файл рядом со скриптом.

С записью в определенный файл сложнее
Code: (clickermann) [Select]
// Это в начале скрипта должно выполняться 1 раз
// Формируем имя файла с текущей датой
$th = $_time_h
$tm = $_time_m
$ts = $_time_s
$dd = $_date_d
$dm = $_date_m
IF(STRLEN($th)<2)
   $th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
   $tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
   $ts = STRCONCAT ("0", $ts)
END_IF
IF(STRLEN($dd)<2)
   $dd = STRCONCAT ("0", $dd)
END_IF
IF(STRLEN($dm)<2)
   $dm = STRCONCAT ("0", $dm)
END_IF
$filename = STRCONCAT($_date_y,$dm,$dd,"_",$th,$tm,$ts,"_Log.txt")


// Пишем строку записи в файл где нужно
TFWRITE($filename, "Текст в лог")

« Last Edit: April 19, 2017, 01:25:20 PM by Oraven »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
P.S. И это... Это как бы я и есть, Андрей))))
Oraven тоже Андрей.