FormatEx

Тема в разделе "Программирование / Скриптинг", создана пользователем Hejter, 19 май 2016.

  1. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Вообщем решил использовать FormatEx (т.к он быстрее со слов R1KO), вместо Format, но я заметил что оно дублирует сообщение, когда что-то пишешь в чате. (Хочу переписать country tag)
    С енглишом у меня туго, по этому я ни чего, не понял что написано в API SM, даже гугл-транслейт не помог.
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Format позволяет копировать строку "из себя в себя же", т.е.:
    Код:
    Format(sBuffer, sizeof(sBuffer), "%s %N", sBuffer, client);
    Во всех остальных случаях используется FormatEx:
    Код:
    FormatEx(sBuffer, sizeof(sBuffer), "%s %N", other_sBuffer, client);
    Разницы, как таковой, больше нет.
     
  3. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @AlmazON
    Мне бы ответ, почему он дублирует сообщение? (FormatEx)
     
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Код:
    public OnClientPostAdminCheck(client)
    {
        decl String:sBuffer[50];
        GetClientIP(client, sBuffer, sizeof(sBuffer));
        Format(sBuffer, sizeof(sBuffer), "%s %N", sBuffer, client);
        PrintToChat(client, sBuffer);
    }
    PHP:
    public OnClientPostAdminCheck(client)
    {
        
    decl String:sBuffer[50], String:other_sBuffer[16];
        
    GetClientIP(clientother_sBuffersizeof(other_sBuffer));
        
    FormatEx(sBuffersizeof(sBuffer), "%s %N"other_sBufferclient);
        
    PrintToChat(clientsBuffer);
    }
    По сути, здесь вообще Format/FormatEx и не нужен, т.к. PrintToChat мог сделать всё сам, но в качестве минимального рабочего примера сгодится.
    Потому что твой косяк. Давай код.
    Если стоит аналогичный плагин, то дублировать всё равно будет.
     
  5. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    97 строка:
    Format(text, sizeof(text), "%t", "SPECTATOR_SAY_TEAM", tag, client, text);
    Незаменима на FormatEx, пока text (следи за выделением) находится "позади" %t. Как только с этим что-то сделаешь - сразу допустимо менять на FormatEx.
    169 строка:
    FormatEx(info, sizeof(info), "%t", "CLAN_TAG", tag);
    Не имеет позади себя то же, что и впереди (text) и потому правильно записана, как FormatEx.
     
    Hejter нравится это.
  7. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Сразу ошибка в 120 строке:
    Format(text, sizeof(text), "%t", "%t", "DEAD_TEAM_CT", tag, client, text);
    Повторяется символ перевода.
     
    Hejter нравится это.
  9. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @AlmazON, да не уследил, я пока код не чекал на ошибки, но спасибо что нашел.
     
  10. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Кстати, пока совсем не уснул: в Format или FormatEx, если брать "сам по себе", не может быть символа перевода %t, всегда только %T! Оффтоп Не забудь ещё индекс клиента везде добавить. Оффтоп
     
    Последнее редактирование: 19 май 2016
  11. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @AlmazON, Решил попробовать. Учту. Вроде везде индекс клиента, разве нет?
    Поставил я везде в FormatEx - %T, так теперь чат не работает. (Убираю и ствлю %t).
     
    Последнее редактирование: 19 май 2016
  12. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Вся твоя задача ближе к такому варианту:
    PHP:
    public Action ChatSay(int client, const char[] commandint args)
    {
        if(
    GetConVarInt(g_hChatTag))
        {
            if (
    IsValidClient(client))
            {
                
    /* Flood Protection */
                
    if ((GetEngineTime()-g_fLastChatMsg[client]) < 0.75)
                {
                    return 
    Plugin_Handled;
                }
                
    g_fLastChatMsg[client] = GetEngineTime();

                if (
    BaseComm_IsClientGagged(client))
                {
                    
    PrintToChat(client"%t""MUTE");
                    return 
    Plugin_Handled;
                }
              
                
    char text[192];

                
    GetCmdArgString(textsizeof(text));
                
    StripQuotes(text);
                
    TrimString(text);
              
                if (
    strcmp(text" ") == || strcmp(text"") == || strlen(text) == 0)
                {
                    return 
    Plugin_Handled;
                }
              
                if (
    StrContains(text"@") == || StrContains(text"/") == 0)
                {
                    return 
    Plugin_Continue;
                }

                
    int team GetClientTeam(client);
                
    int alive IsPlayerAlive(client);
                
    char ip[16], tag[3];
              
                
    GetClientIP(clientipsizeof(ip));
                if (!
    GeoipCode2(iptag))
                {
                    
    tag "??";
                }

                if (
    strcmp(command"say") == 0)
                {
                    
    CPrintToChatAllEx(client"%t"team "SPECTATOR_SAY_TEAM":alive "ALIVE_CHAT":"DEAD"tagclienttext);
                    return 
    Plugin_Handled;
                }
              
                else if(
    strcmp(command"say_team") == 0)
                {
                    
    char buffer[256];
                    switch(
    team)
                    {
                        case 
    2:FormatEx(buffersizeof(buffer), "%T"alive "TEAM_T":"DEAD_TEAM_T"clienttagclienttext);
                        case 
    3:FormatEx(buffersizeof(buffer), "%T"alive "TEAM_CT":"DEAD_TEAM_CT"clienttagclienttext);
                        default:
    FormatEx(buffersizeof(buffer),"%T""SPECTATOR_SAY"clienttagclienttext);
                    }
                  
                    for (
    int x 1<= MaxClientsx++)
                    {
                        if (
    IsClientInGame(x) && GetClientTeam(x) == team)
                        {
                            
    CPrintToChatEx(xxbuffer);
                        }
                    }
                    return 
    Plugin_Handled;
                }
            }
        }
        return 
    Plugin_Continue;
    }
    Сам дооптимизируешь, я более-менее расставил и показал, как там применять FormatEx.
     
  13. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @AlmazON, да это я уже понял, просто не умею я пока писать в одну строку (не пытался).
     
  14. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.977
    Можно, только перед ним должен быть SetGlobalTransTarget

    Кстати, если кто не в курсе то в перевод можно вставлять еще перевод
     
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Оффтоп Если брать функцию саму по себе - нельзя. Вернее, можно, но получится "что-нибудь".
     
  16. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.977
    @AlmazON, так %T и делает SetGlobalTransTarget перед форматированием. посмотри исходный код
     
  17. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Тем более! Смысл стремится к нулю, если только по какой-то причине мы уже не сделали SetGlobalTransTarget. Зачем писать его ещё раз, когда он уже есть у функции? Кода больше получается, что само по себе хуже. Оффтоп