• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Нужна помощь с алгоритмом

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
10 Апр 2020
Сообщения
21
Реакции
1
всем привет. По совету человека с форума переписал с нуля весь алгоритм скрипта.

Проблема следующая: я не могу понять принцип передвижения мыши, ибо все время у меня дельта околонулевая (0.005) или же меньше нуля.

Конкретно в recoil::Thread, не могу понять каким образом двигать мышь исходя из animtime.
Писал исходя из материалов на uc(noad). При необходимости пришлю recoil.h с обозначением, но пока не вижу смысла в этом.

recoil.cpp:
Expand Collapse Copy
Math::Vector2 last_shot(0.0f, 0.0f);
Math::Vector2 cur_shot(0.0f, 0.0f);

std::string recoil::CurrentWeaponUID() noexcept {
    return translation[recoil::CurrentWeaponID];
}

int shot_index = 0;
Math::Vector2 recoil::GetDelta() noexcept
{
    if (shot_index >= recoil::coords[recoil::CurrentWeaponUID()].size())
        shot_index = 0;

    cur_shot = {
        recoil::coords[recoil::CurrentWeaponUID()][shot_index].x,
        recoil::coords[recoil::CurrentWeaponUID()][shot_index].y
    };

    Math::Vector2 delta = {
        cur_shot.x - last_shot.x,
        cur_shot.y - last_shot.y
    };

    last_shot = cur_shot;

    shot_index++;

    return delta;
}

int recoil::GetRPM() noexcept {
    std::string weaponUID = recoil::CurrentWeaponUID();
    auto it = RPM.find(weaponUID);
    if (it != RPM.end()) {
        return it->second;
    }

    return 0;
}

float recoil::GetRepeatDelay(int RPM) noexcept {
    return 1000.0f / (RPM / 60.0f);
}

float recoil::GetAnimationTime(Math::Vector2 Delta) noexcept {
    float animation_time = std::sqrt(Delta.x * Delta.x + Delta.y * Delta.y) / 0.02f;

    return animation_time;
}

Math::Vector2 recoil::GetPixel(Math::Vector2 Delta) noexcept {
    float mult = -0.03f * (global::Sensitivity * 2.0f) * (global::FOV / 100.0f);
    float d_x = Delta.x;
    float d_y = Delta.y;

    float p_x = (d_x / mult);
    float p_y = (d_y / mult);

    return Math::Vector2(p_x, p_y);
}

bool recoil::IsHoldingLeft() noexcept {
    return GetAsyncKeyState(VK_LBUTTON) & 0x8000;
}

bool recoil::IsHoldingRight() noexcept {
    return GetAsyncKeyState(VK_RBUTTON) & 0x8000;
}

bool recoil::IsCrouching() noexcept {
    return GetAsyncKeyState(VK_CONTROL) & 0x8000;
}

bool recoil::IsValidWeapon() noexcept {
    return recoil::CurrentWeaponID >= 0;
}

void recoil::Thread() noexcept {
    while (true) {
        if (!recoil::IsValidWeapon()) {
            SleepEx(2, false);
            continue;
        }

        if (!recoil::IsHoldingRight() && !recoil::IsHoldingLeft()) {
            SleepEx(2, false);
            continue;
        }

        Math::Vector2 delta = recoil::GetDelta();
        Math::Vector2 pixel = recoil::GetPixel(delta);

        debug::AddLog("Delta: X=" + std::to_string(delta.x) + " Y=" + std::to_string(delta.y));
        debug::AddLog("Pixel: X=" + std::to_string(pixel.x) + " Y=" + std::to_string(pixel.y));

        int rpm = recoil::GetRPM();
        if (rpm <= 0) {
            SleepEx(2, false);
            continue;
        }

        float delay = recoil::GetRepeatDelay(rpm);
        float anim_time = recoil::GetAnimationTime(delta);

        int sleep_anim = static_cast<int>(anim_time * 1000.0f);
        if (sleep_anim > 0)
            SleepEx(sleep_anim, false);

        mouse::SmoothMove(pixel.x, pixel.y, anim_time);


        float wait_time = delay - anim_time;
        if (wait_time > 0.0f) {
            int sleep_ms = static_cast<int>(wait_time * 1000.0f);
            if (sleep_ms > 0)
                SleepEx(sleep_ms, false);

            timer::Timer t2;
            while (t2.Elapsed() < (wait_time - sleep_ms / 1000.0f)) {
                Sleep(0);
            }
        }
    }
}
 
Назад
Сверху Снизу