Исходник Resolver with layers

Пользователь
Статус
Оффлайн
Регистрация
12 Июн 2019
Сообщения
865
Реакции[?]
127
Поинты[?]
1K
credits:
Пожалуйста, авторизуйтесь для просмотра ссылки.

C++:
#include "includes.h"

LagRecord* c_resolver::FindIdealRecord(AimPlayer* data) {
    LagRecord* first_valid, * current;

    if (data->m_records.empty())
        return nullptr;

    first_valid = nullptr;

    // iterate records.
    for (const auto& it : data->m_records) {
        if (it->dormant() || it->immune() || !it->valid())
            continue;

        // get current record.
        current = it.get();

        // first record that was valid, store it for later.
        if (!first_valid)
            first_valid = current;
        // todo: simv0l: change this fckng best records priority
        if (it->m_shot || it->m_mode == Modes::RESOLVE_AIR)
            return current;
    }

    // none found above, return the first valid record if possible.
    return (first_valid) ? first_valid : nullptr;
}

LagRecord* c_resolver::FindLastRecord(AimPlayer* data) {
    LagRecord* current;

    if (data->m_records.empty())
        return nullptr;

    // iterate records in reverse.
    for (auto it = data->m_records.crbegin(); it != data->m_records.crend(); ++it) {
        current = it->get();

        // if this record is valid.
        // we are done since we iterated in reverse.
        if (current->valid() && !current->immune() && !current->dormant())
            return current;
    }

    return nullptr;
}

void c_resolver::MatchShot(AimPlayer* data, LagRecord* record) {
    // do not attempt to do this in nospread mode.

    float shoot_time = -1.f;

    Weapon* weapon = data->m_player->GetActiveWeapon();
    if (weapon) {
        // with logging this time was always one tick behind.
        // so add one tick to the last shoot time.
        shoot_time = weapon->m_fLastShotTime() + c_csgo::get()->m_globals->m_interval;
    }

    // this record has a shot on it.
    if (game::TIME_TO_TICKS(shoot_time) == game::TIME_TO_TICKS(record->m_sim_time)) {
        record->m_shot = true;
    }
}

void c_resolver::SetMode(LagRecord* record) {
    // the resolver has 3 modes to chose from.
    // these modes will vary more under the hood depending on what data we have about the player
    // and what kind of hack vs. hack we are playing (mm/nospread).

    float speed = record->m_anim_velocity.length();

    // if not on ground.
    if (!(record->m_flags & FL_ONGROUND))
        record->m_mode = Modes::RESOLVE_AIR;

    // if on ground and moving.
    else if (speed > 6.f)
        record->m_mode = Modes::RESOLVE_WALK;

    // if on ground and not moving.
    else
        record->m_mode = Modes::RESOLVE_STAND;
}

void c_resolver::ResolveAngles(Player* player, LagRecord* record) {
    AimPlayer* data = &c_aimbot::get()->m_players[player->index() - 1];

    // mark this record if it contains a shot.
    MatchShot(data, record);

    // next up mark this record with a resolver mode that will be used.
    SetMode(record);


    float EyeDelta = player->m_PlayerAnimState()->m_flEyeYaw - player->m_PlayerAnimState()->m_flGoalFeetYaw;
    bool LowDelta = EyeDelta < 30.f;
    bool HalfDelta = EyeDelta <= 30.f;
    float desync_delta;
    if (HalfDelta)
        desync_delta = player->GetMaxBodyRotation() / 2;
    else if (LowDelta)
        desync_delta = player->GetMaxBodyRotation() / 2.85;
    else
        desync_delta = player->GetMaxBodyRotation();

    // if we are in nospread mode, force all players pitches to down.
    // TODO; we should check thei actual pitch and up too, since those are the other 2 possible angles.
    // this should be somehow combined into some iteration that matches with the air angle iteration.
    float side;
    int shots = data->m_missed_shots;

    float max_rotation = player->GetMaxBodyRotation();

    // setup a starting brute angle.
    float resolve_value = 45.f;
    static float brute = 0.f;

    float eye_yaw = player->m_PlayerAnimState()->m_flEyeYaw;

    // clamp our starting brute angle, to not brute an angle, we most likely can't hit.
    if (max_rotation < resolve_value)
        resolve_value = max_rotation;

    // detect if player is using maximum desync.
    bool m_extending = record->m_layers[3].m_cycle == 0.f && record->m_layers[3].m_weight == 0.f;


    if (record->m_layers[3].m_sequence == 979 && player->m_vecVelocity().length_2d() == 0.f)
    {
        float LbyAngle = player->m_flLowerBodyYawTarget();

        side = (LbyAngle > 0.f) ? -1 : 1;
    }
    else if (player->m_vecVelocity().length_2d() == 0.f)
    {
        side = (EyeDelta > 0.f) ? -1 : 1;
    }
    else
        side = 0;


    if (side == 0)
    {
        switch (data->m_missed_shots % 6) {
        case 0:
            brute = eye_yaw + desync_delta;
            break;
        case 1:
            brute = eye_yaw - desync_delta;
            break;
        case 2:
            brute = eye_yaw + 30;
            break;
        case 3:
            brute = eye_yaw - 30;
            break;
        case 4:
            brute = eye_yaw + 15;
            break;
        case 5:
            brute = eye_yaw - 17;
            break;
        }
    }
    else
    {
        switch (data->m_missed_shots % 6) {
        case 0:
            brute = eye_yaw + desync_delta * side;
            break;
        case 1:
            brute = eye_yaw + desync_delta * -side;
            break;
        case 2:
            brute = eye_yaw - 17;
            break;
        case 3:
            brute = eye_yaw + 19;
            break;
        case 4:
            brute = eye_yaw - 30;
            break;
        case 5:
            brute = eye_yaw + 30;
            break;
        }
    }



    player->m_PlayerAnimState()->m_flGoalFeetYaw = math::NormalizedAngle(brute);
}
 
Начинающий
Статус
Оффлайн
Регистрация
27 Авг 2021
Сообщения
3
Реакции[?]
0
Поинты[?]
0
[ QUOTE= " francyz , post: 2344761, member: 203048 "]
credits:
Пожалуйста, авторизуйтесь для просмотра ссылки.

C++:
#include "includes.h"

LagRecord* c_resolver::FindIdealRecord(AimPlayer* data) {
    LagRecord* first_valid, * current;

    if (data->m_records.empty())
        return nullptr;

    first_valid = nullptr;

    // iterate records.
    for (const auto& it : data->m_records) {
        if (it->dormant() || it->immune() || !it->valid())
            continue;

        // get current record.
        current = it.get();

        // first record that was valid, store it for later.
        if (!first_valid)
            first_valid = current;
        // todo: simv0l: change this fckng best records priority
        if (it->m_shot || it->m_mode == Modes::RESOLVE_AIR)
            return current;
    }

    // none found above, return the first valid record if possible.
    return (first_valid) ? first_valid : nullptr;
}

LagRecord* c_resolver::FindLastRecord(AimPlayer* data) {
    LagRecord* current;

    if (data->m_records.empty())
        return nullptr;

    // iterate records in reverse.
    for (auto it = data->m_records.crbegin(); it != data->m_records.crend(); ++it) {
        current = it->get();

        // if this record is valid.
        // we are done since we iterated in reverse.
        if (current->valid() && !current->immune() && !current->dormant())
            return current;
    }

    return nullptr;
}

void c_resolver::MatchShot(AimPlayer* data, LagRecord* record) {
    // do not attempt to do this in nospread mode.

    float shoot_time = -1.f;

    Weapon* weapon = data->m_player->GetActiveWeapon();
    if (weapon) {
        // with logging this time was always one tick behind.
        // so add one tick to the last shoot time.
        shoot_time = weapon->m_fLastShotTime() + c_csgo::get()->m_globals->m_interval;
    }

    // this record has a shot on it.
    if (game::TIME_TO_TICKS(shoot_time) == game::TIME_TO_TICKS(record->m_sim_time)) {
        record->m_shot = true;
    }
}

