Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: novhome on April 19, 2016, 12:31:54 PM
-
Здравствуйте!
Прошу помощи. Игра через эмулятор андроид с несколькими аккаунтами, в которые нужно по очереди зайти и выполнить определенные действия. С этим проблем нет. Проблема в том, что эмулятор работает не всегда стабильно и вылетает, при этом выбрасывая сообщение. Я так понимаю, что можно отслеживать вылет с помощью отдельного потока. Задача в том, чтобы снова запустить эмулятор и игру и вернуться в тот момент когда был вылет. В этом вся проблема - как показать отдельному потоку, который перезапустит игру, где начнет работать основной поток.
Примерный код.
THREAD(proverka,1) // Запускаем поток, который будет отлавливать вылет из игры
$check=0
WHILE($check=0)
$h=WINDFIND("error")
IF($h>0)
$check=1
LCLICK($x,$y) // Закрываем окно с ошибкой
reboot() // Подпрограмма, в которой нужно перезапустить игру и вернуть до момента вылета
ELSE
WAIT(5)
END_IF
END_CYC
END_THREAD
start_emul() // Запуск эмулятора
vhod(1) // Вход в аккаунт 1
igra() // Игровой процесс
exit() // Выход из аккаунта
.........
vhod(15) // Вход в аккаунт 15
igra() // Игровой процесс
exit() // Выход из аккаунта
HALT(1)
В общем вопрос в том, как показать кликеру, где вылетела игра.
-
Наоборот, код твоего скрипта нужно заключить в поток, тогда его можно ставить на паузу и продолжать с места остановки.
В версии 4.12 появилась возможность перезапускать потоки в 4.11 можно только ставить на паузу
THREAD(osnova,1) // поток основного кода
// Подпрограммы нужно описывать в самом потоке! За границы потока вызов не пойдет!
start_emul() // Запуск эмулятора
vhod(1) // Вход в аккаунт 1
igra() // Игровой процесс
exit() // Выход из аккаунта
// .........
vhod(15) // Вход в аккаунт 15
igra() // Игровой процесс
exit() // Выход из аккаунта
END_THREAD
//== Проверка на ошибки ==========================================
IF(WINDFIND("error")>0)
SETTHREAD (osnova, 0) // ставим поток основной программы на паузу
WAITMS(500)
LCLICK($x,$y) // Закрываем окно с ошибкой
WAITMS(500)
// Здесь код перезапуска
SETTHREAD (osnova, 1) // продолжаем выполнение потока
WAITMS(500)
ELSE
WAIT(5)
END_IF
//=============================================
-
Спасибо за уточнения. А реально как-нибудь узнать, в каком месте в процессе перезапуска остановиться и запустить на исполнение снова основную программу? Просто перезапуска игры мало. Может какую-то метку ставить при вылете и потом на нее ориентироваться?
-
Попробую подробнее обьяснить.
Например начинаем процесс входа в аккаунт, но не успеваем зайти и игра вылетает. В этом случае при перезагрузке игра вернется на страницу входа. Это неболбшая проблема.
Второй вариант - в игру зашли, прошли несколько окон, выполняя различные действия, и тут игра вылетает. В этом случае, при перезагрузке, игра окажется в окне начала игрового процесса, минуя страницу входа в аккаунт (т.к. на момент вылета вход уже был выполнен).
Так вот можно ли, как-то зафиксировать точку вылета, чтобы потом при перезагрузке сказать кликеру, в каком месте закончить работу потока ошибки и запустить основной поток.
-
так поставь задержку между поисками заголовка окна поменьше. тогда и реагировать будет быстрее
//== Проверка на ошибки ==========================================
IF(WINDFIND("error")>0)
SETTHREAD (osnova, 0) // ставим поток основной программы на паузу
WAITMS(500)
LCLICK($x,$y) // Закрываем окно с ошибкой
WAITMS(500)
// Здесь код перезапуска
SETTHREAD (osnova, 1) // продолжаем выполнение потока
WAITMS(500)
ELSE
WAITMS(30) // каждые 30 мс ищем error
END_IF
//=============================================
Как только ошибка будет найдена основной код встанет на паузу, перезапускаем твой плеер и продолжаем выполнять основной код.
-
Наверное не так обьясняю))) Простите дурака.
Нет проблемы в отлове ошибки. Проблема в коде перезапуска. Например скрипт должен отправить 5 маршей с ресурсами с каждого аккаунта. Для этого запускаем эмулятор (один раз), запускаем игру, входим в аккаунт, переходим в окно с картой, кликаем на точку назначения, выбираем ресурс и его количество, отправляем марш, потом еще марш и т. д. Далее жмем на выход из игры (эмулятор остается запущенным). Запускаем игру и входим в следующий аккаунт и дальше все так же. Так вот, когда эмулятор вылетает, я его перезапускаю, запускаю игру и она загружается до страницы входа (если не успели зайти в аккаунт до вылета), либо до первой страницы после входа. А например до вылета отправилось 3 марша и кликер ждет отправить еще 2, а ему подсовывают другое окно))
Таким образом, в зависимости от того на каком этапе произошел вылет, мне нужно перезагрузить игру до момента вылета. Сорри, если замучал вас)))
-
Можно заключить каждую стадию в условие. При успешном выполнении увеличиваем переменную и переходим к следующей стадии.
При ошибке потребуется перезапуск потока, нужно использовать 4.12.001b версию (http://crapware.aidf.org/forum/index.php?topic=356.msg15534#msg15534)
В этом случаи прерванный этап начнется с начала.
THREAD(osnova,1) // поток основного кода
// Подпрограммы нужно описывать в самом потоке! За границы потока вызов не пойдет!
IF($stage = 0)
start_emul() // Запуск эмулятора
INC($stage,1)
END_IF
IF($stage = 1)
vhod(1) // Вход в аккаунт 1
INC($stage,1)
END_IF
IF($stage = 2)
igra() // Игровой процесс
INC($stage,1)
END_IF
IF($stage = 3)
exit() // Выход из аккаунта
INC($stage,1)
END_IF
// .........
IF($stage = 4)
vhod(15) // Вход в аккаунт 15
INC($stage,1)
END_IF
IF($stage = 5)
igra() // Игровой процесс
INC($stage,1)
END_IF
IF($stage = 6)
exit() // Выход из аккаунта
$stage = 0
END_IF
END_THREAD
//== Проверка на ошибки ==========================================
IF(WINDFIND("error")>0)
SETTHREAD (osnova, 2) // останавливаем поток основной программы
WAITMS(500)
LCLICK($x,$y) // Закрываем окно с ошибкой
WAITMS(500)
// Здесь код перезапуска
SETTHREAD (osnova, 1) // запускаем выполнение потока
WAITMS(500)
ELSE
WAIT(5)
END_IF
//=============================================
-
Тут два варианта вижу.
1. Это перед тем что что-то делать, проверить выполнилось это или нет. В примере с авторизацией: перед частью авторизации проверяем авторизованы или нет. Такой подход желательно применять во всех скриптах.
Но это пройдёт не со всеми действиями. Если нельзя определить отправили мы марши или нет, то такой вариант не подойдёт.
2. Ввести подсчёт стадий выполнения всем действиям. Вводим переменную, например $step.
Если она 0 никаких действий с аккаунтом не происходило.
1 - авторизовались
2 - отправили первый марш
3 - отправили второй марш
....
N - разлогинились
В конце действия, если всё прошло успешно, устанавливать текущее состояния. (можно даже ловить падение не потоком, а просто подпрограммой).
-
Спасибо за ответы. Попробую реализовать вводом переменной и подпрограммой.
-
Только это... Циклы мы не проходили? Зачем каждый аккаунт расписан отдельно?
THREAD(osnova,1) // поток основного кода
DEFINE($max_akk, 15)
DEFINE($akk, 1)
IF($akk > $max_akk)
HALT // всех прошли
END_IF
WHILE($stage < 4)
SWITCH($stage)
CASE(0)
start_emul() // Запуск эмулятора
INC($stage)
CASE(1)
vhod($akk) // Вход в аккаунт 1
INC($stage)
CASE(2)
igra() // Игровой процесс
INC($stage)
CASE(3)
exit() // Выход из аккаунта
INC($stage)
INC($akk) // следующий аккаунт
END_SWITCH
END_CYC
END_THREAD
Запуск эмулятора лучше сделать отдельным условием, со своим флагом. Если упал сбрасывать.
Или проверять запущен ли эмулятор.
-
В зависимости от аккаунта различается вид ресурса и количество маршей. Также на некоторых аккаунтах вместо маршей другие действия. Вообще у меня все в подпрограммы запихано. в конечном скрипте записи вида:
start_emul() // Запуск эмулятора
// acc01
resource(1,1,5,silver) // Отправляем ресурсы - Логин 1, пароль 1 (берутся из файлов), маршей 5, вид ресурса -silver
//acc02
resource(2,1,3,food) // Отправляем ресурсы - Логин 2, пароль 1 (берутся из файлов), маршей 3, вид ресурса -food
.....
//acc22
sunduk(22,4) // Собираем сундуки - Логин 22, пароль 4 (берутся из файлов)
-
Строки нужно заключать в кавычки иначе возможны проблемы
resource(1,1,5,"silver")
-
Спасибо за подсказку. В принципе с этим проблем не было, но все равно заменю у себя.