Chipyhaster |
Отправлено: 22 Ноября, 2023 - 01:38:32
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Сент. 2023
Откуда: Украина
Репутация: 0
|
Zireael пишет: int coord[4] = {1514, 741, 1560, 788}; // область поиска - здесь Я понял что это верхний левый угол и правый нижний.
Zireael пишет: int size_object[4] = {10, 10, 10, 10}; // размеры и объём объекта - вот здесь не понял что за размеры и какой объем. Это размер самой "змейки" и её объём?(Отредактировано автором: 22 Ноября, 2023 - 01:51:47) |
|
|
Chipyhaster |
Отправлено: 22 Ноября, 2023 - 15:16:10
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Сент. 2023
Откуда: Украина
Репутация: 0
|
GreatProgram пишет: Chipyhaster пишет:
если этой "цветной змейки" вокруг - нет, тогда бот прожимал кнопку 4
Ну так пойти от обратного: сделать проверку на отсутствие этого Уробороса в нужных координатах, например через ScanPixel. Проверять есть ли серый пиксель, если да нажимать 4.
Да, вот это вот сработало:
CODE:int coord[2] = {932, 1028}; // координаты, в которых проверять цвет
int color = 527368; // цвет
int r = 5; // отклонение в цвете от 0 до 255
{
if(scanpixel(coord[0], coord[1], color, r,r,r,r,r,r, -1)==1) // если цвет найден
{
key(52); // нажать клавишу 4
sleep(1000);
}
}
p.s. нашёл по поиску этот пример от Zireael, спасибо вам |
|
|
Chipyhaster |
Отправлено: 26 Ноября, 2023 - 06:10:06
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Сент. 2023
Откуда: Украина
Репутация: 0
|
С помощью таймера настроил ребаф перед поиском моба, но почему то он "то бафается, то нет". Перед запуском бота он всегда юзает баф, но потом он живёт своей жизнью, и юзает баф когда ему захочется. Подскажите, может Я где-то накосячил?
CODE:int нуженЛиРебаф=1;
enabletimer(0);
CREATE_TIMER(0, 2100000) // ребаф каждые 210 секунд
{нуженЛиРебаф=нуженЛиРебаф+1;
}
function Poisk_mob()//Искать мобов
{
if(нуженЛиРебаф>0){
нуженЛиРебаф=0;
pause (1000);
key (53);
pause (3000);
}
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, st_poisk_X, st_poisk_Y, fin_poisk_X, fin_poisk_Y, w);//Получить изображение игры
sleep(payza_sravn);//Пауза между сравнением для поиска изменений
k=finddynamic(21, #x[0], #y[0], Mob_X, Mob_Y, Raz_Din_X, Raz_Din_Y, st_poisk_X, st_poisk_Y, fin_poisk_X, fin_poisk_Y, w);//Получить изображение игры и сравнить с прошлым. Получить координаты динамичных очагов.
if (k>20){sleep(200);return -1;}//Если более 20 очагов динамики. Шум. Сравнение повторить.
return 0;
} |
|
|
Zireael |
Отправлено: 26 Ноября, 2023 - 10:56:53
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: 2100000) // ребаф каждые 210 секунд
Лишний 0.
210 * 1000 = 210000.
Цитата: но потом он живёт своей жизнью
Например, если функция поиска моба вызывается раз в 10 минут, то никакого толку что в таймере переменной присвоено значение. Проверится оно только когда будет вызывана функция поиска моба.
Проще действия для ребафа переместить в таймер.
CODE:enabletimer(0);
pause(100);
sendtimer(0, 5000); // меняем время таймера
loop()sleep(10);
CREATE_TIMER(0, 10)
{
// тут нужный код для ребафа
kiborlog (0, "Ребаф", 0, 0, 250, 250);
} |
|
|
Chipyhaster |
Отправлено: 26 Ноября, 2023 - 22:36:49
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Сент. 2023
Откуда: Украина
Репутация: 0
|
Zireael пишет: Лишний 0.
210 * 1000 = 210000.
Спасибо.
Я заметил что на слабом компе баф срабатывает не всегда, а на норм железе - всё работает как надо.
Zireael пишет: Например, если функция поиска моба вызывается раз в 10 минут, то никакого толку что в таймере переменной присвоено значение. Проверится оно только когда будет вызывана функция поиска моба.
Проще действия для ребафа переместить в таймер.
Функция моба вызывается постоянно.
В том то и дело что надо ребафать именно перед поиском моба, если во время боя подойдёт время таймера и он прожмёт кнопку, то сам перс может не бафнутся, надо что бы был не в бою.
(Добавление)
Подскажите пожалуйста, в какой-то момент персонаж может просто остановится и не начинать поиск мобов. То есть Я запустил, бот какое-то время начинал поиск мобов, потом атаку и так далее, но через какое-то время может "встать в паузу" и ничего не делать. Вот лог с отладчика который он спамит в этот момент. Может кто-то подскажет в чём здесь проблема?
CODE:rz ++
if ( rz > 1 )
sleep ( 200 )
key ( ESCAPE )
if ( Poisk_mob ( ) == - 1 )
if ( нуженЛиРебаф > 0 )
finddynamic ( 0 , # x [ 0 ] , # y [ 0 ] , 0 , 0 , 0 , 0 , st_poisk_X , st_poisk_Y , fin_poisk_X , fin_poisk_Y , w )
sleep ( payza_sravn )
k = finddynamic ( 31 , # x [ 0 ] , # y [ 0 ] , Mob_X , Mob_Y , Raz_Din_X , Raz_Din_Y , st_poisk_X , st_poisk_Y , fin_poisk_X , fin_poisk_Y , w )
if ( k > 30 )
return 0
sort ( c_X , c_Y , # x [ 0 ] , # y [ 0 ] , k )
n = 0
if ( n < k ) (Отредактировано автором: 26 Ноября, 2023 - 22:39:22) |
|
|
Light |
Отправлено: 16 Января, 2024 - 13:41:40
|
Прохожий
Покинул форум
Сообщений всего: 2
Дата рег-ции: Янв. 2024
Репутация: 0
|
Kibor пишет: Данный скрипт реализует бот для игры RF Online.
Видео работы этого бота: видео 1, видео 2 и видео 3
Код скрипта:
CODE:/*Бот для RF Online. Для фришек. Тестировалось на pvpwar.net.
Игра в окне. Разрешение игры 1024/768. Всю анимацию и эфекты отключить. Вид подбирать сверху с уклоном примерно 45. Зависит от мобов и ситуации.
Чем выше камера, тем точнее сортировка по растоянию. Удаление камеры в несколько раз больше стандарта
Положение таблички таргета - стандартное по середине.
Выбрать управление - клавиатура. На экране все закрыть что можно. Чат свернуть. Панель быстрого доступа тоже можно свенуть*/
int Cursor=100204663;//Идентификатор курсора атаки. Узнать - навести на моба и нажать CTRL+SHIFT+S. Меняется при каждом запуске игры.
int tabX=460, tabY=74, tabColor=4671042;//Координаты и цвет пикселя на табличке выделенного моба. Узнать - навести на табличку и нажать CTRL+SHIFT+S.
int p=50;//Задержка мыши над мобом. Увеличить если курсор цвет не успевает менять.
int lyt=5;//Количество нажатий пробела. Сбор лута. Установить 0 если не нужен лут, так как занимает время.
int Mob_X=3, Mob_Y=5;//Размер крестика который должен быть весь динамичным. (Половинные размеры)
int Raz_Din_X=50, Raz_Din_Y=70;//Полный размер моба (Половинные размеры) В этом объеме больше не искать динамику.
int c_X=512, c_Y=416;//Координаты перса на экране. Примерно центр экрана под ногами.Узнать - навести на точку экрана и нажать CTRL+SHIFT+S
int payza_sravn=500;//Пауза между сравнением изображения игры для индификации очагов динамики. Увеличить если при поиске не находятся все мобы. Не успевает показать все меняющиеся пикселя.
int st_poisk_X=27, st_poisk_Y=146;//Левый верхний угол начала поиска в клиенте.
int fin_poisk_X=974, fin_poisk_Y=530;//Правый нижний угол окончания поиска в клиенте.
//Размеры Mob_X/Mob_Y и удаление камеры от перса подобрать так, чтоба в очаги не попадал лут и трава. Мобы должны попадать все.
//Размеры Raz_Din_X/Raz_Din_Y подобрать так, чтоб на каждый моб было по одной координате. Зависит от удаления камеры и размеров моба.
int x[21], y[21];//Масивы для координат центров крестиков Mob_X\Mob_Y динамичных очагов
int st=0;//Переключатель для смены (шаг вперед - шаг назад) Для торможения перса
int rz=0;//Счетчик пустых кругов. Кода не найден моб. Для разворота на 180 градусов
int k;//Количество найденых очагов динамики
int n, l;//Вспомогательные
/////////////////////////////////////////////
win w=window ("RF Online", "D3D Window", -1);//Указатель на окно игры
if (w==0)//Игра есть
{
messagebox ("Запустите игру.");
goto er;
}
activate(w);//Активировать окно игры
sleep(500);
if (attach(w, 1)!=0)//Присоеденить поток игры для проверки курсора
{
lo: key(ESCAPE);//Нажать esc(все окна убрать если появились)
if (Poisk_mob()==-1)goto lo;//Искать мобов
sort(c_X, c_Y, #x[0], #y[0], k);//Сортировка по растоянию очаг-перс
////////////////Поиск и бой найденых мобов/////////////////////
n=0;
ck: if (n<k)//1//Цикл перебора очагов динамики
{
trusit_mouse(x[n], y[n]);//Потрусить мышью, что бы клиент среагировал и поменял курсор если под курсором моб
if (getcursor()==Cursor)//2//Если курсор принял тип атаки(над мобом)
{
mouse (LEFT);//Щелкнуть по мобу мышкой
sleep(50);
if (Mob_naiden()==-1)//Проверка наличия моба в таргете и бой и сбор лута
{//Если нет в таргете (ошибка) тормозим что бы не бежал перс
if (st==0){key(UP);st=1;}//Шаг назад(по очереди)
else {key(DOWN);st=0;}//Шаг вперед(по очереди)
}
goto lo;
}//2
n++;
goto ck;
}//1
////////////////////////////////////////////////
rz++;
if (rz>1)//Моб не найден 2 круга
{
rz=0;
mouse (MIDDLE);//Клик средней кнопкой. Разворот перса на 180
sleep(1000);
}
sleep(200);
goto lo;
}
attach(w, 0);//Отсоединить поток
er:;
//////////////ФУНКЦИИ//////////////
function Mob_naiden()//Проверка наличия моба в таргете и бой и сбор лута
{
if (getcolor(tabX, tabY, w)==tabColor)//3//Если появилось окошко наверху что моб выделен
{
boi: key(SPACE);//Нажать пробел
sleep(50);
if (getcolor(tabX, tabY, w)==tabColor) goto boi;//Пока есть окошко нажимать пробел
l=0;
ty: if (l<lyt){key(SPACE);sleep(300); l++; goto ty;}//Сбор лута
rz=0;//Атака была. Счетчик разворота в ноль.
return 0;
}
return -1;
}
/////////
function Poisk_mob()//Искать мобов
{
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, st_poisk_X, st_poisk_Y, fin_poisk_X, fin_poisk_Y, w);//Получить изображение игры
sleep(payza_sravn);//Пауза между сравнением для поиска изменений
k=finddynamic(21, #x[0], #y[0], Mob_X, Mob_Y, Raz_Din_X, Raz_Din_Y, st_poisk_X, st_poisk_Y, fin_poisk_X, fin_poisk_Y, w);//Получить изображение игры и сравнить с прошлым. Получить координаты динамичных очагов.
if (k>20){sleep(200);return -1;}//Если более 20 очагов динамики. Шум. Сравнение повторить.
return 0;
}
//////////
function trusit_mouse(int tx, int ty)//Потрусить мышью, что бы клиент среагировал и поменял курсор если под курсором моб
{
mousemove(tx+st_poisk_X+1, ty+st_poisk_Y, w);sleep(p);
mousemove(tx+st_poisk_X-1, ty+st_poisk_Y, w);sleep(p);
mousemove(tx+st_poisk_X, ty+st_poisk_Y+1, w);sleep(p);
mousemove(tx+st_poisk_X, ty+st_poisk_Y-1, w);sleep(p);
mousemove(tx+st_poisk_X, ty+st_poisk_Y, w);sleep(p);
}
/////////////////////////////////////////////////////////////////
К сожалению данный код не работает. Есть ли у кого рабочий. Или кто может помочь с этим? |
|
|
|