Скрипт на ловлю избранных наклеек в Standoff 2

Закрыто
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Скрипт на ловлю избранных наклеек в Standoff 2

Сообщение Admin »

Внимание! Это скрипт на ловлю только тех наклеек, которые вы сами укажете. Если вам нужен скрипт на ловлю всех наклеек, тогда переходите по этой ссылке.


Из названия темы понятно чем мы будем заниматься?) Верно, сегодня я напишу скрипт на рынок в Standoff-е 2. При этом буду описывать каждый шаг, как я это делаю. Сам скрипт сможете найти в конце статьи бесплатно, без СМС и регистраци! НО! Обязательно прочтите данную тему полностью. Потому что скрипт нужно будет настроить под экран на вашем смартфоне. Просто так взять, скопировать и запустить скрипт у себя, не получиться!

Кроме того, это очередной пример, как можно и нужно писать скрипты для игр под автокликер Perfect Click. Так что усаживайтесь поудобнее и приступим к скриптингу.


Шаг 1. Подробно описываю для себя задачу по пунктам, которых буду придерживаться. Если на каком-то этапе что-то пойдет не так, будет понятно, где искать ошибку.

Из поступивших вопросов пользователей ясна конечная цель. Нужно мониторить несколько позиций на странице на наличие изображения(наклейки) в магазине. Если изображение появилось необходимо выполнить несколько действий для покупки товара. Также раз в несколько секунд требуется обновление страницы, путем нажатия в определенном месте.
Сразу хочу отметить тот факт, что подготовка необходимых материалов для скрипта, почти всегда, занимает больше времени чем его написание. Но без этого, увы, не обойтись.

Сформирую список действий, которые должен выполнять скрипт:
  1. После запуска должен дважды нажать на кнопку “Только мои запросы”, для обновления слотов с товарами.
  2. Для каждого из слотов(в моем случае 3) проверить наличие хотя бы одной из нескольких наклеек.
    • Если на этапе проверки слота обнаруживается какая-либо наклейка на предмете, проверить, доступна ли кнопка “Купить.
    • Если кнопка доступна нажимаем “Купить” и “Подтвердить”.
    • Если кнопка в состоянии “Отменить” либо “Продано”, никак не реагируем и проверяем следующий слот, если не достигли конца списка.
  3. Ожидаем 0.5 сек. И проверяем слоты по новой.
  4. Каждое случайное(30-60) количество циклов обновляем товары в магазине.
Шаг 2. Когда основные действия определены, ищу способы, как их можно воспроизвести.

Самым сложным действием в скрипте будет поиск изображения в каждом слоте. Поэтому начинаю с него. Остальные действия банальны, особо акцентировать на них внимание нету смысла.
При работе с динамическим изображением, нужно очень внимательно рассматривать каждую деталь, которая может повлиять на результат проверки. При первом же рассмотрении страницы рынка, можно отметить следующее:
  • Фон слотов имеет прозрачность.
  • Фон слотов залит градиентом.
  • Дальний фон под слотами неоднородный. В данном случае, там просвечивает како-то изображение.
  • Присутствует анимация снега.
Определить наличие или отсутствие изображения на экране можно двумя способами. Первый - взять цвет пикселя и сравнить с эталоном. Второй способ заключается непосредственно в поиске шаблона изображения.
Первый способ всегда предпочтительнее, так как выполняется средствами движка автокликера и занимает очень мало времени. Второй же способ дает гораздо больше возможностей и сильно упрощает задачу. Но, при этом, его выполнение занимает в десятки раз больше времени, по сравнению с первым. Преимущество поиска по шаблону заключается в том, что его выполняет искусственный интеллект, которому можно задать точность поиска. Кроме того, с его помощью можно искать конкретное изображение, а не только лишь изменение цвета.
В теории, можно было бы искать изменения попиксельно, так как фон не мигает и не меняет свой цвет. Вот только есть одна проблема, анимация снега. Снежинки довольно большие и летят случайным образом по всему экрану. Когда такая снежинка попадает “в нужное время в нужном месте”, автокликер получит ее цвет, сравнит с эталонным и решит, что в данном месте наклейка. Можно, конечно, проверить дважды одно и то же место, но нету никакой гарантии, что там уже не находится следующая снежинка или еще какой-то блик. Помимо прочего, цвета на стикерах могут совпадать, в итоге можно купить товар, который не планировали покупать. Поэтому я выбираю поиск по шаблону. Его будет гораздо проще настроить под данную задачу.


