• Гость, перед открытием темы прочитай описание раздела, чтобы не ошибиться. Любые вопросы по настройке сервера создаются в разделе Технической Поддержки.
Иконка ресурса

AmxModX Custom Models 1.3.2

Нет прав для скачивания
Форматирование (BB-код):
// *************************************************************************************//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
// Официальная тема поддержки: https://neugomon.ru/threads/2038/                        //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// *************************************************************************************//

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

enum _:MDL { ACCESS[32], MDL_T[64], MDL_CT[64] }    // ip, steam, flag, #, *. # - steam; * - всем

#define MAX_MDL 64
new g_iBlockMdl[MAX_MDL];
new g_szModels[MAX_MDL][MDL];

new g_szPlayerModel[33][3][64];

public plugin_precache()
{
    new fp = fopen("addons/amxmodx/configs/custom_models.ini", "rt");
    if(!fp) set_fail_state("File addons/amxmodx/configs/custom_models.ini not found!");
 
    new buff[190], x;
    while(!feof(fp))
    {
        fgets(fp, buff, charsmax(buff)); trim(buff);
        if(!buff[0] || buff[0] == ';')
            continue;
        if(parse(buff,
            g_szModels[x][ACCESS], charsmax(g_szModels[][ACCESS]),
            g_szModels[x][MDL_T], charsmax(g_szModels[][MDL_T]),
            g_szModels[x][MDL_CT], charsmax(g_szModels[][MDL_CT])) == 3
        ) x++;
    }
    fclose(fp);
    if(!x) set_fail_state("File addons/amxmodx/configs/custom_models.ini incorrect!");

    for(new i, t, ct, str[64]; i < sizeof g_szModels; i++)
    {
        formatex(str, charsmax(str), "models/player/%s/%s.mdl", g_szModels[MDL_T], g_szModels[MDL_T]);
        t = file_exists(str);
        if(t) precache_model(str);
        
        formatex(str, charsmax(str), "models/player/%s/%s.mdl", g_szModels[MDL_CT], g_szModels[MDL_CT]);
        ct = file_exists(str);
        if(ct) precache_model(str);
        
        g_iBlockMdl = (!t && !ct);
    }
}

public plugin_init()
{
    register_plugin("Custom Models", "1.3.2", "neugomon");
    
    RegisterHam(Ham_Spawn, "player", "fwd_HamSpawn_Post", true);
    register_forward(FM_SetClientKeyValue, "fwd_SetClientKeyValue_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));
    new flags =      get_user_flags(id);

    g_szPlayerModel[id][1][0] = EOS;
    g_szPlayerModel[id][2][0] = EOS;
    
    for(new i; i < sizeof g_szModels; i++)
    {
        if(g_iBlockMdl == 1)
            continue;

        switch(g_szModels[ACCESS][0])
        {
            case '#':
            {
                if(is_user_steam(id))
                {
                    CopyModel(id, i);
                    break;
                }   
            }
            case '*':
            {
                CopyModel(id, i);
                break;
            }
            case 'S':
            {
                if(strcmp(g_szModels[ACCESS], szAuthid) == 0)
                {
                    CopyModel(id, i);
                    break;
                }
            }
            default:
            {
                if(isdigit(g_szModels[ACCESS][0]))
                {
                    if(strcmp(g_szModels[ACCESS], szIP) == 0)
                    {
                        CopyModel(id, i);
                        break;
                    }
                }
                else if(flags & read_flags(g_szModels[ACCESS]))
                {
                    CopyModel(id, i);
                    break;
                }
            }
        }
    }
}

public fwd_HamSpawn_Post(id)
{
    if(!is_user_alive(id))
        return;
        
    switch(get_pdata_int(id, 114))
    {
        case 1: if(g_szPlayerModel[id][1][0]) fmSetModel(id, g_szPlayerModel[id][1]);
        case 2: if(g_szPlayerModel[id][2][0]) fmSetModel(id, g_szPlayerModel[id][2]);
    }
}

public fwd_SetClientKeyValue_Pre(id, const szInfobuffer[], const szKey[], const szValue[])
{   
    if(strcmp(szKey, "model") != 0)
        return FMRES_IGNORED;
    static iTeam; iTeam = get_pdata_int(id, 114);
    if(iTeam != 1 && iTeam != 2)
        return FMRES_IGNORED;
    if(g_szPlayerModel[id][iTeam][0] && strcmp(szValue, g_szPlayerModel[id][iTeam]) != 0)
    {
        fmSetModel(id, g_szPlayerModel[id][iTeam]);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;   
}

stock CopyModel(index, sId)
{
    copy(g_szPlayerModel[index][1], charsmax(g_szPlayerModel[][]), g_szModels[sId][MDL_T]);
    copy(g_szPlayerModel[index][2], charsmax(g_szPlayerModel[][]), g_szModels[sId][MDL_CT]);
}

stock fmSetModel(id, const model[])
    engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", model);
    
bool:is_user_steam(id)
{
    static dp_pointer;
    if(!dp_pointer) dp_pointer = get_cvar_pointer("dp_r_id_provider");
    
    server_cmd("dp_clientinfo %d", id);
    server_exec();
    return (get_pcvar_num(dp_pointer) == 2) ? true : false;
}    
Сверху