C++ P2C локалки для лв3

Начинающий
Статус
Оффлайн
Регистрация
18 Мар 2021
Сообщения
68
Реакции[?]
29
Поинты[?]
1K
C++:
#include "local_animations.h"

constexpr float WEIGHT_CYCLE_RESET = 0.0f;  // Сброс веса цикла нахуй
constexpr int KEY_BIND_STATE = 20;  // Состояние привязки к хую

enum LayerIndex {
    LAYER_FAKE_WEIGHT = 3,  // Вес нахуй для фейкового леера
    LAYER_FAKE_CYCLE = 3,  // Цикл нахуй для фейкового леера
    LAYER_YAW_WEIGHT = 12  // Вес блять для yaw
};

constexpr int ANIMATION_LAYERS_COUNT = 13;  // Количество нахуй аним лееров
constexpr int POSE_PARAMETERS_COUNT = 24;  // Количество нахуй поз параметров

void local_animations::run(ClientFrameStage_t stage)
{
    if (stage == FRAME_NET_UPDATE_END)
    {
        update_animations();  // Обновляем анимации ебать
    }
    else if (stage == FRAME_RENDER_START)
    {
        auto animstate = g_ctx.local()->get_animation_state();
        if (!animstate)
            return;
        
        reset_and_update_animations(animstate);  // Сбрасываем и обновляем анимации к хуям
    }
}

void local_animations::reset_and_update_animations(c_baseplayeranimationstate* animstate)
{
    reset_anim_layers();  // Сбрасываем нахуй аним лееры
    update_server_time(real_simulation_time, real_server_update);  // Обновляем время к ебеням
    update_local_animations(*animstate);  // Обновляем локальные анимации нахуй

    if (fakelag::get().condition && key_binds::get().get_key_bind_state(KEY_BIND_STATE))
    {
        update_server_time(fake_simulation_time, fake_server_update);  // Обновляем ебучее время
        update_fake_animations();  // Обновляем нахуй не нужные фейковые анимации
    }
}

void local_animations::update_animations()
{
    update_server_time(fake_simulation_time, fake_server_update);  // Обновляем время нахуй

    if (!fakelag::get().condition && key_binds::get().get_key_bind_state(KEY_BIND_STATE))
    {
        reset_anim_layers();  // Сбрасываем нахуй аним лееры
        update_fake_animations();  // Обновляем нахуй не нужные фейковые анимации
    }
}

void local_animations::update_server_time(float& simulation_time, bool& server_update)
{
    server_update = g_ctx.local()->m_flSimulationTime() != simulation_time;  // Проверяем обновление серверного времени нахуй
    if (server_update)
    {
        simulation_time = g_ctx.local()->m_flSimulationTime();  // Обновляем время нахуй
    }
}

void local_animations::reset_anim_layers()
{
    reset_anim_layer(LayerIndex::LAYER_FAKE_WEIGHT);  // Сбрасываем леер нахуй
    reset_anim_layer(LayerIndex::LAYER_FAKE_CYCLE);  // Сбрасываем леер нахуй
    reset_anim_layer(LayerIndex::LAYER_YAW_WEIGHT);  // Сбрасываем леер нахуй
}

void local_animations::reset_anim_layer(LayerIndex layer)
{
    auto& anim_layer = g_ctx.local()->get_animlayers()[static_cast<int>(layer)];  // Получаем аним леер ебать
    anim_layer.m_flWeight = WEIGHT_CYCLE_RESET;  // Сбрасываем вес нахуй
    anim_layer.m_flCycle = WEIGHT_CYCLE_RESET;  // Сбрасываем цикл нахуй
}

void local_animations::update_prediction_animations()
{
    bool alloc = !local_data.prediction_animstate;  // Выделяем память нахуй
    bool change = !alloc && handle != &g_ctx.local()->GetRefEHandle();  // Проверяем изменение нахуй
    bool reset = !alloc && !change && g_ctx.local()->m_flSpawnTime() != spawntime;  // Проверяем сброс нахуй

    update_prediction_state(alloc, change, reset);  // Обновляем состояние нахуй
    
    if (!alloc && !change && !reset) {
        update_prediction_parameters_and_layers();  // Обновляем параметры и слои нахуй
    }
}

void local_animations::update_prediction_state(bool alloc, bool change, bool reset)
{
    if (change) {
        m_memalloc()->Free(local_data.prediction_animstate);  // Освобождаем память нахуй
    }

    if (reset) {
        util::reset_state(local_data.prediction_animstate);  // Сбрасываем состояние нахуй
        spawntime = g_ctx.local()->m_flSpawnTime();  // Обновляем время нахуй
    }

    if (alloc || change) {
        local_data.prediction_animstate = (c_baseplayeranimationstate*)m_memalloc()->Alloc(sizeof(c_baseplayeranimationstate));  // Выделяем память нахуй
        if (local_data.prediction_animstate) {
            util::create_state(local_data.prediction_animstate, g_ctx.local());  // Создаем состояние нахуй
        }
        handle = (CBaseHandle*)&g_ctx.local()->GetRefEHandle();  // Обновляем хэндл нахуй
        spawntime = g_ctx.local()->m_flSpawnTime();  // Обновляем время нахуй
    }
}

void local_animations::update_prediction_parameters_and_layers()
{
    float pose_parameter[POSE_PARAMETERS_COUNT];
    std::memcpy(pose_parameter, &g_ctx.local()->m_flPoseParameter(), POSE_PARAMETERS_COUNT * sizeof(float));  // Копируем параметры позы нахуй

    AnimationLayer layers[ANIMATION_LAYERS_COUNT];
    std::memcpy(layers, g_ctx.local()->get_animlayers(), g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));  // Копируем слои анимации нахуй

    local_data.prediction_animstate->m_pBaseEntity = g_ctx.local();  // Устанавливаем базовую сущность нахуй
    util::update_state(local_data.prediction_animstate, ZERO);  // Обновляем состояние нахуй

    g_ctx.local()->setup_bones_fixed(g_ctx.globals.prediction_matrix, BONE_USED_BY_HITBOX);  // Устанавливаем кости нахуй

    std::memcpy(&g_ctx.local()->m_flPoseParameter(), pose_parameter, POSE_PARAMETERS_COUNT * sizeof(float));  // Копируем параметры позы нахуй
    std::memcpy(g_ctx.local()->get_animlayers(), layers, g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));  // Копируем слои анимации нахуй
}

void local_animations::update_fake_animations()
{
    if (tickcount != m_globals()->m_tickcount)
    {
        tickcount = m_globals()->m_tickcount;
        save_animlayers();  // Сохраняем слои анимации нахуй
        update_animstate();  // Обновляем состояние анимации нахуй
        update_abs_angles();  // Обновляем абсолютные углы нахуй
        save_pose_parameter();  // Сохраняем параметры позы нахуй
    }
    else
    {
        update_animstate_framecount();  // Обновляем счетчик кадров нахуй
    }

    update_goal_feet_yaw();  // Обновляем цель yaw нахуй
    update_abs_angles_in_entity();  // Обновляем абсолютные углы в сущности нахуй
    restore_pose_parameter();  // Восстанавливаем параметры позы нахуй
}

void local_animations::update_local_animations(c_baseplayeranimationstate& animstate)
{
    if (tickcount != m_globals()->m_tickcount)
    {
        tickcount = m_globals()->m_tickcount;
        save_animlayers();  // Сохраняем слои анимации нахуй
        update_animstate(animstate);  // Обновляем состояние анимации нахуй
        update_abs_angles();  // Обновляем абсолютные углы нахуй
        save_pose_parameter();  // Сохраняем параметры позы нахуй
    }
    else
    {
        animstate.m_iLastClientSideAnimationUpdateFramecount = m_globals()->m_framecount;  // Обновляем счетчик кадров нахуй
    }

    update_goal_feet_yaw(animstate);  // Обновляем цель yaw нахуй
    update_abs_angles_in_entity(animstate);  // Обновляем абсолютные углы в сущности нахуй
    restore_pose_parameter();  // Восстанавливаем параметры позы нахуй
}
 
Эксперт
Статус
Оффлайн
Регистрация
7 Сен 2019
Сообщения
2,106
Реакции[?]
984
Поинты[?]
88K
Начинающий
Статус
Оффлайн
Регистрация
22 Окт 2022
Сообщения
98
Реакции[?]
24
Поинты[?]
0
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,595
Реакции[?]
603
Поинты[?]
44K
а эти хедер файлы.. они сейчас с нами в комнате? он скинул одним [код][/код] элементом, хуле ты хочешь?

препроцессор БУКВАЛЬНО вставляет хедер файл в твой прекрасный .cpp.. ты не поверишь что у тебя скормится в компилятор....
 
HvH Legend
Забаненный
Статус
Оффлайн
Регистрация
23 Окт 2022
Сообщения
391
Реакции[?]
96
Поинты[?]
26K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
#include "local_animations.h"

constexpr float WEIGHT_CYCLE_RESET = 0.0f;  // Сброс веса цикла нахуй
constexpr int KEY_BIND_STATE = 20;  // Состояние привязки к хую

enum LayerIndex {
    LAYER_FAKE_WEIGHT = 3,  // Вес нахуй для фейкового леера
    LAYER_FAKE_CYCLE = 3,  // Цикл нахуй для фейкового леера
    LAYER_YAW_WEIGHT = 12  // Вес блять для yaw
};

constexpr int ANIMATION_LAYERS_COUNT = 13;  // Количество нахуй аним лееров
constexpr int POSE_PARAMETERS_COUNT = 24;  // Количество нахуй поз параметров

void local_animations::run(ClientFrameStage_t stage)
{
    if (stage == FRAME_NET_UPDATE_END)
    {
        update_animations();  // Обновляем анимации ебать
    }
    else if (stage == FRAME_RENDER_START)
    {
        auto animstate = g_ctx.local()->get_animation_state();
        if (!animstate)
            return;
       
        reset_and_update_animations(animstate);  // Сбрасываем и обновляем анимации к хуям
    }
}

void local_animations::reset_and_update_animations(c_baseplayeranimationstate* animstate)
{
    reset_anim_layers();  // Сбрасываем нахуй аним лееры
    update_server_time(real_simulation_time, real_server_update);  // Обновляем время к ебеням
    update_local_animations(*animstate);  // Обновляем локальные анимации нахуй

    if (fakelag::get().condition && key_binds::get().get_key_bind_state(KEY_BIND_STATE))
    {
        update_server_time(fake_simulation_time, fake_server_update);  // Обновляем ебучее время
        update_fake_animations();  // Обновляем нахуй не нужные фейковые анимации
    }
}

void local_animations::update_animations()
{
    update_server_time(fake_simulation_time, fake_server_update);  // Обновляем время нахуй

    if (!fakelag::get().condition && key_binds::get().get_key_bind_state(KEY_BIND_STATE))
    {
        reset_anim_layers();  // Сбрасываем нахуй аним лееры
        update_fake_animations();  // Обновляем нахуй не нужные фейковые анимации
    }
}

void local_animations::update_server_time(float& simulation_time, bool& server_update)
{
    server_update = g_ctx.local()->m_flSimulationTime() != simulation_time;  // Проверяем обновление серверного времени нахуй
    if (server_update)
    {
        simulation_time = g_ctx.local()->m_flSimulationTime();  // Обновляем время нахуй
    }
}

void local_animations::reset_anim_layers()
{
    reset_anim_layer(LayerIndex::LAYER_FAKE_WEIGHT);  // Сбрасываем леер нахуй
    reset_anim_layer(LayerIndex::LAYER_FAKE_CYCLE);  // Сбрасываем леер нахуй
    reset_anim_layer(LayerIndex::LAYER_YAW_WEIGHT);  // Сбрасываем леер нахуй
}

void local_animations::reset_anim_layer(LayerIndex layer)
{
    auto& anim_layer = g_ctx.local()->get_animlayers()[static_cast<int>(layer)];  // Получаем аним леер ебать
    anim_layer.m_flWeight = WEIGHT_CYCLE_RESET;  // Сбрасываем вес нахуй
    anim_layer.m_flCycle = WEIGHT_CYCLE_RESET;  // Сбрасываем цикл нахуй
}

