Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 38
  1. #1
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±

    zmessage - многострочные сообщения

    Описание

    Небольшая библиотека, которая при превышении лимита символов делит отправляемое сообщение на части так, что оно будет гарантировано отправлено целиком.

    "Под капотом" перехватываются функции SendClientMessage, SendClientMessageToAll, SendPlayerMessageToPlayer и SendPlayerMessageToAll. Передаваемая строка в них делится без использования дорогостоящих (format) или опасных (strins) функций, алгоритм довольно оптимальный, так что нет причин беспокоиться о заметном снижении производительности.

    Использование

    Просто подключите zmessage.inc.

    Функции

    Эта библиотека предоставляет только одну функцию, которая может быть полезной в некоторых случаях. Несколько примеров использования можно найти здесь.

    ZMsg_GetMessages(message[], array[][], const lines = sizeof(array), const line_size = sizeof(array[]))
    • Параметры:
      • message[]: Оригинальное сообщение, которое должно быть разделено.
      • array[][]: Массив, в котором сохраняются разделённые строки.
      • lines: Количество строк, которое может быть сохранено в массив array.
      • line_size: Количество символов, которое может быть сохранено в одну строку массива array.
    • Возвращаемые значения:
      • Количество строк.


    Константы
    Доступно несколько констант, некоторые из них можно переназначить.
    Константа Значение по умолчанию Можно переназначить? Примечание
    ZMSG_MAX_CHAT_LENGTH MAX_CHATBUBBLE_LENGTH да
    ZMSG_MAX_PLAYER_CHAT_LENGTH (MAX_CHATBUBBLE_LENGTH / 2) да
    ZMSG_SEPARATORS_LIST ' ' да Используется в операторе case
    ZMSG_HYPHEN_END " ¬" да
    ZMSG_HYPHEN_START "» " да

    Скриншот


    Скачать

    Последний раз редактировалось ziggi; 23.12.2017 в 19:07.

  2. 9 пользователя(ей) сказали cпасибо:
    BadPawn (10.07.2016) Found (09.07.2016) Geebrox (22.10.2017) kushichka (09.07.2016) Nexius_Tailer (09.07.2016) Nurick (09.07.2016) Osetin (09.07.2016) Outsider (04.10.2017) Sp1ke (09.07.2016)
  3. #2
    Аватар для kushichka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.04.2014
    Сообщений
    75
    Репутация:
    6 ±
    Чем функция strins опасна?

  4. Пользователь сказал cпасибо:
    BadPawn (09.07.2016)
  5. #3
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Переполнение массива.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от kushichka Посмотреть сообщение
    Чем функция strins опасна?
    Тем, что никак не использует параметр maxlength и может записать символы за пределы массива, если строка слишком длинная.
    Пример можно посмотреть здесь: https://github.com/compuphase/pawn/issues/15
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #5
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    Чем можно заменить strins, если это не format?

    Можно к примеру, использовать в строке 2 strcat, но не будет ли это проблемно?...:

    PHP код:
    static str[49 MAX_PLAYER_NAME] = "SELECT * FROM `players` WHERE `player_name` = '";
    strcat(strPlayerName(playerid), MAX_PLAYER_NAME);
    strcat(str"'"1); 
    Последний раз редактировалось BadPawn; 09.07.2016 в 13:40.

  8. #6
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    Чем можно заменить strins, если это не format?

    Можно к примеру, использовать в строке 2 strcat, но не будет ли это проблемно?...:

    PHP код:
    static str[49 MAX_PLAYER_NAME] = "SELECT * FROM `players` WHERE `player_name` = '";
    strcat(strPlayerName(playerid), MAX_PLAYER_NAME);
    strcat(str"'"1); 
    Можно исправить strins, в fixes.inc это реализовано так:
    PHP код:
    /*
     * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
     *
     * FIXES:
     *     strins
     */

    #if defined _ALS_strins
        #error _ALS_strins defined
    #endif
    native BAD_strins(string[], const substr[], posmaxlength sizeof string) = strins;

    #if FIX_strins
        
    stock FIXES_strins(string[], const substr[], posmaxlength sizeof string)
        {
            if (
    string[0] > 255)
            {
                new
                    
    strlength strlen(string),
                    
    sublength strlen(substr),
                    
    m4 maxlength 4;
                
    // Packed - format doesn't like these strings.
                
    if (strlength sublength >= m4)
                {
                    if (
    pos sublength >= m4)
                    {
                        return
                            
    string{pos} = '\0',
                            
    // Hopefully this doesn't ignore maxlength and does packed.
                            
    strcat(stringsubstrmaxlength);
                    }
                    else
                    {
                        
    // pos + sublength is less than maxlength, so this sum MUST
                        // be positive and gte than "pos", so there's no need for
                        // additional checks.
                        
    string{maxlength sublength 1} = '\0';
                    }
                }
                return 
    strins(stringsubstrposmaxlength);
            }
            else if (
    substr[0] > 255)
            {
                new
                    
    strlength strlen(string),
                    
    sublength strlen(substr);
                
    // Packed - format doesn't like these strings.
                
    if (strlength sublength >= maxlength)
                {
                    if (
    pos sublength >= maxlength)
                    {
                        return
                            
    string[pos] = '\0',
                            
    // Hopefully this doesn't ignore maxlength and does packed.
                            
    strcat(stringsubstrmaxlength);
                    }
                    else
                    {
                        
    // pos + sublength is less than maxlength, so this sum MUST
                        // be positive and gte than "pos", so there's no need for
                        // additional checks.
                        
    string[maxlength sublength 1] = '\0';
                    }
                }
                return 
    strins(stringsubstrposmaxlength);
            }
            else
            {
                return 
    format(stringmaxlength"%.*s%s%s"posstringsubstrstring[pos]);
            }
        }

        
    #define _ALS_strins
        #define strins FIXES_strins
    #endif 
    Если ты не используешь запакованные строки, то можно использовать эту функцию:
    PHP код:
    stock _strins(string[], const substr[], posmaxlength sizeof string)
    {
        return 
    format(stringmaxlength"%.*s%s%s"posstringsubstrstring[pos]);

    Последний раз редактировалось ziggi; 09.07.2016 в 14:03.

  9. Пользователь сказал cпасибо:
    BadPawn (09.07.2016)
  10. #7
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    На счет запакованных строк. Если запаковать строку в SendClientMessage(), сообщение отправлено не будет.

    PHP код:
    SendClientMessage(playerid, -1,
        !
    "Допустим, тут у нас такой вот текст на сколько-то там строк, \
        да еще пасмурно что-то за окном, хотя середина лета!! \
        Хотите шутеечку? Колобок повесился))))0)00 \
        Смешно? Я знал! Орити в галосену000))0 \
        Лел."
    ); 

  11. #8
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Anton Styazhkin Посмотреть сообщение
    На счет запакованных строк. Если запаковать строку в SendClientMessage(), сообщение отправлено не будет.

    PHP код:
    SendClientMessage(playerid, -1,
        !
    "Допустим, тут у нас такой вот текст на сколько-то там строк, \
        да еще пасмурно что-то за окном, хотя середина лета!! \
        Хотите шутеечку? Колобок повесился))))0)00 \
        Смешно? Я знал! Орити в галосену000))0 \
        Лел."
    ); 
    Не учёл, поправлю.

    UPD: Обновлено. Добавлена поддержка запакованных строк.
    Последний раз редактировалось ziggi; 09.07.2016 в 14:43.

  12. #9
    Аватар для kushichka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.04.2014
    Сообщений
    75
    Репутация:
    6 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Тем, что никак не использует параметр maxlength и может записать символы за пределы массива, если строка слишком длинная.
    Пример можно посмотреть здесь: https://github.com/compuphase/pawn/issues/15
    Вики говорит что такой параметр существует, как он может не работать?
      Открыть/закрыть

  13. #10
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от kushichka Посмотреть сообщение
    Вики говорит что такой параметр существует, как он может не работать?
      Открыть/закрыть
    Это одна из многочисленных ошибок Pawn.

 

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

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

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

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

Ваши права

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