Дополнительный чат
#1

Вообщем я тру кодер решил набыдлокодить второстепенный чат на своем сервере.
Планирую отправлять в него сообщения о логине и выходе игроков и килл чат.
Оцените на сколько этот код прочный и удобный для машины.

Может кто то знает или может предложить на много проще реализацию.

PHP код:
stock SendInfoAllMessage(const text[])
{
    static 
string[1024], chatacc;
    for(new 
0MAX_LINES_CHATi++) // Пробегаемся во всем строчкам чата.
    
{
        if (!
InfoChatLine[i][0]) // Проверяем хотя бы одну пустую строку.
        
{
            
strmid(InfoChatLine[i], text0MAX_STRING); // Записываем сообщение в пустую строку.
            
chatacc true// Даем понять, что свободные строчки есть и сообщение записано.
            
break; // Прекращаем цикл
        
}
        else 
chatacc false// Если цикл закончился и нет пустых строк, сообщаем от этом.
    
}
    if (!
chatacc// Если все строки заполнены
    
{
        for(new 
0MAX_LINES_CHATi++) // Пробегаемся по всем строчкам
        
{
            if (
13)
            {
                
strmid(InfoChatLine[i], InfoChatLine[i+1], 0MAX_STRING); // Поднимаем чат вверх на одну строчку, отчищая место первой строкой под новую.
            
}
            else 
strmid(InfoChatLine[13], text0MAX_STRING); // Записываем новое сообщение в последнею строку.
        
}
    }
    
    
format(stringsizeof(string), "%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s"InfoChatLine[0], InfoChatLine[1], InfoChatLine[2], InfoChatLine[3], InfoChatLine[4], InfoChatLine[5], InfoChatLine[6], InfoChatLine[7], InfoChatLine[8], InfoChatLine[9], InfoChatLine[10], InfoChatLine[11], InfoChatLine[12], InfoChatLine[13]); // Тут понятно все, форматируем все строки чата.
    
TextDrawSetString(ServerTextDraws[5], string); // Обновляем чат.
    
return true;

Reply
#2

Первый раз пробегаться по строкам не нужно. Можно сразу со смещением делать. 13 строку записывать после цикла - избавишься от лишнего if
Reply
#3

Quote:
Originally Posted by nonamepawn
Посмотреть сообщение
Вообщем я тру кодер решил набыдлокодить второстепенный чат на своем сервере.
Планирую отправлять в него сообщения о логине и выходе игроков и килл чат.
Оцените на сколько этот код прочный и удобный для машины.

Может кто то знает или может предложить на много проще реализацию.

PHP код:
stock SendInfoAllMessage(const text[])
{
    static 
string[1024], chatacc;
    for(new 
0MAX_LINES_CHATi++) // Пробегаемся во всем строчкам чата.
    
{
        if (!
InfoChatLine[i][0]) // Проверяем хотя бы одну пустую строку.
        
{
            
strmid(InfoChatLine[i], text0MAX_STRING); // Записываем сообщение в пустую строку.
            
chatacc true// Даем понять, что свободные строчки есть и сообщение записано.
            
break; // Прекращаем цикл
        
}
        else 
chatacc false// Если цикл закончился и нет пустых строк, сообщаем от этом.
    
}
    if (!
chatacc// Если все строки заполнены
    
{
        for(new 
0MAX_LINES_CHATi++) // Пробегаемся по всем строчкам
        
{
            if (
13)
            {
                
strmid(InfoChatLine[i], InfoChatLine[i+1], 0MAX_STRING); // Поднимаем чат вверх на одну строчку, отчищая место первой строкой под новую.
            
}
            else 
strmid(InfoChatLine[13], text0MAX_STRING); // Записываем новое сообщение в последнею строку.
        
}
    }
    
    
format(stringsizeof(string), "%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s~n~%s"InfoChatLine[0], InfoChatLine[1], InfoChatLine[2], InfoChatLine[3], InfoChatLine[4], InfoChatLine[5], InfoChatLine[6], InfoChatLine[7], InfoChatLine[8], InfoChatLine[9], InfoChatLine[10], InfoChatLine[11], InfoChatLine[12], InfoChatLine[13]); // Тут понятно все, форматируем все строки чата.
    
TextDrawSetString(ServerTextDraws[5], string); // Обновляем чат.
    
return true;

Чтобы избавится от копирования при добавления новой строки, глянь этот пост.
http://forum.sa-mp.com/showpost.php?...3&postcount=11
Reply
#4

"Смещает" строки, но форматирует 1 раз!
PHP код:
#define MAX_LEN_CHAT 70
#define MAX_LINE_CHAT 10
new ChatStr[MAX_LINE_CHAT][MAX_LEN_CHAT];
new 
Text:ChatText[MAX_LINE_CHAT];
new 
ChatTD;
stock ShowChatForPlayer(playerid)
{
    if(
ChatText[0] == Text:0xFFFF) return false;
    for(new 
i=MAX_LINE_CHAT-1;i!=-1;--iTextDrawShowForPlayer(playerid,ChatText[i]);
    return 
true;
}
stock HideChatForPlayer(playerid)
{
    if(
ChatText[0] == Text:0xFFFF) return false;
    for(new 
i=MAX_LINE_CHAT-1;i!=-1;--iTextDrawHideForPlayer(playerid,ChatText[i]);
    return 
true;
}
stock ClearChat()
{
    if(
ChatText[0] == Text:0xFFFF) return false;
    for(new 
i=MAX_LINE_CHAT-1;i!=-1;--i)
    {
        
TextDrawSetString(ChatText[i], "_");
        
ChatStr[i][0] = EOS;
    }
    return 
true;
}
stock DeleteChat()
{
    if(
ChatText[0] == Text:0xFFFF) return false;
    new 
TX MAX_LINE_CHAT;
    
TXDTX--, ChatStr[TX][0] = EOS;
    
TextDrawHideForAll(ChatText[TX]);
    
TextDrawDestroy(ChatText[TX]);
    
ChatText[TX] = Text:0xFFFF;
    if(
TX) goto TXD; return true;
}
stock CreateChat()
{
    new 
TX MAX_LINE_CHATFloat:RS 295.000000;
    
TXDTX--, RS -= 9.000000ChatStr[TX][0] = EOS;
    
ChatText[TX] = TextDrawCreate(24.000000RS"_");
    
TextDrawLetterSize(ChatText[TX], 0.2200001.00000);
    
TextDrawBackgroundColor(ChatText[TX], 16843048);
    
TextDrawColor(ChatText[TX], 0xff5151BB);
    
TextDrawAlignment(ChatText[TX], 0);
    
TextDrawFont(ChatText[TX], 1);
    
TextDrawSetShadow(ChatText[TX], 0);
    
TextDrawSetOutline(ChatText[TX], 1);
    
TextDrawSetProportional(ChatText[TX], 1);
    if(
TX) goto TXD; return true;
}
stock AddTextChat(const text[])
{
    
format(ChatStr[ChatTD], MAX_LEN_CHATtext);
    if(++
ChatTD == MAX_LINE_CHATChatTD 0;
    for(new 
iChatTD!= MAX_LINE_CHATi++)
    {
        if(
== MAX_LINE_CHAT0;
        
TextDrawSetString(ChatText[i], ChatStr[x++]);
    }
    return 
true;

Если нужна версия для каждого игрока, могу поделиться.
Либо отредактируйте сами.
Reply
#5

Вот, это будет гораздо быстрее (не используется формат, строки не копируются при каждом вызове):
PHP код:
stock SendInfoAllMessage(const text[])
{
    static 
idx;
    
strmid(InfoChatLine[idx], text0MAX_STRING);
    if (
idx MAX_LINES_CHAT 1) {
        
idx++;
    } else {
        
idx 0;
    }
    new 
string[MAX_STRING MAX_LINES_CHAT];
    for (new 
idxMAX_LINES_CHATi++) {
        
strcat(stringInfoChatLine[i], sizeof(string));
        
strcat(string"~n~"sizeof(string));
    }
    for (new 
0idxi++) {
        
strcat(stringInfoChatLine[i], sizeof(string));
        
strcat(string"~n~"sizeof(string));
    }
    
TextDrawSetString(ServerTextDraws[5], string);

Reply
#6

Если текст покрасить "~r~", то длина текста может быть только 256 символов.
Reply
#7

В wiki информация о функции, создающей текстдрав, говорит о длине в 800 символов, но я не уверен, т.к. в лимитах 1024. А про 256 - это если после 255 символа использовать цвет, то будет крэш.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)