void local_animations::update_prediction_animations()
{
    bool alloc = !local_data.prediction_animstate;  // Выделяем память нахуй
    bool change = !alloc && handle != &g_ctx.local()->GetRefEHandle();  // Проверяем изменение нахуй
    bool reset = !alloc && !change && g_ctx.local()->m_flSpawnTime() != spawntime;  // Проверяем сброс нахуй

    update_prediction_state(alloc, change, reset);  // Обновляем состояние нахуй
   
    if (!alloc && !change && !reset) {
        update_prediction_parameters_and_layers();  // Обновляем параметры и слои нахуй
    }
}

void local_animations::update_prediction_state(bool alloc, bool change, bool reset)
{
    if (change) {
        m_memalloc()->Free(local_data.prediction_animstate);  // Освобождаем память нахуй
    }

    if (reset) {
        util::reset_state(local_data.prediction_animstate);  // Сбрасываем состояние нахуй
        spawntime = g_ctx.local()->m_flSpawnTime();  // Обновляем время нахуй
    }

    if (alloc || change) {
        local_data.prediction_animstate = (c_baseplayeranimationstate*)m_memalloc()->Alloc(sizeof(c_baseplayeranimationstate));  // Выделяем память нахуй
        if (local_data.prediction_animstate) {
            util::create_state(local_data.prediction_animstate, g_ctx.local());  // Создаем состояние нахуй
        }
        handle = (CBaseHandle*)&g_ctx.local()->GetRefEHandle();  // Обновляем хэндл нахуй
        spawntime = g_ctx.local()->m_flSpawnTime();  // Обновляем время нахуй
    }
}

void local_animations::update_prediction_parameters_and_layers()
{
    float pose_parameter[POSE_PARAMETERS_COUNT];
    std::memcpy(pose_parameter, &g_ctx.local()->m_flPoseParameter(), POSE_PARAMETERS_COUNT * sizeof(float));  // Копируем параметры позы нахуй

    AnimationLayer layers[ANIMATION_LAYERS_COUNT];
    std::memcpy(layers, g_ctx.local()->get_animlayers(), g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));  // Копируем слои анимации нахуй

    local_data.prediction_animstate->m_pBaseEntity = g_ctx.local();  // Устанавливаем базовую сущность нахуй
    util::update_state(local_data.prediction_animstate, ZERO);  // Обновляем состояние нахуй

    g_ctx.local()->setup_bones_fixed(g_ctx.globals.prediction_matrix, BONE_USED_BY_HITBOX);  // Устанавливаем кости нахуй

    std::memcpy(&g_ctx.local()->m_flPoseParameter(), pose_parameter, POSE_PARAMETERS_COUNT * sizeof(float));  // Копируем параметры позы нахуй
    std::memcpy(g_ctx.local()->get_animlayers(), layers, g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));  // Копируем слои анимации нахуй
}

void local_animations::update_fake_animations()
{
    if (tickcount != m_globals()->m_tickcount)
    {
        tickcount = m_globals()->m_tickcount;
        save_animlayers();  // Сохраняем слои анимации нахуй
        update_animstate();  // Обновляем состояние анимации нахуй
        update_abs_angles();  // Обновляем абсолютные углы нахуй
        save_pose_parameter();  // Сохраняем параметры позы нахуй
    }
    else
    {
        update_animstate_framecount();  // Обновляем счетчик кадров нахуй
    }

    update_goal_feet_yaw();  // Обновляем цель yaw нахуй
    update_abs_angles_in_entity();  // Обновляем абсолютные углы в сущности нахуй
    restore_pose_parameter();  // Восстанавливаем параметры позы нахуй
}

void local_animations::update_local_animations(c_baseplayeranimationstate& animstate)
{
    if (tickcount != m_globals()->m_tickcount)
    {
        tickcount = m_globals()->m_tickcount;
        save_animlayers();  // Сохраняем слои анимации нахуй
        update_animstate(animstate);  // Обновляем состояние анимации нахуй
        update_abs_angles();  // Обновляем абсолютные углы нахуй
        save_pose_parameter();  // Сохраняем параметры позы нахуй
    }
    else
    {
        animstate.m_iLastClientSideAnimationUpdateFramecount = m_globals()->m_framecount;  // Обновляем счетчик кадров нахуй
    }

    update_goal_feet_yaw(animstate);  // Обновляем цель yaw нахуй
    update_abs_angles_in_entity(animstate);  // Обновляем абсолютные углы в сущности нахуй
    restore_pose_parameter();  // Восстанавливаем параметры позы нахуй
}
дайте пакетик, ща блевану
 
