Advertisement
Fro

MultiMessage Example

Fro
Aug 8th, 2011
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 4.21 KB | None | 0 0
  1. // -------------------------------------------------------------------------------------*-
  2.  
  3. stock SendClientMessageBreaks( chars, playerid, color, const message[  ] )
  4. {
  5.     new
  6.         result  [ 145 ], // Максимальная длина сообщения 144
  7.         cc      [ 9 ],
  8.         len     = strlen( message ),
  9.         k       = 0,
  10.         ki      = 0,
  11.         i       = 0,
  12.         li      = 0,
  13.         count   = 0,
  14.         lc      = 0
  15.     ;
  16.  
  17.     // Проверка на минимум chars
  18.     if ( chars < 2 || chars > 120 )
  19.         return 0;
  20.  
  21.     while ( i < len )
  22.     {
  23.         // Проверка на начало нового сообщения
  24.         if (
  25.             k == 0 &&
  26.             i != 0
  27.         )
  28.         {
  29.             // Если это новое сообщение,
  30.             // то добавляем пробел и увеличиваем счетчик
  31.             result[ k++ ] = ' ';
  32.             ++count;
  33.  
  34.             // Если в предыдущем сообщении был цвет
  35.             // и в искомом тексте не начало нового цвета,
  36.             // то добавляем старый цвет
  37.             if (
  38.                 cc[ 0 ] &&
  39.                 !(
  40.                     i + 7 < len &&
  41.                     message[ i ] == '{' &&
  42.                     message[ i + 7 ] == '}'
  43.                 )
  44.             )
  45.             {
  46.                 result[ k++ ] = cc[ 0 ];
  47.                 result[ k++ ] = cc[ 1 ];
  48.                 result[ k++ ] = cc[ 2 ];
  49.                 result[ k++ ] = cc[ 3 ];
  50.                 result[ k++ ] = cc[ 4 ];
  51.                 result[ k++ ] = cc[ 5 ];
  52.                 result[ k++ ] = cc[ 6 ];
  53.                 result[ k++ ] = cc[ 7 ];
  54.             }
  55.         }
  56.  
  57.         // Достигнут лимит букв в сообщении
  58.         if ( k == sizeof( result ) - 1 )
  59.         {
  60.             count = chars;
  61.         }
  62.         else
  63.         {
  64.             result[ k ] = message[ i ];
  65.  
  66.             switch ( result[ k ] )
  67.             {
  68.                 // Если это пробел или табуляция,
  69.                 // ставим индекс на возврат
  70.                 case ' ','\t':
  71.                 {
  72.                     ki = k;
  73.                     li = i;
  74.                 }
  75.                 // Если это новая строка, ставим индекс на возврат
  76.                 // и переходим к выводу сообщения
  77.                 case '\n':
  78.                 {
  79.                     ki = k;
  80.                     li = i;
  81.                     count = chars;
  82.                 }
  83.                 // Если это начало цвета, то записываем цвет
  84.                 case '{':
  85.                 {
  86.                     // Проверка что это действительно цвет
  87.                     if (
  88.                         i + 7 < len &&
  89.                         message[ i + 7 ] == '}'
  90.                     )
  91.                     {
  92.                         // Проверка на лимит букв в сообщении
  93.                         if ( k + 7 >= sizeof( result ) )
  94.                         {
  95.                             count = chars;
  96.                         }
  97.                         else
  98.                         {
  99.                             // Удаляем повторные цвета {FFFFFF}{FF00FF}
  100.                             if ( lc == k - 8 )
  101.                                 k = lc;
  102.  
  103.                             lc              = k;
  104.  
  105.                             cc[ 0 ]         = '{';
  106.                             result[ ++k ]   = message[ ++i ];
  107.                             cc[ 1 ]         = message[ i ];
  108.                             result[ ++k ]   = message[ ++i ];
  109.                             cc[ 2 ]         = message[ i ];
  110.                             result[ ++k ]   = message[ ++i ];
  111.                             cc[ 3 ]         = message[ i ];
  112.                             result[ ++k ]   = message[ ++i ];
  113.                             cc[ 4 ]         = message[ i ];
  114.                             result[ ++k ]   = message[ ++i ];
  115.                             cc[ 5 ]         = message[ i ];
  116.                             result[ ++k ]   = message[ ++i ];
  117.                             cc[ 6 ]         = message[ i ];
  118.                             result[ ++k ]   = message[ ++i ];
  119.                             cc[ 7 ]         = '}';
  120.                             cc[ 8 ]         = '\0';
  121.  
  122.                             continue;
  123.                         }
  124.                     }
  125.                 }
  126.             }
  127.         }
  128.  
  129.         // Вывод сообщения
  130.         if ( count == chars )
  131.         {
  132.             count = 0;
  133.  
  134.             // Если был найден пробел, таб или новая линия,
  135.             // то сдвигаем курсор назад
  136.             if ( ki > 0 )
  137.             {
  138.                 k = ki;
  139.                 i = li + 1;
  140.             }
  141.  
  142.             // Если текст кончается цветом, удаляем его
  143.             if (
  144.                 k >= 8 &&
  145.                 result[ k - 1 ] == '}' &&
  146.                 result[ k - 8 ] == '{'
  147.             )
  148.             {
  149.                 result[ k - 8 ] = '\0';
  150.             }
  151.             else
  152.             {
  153.                 result[ k ] = '\0';
  154.             }
  155.  
  156.             if ( !SendClientMessage( playerid, color, result ) )
  157.                 return 0;
  158.  
  159.             k   = 0;
  160.             ki  = 0;
  161.  
  162.             continue;
  163.         }
  164.  
  165.         ++k;
  166.         ++i;
  167.         ++count;
  168.     }
  169.  
  170.     // Если текст кончается цветом удаляем его
  171.     if (
  172.         k >= 8 &&
  173.         result[ k - 1 ] == '}' &&
  174.         result[ k - 8 ] == '{'
  175.     )
  176.     {
  177.         result[ k - 8 ] = '\0';
  178.     }
  179.     else
  180.     {
  181.         result[ k ] = '\0';
  182.     }
  183.  
  184.     return SendClientMessage( playerid, color, result );
  185. }
  186.  
  187. // -------------------------------------------------------------------------------------*-
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement