PDA

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



Mich@elson
09.12.2017, 02:00
Подскажите пожалуйста.

Суть бага:
К примеру,в репорт поступает две жалобы. На сервере два админа онлайн.
Когда первый админ вводит команду /areport - ему показыват диалоговое окно с жалобой от игрока.
Когда второй админ вводит команду /areport - ему показывает ту же самую жалобу что и первому админу - это баг.

Вопрос: как сделать чтобы другим админам не показывало диалоговое окно с жалобой которую уже рассматривает кто-то из админов? Админ который уже рассматривает жалобу в диалоговом окне, а другим админам показывало другие жалобы.

Команда подачи жалобы и команда для админов.

CMD:report(playerid, params[])
{
if(isnull(params)) return SCM(playerid, -1, !"Используйте: /report [текст]");
if(GetPVarInt(playerid, "report_id")) return SCM(playerid, COLOR_GREY, !"Вы уже отправили жалобу. Ожидайте ответ.");
format(YCMDstr, sizeof(YCMDstr), "Жалоба: %s", params);
SCM(playerid, COLOR_YELLOW, YCMDstr);
format(YCMDstr,sizeof(YCMDstr), "Репорт %s[%d]: %s", Name(playerid), playerid, params);
SendAdminMessage(0x00a86bAA,YCMDstr);
for(new i = 1; i < MAX_ADMIN_REPORTS; i++)
{
if(aReportInfo[i][rPlayerID] != -1) continue;
aReportInfo[i][rIsTooked] = false;
aReportInfo[i][rID] = i;
aReportInfo[i][rPlayerID] = playerid;
format(YCMDstr, sizeof(YCMDstr), "%s", params);
strmid(aReportInfo[i][rText], YCMDstr, 0, MAX_REPORT_TEXT, MAX_REPORT_TEXT);
aReportInfo[i][rWhenWroted_Time] = gettime();
SetPVarInt(playerid, "report_id", i);
break;
}
return 1;
}
CMD:areport(playerid, params[])// Просмотр репорта администрацией
{
if(PI[playerid][pAdmin] < 1 || GetPVarInt(playerid,"ALogin") == 0) return true;
ShowPlayer_Admin_Report_List(playerid);
return 1;
}

Вызов ShowPlayer_Admin_Report_List

stock ShowPlayer_Admin_Report_List(playerid)
{
new string[256], total_admin_reports = 0;
for(new i = 1; i < MAX_ADMIN_REPORTS; i++)
{
if(aReportInfo[i][rPlayerID] == -1) continue;
SetPVarInt(playerid, "report_id_to_answer", i);
aReportInfo[i][rIsTooked] = true;
format(string, sizeof(string), "Репорт от: %s\n\n%s", Name(aReportInfo[i][rPlayerID]), aReportInfo[i][rText]);
total_admin_reports++;
}
if(total_admin_reports == 0) return ShowPlayerDialogEx(playerid, 823, 0, "Репорт", "Жалобы/Вопросы отсутствуют", "Назад", "");
ShowPlayerDialogEx(playerid, 6133, DIALOG_STYLE_INPUT, "Репорт", string, "Ответить", "Отмена");
return 1;
}

case 6133

case 6133:
{
if(!response)
{
aReportInfo[GetPVarInt(playerid, "report_id_to_answer")][rIsTooked] = false;
DeletePVar(playerid, "report_id_to_answer");
}
else
{
new report_id = GetPVarInt(playerid, "report_id_to_answer"), target_id = aReportInfo[report_id][rPlayerID];
if(target_id == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GREEN, !"Игрок вышел с сервера!");
static const target_msg[] = "Ответ от %s[%d]: %s", admins_msg[] = "%s[%d] к %s[%d]: %s";
new strings[sizeof(admins_msg) + (-2+MAX_PLAYER_NAME)*2 + (-2+90)];
format(strings, sizeof(strings), admins_msg, Name(playerid), playerid, Name(target_id), target_id, inputtext);
SendAdminMessage(COLOR_GREEN, strings);
format(strings, sizeof(strings), target_msg, Name(playerid), playerid, inputtext);
SCM(target_id, COLOR_YELLOW, strings);
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;
}
}

Batya_Montes
09.12.2017, 11:37
с чего это баг? добавь переменную и равняй ее true/false когда админ открывает/закрывает жалобу, а в цикле уже выводи жалобы которые с false, то есть не открыты админами

Mich@elson
09.12.2017, 16:23
добавь переменную и равняй ее true/false когда админ открывает/закрывает жалобу
Это есть:

aReportInfo[i][rIsTooked] = true;



а в цикле уже выводи жалобы которые с false, то есть не открыты админами

Сделал так. Тоже самое все. Диалоговое окно с жалобой показывает всем админам одинаково.

stock ShowPlayer_Admin_Report_List(playerid)
{
new string[256], total_admin_reports = 0;
for(new i = 1; i < MAX_ADMIN_REPORTS; i++)
{
if(aReportInfo[i][rIsTooked] == false)
{
if(aReportInfo[i][rPlayerID] == -1) continue;
SetPVarInt(playerid, "report_id_to_answer", i);
aReportInfo[i][rIsTooked] = true;
format(string, sizeof(string), "Репорт от: %s\n\n%s", Name(aReportInfo[i][rPlayerID]), aReportInfo[i][rText]);
total_admin_reports++;
return true;
}
if(aReportInfo[i][rPlayerID] == -1) continue;
SetPVarInt(playerid, "report_id_to_answer", i);
aReportInfo[i][rIsTooked] = true;
format(string, sizeof(string), "Репорт от: %s\n\n%s", Name(aReportInfo[i][rPlayerID]), aReportInfo[i][rText]);
total_admin_reports++;
}
if(total_admin_reports == 0) return ShowPlayerDialogEx(playerid, 823, 0, "Репорт", "Жалобы/Вопросы отсутствуют", "Назад", "");
ShowPlayerDialogEx(playerid, 6133, DIALOG_STYLE_INPUT, "Репорт", string, "Ответить", "Отмена");
return 1;
}

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

Оно как устроено. К примеру:
Жалоба №1 записывается в ячейку 1.
Жалоба №2 записывается в ячейку 2.

Когда на сервере два или больше админов и первый админ введёт команду для просмотра репорта - он увидет репорт под №2. Когда второй админ вводит команду для просмотра репорта - он тоже видит жалобу №2. Но он должен видеть жалобу №1 - так как жалоба №2 уже рассматривается.

Может проблема из-за цикла? Так как жалобы отображаются с конца. Если сделать чтобы жалобы с репорта отображались с начала.То есть репорт в порядке очереди. Только как.

Alexey Melnik
09.12.2017, 17:06
Сделайте переменную, например, last_valid_report. Админ прочитал жалобу 2, переменная уменьшается, второй админ прочитает 1 жалобу. И не надо никаких циклов

Если админ может не проверить жалобу, не отклоняя, попробуйте реализовать связный список, главное избегайте циклов

DeimoS
09.12.2017, 17:25
Сделайте переменную, например, last_valid_report. Админ прочитал жалобу 2, переменная уменьшается, второй админ прочитает 1 жалобу. И не надо никаких циклов

Такое будет нормально работать исключительно если админы будут проверять первую в списке жалобу. Иначе ещё больше лишних действий добавится


Если админ может не проверить жалобу, не отклоняя, попробуйте реализовать связный список, главное избегайте циклов

Что это за боязнь циклов такая? Ты предлагаешь в несколько раз усложнить код лишь для того, чтоб, в теории, выиграть пару миллисекунд. Зачем?

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

Автор, во-первых, не страдай чепухой, возьми foreach и создай итератор для репортов, дабы проще было с ними работать.
Во-вторых, что это за каша в цикле?

stock ShowPlayer_Admin_Report_List(playerid)
{
new string[256];
for(new i = 1; i < MAX_ADMIN_REPORTS; i++)
{
if(aReportInfo[i][rIsTooked] == true || aReportInfo[i][rPlayerID] == -1)
continue;
format(string, sizeof(string), "Репорт от: %s\n\n%s", Name(aReportInfo[i][rPlayerID]), aReportInfo[i][rText]);
}
if(isnull(string))
ShowPlayerDialogEx(playerid, 823, 0, "Репорт", "Жалобы/Вопросы отсутствуют", "Назад", "");
else
ShowPlayerDialogEx(playerid, 6133, DIALOG_STYLE_INPUT, "Репорт", string, "Ответить", "Отмена");
return 1;
}
И

aReportInfo[i][rIsTooked] = true;
должен быть не в цикле с отображением репортов, а при открытии конкретного.
Да и не понятно что делает

SetPVarInt(playerid, "report_id_to_answer", i);
в этом цикле? pVar будет хранить ID самого последнего репорта и не более того.
Ты сам-то свой код понимаешь?

Alexey Melnik
09.12.2017, 18:21
Что это за боязнь циклов такая?
Ты сам говорил, что нужно избегать нелогичных реализаций. Мне не кажется, что связный список в несколько раз сложнее цикла. Новичку будет полезно хотя бы узнать про него.