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

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

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

PHP код:
stock SendInfoAllMessage(const text[])
{
    static 
string[1024], chatacc;
    for(new 
i = 0; i < MAX_LINES_CHAT; i++) // Пробегаемся во всем строчкам чата.
    
{
        if (!
InfoChatLine[i][0]) // Проверяем хотя бы одну пустую строку.
        
{
            
strmid(InfoChatLine[i], text, 0, MAX_STRING); // Записываем сообщение в пустую строку.
            
chatacc = true; // Даем понять, что свободные строчки есть и сообщение записано.
            
break; // Прекращаем цикл
        
}
        else 
chatacc = false; // Если цикл закончился и нет пустых строк, сообщаем от этом.
    
}
    if (!
chatacc) // Если все строки заполнены
    
{
        for(new 
i = 0; i < MAX_LINES_CHAT; i++) // Пробегаемся по всем строчкам
        
{
            if (
i < 13)
            {
                
strmid(InfoChatLine[i], InfoChatLine[i+1], 0, MAX_STRING); // Поднимаем чат вверх на одну строчку, отчищая место первой строкой под новую.
            
}
            else 
strmid(InfoChatLine[13], text, 0, MAX_STRING); // Записываем новое сообщение в последнею строку.
        
}
    }
    
    
format(string, sizeof(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 
i = 0; i < MAX_LINES_CHAT; i++) // Пробегаемся во всем строчкам чата.
    
{
        if (!
InfoChatLine[i][0]) // Проверяем хотя бы одну пустую строку.
        
{
            
strmid(InfoChatLine[i], text, 0, MAX_STRING); // Записываем сообщение в пустую строку.
            
chatacc = true; // Даем понять, что свободные строчки есть и сообщение записано.
            
break; // Прекращаем цикл
        
}
        else 
chatacc = false; // Если цикл закончился и нет пустых строк, сообщаем от этом.
    
}
    if (!
chatacc) // Если все строки заполнены
    
{
        for(new 
i = 0; i < MAX_LINES_CHAT; i++) // Пробегаемся по всем строчкам
        
{
            if (
i < 13)
            {
                
strmid(InfoChatLine[i], InfoChatLine[i+1], 0, MAX_STRING); // Поднимаем чат вверх на одну строчку, отчищая место первой строкой под новую.
            
}
            else 
strmid(InfoChatLine[13], text, 0, MAX_STRING); // Записываем новое сообщение в последнею строку.
        
}
    }
    
    
format(string, sizeof(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;--i) TextDrawShowForPlayer(playerid,ChatText[i]);
    return 
true;
}
stock HideChatForPlayer(playerid)
{
    if(
ChatText[0] == Text:0xFFFF) return false;
    for(new 
i=MAX_LINE_CHAT-1;i!=-1;--i) TextDrawHideForPlayer(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;
    
TXD: TX--, 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_CHAT, Float:RS = 295.000000;
    
TXD: TX--, RS -= 9.000000, ChatStr[TX][0] = EOS;
    
ChatText[TX] = TextDrawCreate(24.000000, RS, "_");
    
TextDrawLetterSize(ChatText[TX], 0.220000, 1.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_CHAT, text);
    if(++
ChatTD == MAX_LINE_CHAT) ChatTD = 0;
    for(new 
i, x = ChatTD; i != MAX_LINE_CHAT; i++)
    {
        if(
x == MAX_LINE_CHAT) x = 0;
        
TextDrawSetString(ChatText[i], ChatStr[x++]);
    }
    return 
true;
} 
Если нужна версия для каждого игрока, могу поделиться.
Либо отредактируйте сами.
Reply
#5

Вот, это будет гораздо быстрее (не используется формат, строки не копируются при каждом вызове):
PHP код:
stock SendInfoAllMessage(const text[])
{
    static 
idx;
    
strmid(InfoChatLine[idx], text, 0, MAX_STRING);
    if (
idx < MAX_LINES_CHAT - 1) {
        
idx++;
    } else {
        
idx = 0;
    }
    new 
string[MAX_STRING * MAX_LINES_CHAT];
    for (new 
i = idx; i < MAX_LINES_CHAT; i++) {
        
strcat(string, InfoChatLine[i], sizeof(string));
        
strcat(string, "~n~", sizeof(string));
    }
    for (new 
i = 0; i < idx; i++) {
        
strcat(string, InfoChatLine[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)