pachela
-
Постов
154 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные pachela
-
-
3 часа назад, Xipho сказал:
Собственно, если так уж необходимо держать окно в фокусе, никто не может помешать запустить игру с минимальными настройками в виртуалке, и кликер в ней же. И саму виртуалку хоть вообще в headless режиме запускать (только настроить все на автозагрузку).
Даже в режиме оптимизации игра тянет слишком много ресурсов. Но ни это главное.
Я тут вспомнил, Что совсем недавно видел уже видео с подобным ботом, там вот китаец реализовал то, что я хочу. Даже в свернутой игре, бот выполняет все поставленные задачи. Возможно он через драйвер это решил?
-
На просторах интернет вычитал, что если игра защищена чем то вроде "фемиды", то эмуляция клавиш в фоновом режиме ей до одного места. А точнее речь идет не столько о самой фемиде, а о том, что современные ММО ставят проверку на фокус окна?
Т.е. если я пробую тем же AHK или AutoIT и у меня в активном окне кликер работает, а в свернутом нет, то дальше и не мучить яйца, кота, мозги и Шарп, в попытках заставить слать клики в свернутое приложение?
P.s. Пардоньте за кашу, на ногах уже кучу времени, голова стремительно клонится к подушке.
-
10 часов назад, kiwipapayamongoose сказал:
Давно бы уже сделал управление, через память, т.е при нажатии клавиши в памяти изменяются значения, типа 256 нажата клавиша, а 0 опущена, тогда все равно игра в фокусе или нет.
Я об этом думал, но как найти значение клавиш в памяти?
-
Нашел еще вот такой вот ответ, но то ли я сонный, то ли лыжи не едут, не пойму, что к чему.
-
Походу я не загружаю API нужную. Ибо все у меня красное =\.
Можно как нибудь кратно, без лишней воды, но так, что бы было доходчиво, объяснить как эмулировать нажатие клавиши в фоновом приложении, без перенесения на него фокуса.
В гугле доходчивых и полноценных примеров нет. Одни куски, которые ни чему умному научить не могут.
Нажатие в окне на котором фокус, у меня получилось и то, только с бубном в виде InputSimulator
private void button15_Click(object sender, EventArgs e) { inputSimulator.Keyboard.KeyPress(VirtualKeyCode.VK_R); }
Но мне нужно, что бы клавиши клацались в окне без фокуса! Что бы свернул и ушел, а оно работает.
-
В 16.02.2018 в 14:38, Xipho сказал:
Я очень дико извиняюсь, вернулся работать над ботом и дошел до стадии эмуляции клавиш. Увидел вашу ссылочку, а можно теперь для тугодума рассосать каждую строчку?
public static void Send(short Keycode) { INPUT[] InputData = new INPUT[1]; InputData[0].type = 1; InputData[0].ki.wScan = Keycode; InputData[0].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; InputData[0].ki.time = 0; InputData[0].ki.dwExtraInfo = IntPtr.Zero; SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT))); }
по ссылке, вижу ниже комментарий, который гласит, что нужно сначала слать нажатие клавиши, потом отпускание, с небольшой паузой, как это реализуется или просто сначала KeyDown а затем KeyUp? Как я понимаю, это отправка в активное окно? Или в фоновое тоже можно?
-
Так, почему была ошибка в OpenProcess, я понял. Просто почему то опечатался и ввел одинарные кавычки. это поправили и теперь код отчасти работает. Начало просто постоянно выдавать ошибку про время ожидания для присоединения отладчика. Если клацнуть НЕТ, то значение все равно напишет, НО игра через пару секунд вылетает...
В игре античит защищает память от API. Может таким образом отладчик использует это самое API?
-
Почему все время выдает вот такую вот ошибку?
И вот что выдает еще, этого не выдавало...
openProcess('myproc.exe') debugProcess(2) local addressCode = 'myproc.exe+D4BC13' debug_setBreakpoint(addressCode) print(RCX) s = string.format("%08X", RCX) print(s) debug_removeBreakpoint(addressCode) writeToClipboard(s) Ошибка:[string "openProcess('myproc.exe') ..."]:6: bad argument #2 to 'format' (number expected, got nil) Ошибка скрипта
П.С. Я когда спрашивал про создание трейнера без формы, то имел ввиду в CE =). В шарпе это не проблема, проблема в шарпе отладку сделать, я этого еще не умею.
-
Временно решил проблему в Lua Engine (нужно будет перенести в Lua или реализовать как то трейнер =)) вот таким вот кодом:
Спойлерlocal addressCode = 'MyProcc.exe+D4BC13' debug_setBreakpoint(addressCode) print(RCX) s = string.format("%08X", RCX) print(s) debug_removeBreakpoint(addressCode) showMessage(s) writeToClipboard(s)
А в Шарпе я беру с Буфера обмена, добавляю смещение и имею, то что хочу. Но это пока, что для развития, вообще нужно будет думать как это сделать в Шарпе.
Подскажите еще вот что, как сделать форму трейнера или вообще трейнер, что бы при запуске не отображалось окно? Ну типа запустил, оно в фоне клацнуло и закрылось.
-
Собственно задача заключается в следующем:
1. Есть инструкция "movss [rcx+00000378],xmm0" которая располагается по статическому адресу.
2. Мне нужно по средством CE, желательно LUA, что бы можно было использовать в дальнейшем трейнере, прочитать содержимое регистра RCX.
3. К этому значению прибавить 378.
4. Значение RCX записать в переменную 1, значение со смещением записать в переменную 2.
P.s. На C# это сложно реализовать?
-
3 часа назад, Antonshka сказал:
Можно сделать таким алгоритмом:
тут бы не споткнуться через порог, а об чудесах эквилибристики я молчу и подавно.
Да и зачем на столько заморачиваться, если можно сделать хождение по точкам. Сейчас пока что мучаю форму с лист боксом, сохранением результата в тхт и циклами. Но в ближайшем будущем я хочу организовать автозапись в лист бокс координат, через каждые 10 метров. А потом воспроизведение записи по этим точкам и воспроизведение в обратном порядке. Но пока что застрял на цикле поворота и отмера растояния до цели.
А в дальних планах еще и до передвижения добавить боевку. Но вот с эмуляцией нажатий в Шарпе, я еще не знаком. Так что все по мере поступления.
-
Такс, имеем результат!
Перво наперво хочу сказать, что приходится дабл преобразовывать в флоат. Но так, как я использую при записи в память стороннюю библиотеку, в которой запись происходит как стринг, то проблем не возникает =).
Вся запарка была в сторонах! Ведь у меня есть поворот тела от 0 до 6.28 и нет отрицательного числа. И наличие отрицательного числа, меня путало =).
Так же в примере мы переводили градусы в радианты угол, а не полученное значение.
Имею вот такой вот код, это если вдруг понадобится кому. Возможно где и косякнул, но вроде бы пашет =)
Скрытый текстПока что сделано в 2 функции, но функцию нахождения нужного угла, я думаю перенести в отдельный класс(пока что не шарю как).
Первая функция это присвоение переменных и запуск второй функции
private void button7_Click(object sender, EventArgs e) //Жмакаем кнопку и понеслась { X = ReadMemory(addressX); //Сюда считывайте свое текущее положение Х. я написал от балды для примера =) Y = ReadMemory(addressY); //Сюда считываете текущее Y nX = 501.9024963f; //Конечная точка Х nY = -437.4102173f; //Конечная точка Y CalcAngle(); //Запуск функции по калькулированию угла }
Вторая функция это расчет угла
private void CalcAngle() //Функция калькуляции угла { //Section 1 if (nY > Y && nX <= X) { Ydiff = nY - Y; Xdiff = X - nX; // Умножаем на 57.29578 для перевода из радиан в градусы. AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578; tmp = 180 - AngleA; } // Section 2 if (nY <= Y && nX < X) { Ydiff = Y - nY; Xdiff = X - nX; AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578; tmp = 0 + AngleA; } // Section 3 if (nY < Y && nX >= X) { Ydiff = Y - nY; Xdiff = nX - X; AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578; tmp = 360 - AngleA; } // Section 4 if (nY >= Y && nX > X) { Ydiff = nY - Y; Xdiff = nX - X; AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578; tmp = 180 + AngleA; } tmp = tmp / 57.29578; label3.Text = tmp.ToString(); //Если нужно будет преобразовать double в float, то делаем так somevalue = (float) tmp; }
Продолжаем оптимизацию. Хочу теперь перенести функцию калькуляции угла перенести в отдельный класс.
- 2
-
Повылазили косячки, повылазали родные. Что то да делается не так.
Значение всегда в районе 0.8-0.7. Я так подозреваю, что возможно дело все в мат.методе? Я использую Метод Math.Atan (Double).
Сейчас пойду покушаю, сварю кофейку и еще немного покурю. Если ниче не выйдет, выложу сюда то, что есть.
-
Игра на своем движке. И что либо с ней делать, очень тяжело. Всяких защит тут понавешали, мама не горюй =))
-
20 часов назад, temtriss сказал:
P.S. Извеняюсь, что-то не обратил внимания на C# в заголовке, пример на C++ хотя может тоже поможет. Сори.
Из-за того, что я в С++ вообще не бумбум, но вроде бы код предоставленных вами не сильно заморочен, то попытаюсь для начала прочитать его правильно.
Под спойлом приведу ваш же код, но уже с добавленными мной комментариями вопросами.
Скрытый текстint main() { ///Объявляем переменные и присваиваем им нулевое значение? float X = 0; float Y = 0; float nX = 0; float nY = 0; ///Почему следующая переменная полный круг double? И что значит M_PI? или мне это не нужно? double halfcircle = M_PI; // Ввод/Вывод нужной информации cout << "Angel Calculator by Wi11ka" << endl; //Это я тоже не знаю зачем. Какое то значение =) // Проверяем наши переменные cout << "Math PI: " << M_PI << endl; // not needed :D // Получаем нужные значение от пользователя // и сразу же выводим значение для проверки правильности. cout << "Input X:" << endl; //Это Х по факту? cin >> X; cout << "X =" << X << endl; //Сравнивается с чем? Чему должне быть равен Х? cout << "Input Y:" << endl; //Y по факту? cin >> Y; cout << "Y =" << Y << endl; //Чему он должен быть равен? cout << "Input needed X:" << endl; //Х конечной точки? cin >> nX; cout << "Needed X = " << nX << endl; //Чему он должен быть равен? cout << "Input needed Y:" << endl; //Y конечной точки? cin >> nY; cout << "Needed Y = " << nY << endl; //Чему он должен быть равен? // Вызываем функцию Калькулирующую наш угол и выводим результат. float res = CalcAngle(X, Y, nX, nY); cout << "Result: " << res << endl; float fResult = CalcRadians(res); cout << "Finish Result: " << fResult << endl; system("PAUSE"); //Как я понял, мы вызвали функция калькуляции угла и калькуляции окружности и вывели это дело на экран } float CalcAngle(float X, float Y, float nX, float nY) { // Различие между нами и целью по оси X и Y double Xdiff; //Почему в этой функции все переменные double? Я же могу их заменить на float? double Ydiff; // Угол double AngleA; // Времянка :D double tmp; // Разбиваем работу на 4 секции // Section 1 if (nY > Y && nX <= X) { Ydiff = nY - Y; Xdiff = X - nX; // Умножаем на 57.29578 для перевода из радиан в градусы. AngleA = atan(Xdiff / Ydiff) * 57.29578; //В MSDN вижу, что в atan используется double, не возникнет ли конфликта при вычислениях Ydiff и Xdiff //ведь X и Y у нас в флоат, да и значение поворота камеры у меня тоже флоат. tmp = 0 - AngleA; } // Section 2 if (nY <= Y && nX < X) { Ydiff = Y - nY; Xdiff = X - nX; AngleA = atan(Xdiff / Ydiff) * 57.29578; tmp = (180 - AngleA)*-1; } // Section 3 if (nY < Y && nX >= X) { Ydiff = Y - nY; Xdiff = nX - X; AngleA = atan(Xdiff / Ydiff) * 57.29578; tmp = 180 - AngleA; } // Section 4 if (nY >= Y && nX > X) { Ydiff = nY - Y; Xdiff = nX - X; AngleA = atan(Xdiff / Ydiff) * 57.29578; tmp = 0 + AngleA; } return tmp; } float CalcRadians(float angle) { // Возвращаем в радианы angle = angle / 57.29578; return angle; }
Я надеюсь, что хоть приблизительно понял код правильно =)
-
Прочитал ваш пример и теоретически понял его. Осталось перевести в Шарп.
Я правильно понял, что
float CalcRadians(float angle) { // Возвращаем в радианы angle = angle / 57.29578; return angle; }
Вот этот вот "angle" мы впишем в адрес содержащий "6.28"? Т.е. вот этот вот 6.28 и есть угол, который нам нужно изменить?
-
14 часа назад, temtriss сказал:
А мне нужен угол на который повернута камера. И его Мин/Макс значения
Я вот сижу и думаю, на сколько я вчера сильно протупил? Камеру в игре можно поворачивать на 360 градусов по горизонтали и на 180 градусов по вертикали.
Почитал я статейку от немца Алекса, любезно порекомендованную вот в этом посте товарищем 2zolo2, и мне она понравилась. Но только тяжковато воспринимается немецкий даже с переводом =). Теперь вот буду думать как вычислить "идеальный угол" =).
Не. Не 6.14, если я правильно понял что пишет программа, то это xmm4:6.27
-
7 минут назад, temtriss сказал:
Не совсем, FOV - это угол поля зрения. А мне нужен угол на который повернута камера. И его Мин/Макс значения
Вот это вот сложнее вычислить. Хотя у меня есть адрес отвечающий за поворот "тела". Так вот оно от 0 и до 6 в float.
-
Угол обзора это же FOV? Если так, то это 70. А вот в чем измеряется, вот даже я не знаю, нигде не написано, тупо значение и все.
-
Ой. Тут бы сейчас на велосипеде научиться кататься, а за баранку боинга я даже и не думаю.
Пока что пытаюсь реализовать сравнение 2 значений. Теперешний и последний вектора. И если значение теперешнего будет больше, то делать поворот. Пока что попробую так. ДАльше будем смотреть.
В игре то есть маркер и автопуть, но не всегда этот автопуть кратчайший, да и в небе он не нужен =))). А маркер в некоторых ситуациях перестает работать и именно для этих ситуаций и нужен бот.
-
Только что, kiwipapayamongoose сказал:
Может, проще будет задать алгоритм при котором дистанция всегда должна быть меньше текущей пока не станет равна 0?
я подозреваю, что руками тогда будет проще бежать =).
Хочется же тыкнуть одну кнопку и идти пить чай. А он себе летит к нужной точке, а потом мягкая посадочка =)))
Нашел сейчас вот такой вот ответ, но пока что еще не придумал ему применения =)
-
Давайте разберемся для начала с прямой, без каких либо препятствий.
Я вот что подумал, может стоит сравнивать 2 вектора, что бы бот повернул в правильном направлении? Ну т.е. запускаю кнопку и бот едет вперед 20 метров, записывает координаты старта и координаты финиша. Строит вектор и умножает это все в 500-1000 раз. А далее бот сравнивает эти 2 вектора и принимает решение, поворачивать или идти прямо.
Или я не в те дебри лезу?
-
30 минут назад, IzerodayI сказал:
PS я вижу это так : находимся на беспрепятственной прямой и ищем вектор "А" и бежим по вектору к точке (то есть все три вектора могут спокойно меняться(и z тоже)).
Такс, сейчас опробовал это на практике и вижу, что я понял ход ваших мыслей.
Мы берем в цикле считываем X0, Y0, Z0 и вычисляем вектор. Далее делаем сравнение, если вектор увеличивается, то нужно "повернуть", если вектор уменьшатся, то значит правильным путем мы идем.
Но вот как оптимально выбрать самый кратчайший путь? Ведь я могу к примеру повернуть на 5 градусов и до поры, до времени значение будет уменьшаться и только когда угол станет слишком большой, начнет сначала слишком медленно уменьшаться, а в конечном итоге и увеличиваться.
-
12 минуты назад, IzerodayI сказал:
Ну если по прямой , то это просто А = sqrt(x^2+y^2+z^2) так получится пространственный вектор (прямая) от точки твоего персонажа до точки А
PS ну что-то мне подсказывает , что нужно искать не прямой путь )
Ну мы же говорим о читах? Тем более в которых используется ось Z. Т.е. я планирую делать так: Перешел на определенную высоту и дальше по прямой до точки "А", а потом сбрасываем высоту.
Нашел на просторах гугла, что этот математический метод для вычисления корня квадратного. А тем самым мы получим расстояние.
Пример вот такой вот
float deltaX = x1 - x0; float deltaY = y1 - y0; float deltaZ = z1 - z0; float distance = (float) Math.Sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
Хорошо, мы вычислим расстояние. Но как нам повернуть в нужную сторону и двигаться? Ведь я знаю координаты точки "А", но не знаю в какой стороне она находится.
C# навигационный бот или привет математикам...
in Высокоуровневое программирование
Опубликовано
А как это на работе пользователя повлияет? Будет ли мешать мне, к примеру работать в VS или лазить в браузере по ютубам и вконтактам?
Приблизительно это будет так:
API FindWindow, GetForegroundWindow, SetForegroundWindow.
Узнаем дескриптор уже активного окна, узнаем дескриптор окна мишени, устанавливаем фокус на окно мишень, эмулируем нажатие клавиш и возвращаем фокус на прошлое активное окно. Правильно?