Шаг 3. Подготавливаю ресурсы для скрипта.

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

Я сделал несколько скриншотов в игре с разным типом наклеек в слотах, стандартными средствами Android. Обычно это клавиша “Заблокировать” и “Кнопка громкости вниз”. После этого перешел в папку со скриншотами и вырезал изображения-шаблоны со случайными наклейками, которые мне понравились. Это делается легко, достаточно выставить рамку скриншотера, который запускается в главном окне автокликера, на нужном изображении и нажать на кнопку с изображением ножниц. И конечно же не забудьте ввести название файла. Расширение файла указывать не нужно.

У меня получились вот так:
pink_girl.png
pro.png
bio.png
Обратите внимание, у скриншотера есть одна важная особенность. Он привязывается к координатам самого верхнего слоя экрана. В то время как изображение может быть смещено в сторону, если открыто не во весь экран. Из-за этого обрезанный шаблон может быть тоже немного смещен, но уже в противоположную сторону. И еще один момент, если изображение открыто не на весь экран, при этом управление меню смартфона установлено в настройках на “Управление одним пальцем” шаблоны тоже будут смещены. Лучше всего будет установить на время создания шаблонов, управление тремя кнопками, как в старых версиях Андроид.

Чтоб проверить режим работы, на который настроен в данный момент скриншотер, сфокусируйте рамку захвата шаблона на любом объекте таким образом, чтоб можно было однозначно определить смещено ли изображение.
Я продемонстрирую это на примере кнопки “Купить”. Тем более она мне понадобиться в скрипте. Установил рамку скриншотера ровно на тексте
base_buy.png
После создания шаблона, получилось вот такое изображение
buy.png
Но, если бы скриншотер был настроен некорректно, то изображение было бы таким
bad_buy.png
Если вы получаете, такие смещенные шаблоны, перейдите в настройки автокликера, и поменяйте флажок “Автоматически определять размер экрана”. На работу самого скрипта это никак не влияет, но когда делаете скриншоты, сначала всегда проверьте, что вы делаете их корректно, чтоб потом не переделывать все по новой.

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

Для получения координат, необходимо воспользоваться пипеткой. Если вдруг кто-то не знал назначение кнопок, тогда вот схема.
eyedropper.png
Небольшой лайфхак. Если нужно точно позиционировать перекрестие на пикселе, но это никак не удается, потому что координаты сбиваются пока убираете палец, тогда воспользуйтесь следующим приемом. Когда навели перекрестие в нужное место, нажмите пальцем в любом месте экрана, не отпуская джойстик. Таким образом он будет заблокирован, пока не уберете палец.

Как получить координаты кнопки, [только мои запросы] или центра кнопки [купить] объяснять не буду. Думаю, с этим справитесь самостоятельно. Покажу только как задать область экрана, на которой необходимо искать изображение.
Для первого слота нам нужно искать текст “Купить” только на первой кнопке. Для этого требуется ограничить площадь, на которой автокликер будет проверять наличие шаблона.
Границы можно задать прямоугольником, который описывается координатами верхнего левого угла и нижнего правого.

Для большей наглядности смотрите изображения
top_coord.png
bot_coord.png

Координаты в скрипте можно записывать отдельно, в виде целых чисел.
Например так:

Код: Выделить всё

int xBuyBtn = 2113; 
int yBuyBtn = 572; 

click(xBuyBtn, yBuyBtn);
Но можно использовать объект, который представляет описание точки. Обычно этот вариант более удобный. Если вы набираете в скрипт в редакторе автокликера, тогда начните вводить текст [poi] и автокликер предложит автозаполнение. После нажатия на него вы получите строку: Point p = Point.get(); Все что вам остается, это поменять название точки [p] на то, которое вам будет понятно, а также вставить скопированные координаты между круглых скобок.
В названии переменной можно использовать как латиницу, так и кириллицу. Более подробную информацию об именовании переменных, можно получить в руководстве пользователя по этой ссылке.

Таким образом предыдущий код будет эквивалентен следующему:

Код: Выделить всё

Point buyBtn = Point.get(2113, 572);

click(buyBtn);
Согласитесь, так код смотрится гораздо приятнее. Да и набирать текста нужно меньше в этом случае.

