Ну вот в следующий раз и нужно кидать код, который есть у тебя, а не какие-то вырезки.
Но всё ещё не понятно что ты хочешь этой функцией вывести? Ты грузишь одни данные, но, в итоге, работаешь с совершенно другими.
Вид для печати
Ну вот в следующий раз и нужно кидать код, который есть у тебя, а не какие-то вырезки.
Но всё ещё не понятно что ты хочешь этой функцией вывести? Ты грузишь одни данные, но, в итоге, работаешь с совершенно другими.
Для чего каждый раз выгружать данные из skins?
Разве эта информация не будет использоваться всеми игроками и довольно часто?PHP код:
sscanf(skins[i], !"p<,>iiiii", tempid[0], id[1], id[2], id[3], id[4]);
Не лучше ли один раз выгрузить её при старте сервера и потом использовать? От этого было бы гораздо больше пользы, чем от бессмысленной паковки строки в sscanf.
Хотя не совсем понятно для чего её хранить в таблице вообще, если она далеко не индивидуальна и изменяться особо не будет. Да и сам код построен так, что проще было бы хранить её прямо в моде.
Теперь конкретно по твоему вопросу.
Так а ничего, что ты переменную, которая должна хранить количество нажатий, хранишь в стэке? Она у тебя каждый раз ровна -1, потому и дальше 0 не уходит. Хотя даже если бы и уходила, то после 10 нажатий у тебя просто случался бы выход за пределы массива.
Пробуй так (хотя я бы убрал постоянное насилование sscanf)
Только не забудь удалить pVar после того, как выбор скина закончится или игрок нажмёт на другой текстдрав.PHP код:
stock SSkin(playerid, gend, nat, age)
{
static
id[5],
idx,
specifier_buff[10+10+1];
if(isnull(specifier_buff))
format(specifier_buff, sizeof(specifier_buff), "p<,>a<i>[%d]", sizeof(id));
if((idx = GetPVarInt(playerid, "SkinArrayIndex")) >= sizeof(id))
idx = 0;
for(new i = 0; i < sizeof(skins); i++)
{
if(reg_gend{i} == gend && reg_nat{i} == nat && (age >= reg_minage{i} && age <= reg_maxage{i}))
{
sscanf(skins[i], specifier_buff, id);
format(s_string, sizeof(s_string), "%i", idx);
SendClientMessage(playerid, -1, s_string);
SetPlayerSkin(playerid, id[idx]);
SetPVarInt(playerid, "SkinArrayIndex", idx+1);
break;
}
}
return 1;
}
crashdetect выдал ошибки тут:
Вот лог:PHP код:
SetPlayerSkin(playerid, id[idx]);
Код HTML:[debug] AMX backtrace:
[debug] #0 000228c0 in SSkin(playerid=0, gen=1, nat=1, age=18) at D:\mode\gamemodes\inc\dev.inc:73
[debug] #1 00022a90 in public cmd_test (playerid=0, ... <1 argument>) at D:\mode\gamemodes\inc\dev.inc:83
[debug] #2 native DC_CMD () from dc_cmd.dll
[debug] #3 000001a0 in public OnPlayerCommandText (playerid=0, cmdtext[]=@003ad02c "/test") at D:\mode\pawno\include\dc_cmd.inc:67
Несколько строк выше дай. Там причина ошибки написана
PHP код:
stock SSkin(playerid, gend, nat, age)
{
static
id[5],
idx,
specifier_buff[10+10+1];
if(isnull(specifier_buff))
format(specifier_buff, sizeof(specifier_buff), "p<,>a<i>[%d]", sizeof(id));
if((idx = GetPVarInt(playerid, "SkinArrayIndex")) >= sizeof(id))
idx = 0;
for(new i = 0; i < sizeof(skins); i++)
{
if(reg_gend{i} == gend && reg_nat{i} == nat && (age >= reg_minage{i} && age <= reg_maxage{i}))
{
sscanf(skins[i], specifier_buff, id);
format(s_string, sizeof(s_string), "%i", idx);
SendClientMessage(playerid, -1, s_string);
SetPlayerSkin(playerid, id[idx]);
SetPVarInt(playerid, "SkinArrayIndex", idx+1);
break;
}
}
return 1;
}
Да, в LoadSkins.
Вместо твоего:
что-то вроде этого:PHP код:
cache_get_value_name(i, !"sid", skins[i], 26);
PHP код:
#define MAX_SKINS_COUNT 5
new skins[10][MAX_SKINS_COUNT];
// LoadSkins
cache_get_value_name(i, !"sid", temp);
sscanf(temp, !"p<,>a<i>[" #MAX_SKINS_COUNT "]", skins[i][0]);