Boa noite, senhores.
Minha primeira contribuição mais voltada aos hacks uashas..
Estive brincando com aimbot e a função de pegar o jogador mais próximo pela distância entre os jogadores me pareceu um pouco problemática... pq as vezes vc queria mirar em alguem e não conseguia pq a mira sempre ia pro mais proximo...
Decidi modificar de modo que agora o "jogador" mais próximo é considerado em relação a linha imaginária de visão da câmera... ou seja, pra onde vc tá olhando... ele verifica qual jogador que "muda menos" o seu angulo de visão e mira nele...
Segue aí o código:
Espero que seja útil.. Desculpem mas não sei que é o autor original da função em que me baseei para fazer essa...
Agradecimentos vão @
Black Diamond por postar o endereço correto do ClientInfo e me permitir brincar com aimbots..
Code:
int GetClosestPlayer()
{
float fNearest = (float) INT_MAX;
int iAimAt = -1;
float Distance;
float fDistPitch = 0;
float fDistYaw = 0;
GetPlayerByIndex = (lpGetPlayerByIndex) ADDR_PLAYERBYINDEX;
GetLocalPlayer = (lpGetLocalPlayer) ADDR_LOCALPLAYER;
unsigned long ulThis = *(unsigned long *) ADDR_CLIENTINFOMGR;
D3DXVECTOR3 Position;
cPlayerInfo* pPlayer;
cPlayerInfo* pLocal;
pPlayerManager = *(cPlayerMgr **) ADDR_PLAYERMGR;
for (int i = 0; i < 16; i++)
{
pPlayer = GetPlayerByIndex(ulThis, i, 0);
pLocal = GetLocalPlayer(ulThis);
if(pPlayer != 0 && pLocal != 0 && pLocal->Object != 0 && pPlayer->Object != 0 && pPlayer->pIsDead == 0 && pPlayer->Index != pLocal->Index)
{
if(pLocal->pTeam != pPlayer->pTeam)
{
GetAngleToTarget(ObjConv(pPlayer->Object), ObjConv(pLocal->Object), Position);
fDistPitch = pPlayerManager->Pitch - DegToRad(Position[0]);
fDistYaw = pPlayerManager->Yaw - DegToRad(Position[1]);
Distance = sqrt((fDistPitch * fDistPitch) + (fDistYaw * fDistYaw));
//Distance = FindDistance(pPlayer, pLocal);
//if ((Distance / 100) < fNearest)
if (Distance < fNearest)
{
iAimAt = i;
fNearest = Distance;
//fNearest = (Distance / 100);
}
}
}
}
return iAimAt;
}
//versão 2
bom.. decidi criar meu próprio código para mirar no maluco... não muda tanto pois o resultado é o mesmo... porém agora creio ter otimizado algumas coisas e mudei a forma de verificar qual inimigo mirar...
o código é curto mas a teoria é complexa aushuhsa...
mas basicamente oq ele faz é verificar o tamanho da "corda" entre os inimigos e vc... utilizando a distância como raio e o Yaw relativo entre vc e o inimigo para determinar o tamanho da corda e o inimigo de "corda" menor será o mirado...
mesmo assim ainda é possível que aconteçam "bugs" do tipo vc querer mirar alguém e o aimbot mirar outro jogador... mas isso é assim né.. suahuahsuhsa
Code:
double Difference(double v1, double v2)
{
double result = v1 - v2;
if (result < 0) result = result * -1;
return result;
}
double getYaw(D3DXVECTOR3 vTargetPos, D3DXVECTOR3 vCameraPos)
{
double DeltaZ = Difference(vTargetPos.z, vCameraPos.z);
double DeltaX = Difference(vTargetPos.x, vCameraPos.x);
double result = atan2(DeltaX, DeltaZ);
if ((vTargetPos.z >= vCameraPos.z) && (vTargetPos.x >= vCameraPos.x)) { result = result; } //Quad 1
if ((vTargetPos.z < vCameraPos.z) && (vTargetPos.x > vCameraPos.x)) { result = (M_PI) - result; } //Quad 2
if ((vTargetPos.z < vCameraPos.z) && (vTargetPos.x < vCameraPos.x)) { result = (M_PI) + result; } //Quad 3
if ((vTargetPos.z > vCameraPos.z) && (vTargetPos.x < vCameraPos.x)) { result = (result) * -1; } //Quad 4
return (double) result;
}
double getPitch(D3DXVECTOR3 vTargetPos, D3DXVECTOR3 vCameraPos)
{
double DeltaY = Difference(vTargetPos.y + aimbone_y, vCameraPos.y);
double DeltaZ = Difference(vTargetPos.z, vCameraPos.z);
double DeltaX = Difference(vTargetPos.x, vCameraPos.x);
int S;
double Distance = sqrt((DeltaX * DeltaX) + (DeltaZ * DeltaZ));
if (vTargetPos.y > vCameraPos.y) S = -1;
else S = 1;
return (double) ( atan2(DeltaY, Distance) * S );
}
double getYawCircSize(D3DXVECTOR3 vTargetPos, D3DXVECTOR3 vCameraPos, double CameraYaw)
{
double DeltaZ = (vTargetPos.z - vCameraPos.z);
double DeltaX = (vTargetPos.x - vCameraPos.x);
int laps = (int) (CameraYaw / (2 * M_PI));
double remain = (double) CameraYaw - laps;
double RelYaw = Difference(getYaw(vTargetPos, vCameraPos), remain);
double Distance = sqrt((DeltaZ * DeltaZ) + (DeltaX * DeltaX));
return (double) RelYaw * Distance;
}
int GetClosestPlayer()
{
double fNearest = (double) ULLONG_MAX;
int iAimAt = -1;
double circSize;
GetPlayerByIndex = (lpGetPlayerByIndex) ADDR_PLAYERBYINDEX;
GetLocalPlayer = (lpGetLocalPlayer) ADDR_LOCALPLAYER;
unsigned long ulThis = *(unsigned long *) ADDR_CLIENTINFOMGR;
cPlayerInfo* pPlayer;
cPlayerInfo* pLocal;
pPlayerManager = *(cPlayerMgr **) ADDR_PLAYERMGR;
for (int i = 0; i < 16; i++)
{
pPlayer = GetPlayerByIndex(ulThis, i, 0);
pLocal = GetLocalPlayer(ulThis);
if(pPlayer != 0 && pLocal != 0 && pLocal->Object != 0 && pPlayer->Object != 0 && pPlayer->pIsDead == 0 && pPlayer->Index != pLocal->Index)
{
if(pLocal->pTeam != pPlayer->pTeam)
{
circSize = getYaw *(SIC **) Size(ObjConv(pPlayer->Object), ObjConv(pLocal->Object), pPlayerManager->Yaw);
if (circSize < fNearest)
{
iAimAt = i;
fNearest = circSize;
}
}
}
}
return iAimAt;
}
hm... agora q vi.. lembrei.. tava confundindo.. corda é um segmento de reta cujas extremidades pertencem à circunferência.. o que eu estou me referindo como corda... é na verdade simplesmente "arco"...