Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Mich@elson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    19
    Репутация:
    0 ±

    Баг с репортом

    Подскажите пожалуйста.

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

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

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



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



    case 6133
      Открыть/закрыть
    PHP код:
    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(playeridCOLOR_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+90)];
                    
    format(stringssizeof(strings), admins_msgName(playerid), playeridName(target_id), target_idinputtext);
                    
    SendAdminMessage(COLOR_GREENstrings);
                    
    format(stringssizeof(strings), target_msgName(playerid), playeridinputtext);
                    
    SCM(target_idCOLOR_YELLOWstrings);
                    
    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;
                }
            } 
    Последний раз редактировалось Mich@elson; 09.12.2017 в 02:05.

  2. #2
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±
    с чего это баг? добавь переменную и равняй ее true/false когда админ открывает/закрывает жалобу, а в цикле уже выводи жалобы которые с false, то есть не открыты админами

  3. #3
    Аватар для Mich@elson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    19
    Репутация:
    0 ±
    Цитата Сообщение от Batya_Montes Посмотреть сообщение
    добавь переменную и равняй ее true/false когда админ открывает/закрывает жалобу
    Это есть:
    PHP код:
    aReportInfo[i][rIsTooked] = true

    Цитата Сообщение от Batya_Montes Посмотреть сообщение
    а в цикле уже выводи жалобы которые с false, то есть не открыты админами
    Сделал так. Тоже самое все. Диалоговое окно с жалобой показывает всем админам одинаково.
    PHP код:
    stock ShowPlayer_Admin_Report_List(playerid)
    {
        new 
    string[256], total_admin_reports 0;
        for(new 
    1MAX_ADMIN_REPORTSi++)
        {
            if(
    aReportInfo[i][rIsTooked] == false)
             {
                if(
    aReportInfo[i][rPlayerID] == -1) continue;
                
    SetPVarInt(playerid"report_id_to_answer"i);
                
    aReportInfo[i][rIsTooked] = true;
                
    format(stringsizeof(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(stringsizeof(string), "Репорт от: %s\n\n%s"Name(aReportInfo[i][rPlayerID]), aReportInfo[i][rText]);
            
    total_admin_reports++;
        }
        if(
    total_admin_reports == 0) return ShowPlayerDialogEx(playerid8230"Репорт""Жалобы/Вопросы отсутствуют""Назад""");
        
    ShowPlayerDialogEx(playerid6133DIALOG_STYLE_INPUT"Репорт"string"Ответить""Отмена");
        return 
    1;

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

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

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

    Может проблема из-за цикла? Так как жалобы отображаются с конца. Если сделать чтобы жалобы с репорта отображались с начала.То есть репорт в порядке очереди. Только как.
    Последний раз редактировалось Mich@elson; 09.12.2017 в 16:34.

  4. #4
    Аватар для Alexey Melnik
    Новичок

    Статус
    Оффлайн
    Регистрация
    11.11.2017
    Сообщений
    9
    Репутация:
    0 ±
    Сделайте переменную, например, last_valid_report. Админ прочитал жалобу 2, переменная уменьшается, второй админ прочитает 1 жалобу. И не надо никаких циклов

    Если админ может не проверить жалобу, не отклоняя, попробуйте реализовать связный список, главное избегайте циклов
    Последний раз редактировалось Alexey Melnik; 09.12.2017 в 17:13.

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Alexey Melnik Посмотреть сообщение
    Сделайте переменную, например, last_valid_report. Админ прочитал жалобу 2, переменная уменьшается, второй админ прочитает 1 жалобу. И не надо никаких циклов
    Такое будет нормально работать исключительно если админы будут проверять первую в списке жалобу. Иначе ещё больше лишних действий добавится

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

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

    Автор, во-первых, не страдай чепухой, возьми foreach и создай итератор для репортов, дабы проще было с ними работать.
    Во-вторых, что это за каша в цикле?
    PHP код:
    stock ShowPlayer_Admin_Report_List(playerid)
    {
        new 
    string[256];
        for(new 
    1MAX_ADMIN_REPORTSi++)
        {
            if(
    aReportInfo[i][rIsTooked] == true || aReportInfo[i][rPlayerID] == -1
                continue;
            
    format(stringsizeof(string), "Репорт от: %s\n\n%s"Name(aReportInfo[i][rPlayerID]), aReportInfo[i][rText]);
        }
        if(
    isnull(string)) 
            
    ShowPlayerDialogEx(playerid8230"Репорт""Жалобы/Вопросы отсутствуют""Назад""");
        else
            
    ShowPlayerDialogEx(playerid6133DIALOG_STYLE_INPUT"Репорт"string"Ответить""Отмена");
        return 
    1;

    И
    PHP код:
    aReportInfo[i][rIsTooked] = true
    должен быть не в цикле с отображением репортов, а при открытии конкретного.
    Да и не понятно что делает
    PHP код:
    SetPVarInt(playerid"report_id_to_answer"i); 
    в этом цикле? pVar будет хранить ID самого последнего репорта и не более того.
    Ты сам-то свой код понимаешь?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для Alexey Melnik
    Новичок

    Статус
    Оффлайн
    Регистрация
    11.11.2017
    Сообщений
    9
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Что это за боязнь циклов такая?
    Ты сам говорил, что нужно избегать нелогичных реализаций. Мне не кажется, что связный список в несколько раз сложнее цикла. Новичку будет полезно хотя бы узнать про него.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •