// Аимбот класса "Школьник"
// Разработчик: Martin 0pc0d3R
// требования: SF 5.3.3
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#include "MemoryHack.h"
#pragma warning (disable:4700)
#pragma warning (disable:4244)
#pragma warning (disable:4018)
SAMPFUNCS *SF = new SAMPFUNCS();
#define GetCurrentDir _getcwd
bool Aimbot = false;
struct AimbotSettings
{
float ResX, ResY;
float FieldOfView = false;
int fSkins[10];
bool AutoActivation = false;
int ActivationMode = 1;
byte HookedKey = 82;
int IgnoredWeapons[13];
AimbotSettings()
{
for (short e = 0; e < 10; e++) fSkins[e] = -1;
for (short ez = 0; ez < 13; ez++) IgnoredWeapons[ez] = 255;
}
};
AimbotSettings cfg;
inline float GetDistance2D(float *first_operand, float *two_operand)
{
return sqrt((two_operand[0] - first_operand[0]) * (two_operand[0] - first_operand[0])
+ (two_operand[1] - first_operand[1]) * (two_operand[1] - first_operand[1]));
}
inline float GetDistance3D(float *first_operand, float *two_operand)
{
return sqrt((two_operand[0] - first_operand[0]) * (two_operand[0] - first_operand[0])
+ (two_operand[1] - first_operand[1]) * (two_operand[1] - first_operand[1])
+ (two_operand[2] - first_operand[2]) * (two_operand[2] - first_operand[2]));
}
WORD FindTargetInRadiusToCrosshair(const float FOV)
{
uint32_t null = *(int*)0xB74490;
null += 0x4;
null = *(int*)null;
std::vector<int> Prioritet;
std::vector<float> Distance;
Prioritet.reserve(139);
Prioritet.assign(139, 255);
Distance.reserve(139);
Distance.assign(139, 5000.0);
for (uint32_t one = 0; one < 35584; one += 0x100)
{
uint32_t two = *(BYTE*)null;
null += 0x1;
if ((two >= 0x00) && (two < 0x80))
{
two += one;
int ID = SF->getSAMP()->getPlayers()->GetSAMPPlayerIDFromGTAHandle(two);
if (SF->getSAMP()->getPlayers()->iIsListed[ID])
{
if (SF->getSAMP()->getPlayers()->IsPlayerDefined(ID, true))
{
if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->iAFKState != 2)
{
float dist[3], mdist[3], screen[2];
for (short x = 0; x < 3; x++)
{
if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->bytePlayerState == PLAYER_STATE_ONFOOT)
dist[x] = SF->getSAMP()->getPlayers()->GetOnFootData(ID)->fPosition[x];
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->bytePlayerState == PLAYER_STATE_DRIVER)
dist[x] = SF->getSAMP()->getPlayers()->GetInCarData(ID)->fPosition[x];
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->bytePlayerState == PLAYER_STATE_PASSENGER)
dist[x] = SF->getSAMP()->getPlayers()->GetPassengerData(ID)->fPosition[x];
}
mdist[0] = PEDSELF->GetPosition()->fX; mdist[1] = PEDSELF->GetPosition()->fY; mdist[2] = PEDSELF->GetPosition()->fZ;
if (GetDistance3D(dist, mdist) <= PEDSELF->GetCurrentWeaponStat()->GetWeaponRange())
{
SF->getGame()->convert3DCoordsToScreen(dist[0], dist[1], dist[2], &screen[0], &screen[1]);
float ScaleX = 640.0, ScaleY = 448.0;
ScaleX /= cfg.ResX; ScaleY /= cfg.ResY;
screen[0] *= ScaleX; screen[1] *= ScaleY;
float crosshair[2] = { 339.1, 179.1 };
float distToTarget = GetDistance2D(crosshair, screen);
if (cfg.FieldOfView >= distToTarget)
{
CVector enemy; enemy.fX = dist[0], enemy.fY = dist[1], enemy.fZ = dist[2];
bool bCollision = GAME->GetWorld()->IsLineOfSightClear(PEDSELF->GetPosition(), &enemy);
if (bCollision == true) continue;
else
{
actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->pSAMP_Actor->pGTA_Ped;
if (actorInfo != nullptr)
{
CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
if (Ped->IsOnScreen() == true)
{
bool contains = false;
int skin = SF->getSAMP()->getPlayers()->pRemotePlayer[ID]->pPlayerData->pSAMP_Actor->pGTA_Ped->base.model_alt_id;
for (short c = 0; c < 10; c++)
if (cfg.fSkins[c] == skin) contains = true;
if (contains == false)
{
Prioritet.insert(Prioritet.begin(), ID);
Distance.insert(Distance.begin(), distToTarget);
}
else continue;
}
else continue;
}
}
}
else continue;
}
else continue;
}
else continue;
}
else continue;
}
else continue;
}
else continue;
}
int iterator = std::distance(Distance.begin(), std::min_element(Distance.begin(), Distance.end()));
if (SF->getSAMP()->getPlayers()->iIsListed[Prioritet[iterator]] &&
SF->getSAMP()->getPlayers()->IsPlayerDefined(Prioritet[iterator], true) &&
SF->getSAMP()->getPlayers()->pRemotePlayer[Prioritet[iterator]]->pPlayerData->iAFKState != 2) return Prioritet[iterator];
else return 65535;
}
void LoadConfig(void)
{
char *path = new char[256];
char *dStr = new char[40];
char *rStr = new char[51];
GetCurrentDir(path, 256);
strcat(path, "\\SAMPFUNCS\\Школотрон.ini");
char *stric = new char[20];
if (GetPrivateProfileSection("Настройки", stric, sizeof(stric), path))
{
cfg.FieldOfView = ((float)GetPrivateProfileInt("Настройки", "Радиус", 45, path));
GetPrivateProfileString("Настройки", "Свои", NULL, dStr, 40, path);
sscanf_s(dStr, "%d|%d|%d|%d|%d|%d|%d|%d|%d|%d", &cfg.fSkins[0], &cfg.fSkins[1], &cfg.fSkins[2], &cfg.fSkins[3],
&cfg.fSkins[4], &cfg.fSkins[5], &cfg.fSkins[6], &cfg.fSkins[7], &cfg.fSkins[8], &cfg.fSkins[9]);
cfg.AutoActivation = (bool)GetPrivateProfileInt("Настройки", "Автоактивация", 0, path);
cfg.ActivationMode = (byte)GetPrivateProfileInt("Настройки", "Поджимной", 0, path);
if (cfg.AutoActivation == true && cfg.ActivationMode == 0) Aimbot = true;
cfg.HookedKey = (byte)GetPrivateProfileInt("Настройки", "Клавиша", 255, path);
GetPrivateProfileString("Настройки", "Игнорируемое", NULL, rStr, 51, path);
sscanf_s(rStr, "%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d", &cfg.IgnoredWeapons[0],
&cfg.IgnoredWeapons[1], &cfg.IgnoredWeapons[2], &cfg.IgnoredWeapons[3], &cfg.IgnoredWeapons[4],
&cfg.IgnoredWeapons[5], &cfg.IgnoredWeapons[6], &cfg.IgnoredWeapons[7], &cfg.IgnoredWeapons[8],
&cfg.IgnoredWeapons[9], &cfg.IgnoredWeapons[10], &cfg.IgnoredWeapons[11], &cfg.IgnoredWeapons[12]);
MemoryHack* mem = new MemoryHack("gta_sa.exe", 32);
mem->Open();
cfg.ResX = static_cast<float>(mem->Read(0xC17044, 4).toINT32());
cfg.ResY = static_cast<float>(mem->Read(0xC17048, 4).toINT32());
mem->Close();
}
else
{
WritePrivateProfileString("Настройки", "Радиус", "150", path);
WritePrivateProfileString("Настройки", "Свои", "-1|-1|-1|-1|-1|-1|-1|-1|-1|-1", path);
WritePrivateProfileString("Настройки", "Автоактивация", "0", path);
WritePrivateProfileString("Настройки", "Поджимной", "0", path);
WritePrivateProfileString("Настройки", "Клавиша", "82", path);
WritePrivateProfileString("Настройки", "Игнорируемое", "255|255|255|255|255|255|255|255|255|255|255|255|255", path);
}
delete[] path, stric, dStr, rStr;
}
void __stdcall mainloop( void )
{
static bool init = false;
if(!init)
{
if (GAME == nullptr) return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return;
if (!SF->getSAMP()->IsInitialized()) return;
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255, 255, 255), "{F5B800}Школьный аим {00B88A}by 0pc0d3R");
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255, 255, 255), "{FFDB70}Специально для портала {00F53D}Silent-Hack.Ru");
init = true; LoadConfig();
}
else
{
if (SF->getSAMP()->getPlayers()->pLocalPlayer->iIsActive == 1 && SF->getSAMP()->getInput()->iInputEnabled == 0)
{
if (cfg.ActivationMode == 0 && SF->getGame()->isKeyPressed(cfg.HookedKey))
{
if (Aimbot ? false : true)
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(148, 112, 255),
"{CCFF33}ШколоАИМ {8AB800}Включен!");
else SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(148, 112, 255),
"{CCFF33}ШколоАИМ {FF3366}Выключен.");
Aimbot ^= true;
}
if (cfg.ActivationMode == 1)
{
if (SF->getGame()->isKeyDown(cfg.HookedKey)) Aimbot = true;
else Aimbot = false;
}
if (Aimbot == true)
{
for (short r = 0; r < 13; r++)
{
if (cfg.IgnoredWeapons[r] == SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon) return;
}
if (SF->getGame()->isKeyPressed(0x01))
{
byte cam = SF->getSAMP()->getPlayers()->pLocalPlayer->aimData.byteCamMode;
if (cam != 53 && cam != 55 && cam != 65 && cam != 7 && cam != 39) return;
WORD vID = FindTargetInRadiusToCrosshair(cfg.FieldOfView);
CVector vector, vPos; if (vID == 65535) return;
if (PEDSELF->GetWeapon(PEDSELF->GetCurrentWeaponSlot())->GetState() == WEAPONSTATE_RELOADING) return;
actor_info* actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[vID]->pPlayerData->pSAMP_Actor->pGTA_Ped;
if (actorInfo != nullptr)
{
CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
Ped->GetTransformedBonePosition(BONE_UPPERTORSO, &vPos);
}
CVector *src = GAME->GetCamera()->GetCam(GAME->GetCamera()->GetActiveCam())->GetSource();
CCam *pCam = GAME->GetCamera()->GetCam(GAME->GetCamera()->GetActiveCam());
vector.fX = src->fX - vPos.fX;
vector.fY = src->fY - vPos.fY;
vector.fZ = src->fZ - vPos.fZ;
float ax, az, fz, fx;
float *screenAspectRatio = (float *)0xC3EFA4;
float *crosshairOffset = (float *)0xB6EC10;
if (pCam->GetMode() == 53 || pCam->GetMode() == 55)
{
float mult = tan(pCam->GetFOV() * 0.5f * 0.017453292f);
fz = M_PI - atan2(1.0f, mult * ((0.5f - crosshairOffset[0] + 0.5f - crosshairOffset[0]) * (1.0f / *screenAspectRatio)));
fx = M_PI - atan2(1.0f, mult * (crosshairOffset[1] - 0.5f + crosshairOffset[1] - 0.5f));
}
else fx = fz = M_PI / 2;
float dist = sqrt(vector.fX * vector.fX + vector.fY * vector.fY);
ax = atan2f(vector.fY, -vector.fX) - M_PI / 2;
az = atan2f(dist, vector.fZ);
float xVec = -(ax - fx);
float zVec = (az - fz);
pCam->SetDirection(xVec, zVec);
}
}
}
}
}
bool WINAPI DllMain( HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved )
{
switch ( dwReasonForCall )
{
case DLL_PROCESS_ATTACH:
SF->initPlugin( mainloop, hModule );
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}