Prikalistiks |
Отправлено: 08 Декабря, 2014 - 08:12:06
|
Прохожий
Покинул форум
Сообщений всего: 3
Дата рег-ции: Май 2014
Репутация: 0
|
Здраствуйте !
Хочу написать бота для игры.
Подделал под себя немного скрипт из RF.
1.Как можно сделать чтобы не искало выбраной области мобов (простой скрипт при движении и на меня наводит хочу это исправить )
2. Как задать движения по карте если действие бить и идти нажатие левой кнопки мишки
только он быет мобов если они в направлении зажатого указателя мишки (в ообщем может хаотично бегать не пойми где а надо движение всегда за определенными координатами (тропинки влево - право вверх вниз) и при этом убивая мобов ( управление только мышкой 1 кнопкой как бегать так и бить)
3. Как за картинкой определить когда бой закончился и выходить нажимая на 5 определенных картинок после всего.
Если у когото есть 5 минуток помогите =)
Вот игра KingsRoad
Вот мой корявый исход который только наводит на все обыекты что двигаются в радиусе координат игры.Если есть возможность помогите с его исправлением и добавление 3 пунктов с верху.
Скрипт (Отобразить)int Cursor=512230239;//Индификатор курсора атаки. Узнать - навести на моба и нажать CTRL+SHIFT+S. Меняется при каждом запуске игры.
int tabX=456, tabY=76, tabColor=4539458;//Координаты и цвет пикселя на табличке выделенного моба. Узнать - навести на табличку и нажать CTRL+SHIFT+S.
int p=50;//Задержка мыши над мобом. Увеличить если курсор цвет не успевает менять.
int lyt=0;//Количество нажатий пробела. Сбор лута. Установить 0 если не нужен лут, так как занимает время.
int Mob_X=3, Mob_Y=5;//Размер крестика который должен быть весь динамичным. (Половинные размеры)
int Raz_Din_X=60, Raz_Din_Y=90;//Полный размер моба (Половинные размеры) В этом объеме больше не искать динамику.
int c_X=739, c_Y=367;//Координаты перса на экране. Примерно центр экрана под ногами.Узнать - навести на точку экрана и нажать CTRL+SHIFT+S
int payza_sravn=100;//Пауза между сравнением изображения игры для индификации очагов динамики. Увеличить если при поиске не находятся все мобы. Не успевает показать все меняющиеся пикселя.
int st_poisk_X=378, st_poisk_Y=276;//Левый верхний угол начала поиска в клиенте.
int fin_poisk_X=1126, fin_poisk_Y=683;//Правый нижний угол окончания поиска в клиенте.
//Размеры 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 ("KingsRoad - Google Chrome", "Chrome_WidgetWin_1", -1);//Указатель на окно игры
if (w!=0)//Игра есть
{
activate(w);//Активировать окно игры
sleep(100);
if (attach(w, 1)!=0)//Присоеденить поток игры для проверки курсора
{
loop: key(ESCAPE);//Нажать esc(все окна убрать если появились)
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);goto loop;}//Если более 20 очагов динамики. Шум. Сравнение повторить.
sort();//Сортировка по растоянию очаг-перс
////////////////Поиск и бой найденых мобов/////////////////////
loop:;
n=0;
ck: if (n<k)//1//Цикл перебора очагов динамики
{
trusit_mouse(x[n], y[n]);//Потрусить мышью, что бы клиент среагировал и поменял курсор если под курсором моб
if (getcursor()==Cursor)//2//Если курсор принял тип атаки(над мобом)
{
mouse (LEFT);//Щелкнуть по мобу мышкой
sleep(50);
goto loop;
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;//Атака была. Счетчик разворота в ноль.
}
else//Сбой. Щелчок был но моб не выделился. Тормознуть перса чтобы не бежал
{
if (st==0){key(UP);st=1;}//Шаг назад(по очереди)
else {key(DOWN);st=0;}//Шаг вперед(по очереди)
}//3
goto loop;
}//2
n++;
goto ck;
}//1
////////////////////////////////////////////////
rz++;
if (rz>1)//Моб не найден 2 круга
{
rz=0;
mouse (MIDDLE);//Клик средней кнопкой. Разворот перса на 180
sleep(1000);
}
sleep(200);
goto loop;
attach(w, 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);
}
/////////////////////////////////////////////////////////////////
function sort()//Сортировка по растоянию
{
int rast, rast1, rsX, rsY, n, n1, t_x, t_y;
n=0;
pr: if (n<k)
{
//////////
n1=k-1;
pr1: if (n1>n)
{
/////////
rsX=x[n1-1]-c_X; rsY=y[n1-1]-c_Y; rast=(rsX*rsX)+(rsY*rsY);
rsX=x[n1]-c_X; rsY=y[n1]-c_Y; rast1=(rsX*rsX)+(rsY*rsY);
if (rast>rast1)
{
t_x=x[n1-1];t_y=y[n1-1];
x[n1-1]=x[n1];y[n1-1]=y[n1];
x[n1]=t_x;y[n1]=t_y;
}
/////////
n1--;
goto pr1;
}
//////////
n++;
goto pr;
}
}
|
|
|
Kibor |
Отправлено: 09 Декабря, 2014 - 07:13:40
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
никак.
только если игнорировать все найденные координаты которые приходятся на место перса.
к примеру так
CODE:
int xxxxx, yyyyy;//тут координаты персонаж. обычно в игре по центру окна
int rX. rY;//растояние от найденной координаты динамики до перса
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);//Получить изображение игры и сравнить с
sort(xxxxx, yyyyy, 200, #x[0], #y[0], 20);
for (int n=0; n<k; n++)
{
rX=x[n]-xxxxx;
if (rX<0)rX=-rX;
rY=y[n]-yyyyy;
if (rY<0)rY=-rY;
if (rX<100 && rY<100)goto oi;//если это перс пропуск
//код
oi:;
}
типа этого |
|
|
|