void c_resolver::SetMode(LagRecord* record) {
    // the resolver has 3 modes to chose from.
    // these modes will vary more under the hood depending on what data we have about the player
    // and what kind of hack vs. hack we are playing (mm/nospread).

    float speed = record->m_anim_velocity.length();

    // if not on ground.
    if (!(record->m_flags & FL_ONGROUND))
        record->m_mode = Modes::RESOLVE_AIR;

    // if on ground and moving.
    else if (speed > 6.f)
        record->m_mode = Modes::RESOLVE_WALK;

    // if on ground and not moving.
    else
        record->m_mode = Modes::RESOLVE_STAND;
}

void c_resolver::ResolveAngles(Player* player, LagRecord* record) {
    AimPlayer* data = &c_aimbot::get()->m_players[player->index() - 1];

    // mark this record if it contains a shot.
    MatchShot(data, record);

    // next up mark this record with a resolver mode that will be used.
    SetMode(record);


    float EyeDelta = player->m_PlayerAnimState()->m_flEyeYaw - player->m_PlayerAnimState()->m_flGoalFeetYaw;
    bool LowDelta = EyeDelta < 30.f;
    bool HalfDelta = EyeDelta <= 30.f;
    float desync_delta;
    if (HalfDelta)
        desync_delta = player->GetMaxBodyRotation() / 2;
    else if (LowDelta)
        desync_delta = player->GetMaxBodyRotation() / 2.85;
    else
        desync_delta = player->GetMaxBodyRotation();

    // if we are in nospread mode, force all players pitches to down.
    // TODO; we should check thei actual pitch and up too, since those are the other 2 possible angles.
    // this should be somehow combined into some iteration that matches with the air angle iteration.
    float side;
    int shots = data->m_missed_shots;

    float max_rotation = player->GetMaxBodyRotation();

    // setup a starting brute angle.
    float resolve_value = 45.f;
    static float brute = 0.f;

    float eye_yaw = player->m_PlayerAnimState()->m_flEyeYaw;

    // clamp our starting brute angle, to not brute an angle, we most likely can't hit.
    if (max_rotation < resolve_value)
        resolve_value = max_rotation;

    // detect if player is using maximum desync.
    bool m_extending = record->m_layers[3].m_cycle == 0.f && record->m_layers[3].m_weight == 0.f;


    if (record->m_layers[3].m_sequence == 979 && player->m_vecVelocity().length_2d() == 0.f)
    {
        float LbyAngle = player->m_flLowerBodyYawTarget();

        side = (LbyAngle > 0.f) ? -1 : 1;
    }
    else if (player->m_vecVelocity().length_2d() == 0.f)
    {
        side = (EyeDelta > 0.f) ? -1 : 1;
    }
    else
        side = 0;


    if (side == 0)
    {
        switch (data->m_missed_shots % 6) {
        case 0:
            brute = eye_yaw + desync_delta;
            break;
        case 1:
            brute = eye_yaw - desync_delta;
            break;
        case 2:
            brute = eye_yaw + 30;
            break;
        case 3:
            brute = eye_yaw - 30;
            break;
        case 4:
            brute = eye_yaw + 15;
            break;
        case 5:
            brute = eye_yaw - 17;
            break;
        }
    }
    else
    {
        switch (data->m_missed_shots % 6) {
        case 0:
            brute = eye_yaw + desync_delta * side;
            break;
        case 1:
            brute = eye_yaw + desync_delta * -side;
            break;
        case 2:
            brute = eye_yaw - 17;
            break;
        case 3:
            brute = eye_yaw + 19;
            break;
        case 4:
            brute = eye_yaw - 30;
            break;
        case 5:
            brute = eye_yaw + 30;
            break;
        }
    }



    player->m_PlayerAnimState()->m_flGoalFeetYaw = math::NormalizedAngle(brute);
}
[/ QUOTE]

it is supremacy paste resolver

Пожалуйста, авторизуйтесь для просмотра ссылки.
- also used in supremacy
 
Пользователь
Статус
Оффлайн
Регистрация
7 Ноя 2019
Сообщения
146
Реакции[?]
44
Поинты[?]
0
bool m_extending = record->m_layers[3].m_cycle == 0.f && record->m_layers[3].m_weight == 0.f;
единственное что здесь норм...
 
bashmakus
Забаненный
Статус
Оффлайн
Регистрация
9 Ноя 2014
Сообщения
60
Реакции[?]
51
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
[ QUOTE= " francyz , post: 2344761, member: 203048 "]
credits:
Пожалуйста, авторизуйтесь для просмотра ссылки.

