Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: /bug и /sug

  1. #1
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    Pro-Pawn.Ru
    Сообщений
    3,428
    Репутация:
    1079 ±

    /bug и /sug

    PHP код:
    #define    BUG_REPORT_FILE_NAME        "BugLog.txt"
    #define    SUGGESTION_FILE_NAME        "SugLog.txt"
    #define    BUG_REPORT_COOLDOWN_TIME    60

    stock CheckBugReportCooldown(playerid)
    {
        static 
    bug_report_tick[MAX_PLAYERS];
        new 
    current_tick tickcount();
        static const 
    cooldown_message[] =
            !
    "Отчитываться о багах и писать предложения можно раз в "\
            
    #BUG_REPORT_COOLDOWN_TIME" секунд.";
        
    if(current_tick bug_report_tick[playerid]+BUG_REPORT_COOLDOWN_TIME*1000)
            return 
    SendClientMessage(playerid, -1cooldown_message);
        
    bug_report_tick[playerid] = current_tick;
        return 
    0;
    }

    CMD:bug(playeridparams[])
    {
        static const 
    str_usage[] = !"Использование: /bug [описание бага]";
        if(
    isnull(params))
            return 
    SendClientMessage(playerid, -1str_usage);
        if(
    CheckBugReportCooldown(playerid))
            return 
    1;
        static    const 
    bug_str[] = " сообщил о баге: ";
        new 
    string[sizeof(bug_str)+MAX_PLAYER_NAME+144];
        
    GetPlayerName(playeridstringsizeof(string));
        
    strcat(stringbug_str), strcat(stringparams);
        new 
    File:bug_report_file fopen(!BUG_REPORT_FILE_NAMEio_append);
        static const 
    str_couldnt_open_file[] =
            !
    "Ошибка: Не удалось открыть файл \"" BUG_REPORT_FILE_NAME "\" !";
        if(
    _:bug_report_file == 0)
            return 
    SendClientMessage(playerid, -1str_couldnt_open_file);
        
    fwrite(bug_report_filestring);
        
    fclose(bug_report_file);
        
    SendClientMessage(playerid, -1, !"Вы успешно сообщили о баге. Спасибо!");
        
    string[0] = ' 'string[1] = '\0'strcat(stringparams);
        return 
    SendClientMessage(playerid, -1string);
    }

    CMD:sug(playeridparams[])
    {
        static const 
    str_usage[]= !"Использование: /sug [предложение по улучшению]";
        if(
    isnull(params))
            return 
    SendClientMessage(playerid, -1str_usage);
        if(
    CheckBugReportCooldown(playerid))
            return 
    1;
        static    const 
    sug_str[] = " предложил: ";
        new 
    string[sizeof(sug_str)+MAX_PLAYER_NAME+144];
        
    GetPlayerName(playeridstringsizeof(string));
        
    strcat(stringsug_str), strcat(stringparams);
        new 
    File:suggestion_file fopen(!SUGGESTION_FILE_NAMEio_append);
        static const 
    str_couldnt_open_file[] =
            !
    "Ошибка: Не удалось открыть файл \"" SUGGESTION_FILE_NAME "\" !";
        if(
    _:suggestion_file == 0)
            return 
    SendClientMessage(playerid, -1str_couldnt_open_file);
        
    fwrite(suggestion_filestring);
        
    fclose(suggestion_file);
        
    SendClientMessage(
            
    playerid, -1,
            !
    "Вы успешно написали предложение по улучшению. Спасибо!"
        
    );
        
    string[0] = ' 'string[1] = '\0'strcat(stringparams);
        return 
    SendClientMessage(playerid, -1string);

    Например, игрок пишет: /bug замечен баг на работе грузчика. А команда /sug для предложения по улучшению сервера.
    Последний раз редактировалось Daniel_Cortez; 26.05.2015 в 18:41. Причина: fixed flood vulnerability

  2. Пользователь сказал cпасибо:
    AndreyKa (02.07.2014)
  3. #2
    Аватар для TWIX
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.10.2013
    Сообщений
    101
    Репутация:
    40 ±
    Неплохо но можно проще на sscanf )!
    Уважаю данных Людей:

    1. Osetin(Хороший Администратор)
    2.Daniel_Cortez(Классный скриптер)
    3.Londlem(Офигенный скриптер)
    4.#Carleone(Просто хороший человек)

  4. #3
    Аватар для Londlem
    Модератор

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Сообщений
    1,360
    Репутация:
    767 ±
    Цитата Сообщение от TWIX Посмотреть сообщение
    Неплохо но можно проще на sscanf )!
    А разве команды не на sscanf?

  5. #4
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±
    Цитата Сообщение от TWIX Посмотреть сообщение
    Неплохо но можно проще на sscanf )!
    Цитата Сообщение от Londlem Посмотреть сообщение
    А разве команды не на sscanf?
    Проще будет наоборот без sscanf: в аргументе params и так уже есть строка с введёнными данными. Достаточно лишь использовать isnull для проверки на пустую строку.

    P.S.: Мне кажется, или сообщения записываются через sscanf не в строку, а в числовую переменную? Чревато выходом за пределы буфера.


    UPD: Переписал обе команды. Исправил баг с потерей вводимых данных.
    Первый пост обновлён.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  6. 3 пользователя(ей) сказали cпасибо:
    $continue$ (24.05.2015)Londlem (02.01.2014)Salvacore (02.01.2014)
  7. #5
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±
    Ещё раз переписал команды. Устранил уязвимость, с помощью которой можно было флудом команд остановить работу сервера из-за операций с файлами.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  8. #6
    Аватар для Mazzilla
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.11.2013
    Адрес
    Нижневартовск
    Сообщений
    256
    Репутация:
    63 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Ещё раз переписал команды. Устранил уязвимость, с помощью которой можно было флудом команд остановить работу сервера из-за операций с файлами.
    Для чего используется отрицание ('!') перед текстом? Не понял что-то.

    И зачем в конце команды выполнять такие действия, когда можно вернуть истину?)
    PHP код:
    string[0] = ' 'string[1] = '\0'strcat(stringparams);
        return 
    SendClientMessage(playerid, -1string); 
    Последний раз редактировалось Mazzilla; 28.05.2015 в 06:32.

  9. #7
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±
    Цитата Сообщение от Mazzilla Посмотреть сообщение
    Для чего используется отрицание ('!') перед текстом? Не понял что-то.

    Цитата Сообщение от Mazzilla Посмотреть сообщение
    И зачем в конце команды выполнять такие действия, когда можно вернуть истину?)
    В командах можно вообще не возвращать никаких значений - в этом случае компилятор автоматически подставит в конце функции инструкции, соответствующие return 1 (const.pri1 \ retn).
    Я же сделал возврат результата SCM, поскольку эта функция в любом случае вернёт 1 (игрок, вызвавший команду, всегда подключен).
    А раз функция всегда возвращает 1, почему бы не воспользоваться этим значением? Это чуть ли не самая распространённая оптимизация среди скриптеров.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  10. #8
    Аватар для 1lyad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.09.2016
    Сообщений
    20
    Репутация:
    1 ±
    PHP код:
        new string[sizeof(sug_str)+MAX_PLAYER_NAME+144];
        new 
    string[sizeof(bug_str)+MAX_PLAYER_NAME+144]; 
    Почему 144, если максимальное вводимое количество символов = 128, а если еще учесть "/sug_" / "/bug_", значит 128-5 = 123.
    Если ошибаюсь, поправьте.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от 1lyad Посмотреть сообщение
    PHP код:
        new string[sizeof(sug_str)+MAX_PLAYER_NAME+144];
        new 
    string[sizeof(bug_str)+MAX_PLAYER_NAME+144]; 
    Почему 144, если максимальное вводимое количество символов = 128, а если еще учесть "/sug_" / "/bug_", значит 128-5 = 123.
    Если ошибаюсь, поправьте.
    128 символов можно ввести в окно чата
    144 можно отобразить в SendClientMessage
    Мы не просто выводим текст из чата, а ещё добавляем к нему свою информацию, отображая через SendClientMessage => в данном случае действует ограничение в 144 символа, а не в 128 (игрок ввёл 128 символов в чате + прикрепился ник + прикрепился ID. Уже вышло больше 128).

    Непонятно только одно: к чему все эти вычисления, если SendClientMessage никак не отобразит больше 144 символов (если не использовать zmessage, конечно).
    Логично сделать так:
    PHP код:
    new string[MAX_CHATBUBBLE_LENGTH+1];
    new 
    string[MAX_CHATBUBBLE_LENGTH+1]; 
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  12. #10
    Аватар для 1lyad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.09.2016
    Сообщений
    20
    Репутация:
    1 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    128 символов можно ввести в окно чата
    О чём я и говорю, игрок может ввести максимально 128 символов, так какой смысл прибавлять к string'у 144 символа, если игроку будет выводиться только сообщение, которое он ввёл после "/bug", а значит, 124 символа, потому что пробел тоже будет выведен игроку, если заменять первый символ string на пробел.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    144 можно отобразить в SendClientMessage
    Мы не просто выводим текст из чата, а ещё добавляем к нему свою информацию, отображая через SendClientMessage.
    Посмотри на данный код.
    PHP код:
        string[0] = ' 'string[1] = '\0'strcat(stringparams); 
    Если да, то игроку просто выведет следующие два сообщения:
    PHP код:
        SendClientMessage(playerid, -1, !"Вы успешно сообщили о баге. Спасибо!"); // 1.
        
    string[0] = ' 'string[1] = '\0'strcat(stringparams);
        return 
    SendClientMessage(playerid, -1string); // 2: string = params.
        // Кстати, не совсем понял, почему бы просто не использовать:
        // return SendClientMessage(playerid, -1, params);
        // Из-за того, что пробела не будет в начале сообщения? 
    А теперь посмотрим где используется string на примере команды /bug:
    Цитата Сообщение от Osetin Посмотреть сообщение
    PHP код:
         //static const bug_str[] = " сообщил о баге: "; 
        
    new string[sizeof(bug_str)+MAX_PLAYER_NAME+144]; // new string[18 + 24 + 144]
        
    GetPlayerName(playeridstringsizeof(string)); // "Firstname_Lastname"
        
    strcat(stringbug_str); // "Firstname_Lastname сообщил о баге: "
        
    strcat(stringparams); // "Firstname_Lastname сообщил о баге: введенный текст игроком, после команды /bug";
        
    fwrite(bug_report_filestring); // записали в BugLog.txt всё содержимое переменной string;
        
    string[0] = ' 'string[1] = '\0'strcat(stringparams); // " введенный текст игроком, после команды /bug";
        
    return SendClientMessage(playerid, -1string); // выводим игроку содержимое переменной string.

    Теперь, собственно, вопрос, если мы уже знаем, что максимально выводимое количество символов в данном случае просто не может быть равно 144, ибо SA:MP не позволит ввести игроку столько.
    И вообще, если бы даже захотели вывести игроку 144 символа, то в переменной string предостаточно ячеек, в данном случае мы используем такое количество ячеек, чтобы всё полностью записалось в BugLog.txt.

    UPD:
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Непонятно только одно: к чему все эти вычисления, если SendClientMessage никак не отобразит больше 144 символов (если не использовать zmessage, конечно).
    Логично сделать так:
    PHP код:
    new string[MAX_CHATBUBBLE_LENGTH+1];
    new 
    string[MAX_CHATBUBBLE_LENGTH+1]; 
    Цитата Сообщение от 1lyad Посмотреть сообщение
    в данном случае мы используем такое количество ячеек, чтобы всё полностью записалось в BugLog.txt.
    Последний раз редактировалось 1lyad; 16.09.2016 в 10:39.

  13. Пользователь сказал cпасибо:
    DeimoS (16.09.2016)
 

 
Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Ваши права

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