PDA

Просмотр полной версии : [Вопрос] Ошибка в репорте.



Vander
03.10.2017, 23:18
Взял систему репорта по очереди, и теперь вылетают варинги от крашдетекта и в самом списке меню, не убавляется список, примерный код где выходят ошибки:


if(GetPVarInt(playerid, "report_id"))
{
new report_id = GetPVarInt(playerid, "report_id");
aReportInfo[report_id][rIsTooked] = false;
aReportInfo[report_id][rID] = report_id;
aReportInfo[report_id][rPlayerID] = -1;
aReportInfo[report_id][rText][0] = EOS;
aReportInfo[report_id][rWhenWroted_Time] = -1;
aReportInfo[report_id][rWhenWroted_Text][0] = EOS;
}

И


new
report_id = GetPVarInt(playerid, "report_id_to_answer"),
target_id = aReportInfo[report_id][rPlayerID];
if(target_id == INVALID_PLAYER_ID) return SendClientMessage(playerid, -1, !""INPP"Данный игрок отключился от сервера!");
static const
target_msg[] = "Ответ от %s[%d]: %s",
admins_msg[] = "[A] Администратор %s[%d] ответил %s[%d]: %s";
new string[sizeof(admins_msg) + (-2+MAX_PLAYER_NAME)*2 + (-2+90)];
format(string, sizeof(string), admins_msg, PlayerInfo[playerid][pName], playerid, PlayerInfo[target_id][pName], target_id, inputtext);
SendAdminMessage(COLOR_ADMINK, string);
format(string, sizeof(string), target_msg, PlayerInfo[playerid][pName], playerid, inputtext);
SendClientMessage(target_id, -1, string);
DeletePVar(target_id, "report_id");
aReportInfo[report_id][rIsTooked] = false;
aReportInfo[report_id][rID] = report_id;
aReportInfo[report_id][rPlayerID] = -1;
aReportInfo[report_id][rText][0] = EOS;
aReportInfo[report_id][rWhenWroted_Time] = -1;
aReportInfo[report_id][rWhenWroted_Text][0] = EOS;
}
return true;
}

Что делать?

DeimoS
04.10.2017, 03:00
Ну так покажи ошибки от crashdetect для начала

Vander
04.10.2017, 10:08
Ну так покажи ошибки от crashdetect для начала


[23:19:51] [debug] Run time error 4: "Array index out of bounds"
[23:19:51] [debug] Attempted to read/write array element at index 65535 in array of size 1000
[23:19:51] [debug] AMX backtrace:
[23:19:51] [debug] #0 00207a74 in public Itter_OnPlayerDisconnect (0, 1)
[23:19:51] [debug] #1 native CallLocalFunction () from samp-server.exe
[23:19:51] [debug] #2 0003700c in public SSCANF_OnPlayerDisconnect (0, 1)
[23:19:51] [debug] #3 0002cfe8 in public ac_OnPlayerDisconnect (0, 1)
[23:19:51] [debug] #4 0000a2d8 in public OnPlayerDisconnect (0, 1)

Osetin
04.10.2017, 12:42
http://pro-pawn.ru/showthread.php?12957

Vander
05.10.2017, 17:02
Вроде-бы все убрал, но проблема в другом осталась, репорт не работает правильно, т.е. выполняете ответ на репорт и когда открываете окно вновь для проверки запросов, опять остается имя игрока, но когда уже нажимаете - окно закрывается, вновь открываем и получаем ответ - игроку уже отвечают.

Диалог отвечающий за ответ:

