Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Исходник 6 Animlayer Rebuild

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
17 Фев 2017
Сообщения
864
Реакции
420
C++:
Expand Collapse Copy
void Animations::RebuiltLayer6( Player* player, LagComp::LagRecord_t::LayerData_t* layer_data ) {
    // rebuilt layer 6 calculations from csgo
    // links:
    // https://github.com/perilouswithadollarsign/cstrike15_src/blob/master/game/shared/cstrike15/csgo_playeranimstate.cpp#L1393
    // https://github.com/click4dylan/CSGO_AnimationCode_Reversed/blob/master/CCSGOPlayerAnimState_New.cpp#L2323

    auto m_pState = player->m_PlayerAnimState( );
    static const float CS_PLAYER_SPEED_RUN = 260.0f;

    // TODO: Find these members in the actual animstate struct
    auto m_flLastUpdateIncrement = *( float* )( ( DWORD )m_pState + 0x74 );
    auto m_flFootYaw = m_pState->goal_feet_yaw;
    auto m_flMoveYaw = m_pState->torso_yaw;
    auto m_vecVelocityNormalizedNonZero = *( vec3_t* )( ( DWORD )m_pState + 0xE0 );
    auto m_flInAirSmoothValue = *( float* )( ( DWORD )m_pState + 0x124 );
    AnimationData_t& m_AnimationData = m_animation_data[ player->index( ) ];

    char m_szDestination[ 64 ];
    sprintf_s( m_szDestination, XOR( "move_%s" ), m_pState->GetWeaponPrefix( ) );

    int m_nMoveSequence = player->LookupSequence( m_szDestination );
    if ( m_nMoveSequence == -1 )
    {
        m_nMoveSequence = player->LookupSequence( XOR( "move" ) );
    }

    // NOTE:
    // player->get<int>( 0x3984 ) is m_iMoveState
    if ( player->get<int>( 0x3984 ) != m_AnimationData.m_iMoveState )
        m_AnimationData.m_flMovePlaybackRate += 10.0f;

    m_AnimationData.m_iMoveState = player->get<int>( 0x3984 );

    float m_flMovementTimeDelta = *( float* )( ( DWORD )m_pState + 0x74 ) * 40.0f;

    if ( -m_AnimationData.m_flMovePlaybackRate <= m_flMovementTimeDelta )
    {
        if ( -m_flMovementTimeDelta <= -m_AnimationData.m_flMovePlaybackRate )
            m_AnimationData.m_flMovePlaybackRate = 0.0f;
        else
            m_AnimationData.m_flMovePlaybackRate = m_AnimationData.m_flMovePlaybackRate - m_flMovementTimeDelta;
    }
    else
    {
        m_AnimationData.m_flMovePlaybackRate = m_AnimationData.m_flMovePlaybackRate + m_flMovementTimeDelta;
    }

    m_AnimationData.m_flMovePlaybackRate = std::clamp( m_AnimationData.m_flMovePlaybackRate, 0.0f, 100.0f );

    float m_flDuckSpeedClamped = std::clamp( *( float* )( ( DWORD )m_pState + 0xFC ), 0.0f, 1.0f );
    float m_flRunSpeedClamped = std::clamp( *( float* )( ( DWORD )m_pState + 0xF8 ), 0.0f, 1.0f );

    float m_flSpeedWeight = ( ( m_flDuckSpeedClamped - m_flRunSpeedClamped ) * *( float* )( ( DWORD )m_pState + 0xA4 ) ) + m_flRunSpeedClamped;

    if ( m_flSpeedWeight < layer_data->m_flFeetWeight )
    {
        float v34 = std::clamp( m_AnimationData.m_flMovePlaybackRate * 0.01f, 0.0f, 1.0f );
        float m_flFeetWeightElapsed = ( ( v34 * 18.0f ) + 2.0f ) * *( float* )( ( DWORD )m_pState + 0x74 );
        if ( m_flSpeedWeight - layer_data->m_flFeetWeight <= m_flFeetWeightElapsed )
            layer_data->m_flFeetWeight = -m_flFeetWeightElapsed <= ( m_flSpeedWeight - layer_data->m_flFeetWeight ) ? m_flSpeedWeight : layer_data->m_flFeetWeight - m_flFeetWeightElapsed;
        else
            layer_data->m_flFeetWeight = m_flFeetWeightElapsed + layer_data->m_flFeetWeight;
    }
    else
    {
        layer_data->m_flFeetWeight = m_flSpeedWeight;
    }

    float m_flYaw = math::AngleNormalize( ( m_pState->torso_yaw + m_pState->goal_feet_yaw ) + 180.0f );
    ang_t m_angAngle = { 0.0f, m_flYaw, 0.0f };
    vec3_t m_vecDirection;
    math::AngleVectors( m_angAngle, &m_vecDirection );

    float m_flMovementSide = math::DotProduct( m_vecVelocityNormalizedNonZero, m_vecDirection );
    if ( m_flMovementSide < 0.0f )
        m_flMovementSide = -m_flMovementSide;

    float m_flNewFeetWeight = math::Bias( m_flMovementSide, 0.2f ) * layer_data->m_flFeetWeight;

    float m_flNewFeetWeightWithAirSmooth = m_flNewFeetWeight * m_flInAirSmoothValue;

    // m_flLayer5Weight looks a bit weird so i decided to name it m_flLayer5_Weight instead.
    float m_flLayer5_Weight = player->GetLayerWeight( 5 );

    float m_flNewWeight = 0.55f;
    if ( 1.0f - m_flLayer5_Weight > 0.55f )
        m_flNewWeight = 1.0f - m_flLayer5_Weight;

    float m_flNewFeetWeightLayerWeight = m_flNewWeight * m_flNewFeetWeightWithAirSmooth;
    float m_flFeetCycleRate = 0.0f;

    float m_flSpeed = std::fmin( player->m_vecVelocity( ).length( ), 260.f );
    if ( m_flSpeed > 0.00f )
    {
        float m_flSequenceCycleRate = player->GetSequenceCycleRate( player->GetModelPtr( ), m_nMoveSequence );

        float m_flSequenceMoveDist = player->GetSequenceMoveDist( player->GetModelPtr( ), m_nMoveSequence );
        m_flSequenceMoveDist *= 1.0f / ( 1.0f / m_flSequenceCycleRate );
        if ( m_flSequenceMoveDist <= 0.001f )
            m_flSequenceMoveDist = 0.001f;

        float m_flSpeedMultiplier = m_flSpeed / m_flSequenceMoveDist;
        m_flFeetCycleRate = ( 1.0f - ( m_pState->stop_to_full_running_fraction * 0.15f ) ) * ( m_flSpeedMultiplier * m_flSequenceCycleRate );
    }

    float m_flFeetCyclePlaybackRate = ( *( float* )( ( DWORD )m_pState + 0x74 ) * m_flFeetCycleRate );
    m_AnimationData.m_flPrimaryCycle = m_flFeetCyclePlaybackRate + m_AnimationData.m_flPrimaryCycle;

    // store possible information for resolving.
    layer_data->m_flMovementSide = m_flMovementSide;
    layer_data->m_angMoveYaw = m_angAngle;
    layer_data->m_vecDirection = m_vecDirection;
    layer_data->m_flFeetWeight = m_flNewFeetWeight;

    layer_data->m_nSequence = m_nMoveSequence;
    layer_data->m_flPlaybackRate = m_flFeetCyclePlaybackRate;
    layer_data->m_flCycle = m_AnimationData.m_flPrimaryCycle;
    layer_data->m_flWeight = std::clamp( m_flNewFeetWeightLayerWeight, 0.0f, 1.0f );
}
 
Чел я просто не шарю, это резольвер?
Нет. Это ребилд 6 леера, что б лучше детектить десинки в движении. Почти что бесполезная хрень, максимум статики или простенькие джиттеры детектить будет легче
 
Нет. Это ребилд 6 леера, что б лучше детектить десинки в движении. Почти что бесполезная хрень, максимум статики или простенькие джиттеры детектить будет легче
Нихуя себе, просто только учу) не знал
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Господи, почему сочники это лайкают, это полнейший паблик и юзлесс. Ну то, что всякие пастерАлмиры лайкнули это понятно. Это лежит в паблике уже год, ты этим ребилдом максимум поймаешь крайне хуевые десинки, это было актуально в середине 19-го, но не в конце 20-го точно. Я худею от пастеров..
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Надеюсь пастеры не додумаются как сделать из этого что-то годное...........
 
Господи, почему сочники это лайкают, это полнейший паблик и юзлесс. Ну то, что всякие пастерАлмиры лайкнули это понятно. Это лежит в паблике уже год, ты этим ребилдом максимум поймаешь крайне хуевые десинки, это было актуально в середине 19-го, но не в конце 20-го точно. Я худею от пастеров..
Надеюсь пастеры не додумаются как сделать из этого что-то годное...........
вы оба ничего полезного для форума не сделали, так зачем что то говорите в сторону него?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
вы оба ничего полезного для форума не сделали, так зачем что то говорите в сторону него?
Причем тут в сторону него, ты, прочитай мои слова еще раз, а потом говори. Если у тебя есть мозг и знания в читдеве, то посмотри на то, что он "слил" и подумай, что там может быть полезного. 6й анимлеер сам по себе юзлесс в 2020, а тут он еще и ребилднут не совсем правильно
 
Причем тут в сторону него, ты, прочитай мои слова еще раз, а потом говори. Если у тебя есть мозг и знания в читдеве, то посмотри на то, что он "слил" и подумай, что там может быть полезного. 6й анимлеер сам по себе юзлесс в 2020, а тут он еще и ребилднут не совсем правильно
6 леер может быть полезным, если иметь минимальную граммовку мозга
 
Ну я конечно понимаю все понимаю, но смысл от этой темы, когда сурс ксго в паблике...
Да и почему только ребилд одного леера, или ты решил для каждого леера новую тему делать?
Зачем так же ты оставил дебаг принтф, и почему у тебя структура анимстейта настолько прикольная, что ты половину мемберов получаешь оффсетом........
 
Причем тут в сторону него, ты, прочитай мои слова еще раз, а потом говори. Если у тебя есть мозг и знания в читдеве, то посмотри на то, что он "слил" и подумай, что там может быть полезного. 6й анимлеер сам по себе юзлесс в 2020, а тут он еще и ребилднут не совсем правильно
что не так?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
Expand Collapse Copy
void Animations::RebuiltLayer6( Player* player, LagComp::LagRecord_t::LayerData_t* layer_data ) {
    // rebuilt layer 6 calculations from csgo
    // links:
    // https://github.com/perilouswithadollarsign/cstrike15_src/blob/master/game/shared/cstrike15/csgo_playeranimstate.cpp#L1393
    // https://github.com/click4dylan/CSGO_AnimationCode_Reversed/blob/master/CCSGOPlayerAnimState_New.cpp#L2323

    auto m_pState = player->m_PlayerAnimState( );
    static const float CS_PLAYER_SPEED_RUN = 260.0f;

    // TODO: Find these members in the actual animstate struct
    auto m_flLastUpdateIncrement = *( float* )( ( DWORD )m_pState + 0x74 );
    auto m_flFootYaw = m_pState->goal_feet_yaw;
    auto m_flMoveYaw = m_pState->torso_yaw;
    auto m_vecVelocityNormalizedNonZero = *( vec3_t* )( ( DWORD )m_pState + 0xE0 );
    auto m_flInAirSmoothValue = *( float* )( ( DWORD )m_pState + 0x124 );
    AnimationData_t& m_AnimationData = m_animation_data[ player->index( ) ];

    char m_szDestination[ 64 ];
    sprintf_s( m_szDestination, XOR( "move_%s" ), m_pState->GetWeaponPrefix( ) );

    int m_nMoveSequence = player->LookupSequence( m_szDestination );
    if ( m_nMoveSequence == -1 )
    {
        m_nMoveSequence = player->LookupSequence( XOR( "move" ) );
    }

    // NOTE:
    // player->get<int>( 0x3984 ) is m_iMoveState
    if ( player->get<int>( 0x3984 ) != m_AnimationData.m_iMoveState )
        m_AnimationData.m_flMovePlaybackRate += 10.0f;

    m_AnimationData.m_iMoveState = player->get<int>( 0x3984 );

    float m_flMovementTimeDelta = *( float* )( ( DWORD )m_pState + 0x74 ) * 40.0f;

    if ( -m_AnimationData.m_flMovePlaybackRate <= m_flMovementTimeDelta )
    {
        if ( -m_flMovementTimeDelta <= -m_AnimationData.m_flMovePlaybackRate )
            m_AnimationData.m_flMovePlaybackRate = 0.0f;
        else
            m_AnimationData.m_flMovePlaybackRate = m_AnimationData.m_flMovePlaybackRate - m_flMovementTimeDelta;
    }
    else
    {
        m_AnimationData.m_flMovePlaybackRate = m_AnimationData.m_flMovePlaybackRate + m_flMovementTimeDelta;
    }

    m_AnimationData.m_flMovePlaybackRate = std::clamp( m_AnimationData.m_flMovePlaybackRate, 0.0f, 100.0f );

    float m_flDuckSpeedClamped = std::clamp( *( float* )( ( DWORD )m_pState + 0xFC ), 0.0f, 1.0f );
    float m_flRunSpeedClamped = std::clamp( *( float* )( ( DWORD )m_pState + 0xF8 ), 0.0f, 1.0f );

    float m_flSpeedWeight = ( ( m_flDuckSpeedClamped - m_flRunSpeedClamped ) * *( float* )( ( DWORD )m_pState + 0xA4 ) ) + m_flRunSpeedClamped;

    if ( m_flSpeedWeight < layer_data->m_flFeetWeight )
    {
        float v34 = std::clamp( m_AnimationData.m_flMovePlaybackRate * 0.01f, 0.0f, 1.0f );
        float m_flFeetWeightElapsed = ( ( v34 * 18.0f ) + 2.0f ) * *( float* )( ( DWORD )m_pState + 0x74 );
        if ( m_flSpeedWeight - layer_data->m_flFeetWeight <= m_flFeetWeightElapsed )
            layer_data->m_flFeetWeight = -m_flFeetWeightElapsed <= ( m_flSpeedWeight - layer_data->m_flFeetWeight ) ? m_flSpeedWeight : layer_data->m_flFeetWeight - m_flFeetWeightElapsed;
        else
            layer_data->m_flFeetWeight = m_flFeetWeightElapsed + layer_data->m_flFeetWeight;
    }
    else
    {
        layer_data->m_flFeetWeight = m_flSpeedWeight;
    }

    float m_flYaw = math::AngleNormalize( ( m_pState->torso_yaw + m_pState->goal_feet_yaw ) + 180.0f );
    ang_t m_angAngle = { 0.0f, m_flYaw, 0.0f };
    vec3_t m_vecDirection;
    math::AngleVectors( m_angAngle, &m_vecDirection );

    float m_flMovementSide = math::DotProduct( m_vecVelocityNormalizedNonZero, m_vecDirection );
    if ( m_flMovementSide < 0.0f )
        m_flMovementSide = -m_flMovementSide;

    float m_flNewFeetWeight = math::Bias( m_flMovementSide, 0.2f ) * layer_data->m_flFeetWeight;

    float m_flNewFeetWeightWithAirSmooth = m_flNewFeetWeight * m_flInAirSmoothValue;

    // m_flLayer5Weight looks a bit weird so i decided to name it m_flLayer5_Weight instead.
    float m_flLayer5_Weight = player->GetLayerWeight( 5 );

    float m_flNewWeight = 0.55f;
    if ( 1.0f - m_flLayer5_Weight > 0.55f )
        m_flNewWeight = 1.0f - m_flLayer5_Weight;

    float m_flNewFeetWeightLayerWeight = m_flNewWeight * m_flNewFeetWeightWithAirSmooth;
    float m_flFeetCycleRate = 0.0f;

    float m_flSpeed = std::fmin( player->m_vecVelocity( ).length( ), 260.f );
    if ( m_flSpeed > 0.00f )
    {
        float m_flSequenceCycleRate = player->GetSequenceCycleRate( player->GetModelPtr( ), m_nMoveSequence );

        float m_flSequenceMoveDist = player->GetSequenceMoveDist( player->GetModelPtr( ), m_nMoveSequence );
        m_flSequenceMoveDist *= 1.0f / ( 1.0f / m_flSequenceCycleRate );
        if ( m_flSequenceMoveDist <= 0.001f )
            m_flSequenceMoveDist = 0.001f;

        float m_flSpeedMultiplier = m_flSpeed / m_flSequenceMoveDist;
        m_flFeetCycleRate = ( 1.0f - ( m_pState->stop_to_full_running_fraction * 0.15f ) ) * ( m_flSpeedMultiplier * m_flSequenceCycleRate );
    }

    float m_flFeetCyclePlaybackRate = ( *( float* )( ( DWORD )m_pState + 0x74 ) * m_flFeetCycleRate );
    m_AnimationData.m_flPrimaryCycle = m_flFeetCyclePlaybackRate + m_AnimationData.m_flPrimaryCycle;

    // store possible information for resolving.
    layer_data->m_flMovementSide = m_flMovementSide;
    layer_data->m_angMoveYaw = m_angAngle;
    layer_data->m_vecDirection = m_vecDirection;
    layer_data->m_flFeetWeight = m_flNewFeetWeight;

    layer_data->m_nSequence = m_nMoveSequence;
    layer_data->m_flPlaybackRate = m_flFeetCyclePlaybackRate;
    layer_data->m_flCycle = m_AnimationData.m_flPrimaryCycle;
    layer_data->m_flWeight = std::clamp( m_flNewFeetWeightLayerWeight, 0.0f, 1.0f );
}
Хуйня, смысла в этом ровно 0. Сервер анимирует игрока на основе своих, т.е. правильных в последней инстанции данных, а у клиента они свои. Проще: Ты будешь анимировать чела на основе своих хуевых данных, так как все данные клиента априори хуйня и из-за этого рассинхрон будет еще больше.
C++:
Expand Collapse Copy
    float m_flSpeed = std::fmin( player->m_vecVelocity( ).length( ), 260.f );
}
UPD: learncpp.com
 