C++:
#include "includes.h"

LagRecord* c_resolver::FindIdealRecord(AimPlayer* data) {
    LagRecord* first_valid, * current;

    if (data->m_records.empty())
        return nullptr;

    first_valid = nullptr;

    // iterate records.
    for (const auto& it : data->m_records) {
        if (it->dormant() || it->immune() || !it->valid())
            continue;

        // get current record.
        current = it.get();

        // first record that was valid, store it for later.
        if (!first_valid)
            first_valid = current;
        // todo: simv0l: change this fckng best records priority
        if (it->m_shot || it->m_mode == Modes::RESOLVE_AIR)
            return current;
    }

    // none found above, return the first valid record if possible.
    return (first_valid) ? first_valid : nullptr;
}

LagRecord* c_resolver::FindLastRecord(AimPlayer* data) {
    LagRecord* current;

    if (data->m_records.empty())
        return nullptr;

    // iterate records in reverse.
    for (auto it = data->m_records.crbegin(); it != data->m_records.crend(); ++it) {
        current = it->get();

        // if this record is valid.
        // we are done since we iterated in reverse.
        if (current->valid() && !current->immune() && !current->dormant())
            return current;
    }

    return nullptr;
}

void c_resolver::MatchShot(AimPlayer* data, LagRecord* record) {
    // do not attempt to do this in nospread mode.

    float shoot_time = -1.f;

    Weapon* weapon = data->m_player->GetActiveWeapon();
    if (weapon) {
        // with logging this time was always one tick behind.
        // so add one tick to the last shoot time.
        shoot_time = weapon->m_fLastShotTime() + c_csgo::get()->m_globals->m_interval;
    }

    // this record has a shot on it.
    if (game::TIME_TO_TICKS(shoot_time) == game::TIME_TO_TICKS(record->m_sim_time)) {
        record->m_shot = true;
    }
}

void c_resolver::SetMode(LagRecord* record) {
    // the resolver has 3 modes to chose from.
    // these modes will vary more under the hood depending on what data we have about the player
    // and what kind of hack vs. hack we are playing (mm/nospread).

    float speed = record->m_anim_velocity.length();

    // if not on ground.
    if (!(record->m_flags & FL_ONGROUND))
        record->m_mode = Modes::RESOLVE_AIR;

    // if on ground and moving.
    else if (speed > 6.f)
        record->m_mode = Modes::RESOLVE_WALK;

    // if on ground and not moving.
    else
        record->m_mode = Modes::RESOLVE_STAND;
}

void c_resolver::ResolveAngles(Player* player, LagRecord* record) {
    AimPlayer* data = &c_aimbot::get()->m_players[player->index() - 1];

    // mark this record if it contains a shot.
    MatchShot(data, record);

    // next up mark this record with a resolver mode that will be used.
    SetMode(record);


    float EyeDelta = player->m_PlayerAnimState()->m_flEyeYaw - player->m_PlayerAnimState()->m_flGoalFeetYaw;
    bool LowDelta = EyeDelta < 30.f;
    bool HalfDelta = EyeDelta <= 30.f;
    float desync_delta;
    if (HalfDelta)
        desync_delta = player->GetMaxBodyRotation() / 2;
    else if (LowDelta)
        desync_delta = player->GetMaxBodyRotation() / 2.85;
    else
        desync_delta = player->GetMaxBodyRotation();

    // if we are in nospread mode, force all players pitches to down.
    // TODO; we should check thei actual pitch and up too, since those are the other 2 possible angles.
    // this should be somehow combined into some iteration that matches with the air angle iteration.
    float side;
    int shots = data->m_missed_shots;

    float max_rotation = player->GetMaxBodyRotation();

    // setup a starting brute angle.
    float resolve_value = 45.f;
    static float brute = 0.f;

    float eye_yaw = player->m_PlayerAnimState()->m_flEyeYaw;

    // clamp our starting brute angle, to not brute an angle, we most likely can't hit.
    if (max_rotation < resolve_value)
        resolve_value = max_rotation;

    // detect if player is using maximum desync.
    bool m_extending = record->m_layers[3].m_cycle == 0.f && record->m_layers[3].m_weight == 0.f;


    if (record->m_layers[3].m_sequence == 979 && player->m_vecVelocity().length_2d() == 0.f)
    {
        float LbyAngle = player->m_flLowerBodyYawTarget();

        side = (LbyAngle > 0.f) ? -1 : 1;
    }
    else if (player->m_vecVelocity().length_2d() == 0.f)
    {
        side = (EyeDelta > 0.f) ? -1 : 1;
    }
    else
        side = 0;


    if (side == 0)
    {
        switch (data->m_missed_shots % 6) {
        case 0:
            brute = eye_yaw + desync_delta;
            break;
        case 1:
            brute = eye_yaw - desync_delta;
            break;
        case 2:
            brute = eye_yaw + 30;
            break;
        case 3:
            brute = eye_yaw - 30;
            break;
        case 4:
            brute = eye_yaw + 15;
            break;
        case 5:
            brute = eye_yaw - 17;
            break;
        }
    }
    else
    {
        switch (data->m_missed_shots % 6) {
        case 0:
            brute = eye_yaw + desync_delta * side;
            break;
        case 1:
            brute = eye_yaw + desync_delta * -side;
            break;
        case 2:
            brute = eye_yaw - 17;
            break;
        case 3:
            brute = eye_yaw + 19;
            break;
        case 4:
            brute = eye_yaw - 30;
            break;
        case 5:
            brute = eye_yaw + 30;
            break;
        }
    }



    player->m_PlayerAnimState()->m_flGoalFeetYaw = math::NormalizedAngle(brute);
}
[/ QUOTE]

it is supremacy paste resolver

Пожалуйста, авторизуйтесь для просмотра ссылки.
- also used in supremacy
  • Resolver is from 2018.
  • Prediction is from 2018.

and supremacy = skeet dump so default
 
Начинающий
Статус
Оффлайн
Регистрация
27 Авг 2021
Сообщения
3
Реакции[?]
0
Поинты[?]
0
[ QUOTE="sanyaork, post: 2344790, member: 1040"]
  • Resolver is from 2018.
  • Prediction is from 2018.

and supremacy = skeet dump so default
[ /QUOTE]

yep but it's not gamesense, it's disinformation
 
Участник
Статус
Оффлайн
Регистрация
30 Дек 2020
Сообщения
400
Реакции[?]
293
Поинты[?]
1K
По проверке все ясно.
Начнем с того, что if мувы, то velocity буде выше 10 TODO: бри брике лбу. в lw эта функция называется should_break_lby. ПРОВЕРЕННО.
Еще можно обратить внимание на условие "if on ground ...", но у нас нету никаких проверок на граунд плеера. Можно сделать итог - либо откуда-то спащенно и он забыл убрать ненужное в комментариях, либо он ? и не знает что делает.

P.s На счет велосити не судите строго, просто на своем коде все проверял и возможно это не правильно.
C++:
    // if on ground and moving.
    else if (speed > 6.f)
        record->m_mode = Modes::RESOLVE_WALK;
 
Последнее редактирование:
Модератор форума
Участник
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
378
Реакции[?]
157
Поинты[?]
9K
По проверке все ясно. Симв0л как всегда на высоте.
Начнем с того, что if мувы, то velocity буде выше 10 TODO: бри брике лбу. в lw эта функция называется should_break_lby. ПРОВЕРЕННО.
Еще можно обратить внимание на условие "if on ground ...", но у нас нету никаких проверок на граунд плеера. Можно сделать итог - либо откуда-то спащенно и он забыл убрать ненужное в комментариях, либо он ? и не знает что делает.

P.s На счет велосити не судите строго, просто на своем коде все проверял и возможно это не правильно.
C++:
    // if on ground and moving.
    else if (speed > 6.f)
        record->m_mode = Modes::RESOLVE_WALK;
чекать по велосити игрока прошлый век. Для кого есть крутые штучки в анимстейте как velocity, upvelocity, time_since_started / stoped moving??
 
контора пидорасов
Забаненный
Статус
Оффлайн
Регистрация
1 Июл 2021
Сообщения
191
Реакции[?]
42
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
чекать по велосити игрока прошлый век. Для кого есть крутые штучки в анимстейте как velocity, upvelocity, time_since_started / stoped moving??
ну для тебя, ты же в ресике овнесса юзал анимстейт и типо отревершенный ресик в3
 
