void __fastcall Hooks::DrawModelExecute(void* ecx, void* edx, IMatRenderContext* context, const DrawModelState_t& state, const ModelRenderInfo_t& info, matrix3x4_t* matrix)
{
static auto oDrawModelExecute = g_Hooks.pModelHook->GetOriginal<DrawModelExecute_t>(vtable_indexes::dme);
auto LocalEntity = Globals::LocalPlayer;
const char* ModelName = g_pModelInfo->GetModelName((model_t*)info.pModel);
/*---------------------------------------------*/
if (!ModelName || !LocalEntity )
{
oDrawModelExecute(ecx, context, state, info, matrix);
g_pModelRender->ForcedMaterialOverride(NULL);
return;
}
/*if (strstr(ModelName, "arms"))
{
g_pModelRender->ForcedMaterialOverride(mat_overlay);
oDrawModelExecute(ecx, context, state, info, matrix);
}*/
C_BaseEntity* pPlayerEntity = g_pEntityList->GetClientEntity(info.index);
if (!pPlayerEntity)
{
oDrawModelExecute(ecx, context, state, info, matrix);
g_pModelRender->ForcedMaterialOverride(NULL);
return;
}
//Ёбаная пизда, почему крашит без этой проверки
ClientClass* EntityClass = pPlayerEntity->GetClientClass();
if (!pPlayerEntity)
{
oDrawModelExecute(ecx, context, state, info, matrix);
g_pModelRender->ForcedMaterialOverride(NULL);
return;
}
//1
static IMaterial* mat_overlay;
static IMaterial* mat_model;
static bool once{ false };
if (!once)
{
std::ofstream("csgo/materials/glowOverlay.vmt") << R"#("VertexLitGeneric" {
"$additive" "1"
"$envmap" "models/effects/cube_white"
"$envmaptint" "[0 0.1 0.2]"
"$envmapfresnel" "1"
"$envmapfresnelminmaxexp" "[0 1 2]"
"$alpha" "0.8"
})#";
mat_overlay = g_pMaterialSys->FindMaterial("glowOverlay", nullptr);
//black without keys
mat_model = g_pMaterialSys->FindMaterial("csgo/materials/glowOverlay", nullptr);
once = true;
}
//Георгиня Ебановна
if (EntityClass->ClassID == (int)EClassIds::CCSPlayer)
{
if (pPlayerEntity == Globals::LocalPlayer)
{
g_pModelRender->ForcedMaterialOverride(mat_model);
mat_model->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, false);
oDrawModelExecute(ecx, context, state, info, matrix);
g_pModelRender->ForcedMaterialOverride(mat_overlay);
mat_overlay->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, false);
oDrawModelExecute(ecx, context, state, info, matrix);
}
if (pPlayerEntity->GetTeam() != Globals::LocalPlayer->GetTeam())
{
g_pModelRender->ForcedMaterialOverride(mat_model);
mat_model->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, true);
oDrawModelExecute(ecx, context, state, info, matrix);
g_pModelRender->ForcedMaterialOverride(mat_overlay);
mat_overlay->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, true);
oDrawModelExecute(ecx, context, state, info, matrix);
}
}
if (EntityClass->ClassID == (int)EClassIds::CCSRagdoll)
{
g_pModelRender->ForcedMaterialOverride(mat_overlay);
mat_overlay->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, false);
oDrawModelExecute(ecx, context, state, info, matrix);
}
if (EntityClass->ClassID == (int)EClassIds::CPredictedViewModel)
{
g_pModelRender->ForcedMaterialOverride(mat_overlay);
mat_overlay->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, false);
oDrawModelExecute(ecx, context, state, info, matrix);
}
if (EntityClass->ClassID == (int)EClassIds::CChicken)
{
g_pModelRender->ForcedMaterialOverride(mat_overlay);
mat_overlay->SetMaterialVarFlag(MATERIAL_VAR_IGNOREZ, false);
oDrawModelExecute(ecx, context, state, info, matrix);
}
oDrawModelExecute(ecx, context, state, info, matrix);
g_pModelRender->ForcedMaterialOverride(NULL);
}