Понедельник, 29.04.2024, 01:19 | Heaven of cheats for you. | Ваш браузер может отображать сайт некорректно, используйте Microsoft Internet Explorer v8.0
Сегодня я расскажу вам как сделать простой и достаточно эффективный автоприцел для этого мультиплеера.
Как известно многие люди сильно устают, целясь вручную, нервничают и получают психические и физиологические расстройсва прокачивая скилл. Вам же ничего этого делать не нужно,а если нужно, то стали бы вы читать это =)?.Программа будет целится за вас, вы насладитесь любимой игрой и сбережете силы для более полезной деятельности. Итак приступим.
Необходимые инструменты: -Компилятор С++(Автором используется MS Visual C++ 6.0)
Надеюсь вы уже разобрались как создавать dll библиотеки, тут все точно также. Создаем новый проект. Удаляем весь код из <yourprojectname>.cpp и вставляем:
Код нашего аймбота будет находиться в процедуре main. Что же там должно быть? Для того чтобы писать код дальше необходимо смоделировать процесс прицеливания, понять как он происходит в игре. Сначала найдем адреса где хранятся углы поворота камеры в памяти игры.
Угол по оси X (вправо-влево) в радианах = 0xB6F258; Угол по оси Y (вверх-вниз) в радианах = 0xB6F248;
Запишите туда с помощью редактора памяти какие-нибудь числа и заморозьте их. Вы увидите что игрок по нажатию на правую кнопку мыши целится только в одну точку. Нам же нужно чтобы ей был наш противник. Т.е нужно рассмотреть 2 точки в пространстве: место откуда будет лететь пуля и место куда она будет лететь. В нашем случае это позиции игроков 1 и 2. Где мы являемся игроком 1, а противник - игроком 2. Делать будем в 2 этапа, отдельно для каждого адреса. Сначала разберемся с углом, лежащем в 0xB6F258. Посмотрите на изображение. На нем показана плоскость в которой игрок двигает камеру по оси X :
Нам необходимо получить вектор от игрока 1 к игроку 2 относительно глобальной игровой системы координат. Как видно из картинки он будет равен sqrt((x1-x2)^2+(y1-y2)^2).Где x1,y1,x2,y2 – позиции игроков. Чтобы записать его в память нам нужно найти угол в радианах. Для этого воспользуемся функцией arccos. Сразу скажу. что следующее может быть спорно ,т.к мои представления о тригонометрии далеки от реальности =). Пишем arccos(Aa\Ac) и получаем требуемый угол. Но не спешите, взгляните на следующую картинку:
Дело в том, что взаимное расположение игроком относительно системы координат может быть разным , если наша программа будет вычислять угол только по формуле a = arcos(Aa\Ac), мы получим аймбот работающий неверно в 3х случаях из 4х. Вот они:
Составим формулы для каждого случая отдельно. 1) x1 > x2 && y1 < y2 – a = -arccos(Aa/Ac); 2) x1 > x2 && y1 > y2 – a = arccos(Aa/Ac); 3) x1 < x2 && y1 > y2 – a = arcsin(Aa/Ac) + 3.14/2; 4) x1 < x2 && y1 < y2 – a = -(arcsin(Aa/Ac) + 3.14/2);
Итак, цель достигнута - во всех случаях программа работает корректно. Теперь мы можем написать аймбот, который будет водить прицел вправо и влево за игроком. На этом можно остановиться, но скорее всего вы хотите, чтобы программа помогала целился и вверх-вниз. Тогда смотрим следующее изображение:
Тут все абсолютно также, только меняются оси. Необходимо найти вектор Az, для этого рассматриваем прямые Ax = (z1-z2) и Aс = sqrt((x1-x2)^2+(y1-y2)^2). Вычисляем Az, Az = sqrt(Ac^2+Az^2). Находим угол b, b = arccos(Ax/Az);
Далее рассматриваем всего 2 случая, когда игрок 1 выше, чем игрок 2, и игрок 1 находится ниже игрока 2.
z1 > z2 – b = -arccos(Ax/Az); z1 < z2 - b = arccos(Ax/Az);
Почти готово =), осталось только представить все это на языке программирования.
Возвращаемся к проекту и подключаем заголовочные файлы:
#include "stdafx.h"// или собственный. #include <windows.h> #include <math.h>
Пишем в main:
DWORD* pTarget = (DWORD*)0xB6F3B8;// указатель на то что под прицелом. DWORD* pActor = (DWORD*)0xB6F5F0;// указатель на вашего персонажа. DWORD* pCamera = (DWORD*)0xB6F99C;// указатель на камеру. float* camXpos = (float*)0xB6F258;// угол камеры вправо-влево. float* camYpos = (float*)0xB6F248;// угол камеры вверх-вниз.
Объявляем бесконечный цикл:
while(1){ //далее пишем здесь. Sleep(10);//задержка, чтобы не перегружать процессор. }
В его тело вбиваем несколько условий при которых наш аймбот будет работать:
if(*pActor > 0)// если игра загружена. { char* pVehicle = (char*)((*pActor) + 0x46C); if(*pVehicle != 1) //если игрок не в машине. { //далее пишем здесь. } }
Далее производим все вычисления, код представлен как пример, ваша запись вычислений может отличаться:
float Aa = fabs(xPoint-xPos2a); float Ab = fabs(yPoint-yPos2a); float Ax = fabs(zPoint-zPos2a); float Ac = sqrt(Aa*Aa+Ab*Ab); float Az = sqrt(Ac*Ac+Az*Az);
//при записи в адрес памяти делаем некоторую корректировку, разную для каждого оружия. Представлена корректировка для desert eagle, я находил ее опытным путем.
*camXpos = beta+0.0389; *camYpos = delta-0.1;
Компилируем, инжектим и наслаждаемся игрой, руки скажут вам спасибо. =)