[CSN:Z/CSOL] Базовый hitbox-based аимбот

Участник
Статус
Оффлайн
Регистрация
28 Янв 2019
Сообщения
552
Реакции[?]
192
Поинты[?]
1K
Приветствую. В связи с детектом моего чита и нежеланием заниматься дальнейшей его разработкой решил поделиться недоведённым до ума аимботом своего авторства (спасибо Hardee за некоторую оказанную помощь). Коль найдутся желающие, доделают. Хотя и сейчас работает неплохо, но наведение идёт только на голову. Кушайте.

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();
}
Эта функция нужна вот для чего: в CSN:Z/CSOL разные модели имеют разные хитбоксы. К примеру: у мужского персонажа голова - 11-ый, у женского же 11-ый - то ли плечо, то ли ещё что. С зомби вообще всё плохо. Потому пришлось писать эту примочку.
Код:
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;
}
Функция из читов на 1.6, но немного исправленная.
Код:
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;
        }
    }
}
Думаю, с получением хитбоксов, тимы игроков и прочего проблем не возникнет. Всё как с CS 1.6.
 
Сверху Снизу