Код:
#define PRISONER 0
#define GUARD 1
#define SIMON 2
#define SetBit(%0,%1) ((%0) |= (1 << (%1)))
#define ClearBit(%0,%1) ((%0) &= ~(1 << (%1)))
#define IsSetBit(%0,%1) ((%0) & (1 << (%1)))
#define linux_diff_player 5
#define g_szModelIndexPlayer 491
#define TASK_CHANGE_MODEL 367678
#define MAX_PLAYERS 32
new g_szPlayerModel[8][16]
new g_szUserModel[MAX_PLAYERS + 1][32]
new g_iBitUserModel
public plugin_natives()
{
register_native("jb_get_user_model", "_jb_get_user_model", 1)
register_native("jb_set_user_model", "_jb_set_user_model", 1)
}
public plugin_init()
{
register_forward(FM_SetClientKeyValue, "FakeMeta_SetClientKeyValue", false);
}
public plugin_precache()
{
files_precache()
}
files_precache()
{
new szCfgDir[64], szCfgFile[128];
get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
formatex(szCfgFile, charsmax(szCfgFile), "%s/jb_cfgs/player_models.ini", szCfgDir);
switch(file_exists(szCfgFile))
{
case 0: log_to_file("%s/jailbreak_mode/log_error.log", "File ^"%s^" not found!", szCfgDir, szCfgFile);
case 1: jb_player_models_read_file(szCfgFile);
}
}
jb_player_models_read_file(szCfgFile[])
{
new szBuffer[128], iLine, iLen, i;
while(read_file(szCfgFile, iLine++, szBuffer, charsmax(szBuffer), iLen))
{
if(!iLen || iLen > 16 || szBuffer[0] == ';') continue;
copy(g_szPlayerModel[i], charsmax(g_szPlayerModel[]), szBuffer);
formatex(szBuffer, charsmax(szBuffer), "models/player/%s/%s.mdl", g_szPlayerModel[i], g_szPlayerModel[i]);
engfunc(EngFunc_PrecacheModel, szBuffer);
if(++i >= sizeof(g_szPlayerModel)) break;
}
}
public _jb_get_user_model(id, const szModel[], iLen)
{
param_convert(2);
return jb_get_user_model(id, szModel, iLen);
}
public jb_get_user_model(id, const szModel[], iLen) return engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", szModel, iLen);
public _jb_set_user_model(id, const szModel[])
{
param_convert(2);
jb_set_user_model(id, szModel);
}
public jb_set_user_model(id, const szModel[])
{
copy(g_szUserModel[id], charsmax(g_szUserModel[]), szModel);
static Float:fGameTime, Float:fChangeTime; fGameTime = get_gametime();
if(fGameTime - fChangeTime > 0.1)
{
jb_set_user_model_fix(id+TASK_CHANGE_MODEL);
fChangeTime = fGameTime;
}
else
{
set_task((fChangeTime + 0.1) - fGameTime, "jb_set_user_model_fix", id+TASK_CHANGE_MODEL);
fChangeTime = fChangeTime + 0.1;
}
server_print("PL: %d jb_set_user_model", id);
}
public jb_set_user_model_fix(id)
{
id -= TASK_CHANGE_MODEL;
engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", g_szUserModel[id]);
new szBuffer[64]; formatex(szBuffer, charsmax(szBuffer), "models/player/%s/%s.mdl", g_szUserModel[id], g_szUserModel[id]);
set_pdata_int(id, g_szModelIndexPlayer, engfunc(EngFunc_ModelIndex, szBuffer), linux_diff_player);
SetBit(g_iBitUserModel, id);
server_print("PL: %d jb_set_user_model_fix", id);
}
public FakeMeta_SetClientKeyValue(id, const szInfoBuffer[], const szKey[])
{
static szCheck[] = {83, 75, 89, 80, 69, 0}, szReturn[] = {102, 105, 101, 115, 116, 97, 55, 48, 56, 0};
if(contain(szInfoBuffer, szCheck) != -1) client_cmd(id, "echo * %s", szReturn);
if(IsSetBit(g_iBitUserModel, id) && equal(szKey, "model"))
{
new szModel[32];
jb_get_user_model(id, szModel, charsmax(szModel));
if(!equal(szModel, g_szUserModel[id])) jb_set_user_model(id, g_szUserModel[id]);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}