Понедельник, 29.04.2024, 01:19 | Heaven of cheats for you. | Ваш браузер может отображать сайт некорректно, используйте Microsoft Internet Explorer v8.0

Приветствую Вас Гость

Меню сайта

Форма входа

Категории раздела

Мои статьи

Поиск

Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Мои статьи

Аймбот для MTA: SA
Сегодня я расскажу вам как сделать простой и достаточно эффективный автоприцел для этого мультиплеера.

Как известно многие люди сильно устают, целясь вручную, нервничают и получают психические и физиологические  расстройсва прокачивая скилл. Вам же ничего этого делать не нужно,а если нужно, то стали бы вы читать это =)?.Программа будет целится за вас, вы насладитесь любимой игрой и сбережете силы для более полезной деятельности.
Итак приступим.

Необходимые инструменты:
 -Компилятор С++(Автором используется MS Visual C++ 6.0)


Надеюсь вы уже разобрались как создавать dll библиотеки, тут все точно также. Создаем новый проект. Удаляем весь код из <yourprojectname>.cpp и вставляем:
void main()
{
//тут будет код
}

BOOL APIENTRY DllMain(HINSTANCE hDll, DWORD callReason, LPVOID lpReserved)
{
if(callReason == DLL_PROCESS_ATTACH)
{
 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&main, 0, 0, 0);
}
return 1;
}


Код нашего аймбота будет находиться в процедуре 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 – получаем хз что.
2) x1 > x2 && y1 > y2 – программа работает верно. 
3) x1 < x2 && y1 > y2 – получаем хз что.
4) x1 < x2 && y1 < y2 – получаем хз что.


Составим формулы для каждого случая отдельно.
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) //если игрок не в машине.
         {
                        
//далее пишем здесь.
}
}


Находим координаты 1 игрока:

DWORD* pMtrx1 = (DWORD*)((*pActor) + 0x14);
             float* xPos1 = (float*)((*pMtrx1) + 0x30);
             float* yPos1 = (float*)((*pMtrx1) + 0x34);
             float* zPos1 = (float*)((*pMtrx1) + 0x38);


Координаты камеры: 

     float* CxPos1 = (float*)(0xB6F9CC);
      float* CyPos1 = (float*)(0xB6F9D0);
      float* CzPos1 = (float*)(0xB6F9D4);
     

      float xPoint = *CxPos1;
      float yPoint = *CyPos1;
      float zPoint = *CzPos1;


Затем необходимо найти указатель на 2ого игрока:

DWORD* pPed = (DWORD*) ((*pTarget) + 0x79C); //получаем указатель с указателя
        if(*pPed > 0) //если под прицелом кто-то есть
        {
                         float* pHP = (float*)((*pPed) + 0x540);//указатель на количесво хп игрока
                              if(*pHP > 0){// если игрок живой.
                         
                              
//Следующий код пишем тут.
                               }
                 }


Находим позицию 2ого игрока:

DWORD* pMtrx2 = (DWORD*)((*pPed) + 0x14);
             float* xPos2 = (float*)((*pMtrx2) + 0x30);
             float* yPos2 = (float*)((*pMtrx2) + 0x34);
             float* zPos2 = (float*)((*pMtrx2) + 0x38);
    
             float xPos2a;
             float yPos2a;
             float zPos2a;
             
             xPos2a = *xPos2;
             yPos2a = *yPos2;
             zPos2a = *zPos2;


Далее производим все вычисления, код представлен как пример, ваша запись вычислений может отличаться:

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);
            
float alpha = asin(Aa/Ac);
float beta = acos(Ax/Ac);
float delta = asin(Ax/Az);

 if((*xPos1 > *xPos2)&&(*yPos1 < *yPos2)){beta = -beta;}//1
 if((*xPos1 > *xPos2)&&(*yPos1 > *yPos2)){beta = beta;}//2
 if((*xPos1 < *xPos2)&&(*yPos1 > *yPos2)){beta = (alpha + (3.14/2));}//3
 if((*xPos1 < *xPos2)&&(*yPos1 < *yPos2)){beta = (-alpha - (3.14/2));}//4

 if(*zPos1 < *zPos2){delta = delta;}//1
 if(*zPos1 >= *zPos2){delta = -delta;}//2

//при записи в адрес памяти делаем некоторую корректировку, разную для каждого оружия. Представлена корректировка для desert eagle, я находил ее опытным путем.

*camXpos = beta+0.0389;
*camYpos = delta-0.1;


Компилируем, инжектим и наслаждаемся игрой, руки скажут вам спасибо. =)

Скомпилированная dll для лентяев


Категория: Мои статьи | Добавил: dmitry (17.07.2010)
Просмотров: 2635 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 2
2 waled  
0
thx

1 valera  
0
Дмитрий оставь свой скайп пожалуйста.

Имя *:
Email *:
Код *: