FormatEx

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Вообщем решил использовать FormatEx (т.к он быстрее со слов R1KO), вместо Format, но я заметил что оно дублирует сообщение, когда что-то пишешь в чате. (Хочу переписать country tag)
С енглишом у меня туго, по этому я ни чего, не понял что написано в API SM, даже гугл-транслейт не помог.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
использовать FormatEx (т.к он быстрее со слов R1KO), вместо Format
Format позволяет копировать строку "из себя в себя же", т.е.:
C-подобный:
Format(sBuffer, sizeof(sBuffer), "%s %N", sBuffer, client);
Во всех остальных случаях используется FormatEx:
C-подобный:
FormatEx(sBuffer, sizeof(sBuffer), "%s %N", other_sBuffer, client);
Разницы, как таковой, больше нет.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON
Мне бы ответ, почему он дублирует сообщение? (FormatEx)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ни чего не понял
C-подобный:
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(client, other_sBuffer, sizeof(other_sBuffer));
    FormatEx(sBuffer, sizeof(sBuffer), "%s %N", other_sBuffer, client);
    PrintToChat(client, sBuffer);
}
По сути, здесь вообще Format/FormatEx и не нужен, т.к. PrintToChat мог сделать всё сам, но в качестве минимального рабочего примера сгодится.
почему он дублирует сообщение? (FormatEx)
Потому что твой косяк. Давай код.
Если стоит аналогичный плагин, то дублировать всё равно будет.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
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

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, да не уследил, я пока код не чекал на ошибки, но спасибо что нашел.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
пока код не чекал на ошибки
Кстати, пока совсем не уснул: в Format или FormatEx, если брать "сам по себе", не может быть символа перевода %t, всегда только %T! Оффтоп Не забудь ещё индекс клиента везде добавить. Оффтоп
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, Решил попробовать. Учту. Вроде везде индекс клиента, разве нет?
Поставил я везде в FormatEx - %T, так теперь чат не работает. (Убираю и ствлю %t).
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
так теперь чат не работает
Не забудь ещё индекс клиента везде добавить.
Вся твоя задача ближе к такому варианту:
PHP:
public Action ChatSay(int client, const char[] command, int 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(text, sizeof(text));
            StripQuotes(text);
            TrimString(text);
          
            if (strcmp(text, " ") == 0 || strcmp(text, "") == 0 || strlen(text) == 0)
            {
                return Plugin_Handled;
            }
          
            if (StrContains(text, "@") == 0 || StrContains(text, "/") == 0)
            {
                return Plugin_Continue;
            }

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

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

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, да это я уже понял, просто не умею я пока писать в одну строку (не пытался).
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #14
Кстати, пока совсем не уснул: в Format или FormatEx не может быть символа перевода %t, всегда только %T! Оффтоп Не забудь ещё индекс клиента везде добавить. Оффтоп

Можно, только перед ним должен быть SetGlobalTransTarget

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #16
@AlmazON, так %T и делает SetGlobalTransTarget перед форматированием. посмотри исходный код
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
%T и делает SetGlobalTransTarget перед форматированием
Тем более! Смысл стремится к нулю, если только по какой-то причине мы уже не сделали SetGlobalTransTarget. Зачем писать его ещё раз, когда он уже есть у функции? Кода больше получается, что само по себе хуже. Оффтоп
 
Сверху Снизу