Если требуется достать координаты точки из объекта, тогда нужно обратиться к соответствующему полю объекта. В объекта точки есть два поля. Это поле [х] и поле [y]. Обращение к ним происходит следующим образом
xBuyBtn.x и xBuyBtn.y . При этом неважно какое имя у переменной. Главное, чтоб оно представляло собой объект точки.

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

Думаю с этим заданием справится каждый, так как выше описано все, что необходимо знать. Координаты моих точек вы увидите в скрипте, в конце этой статьи, но для вас они значения не должны иметь, потому что у вас они будут другими. Больше или меньше, в зависимости от разрешения дисплея.

Далее, определим высоту слота и расстояние между верхними сторонами кнопок [купить]. Это необходимо для того, чтоб проверять изображения в цикле, вместо того чтоб определять координаты для каждой кнопки/наклейки и проверять отдельно. После определения высоты, можно будет просто смещаться на это значение по вертикале. Например на первой итерации цикла, проверяется первая наклейка, на второй итерации к [y] координате первого стикера, прибавляется высота слота, при этом [x] остается прежним. Таким образом мы попадаем на вторую наклейку, зная лишь координаты первой, на третьей итерации к координатам первой прибавляем 2 высоты слота и тд. То же самое касается кнопки [купить].

Определить высоту слота крайне легко. Достаточно с помощью пипетки установить перекрестие на верхнюю границу слота, запомнить [y] координату, после чего установить перекрестие на нижнюю границу, из полученной [y] координаты вычесть значение высоты для верхней границы слота.
Вот как это выглядит в картинках:
top_slot.png
bot_slot.png
591 - 461 получаем 130.

Помещаем значение в целочисленную переменную
int slotHeight = 130;

Теперь нужно узнать расстояние между верхними сторонами кнопок. У меня оно также получилось 130. Думаю у вас тоже будет такое же значение, как и высота слота. Но лучше проверьте. Мало ли.


Шаг 4. Пишу скрипт, который будет следить за товарами в магазине.

Код: Выделить всё

// кнопка обновления
Point updBtn = Point.get(777, 424);

// центр кнопки [купить] для первого слота
Point buyBtn1 = Point.get(1947, 526);

// центр кнопки [подтвердить]
Point confirmBtn = Point.get(1197, 572);

// координаты прямоугольника на первом
// слоте где будет проверяться наклейка
Point topSlotStick1 = Point.get(1110, 493);
Point botSlotStick1 = Point.get(1486, 588);

// координаты прямоугольника
// с текстом на кнопке [купить]
Point topBuyBtn1 = Point.get(1875, 500);
Point botBuyBtn1 = Point.get(1995, 675);

//высота слота
int slotHeight = 130;

