Admin Load и проверка в custom models

Сообщения
2,288
Реакции
1,737
Помог
31 раз(а)
Всем привет, на сервере установлен http://dev-cs.ru/resources/19/
Периодически после смены карты пропадает функционал на приложенном плагине (не читаются флаги админов)
Нужна помощь, изменить проверку на флаги на данном плагине.
Код:
// *************************************************************************************//
// Плагин загружен с www.neugomon.ru //
// Автор: Neygomon [ https://neugomon.ru/members/1/ ] //
// Официальная тема поддержки: https://neugomon.ru/threads/2370/ //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА! //
// *************************************************************************************//

#include <amxmodx>
#include <reapi>

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

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 '#':
{
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);
}
 

Вложения

Последнее редактирование модератором:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Пробуй
Код:
// *************************************************************************************//
// Плагин загружен с www.neugomon.ru //
// Автор: Neygomon [ https://neugomon.ru/members/1/ ] //
// Официальная тема поддержки: https://neugomon.ru/threads/2370/ //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА! //
// *************************************************************************************//

#include <amxmodx>
#include <reapi>

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

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 '#':
{
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;
}
}
}
}
}
}

public amxbans_admin_connect(id) {
for(new i = 0, flags = get_user_flags(id), aSize = ArraySize(g_aModels); i < aSize; i++)
{
ArrayGetArray(g_aModels, i, g_MdlInfo);

if (
g_MdlInfo[ACCESS][0] != '#'
&& g_MdlInfo[ACCESS][0] != '*'
&& g_MdlInfo[ACCESS][0] != 'S'
&& g_MdlInfo[ACCESS][0] != 'V'
&& !isdigit(g_MdlInfo[ACCESS][0])
&& (flags & read_flags(g_MdlInfo[ACCESS]))
) {
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
}
}
}

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);
}


UP: warning fixed.
 
Последнее редактирование модератором:
Сообщения
2,288
Реакции
1,737
Помог
31 раз(а)
Первая версия так же не у всех прогружала модели, во второй варнинг при компиле
fantom, Безымянный.jpg
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Не критично, обьявлена переменная и не используется.
 
Сообщения
2,288
Реакции
1,737
Помог
31 раз(а)
fantom, те кто заходит в середине карты например у них не загружается модель, а те кто с прошлой карты перешли у них все норм
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
C++:

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

#include <amxmodx>
#include <reapi>

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

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 '#':
{
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 amxbans_admin_connect(id) {
for(new i = 0, flags = get_user_flags(id), aSize = ArraySize(g_aModels); i < aSize; i++)
{
ArrayGetArray(g_aModels, i, g_MdlInfo);

if (
g_MdlInfo[ACCESS][0] != '#'
&& g_MdlInfo[ACCESS][0] != '*'
&& g_MdlInfo[ACCESS][0] != 'S'
&& g_MdlInfo[ACCESS][0] != 'V'
&& !isdigit(g_MdlInfo[ACCESS][0])
&& (flags & read_flags(g_MdlInfo[ACCESS]))
) {
CopyModel(id, g_MdlInfo[MDL_T], g_MdlInfo[MDL_CT]);
}
}
}

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);
}
 
Сообщения
1
Реакции
0
привет всем. столкнулся с тем что моделька имела 2 файла model.mdl и modelT.mdl соответственно плагином второй файл не подтягивался и вылетала кс у всех..
добавил проверку на файл с добавлением 2х переменных ctt и tt:

Код:
    for(new i, t, ct, tt, ctt, str[64]; i < sizeof g_szModels; i++)
    {
        formatex(str, charsmax(str), "models/player/%s/%s.mdl", g_szModels[i][MDL_T], g_szModels[i][MDL_T]);
        t = file_exists(str);
        if(t) precache_model(str);
        
        formatex(str, charsmax(str), "models/player/%s/%sT.mdl", g_szModels[i][MDL_T], g_szModels[i][MDL_T]);
        tt = file_exists(str);
        if(tt) precache_model(str);    
        
        formatex(str, charsmax(str), "models/player/%s/%s.mdl", g_szModels[i][MDL_CT], g_szModels[i][MDL_CT]);
        ct = file_exists(str);
        if(ct) precache_model(str);

        formatex(str, charsmax(str), "models/player/%s/%sT.mdl", g_szModels[i][MDL_CT], g_szModels[i][MDL_CT]);
        ctt = file_exists(str);
        if(ctt) precache_model(str);
        
        g_iBlockMdl[i] = (!t && !ct);
    }
;
насколько верно, все конечно работает, мб есть способ быстрее?
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу