Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: /bug и /sug

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

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    ♔Osetia, Vladikavkaz♔
    Сообщений
    3,432
    Репутация:
    1093 ±

    /bug и /sug

    1. #define BUG_REPORT_FILE_NAME "BugLog.txt"
    2. #define SUGGESTION_FILE_NAME "SugLog.txt"
    3. #define BUG_REPORT_COOLDOWN_TIME 60
    4.  
    5. bool:CheckBugReportCooldown(playerid)
    6. {
    7. static bug_report_tick[MAX_PLAYERS];
    8. new current_tick = tickcount();
    9. static const cooldown_message[] =
    10. !"Отчитываться о багах и писать предложения можно раз в "\
    11. #BUG_REPORT_COOLDOWN_TIME" секунд.";
    12. if (current_tick < bug_report_tick[playerid] + BUG_REPORT_COOLDOWN_TIME * 1000)
    13. return bool:SendClientMessage(playerid, -1, cooldown_message);
    14. bug_report_tick[playerid] = current_tick;
    15. return false;
    16. }
    17.  
    18. CMD:bug(playerid, params[])
    19. {
    20. if (CheckBugReportCooldown(playerid))
    21. return 1;
    22. if (sscanf(params, "s[129]", params))
    23. return SendClientMessage(playerid, -1, !"Использование: /bug [описание бага]");
    24. static const bug_str[] = " сообщил о баге: ";
    25. new string[sizeof(bug_str)+MAX_PLAYER_NAME+128];
    26. GetPlayerName(playerid, string, sizeof(string));
    27. strcat(string, bug_str), strcat(string, params);
    28. new File:f = fopen(!BUG_REPORT_FILE_NAME, io_append);
    29. if (f == File:0)
    30. return SendClientMessage(playerid, -1,
    31. !"Ошибка: Не удалось открыть файл \"" BUG_REPORT_FILE_NAME "\" !");
    32. for (new i = -1; string[++i] != '\0';)
    33. fputchar(f, string[i], false);
    34. fputchar(f, '\n', false);
    35. fclose(f);
    36. SendClientMessage(playerid, -1, !"Вы успешно сообщили о баге. Спасибо!");
    37. string[0] = ' ', string[1] = '\0', strcat(string, params);
    38. return SendClientMessage(playerid, -1, string);
    39. }
    40.  
    41. CMD:sug(playerid, params[])
    42. {
    43. if (CheckBugReportCooldown(playerid))
    44. return 1;
    45. if (sscanf(params, "s[129]", params))
    46. return SendClientMessage(playerid, -1, !"Использование: /sug [предложение по улучшению]");
    47. static const sug_str[] = " предложил: ";
    48. new string[sizeof(sug_str)+MAX_PLAYER_NAME+128];
    49. GetPlayerName(playerid, string, sizeof(string));
    50. strcat(string, sug_str), strcat(string, params);
    51. new File:f = fopen(!SUGGESTION_FILE_NAME, io_append);
    52. if (f == File:0)
    53. return SendClientMessage(playerid, -1,
    54. !"Ошибка: Не удалось открыть файл \"" SUGGESTION_FILE_NAME "\" !");
    55. for (new i = -1; string[++i] != '\0';)
    56. fputchar(f, string[i], false);
    57. fputchar(f, '\n', false);
    58. fclose(f);
    59. SendClientMessage(playerid, -1, !"Вы успешно написали предложение по улучшению. Спасибо!");
    60. string[0] = ' ', string[1] = '\0', strcat(string, params);
    61. return SendClientMessage(playerid, -1, string);
    62. }


    Например, игрок пишет: /bug замечен баг на работе грузчика. А команда /sug для предложения по улучшению сервера.
    Последний раз редактировалось Daniel_Cortez; 24.07.2018 в 13:26. Причина: upd(2)

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

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

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

  4. #3
    Аватар для L0ndl3m
    Пользователь

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

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

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


    UPD: Переписал обе команды. Исправил баг с потерей вводимых данных.
    Первый пост обновлён.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. 3 пользователя(ей) сказали cпасибо:
    $continue$ (24.05.2015) L0ndl3m (02.01.2014) Salvacore (02.01.2014)
  7. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Ещё раз переписал команды. Устранил уязвимость, с помощью которой можно было флудом команд остановить работу сервера из-за операций с файлами.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  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
    "Это не хак, это фича"

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

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

  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
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от 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]; 
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 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 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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