//расстояние между кнопками [купить]
int buyBtnDist = 130;
С координатами и высотой, надеюсь, все понятно. Если нет, прочтите еще раз, что и как делать для определения нужных точек. Все, без исключения ,значения, вам необходимо заменить на свои. Либо проверить, что они вам подходят. Без этого скрипт будет сбоить.
Нужнно уточнить, что строки, в начале которых стоит два слэша [//], это комментарии. Они никак не влияют на код, и нужны только для пользователя, чтоб он не заблудился во структуре скрипта.

Следующая часть - загрузка шаблонов в скрипт.

Код: Выделить всё

// изображения шаблонов
Image pinkGirl = Image.load("standoff/pinkGirl");
Image pro = Image.load("standoff/pro");
Image bio = Image.load("standoff/bio");

Image buyImg = Image.load("standoff/buyImg");

// создать массив с
// изображениями - шаблонами
Image[] stickArr = {
    pinkGirl,
    pro,
    bio};
Здесь также важно сделать именно свои шаблоны. Использовать шаблоны других пользователей получится, только в том случае, если разрешение и плотность пикселей на экранах ваших смартфонов идентичны.

Хотя в руководстве есть статья, как указывать имя изображения для поиска, я попытаюсь еще раз это здесь объяснить. Потому что некоторые пользователи абсолютно не хотят читать инструкцию к автокликеру, получают ошибки, и топчутся на одном месте, не понимая, как их исправить.
Разберем эту строку

Код: Выделить всё

Image pinkGirl = Image.load("standoff/pinkGirl");
Image - это тип переменной. Тип необходим автокликеру, чтоб понимать, как обрабатывать переменную. Просто оставляете, как есть.
pinkGirl - название переменной, в которую будет загружено изображение-шаблон, из папки автокликера. Название переменной может быть любым, но в пределах правил. Правила именования читайте в руководстве.
Таким образом, переменную можно было назвать не pinkGirl, а просто pink или girl. Автокликеру без разницы, главное, чтоб вы понимали, что за шаблон здесь хранится.
Image.load - это вызова механизма внутри автокликера, который непосредственно обрабатывает и загружает шаблон в скрипт. По сути вам не нужно знать, как он работает, просто используйте как есть.
"standoff/pinkGirl" - а вот это как раз и есть строка, которая указывает, какой файл нужно загрузить в переменную. Объясняю, как ее правильно сформировать.
В домашней директории автокликера, есть папка с названием images. В нее сохраняются все шаблоны, которые вы делаете с помощью инструмента для создания скриншотов в автокликере.

Кстати, если вы нажимаете кнопку [Домой] на главном экране приложения, но получаете сообщение, “не найден файловый менеджер” тогда установите этот. Он бесплатный и современный. Конечно же вы вольны установить любой другой файловый менеджер, лишь бы он поддерживал необходимый функционал. После того как установите поддерживаемый файловый менеджер, по нажатию кнопки [Домой], у вас будет открываться домашняя папка автокликера. Это очень удобно при работе с изображениями в скриптах. Вы можете перейти в эту папку и убедиться, что шаблон обрезан корректно. Либо удалить изображение и переделать по новой.

Продолжим. Если вы не перемещали шаблон внутри папки images, тогда нужно указать только само название файла без расширения. Для примера, когда я создавал шаблон наклейки с розовой девушкой на ней, при сохранении указал название pinkGirl. В папке images было сформировано изображение pinkGirl.png . Если бы я не переместил изображение в подпапку, а использовал как есть, тогда мне нужно было бы указать

Код: Выделить всё

Image.load("pinkGirl");

То есть название файла без расширения. Но я поместил его в подпапку с названием standoff. Поэтому мне нужно писать

Код: Выделить всё

Image.load("standoff/pinkGirl");

Название подпапки в директории images, дальше символ “наклонная черта” или в народе просто слэш, и название файла без расширения.

Для чего все это нужно - если у вас много изображений в пределах одного скрипта, либо несколько скриптов используют поиск изображений, хранить их в корневой папке не очень удобно. Особенно когда нужно заменить одно из них. Таким образом можно разложить изображения по папкам проектов и быстро их находить когда потребуется. Можно пойти еще дальше и разложить изображения в подпапке в свои папки. Например, по категориям. Скажем, в папке images, я создаю папку standoff, внутри которой, создаю еще две папки sticker и other, для хранения изображений наклеек и любых других изображений соответственно. В папку sticker перемещаю изображение pinkGirl.png, а в папку other изображение buyButton.png.
После чего их структура будет выглядеть следующим образом:
dir_struct.png

Чтоб загрузить их в скрипт, мне нужно указать следующие строки
standoff/sticker/pinkGirl” - для pinkGirl
и
standoff/other/buyButton” - для buyButton
Что ж, теперь у вас не должно возникать вопросов по этому поводу.

Еще хотелось бы немного объяснить по массиву. Массив это набор однотипных данных, в данном случае изображений. Он нужен для того, чтоб в него можно было поместить изображения в начале скрипта, а после, перебирать их всех одним циклом. Без необходимости прописывать код для проверки каждого изображения. Автокликер сам сможет доставать по очереди изображения с массива и проверять их наличие в заданной области экрана.

Сформировать массив проще простого. Пишем следующую конструкцию:

Код: Выделить всё

Image[] stickArr = { };

Где stickArr это произвольное имя, я задал такое от сокращения stickers array. Вы же можете указать любое другое, если нужно. Дальше, между фигурных скобок необходимо перечислить, через запятую, названия всех переменных-шаблонов, которые необходимо проверить за один проход. У меня таких изображения 3. Поэтому я так и пишу

Код: Выделить всё

Image[] stickArr = {
pinkGirl,
pro,
bio
};
В столбик писать не обязательно, но удобнее. Если бы было 4 стикера, а не 3, тогда массив мог выглядеть следующим образом.

Код: Выделить всё

Image[] stickArr = {
pinkGirl,
pro,
bio,
fourthSticker
};
Где fourthSticker - название четвертого стикера.

После определения основных переменных можно подключить захват экрана. Лучше всего будет, если, после запуска автокликера, вы будете сразу открывать пипетку и выдавать разрешение на захват экрана. Иначе он попросит это разрешение уже во время запуска скрипта. Разрешение на захват экрана выдается один раз на сеанс. То есть, открыли автокликер, нажали пипетку, выдали разрешение, все. Пока вы, либо система, не закроете автокликер, повторно выдавать ничего не нужно. Когда работает захват экрана, в списке индикаторов, там где отображается заряд батареи и тд, будет висеть специальный значок.
Обратите внимание, автокликер не может работать одновременно с другими приложениями, которые получают доступ к экрану. Например приложения для записи видео с экрана. Это приведет к конфликту.

По функции захвата экрана, уже есть тема на форуме, если нужно можете прочесть ее [urlhttps://autoclicker.pp.ua/viewtopic.php?t=23]здесь[/url]. Если не интересно, тогда просто используйте как есть.

Код: Выделить всё

// подключить захват экрана в скрипт
startScreenCapture(2);
sleep(1000);
Теперь необходимо настроить некоторые переменные, которые будут использоваться в скрипте. Также здесь можно настроить некоторые параметры поиска.

Код: Выделить всё

//установить уровень точности поиска
setMinMatchQuality(70);

// обновить список товаров
click(randomize(updBtn, 5));
sleep(rand(400, 1000));
click(randomize(updBtn, 5));

// переменные-счетчики циклов
int cyclesToUpd = rand(30, 60);
По сути, больше в коде ничего менять не нужно. Объясню только, как работают функции рандомизации.
Выше вы можете наблюдать такие строки:

Код: Выделить всё

// обновить список товаров
click(randomize(updBtn, 5));
sleep(rand(400, 1000));
click(randomize(updBtn, 5));
Здесь в каждой строке используется две функции.
click() и randomize()
sleep() и rand()
Если с click() и sleep(), по идее, все понятно, одна кликает в указанную точку, а вторая задает задержку между действиями, то про рандомизацию нужно немного поговорить.
Функция randomize() принимает 2 параметра. Первый это имя точки, от которой будет создаваться новая точка, а второй - значение, в пределах которого, может быть смещена случайным образом новая точка.
Например, если бы координаты точки updBtn были 10, 10 и к ним применили значение рандомизации 5, то на выходе могли бы получить точку из диапазона 5, 5 и 15, 15. Причем каждая координата изменяется независимо от другой. Таким образом получается эмулировать нажатие, которое очень похожее на действия человека. Ведь человек не может постоянно нажимать в одну точку, с точностью до пикселя.
Функция rand() тоже принимает 2 аргумента. Но только уже в виде 2х целых чисел. И возвращает случайное число, которое лежит между этими числами. Например, нам нужна задержка, которая будет длится случайным образом от 1 до 5 секунд. То есть на одном проходе цикла, это может быть 1 секунда, на втором 2.9 секунды и тд. Для этого в функцию rand нужно передать два числа 1000 и 5000. Почему в тысячах - потому что функция sleep принимает время в миллисекундах. А в одной секунде, как раз тысячу миллисекунд, если кто-то забыл.

Когда мы пишем функцию в функции, тогда значение самой вложенной функции, возвращается на один уровень выше

Код: Выделить всё

sleep(rand(400, 1000)); 
Здесь случайное значение от 400 до 1000 помещается сразу же в функцию sleep, которая приостанавливает выполнение действий на это время.

Как и обещал, прикрепляю весь скрипт с комментариями

Код: Выделить всё

//этот блок необходимо настроить под свой смартфон по гайду
//этот блок необходимо настроить под свой смартфон по гайду
//этот блок необходимо настроить под свой смартфон по гайду

// кнопка обновления
Point updBtn = Point.get(777, 424);

// центр кнопки [купить] для первого слота
Point buyBtn1 = Point.get(1947, 526);

// центр кнопки [подтвердить]
Point confirmBtn = Point.get(1197, 572);

// координаты прямоугольника на первом
// слоте где будет проверяться наклейка
Point topSlotStick1 = Point.get(1110, 493);
Point botSlotStick1 = Point.get(1486, 588);

// координаты прямоугольника
// с текстом на кнопке [купить]
Point topBuyBtn1 = Point.get(1875, 500);
Point botBuyBtn1 = Point.get(1995, 675);

//высота слота
int slotHeight = 130;

//расстояние между кнопками [купить]
int buyBtnDist = 130;

// количество слотов для проверки
int slotsCount = 3;

// количество циклов, после которых будет обновляться список товаров
int minCyclesCount = 30;  //минимальное значение
int maxCyclesCount = 60; // максимальное значение

// изображения шаблонов
Image pinkGirl = Image.load("standoff/pinkGirl");
Image pro = Image.load("standoff/pro");
Image bio = Image.load("standoff/bio");
Image buyImg = Image.load("standoff/buyImg");

// создать массив со стикерами
Image[] stickArr = {
    pinkGirl,
    pro,
    bio};


//ниже ничего трогать не нужно
//ниже ничего трогать не нужно
//ниже ничего трогать не нужно

// подключить захват экрана в скрипт
startScreenCapture(2);
sleep(1000);

//установить уровень точности поиска
setMinMatchQuality(70);

// обновить список товаров
click(randomize(updBtn, 5));
sleep(rand(500, 1300));
click(randomize(updBtn, 5));

// переменные-счетчики циклов
int cyclesToUpd = rand(minCyclesCount, maxCyclesCount);
int counter = 0;

//Объекты точек,
//куда записываются координаты
//для ограничения площади поиска
Point topLeft = Point.get();
Point botRight = Point.get();

// запускаем основной цикл до тех пор
// пока не остановим скрипт вручную
while (!EXIT)
{
    // цикл для проверки 3х слотов
    for (int i = 0; i < slotsCount; i++)
    {
        //получаем точки для поиска стикера
        topLeft.x = topSlotStick1.x;
        topLeft.y =
            topSlotStick1.y + (slotHeight * i);

        botRight.x = botSlotStick1.x;
        botRight.y =
            botSlotStick1.y + (slotHeight * i);

        //цикл для перебора стикеров
        for (int j = 0; j < stickArr.length; j++)
        {
            if (hasImg(stickArr[j],
                                 topLeft, 
                                 botRight))
            {
                //получаем точки для
                //поиска кнопки [купить]
                topLeft.x = topBuyBtn1.x;
                topLeft.y =
                    topBuyBtn1.y + (buyBtnDist * i);

                botRight.x = botBuyBtn1.x;
                botRight.y =
                    botBuyBtn1.y + (buyBtnDist * i);

                //проверяем доступна ли
                //кнопка [купить]
                if (hasImg(buyImg, topLeft, botRight))
                {
                
                    //Обратите внимание сюда
                    //Обратите внимание сюда
                    //Обратите внимание сюда
                    
                    // Если у вас все работает как нужно и наклейки обнаруживаются,
                    // тогда удалите код от этого места до следующего комментария 
                    
                    // после настройки скрипта удалите все строки ОТ этого места
                    // после настройки скрипта удалите все строки ОТ этого места
                    
                    showNotification("slot: " + (i + 1) + " img: " + j);
                    i = stickArr.length + 1;
                    EXIT = true;
                    break;
                    
                    // после настройки скрипта удалите все строки ДО этого места
                    // после настройки скрипта удалите все строки ДО этого места
                    
                    //строки ниже, после настройки скрипта нужно расскомментировать
                    // то есть удалить знаки [//] перед ними
               
                    //click(randomize(Point.get(buyBtn1.x, buyBtn1.y + (buyBtnDist * i)), 10));
                    //sleep(rand(100, 500));
                    //click(randomize(confirmBtn, 10));
                    //sleep(rand(10000, 2000));
                    //click(randomize(updBtn, 5));
                    //sleep(rand(500, 1300));
                    //click(randomize(updBtn, 5));
                }
            }
        }
    }
    if (counter == cyclesToUpd)
    {
        cyclesToUpd = rand(minCyclesCount, maxCyclesCount);
        counter = 0;
        click(randomize(updBtn, 5));
        sleep(rand(500, 1300));
        click(randomize(updBtn, 5));
    }

    counter++;

    sleep(50);
}
На этом все! Скрипт полностью рабочий и протестирован лично мной в игре. Через несколько дней выложу видео с демонстрацией на канале. Свои вопросы по коду можете задать в этом разделе. Приятного использования!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Закрыто