Вход

Просмотр полной версии : [Вопрос] Краш сервера



SteveStage
10.11.2019, 14:54
Репорт: https://pastebin.com/0QUSdak8
Ответ на него: https://pastebin.com/SqDmKpxG
При ответе на репорт сервер крашит, samp-server.exe закрывается
Как решить?

- - - Добавлено - - -

Репорт:

CMD:report(playerid)
{
if(player[playerid][pAdmin] > 0)
return SCM(playerid, COLOR_RED, !"Вы не можете подавать жалобы в репорт, так как Вы администратор!");
else
DialogReport(playerid);
return true;
}

new report_timer[MAX_PLAYERS],
bool: report_check[MAX_PLAYERS char];

stock DialogReport(playerid)
{
SPD(playerid, 16, DSI, !"{00C0FF}Репорт",
!"\
{00C0FF}Введите свою жалобу в поле ниже\n\
\n{F81414}В репорте запрещен оффтоп/оскорбления/попрошайничество!", !"{00C0FF}Принять", !"{00C0FF}Отмена\
");
}
case 16:
{
if(response)
{
new
len = strlen(inputtext);
if(!len)
{
SCM(playerid, COLOR_RED, !"Вы ничего не ввели!");
DialogReport(playerid);
return true;
}
if(report_check{playerid} == true)
{
SCM(playerid, COLOR_RED, !"Жалобу вы можете подавать не раньше раз в минуту!");
DialogReport(playerid);
return true;
}
if(len > 50)
{
SCM(playerid, COLOR_RED, !"Ваша жалоба слишком длинная, попробуйте ее сократить");
DialogReport(playerid);
return true;
}
static
fmt_str[] = "Жалоба, которую вы отправили на рассмотрение администрации проекта Junction RP: %s",
fmt_str_adm[] = "Игрок %s[%d] оставил жалобу: %s";
new
string[sizeof(fmt_str)-1+50+86],
string_adm[sizeof(fmt_str_adm)-5+50+MAX_PLAYER_NAME+3+86];
format(string, sizeof(string), fmt_str, (inputtext));
format(string_adm, sizeof(string_adm), fmt_str_adm, GetName(playerid), playerid, (inputtext));
SCM(playerid, COLOR_YELLOW, string);
AdminChat(COLOR_RED, string_adm);
report_check{playerid} = true;
report_timer[playerid] = SetTimerEx("@_ReportTime", 1000*60, false, "i", playerid);
}
}

@_ReportTime(playerid);
@_ReportTime(playerid)
{
report_check{playerid} = false;
return true;
}

Ответ:


CMD:answer(playerid, params[])
{
if(player[playerid][pAdmin] == 0)
{
SCM(playerid, COLOR_RED, !"Вы не администратор!");
return false;
}

new
targetid,
answer[31];

if(sscanf(params, "us[31]", targetid, answer))
return SCM(playerid, COLOR_RED, !"Образец ответа на репорт: /kick [id] [reason]");
if(!IsPlayerConnected(targetid))
return SCM(playerid, COLOR_RED, !"Игрок с введенным вами ID не в сети!");
if(answer[30] != EOS)
return SCM(playerid, COLOR_RED, !"Максимальная длина ответа на репорт: 30 символов");
if(report_check{targetid} == false)
return SCM(playerid, COLOR_RED, !"Игрок с данным ID не писал в репорт!");

static const
fmt_str[] = "[ADMIN] Администратор %s ответил на ваш репорт: %s",
fmt_str2[] = "[ADMIN] Вы ответили игроку %s на репорт: %s";

new
str[sizeof(fmt_str)-4+MAX_PLAYER_NAME+30+1],
str2[sizeof(fmt_str2)-4+MAX_PLAYER_NAME+30+1];

format(str, sizeof(str), fmt_str, GetName(playerid), answer);
format(str2, sizeof(str2), fmt_str2, GetName(playerid), answer);
SCM(targetid, COLOR_RED, fmt_str);
SCM(playerid, COLOR_RED, fmt_str2);
report_check{targetid} = false;
KillTimer(report_timer[targetid]);
return true;
}

DeimoS
10.11.2019, 15:07
Подключить crashdetect и посмотреть причину краша?
Ну и да. Вместо вот этого извращения:
static const
fmt_str[] = "[ADMIN] Администратор %s ответил на ваш репорт: %s",
fmt_str2[] = "[ADMIN] Вы ответили игроку %s на репорт: %s";

new
str[sizeof(fmt_str)-4+MAX_PLAYER_NAME+30+1],
str2[sizeof(fmt_str2)-4+MAX_PLAYER_NAME+30+1];

format(str, sizeof(str), fmt_str, GetName(playerid), answer);
format(str2, sizeof(str2), fmt_str2, GetName(playerid), answer);
SCM(targetid, COLOR_RED, fmt_str);
SCM(playerid, COLOR_RED, fmt_str2);
можно было сделать так:

new
string[144+1];

format(string, sizeof(string), "[ADMIN] Администратор %s ответил на ваш репорт: %s", GetName(playerid), answer);
SCM(targetid, COLOR_RED, string);
format(string, sizeof(string), "[ADMIN] Вы ответили игроку %s на репорт: %s", GetName(playerid), answer);
SCM(playerid, COLOR_RED, string);
Этим я только что сэкономил 4 строки, 53 ячейки стека и пару минут своей жизни.

SteveStage
10.11.2019, 18:54
Краш был из-за того, что я, видимо пьяный, написал в SCM неформатированный fmt_str, а не str, а из-за символов спецификатора и крашило (%)

ЗАКРЫТО