// *************************************************************************************//
// Плагин загружен с www.neugomon.ru //
// Автор: Neygomon [ https://neugomon.ru/members/1/ ] //
// Официальная тема поддержки: https://neugomon.ru/threads/2370/ //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА! //
// *************************************************************************************//
#include <amxmodx>
#include <reapi>
#include <csx>
enum _:MDL
{
ACCESS[32],
MDL_T[64],
MDL_CT[64]
} // ip, steam, flag, #, *. # - steam; * - всем
new stats[8],bodyhits[8];
new topLimit = 15; //Верхняя граница позиции в ТОПе для выдачи модели
new g_szPlayerModel[33][TeamName][64];
new Array:g_aModels, g_MdlInfo[MDL];
public plugin_precache()
{
new szPath[64];
get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
add(szPath, charsmax(szPath), "/custom_models.ini");
new fp = fopen(szPath, "rt");
if(!fp)
{
#if AMXX_VERSION_NUM < 183
new szError[96];
formatex(szError, charsmax(szError), "File '%s' not found!", szPath);
set_fail_state(szError);
#else
set_fail_state("File '%s' not found!", szPath);
#endif
}
g_aModels = ArrayCreate(MDL);
new buff[190], t, ct, str[64];
while(!feof(fp))
{
fgets(fp, buff, charsmax(buff)); trim(buff);
if(!buff[0] || buff[0] == ';')
continue;
if(parse(buff,
g_MdlInfo[ACCESS], charsmax(g_MdlInfo[ACCESS]),
g_MdlInfo[MDL_T], charsmax(g_MdlInfo[MDL_T]),
g_MdlInfo[MDL_CT], charsmax(g_MdlInfo[MDL_CT])) == 3
)
{
formatex(str, charsmax(str), "models/player/%s/%s.mdl", g_MdlInfo[MDL_T], g_MdlInfo[MDL_T]);
t = file_exists(str);
if(t) precache_model(str);
else log_amx("[WARNING] Model '%s' not found.", str);
formatex(str, charsmax(str), "models/player/%s/%s.mdl", g_MdlInfo[MDL_CT], g_MdlInfo[MDL_CT]);
ct = file_exists(str);
if(ct) precache_model(str);
else log_amx("[WARNING] Model '%s' not found.", str);
if(t || ct) ArrayPushArray(g_aModels, g_MdlInfo);
}
}
fclose(fp);
if(!ArraySize(g_aModels))
{
#if AMXX_VERSION_NUM < 183
new szError[96];
formatex(szError, charsmax(szError), "File '%s' incorrect!", szPath);
set_fail_state(szError);
#else
set_fail_state("File '%s' incorrect!", szPath);
#endif
}
}
public plugin_init()
{
register_plugin("[ReAPI] Custom Models", "1.6.1", "neugomon");
RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawn_Post", true);
RegisterHookChain(RG_CBasePlayer_SetClientUserInfoModel, "fwdSetClientUserInfoModel_Pre", false);
}
public client_putinserver(id)
{
new szIP[16]; get_user_ip(id, szIP, charsmax(szIP), 1);
new szAuthid[25];get_user_authid(id, szAuthid, charsmax(szAuthid));
g_szPlayerModel[id][TEAM_TERRORIST][0] = EOS;
g_szPlayerModel[id][TEAM_CT][0] = EOS;
for(new i, flags = get_user_flags(id), aSize = ArraySize(g_aModels); i < aSize; i++)
{
ArrayGetArray(g_aModels, i, g_MdlInfo);
switch(g_MdlInfo[ACCESS][0])
{
case 'p':
{
if(get_user_stats(id, stats, bodyhits) <= topLimit)
{
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
break;
}
}
case '#':
{
if(REU_GetAuthtype(id) == CA_TYPE_STEAM)
{
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
break;
}
}
case '*':
{
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
break;
}
case 'S', 'V':
{
if(strcmp(g_MdlInfo[ACCESS], szAuthid) == 0)
{
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
break;
}
}
default:
{
if(isdigit(g_MdlInfo[ACCESS][0]))
{
if(strcmp(g_MdlInfo[ACCESS], szIP) == 0)
{
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
break;
}
}
else if(flags & read_flags(g_MdlInfo[ACCESS]))
{
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
break;
}
}
}
}
}
public fwdPlayerSpawn_Post(id)
{
if(!is_user_alive(id))
return;
switch(TeamName:get_member(id, m_iTeam))
{
case TEAM_TERRORIST:
if(g_szPlayerModel[id][TEAM_TERRORIST][0]) rg_set_user_model(id, g_szPlayerModel[id][TEAM_TERRORIST]);
case TEAM_CT:
if(g_szPlayerModel[id][TEAM_CT][0]) rg_set_user_model(id, g_szPlayerModel[id][TEAM_CT]);
}
}
public fwdSetClientUserInfoModel_Pre(const id, infobuffer[], szNewModel[])
{
new TeamName:iTeam = get_member(id, m_iTeam);
if(iTeam == TEAM_TERRORIST || iTeam == TEAM_CT)
{
if(g_szPlayerModel[id][iTeam][0] && strcmp(szNewModel, g_szPlayerModel[id][iTeam]) != 0)
SetHookChainArg(3, ATYPE_STRING, g_szPlayerModel[id][iTeam]);
}
return HC_CONTINUE;
}
stock CopyModel(index, modelT[], modelCT[])
{
copy(g_szPlayerModel[index][TEAM_TERRORIST], charsmax(g_szPlayerModel[][]), modelT);
copy(g_szPlayerModel[index][TEAM_CT], charsmax(g_szPlayerModel[][]), modelCT);
}