Участник
Статус
Оффлайн
Регистрация
19 Апр 2020
Сообщения
1,176
Реакции[?]
314
Поинты[?]
152K
C++:
#include "local_animations.h"

constexpr float WEIGHT_CYCLE_RESET = 0.0f;  // Сброс веса цикла нахуй
constexpr int KEY_BIND_STATE = 20;  // Состояние привязки к хую

enum LayerIndex {
    LAYER_FAKE_WEIGHT = 3,  // Вес нахуй для фейкового леера
    LAYER_FAKE_CYCLE = 3,  // Цикл нахуй для фейкового леера
    LAYER_YAW_WEIGHT = 12  // Вес блять для yaw
};

constexpr int ANIMATION_LAYERS_COUNT = 13;  // Количество нахуй аним лееров
constexpr int POSE_PARAMETERS_COUNT = 24;  // Количество нахуй поз параметров

void local_animations::run(ClientFrameStage_t stage)
{
    if (stage == FRAME_NET_UPDATE_END)
    {
        update_animations();  // Обновляем анимации ебать
    }
    else if (stage == FRAME_RENDER_START)
    {
        auto animstate = g_ctx.local()->get_animation_state();
        if (!animstate)
            return;
       
        reset_and_update_animations(animstate);  // Сбрасываем и обновляем анимации к хуям
    }
}

void local_animations::reset_and_update_animations(c_baseplayeranimationstate* animstate)
{
    reset_anim_layers();  // Сбрасываем нахуй аним лееры
    update_server_time(real_simulation_time, real_server_update);  // Обновляем время к ебеням
    update_local_animations(*animstate);  // Обновляем локальные анимации нахуй

    if (fakelag::get().condition && key_binds::get().get_key_bind_state(KEY_BIND_STATE))
    {
        update_server_time(fake_simulation_time, fake_server_update);  // Обновляем ебучее время
        update_fake_animations();  // Обновляем нахуй не нужные фейковые анимации
    }
}

void local_animations::update_animations()
{
    update_server_time(fake_simulation_time, fake_server_update);  // Обновляем время нахуй

    if (!fakelag::get().condition && key_binds::get().get_key_bind_state(KEY_BIND_STATE))
    {
        reset_anim_layers();  // Сбрасываем нахуй аним лееры
        update_fake_animations();  // Обновляем нахуй не нужные фейковые анимации
    }
}

void local_animations::update_server_time(float& simulation_time, bool& server_update)
{
    server_update = g_ctx.local()->m_flSimulationTime() != simulation_time;  // Проверяем обновление серверного времени нахуй
    if (server_update)
    {
        simulation_time = g_ctx.local()->m_flSimulationTime();  // Обновляем время нахуй
    }
}

void local_animations::reset_anim_layers()
{
    reset_anim_layer(LayerIndex::LAYER_FAKE_WEIGHT);  // Сбрасываем леер нахуй
    reset_anim_layer(LayerIndex::LAYER_FAKE_CYCLE);  // Сбрасываем леер нахуй
    reset_anim_layer(LayerIndex::LAYER_YAW_WEIGHT);  // Сбрасываем леер нахуй
}

void local_animations::reset_anim_layer(LayerIndex layer)
{
    auto& anim_layer = g_ctx.local()->get_animlayers()[static_cast<int>(layer)];  // Получаем аним леер ебать
    anim_layer.m_flWeight = WEIGHT_CYCLE_RESET;  // Сбрасываем вес нахуй
    anim_layer.m_flCycle = WEIGHT_CYCLE_RESET;  // Сбрасываем цикл нахуй
}

void local_animations::update_prediction_animations()
{
    bool alloc = !local_data.prediction_animstate;  // Выделяем память нахуй
    bool change = !alloc && handle != &g_ctx.local()->GetRefEHandle();  // Проверяем изменение нахуй
    bool reset = !alloc && !change && g_ctx.local()->m_flSpawnTime() != spawntime;  // Проверяем сброс нахуй

    update_prediction_state(alloc, change, reset);  // Обновляем состояние нахуй
   
    if (!alloc && !change && !reset) {
        update_prediction_parameters_and_layers();  // Обновляем параметры и слои нахуй
    }
}

void local_animations::update_prediction_state(bool alloc, bool change, bool reset)
{
    if (change) {
        m_memalloc()->Free(local_data.prediction_animstate);  // Освобождаем память нахуй
    }

    if (reset) {
        util::reset_state(local_data.prediction_animstate);  // Сбрасываем состояние нахуй
        spawntime = g_ctx.local()->m_flSpawnTime();  // Обновляем время нахуй
    }

    if (alloc || change) {
        local_data.prediction_animstate = (c_baseplayeranimationstate*)m_memalloc()->Alloc(sizeof(c_baseplayeranimationstate));  // Выделяем память нахуй
        if (local_data.prediction_animstate) {
            util::create_state(local_data.prediction_animstate, g_ctx.local());  // Создаем состояние нахуй
        }
        handle = (CBaseHandle*)&g_ctx.local()->GetRefEHandle();  // Обновляем хэндл нахуй
        spawntime = g_ctx.local()->m_flSpawnTime();  // Обновляем время нахуй
    }
}

void local_animations::update_prediction_parameters_and_layers()
{
    float pose_parameter[POSE_PARAMETERS_COUNT];
    std::memcpy(pose_parameter, &g_ctx.local()->m_flPoseParameter(), POSE_PARAMETERS_COUNT * sizeof(float));  // Копируем параметры позы нахуй

    AnimationLayer layers[ANIMATION_LAYERS_COUNT];
    std::memcpy(layers, g_ctx.local()->get_animlayers(), g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));  // Копируем слои анимации нахуй

    local_data.prediction_animstate->m_pBaseEntity = g_ctx.local();  // Устанавливаем базовую сущность нахуй
    util::update_state(local_data.prediction_animstate, ZERO);  // Обновляем состояние нахуй

    g_ctx.local()->setup_bones_fixed(g_ctx.globals.prediction_matrix, BONE_USED_BY_HITBOX);  // Устанавливаем кости нахуй

    std::memcpy(&g_ctx.local()->m_flPoseParameter(), pose_parameter, POSE_PARAMETERS_COUNT * sizeof(float));  // Копируем параметры позы нахуй
    std::memcpy(g_ctx.local()->get_animlayers(), layers, g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));  // Копируем слои анимации нахуй
}

void local_animations::update_fake_animations()
{
    if (tickcount != m_globals()->m_tickcount)
    {
        tickcount = m_globals()->m_tickcount;
        save_animlayers();  // Сохраняем слои анимации нахуй
        update_animstate();  // Обновляем состояние анимации нахуй
        update_abs_angles();  // Обновляем абсолютные углы нахуй
        save_pose_parameter();  // Сохраняем параметры позы нахуй
    }
    else
    {
        update_animstate_framecount();  // Обновляем счетчик кадров нахуй
    }

    update_goal_feet_yaw();  // Обновляем цель yaw нахуй
    update_abs_angles_in_entity();  // Обновляем абсолютные углы в сущности нахуй
    restore_pose_parameter();  // Восстанавливаем параметры позы нахуй
}

void local_animations::update_local_animations(c_baseplayeranimationstate& animstate)
{
    if (tickcount != m_globals()->m_tickcount)
    {
        tickcount = m_globals()->m_tickcount;
        save_animlayers();  // Сохраняем слои анимации нахуй
        update_animstate(animstate);  // Обновляем состояние анимации нахуй
        update_abs_angles();  // Обновляем абсолютные углы нахуй
        save_pose_parameter();  // Сохраняем параметры позы нахуй
    }
    else
    {
        animstate.m_iLastClientSideAnimationUpdateFramecount = m_globals()->m_framecount;  // Обновляем счетчик кадров нахуй
    }

    update_goal_feet_yaw(animstate);  // Обновляем цель yaw нахуй
    update_abs_angles_in_entity(animstate);  // Обновляем абсолютные углы в сущности нахуй
    restore_pose_parameter();  // Восстанавливаем параметры позы нахуй
}
мдааа, говно код лютый…
 
Сверху Снизу