Вопрос Skinchanger

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Июл 2023
Сообщения
84
Реакции
2
крч у меня в сч когда ставишь скин то модель не ставится но если выкинуть и подобрать то будет типо Вы подобрали: "{название скина}" а модели не будет
skins.cpp:
Expand Collapse Copy
#include "skins.hpp"
#include "../../darkside.hpp"

#include <iostream>
#include <filesystem>
#include <algorithm>
#include <random>
#include <unordered_map>

void c_skins::dump_items()
{
    auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
    if (!item_schema)
        return;

    const auto& vec_items = item_schema->m_sorted_item_definition_map;

    for (const auto& it : vec_items)
    {
        c_econ_item_definition* item = it.m_value;
        if (!item)
            continue;

        const bool is_agent = item->is_agent();
        const bool is_knife = item->is_knife(true);

        const char* item_base_name = item->m_item_base_name;
        if (!item_base_name || item_base_name[0] == '\0')
            continue;

        if (is_agent)
        {
            m_agents.m_dumped_agent_models.emplace_back(item->get_model_name());
            m_agents.m_dumped_agent_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }

        if (is_knife)
        {
            m_knives.m_dumped_knife_models.emplace_back(item->get_model_name());
            m_knives.m_dumped_knife_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }
    }
}

void c_skins::init_paint_kits()
{
    // CZ75-Auto
    m_cz75_paint_kits = {
        {"Victoria", 270}, {"The Fuschia Is Now", 269}, {"Tigris", 350}, {"Tread Plate", 268},
        {"Chalice", 325}, {"Hexane", 218}, {"Twist", 334}, {"Poison Dart", 315},
        {"Crimson Web", 12}, {"Nitro", 254}, {"Tuxedo", 297}, {"Green Plaid", 366}
    };

    // Desert Eagle
    m_deagle_paint_kits = {
        {"Golden Koi", 185}, {"Conspiracy", 351}, {"Cobalt Disruption", 231}, {"Hypnotic", 61},
        {"Naga", 397}, {"Crimson Web", 12}, {"Heirloom", 273}, {"Pilot", 347},
        {"Hand Cannon", 328}, {"Blaze", 37}, {"Meteorite", 296}, {"Urban Rubble", 237},
        {"Urban DDPAT", 17}, {"Mudder", 90}
    };

    // Dual Berettas
    m_dual_berettas_paint_kits = {
        {"Urban Shock", 396}, {"Marina", 261}, {"Hemoglobin", 220}, {"Cobalt Quartz", 249},
        {"Demolition", 153}, {"Retribution", 307}, {"Panther", 276}, {"Black Limba", 172},
        {"Anodized Navy", 28}, {"Stained", 43}, {"Briar", 330}, {"Contractor", 46}, {"Colony", 47}
    };

    // Five-SeveN
    m_five_seven_paint_kits = {
        {"Fowl Play", 352}, {"Copper Galaxy", 274}, {"Case Hardened", 44}, {"Urban Hazard", 354},
        {"Kami", 265}, {"Nightshade", 223}, {"Silver Quartz", 252}, {"Hot Shot", 377},
        {"Orange Peel", 141}, {"Candy Apple", 3}, {"Contractor", 46}, {"Forest Night", 78},
        {"Anodized Gunmetal", 210}, {"Jungle", 151}
    };

    // Glock-18
    m_glock_paint_kits = {
        {"Water Elemental", 353}, {"Grinder", 381}, {"Steel Disruption", 230}, {"Dragon Tattoo", 48},
        {"Fade", 38}, {"Brass", 159}, {"Catacombs", 399}, {"Blue Fissure", 278},
        {"Reactor", 367}, {"Candy Apple", 3}, {"Night", 40}, {"Death Rattle", 293},
        {"Groundwater", 209}, {"Sand Dune", 208}
    };

    // P2000
    m_p2000_paint_kits = {
        {"Fire Elemental", 389}, {"Corticera", 181}, {"Ocean Foam", 211}, {"Amber Fade", 246},
        {"Scorpion", 71}, {"Ivory", 357}, {"Pulse", 287}, {"Red FragCam", 275},
        {"Chainmail", 327}, {"Silver", 32}, {"Coach Class", 346}, {"Grassland", 95},
        {"Granite Marbleized", 21}, {"Grassland Leaves", 104}
    };

    // P250
    m_p250_paint_kits = {
        {"Muertos", 404}, {"Cartel", 388}, {"Undertow", 271}, {"Mehndi", 258},
        {"Franklin", 295}, {"Supernova", 358}, {"Splash", 162}, {"Nuclear Threat", 168},
        {"Steel Disruption", 230}, {"Hive", 219}, {"Modern Hunter", 164}, {"Contamination", 373},
        {"Metallic DDPAT", 34}, {"Facets", 207}, {"Gunsmoke", 15}, {"Sand Dune", 208},
        {"Boreal Forest", 77}, {"Bone Mask", 27}
    };

    // Tec-9
    m_tec9_paint_kits = {
        {"Titanium Bit", 272}, {"Red Quartz", 248}, {"Nuclear Threat", 168}, {"Isaac", 303},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Toxic", 374}, {"Brass", 159},
        {"Ossified", 36}, {"VariCamo", 235}, {"Urban DDPAT", 17}, {"Groundwater", 209},
        {"Army Mesh", 242}, {"Tornado", 101}
    };

    // USP-S
    m_usps_paint_kits = {
        {"Caiman", 339}, {"Orion", 313}, {"Serum", 221}, {"Guardian", 257},
        {"Overgrowth", 183}, {"Dark Water", 60}, {"Road Rash", 318}, {"Blood Tiger", 217},
        {"Stainless", 277}, {"Business Class", 364}, {"Night Ops", 236}, {"Royal Blue", 332},
        {"Forest Leaves", 25}
    };

    // AK-47
    m_ak47_paint_kits = {
        {"Wasteland Rebel", 380}, {"Jaguar", 316}, {"Vulcan", 302}, {"Fire Serpent", 180},
        {"Cartel", 388}, {"Redline", 259}, {"Red Laminate", 14}, {"Case Hardened", 44},
        {"Jet Set", 340}, {"Blue Laminate", 226}, {"First Class", 341}, {"Emerald Pinstripe", 300},
        {"Black Laminate", 172}, {"Safari Mesh", 72}, {"Jungle Spray", 122}, {"Predator", 170}
    };

    // AUG
    m_aug_paint_kits = {
        {"Chameleon", 280}, {"Bengal Tiger", 9}, {"Torque", 305}, {"Wings", 73},
        {"Anodized Navy", 28}, {"Hot Rod", 33}, {"Copperhead", 10}, {"Radiation Hazard", 167},
        {"Condemned", 110}, {"Contractor", 46}, {"Storm", 100}, {"Colony", 47}
    };

    // AWP
    m_awp_paint_kits = {
        {"Man-o'-war", 395}, {"Asiimov", 255}, {"Lightning Strike", 279}, {"Dragon Lore", 344},
        {"Corticera", 181}, {"Redline", 259}, {"Electric Hive", 227}, {"Graphite", 212},
        {"BOOM", 174}, {"Pink DDPAT", 84}, {"Pit Viper", 251}, {"Snake Camo", 30},
        {"Safari Mesh", 72}
    };

    // FAMAS
    m_famas_paint_kits = {
        {"Afterimage", 154}, {"Sergeant", 288}, {"Pulse", 287}, {"Styx", 371},
        {"Spitfire", 194}, {"Hexane", 218}, {"Doomkitty", 178}, {"Teardown", 244},
        {"Cyanospatter", 92}, {"Colony", 47}, {"Contrast Spray", 22}
    };

    // G3SG1
    m_g3sg1_paint_kits = {
        {"Murky", 382}, {"Azure Zebra", 229}, {"Demeter", 195}, {"Green Apple", 294},
        {"VariCamo", 235}, {"Arctic Camo", 6}, {"Contractor", 46}, {"Desert Storm", 8},
        {"Safari Mesh", 72}
    };

    // Galil AR
    m_galil_paint_kits = {
        {"Chatterbox", 398}, {"Orange DDPAT", 83}, {"Cerberus", 379}, {"Kami", 265},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Shattered", 192}, {"Tuxedo", 297},
        {"VariCamo", 235}, {"Winter Forest", 76}, {"Sage Spray", 119}, {"Hunting Blind", 241}
    };

    // M4A1-S
    m_m4a1s_paint_kits = {
        {"Cyrex", 312}, {"Atomic Alloy", 301}, {"Guardian", 257}, {"Knight", 326},
        {"Master Piece", 321}, {"Basilisk", 383}, {"Bright Water", 189}, {"Dark Water", 60},
        {"Nitro", 254}, {"Blood Tiger", 217}, {"VariCamo", 235}, {"Boreal Forest", 77}
    };

    // M4A4
    m_m4a4_paint_kits = {
        {"Howl", 309}, {"Bullet Rain", 155}, {"Desert-Strike", 336}, {"Asiimov", 255},
        {"X-Ray", 215}, {"Dragon King", 400}, {"Griffin", 384}, {"Zirka", 187},
        {"Modern Hunter", 164}, {"Faded Zebra", 176}, {"Radiation Hazard", 167}, {"Urban DDPAT", 17},
        {"Tornado", 101}, {"Jungle Tiger", 16}, {"Desert Storm", 8}
    };

    // SCAR-20
    m_scar20_paint_kits = {
        {"Cardiac", 391}, {"Cyrex", 312}, {"Splash Jam", 165}, {"Emerald", 196},
        {"Grotto", 406}, {"Crimson Web", 12}, {"Carbon Fiber", 70}, {"Palm", 157},
        {"Storm", 100}, {"Contractor", 46}
    };

    // SG 553
    m_sg553_paint_kits = {
        {"Pulse", 287}, {"Wave Spray", 186}, {"Ultraviolet", 98}, {"Damascus Steel", 247},
        {"Anodized Navy", 28}, {"Fallout Warning", 169}, {"Traveler", 363}, {"Gator Mesh", 243},
        {"Army Sheen", 298}, {"Waves Perforated", 136}, {"Tornado", 101}
    };

    // SSG 08
    m_ssg08_paint_kits = {
        {"Blood in the Water", 222}, {"Dark Water", 60}, {"Abyss", 361}, {"Splashed", 162},
        {"Detour", 319}, {"Acid Fade", 253}, {"Tropical Storm", 233}, {"Mayan Dreams", 200},
        {"Sand Dune", 208}, {"Blue Spruce", 96}, {"Lichen Dashed", 26}
    };

    // MAC-10
    m_mac10_paint_kits = {
        {"Malachite", 402}, {"Tatter", 337}, {"Curse", 310}, {"Heat", 284},
        {"Graven", 188}, {"Ultraviolet", 98}, {"Nuclear Garden", 372}, {"Amber Fade", 246},
        {"Commuter", 343}, {"Silver", 32}, {"Palm", 157}, {"Candy Apple", 3},
        {"Indigo", 333}, {"Tornado", 101}, {"Urban DDPAT", 17}
    };

    // MP7
    m_mp7_paint_kits = {
        {"Ocean Foam", 211}, {"Urban Hazard", 354}, {"Skulls", 11}, {"Anodized Navy", 28},
        {"Whiteout", 102}, {"Gunsmoke", 15}, {"Orange Peel", 141}, {"Olive Plaid", 365},
        {"Forest DDPAT", 5}, {"Army Recon", 245}, {"Groundwater", 209}
    };

    // MP9
    m_mp9_paint_kits = {
        {"Rose Iron", 262}, {"Hypnotic", 61}, {"Bulldozer", 39}, {"Deadly Poison", 403},
        {"Dart", 386}, {"Setting Sun", 368}, {"Dark Age", 329}, {"Hot Rod", 33},
        {"Orange Peel", 141}, {"Green Plaid", 366}, {"Storm", 100}, {"Sand Dashed", 148},
        {"Dry Season", 199}
    };

    // PP-Bizon
    m_bizon_paint_kits = {
        {"Blue Streak", 13}, {"Osiris", 349}, {"Antique", 286}, {"Cobalt Halftone", 267},
        {"Water Sigil", 224}, {"Brass", 159}, {"Rust Coat", 203}, {"Modern Hunter", 164},
        {"Chemical Green", 376}, {"Night Ops", 236}, {"Carbon Fiber", 70}, {"Sand Dashed", 148},
        {"Urban Dashed", 147}, {"Irradiated Alert", 171}, {"Forest Leaves", 25}
    };

    // P90
    m_p90_paint_kits = {
        {"Asiimov", 255}, {"Death by Kitty", 156}, {"Trigon", 283}, {"Cold Blooded", 67},
        {"Emerald Dragon", 182}, {"Virus", 20}, {"Blind Spot", 228}, {"Module", 335},
        {"Desert Warfare", 311}, {"Teardown", 244}, {"Glacier Mesh", 111}, {"Leather", 342},
        {"Ash Wood", 234}, {"Fallout Warning", 169}, {"Storm", 100}, {"Sand Spray", 124},
        {"Scorched", 175}
    };

    // UMP-45
    m_ump45_paint_kits = {
        {"Delusion", 392}, {"Labyrinth", 362}, {"Corporal", 281}, {"Bone Pile", 193},
        {"Blaze", 37}, {"Carbon Fiber", 70}, {"Gunsmoke", 15}, {"Fallout Warning", 169},
        {"Indigo", 333}, {"Scorched", 175}, {"Urban DDPAT", 17}, {"Caramel", 93}
    };

    // Mag-7
    m_mag7_paint_kits = {
        {"Bulldozer", 39}, {"Firestarter", 385}, {"Heaven Guard", 291}, {"Memento", 177},
        {"Hazard", 198}, {"Silver", 32}, {"Metallic DDPAT", 34}, {"Storm", 100},
        {"Irradiated Alert", 171}, {"Sand Dune", 208}
    };

    // Nova
    m_nova_paint_kits = {
        {"Bloomstick", 62}, {"Antique", 286}, {"Koi", 356}, {"Rising Skull", 263},
        {"Graphite", 212}, {"Ghost Camo", 225}, {"Tempest", 191}, {"Modern Hunter", 164},
        {"Blaze Orange", 166}, {"Green Apple", 294}, {"Caged Steel", 299}, {"Candy Apple", 3},
        {"Predator", 170}, {"Sand Dune", 208}, {"Polar Mesh", 107}, {"Walnut", 158},
        {"Forest Leaves", 25}
    };

    // Sawed-Off
    m_sawedoff_paint_kits = {
        {"The Kraken", 256}, {"Serenity", 405}, {"Highwayman", 390}, {"Orange DDPAT", 83},
        {"First Class", 345}, {"Full Stop", 250}, {"Amber Fade", 246}, {"Copper", 41},
        {"Rust Coat", 203}, {"Snake Camo", 30}, {"Mosaico", 204}, {"Sage Spray", 119},
        {"Forest DDPAT", 5}, {"Irradiated Alert", 171}
    };

    // XM1014
    m_xm1014_paint_kits = {
        {"Tranquility", 393}, {"Heaven Guard", 291}, {"Quicksilver", 407}, {"Red Python", 320},
        {"Bone Machine", 370}, {"Red Leather", 348}, {"VariCamo Blue", 238}, {"Blaze Orange", 166},
        {"CaliCamo", 240}, {"Blue Steel", 42}, {"Fallout Warning", 169}, {"Blue Spruce", 96},
        {"Jungle", 151}, {"Grassland", 95}, {"Urban Perforated", 135}
    };

    // M249
    m_m249_paint_kits = {
        {"System Lock", 401}, {"Magma", 266}, {"Gator Mesh", 243}, {"Blizzard Marbleized", 75},
        {"Contrast Spray", 22}, {"Jungle DDPAT", 202}
    };

    // Negev
    m_negev_paint_kits = {
        {"Bratatat", 317}, {"Desert-Strike", 336}, {"Terrain", 285}, {"Anodized Navy", 28},
        {"Nuclear Waste", 369}, {"CaliCamo", 240}, {"Palm", 157}, {"Army Sheen", 298}
    };
}

void c_model_changer::update_player_models()
{
    player_models.clear();

    const std::string models_path = parser::GetDirectory() + xorstr_("csgo\\characters\\models\\");

    if (!std::filesystem::exists(models_path) || !std::filesystem::is_directory(models_path))
    {
        std::cout << "[ModelChanger] Models folder not found: " << models_path << std::endl;
        return;
    }

    try
    {
        for (const auto& entry : std::filesystem::recursive_directory_iterator(models_path))
        {
            if (!entry.is_regular_file())
                continue;

            std::string file_name = entry.path().filename().string();

            if (file_name.size() < 6)
                continue;

            if (file_name.substr(file_name.size() - 7) != xorstr_(".vmdl_c"))
                continue;

            if (file_name.find(xorstr_("arm")) != std::string::npos)
                continue;

            std::string model_path = entry.path().string();
            model_path = model_path.substr(0, model_path.size() - 2);
            std::replace(model_path.begin(), model_path.end(), '\\', '/');

            size_t pos = model_path.find(xorstr_("characters/models/"));
            if (pos != std::string::npos)
                model_path = model_path.substr(pos);

            Model_t pModel;
            pModel.name = file_name.substr(0, file_name.size() - 8);
            pModel.path = model_path;

            player_models.push_back(pModel);
        }

        std::cout << "[ModelChanger] Loaded " << player_models.size() << " player models." << std::endl;
    }
    catch (const std::filesystem::filesystem_error& e)
    {
        std::cerr << "[ModelChanger] Filesystem error: " << e.what() << std::endl;
    }
}

void c_model_changer::set_player_model()
{
    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (!g_ctx->m_local_pawn || !g_ctx->m_local_pawn->is_alive())
        return;

    if (player_models.empty())
        return;

    if (cur_player_model == ~1U)
        return;

    if (cur_player_model >= player_models.size())
        return;

    static uint32_t last_applied_model_index = ~1U;
    static auto last_apply_time = std::chrono::steady_clock::now();

    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - last_apply_time).count();

    if (elapsed < 5 && cur_player_model == last_applied_model_index)
        return;

    Model_t pModel = player_models[cur_player_model];
    const char* model_path = pModel.path.c_str();

    if (!model_path || strlen(model_path) < 5)
        return;

    try
    {
        // Pre-caching via ResourceSystem is optional and header is not available in this build
        // Apply model directly
        g_ctx->m_local_pawn->set_model(model_path);

        last_applied_model_index = cur_player_model;
        last_apply_time = now;

        std::cout << "[ModelChanger] Applied model: " << model_path << std::endl;
    }
    catch (...)
    {
        std::cerr << "[ModelChanger] Failed to apply model: " << model_path << std::endl;
    }
}

void c_skins::agent_changer(int stage)
{
 
}

void c_skins::knife_changer(int stage)
{
    if (!g_ctx->m_local_pawn || m_knives.m_dumped_knife_models.empty())
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
    if (!view_model_service)
        return;

    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
    if (!view_model)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_defenition = item->get_static_data();
        if (!item_defenition)
            continue;

        auto weapon_scene = weapon->m_scene_node();
        if (!weapon_scene)
            continue;

        auto view_model_scene = view_model->m_scene_node();
        if (!view_model_scene)
            continue;

        auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
        if (!item_schema)
            return;

        // Knife changer toggle not present in config in this build; proceed when knife is detected

        bool is_knife = item_defenition->is_knife(false);

        int current_weapon = get_skin_config(item->m_defenition_index());
        if (!is_knife && current_weapon == CONFIG_UNKNOWN)
            continue;

        if (is_knife && stage == 6)
        {
            int selectedKnife = g_cfg->skins.m_knives.m_selected;

            weapon->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
            item->m_defenition_index() = m_knives.m_knife_idxs.at(selectedKnife);

            if (view_model->m_weapon() == weapon->get_handle())
                view_model->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
        }
    }
}

void c_skins::skin_changer(int stage)
{
    if (!g_cfg->skins.m_enabled)
        return;

    if (!g_ctx->m_local_pawn || !g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    // Применяем скины только на стадии FRAME_NET_UPDATE_END (после получения данных от сервера)
    // и на FRAME_RENDER_START (перед рендерингом)
    // Убрали FRAME_RENDER_END чтобы не применять слишком часто
    // ВАЖНО: Применяем СИЛЬНЕЕ - каждый кадр перед рендерингом для надежности
    if (stage != FRAME_NET_UPDATE_END && stage != FRAME_RENDER_START)
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_defenition = item->get_static_data();
        if (!item_defenition)
            continue;

        // Пропускаем ножи (они обрабатываются в knife_changer)
        bool is_knife = item_defenition->is_knife(false);
        if (is_knife)
            continue;

        // Получаем конфиг для этого оружия
        int weapon_config = get_skin_config(item->m_defenition_index());
        if (weapon_config == CONFIG_UNKNOWN)
            continue;

        // Проверяем что есть настройки для этого оружия
        if (weapon_config < 0 || weapon_config >= 100)
            continue;

        auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];

        // Если paint kit не установлен, пропускаем
        if (skin_data.m_paint_kit == 0)
            continue;

        // ВАЖНО: Устанавливаем paint kit ПЕРЕД проверкой, чтобы он применялся даже если уже установлен
        // Это гарантирует что поле всегда будет установлено правильно
        // НЕ проверяем current_paint_kit - всегда устанавливаем для надежности
        weapon->m_paint_kit() = skin_data.m_paint_kit;

        // Применяем seed (если установлен, иначе используем случайный)
        if (skin_data.m_prev_skin != -1)
        {
            weapon->m_seed() = skin_data.m_prev_skin;
        }
        else
        {
            // Генерируем случайный seed если не установлен (но используем фиксированный для одного оружия)
            static std::unordered_map<uintptr_t, int> weapon_seeds;
            uintptr_t weapon_ptr = reinterpret_cast<uintptr_t>(weapon);
            if (weapon_seeds.find(weapon_ptr) == weapon_seeds.end())
            {
                static std::random_device rd;
                static std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(1, 1000);
                weapon_seeds[weapon_ptr] = dis(gen);
            }
            weapon->m_seed() = weapon_seeds[weapon_ptr];
        }

        // Применяем wear (по умолчанию 0.0 - Factory New)
        weapon->m_wear() = 0.0f;

        // Устанавливаем xuid для "легитимности" скина (важно для отображения)
        weapon->m_xuid_low() = 13371337;
        weapon->m_xuid_high() = 13371337;

        // ВАЖНО: НЕ меняем m_item_def_index, так как это ломает идентификацию оружия в инвентаре
        // Если нужно изменить тип оружия (например, для ножей), это делается отдельно в knife_changer
        // Для обычных скинов меняем только paint kit, seed и wear
    }
}

// Применить скин к конкретному оружию (вызывается из on_add_entity)
void c_skins::apply_skin_to_weapon(c_econ_entity* weapon)
{
    if (!weapon || !g_cfg->skins.m_enabled)
        return;

    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    c_attribute_container* attribute_manager = weapon->m_attribute_manager();
    if (!attribute_manager)
        return;

    c_econ_item_view* item = attribute_manager->m_item();
    if (!item)
        return;

    c_econ_item_definition* item_defenition = item->get_static_data();
    if (!item_defenition)
        return;

    // Пропускаем ножи
    bool is_knife = item_defenition->is_knife(false);
    if (is_knife)
        return;

    // Получаем конфиг для этого оружия
    int weapon_config = get_skin_config(item->m_defenition_index());
    if (weapon_config == CONFIG_UNKNOWN)
        return;

    if (weapon_config < 0 || weapon_config >= 100)
        return;

    auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];

    if (skin_data.m_paint_kit == 0)
        return;

    // Применяем paint kit
    weapon->m_paint_kit() = skin_data.m_paint_kit;

    // Применяем seed
    if (skin_data.m_prev_skin != -1)
    {
        weapon->m_seed() = skin_data.m_prev_skin;
    }
    else
    {
        static std::random_device rd;
        static std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 1000);
        weapon->m_seed() = dis(gen);
    }

    // Применяем wear
    weapon->m_wear() = 0.0f;

    // Устанавливаем xuid
    weapon->m_xuid_low() = 13371337;
    weapon->m_xuid_high() = 13371337;

    // ВАЖНО: Пытаемся принудительно обновить модель после установки paint kit
    // Это может помочь обновить визуальную модель
    // Получаем текущую модель и переустанавливаем её
    c_base_entity* base_weapon = reinterpret_cast<c_base_entity*>(weapon);
    if (base_weapon && base_weapon->m_scene_node()) {
        // Пытаемся получить модель через scene node
        // Может быть нужно вызвать какую-то функцию обновления модели
        // Но в CS2 это может быть сложно без доступа к внутренним функциям
    }
}
1762023990196.png
база: дарксайд
и да я мега вайб кодер💪💪💪
 
w база xaxa

проблема, наверное, во всем этом чертовом коде? но серьезно перекодировать:))
и да, вы уверены, что ваши подписи верны?


вот пример:



C++:
Expand Collapse Copy
#include "skins.hpp"
#include "../../darkside.hpp"

#include <iostream>
#include <filesystem>
#include <algorithm>
#include <random>
#include <unordered_map>

void c_skins::skin_changer(int stage)
{
    if (!g_cfg->skins.m_enabled)
        return;

    if (!g_ctx->m_local_pawn || !g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (stage != FRAME_NET_UPDATE_END && stage != FRAME_RENDER_START)
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(
            g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_def = item->get_static_data();
        if (!item_def)
            continue;

        // skip knives (handled separately)
        if (item_def->is_knife(false))
            continue;

        int weapon_config = get_skin_config(item->m_defenition_index());
        if (weapon_config == CONFIG_UNKNOWN)
            continue;

        auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];
        if (skin_data.m_paint_kit == 0)
            continue;

        // apply paint kit
        weapon->m_paint_kit() = skin_data.m_paint_kit;

        // apply seed
        if (skin_data.m_prev_skin != -1)
            weapon->m_seed() = skin_data.m_prev_skin;
        else {
            static std::unordered_map<uintptr_t, int> weapon_seeds;
            uintptr_t weapon_ptr = reinterpret_cast<uintptr_t>(weapon);
            if (weapon_seeds.find(weapon_ptr) == weapon_seeds.end()) {
                static std::random_device rd;
                static std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(1, 1000);
                weapon_seeds[weapon_ptr] = dis(gen);
            }
            weapon->m_seed() = weapon_seeds[weapon_ptr];
        }

        // wear
        weapon->m_wear() = 0.0f;

        // xuid
        weapon->m_xuid_low() = 13371337;
        weapon->m_xuid_high() = 13371337;

        //  force model refresh (this was missing!)
        if (weapon->m_scene_node()) {
            const char* model_path = item_def->get_model_name();
            if (model_path && strlen(model_path) > 5) {
                weapon->set_model(model_path);

                // also update viewmodel if this is the active weapon
                c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
                if (view_model_service) {
                    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(
                        g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
                    if (view_model && view_model->m_weapon() == weapon->get_handle())
                        view_model->set_model(model_path);
                }
            }
        }
    }
}


Проблема в твоём скинченджере была в том, что ты менял только paint kit, seed, wear и XUID, но не обновлял саму модель оружия. Поэтому название скина отображалось правильно (в инвентаре и при поднятии), но в руках модель оставалась стандартной. Для ножей это работало, потому что в knife_changer ты вызывал set_model() и менял m_item_def_index, а для обычных пушек этого не делал.

Исправление заключалось в том, чтобы добавить вызов set_model() и для обычного оружия, а также обновлять viewmodel, если это активное оружие. Теперь модель обновляется сразу, а не только после того, как ты выбросишь и подберёшь пушку.

Что дальше: стоит объединить логику для ножей и пушек, чтобы не было дублирования кода, добавить обработку m_item_def_index, если захочешь менять тип оружия (например, M4A4 ↔ M4A1‑S), и доработать механизм обновления, чтобы скины всегда применялись стабильно. Также можно сделать seed и wear настраиваемыми, а не случайными, чтобы контролировать внешний вид скинов.

Вкратце: проблема — отсутствие обновления модели, решение — вызов set_model(), следующий шаг — унификация и доработка системы.


мой разлад: 5v2pq
 
крч у меня в сч когда ставишь скин то модель не ставится но если выкинуть и подобрать то будет типо Вы подобрали: "{название скина}" а модели не будет
skins.cpp:
Expand Collapse Copy
#include "skins.hpp"
#include "../../darkside.hpp"

#include <iostream>
#include <filesystem>
#include <algorithm>
#include <random>
#include <unordered_map>

void c_skins::dump_items()
{
    auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
    if (!item_schema)
        return;

    const auto& vec_items = item_schema->m_sorted_item_definition_map;

    for (const auto& it : vec_items)
    {
        c_econ_item_definition* item = it.m_value;
        if (!item)
            continue;

        const bool is_agent = item->is_agent();
        const bool is_knife = item->is_knife(true);

        const char* item_base_name = item->m_item_base_name;
        if (!item_base_name || item_base_name[0] == '\0')
            continue;

        if (is_agent)
        {
            m_agents.m_dumped_agent_models.emplace_back(item->get_model_name());
            m_agents.m_dumped_agent_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }

        if (is_knife)
        {
            m_knives.m_dumped_knife_models.emplace_back(item->get_model_name());
            m_knives.m_dumped_knife_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }
    }
}

void c_skins::init_paint_kits()
{
    // CZ75-Auto
    m_cz75_paint_kits = {
        {"Victoria", 270}, {"The Fuschia Is Now", 269}, {"Tigris", 350}, {"Tread Plate", 268},
        {"Chalice", 325}, {"Hexane", 218}, {"Twist", 334}, {"Poison Dart", 315},
        {"Crimson Web", 12}, {"Nitro", 254}, {"Tuxedo", 297}, {"Green Plaid", 366}
    };

    // Desert Eagle
    m_deagle_paint_kits = {
        {"Golden Koi", 185}, {"Conspiracy", 351}, {"Cobalt Disruption", 231}, {"Hypnotic", 61},
        {"Naga", 397}, {"Crimson Web", 12}, {"Heirloom", 273}, {"Pilot", 347},
        {"Hand Cannon", 328}, {"Blaze", 37}, {"Meteorite", 296}, {"Urban Rubble", 237},
        {"Urban DDPAT", 17}, {"Mudder", 90}
    };

    // Dual Berettas
    m_dual_berettas_paint_kits = {
        {"Urban Shock", 396}, {"Marina", 261}, {"Hemoglobin", 220}, {"Cobalt Quartz", 249},
        {"Demolition", 153}, {"Retribution", 307}, {"Panther", 276}, {"Black Limba", 172},
        {"Anodized Navy", 28}, {"Stained", 43}, {"Briar", 330}, {"Contractor", 46}, {"Colony", 47}
    };

    // Five-SeveN
    m_five_seven_paint_kits = {
        {"Fowl Play", 352}, {"Copper Galaxy", 274}, {"Case Hardened", 44}, {"Urban Hazard", 354},
        {"Kami", 265}, {"Nightshade", 223}, {"Silver Quartz", 252}, {"Hot Shot", 377},
        {"Orange Peel", 141}, {"Candy Apple", 3}, {"Contractor", 46}, {"Forest Night", 78},
        {"Anodized Gunmetal", 210}, {"Jungle", 151}
    };

    // Glock-18
    m_glock_paint_kits = {
        {"Water Elemental", 353}, {"Grinder", 381}, {"Steel Disruption", 230}, {"Dragon Tattoo", 48},
        {"Fade", 38}, {"Brass", 159}, {"Catacombs", 399}, {"Blue Fissure", 278},
        {"Reactor", 367}, {"Candy Apple", 3}, {"Night", 40}, {"Death Rattle", 293},
        {"Groundwater", 209}, {"Sand Dune", 208}
    };

    // P2000
    m_p2000_paint_kits = {
        {"Fire Elemental", 389}, {"Corticera", 181}, {"Ocean Foam", 211}, {"Amber Fade", 246},
        {"Scorpion", 71}, {"Ivory", 357}, {"Pulse", 287}, {"Red FragCam", 275},
        {"Chainmail", 327}, {"Silver", 32}, {"Coach Class", 346}, {"Grassland", 95},
        {"Granite Marbleized", 21}, {"Grassland Leaves", 104}
    };

    // P250
    m_p250_paint_kits = {
        {"Muertos", 404}, {"Cartel", 388}, {"Undertow", 271}, {"Mehndi", 258},
        {"Franklin", 295}, {"Supernova", 358}, {"Splash", 162}, {"Nuclear Threat", 168},
        {"Steel Disruption", 230}, {"Hive", 219}, {"Modern Hunter", 164}, {"Contamination", 373},
        {"Metallic DDPAT", 34}, {"Facets", 207}, {"Gunsmoke", 15}, {"Sand Dune", 208},
        {"Boreal Forest", 77}, {"Bone Mask", 27}
    };

    // Tec-9
    m_tec9_paint_kits = {
        {"Titanium Bit", 272}, {"Red Quartz", 248}, {"Nuclear Threat", 168}, {"Isaac", 303},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Toxic", 374}, {"Brass", 159},
        {"Ossified", 36}, {"VariCamo", 235}, {"Urban DDPAT", 17}, {"Groundwater", 209},
        {"Army Mesh", 242}, {"Tornado", 101}
    };

    // USP-S
    m_usps_paint_kits = {
        {"Caiman", 339}, {"Orion", 313}, {"Serum", 221}, {"Guardian", 257},
        {"Overgrowth", 183}, {"Dark Water", 60}, {"Road Rash", 318}, {"Blood Tiger", 217},
        {"Stainless", 277}, {"Business Class", 364}, {"Night Ops", 236}, {"Royal Blue", 332},
        {"Forest Leaves", 25}
    };

    // AK-47
    m_ak47_paint_kits = {
        {"Wasteland Rebel", 380}, {"Jaguar", 316}, {"Vulcan", 302}, {"Fire Serpent", 180},
        {"Cartel", 388}, {"Redline", 259}, {"Red Laminate", 14}, {"Case Hardened", 44},
        {"Jet Set", 340}, {"Blue Laminate", 226}, {"First Class", 341}, {"Emerald Pinstripe", 300},
        {"Black Laminate", 172}, {"Safari Mesh", 72}, {"Jungle Spray", 122}, {"Predator", 170}
    };

    // AUG
    m_aug_paint_kits = {
        {"Chameleon", 280}, {"Bengal Tiger", 9}, {"Torque", 305}, {"Wings", 73},
        {"Anodized Navy", 28}, {"Hot Rod", 33}, {"Copperhead", 10}, {"Radiation Hazard", 167},
        {"Condemned", 110}, {"Contractor", 46}, {"Storm", 100}, {"Colony", 47}
    };

    // AWP
    m_awp_paint_kits = {
        {"Man-o'-war", 395}, {"Asiimov", 255}, {"Lightning Strike", 279}, {"Dragon Lore", 344},
        {"Corticera", 181}, {"Redline", 259}, {"Electric Hive", 227}, {"Graphite", 212},
        {"BOOM", 174}, {"Pink DDPAT", 84}, {"Pit Viper", 251}, {"Snake Camo", 30},
        {"Safari Mesh", 72}
    };

    // FAMAS
    m_famas_paint_kits = {
        {"Afterimage", 154}, {"Sergeant", 288}, {"Pulse", 287}, {"Styx", 371},
        {"Spitfire", 194}, {"Hexane", 218}, {"Doomkitty", 178}, {"Teardown", 244},
        {"Cyanospatter", 92}, {"Colony", 47}, {"Contrast Spray", 22}
    };

    // G3SG1
    m_g3sg1_paint_kits = {
        {"Murky", 382}, {"Azure Zebra", 229}, {"Demeter", 195}, {"Green Apple", 294},
        {"VariCamo", 235}, {"Arctic Camo", 6}, {"Contractor", 46}, {"Desert Storm", 8},
        {"Safari Mesh", 72}
    };

    // Galil AR
    m_galil_paint_kits = {
        {"Chatterbox", 398}, {"Orange DDPAT", 83}, {"Cerberus", 379}, {"Kami", 265},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Shattered", 192}, {"Tuxedo", 297},
        {"VariCamo", 235}, {"Winter Forest", 76}, {"Sage Spray", 119}, {"Hunting Blind", 241}
    };

    // M4A1-S
    m_m4a1s_paint_kits = {
        {"Cyrex", 312}, {"Atomic Alloy", 301}, {"Guardian", 257}, {"Knight", 326},
        {"Master Piece", 321}, {"Basilisk", 383}, {"Bright Water", 189}, {"Dark Water", 60},
        {"Nitro", 254}, {"Blood Tiger", 217}, {"VariCamo", 235}, {"Boreal Forest", 77}
    };

    // M4A4
    m_m4a4_paint_kits = {
        {"Howl", 309}, {"Bullet Rain", 155}, {"Desert-Strike", 336}, {"Asiimov", 255},
        {"X-Ray", 215}, {"Dragon King", 400}, {"Griffin", 384}, {"Zirka", 187},
        {"Modern Hunter", 164}, {"Faded Zebra", 176}, {"Radiation Hazard", 167}, {"Urban DDPAT", 17},
        {"Tornado", 101}, {"Jungle Tiger", 16}, {"Desert Storm", 8}
    };

    // SCAR-20
    m_scar20_paint_kits = {
        {"Cardiac", 391}, {"Cyrex", 312}, {"Splash Jam", 165}, {"Emerald", 196},
        {"Grotto", 406}, {"Crimson Web", 12}, {"Carbon Fiber", 70}, {"Palm", 157},
        {"Storm", 100}, {"Contractor", 46}
    };

    // SG 553
    m_sg553_paint_kits = {
        {"Pulse", 287}, {"Wave Spray", 186}, {"Ultraviolet", 98}, {"Damascus Steel", 247},
        {"Anodized Navy", 28}, {"Fallout Warning", 169}, {"Traveler", 363}, {"Gator Mesh", 243},
        {"Army Sheen", 298}, {"Waves Perforated", 136}, {"Tornado", 101}
    };

    // SSG 08
    m_ssg08_paint_kits = {
        {"Blood in the Water", 222}, {"Dark Water", 60}, {"Abyss", 361}, {"Splashed", 162},
        {"Detour", 319}, {"Acid Fade", 253}, {"Tropical Storm", 233}, {"Mayan Dreams", 200},
        {"Sand Dune", 208}, {"Blue Spruce", 96}, {"Lichen Dashed", 26}
    };

    // MAC-10
    m_mac10_paint_kits = {
        {"Malachite", 402}, {"Tatter", 337}, {"Curse", 310}, {"Heat", 284},
        {"Graven", 188}, {"Ultraviolet", 98}, {"Nuclear Garden", 372}, {"Amber Fade", 246},
        {"Commuter", 343}, {"Silver", 32}, {"Palm", 157}, {"Candy Apple", 3},
        {"Indigo", 333}, {"Tornado", 101}, {"Urban DDPAT", 17}
    };

    // MP7
    m_mp7_paint_kits = {
        {"Ocean Foam", 211}, {"Urban Hazard", 354}, {"Skulls", 11}, {"Anodized Navy", 28},
        {"Whiteout", 102}, {"Gunsmoke", 15}, {"Orange Peel", 141}, {"Olive Plaid", 365},
        {"Forest DDPAT", 5}, {"Army Recon", 245}, {"Groundwater", 209}
    };

    // MP9
    m_mp9_paint_kits = {
        {"Rose Iron", 262}, {"Hypnotic", 61}, {"Bulldozer", 39}, {"Deadly Poison", 403},
        {"Dart", 386}, {"Setting Sun", 368}, {"Dark Age", 329}, {"Hot Rod", 33},
        {"Orange Peel", 141}, {"Green Plaid", 366}, {"Storm", 100}, {"Sand Dashed", 148},
        {"Dry Season", 199}
    };

    // PP-Bizon
    m_bizon_paint_kits = {
        {"Blue Streak", 13}, {"Osiris", 349}, {"Antique", 286}, {"Cobalt Halftone", 267},
        {"Water Sigil", 224}, {"Brass", 159}, {"Rust Coat", 203}, {"Modern Hunter", 164},
        {"Chemical Green", 376}, {"Night Ops", 236}, {"Carbon Fiber", 70}, {"Sand Dashed", 148},
        {"Urban Dashed", 147}, {"Irradiated Alert", 171}, {"Forest Leaves", 25}
    };

    // P90
    m_p90_paint_kits = {
        {"Asiimov", 255}, {"Death by Kitty", 156}, {"Trigon", 283}, {"Cold Blooded", 67},
        {"Emerald Dragon", 182}, {"Virus", 20}, {"Blind Spot", 228}, {"Module", 335},
        {"Desert Warfare", 311}, {"Teardown", 244}, {"Glacier Mesh", 111}, {"Leather", 342},
        {"Ash Wood", 234}, {"Fallout Warning", 169}, {"Storm", 100}, {"Sand Spray", 124},
        {"Scorched", 175}
    };

    // UMP-45
    m_ump45_paint_kits = {
        {"Delusion", 392}, {"Labyrinth", 362}, {"Corporal", 281}, {"Bone Pile", 193},
        {"Blaze", 37}, {"Carbon Fiber", 70}, {"Gunsmoke", 15}, {"Fallout Warning", 169},
        {"Indigo", 333}, {"Scorched", 175}, {"Urban DDPAT", 17}, {"Caramel", 93}
    };

    // Mag-7
    m_mag7_paint_kits = {
        {"Bulldozer", 39}, {"Firestarter", 385}, {"Heaven Guard", 291}, {"Memento", 177},
        {"Hazard", 198}, {"Silver", 32}, {"Metallic DDPAT", 34}, {"Storm", 100},
        {"Irradiated Alert", 171}, {"Sand Dune", 208}
    };

    // Nova
    m_nova_paint_kits = {
        {"Bloomstick", 62}, {"Antique", 286}, {"Koi", 356}, {"Rising Skull", 263},
        {"Graphite", 212}, {"Ghost Camo", 225}, {"Tempest", 191}, {"Modern Hunter", 164},
        {"Blaze Orange", 166}, {"Green Apple", 294}, {"Caged Steel", 299}, {"Candy Apple", 3},
        {"Predator", 170}, {"Sand Dune", 208}, {"Polar Mesh", 107}, {"Walnut", 158},
        {"Forest Leaves", 25}
    };

    // Sawed-Off
    m_sawedoff_paint_kits = {
        {"The Kraken", 256}, {"Serenity", 405}, {"Highwayman", 390}, {"Orange DDPAT", 83},
        {"First Class", 345}, {"Full Stop", 250}, {"Amber Fade", 246}, {"Copper", 41},
        {"Rust Coat", 203}, {"Snake Camo", 30}, {"Mosaico", 204}, {"Sage Spray", 119},
        {"Forest DDPAT", 5}, {"Irradiated Alert", 171}
    };

    // XM1014
    m_xm1014_paint_kits = {
        {"Tranquility", 393}, {"Heaven Guard", 291}, {"Quicksilver", 407}, {"Red Python", 320},
        {"Bone Machine", 370}, {"Red Leather", 348}, {"VariCamo Blue", 238}, {"Blaze Orange", 166},
        {"CaliCamo", 240}, {"Blue Steel", 42}, {"Fallout Warning", 169}, {"Blue Spruce", 96},
        {"Jungle", 151}, {"Grassland", 95}, {"Urban Perforated", 135}
    };

    // M249
    m_m249_paint_kits = {
        {"System Lock", 401}, {"Magma", 266}, {"Gator Mesh", 243}, {"Blizzard Marbleized", 75},
        {"Contrast Spray", 22}, {"Jungle DDPAT", 202}
    };

    // Negev
    m_negev_paint_kits = {
        {"Bratatat", 317}, {"Desert-Strike", 336}, {"Terrain", 285}, {"Anodized Navy", 28},
        {"Nuclear Waste", 369}, {"CaliCamo", 240}, {"Palm", 157}, {"Army Sheen", 298}
    };
}

void c_model_changer::update_player_models()
{
    player_models.clear();

    const std::string models_path = parser::GetDirectory() + xorstr_("csgo\\characters\\models\\");

    if (!std::filesystem::exists(models_path) || !std::filesystem::is_directory(models_path))
    {
        std::cout << "[ModelChanger] Models folder not found: " << models_path << std::endl;
        return;
    }

    try
    {
        for (const auto& entry : std::filesystem::recursive_directory_iterator(models_path))
        {
            if (!entry.is_regular_file())
                continue;

            std::string file_name = entry.path().filename().string();

            if (file_name.size() < 6)
                continue;

            if (file_name.substr(file_name.size() - 7) != xorstr_(".vmdl_c"))
                continue;

            if (file_name.find(xorstr_("arm")) != std::string::npos)
                continue;

            std::string model_path = entry.path().string();
            model_path = model_path.substr(0, model_path.size() - 2);
            std::replace(model_path.begin(), model_path.end(), '\\', '/');

            size_t pos = model_path.find(xorstr_("characters/models/"));
            if (pos != std::string::npos)
                model_path = model_path.substr(pos);

            Model_t pModel;
            pModel.name = file_name.substr(0, file_name.size() - 8);
            pModel.path = model_path;

            player_models.push_back(pModel);
        }

        std::cout << "[ModelChanger] Loaded " << player_models.size() << " player models." << std::endl;
    }
    catch (const std::filesystem::filesystem_error& e)
    {
        std::cerr << "[ModelChanger] Filesystem error: " << e.what() << std::endl;
    }
}

void c_model_changer::set_player_model()
{
    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (!g_ctx->m_local_pawn || !g_ctx->m_local_pawn->is_alive())
        return;

    if (player_models.empty())
        return;

    if (cur_player_model == ~1U)
        return;

    if (cur_player_model >= player_models.size())
        return;

    static uint32_t last_applied_model_index = ~1U;
    static auto last_apply_time = std::chrono::steady_clock::now();

    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - last_apply_time).count();

    if (elapsed < 5 && cur_player_model == last_applied_model_index)
        return;

    Model_t pModel = player_models[cur_player_model];
    const char* model_path = pModel.path.c_str();

    if (!model_path || strlen(model_path) < 5)
        return;

    try
    {
        // Pre-caching via ResourceSystem is optional and header is not available in this build
        // Apply model directly
        g_ctx->m_local_pawn->set_model(model_path);

        last_applied_model_index = cur_player_model;
        last_apply_time = now;

        std::cout << "[ModelChanger] Applied model: " << model_path << std::endl;
    }
    catch (...)
    {
        std::cerr << "[ModelChanger] Failed to apply model: " << model_path << std::endl;
    }
}