Хуйня, смысла в этом ровно 0. Сервер анимирует игрока на основе своих, т.е. правильных в последней инстанции данных, а у клиента они свои. Проще: Ты будешь анимировать чела на основе своих хуевых данных, так как все данные клиента априори хуйня и из-за этого рассинхрон будет еще больше.

UPD: learncpp.com
именно по этой причине все говорят про ребилд лееров, потому что это юзлес херня и ломает всё еще больше....

Пофиг, что все p2c ребилдят лееры....
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пофиг, что все p2c ребилдят лееры....
Каво нахуй, где пруфы чел... Лееры вообще пизда как трудно ребилднуть, данные сука у сервера и клиента разные, и лееры соответственно будут на разных данных считаться.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
L1ney:
IMG_20201127_153219.jpg
 
Каво нахуй, где пруфы чел... Лееры вообще пизда как трудно ребилднуть, данные сука у сервера и клиента разные, и лееры соответственно будут на разных данных считаться.
если лееры разные, то каким боком возможно создать ресольвер на анимациях, ты вообще понимаешь, что за хрень ты пишешь? Даже на фейках использовались аним лееры что б ресольвить, и почему-то ни у кого не возникало вопросов. Просто что б минимализировать разницу, нужно получать лееры при апдейте инфы игрока, когда сервер отправляет клиенту данные. Инфа лееров там правильная, они, в отличии от анимстейта, нетворкед. То что это юзлес против современных p2c это да, я об этом раньше вас всех написал, прям в этом же топике. Пасты тапать сгодится
Иронично, что у нас так много умников, которые из раза в раз обсирают мои посты, но нет НИ ОДНОГО ру чита, который был ну хотя бы на уровне еексоми, я уже молчу про уровень неверлуза. Если бы действительно что-то знали и умели бы, смогли бы че нить получше легендвара сделать, а так вас уделал иммортал у которого ресольвер чистая параша и сделано на коленке, а большая часть софта куплена. Есть ледасир, которого я уважаю как реверсера, но как кодер он видимо не очень. Вот от него я бы послушал информацию, послушал бы от соуфи. А остальные - просто кучка чсв которые научились тыкать Ф5 в иде и пытаются показать себя знатоками, хотя по факту ниче не могут
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
если лееры разные, то каким боком возможно создать ресольвер на анимациях, ты вообще понимаешь, что за хрень ты пишешь? Даже на фейках использовались аним лееры что б ресольвить, и почему-то ни у кого не возникало вопросов. Просто что б минимализировать разницу, нужно получать лееры при апдейте инфы игрока, когда сервер отправляет клиенту данные. Инфа лееров там правильная, они, в отличии от анимстейта, нетворкед. То что это юзлес против современных p2c это да, я об этом раньше вас всех написал, прям в этом же топике. Пасты тапать сгодится
Почему? Люди блять с головой не дружили. В твоем говно-коде лееры считаются от анимстейта, который в свою очередь на 100 процентов клиент сайд. В отличии от анимлееров, которые нетворкед, анимстейт считается на КЛИЕНТЕ => попытка ребилда на клиентских неверных данных.
 

Вложения

  • Безымянный.png
    Безымянный.png
    9 KB · Просмотры: 127
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
если лееры разные, то каким боком возможно создать ресольвер на анимациях, ты вообще понимаешь, что за хрень ты пишешь? Даже на фейках использовались аним лееры что б ресольвить, и почему-то ни у кого не возникало вопросов. Просто что б минимализировать разницу, нужно получать лееры при апдейте инфы игрока, когда сервер отправляет клиенту данные. Инфа лееров там правильная, они, в отличии от анимстейта, нетворкед. То что это юзлес против современных p2c это да, я об этом раньше вас всех написал, прям в этом же топике. Пасты тапать сгодится

Иронично, что у нас так много умников, которые из раза в раз обсирают мои посты, но нет НИ ОДНОГО ру чита, который был ну хотя бы на уровне еексоми, я уже молчу про уровень неверлуза. Если бы действительно что-то знали и умели бы, смогли бы че нить получше легендвара сделать, а так вас уделал иммортал у которого ресольвер чистая параша и сделано на коленке, а большая часть софта куплена. Есть ледасир, которого я уважаю как реверсера, но как кодер он видимо не очень. Вот от него я бы послушал информацию, послушал бы от соуфи. А остальные - просто кучка чсв которые научились тыкать Ф5 в иде и пытаются показать себя знатоками, хотя по факту ниче не могут
20201127_160851.jpg
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
если лееры разные, то каким боком возможно создать ресольвер на анимациях, ты вообще понимаешь, что за хрень ты пишешь? Даже на фейках использовались аним лееры что б ресольвить, и почему-то ни у кого не возникало вопросов. Просто что б минимализировать разницу, нужно получать лееры при апдейте инфы игрока, когда сервер отправляет клиенту данные. Инфа лееров там правильная, они, в отличии от анимстейта, нетворкед. То что это юзлес против современных p2c это да, я об этом раньше вас всех написал, прям в этом же топике. Пасты тапать сгодится

Иронично, что у нас так много умников, которые из раза в раз обсирают мои посты, но нет НИ ОДНОГО ру чита, который был ну хотя бы на уровне еексоми, я уже молчу про уровень неверлуза. Если бы действительно что-то знали и умели бы, смогли бы че нить получше легендвара сделать, а так вас уделал иммортал у которого ресольвер чистая параша и сделано на коленке, а большая часть софта куплена. Есть ледасир, которого я уважаю как реверсера, но как кодер он видимо не очень. Вот от него я бы послушал информацию, послушал бы от соуфи. А остальные - просто кучка чсв которые научились тыкать Ф5 в иде и пытаются показать себя знатоками, хотя по факту ниче не могут
1606483184492.png

пришел.
начнем с того, что ексоми содержит вантап в себе.
неверлуз не делался 1 неделю и у соуфива опыта в геймхакинге явно больше 2 лет. Хотя думаю я знаю еще одного крутого парня..
Ты не имеешь права называть Ледасиром так себе кодером, так как по сравнению с тобой он гений кодинга
ну сверху я скрин скинул на счет соуфива, слушай сколько влезит
и кстати для того что бы реверсить не достаточно нажать f5 клоун...
 
Назад
Сверху Снизу