Форум программ AvtoK и Кибор
Kibor Forum English
Автокликеры и боты
Автокликер AvtoK
Программируемый автокликер Кибор
Визуальное создание ботов
Распознавание текста в Кибор
Распознавание простой капчи
Заказать Бот на форуме
Бот для Dark Orbit
Бот для Рулетки. Универсальный
Бот для Warspear Online
Как обойти Frost и т.д.
Бот для Lineage 2. Обход Фроста
Бот для RF Online
Бот для пасьяна Косынка
Бот для На рыбалку в вк
Бот для Три В Ряд
Графический редактор в Кибор
|
|
Поиск ботом мобов на экране.
Часть третья. Использование finddynamic для поиска анимированных 3Д мобов.
На прошлом уроке был рассмотрен скелет программы. Сейчас мы рассмотрим одну из главных составляющих бота, а именно функцию поиска мобов на экране игры.
Будь это простенькая 2Д игрушка нам бы могло вполне хватить простого поиска на экране заранее подготовленных изображений как мы делали на первом уроке. Но поскольку Lineage 2 3Д игра и нам не известны форма и цвет искомых объектов заранее такой способ не подходит.
В любом другом подобном программируемом автокликере это стало бы серьезной и порой неразрешимой проблемой. В Киборе для таких целей есть функция finddynamic. С помощью нее возможен быстрый поиск анимированных объектов на экране внешний вид и цвет которых не известен. Подробное описание этой функции я привел в статье (Поиск мобов в 3Д играх и анимированных изображений), так же смотрите раздел справки посвященный этой функции (Поиск
3Д моделей в играх).
Тут будет рассмотрено как finddynamic применена конкретно в линейке. Про принимаемые параметры Вы должны уже знать.
Как Вы знаете из справки и примера finddynamic используется в два прохода.
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, S_X, S_Y, F_X, F_Y, w);//Сделать снимок экрана.
sleep(payza_sravn);//Выдержать паузу
int k = finddynamic(50, #x[0], #y[0], Mob_X, Mob_Y, Raz_Din_X, Raz_Din_Y, S_X, S_Y, F_X, F_Y, w);//Сделать повторный снимок и сравнить его с прошлым.
Первый вызов делает скрин экрана. После этого выдерживается пауза для того что бы анимация на экране могла сменить свой вид. Опять делается скрин и исходя из введенных параметров отслеживаются все происшедшие изменения. Координаты очагов изменений записываются в переменные x y. Возвращает finddynamic количество найденных очагов.
После вызова этой функции мы располагаем знаниями о всех изменениях на экране и их координатами. Теперь достаточно перебрать в цикле все найденные очаги передвигая над ними мышь с проверкой как реагирует клиент игры на нахождение мыши над объектом. В зависимости от игры отслеживать можно тип курсора если он меняется если навести мышь на моба (RF Online), или появления каких либо рисунков как сделано в Lineage 2. В данном случае мы проверяем на появление маленького кружочка (4. См. рис. урок 1) над мышью который
мы заранее заскринили с помощью встроенного графического редактора и сохранили в файл - признак мыши над мобом. Естественно нет необходимости искать его по всему экрану, поэтому область поиска можно ограничить в пределах рамки (6. См. рис. урок 1).
Реализация. Загрузку рисунка мы пропустим. Это было пройдено на прошлых уроках:
loop:;
//...............
Poisk();//Функция сканирования экрана на поиск изменений
//Тут можно вставить функцию сортировки по расстоянию, что бы первыми проверялись ближние к центру очаги. Смотрите в исходниках бота.
Perebor_Mobov();//Перебор всех измененных участков
//...............
goto loop;
//Функции
function Poisk()//Функция сканирования экрана на поиск изменений
{
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, S_X, S_Y, F_X, F_Y, w);//Сделать снимок экрана.
sleep(payza_sravn);//Выдержать паузу
k = finddynamic(50, #x[0], #y[0], Mob_X, Mob_Y, Raz_Din_X, Raz_Din_Y, S_X, S_Y, F_X, F_Y, w);//Сделать повторный снимок и сравнить его с прошлым. Записать в x y координаты очагов изменений, в k их количество.
}
function Perebor_Mobov()//Перебор всех измененных участков
{
int n=0;
ck: if (n<k)//Цикл перебора
{
mousemove(x[n], y[n], w);//Перемещаем мышь на мотенциального моба
sleep(200);//Пауза что бы успели появиться кружки
if (findimage(1, #Vid_Mob[0][0], 0, #V_M_X[0], #V_M_Y[0], x[n]-80, y[n]-100, x[n]+80, y[n], w)==1)//Поиск кружочков на экране в пределах рамки относительно позиции мыши
{
mouse(LEFT, x[n], y[n], 0, w);//Если найден - кликнуть мышью на мобе
//..................... Проверка есть ли моб в таргете, его атака, сбор лута..
}
n++;
goto ck;
}
}
|
Функция поиска мобов на радаре так же использует функцию finddynamic
Предыдущий урок Следующий урок |