void c_skins::agent_changer(int stage)
{
 
}

void c_skins::knife_changer(int stage)
{
    if (!g_ctx->m_local_pawn || m_knives.m_dumped_knife_models.empty())
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
    if (!view_model_service)
        return;

    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
    if (!view_model)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_defenition = item->get_static_data();
        if (!item_defenition)
            continue;

        auto weapon_scene = weapon->m_scene_node();
        if (!weapon_scene)
            continue;

        auto view_model_scene = view_model->m_scene_node();
        if (!view_model_scene)
            continue;

        auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
        if (!item_schema)
            return;

        // Knife changer toggle not present in config in this build; proceed when knife is detected

        bool is_knife = item_defenition->is_knife(false);

        int current_weapon = get_skin_config(item->m_defenition_index());
        if (!is_knife && current_weapon == CONFIG_UNKNOWN)
            continue;

        if (is_knife && stage == 6)
        {
            int selectedKnife = g_cfg->skins.m_knives.m_selected;

            weapon->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
            item->m_defenition_index() = m_knives.m_knife_idxs.at(selectedKnife);

            if (view_model->m_weapon() == weapon->get_handle())
                view_model->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
        }
    }
}

void c_skins::skin_changer(int stage)
{
    if (!g_cfg->skins.m_enabled)
        return;

    if (!g_ctx->m_local_pawn || !g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    // Применяем скины только на стадии FRAME_NET_UPDATE_END (после получения данных от сервера)
    // и на FRAME_RENDER_START (перед рендерингом)
    // Убрали FRAME_RENDER_END чтобы не применять слишком часто
    // ВАЖНО: Применяем СИЛЬНЕЕ - каждый кадр перед рендерингом для надежности
    if (stage != FRAME_NET_UPDATE_END && stage != FRAME_RENDER_START)
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_defenition = item->get_static_data();
        if (!item_defenition)
            continue;

        // Пропускаем ножи (они обрабатываются в knife_changer)
        bool is_knife = item_defenition->is_knife(false);
        if (is_knife)
            continue;

        // Получаем конфиг для этого оружия
        int weapon_config = get_skin_config(item->m_defenition_index());
        if (weapon_config == CONFIG_UNKNOWN)
            continue;

        // Проверяем что есть настройки для этого оружия
        if (weapon_config < 0 || weapon_config >= 100)
            continue;

        auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];

        // Если paint kit не установлен, пропускаем
        if (skin_data.m_paint_kit == 0)
            continue;

        // ВАЖНО: Устанавливаем paint kit ПЕРЕД проверкой, чтобы он применялся даже если уже установлен
        // Это гарантирует что поле всегда будет установлено правильно
        // НЕ проверяем current_paint_kit - всегда устанавливаем для надежности
        weapon->m_paint_kit() = skin_data.m_paint_kit;

        // Применяем seed (если установлен, иначе используем случайный)
        if (skin_data.m_prev_skin != -1)
        {
            weapon->m_seed() = skin_data.m_prev_skin;
        }
        else
        {
            // Генерируем случайный seed если не установлен (но используем фиксированный для одного оружия)
            static std::unordered_map<uintptr_t, int> weapon_seeds;
            uintptr_t weapon_ptr = reinterpret_cast<uintptr_t>(weapon);
            if (weapon_seeds.find(weapon_ptr) == weapon_seeds.end())
            {
                static std::random_device rd;
                static std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(1, 1000);
                weapon_seeds[weapon_ptr] = dis(gen);
            }
            weapon->m_seed() = weapon_seeds[weapon_ptr];
        }

        // Применяем wear (по умолчанию 0.0 - Factory New)
        weapon->m_wear() = 0.0f;

        // Устанавливаем xuid для "легитимности" скина (важно для отображения)
        weapon->m_xuid_low() = 13371337;
        weapon->m_xuid_high() = 13371337;

        // ВАЖНО: НЕ меняем m_item_def_index, так как это ломает идентификацию оружия в инвентаре
        // Если нужно изменить тип оружия (например, для ножей), это делается отдельно в knife_changer
        // Для обычных скинов меняем только paint kit, seed и wear
    }
}

// Применить скин к конкретному оружию (вызывается из on_add_entity)
void c_skins::apply_skin_to_weapon(c_econ_entity* weapon)
{
    if (!weapon || !g_cfg->skins.m_enabled)
        return;

    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    c_attribute_container* attribute_manager = weapon->m_attribute_manager();
    if (!attribute_manager)
        return;

    c_econ_item_view* item = attribute_manager->m_item();
    if (!item)
        return;

    c_econ_item_definition* item_defenition = item->get_static_data();
    if (!item_defenition)
        return;

    // Пропускаем ножи
    bool is_knife = item_defenition->is_knife(false);
    if (is_knife)
        return;

    // Получаем конфиг для этого оружия
    int weapon_config = get_skin_config(item->m_defenition_index());
    if (weapon_config == CONFIG_UNKNOWN)
        return;

    if (weapon_config < 0 || weapon_config >= 100)
        return;

    auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];

    if (skin_data.m_paint_kit == 0)
        return;

    // Применяем paint kit
    weapon->m_paint_kit() = skin_data.m_paint_kit;

    // Применяем seed
    if (skin_data.m_prev_skin != -1)
    {
        weapon->m_seed() = skin_data.m_prev_skin;
    }
    else
    {
        static std::random_device rd;
        static std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 1000);
        weapon->m_seed() = dis(gen);
    }

    // Применяем wear
    weapon->m_wear() = 0.0f;

    // Устанавливаем xuid
    weapon->m_xuid_low() = 13371337;
    weapon->m_xuid_high() = 13371337;

    // ВАЖНО: Пытаемся принудительно обновить модель после установки paint kit
    // Это может помочь обновить визуальную модель
    // Получаем текущую модель и переустанавливаем её
    c_base_entity* base_weapon = reinterpret_cast<c_base_entity*>(weapon);
    if (base_weapon && base_weapon->m_scene_node()) {
        // Пытаемся получить модель через scene node
        // Может быть нужно вызвать какую-то функцию обновления модели
        // Но в CS2 это может быть сложно без доступа к внутренним функциям
    }
}
Посмотреть вложение 318871база: дарксайд
и да я мега вайб кодер💪💪💪
натрешкодил, щас все исправлю
 
w база xaxa

проблема, наверное, во всем этом чертовом коде? но серьезно перекодировать:))
и да, вы уверены, что ваши подписи верны?


вот пример:



C++:
Expand Collapse Copy
#include "skins.hpp"
#include "../../darkside.hpp"

#include <iostream>
#include <filesystem>
#include <algorithm>
#include <random>
#include <unordered_map>

void c_skins::skin_changer(int stage)
{
    if (!g_cfg->skins.m_enabled)
        return;

    if (!g_ctx->m_local_pawn || !g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (stage != FRAME_NET_UPDATE_END && stage != FRAME_RENDER_START)
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(
            g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_def = item->get_static_data();
        if (!item_def)
            continue;

        // skip knives (handled separately)
        if (item_def->is_knife(false))
            continue;

        int weapon_config = get_skin_config(item->m_defenition_index());
        if (weapon_config == CONFIG_UNKNOWN)
            continue;

        auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];
        if (skin_data.m_paint_kit == 0)
            continue;

        // apply paint kit
        weapon->m_paint_kit() = skin_data.m_paint_kit;

        // apply seed
        if (skin_data.m_prev_skin != -1)
            weapon->m_seed() = skin_data.m_prev_skin;
        else {
            static std::unordered_map<uintptr_t, int> weapon_seeds;
            uintptr_t weapon_ptr = reinterpret_cast<uintptr_t>(weapon);
            if (weapon_seeds.find(weapon_ptr) == weapon_seeds.end()) {
                static std::random_device rd;
                static std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(1, 1000);
                weapon_seeds[weapon_ptr] = dis(gen);
            }
            weapon->m_seed() = weapon_seeds[weapon_ptr];
        }

        // wear
        weapon->m_wear() = 0.0f;

        // xuid
        weapon->m_xuid_low() = 13371337;
        weapon->m_xuid_high() = 13371337;

        //  force model refresh (this was missing!)
        if (weapon->m_scene_node()) {
            const char* model_path = item_def->get_model_name();
            if (model_path && strlen(model_path) > 5) {
                weapon->set_model(model_path);

                // also update viewmodel if this is the active weapon
                c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
                if (view_model_service) {
                    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(
                        g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
                    if (view_model && view_model->m_weapon() == weapon->get_handle())
                        view_model->set_model(model_path);
                }
            }
        }
    }
}


Проблема в твоём скинченджере была в том, что ты менял только paint kit, seed, wear и XUID, но не обновлял саму модель оружия. Поэтому название скина отображалось правильно (в инвентаре и при поднятии), но в руках модель оставалась стандартной. Для ножей это работало, потому что в knife_changer ты вызывал set_model() и менял m_item_def_index, а для обычных пушек этого не делал.

Исправление заключалось в том, чтобы добавить вызов set_model() и для обычного оружия, а также обновлять viewmodel, если это активное оружие. Теперь модель обновляется сразу, а не только после того, как ты выбросишь и подберёшь пушку.

Что дальше: стоит объединить логику для ножей и пушек, чтобы не было дублирования кода, добавить обработку m_item_def_index, если захочешь менять тип оружия (например, M4A4 ↔ M4A1‑S), и доработать механизм обновления, чтобы скины всегда применялись стабильно. Также можно сделать seed и wear настраиваемыми, а не случайными, чтобы контролировать внешний вид скинов.

Вкратце: проблема — отсутствие обновления модели, решение — вызов set_model(), следующий шаг — унификация и доработка системы.


мой разлад: 5v2pq
skins.cpp:
Expand Collapse Copy
#include "skins.hpp"
#include "../../darkside.hpp"

#include <iostream>
#include <filesystem>
#include <algorithm>
#include <random>
#include <unordered_map>

void c_skins::dump_items()
{
    auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
    if (!item_schema)
        return;

    const auto& vec_items = item_schema->m_sorted_item_definition_map;

    for (const auto& it : vec_items)
    {
        c_econ_item_definition* item = it.m_value;
        if (!item)
            continue;

        const bool is_agent = item->is_agent();
        const bool is_knife = item->is_knife(true);

        const char* item_base_name = item->m_item_base_name;
        if (!item_base_name || item_base_name[0] == '\0')
            continue;

        if (is_agent)
        {
            m_agents.m_dumped_agent_models.emplace_back(item->get_model_name());
            m_agents.m_dumped_agent_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }

        if (is_knife)
        {
            m_knives.m_dumped_knife_models.emplace_back(item->get_model_name());
            m_knives.m_dumped_knife_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }
    }
}

void c_skins::init_paint_kits()
{
    // CZ75-Auto
    m_cz75_paint_kits = {
        {"Victoria", 270}, {"The Fuschia Is Now", 269}, {"Tigris", 350}, {"Tread Plate", 268},
        {"Chalice", 325}, {"Hexane", 218}, {"Twist", 334}, {"Poison Dart", 315},
        {"Crimson Web", 12}, {"Nitro", 254}, {"Tuxedo", 297}, {"Green Plaid", 366}
    };

    // Desert Eagle
    m_deagle_paint_kits = {
        {"Golden Koi", 185}, {"Conspiracy", 351}, {"Cobalt Disruption", 231}, {"Hypnotic", 61},
        {"Naga", 397}, {"Crimson Web", 12}, {"Heirloom", 273}, {"Pilot", 347},
        {"Hand Cannon", 328}, {"Blaze", 37}, {"Meteorite", 296}, {"Urban Rubble", 237},
        {"Urban DDPAT", 17}, {"Mudder", 90}
    };

    // Dual Berettas
    m_dual_berettas_paint_kits = {
        {"Urban Shock", 396}, {"Marina", 261}, {"Hemoglobin", 220}, {"Cobalt Quartz", 249},
        {"Demolition", 153}, {"Retribution", 307}, {"Panther", 276}, {"Black Limba", 172},
        {"Anodized Navy", 28}, {"Stained", 43}, {"Briar", 330}, {"Contractor", 46}, {"Colony", 47}
    };

    // Five-SeveN
    m_five_seven_paint_kits = {
        {"Fowl Play", 352}, {"Copper Galaxy", 274}, {"Case Hardened", 44}, {"Urban Hazard", 354},
        {"Kami", 265}, {"Nightshade", 223}, {"Silver Quartz", 252}, {"Hot Shot", 377},
        {"Orange Peel", 141}, {"Candy Apple", 3}, {"Contractor", 46}, {"Forest Night", 78},
        {"Anodized Gunmetal", 210}, {"Jungle", 151}
    };

    // Glock-18
    m_glock_paint_kits = {
        {"Water Elemental", 353}, {"Grinder", 381}, {"Steel Disruption", 230}, {"Dragon Tattoo", 48},
        {"Fade", 38}, {"Brass", 159}, {"Catacombs", 399}, {"Blue Fissure", 278},
        {"Reactor", 367}, {"Candy Apple", 3}, {"Night", 40}, {"Death Rattle", 293},
        {"Groundwater", 209}, {"Sand Dune", 208}
    };

    // P2000
    m_p2000_paint_kits = {
        {"Fire Elemental", 389}, {"Corticera", 181}, {"Ocean Foam", 211}, {"Amber Fade", 246},
        {"Scorpion", 71}, {"Ivory", 357}, {"Pulse", 287}, {"Red FragCam", 275},
        {"Chainmail", 327}, {"Silver", 32}, {"Coach Class", 346}, {"Grassland", 95},
        {"Granite Marbleized", 21}, {"Grassland Leaves", 104}
    };

    // P250
    m_p250_paint_kits = {
        {"Muertos", 404}, {"Cartel", 388}, {"Undertow", 271}, {"Mehndi", 258},
        {"Franklin", 295}, {"Supernova", 358}, {"Splash", 162}, {"Nuclear Threat", 168},
        {"Steel Disruption", 230}, {"Hive", 219}, {"Modern Hunter", 164}, {"Contamination", 373},
        {"Metallic DDPAT", 34}, {"Facets", 207}, {"Gunsmoke", 15}, {"Sand Dune", 208},
        {"Boreal Forest", 77}, {"Bone Mask", 27}
    };

    // Tec-9
    m_tec9_paint_kits = {
        {"Titanium Bit", 272}, {"Red Quartz", 248}, {"Nuclear Threat", 168}, {"Isaac", 303},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Toxic", 374}, {"Brass", 159},
        {"Ossified", 36}, {"VariCamo", 235}, {"Urban DDPAT", 17}, {"Groundwater", 209},
        {"Army Mesh", 242}, {"Tornado", 101}
    };

    // USP-S
    m_usps_paint_kits = {
        {"Caiman", 339}, {"Orion", 313}, {"Serum", 221}, {"Guardian", 257},
        {"Overgrowth", 183}, {"Dark Water", 60}, {"Road Rash", 318}, {"Blood Tiger", 217},
        {"Stainless", 277}, {"Business Class", 364}, {"Night Ops", 236}, {"Royal Blue", 332},
        {"Forest Leaves", 25}
    };

    // AK-47
    m_ak47_paint_kits = {
        {"Wasteland Rebel", 380}, {"Jaguar", 316}, {"Vulcan", 302}, {"Fire Serpent", 180},
        {"Cartel", 388}, {"Redline", 259}, {"Red Laminate", 14}, {"Case Hardened", 44},
        {"Jet Set", 340}, {"Blue Laminate", 226}, {"First Class", 341}, {"Emerald Pinstripe", 300},
        {"Black Laminate", 172}, {"Safari Mesh", 72}, {"Jungle Spray", 122}, {"Predator", 170}
    };

    // AUG
    m_aug_paint_kits = {
        {"Chameleon", 280}, {"Bengal Tiger", 9}, {"Torque", 305}, {"Wings", 73},
        {"Anodized Navy", 28}, {"Hot Rod", 33}, {"Copperhead", 10}, {"Radiation Hazard", 167},
        {"Condemned", 110}, {"Contractor", 46}, {"Storm", 100}, {"Colony", 47}
    };

    // AWP
    m_awp_paint_kits = {
        {"Man-o'-war", 395}, {"Asiimov", 255}, {"Lightning Strike", 279}, {"Dragon Lore", 344},
        {"Corticera", 181}, {"Redline", 259}, {"Electric Hive", 227}, {"Graphite", 212},
        {"BOOM", 174}, {"Pink DDPAT", 84}, {"Pit Viper", 251}, {"Snake Camo", 30},
        {"Safari Mesh", 72}
    };

    // FAMAS
    m_famas_paint_kits = {
        {"Afterimage", 154}, {"Sergeant", 288}, {"Pulse", 287}, {"Styx", 371},
        {"Spitfire", 194}, {"Hexane", 218}, {"Doomkitty", 178}, {"Teardown", 244},
        {"Cyanospatter", 92}, {"Colony", 47}, {"Contrast Spray", 22}
    };

    // G3SG1
    m_g3sg1_paint_kits = {
        {"Murky", 382}, {"Azure Zebra", 229}, {"Demeter", 195}, {"Green Apple", 294},
        {"VariCamo", 235}, {"Arctic Camo", 6}, {"Contractor", 46}, {"Desert Storm", 8},
        {"Safari Mesh", 72}
    };

    // Galil AR
    m_galil_paint_kits = {
        {"Chatterbox", 398}, {"Orange DDPAT", 83}, {"Cerberus", 379}, {"Kami", 265},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Shattered", 192}, {"Tuxedo", 297},
        {"VariCamo", 235}, {"Winter Forest", 76}, {"Sage Spray", 119}, {"Hunting Blind", 241}
    };

    // M4A1-S
    m_m4a1s_paint_kits = {
        {"Cyrex", 312}, {"Atomic Alloy", 301}, {"Guardian", 257}, {"Knight", 326},
        {"Master Piece", 321}, {"Basilisk", 383}, {"Bright Water", 189}, {"Dark Water", 60},
        {"Nitro", 254}, {"Blood Tiger", 217}, {"VariCamo", 235}, {"Boreal Forest", 77}
    };

    // M4A4
    m_m4a4_paint_kits = {
        {"Howl", 309}, {"Bullet Rain", 155}, {"Desert-Strike", 336}, {"Asiimov", 255},
        {"X-Ray", 215}, {"Dragon King", 400}, {"Griffin", 384}, {"Zirka", 187},
        {"Modern Hunter", 164}, {"Faded Zebra", 176}, {"Radiation Hazard", 167}, {"Urban DDPAT", 17},
        {"Tornado", 101}, {"Jungle Tiger", 16}, {"Desert Storm", 8}
    };

    // SCAR-20
    m_scar20_paint_kits = {
        {"Cardiac", 391}, {"Cyrex", 312}, {"Splash Jam", 165}, {"Emerald", 196},
        {"Grotto", 406}, {"Crimson Web", 12}, {"Carbon Fiber", 70}, {"Palm", 157},
        {"Storm", 100}, {"Contractor", 46}
    };

    // SG 553
    m_sg553_paint_kits = {
        {"Pulse", 287}, {"Wave Spray", 186}, {"Ultraviolet", 98}, {"Damascus Steel", 247},
        {"Anodized Navy", 28}, {"Fallout Warning", 169}, {"Traveler", 363}, {"Gator Mesh", 243},
        {"Army Sheen", 298}, {"Waves Perforated", 136}, {"Tornado", 101}
    };

    // SSG 08
    m_ssg08_paint_kits = {
        {"Blood in the Water", 222}, {"Dark Water", 60}, {"Abyss", 361}, {"Splashed", 162},
        {"Detour", 319}, {"Acid Fade", 253}, {"Tropical Storm", 233}, {"Mayan Dreams", 200},
        {"Sand Dune", 208}, {"Blue Spruce", 96}, {"Lichen Dashed", 26}
    };

    // MAC-10
    m_mac10_paint_kits = {
        {"Malachite", 402}, {"Tatter", 337}, {"Curse", 310}, {"Heat", 284},
        {"Graven", 188}, {"Ultraviolet", 98}, {"Nuclear Garden", 372}, {"Amber Fade", 246},
        {"Commuter", 343}, {"Silver", 32}, {"Palm", 157}, {"Candy Apple", 3},
        {"Indigo", 333}, {"Tornado", 101}, {"Urban DDPAT", 17}
    };

    // MP7
    m_mp7_paint_kits = {
        {"Ocean Foam", 211}, {"Urban Hazard", 354}, {"Skulls", 11}, {"Anodized Navy", 28},
        {"Whiteout", 102}, {"Gunsmoke", 15}, {"Orange Peel", 141}, {"Olive Plaid", 365},
        {"Forest DDPAT", 5}, {"Army Recon", 245}, {"Groundwater", 209}
    };

    // MP9
    m_mp9_paint_kits = {
        {"Rose Iron", 262}, {"Hypnotic", 61}, {"Bulldozer", 39}, {"Deadly Poison", 403},
        {"Dart", 386}, {"Setting Sun", 368}, {"Dark Age", 329}, {"Hot Rod", 33},
        {"Orange Peel", 141}, {"Green Plaid", 366}, {"Storm", 100}, {"Sand Dashed", 148},
        {"Dry Season", 199}
    };

    // PP-Bizon
    m_bizon_paint_kits = {
        {"Blue Streak", 13}, {"Osiris", 349}, {"Antique", 286}, {"Cobalt Halftone", 267},
        {"Water Sigil", 224}, {"Brass", 159}, {"Rust Coat", 203}, {"Modern Hunter", 164},
        {"Chemical Green", 376}, {"Night Ops", 236}, {"Carbon Fiber", 70}, {"Sand Dashed", 148},
        {"Urban Dashed", 147}, {"Irradiated Alert", 171}, {"Forest Leaves", 25}
    };

    // P90
    m_p90_paint_kits = {
        {"Asiimov", 255}, {"Death by Kitty", 156}, {"Trigon", 283}, {"Cold Blooded", 67},
        {"Emerald Dragon", 182}, {"Virus", 20}, {"Blind Spot", 228}, {"Module", 335},
        {"Desert Warfare", 311}, {"Teardown", 244}, {"Glacier Mesh", 111}, {"Leather", 342},
        {"Ash Wood", 234}, {"Fallout Warning", 169}, {"Storm", 100}, {"Sand Spray", 124},
        {"Scorched", 175}
    };

    // UMP-45
    m_ump45_paint_kits = {
        {"Delusion", 392}, {"Labyrinth", 362}, {"Corporal", 281}, {"Bone Pile", 193},
        {"Blaze", 37}, {"Carbon Fiber", 70}, {"Gunsmoke", 15}, {"Fallout Warning", 169},
        {"Indigo", 333}, {"Scorched", 175}, {"Urban DDPAT", 17}, {"Caramel", 93}
    };

    // Mag-7
    m_mag7_paint_kits = {
        {"Bulldozer", 39}, {"Firestarter", 385}, {"Heaven Guard", 291}, {"Memento", 177},
        {"Hazard", 198}, {"Silver", 32}, {"Metallic DDPAT", 34}, {"Storm", 100},
        {"Irradiated Alert", 171}, {"Sand Dune", 208}
    };

    // Nova
    m_nova_paint_kits = {
        {"Bloomstick", 62}, {"Antique", 286}, {"Koi", 356}, {"Rising Skull", 263},
        {"Graphite", 212}, {"Ghost Camo", 225}, {"Tempest", 191}, {"Modern Hunter", 164},
        {"Blaze Orange", 166}, {"Green Apple", 294}, {"Caged Steel", 299}, {"Candy Apple", 3},
        {"Predator", 170}, {"Sand Dune", 208}, {"Polar Mesh", 107}, {"Walnut", 158},
        {"Forest Leaves", 25}
    };

    // Sawed-Off
    m_sawedoff_paint_kits = {
        {"The Kraken", 256}, {"Serenity", 405}, {"Highwayman", 390}, {"Orange DDPAT", 83},
        {"First Class", 345}, {"Full Stop", 250}, {"Amber Fade", 246}, {"Copper", 41},
        {"Rust Coat", 203}, {"Snake Camo", 30}, {"Mosaico", 204}, {"Sage Spray", 119},
        {"Forest DDPAT", 5}, {"Irradiated Alert", 171}
    };

    // XM1014
    m_xm1014_paint_kits = {
        {"Tranquility", 393}, {"Heaven Guard", 291}, {"Quicksilver", 407}, {"Red Python", 320},
        {"Bone Machine", 370}, {"Red Leather", 348}, {"VariCamo Blue", 238}, {"Blaze Orange", 166},
        {"CaliCamo", 240}, {"Blue Steel", 42}, {"Fallout Warning", 169}, {"Blue Spruce", 96},
        {"Jungle", 151}, {"Grassland", 95}, {"Urban Perforated", 135}
    };

    // M249
    m_m249_paint_kits = {
        {"System Lock", 401}, {"Magma", 266}, {"Gator Mesh", 243}, {"Blizzard Marbleized", 75},
        {"Contrast Spray", 22}, {"Jungle DDPAT", 202}
    };

    // Negev
    m_negev_paint_kits = {
        {"Bratatat", 317}, {"Desert-Strike", 336}, {"Terrain", 285}, {"Anodized Navy", 28},
        {"Nuclear Waste", 369}, {"CaliCamo", 240}, {"Palm", 157}, {"Army Sheen", 298}
    };
}

void c_model_changer::update_player_models()
{
    player_models.clear();

    const std::string models_path = parser::GetDirectory() + xorstr_("csgo\\characters\\models\\");

    if (!std::filesystem::exists(models_path) || !std::filesystem::is_directory(models_path))
    {
        std::cout << "[ModelChanger] Models folder not found: " << models_path << std::endl;
        return;
    }

    try
    {
        for (const auto& entry : std::filesystem::recursive_directory_iterator(models_path))
        {
            if (!entry.is_regular_file())
                continue;

            std::string file_name = entry.path().filename().string();

            if (file_name.size() < 6)
                continue;

            if (file_name.substr(file_name.size() - 7) != xorstr_(".vmdl_c"))
                continue;

            if (file_name.find(xorstr_("arm")) != std::string::npos)
                continue;

            std::string model_path = entry.path().string();
            model_path = model_path.substr(0, model_path.size() - 2);
            std::replace(model_path.begin(), model_path.end(), '\\', '/');

            size_t pos = model_path.find(xorstr_("characters/models/"));
            if (pos != std::string::npos)
                model_path = model_path.substr(pos);

            Model_t pModel;
            pModel.name = file_name.substr(0, file_name.size() - 8);
            pModel.path = model_path;

            player_models.push_back(pModel);
        }

        std::cout << "[ModelChanger] Loaded " << player_models.size() << " player models." << std::endl;
    }
    catch (const std::filesystem::filesystem_error& e)
    {
        std::cerr << "[ModelChanger] Filesystem error: " << e.what() << std::endl;
    }
}

void c_model_changer::set_player_model()
{
    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (!g_ctx->m_local_pawn || !g_ctx->m_local_pawn->is_alive())
        return;

    if (player_models.empty())
        return;

    if (cur_player_model == ~1U)
        return;

    if (cur_player_model >= player_models.size())
        return;

    static uint32_t last_applied_model_index = ~1U;
    static auto last_apply_time = std::chrono::steady_clock::now();

    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - last_apply_time).count();

    if (elapsed < 5 && cur_player_model == last_applied_model_index)
        return;

    Model_t pModel = player_models[cur_player_model];
    const char* model_path = pModel.path.c_str();

    if (!model_path || strlen(model_path) < 5)
        return;

    try
    {
        // Pre-caching via ResourceSystem is optional and header is not available in this build
        // Apply model directly
        g_ctx->m_local_pawn->set_model(model_path);

        last_applied_model_index = cur_player_model;
        last_apply_time = now;

        std::cout << "[ModelChanger] Applied model: " << model_path << std::endl;
    }
    catch (...)
    {
        std::cerr << "[ModelChanger] Failed to apply model: " << model_path << std::endl;
    }
}

void c_skins::agent_changer(int stage)
{
  
}

void c_skins::knife_changer(int stage)
{
    if (!g_ctx->m_local_pawn || m_knives.m_dumped_knife_models.empty())
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
    if (!view_model_service)
        return;

    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
    if (!view_model)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_defenition = item->get_static_data();
        if (!item_defenition)
            continue;

        auto weapon_scene = weapon->m_scene_node();
        if (!weapon_scene)
            continue;

        auto view_model_scene = view_model->m_scene_node();
        if (!view_model_scene)
            continue;

        auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
        if (!item_schema)
            return;

        // Knife changer toggle not present in config in this build; proceed when knife is detected

        bool is_knife = item_defenition->is_knife(false);

        int current_weapon = get_skin_config(item->m_defenition_index());
        if (!is_knife && current_weapon == CONFIG_UNKNOWN)
            continue;

        if (is_knife && stage == 6)
        {
            int selectedKnife = g_cfg->skins.m_knives.m_selected;

            weapon->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
            item->m_defenition_index() = m_knives.m_knife_idxs.at(selectedKnife);

            if (view_model->m_weapon() == weapon->get_handle())
                view_model->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
        }
    }
}

void c_skins::skin_changer(int stage)
{
    if (!g_cfg->skins.m_enabled)
        return;

    if (!g_ctx->m_local_pawn || !g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (stage != FRAME_NET_UPDATE_END && stage != FRAME_RENDER_START)
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(
            g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_def = item->get_static_data();
        if (!item_def)
            continue;

        // skip knives (handled separately)
        if (item_def->is_knife(false))
            continue;

        int weapon_config = get_skin_config(item->m_defenition_index());
        if (weapon_config == CONFIG_UNKNOWN)
            continue;

        auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];
        if (skin_data.m_paint_kit == 0)
            continue;

        // apply paint kit
        weapon->m_paint_kit() = skin_data.m_paint_kit;

        // apply seed
        if (skin_data.m_prev_skin != -1)
            weapon->m_seed() = skin_data.m_prev_skin;
        else {
            static std::unordered_map<uintptr_t, int> weapon_seeds;
            uintptr_t weapon_ptr = reinterpret_cast<uintptr_t>(weapon);
            if (weapon_seeds.find(weapon_ptr) == weapon_seeds.end()) {
                static std::random_device rd;
                static std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(1, 1000);
                weapon_seeds[weapon_ptr] = dis(gen);
            }
            weapon->m_seed() = weapon_seeds[weapon_ptr];
        }

        // wear
        weapon->m_wear() = 0.0f;

        // xuid
        weapon->m_xuid_low() = 13371337;
        weapon->m_xuid_high() = 13371337;

        //  force model refresh (this was missing!)
        if (weapon->m_scene_node()) {
            const char* model_path = item_def->get_model_name();
            if (model_path && strlen(model_path) > 5) {
                weapon->set_model(model_path);

                // also update viewmodel if this is the active weapon
                c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
                if (view_model_service) {
                    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(
                        g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
                    if (view_model && view_model->m_weapon() == weapon->get_handle())
                        view_model->set_model(model_path);
                }
            }
        }
    }
}

// Применить скин к конкретному оружию (вызывается из on_add_entity)
void c_skins::apply_skin_to_weapon(c_econ_entity* weapon)
{
    if (!weapon || !g_cfg->skins.m_enabled)
        return;

    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    c_attribute_container* attribute_manager = weapon->m_attribute_manager();
    if (!attribute_manager)
        return;

    c_econ_item_view* item = attribute_manager->m_item();
    if (!item)
        return;

    c_econ_item_definition* item_defenition = item->get_static_data();
    if (!item_defenition)
        return;

    // Пропускаем ножи
    bool is_knife = item_defenition->is_knife(false);
    if (is_knife)
        return;

    // Получаем конфиг для этого оружия
    int weapon_config = get_skin_config(item->m_defenition_index());
    if (weapon_config == CONFIG_UNKNOWN)
        return;

    if (weapon_config < 0 || weapon_config >= 100)
        return;

    auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];

    if (skin_data.m_paint_kit == 0)
        return;

    // Применяем paint kit
    weapon->m_paint_kit() = skin_data.m_paint_kit;

    // Применяем seed
    if (skin_data.m_prev_skin != -1)
    {
        weapon->m_seed() = skin_data.m_prev_skin;
    }
    else
    {
        static std::random_device rd;
        static std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 1000);
        weapon->m_seed() = dis(gen);
    }

    // Применяем wear
    weapon->m_wear() = 0.0f;

    // Устанавливаем xuid
    weapon->m_xuid_low() = 13371337;
    weapon->m_xuid_high() = 13371337;

    // ВАЖНО: Пытаемся принудительно обновить модель после установки paint kit
    // Это может помочь обновить визуальную модель
    // Получаем текущую модель и переустанавливаем её
    c_base_entity* base_weapon = reinterpret_cast<c_base_entity*>(weapon);
    if (base_weapon && base_weapon->m_scene_node()) {
        // Пытаемся получить модель через scene node
        // Может быть нужно вызвать какую-то функцию обновления модели
        // Но в CS2 это может быть сложно без доступа к внутренним функциям
    }
}
так? если да то ничего не поменялось
 
skins.cpp:
Expand Collapse Copy
#include "skins.hpp"
#include "../../darkside.hpp"

#include <iostream>
#include <filesystem>
#include <algorithm>
#include <random>
#include <unordered_map>

void c_skins::dump_items()
{
    auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
    if (!item_schema)
        return;

    const auto& vec_items = item_schema->m_sorted_item_definition_map;

    for (const auto& it : vec_items)
    {
        c_econ_item_definition* item = it.m_value;
        if (!item)
            continue;

        const bool is_agent = item->is_agent();
        const bool is_knife = item->is_knife(true);

        const char* item_base_name = item->m_item_base_name;
        if (!item_base_name || item_base_name[0] == '\0')
            continue;

        if (is_agent)
        {
            m_agents.m_dumped_agent_models.emplace_back(item->get_model_name());
            m_agents.m_dumped_agent_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }

        if (is_knife)
        {
            m_knives.m_dumped_knife_models.emplace_back(item->get_model_name());
            m_knives.m_dumped_knife_name.emplace_back(g_interfaces->m_localize->find_key(item->m_item_base_name));
        }
    }
}

void c_skins::init_paint_kits()
{
    // CZ75-Auto
    m_cz75_paint_kits = {
        {"Victoria", 270}, {"The Fuschia Is Now", 269}, {"Tigris", 350}, {"Tread Plate", 268},
        {"Chalice", 325}, {"Hexane", 218}, {"Twist", 334}, {"Poison Dart", 315},
        {"Crimson Web", 12}, {"Nitro", 254}, {"Tuxedo", 297}, {"Green Plaid", 366}
    };

    // Desert Eagle
    m_deagle_paint_kits = {
        {"Golden Koi", 185}, {"Conspiracy", 351}, {"Cobalt Disruption", 231}, {"Hypnotic", 61},
        {"Naga", 397}, {"Crimson Web", 12}, {"Heirloom", 273}, {"Pilot", 347},
        {"Hand Cannon", 328}, {"Blaze", 37}, {"Meteorite", 296}, {"Urban Rubble", 237},
        {"Urban DDPAT", 17}, {"Mudder", 90}
    };

    // Dual Berettas
    m_dual_berettas_paint_kits = {
        {"Urban Shock", 396}, {"Marina", 261}, {"Hemoglobin", 220}, {"Cobalt Quartz", 249},
        {"Demolition", 153}, {"Retribution", 307}, {"Panther", 276}, {"Black Limba", 172},
        {"Anodized Navy", 28}, {"Stained", 43}, {"Briar", 330}, {"Contractor", 46}, {"Colony", 47}
    };

    // Five-SeveN
    m_five_seven_paint_kits = {
        {"Fowl Play", 352}, {"Copper Galaxy", 274}, {"Case Hardened", 44}, {"Urban Hazard", 354},
        {"Kami", 265}, {"Nightshade", 223}, {"Silver Quartz", 252}, {"Hot Shot", 377},
        {"Orange Peel", 141}, {"Candy Apple", 3}, {"Contractor", 46}, {"Forest Night", 78},
        {"Anodized Gunmetal", 210}, {"Jungle", 151}
    };

    // Glock-18
    m_glock_paint_kits = {
        {"Water Elemental", 353}, {"Grinder", 381}, {"Steel Disruption", 230}, {"Dragon Tattoo", 48},
        {"Fade", 38}, {"Brass", 159}, {"Catacombs", 399}, {"Blue Fissure", 278},
        {"Reactor", 367}, {"Candy Apple", 3}, {"Night", 40}, {"Death Rattle", 293},
        {"Groundwater", 209}, {"Sand Dune", 208}
    };

    // P2000
    m_p2000_paint_kits = {
        {"Fire Elemental", 389}, {"Corticera", 181}, {"Ocean Foam", 211}, {"Amber Fade", 246},
        {"Scorpion", 71}, {"Ivory", 357}, {"Pulse", 287}, {"Red FragCam", 275},
        {"Chainmail", 327}, {"Silver", 32}, {"Coach Class", 346}, {"Grassland", 95},
        {"Granite Marbleized", 21}, {"Grassland Leaves", 104}
    };

    // P250
    m_p250_paint_kits = {
        {"Muertos", 404}, {"Cartel", 388}, {"Undertow", 271}, {"Mehndi", 258},
        {"Franklin", 295}, {"Supernova", 358}, {"Splash", 162}, {"Nuclear Threat", 168},
        {"Steel Disruption", 230}, {"Hive", 219}, {"Modern Hunter", 164}, {"Contamination", 373},
        {"Metallic DDPAT", 34}, {"Facets", 207}, {"Gunsmoke", 15}, {"Sand Dune", 208},
        {"Boreal Forest", 77}, {"Bone Mask", 27}
    };

    // Tec-9
    m_tec9_paint_kits = {
        {"Titanium Bit", 272}, {"Red Quartz", 248}, {"Nuclear Threat", 168}, {"Isaac", 303},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Toxic", 374}, {"Brass", 159},
        {"Ossified", 36}, {"VariCamo", 235}, {"Urban DDPAT", 17}, {"Groundwater", 209},
        {"Army Mesh", 242}, {"Tornado", 101}
    };

    // USP-S
    m_usps_paint_kits = {
        {"Caiman", 339}, {"Orion", 313}, {"Serum", 221}, {"Guardian", 257},
        {"Overgrowth", 183}, {"Dark Water", 60}, {"Road Rash", 318}, {"Blood Tiger", 217},
        {"Stainless", 277}, {"Business Class", 364}, {"Night Ops", 236}, {"Royal Blue", 332},
        {"Forest Leaves", 25}
    };

    // AK-47
    m_ak47_paint_kits = {
        {"Wasteland Rebel", 380}, {"Jaguar", 316}, {"Vulcan", 302}, {"Fire Serpent", 180},
        {"Cartel", 388}, {"Redline", 259}, {"Red Laminate", 14}, {"Case Hardened", 44},
        {"Jet Set", 340}, {"Blue Laminate", 226}, {"First Class", 341}, {"Emerald Pinstripe", 300},
        {"Black Laminate", 172}, {"Safari Mesh", 72}, {"Jungle Spray", 122}, {"Predator", 170}
    };

    // AUG
    m_aug_paint_kits = {
        {"Chameleon", 280}, {"Bengal Tiger", 9}, {"Torque", 305}, {"Wings", 73},
        {"Anodized Navy", 28}, {"Hot Rod", 33}, {"Copperhead", 10}, {"Radiation Hazard", 167},
        {"Condemned", 110}, {"Contractor", 46}, {"Storm", 100}, {"Colony", 47}
    };

    // AWP
    m_awp_paint_kits = {
        {"Man-o'-war", 395}, {"Asiimov", 255}, {"Lightning Strike", 279}, {"Dragon Lore", 344},
        {"Corticera", 181}, {"Redline", 259}, {"Electric Hive", 227}, {"Graphite", 212},
        {"BOOM", 174}, {"Pink DDPAT", 84}, {"Pit Viper", 251}, {"Snake Camo", 30},
        {"Safari Mesh", 72}
    };

    // FAMAS
    m_famas_paint_kits = {
        {"Afterimage", 154}, {"Sergeant", 288}, {"Pulse", 287}, {"Styx", 371},
        {"Spitfire", 194}, {"Hexane", 218}, {"Doomkitty", 178}, {"Teardown", 244},
        {"Cyanospatter", 92}, {"Colony", 47}, {"Contrast Spray", 22}
    };

    // G3SG1
    m_g3sg1_paint_kits = {
        {"Murky", 382}, {"Azure Zebra", 229}, {"Demeter", 195}, {"Green Apple", 294},
        {"VariCamo", 235}, {"Arctic Camo", 6}, {"Contractor", 46}, {"Desert Storm", 8},
        {"Safari Mesh", 72}
    };

    // Galil AR
    m_galil_paint_kits = {
        {"Chatterbox", 398}, {"Orange DDPAT", 83}, {"Cerberus", 379}, {"Kami", 265},
        {"Sandstorm", 264}, {"Blue Titanium", 216}, {"Shattered", 192}, {"Tuxedo", 297},
        {"VariCamo", 235}, {"Winter Forest", 76}, {"Sage Spray", 119}, {"Hunting Blind", 241}
    };

    // M4A1-S
    m_m4a1s_paint_kits = {
        {"Cyrex", 312}, {"Atomic Alloy", 301}, {"Guardian", 257}, {"Knight", 326},
        {"Master Piece", 321}, {"Basilisk", 383}, {"Bright Water", 189}, {"Dark Water", 60},
        {"Nitro", 254}, {"Blood Tiger", 217}, {"VariCamo", 235}, {"Boreal Forest", 77}
    };

    // M4A4
    m_m4a4_paint_kits = {
        {"Howl", 309}, {"Bullet Rain", 155}, {"Desert-Strike", 336}, {"Asiimov", 255},
        {"X-Ray", 215}, {"Dragon King", 400}, {"Griffin", 384}, {"Zirka", 187},
        {"Modern Hunter", 164}, {"Faded Zebra", 176}, {"Radiation Hazard", 167}, {"Urban DDPAT", 17},
        {"Tornado", 101}, {"Jungle Tiger", 16}, {"Desert Storm", 8}
    };

    // SCAR-20
    m_scar20_paint_kits = {
        {"Cardiac", 391}, {"Cyrex", 312}, {"Splash Jam", 165}, {"Emerald", 196},
        {"Grotto", 406}, {"Crimson Web", 12}, {"Carbon Fiber", 70}, {"Palm", 157},
        {"Storm", 100}, {"Contractor", 46}
    };

    // SG 553
    m_sg553_paint_kits = {
        {"Pulse", 287}, {"Wave Spray", 186}, {"Ultraviolet", 98}, {"Damascus Steel", 247},
        {"Anodized Navy", 28}, {"Fallout Warning", 169}, {"Traveler", 363}, {"Gator Mesh", 243},
        {"Army Sheen", 298}, {"Waves Perforated", 136}, {"Tornado", 101}
    };

    // SSG 08
    m_ssg08_paint_kits = {
        {"Blood in the Water", 222}, {"Dark Water", 60}, {"Abyss", 361}, {"Splashed", 162},
        {"Detour", 319}, {"Acid Fade", 253}, {"Tropical Storm", 233}, {"Mayan Dreams", 200},
        {"Sand Dune", 208}, {"Blue Spruce", 96}, {"Lichen Dashed", 26}
    };

    // MAC-10
    m_mac10_paint_kits = {
        {"Malachite", 402}, {"Tatter", 337}, {"Curse", 310}, {"Heat", 284},
        {"Graven", 188}, {"Ultraviolet", 98}, {"Nuclear Garden", 372}, {"Amber Fade", 246},
        {"Commuter", 343}, {"Silver", 32}, {"Palm", 157}, {"Candy Apple", 3},
        {"Indigo", 333}, {"Tornado", 101}, {"Urban DDPAT", 17}
    };

    // MP7
    m_mp7_paint_kits = {
        {"Ocean Foam", 211}, {"Urban Hazard", 354}, {"Skulls", 11}, {"Anodized Navy", 28},
        {"Whiteout", 102}, {"Gunsmoke", 15}, {"Orange Peel", 141}, {"Olive Plaid", 365},
        {"Forest DDPAT", 5}, {"Army Recon", 245}, {"Groundwater", 209}
    };

    // MP9
    m_mp9_paint_kits = {
        {"Rose Iron", 262}, {"Hypnotic", 61}, {"Bulldozer", 39}, {"Deadly Poison", 403},
        {"Dart", 386}, {"Setting Sun", 368}, {"Dark Age", 329}, {"Hot Rod", 33},
        {"Orange Peel", 141}, {"Green Plaid", 366}, {"Storm", 100}, {"Sand Dashed", 148},
        {"Dry Season", 199}
    };

    // PP-Bizon
    m_bizon_paint_kits = {
        {"Blue Streak", 13}, {"Osiris", 349}, {"Antique", 286}, {"Cobalt Halftone", 267},
        {"Water Sigil", 224}, {"Brass", 159}, {"Rust Coat", 203}, {"Modern Hunter", 164},
        {"Chemical Green", 376}, {"Night Ops", 236}, {"Carbon Fiber", 70}, {"Sand Dashed", 148},
        {"Urban Dashed", 147}, {"Irradiated Alert", 171}, {"Forest Leaves", 25}
    };

    // P90
    m_p90_paint_kits = {
        {"Asiimov", 255}, {"Death by Kitty", 156}, {"Trigon", 283}, {"Cold Blooded", 67},
        {"Emerald Dragon", 182}, {"Virus", 20}, {"Blind Spot", 228}, {"Module", 335},
        {"Desert Warfare", 311}, {"Teardown", 244}, {"Glacier Mesh", 111}, {"Leather", 342},
        {"Ash Wood", 234}, {"Fallout Warning", 169}, {"Storm", 100}, {"Sand Spray", 124},
        {"Scorched", 175}
    };

    // UMP-45
    m_ump45_paint_kits = {
        {"Delusion", 392}, {"Labyrinth", 362}, {"Corporal", 281}, {"Bone Pile", 193},
        {"Blaze", 37}, {"Carbon Fiber", 70}, {"Gunsmoke", 15}, {"Fallout Warning", 169},
        {"Indigo", 333}, {"Scorched", 175}, {"Urban DDPAT", 17}, {"Caramel", 93}
    };

    // Mag-7
    m_mag7_paint_kits = {
        {"Bulldozer", 39}, {"Firestarter", 385}, {"Heaven Guard", 291}, {"Memento", 177},
        {"Hazard", 198}, {"Silver", 32}, {"Metallic DDPAT", 34}, {"Storm", 100},
        {"Irradiated Alert", 171}, {"Sand Dune", 208}
    };

    // Nova
    m_nova_paint_kits = {
        {"Bloomstick", 62}, {"Antique", 286}, {"Koi", 356}, {"Rising Skull", 263},
        {"Graphite", 212}, {"Ghost Camo", 225}, {"Tempest", 191}, {"Modern Hunter", 164},
        {"Blaze Orange", 166}, {"Green Apple", 294}, {"Caged Steel", 299}, {"Candy Apple", 3},
        {"Predator", 170}, {"Sand Dune", 208}, {"Polar Mesh", 107}, {"Walnut", 158},
        {"Forest Leaves", 25}
    };

    // Sawed-Off
    m_sawedoff_paint_kits = {
        {"The Kraken", 256}, {"Serenity", 405}, {"Highwayman", 390}, {"Orange DDPAT", 83},
        {"First Class", 345}, {"Full Stop", 250}, {"Amber Fade", 246}, {"Copper", 41},
        {"Rust Coat", 203}, {"Snake Camo", 30}, {"Mosaico", 204}, {"Sage Spray", 119},
        {"Forest DDPAT", 5}, {"Irradiated Alert", 171}
    };

    // XM1014
    m_xm1014_paint_kits = {
        {"Tranquility", 393}, {"Heaven Guard", 291}, {"Quicksilver", 407}, {"Red Python", 320},
        {"Bone Machine", 370}, {"Red Leather", 348}, {"VariCamo Blue", 238}, {"Blaze Orange", 166},
        {"CaliCamo", 240}, {"Blue Steel", 42}, {"Fallout Warning", 169}, {"Blue Spruce", 96},
        {"Jungle", 151}, {"Grassland", 95}, {"Urban Perforated", 135}
    };

    // M249
    m_m249_paint_kits = {
        {"System Lock", 401}, {"Magma", 266}, {"Gator Mesh", 243}, {"Blizzard Marbleized", 75},
        {"Contrast Spray", 22}, {"Jungle DDPAT", 202}
    };

    // Negev
    m_negev_paint_kits = {
        {"Bratatat", 317}, {"Desert-Strike", 336}, {"Terrain", 285}, {"Anodized Navy", 28},
        {"Nuclear Waste", 369}, {"CaliCamo", 240}, {"Palm", 157}, {"Army Sheen", 298}
    };
}

void c_model_changer::update_player_models()
{
    player_models.clear();

    const std::string models_path = parser::GetDirectory() + xorstr_("csgo\\characters\\models\\");

    if (!std::filesystem::exists(models_path) || !std::filesystem::is_directory(models_path))
    {
        std::cout << "[ModelChanger] Models folder not found: " << models_path << std::endl;
        return;
    }

    try
    {
        for (const auto& entry : std::filesystem::recursive_directory_iterator(models_path))
        {
            if (!entry.is_regular_file())
                continue;

            std::string file_name = entry.path().filename().string();

            if (file_name.size() < 6)
                continue;

            if (file_name.substr(file_name.size() - 7) != xorstr_(".vmdl_c"))
                continue;

            if (file_name.find(xorstr_("arm")) != std::string::npos)
                continue;

            std::string model_path = entry.path().string();
            model_path = model_path.substr(0, model_path.size() - 2);
            std::replace(model_path.begin(), model_path.end(), '\\', '/');

            size_t pos = model_path.find(xorstr_("characters/models/"));
            if (pos != std::string::npos)
                model_path = model_path.substr(pos);

            Model_t pModel;
            pModel.name = file_name.substr(0, file_name.size() - 8);
            pModel.path = model_path;

            player_models.push_back(pModel);
        }

        std::cout << "[ModelChanger] Loaded " << player_models.size() << " player models." << std::endl;
    }
    catch (const std::filesystem::filesystem_error& e)
    {
        std::cerr << "[ModelChanger] Filesystem error: " << e.what() << std::endl;
    }
}

void c_model_changer::set_player_model()
{
    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (!g_ctx->m_local_pawn || !g_ctx->m_local_pawn->is_alive())
        return;

    if (player_models.empty())
        return;

    if (cur_player_model == ~1U)
        return;

    if (cur_player_model >= player_models.size())
        return;

    static uint32_t last_applied_model_index = ~1U;
    static auto last_apply_time = std::chrono::steady_clock::now();

    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - last_apply_time).count();

    if (elapsed < 5 && cur_player_model == last_applied_model_index)
        return;

    Model_t pModel = player_models[cur_player_model];
    const char* model_path = pModel.path.c_str();

    if (!model_path || strlen(model_path) < 5)
        return;

    try
    {
        // Pre-caching via ResourceSystem is optional and header is not available in this build
        // Apply model directly
        g_ctx->m_local_pawn->set_model(model_path);

        last_applied_model_index = cur_player_model;
        last_apply_time = now;

        std::cout << "[ModelChanger] Applied model: " << model_path << std::endl;
    }
    catch (...)
    {
        std::cerr << "[ModelChanger] Failed to apply model: " << model_path << std::endl;
    }
}

void c_skins::agent_changer(int stage)
{
 
}

void c_skins::knife_changer(int stage)
{
    if (!g_ctx->m_local_pawn || m_knives.m_dumped_knife_models.empty())
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
    if (!view_model_service)
        return;

    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
    if (!view_model)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_defenition = item->get_static_data();
        if (!item_defenition)
            continue;

        auto weapon_scene = weapon->m_scene_node();
        if (!weapon_scene)
            continue;

        auto view_model_scene = view_model->m_scene_node();
        if (!view_model_scene)
            continue;

        auto item_schema = g_interfaces->m_client->get_econ_item_system()->get_econ_item_schema();
        if (!item_schema)
            return;

        // Knife changer toggle not present in config in this build; proceed when knife is detected

        bool is_knife = item_defenition->is_knife(false);

        int current_weapon = get_skin_config(item->m_defenition_index());
        if (!is_knife && current_weapon == CONFIG_UNKNOWN)
            continue;

        if (is_knife && stage == 6)
        {
            int selectedKnife = g_cfg->skins.m_knives.m_selected;

            weapon->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
            item->m_defenition_index() = m_knives.m_knife_idxs.at(selectedKnife);

            if (view_model->m_weapon() == weapon->get_handle())
                view_model->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
        }
    }
}

void c_skins::skin_changer(int stage)
{
    if (!g_cfg->skins.m_enabled)
        return;

    if (!g_ctx->m_local_pawn || !g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    if (stage != FRAME_NET_UPDATE_END && stage != FRAME_RENDER_START)
        return;

    c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services();
    if (!weapon_service)
        return;

    c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon();

    for (auto i = 0; i < my_weapons.m_size; i++)
    {
        c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>(
            g_interfaces->m_entity_system->get_base_entity(my_weapons.m_elements[i].get_entry_index()));
        if (!weapon)
            continue;

        c_attribute_container* attribute_manager = weapon->m_attribute_manager();
        if (!attribute_manager)
            continue;

        c_econ_item_view* item = attribute_manager->m_item();
        if (!item)
            continue;

        c_econ_item_definition* item_def = item->get_static_data();
        if (!item_def)
            continue;

        // skip knives (handled separately)
        if (item_def->is_knife(false))
            continue;

        int weapon_config = get_skin_config(item->m_defenition_index());
        if (weapon_config == CONFIG_UNKNOWN)
            continue;

        auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];
        if (skin_data.m_paint_kit == 0)
            continue;

        // apply paint kit
        weapon->m_paint_kit() = skin_data.m_paint_kit;

        // apply seed
        if (skin_data.m_prev_skin != -1)
            weapon->m_seed() = skin_data.m_prev_skin;
        else {
            static std::unordered_map<uintptr_t, int> weapon_seeds;
            uintptr_t weapon_ptr = reinterpret_cast<uintptr_t>(weapon);
            if (weapon_seeds.find(weapon_ptr) == weapon_seeds.end()) {
                static std::random_device rd;
                static std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(1, 1000);
                weapon_seeds[weapon_ptr] = dis(gen);
            }
            weapon->m_seed() = weapon_seeds[weapon_ptr];
        }

        // wear
        weapon->m_wear() = 0.0f;

        // xuid
        weapon->m_xuid_low() = 13371337;
        weapon->m_xuid_high() = 13371337;

        //  force model refresh (this was missing!)
        if (weapon->m_scene_node()) {
            const char* model_path = item_def->get_model_name();
            if (model_path && strlen(model_path) > 5) {
                weapon->set_model(model_path);

                // also update viewmodel if this is the active weapon
                c_cs_player_view_model_service* view_model_service = g_ctx->m_local_pawn->m_view_model_services();
                if (view_model_service) {
                    c_base_view_model* view_model = reinterpret_cast<c_base_view_model*>(
                        g_interfaces->m_entity_system->get_base_entity(view_model_service->m_view_model().get_entry_index()));
                    if (view_model && view_model->m_weapon() == weapon->get_handle())
                        view_model->set_model(model_path);
                }
            }
        }
    }
}

// Применить скин к конкретному оружию (вызывается из on_add_entity)
void c_skins::apply_skin_to_weapon(c_econ_entity* weapon)
{
    if (!weapon || !g_cfg->skins.m_enabled)
        return;

    if (!g_interfaces->m_engine->is_in_game() || !g_interfaces->m_engine->is_connected())
        return;

    c_attribute_container* attribute_manager = weapon->m_attribute_manager();
    if (!attribute_manager)
        return;

    c_econ_item_view* item = attribute_manager->m_item();
    if (!item)
        return;

    c_econ_item_definition* item_defenition = item->get_static_data();
    if (!item_defenition)
        return;

    // Пропускаем ножи
    bool is_knife = item_defenition->is_knife(false);
    if (is_knife)
        return;

    // Получаем конфиг для этого оружия
    int weapon_config = get_skin_config(item->m_defenition_index());
    if (weapon_config == CONFIG_UNKNOWN)
        return;

    if (weapon_config < 0 || weapon_config >= 100)
        return;

    auto& skin_data = g_cfg->skins.m_skin_settings[weapon_config];

    if (skin_data.m_paint_kit == 0)
        return;

    // Применяем paint kit
    weapon->m_paint_kit() = skin_data.m_paint_kit;

    // Применяем seed
    if (skin_data.m_prev_skin != -1)
    {
        weapon->m_seed() = skin_data.m_prev_skin;
    }
    else
    {
        static std::random_device rd;
        static std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(1, 1000);
        weapon->m_seed() = dis(gen);
    }

    // Применяем wear
    weapon->m_wear() = 0.0f;

    // Устанавливаем xuid
    weapon->m_xuid_low() = 13371337;
    weapon->m_xuid_high() = 13371337;

    // ВАЖНО: Пытаемся принудительно обновить модель после установки paint kit
    // Это может помочь обновить визуальную модель
    // Получаем текущую модель и переустанавливаем её
    c_base_entity* base_weapon = reinterpret_cast<c_base_entity*>(weapon);
    if (base_weapon && base_weapon->m_scene_node()) {
        // Пытаемся получить модель через scene node
        // Может быть нужно вызвать какую-то функцию обновления модели
        // Но в CS2 это может быть сложно без доступа к внутренним функциям
    }
}
так? если да то ничего не поменялось
бля,ты имеешь в виду, что ничего не изменилось, посмотри на .org и новое 😭
 
бля,ты имеешь в виду, что ничего не изменилось, посмотри на .org и новое 😭
бро, ему сказали учить плюсы а он не учит, ты до него не донесешь инфу которую надо, просто игнорь его и все
бро, ему сказали учить плюсы а он не учит, ты до него не донесешь инфу которую надо, просто игнорь его и все
он же в кубах своих сидит ренеймает экспенсив или как его
 
Назад
Сверху Снизу