Участник
-
Автор темы
- #1
Приветствую. В связи с детектом моего чита и нежеланием заниматься дальнейшей его разработкой решил поделиться недоведённым до ума аимботом своего авторства (спасибо Hardee за некоторую оказанную помощь). Коль найдутся желающие, доделают. Хотя и сейчас работает неплохо, но наведение идёт только на голову. Кушайте.
HUD_Redraw:
Эта функция нужна вот для чего: в CSN:Z/CSOL разные модели имеют разные хитбоксы. К примеру: у мужского персонажа голова - 11-ый, у женского же 11-ый - то ли плечо, то ли ещё что. С зомби вообще всё плохо. Потому пришлось писать эту примочку.
Функция из читов на 1.6, но немного исправленная.
Думаю, с получением хитбоксов, тимы игроков и прочего проблем не возникнет. Всё как с CS 1.6.
HUD_Redraw:
Код:
for(int i = 1; i < 33; i++)
{
...
CalcFOV(player[i].hitbox[1] - local.eye, player[i].fFov); // да, FOV высчитывается не по хитбоксу головы, а тупо по первому.
...
}
Код:
void CalcFOV(Vector origin, float FOV)
{
float oldAngles[3], newAngles[3];
Vector result;
Engine.GetViewAngles(oldAngles);
VectorAngles(origin, newAngles);
VectorSubtract(oldAngles, newAngles, result);
FOV = result.Length2D();
}
Код:
int CalcBestHitbox(int target)
{
float bestHeight, bestDist = 0.f;
int highestHitboxes[2] = { -1, -1 }, result;
if (target != -1)
{
bestHeight = Engine.GetEntityByIndex(target)->origin.z;
for (int a = 1; a < 12; a++)
{
if (player[target].hitbox[a].z > bestHeight)
{
highestHitboxes[1] = highestHitboxes[0];
highestHitboxes[0] = a;
bestHeight = player[target].hitbox[a].z;
}
}
if (highestHitboxes[0] == -1) return 0;
for (int i = 0; i < 2; i++)
{
if (highestHitboxes[i] == -1)
continue;
float x = player[target].origin.x - player[target].hitbox[highestHitboxes[i]].x;
float y = player[target].origin.y - player[target].hitbox[highestHitboxes[i]].y;
float dist = sqrt(pow(x, 2) + pow(y, 2));
if (bestDist == 0.f) bestDist = dist;
if (dist >= bestDist)
{
bestDist = dist;
result = highestHitboxes[i];
}
}
return result;
}
return 0;
}
Код:
void VectorAngles(const float *forward, float *angles)
{
float tmp, yaw, pitch;
if (forward[1] == 0 && forward[0] == 0)
{
yaw = 0;
if (forward[2] > 0)
pitch = 270;
else
pitch = 90;
}
else
{
yaw = (atan2(forward[1], forward[0]) * 180 / M_PI);
if (yaw < 0)
yaw += 360;
tmp = sqrt(forward[0] * forward[0] + forward[1] * forward[1]);
pitch = (atan2(-forward[2], tmp) * 180 / M_PI);
if (pitch < 0)
pitch += 360;
}
angles[0] = pitch;
angles[1] = yaw;
angles[2] = 0;
while (angles[0] < -89) { angles[0] += 180; angles[1] += 180; }
while (angles[0] > 89) { angles[0] -= 180; angles[1] += 180; }
while (angles[1] < 0) { angles[1] += 360; }
while (angles[1] > 360) { angles[1] -= 360; }
}
Код:
bool FovCheck(float* oldAngles, float* newAngles)
{
float minX = oldAngles[0] - cvar.aim.FOV,
maxX = oldAngles[0] + cvar.aim.FOV,
minY = oldAngles[1] - cvar.aim.FOV,
maxY = oldAngles[1] + cvar.aim.FOV;
if (minY < 0.f) minY += 360.f;
if (maxY > 360.f) maxY -= 360.f;
return (newAngles[0] >= minX
&& newAngles[0] <= maxX
&& newAngles[1] >= minY
&& newAngles[1] <= maxY);
}
Код:
bool isCaptured;
int capturedID = -1;
void Aimbot(int index)
{
if (((player[index].team != local.team && !cvar.aim.friendlyFire) || cvar.aim.friendlyFire) && player[index].updated)
{
if (GetAsyncKeyState(VK_MBUTTON))
{
int aimTarget = -1;
int curHitbox = -1;
float bestFOV = 360.f;
if (player[index].fov < bestFOV)
{
bestFOV = player[index].fov;
aimTarget = index;
}
curHitbox = CalcBestHitbox(aimTarget);
float oldAngles[3], newAngles[3];
Engine.GetViewAngles(oldAngles);
VectorAngles(player[aimTarget].hitbox[curHitbox] - local.eye, newAngles);
if (FovCheck(oldAngles, newAngles) && (capturedID == -1 || capturedID == index))
{
capturedID = index;
isCaptured = true;
Engine.SetViewAngles(newAngles);
}
}
if (!GetAsyncKeyState(VK_MBUTTON) || (isCaptured && !player[capturedID].updated))
{
isCaptured = false;
capturedID = -1;
}
}
}