Модератор форума
Участник
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
378
Реакции[?]
157
Поинты[?]
9K
ну для тебя, ты же в ресике овнесса юзал анимстейт и типо отревершенный ресик в3
начнем с того что это не ресик овнесса, а деф лв. Настоящего кода ресольвера овнесса нет в пабе.
ну для тебя, ты же в ресике овнесса юзал анимстейт и типо отревершенный ресик в3
а так же советую больше времени уделять изучению игры. Эти штуки идеально себя показывают.
 
контора пидорасов
Забаненный
Статус
Оффлайн
Регистрация
1 Июл 2021
Сообщения
191
Реакции[?]
42
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
начнем с того что это не ресик овнесса, а деф лв. Настоящего кода ресольвера овнесса нет в пабе.

а так же советую больше времени уделять изучению игры. Эти штуки идеально себя показывают.
который не хуз, а уно
 
контора пидорасов
Забаненный
Статус
Оффлайн
Регистрация
1 Июл 2021
Сообщения
191
Реакции[?]
42
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Участник
Статус
Оффлайн
Регистрация
30 Дек 2020
Сообщения
400
Реакции[?]
293
Поинты[?]
1K
чекать по велосити игрока прошлый век. Для кого есть крутые штучки в анимстейте как velocity, upvelocity, time_since_started / stoped moving??
Просто сказал как правильнее, если использовать velocity.
И правильнее не time_since_started, а time_since_in_air.

--------------------------------------------------------------------------------------------------------------------------------------------------------------

И опять же. У тебя же выше есть условие мода = Modes::RESOLVE_STAND, зачем костыльный player->m_vecVelocity().length_2d() == 0.f;
Да и еще, если человек играющий с нормальным бриком лбу, он сломает твою проверку.

И все твои условия на стенд челов можно заменить так
C++:
if (m_AnimState->m_Velocity.Lenght() <= 10.f /*|| ResolveMode == Modes::IS_STANDING*/) // if velocity its vector (mb any idiot use float)
    m_Side = m_AnimState->AbsYaw > 0.f ? -1 : 1;
И еще, чтобы это правильно работало, нужно сделать доп. условия на сайды
1630355225965.png
На счет sequence. Смотри дамп вантапа, там нормально 979 триггер фиксится.
Или чтобы ты не парился
Это не фулл фикс, а мини, чтобы анимации нормально работали и в ресольвере не придется делать доп. чеки на 979 1630355277181.png
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
12 Июн 2019
Сообщения
865
Реакции[?]
127
Поинты[?]
1K
Модератор форума
Участник
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
378
Реакции[?]
157
Поинты[?]
9K
Просто сказал как правильнее, если использовать velocity.
И правильнее не time_since_started, а time_since_in_air.

--------------------------------------------------------------------------------------------------------------------------------------------------------------

И опять же. У тебя же выше есть условие мода = Modes::RESOLVE_STAND, зачем костыльный player->m_vecVelocity().length_2d() == 0.f;
Да и еще, если человек играющий с нормальным бриком лбу, он сломает твою проверку.

И все твои условия на стенд челов можно заменить так
C++:
if (m_AnimState->m_Velocity.Lenght() <= 10.f /*|| ResolveMode == Modes::IS_STANDING*/) // if velocity its vector (mb any idiot use float)
    m_Side = m_AnimState->AbsYaw > 0.f ? -1 : 1;
И еще, чтобы это правильно работало, нужно сделать доп. условия на сайды
На счет sequence. Смотри дамп вантапа, там нормально 979 триггер фиксится.
Или чтобы ты не парился
Это не фулл фикс, а мини, чтобы анимации нормально работали и в ресольвере не придется делать доп. чеки на 979 Посмотреть вложение 169446
нет мужик. time_since_in_air это вообще время с которого энеми в воздухе:NotLikeThis::NotLikeThis:. Нужно time_since_started_moving и time_since_stoped_moving.
И вообще не надо юзать всратые методы вантапа. Юзайте ротейт плеера.
 
Последнее редактирование:
Сверху Снизу