legro0303 |
Отправлено: 19 Июля, 2020 - 22:44:18
|
Наблюдатель
Покинул форум
Сообщений всего: 36
Дата рег-ции: Июль 2020
Репутация: 0
|
Zireael пишет: CODE:string s = "990.123 550.7035 1234.01";
string result[3];
if(regexsearch(sizearray(result), #result[0], s, "\d+(\.\d+)*")>0)
{
double X = formatsn(result[0]);
double Y = formatsn(result[1]);
double Z = formatsn(result[2]);
messagebox(X);
messagebox(Y);
messagebox(Z);
}
Огромное спасибо, теперь я смогу двигаться дальше. Хочу сделать бота для ММОРПГ. Пока что он распознает координаты на экране и помещает их в переменные типа double. Теперь мне нужно чтобы координаты считывались с экрана каждые ~5секунд и в зависимости от полученных координат нажимать клавиши на клавиатуре, не подскажете как можно это реализовать ?
Пример: X:11.22 Y:33.44 Z:55.66
Алгоритм действий:
1. Координаты X =11.22 Y =33.44 Z = 55.66?
Если да, то шаг 2, если нет, то нажать клавишу "0"(персонаж использует телепорт и окажется на необходимых для старта координатах)
2. Нажать клавишу "3" на верхней части клавиатуры (необходимо для вызыва питомца персонажа, чтобы быстрее передвигаться)
3. Нажимаем по клавише "W" (чтобы персонаж начал двигаться вперёд)
4. Координаты X =22.33 Y =33.44 Z = 55.66?
Если да, то шаг 5, если нет, то продолжать движение (Продолжать жать кнопку "W"
5. Жмем на клавишу "D" на 2 секунды (необходимо для поворота персонажа направо, т.к. на координатах X =22.33 Y =33.44 Z = 55.66 находится дерево которое нужно объехать_
и так далее до прохождения к необходимым координатам
Вот в чем заключается сам вопрос
Я посмотрел ролик о создании визуальном редакторе кода. Допустим я создам необходимый алгоритм, как мне в полученный алгоритм притянуть код который вы помогли мне написать ? Тобишь следующие проблемы возникают:
1. Как каждые 5 секунд проверять координаты заново, чтобы отталикиваясь от них делать необходимые действия
2. Как в визуальный редактор засунуть часть кода, где происходит преобразование координат в переменные типа double |
|
|
Zireael |
Отправлено: 19 Июля, 2020 - 22:48:42
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: 1. Как каждые 5 секунд проверять координаты заново, чтобы отталикиваясь от них делать необходимые действия
Добавить таймер Версия 3.33 Добавление функции таймера (код выполняемый по времени)
Цитата: 2. Как в визуальный редактор засунуть часть кода, где происходит преобразование координат в переменные типа double
Добавить блок кода или функцию. |
|
|
legro0303 |
Отправлено: 19 Июля, 2020 - 23:41:32
|
Наблюдатель
Покинул форум
Сообщений всего: 36
Дата рег-ции: Июль 2020
Репутация: 0
|
Zireael пишет: Цитата: 1. Как каждые 5 секунд проверять координаты заново, чтобы отталикиваясь от них делать необходимые действия
Добавить таймер Версия 3.33 Добавление функции таймера (код выполняемый по времени)
Цитата: 2. Как в визуальный редактор засунуть часть кода, где происходит преобразование координат в переменные типа double
Добавить блок кода или функцию.
Хорошо, попробую.
Подскажите пожалуйста, я сделал условие, что если у меня совпадают координаты, то бот жмет клавишу "0" на верхней клавиатуре. Условие срабатывает, однако клавиша не нажимается. Подозреваю что проблема в том, что окно игры является неактивным. Смотрел примеры и не понял, как получить закодычную переменную "win w", которая является одним из параметров функции sendkey. Не понимаю что нужно указывать в параметрах функции win w=window ("Калькулятор", "CalcFrame", -1);
Что нужно указывать вместо "Калькулятор" и что нужно указывать вместо "CalcFrame"?
Вот мой код :
CODE:string text_KIB;
loadsymbolbase("F:\Games\BOT\text\Новая база.sib");
int size_key_char_KIB=-1;
readtext(NUM | MARK, #text_KIB, 8, -1, -1, -1, -1, -1, -1, 0, -1, 3, 62, 227, 81, -1);
char CTEXT[1000];
strcpy(#CTEXT[0], text_KIB);
//удаляем из массива элементов лишние элементы кроме цифр, точек и пробелов
deletetext(#CTEXT[0], "-");
//преобразуем массив элементов назад в строку чтобы использовать regexsearch
string Lul;
Lul=format(#CTEXT[0]);
double X;
double Y;
double Z;
string result[3];
//ищем координаты и преобразуем их в переменные типа double
if(regexsearch(sizearray(result), #result[0], Lul, "\d+(\.\d+)*")>0)
{
X = formatsn(result[0]);
Y = formatsn(result[1]);
Z = formatsn(result[2]);
messagebox(X);
messagebox(Y);
messagebox(Z);
}
if (X>=999.523) goto m_KIB4;
else goto m_KIB5;
m_KIB5: key_(96, 1, "", 0, 0, 0); goto exit_KIB;
m_KIB4: key_(56, 1, "", 0, 0, 0);
exit_KIB:;
function key_(int k, int m, string text, int pc, int p1, int p2)
{
pause(p1);
if (m==-1)
{
if (size_key_char_KIB==-1)
{
size_key_char_KIB=100;
new char key_char_KIB[size_key_char_KIB+1];
}
int size_key=size(text);
if (size_key_char_KIB<size_key)
{
delete key_char_KIB;
size_key_char_KIB=size_key;
new char key_char_KIB[size_key_char_KIB+1];
}
strcpy(#key_char_KIB[0], text);
for (int n=0; n<size_key; n++){key(key_char_KIB[n]); sleep(pc);}
}
else
{
if (m==1) key(k);
if (m==2) keydown(k);
if (m==3) keyup(k);
}
pause(p2);
} |
|
|
Kibor |
Отправлено: 19 Июля, 2020 - 23:45:39
|
Эксперт
Просматривает форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
legro0303 пишет: Не понимаю что нужно указывать в параметрах функции win w=window ("Калькулятор", "CalcFrame", -1);
Что нужно указывать вместо "Калькулятор" и что нужно указывать вместо "CalcFrame"?
Перейти в вкладку "шпион", навести мышь на окно игры и нажать контл шифт s.
Функция сгенерируется сама.
Для вставки в редактор кликнуть по ней.
небольшое упрощение
CODE:string text_KIB;
loadsymbolbase("F:\Games\BOT\text\Новая база.sib");
int size_key_char_KIB=-1;
readtext(NUM | MARK, #text_KIB, 8, -1, -1, -1, -1, -1, -1, 0, -1, 3, 62, 227, 81, -1);
//удаляем из массива элементов лишние элементы кроме цифр, точек и пробелов
regexreplace(-1, #text_KIB, text_KIB, "-", "");
double X;
double Y;
double Z;
string result[3];
//ищем координаты и преобразуем их в переменные типа double
if(regexsearch(sizearray(result), #result[0], text_KIB, "\d+(\.\d+)*")>0)
{
X = formatsn(result[0]);
Y = formatsn(result[1]);
Z = formatsn(result[2]);
messagebox(X);
messagebox(Y);
messagebox(Z);
}
if (X>=999.523) goto m_KIB4;
else goto m_KIB5;
m_KIB5: key_(96, 1, "", 0, 0, 0); goto exit_KIB;
m_KIB4: key_(56, 1, "", 0, 0, 0);
exit_KIB:;
function key_(int k, int m, string text, int pc, int p1, int p2)
{
pause(p1);
if (m==-1)
{
if (size_key_char_KIB==-1)
{
size_key_char_KIB=100;
new char key_char_KIB[size_key_char_KIB+1];
}
int size_key=size(text);
if (size_key_char_KIB<size_key)
{
delete key_char_KIB;
size_key_char_KIB=size_key;
new char key_char_KIB[size_key_char_KIB+1];
}
strcpy(#key_char_KIB[0], text);
for (int n=0; n<size_key; n++){key(key_char_KIB[n]); sleep(pc);}
}
else
{
if (m==1) key(k);
if (m==2) keydown(k);
if (m==3) keyup(k);
}
pause(p2);
} |
|
|
legro0303 |
Отправлено: 20 Июля, 2020 - 00:36:58
|
Наблюдатель
Покинул форум
Сообщений всего: 36
Дата рег-ции: Июль 2020
Репутация: 0
|
[img](для просмотра ссылки Вам необходимо авторизоваться) /img] Kibor пишет: legro0303 пишет: Не понимаю что нужно указывать в параметрах функции win w=window ("Калькулятор", "CalcFrame", -1);
Что нужно указывать вместо "Калькулятор" и что нужно указывать вместо "CalcFrame"?
Перейти в вкладку "шпион", навести мышь на окно игры и нажать контл шифт s.
Функция сгенерируется сама.
Для вставки в редактор кликнуть по ней.
небольшое упрощение
CODE:string text_KIB;
loadsymbolbase("F:\Games\BOT\text\Новая база.sib");
int size_key_char_KIB=-1;
readtext(NUM | MARK, #text_KIB, 8, -1, -1, -1, -1, -1, -1, 0, -1, 3, 62, 227, 81, -1);
//удаляем из массива элементов лишние элементы кроме цифр, точек и пробелов
regexreplace(-1, #text_KIB, text_KIB, "-", "");
double X;
double Y;
double Z;
string result[3];
//ищем координаты и преобразуем их в переменные типа double
if(regexsearch(sizearray(result), #result[0], text_KIB, "\d+(\.\d+)*")>0)
{
X = formatsn(result[0]);
Y = formatsn(result[1]);
Z = formatsn(result[2]);
messagebox(X);
messagebox(Y);
messagebox(Z);
}
if (X>=999.523) goto m_KIB4;
else goto m_KIB5;
m_KIB5: key_(96, 1, "", 0, 0, 0); goto exit_KIB;
m_KIB4: key_(56, 1, "", 0, 0, 0);
exit_KIB:;
function key_(int k, int m, string text, int pc, int p1, int p2)
{
pause(p1);
if (m==-1)
{
if (size_key_char_KIB==-1)
{
size_key_char_KIB=100;
new char key_char_KIB[size_key_char_KIB+1];
}
int size_key=size(text);
if (size_key_char_KIB<size_key)
{
delete key_char_KIB;
size_key_char_KIB=size_key;
new char key_char_KIB[size_key_char_KIB+1];
}
strcpy(#key_char_KIB[0], text);
for (int n=0; n<size_key; n++){key(key_char_KIB[n]); sleep(pc);}
}
else
{
if (m==1) key(k);
if (m==2) keydown(k);[img]https://imgur.com/a/8SaPzt5[/img]
if (m==3) keyup(k);
}
pause(p2);
}
Благодарю за ответ, собственно говоря получилось как на скриншоте (ссылка на скриншот в самом начале сообщения), нажатия клавиши так и не происходит не могу понять в чем проблема (в условие if x>= программа заходит, проверял с помощью messagebox внутри, который писал сообщение если условие срабатывало)(Отредактировано автором: 20 Июля, 2020 - 00:38:20) |
|
|
Zireael |
Отправлено: 20 Июля, 2020 - 00:45:06
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Указатель на окно неправильно написан.
CODE:win w=window("Teoc", "GAME", -1);
if(w)textout(0, 0, 0, "Окно найдено", 1); // сообщение в левом верхнем углу
else textout(0, 0, 0, "Окно не найдено", 1);
sleep(1000); |
|
|
legro0303 |
Отправлено: 20 Июля, 2020 - 01:03:35
|
Наблюдатель
Покинул форум
Сообщений всего: 36
Дата рег-ции: Июль 2020
Репутация: 0
|
Вроде как окно находит, а клавишу всё равно не прожимает
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]
CODE:string text_KIB;
loadsymbolbase("F:\Games\BOT\text\Новая база.sib");
int size_key_char_KIB=-1;
readtext(NUM | MARK, #text_KIB, 8, -1, -1, -1, -1, -1, -1, 0, -1, 3, 62, 227, 81, -1);
regexreplace(-1, #text_KIB, text_KIB, "-", "");
double X;
double Y;
double Z;
string result[3];
if(regexsearch(sizearray(result), #result[0], text_KIB, "\d+(\.\d+)*")>0)
{
X = formatsn(result[0]);
Y = formatsn(result[1]);
Z = formatsn(result[2]);
}
win w= window ("Teoc", "GAME", -1);
if (X>=999.523){
if(w)
{
textout(0, 0, 0, "Окно найдено", 1); //
sleep(1000);
}
else textout(0, 0, 0, "Окно не найдено, 1);
sendkey('56', w);
} |
|
|
Zireael |
Отправлено: 20 Июля, 2020 - 01:21:04
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: а клавишу всё равно не прожимает
Для начала проверьте работают ли вообще нажатия.
'56' это текст, а 56 код клавиши.
Пример как напечатать текст в блокноте:
CODE:win w = window (-1, "Edit", window (-1, "Notepad", -1));
key(56, 1, 1, w); // нажать цифру 8
key("56", 1, 1, w); // напечатать текст 56
CODE:win w = window (-1, "Edit", window (-1, "Notepad", -1));
sendkey(56, w); // нажать цифру 8
sendkey("56", w); // напечатать текст 56 |
|
|
|