Вопрос Chams bug

Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2017
Сообщения
386
Реакции[?]
32
Поинты[?]
8K
При включенных атачментах и выключенных чамсах на игроков, модели заливаются цветом атачментов. Как пофиксить? Вот код
C++:
void Chams::OnDrawModelExecute(IMatRenderContext* ctx, const DrawModelState_t& state, const ModelRenderInfo_t& info, matrix3x4_t* matrix)
{
    static auto fnDME = Hooks::mdlrender_hook.get_original<decltype(&Hooks::hkDrawModelExecute)>(index::DrawModelExecute);

    const auto mdl = info.pModel;
    bool is_player = strstr(mdl->szName, "models/player") != nullptr;

    bool is_weapon_on_back = strstr(mdl->szName, "_dropped.mdl") != nullptr && strstr(mdl->szName, "models/weapons/w") != nullptr && !strstr(mdl->szName, "arms") && !strstr(mdl->szName, "ied_dropped") && !strstr(mdl->szName, "models/player");
    bool is_weapon_enemy_hands = strstr(mdl->szName, "models/weapons/w") != nullptr && !strstr(mdl->szName, "arms") && !strstr(mdl->szName, "ied_dropped") && !strstr(mdl->szName, "models/player");
    bool is_defuse_kit = strstr(mdl->szName, "defuser") != nullptr && !strstr(mdl->szName, "arms") && !strstr(mdl->szName, "ied_dropped") && !strstr(mdl->szName, "models/player");

        if ((is_weapon_on_back || is_weapon_enemy_hands || is_defuse_kit) && g_Configurations.chams_attachment_enabled)
        {
            auto material = g_MatSystem->FindMaterial(mdl->szName, TEXTURE_GROUP_MODEL);
            if (!material)
                return;

            if (strstr(mdl->szName, "player"))
                return;

            if (g_Configurations.chams_attachment_ignorez)
            {
                OverrideMaterial(g_Configurations.chams_attachment_material_num, true, g_Configurations.chams_attachment_wireframe, g_Configurations.attachment_chams_invisible);
                fnDME(g_MdlRender, 0, ctx, state, info, matrix);
                OverrideMaterial(g_Configurations.chams_attachment_material_num, false, g_Configurations.chams_attachment_wireframe, g_Configurations.attachment_chams_visible);
            }
            else
            {
                OverrideMaterial(g_Configurations.chams_attachment_material_num, false, g_Configurations.chams_attachment_wireframe, g_Configurations.attachment_chams_visible);
            }
        }
        else if (is_player && g_Configurations.chams_player_enabled)
        {
            auto ent = C_BasePlayer::GetPlayerByIndex(info.entity_index);

            if (ent && g_LocalPlayer && ent->IsAlive())
            {
                if (g_Configurations.chams_player_enabled)
                {
                    const auto enemy = ent->m_iTeamNum() != g_LocalPlayer->m_iTeamNum();
                    if (!enemy && g_Configurations.chams_player_enemies_only)
                        return;

                    const auto clr_front = enemy ? g_Configurations.color_chams_player_enemy_visible : g_Configurations.color_chams_player_ally_visible;
                    const auto clr_back = enemy ? g_Configurations.color_chams_player_enemy_occluded : g_Configurations.color_chams_player_ally_occluded;

                    if (g_Configurations.chams_player_ignorez)
                    {

                        OverrideMaterial(g_Configurations.chams_players_material_num_invisible, true, g_Configurations.chams_player_wireframe_invisible, clr_back);
                        fnDME(g_MdlRender, 0, ctx, state, info, matrix);
                        OverrideMaterial(g_Configurations.chams_players_material_num_visible, false, g_Configurations.chams_player_wireframe_visible, clr_front);
                    }
                    else
                    {
                        OverrideMaterial(g_Configurations.chams_players_material_num_visible, false, g_Configurations.chams_player_wireframe_visible, clr_front);
                    }
                }
            }
        }

}
Вот сам баг:
1647766877659.png
1647766904101.png
То есть сами атачменты работают, но кроме них почему то и модель красит. Как пофиксить?
 
Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2017
Сообщения
386
Реакции[?]
32
Поинты[?]
8K
Приложи код OverrideMaterial и хука DrawModelExecute
C++:
void __fastcall hkDrawModelExecute(void* _this, int edx, IMatRenderContext* ctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4_t* pCustomBoneToWorld)
    {
        static auto ofunc = mdlrender_hook.get_original<decltype(&hkDrawModelExecute)>(index::DrawModelExecute);
        if (g_MdlRender->IsForcedMaterialOverride() &&
            !strstr(pInfo.pModel->szName, "models/player") &&
            !strstr(pInfo.pModel->szName, "_dropped.mdl")
            &&
            !strstr(pInfo.pModel->szName, "models/weapons/w")
            &&
            !strstr(pInfo.pModel->szName, "_dropped.mdl")
            &&
            !strstr(pInfo.pModel->szName, "defuser")) {
            return ofunc(_this, edx, ctx, state, pInfo, pCustomBoneToWorld);
        }
        Chams::Get().OnDrawModelExecute(ctx, state, pInfo, pCustomBoneToWorld);
        ofunc(_this, edx, ctx, state, pInfo, pCustomBoneToWorld);
        g_MdlRender->ForcedMaterialOverride(nullptr);
    }
C++:
void Chams::OverrideMaterial(int mat_num, bool ignoreZ, bool wireframe, const Color& rgba)
{
    IMaterial* material = nullptr;
    switch (mat_num)
    {
    case 0: material = materialRegular;
        break;
    case 1: material = materialFlat;
        break;
    case 2: material = materialCrystal;
        break;
    case 3: material = materialGlass;
        break;
    case 4: material = materialGlow;
        break;
    case 5: material = materialCircuit;
        break;
    case 6: material = materialAnimated1;
        break;
    case 7: material = materialAnimated2;
        break;
    case 8: material = materialAnimated3;
        break;
    case 9: material = materialAnimated4;
        break;
    case 10: material = materialAnimated5;
        break;

    }

    if (!material)
        return;
    material->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, ignoreZ);

    material->SetMaterialVarFlag(MATERIAL_VAR_WIREFRAME, wireframe);
    ColorModulate(rgba, material);
    g_MdlRender->ForcedMaterialOverride(material);
}
 
Сверху Снизу