case 801:
{
if(!response)
{
aReportInfo[GetPVarInt(playerid, "report_id_to_answer")][rIsTooked] = false;
DeletePVar(playerid, "report_id_to_answer");
ShowPlayer_Admin_Report_List(playerid);
}
else
{
new
report_id = GetPVarInt(playerid, "report_id_to_answer"),
target_id = aReportInfo[report_id][rPlayerID];

if(target_id == INVALID_PLAYER_ID)
return SendClientMessage(playerid, -1, !"Ошибка: Данный игрок отключился от сервера!");

static const
target_msg[] = "[report] Ответ от %s[%d]: %s",
admins_msg[] = "[ADMIN-REPORT] Администратор %s[%d] ответил %s[%d]: %s";

new
string[sizeof(admins_msg) + (-2+MAX_PLAYER_NAME)*2 + (-2+90)];

format(string, sizeof(string), admins_msg, PlayerInfo[playerid][pNames], playerid, PlayerInfo[target_id][pNames], target_id, inputtext);
SendAdminMessage(-1, string);
format(string, sizeof(string), target_msg, PlayerInfo[playerid][pNames], playerid, inputtext);
SendClientMessage(target_id, -1, string);

DeletePVar(target_id, "report_id");

aReportInfo[report_id][rIsTooked] = false;
aReportInfo[report_id][rID] = report_id;
aReportInfo[report_id][rPlayerID] = -1;
aReportInfo[report_id][rText][0] = EOS;
aReportInfo[report_id][rWhenWroted_Time] = -1;
aReportInfo[report_id][rWhenWroted_Text][0] = EOS;
}
}

DeimoS
05.10.2017, 17:09
Шта? А теперь то же самое, только по-русски.
И код показа списка покажи

Vander
05.10.2017, 17:21
Шта? А теперь то же самое, только по-русски.
И код показа списка покажи


stock ShowPlayer_Admin_Report_List(playerid)
{
static string[1048], total_admin_reports = 0;
for(new i = 1; i < MAX_ADMIN_REPORTS; i++)
{
if(aReportInfo[i][rPlayerID] == -1) continue;
format(string, sizeof(string), "%s %d. %s\n", string, i, PlayerInfo[aReportInfo[i][rPlayerID]][pName]);
total_admin_reports++;
}
if(total_admin_reports == 0) return SendClientMessage(playerid, -1, !""ERPP"На данный момент нет доступных жалоб/сообщений от игроков.");
ShowPlayerDialog(playerid, 800, DIALOG_STYLE_LIST, ""CSERV"Список жалоб/сообщений от игроков", string, "Выбрать", "Отмена");
return 1;
}

DeimoS
05.10.2017, 17:28
Диалог под ID 800 скинь

Vander
05.10.2017, 17:34
Диалог под ID 800 скинь


case 800:
{
if(!response) return 1;
if(aReportInfo[listitem + 1][rIsTooked] == false) ShowPlayer_Admin_Report_Answer(playerid, listitem + 1);
else SendClientMessage(playerid, -1, !""ERPP"Àäìèíèñòðàöèÿ óæå îòâå÷àåò íà äàííóþ æàëîáó/ñîîáùåíèå.");
return true;
}

DeimoS
05.10.2017, 18:08
if(aReportInfo[listitem + 1][rIsTooked] == false) ShowPlayer_Admin_Report_Answer(playerid, listitem + 1);
Не проще сделать так?

listitem++;
if(aReportInfo[listitem][rIsTooked] == false) ShowPlayer_Admin_Report_Answer(playerid, listitem);
Но не суть.

Получается, ты отвечаешь на report игрока и диалог закрывается. Когда открываешь диалог ещё раз, старая информация о репорте остаётся? И когда нажимаешь на неё, диалог закрывается, при этом, ничего не пишется?
И только после этого информация исчезает из диалога, так?

Vander
05.10.2017, 19:10
И даже после всего этого - старая информация не пропадает. Просто теперь окно ответа не появляется.

DeimoS
05.10.2017, 19:13
Во-первых, ты забываешь отчистить массив перед повторным использованием (да и переменная там ни к чему)

stock ShowPlayer_Admin_Report_List(playerid)
{
static string[1048];
string[0] = '\0';
for(new i = 1; i < MAX_ADMIN_REPORTS; i++)
{
if(aReportInfo[i][rPlayerID] == -1)
continue;
format(string, sizeof(string), "%s %d. %s\n", string, i, PlayerInfo[aReportInfo[i][rPlayerID]][pName]);
}
if(isnull(string))
SendClientMessage(playerid, -1, !""ERPP"На данный момент нет доступных жалоб/сообщений от игроков.");
else
ShowPlayerDialog(playerid, 800, DIALOG_STYLE_LIST, ""CSERV"Список жалоб/сообщений от игроков", string, "Выбрать", "Отмена");
return 1;
}

Во-вторых, консоли ошибок никаких нет от crashdetect?

И покажи где ты записываешь информацию в PVar report_id_to_answer