Цветной PrintToChat, как?

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

  1. MrBoogidy

    MrBoogidy

    Сообщения:
    23
    Симпатии:
    2
    Всем привет.
    Хочу на сервере организовать автоматическое приветствие при коннекте игрока от его имени. Не получается правдоподобно "подделать" сообщение. Не могу раскрасить ник игрока цветом его команды (\x03), как это было бы, если бы игрок писал в чат сам от своего имени.

    Юзаю Simple Chat Processor (Redux) - AlliedModders

    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <scp>

    #define PLUGIN_NAME "SayHello"
    #define PLUGIN_AUTHOR "AUTHOR"
    #define PLUGIN_VERSION "0.0.0"

    char gPhrases[][] = {
        
    "Привет!",
        
    "Привет всем!",
        
    "Здарова, парни!",
        
    "q all",
        
    "Hello everybody",
        
    "Парни, привет!",
        
    "Здрасте всем",
        
    "КуКу, ребят"
    };

    public 
    Plugin:myinfo =
    {
        
    name PLUGIN_NAMEauthor PLUGIN_AUTHORdescription "auto say hello to all"version PLUGIN_VERSION,
        
    url "http://url.ru"
    }
    public 
    void OnClientPostAdminCheck(int client)
    {
        
    CreateTimer(5.0SayHelloclient);
    }

    public 
    Action SayHello(Handle timerany client)
    {
        
    char name[128];
        
    int RandomPhrase GetRandomInt(1sizeof(gPhrases));
        if(
    IsClientConnected(client)) Format(namesizeof(name), "\x03%N "client);
       
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && client != i)
            {
                
    PrintToChat(i"%s: %s"namegPhrases[RandomPhrase 1]);
            }
        }
    }
    Есть ли способ используя SCP при помощи PrintToChat делать цветные сообщения? Или может быть какой-то другой способ? Спасибо.
     
  2. pracc

    pracc

    Сообщения:
    479
    Симпатии:
    128
    FakeClientCommand(i, "say %s", gPhrases[RandomPhrase - 1]); и не изобретаешь из мухи слона.
     
  3. MrBoogidy

    MrBoogidy

    Сообщения:
    23
    Симпатии:
    2
    Спасибо, но тогда сам игрок, от имени которого будет отсылаться сообщение, увидет его. Смысл в том, что бы именно он приветствия и не видел.
     
  4. san911

    san911 Вообще короче нечего

    Сообщения:
    177
    Симпатии:
    37
    Код:
    PrintToChat(i, "%s%s: %s", GetClientTeam(client) < 2 ? "Цвет СПЕКОВ":GetClientTeam(client) == 2 ? "Цвет Т":"Цвет СТ", name, gPhrases[RandomPhrase - 1]);
    Для того чтобы выводить сообщения через SCP нужно подключить его include и использовать
    Код:
    Action:OnChatMessage(&author, Handle:recipients, String:name[], String:message[])
     
    Последнее редактирование: 12 сен 2016
    MrBoogidy нравится это.
  5. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    PHP:
    #pragma semicolon 1
    #include <sourcemod>

    #pragma newdecls required

    #define TIME_HELLO_MIN    5.0
    #define TIME_HELLO_MAX    15.0

    #define PLUGIN_NAME "Say Hello"
    #define PLUGIN_AUTHOR "AlmazON"
    #define PLUGIN_VERSION "0.1.0"

    static const char gPhrases[][] = {
        
    "Привет",
        
    "Привет всем",
        
    "Здарова, парни",
        
    "q all",
        
    "Hello everybody",
        
    "Hi",
        
    "Парни, привет",
        
    "Здрасте всем",
        
    "КуКу, ребят"
    };
    static const 
    char gPunctuationCharacter[][] = {
        
    "",
        
    "!",
        
    ".",
        
    "!!"
    };

    Handle g_hTimerMessage[MAXPLAYERS 1];

    public 
    Plugin myinfo =
    {
        
    name PLUGIN_NAMEauthor PLUGIN_AUTHORdescription "Auto say hello to all"version PLUGIN_VERSION,
        
    url "http://hlmod.ru"
    }
    public 
    void OnClientPostAdminCheck(int client)
    {
        
    g_hTimerMessage[client] = CreateTimer(GetRandomFloat(TIME_HELLO_MINTIME_HELLO_MAX), SayHelloclient);
    }
    public 
    void OnClientDisconnect_Post(int client)
    {
        
    delete g_hTimerMessage[client];
    }

    public 
    Action SayHello(Handle timerany client)
    {
        
    g_hTimerMessage[client] = null;
        
    int[] clients = new int[MaxClients 1];
        
    int total;
        for (
    int i 1<= MaxClients; ++i)
        {
            if (
    IsClientInGame(i) && client != i)
            {
                
    clients[total++] = i;
            }
        }
        if (
    total)
        {
            
    Handle message StartMessage("SayText2"clientstotal);
            if (
    message)
            {
                
    BfWriteByte(messageclient);
                
    BfWriteByte(messagetrue);
                
    char print[192];
                
    FormatEx(print, sizeof(print), "\x01%s\x03%N\x01 :  %s%s"GetClientTeam(client) < "*НАБЛЮДАТЕЛЬ* ":IsPlayerAlive(client) ? "":"*УБИТ* ",
                
    clientgPhrases[GetRandomInt(0sizeof(gPhrases)-1)], gPunctuationCharacter[GetRandomInt(0sizeof(gPunctuationCharacter)-1)]);
                
    BfWriteString(message, print);
                
    EndMessage();
            }
        }
        return 
    Plugin_Stop;
    }
    TIME_HELLO_MIN - минимальное время для отправки всем (кроме заходящего) фальшивого сообщения приветствия;
    TIME_HELLO_MAX - максимальное.
    gPhrases - фразы самих приветствий (добавлять в кавычках через запятую) без конечного символа;
    gPunctuationCharacter - выбираемая имитация пунктуации Оффтоп .
    Добавил "Спектатор" и "Мертв".
     
    Последнее редактирование: 12 сен 2016
  6. san911

    san911 Вообще короче нечего

    Сообщения:
    177
    Симпатии:
    37
    Если так удалять таймер будут ошибки в логах:
    Код:
    public void OnClientDisconnect_Post(int client)
    {
        delete g_hTimerMessage[client];
    }
    Ещё желательно убивать таймер после написания сообщения в чат.
     
    Последнее редактирование: 12 сен 2016
  7. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    Делал в другом плагине - не жаловался. Вот если CloseHandle или KillTimer вписать, то да.
    Ничего подобного. Максимум, сбросить его переменную.
     
  8. san911

    san911 Вообще короче нечего

    Сообщения:
    177
    Симпатии:
    37
    Код:
    L 09/12/2016 - 13:48:34: [SM] Invalid timer handle 50c048a (error 3) during timer end, displayed function is timer callback, not the stack trace
    L 09/12/2016 - 13:48:34: [SM] Unable to call function "SayHello" due to above error(s).
    Код:
    FormatEx(print, sizeof(print), "\x01%s\x03%N\x01 :  %s%s", IsPlayerAlive(client) ? "":GetClientTeam(client) > 1 ? "*УБИТ* ":"*НАБЛЮДАТЕЛЬ* ", client, gPhrases[GetRandomInt(0, sizeof(gPhrases)-1)], gPunctuationCharacter[GetRandomInt(0, sizeof(gPunctuationCharacter)-1)]);
    Для того чтобы не писало что игрок убит, если он не выбрал команду.
     
  9. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    Думаю, достаточно.
    По факту, не выбрав команду, писать и нельзя (на практике можно, но сложно). Так что, этот момент остаётся неправдоподобным и так, и сяк. Оффтоп
    Это не цвета команды, а лишь выбор из 2.
     
  10. san911

    san911 Вообще короче нечего

    Сообщения:
    177
    Симпатии:
    37
    Оффтоп
     
  11. san911

    san911 Вообще короче нечего

    Сообщения:
    177
    Симпатии:
    37
    Не знаю возможно и так, задача была в том чтобы менять цвет ника игрока в соответствие с цветом его команды. Так и сделал, не знаю почему у него \x03 не работал.
     
  12. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    \x03 - это один из стандартных цветов. Только через такие конструкции, как SayText2 он работает, будучи чисто командным, автоматически меняя окраску текста.
     
  13. MrBoogidy

    MrBoogidy

    Сообщения:
    23
    Симпатии:
    2
    Ooops
    L 09/12/2016 - 20:52:30: [SM] Native "StartMessage" reported: Unable to execute a new message, there is already one in progress
    L 09/12/2016 - 20:52:30: [SM] Displaying call stack trace for plugin "simple-chatprocessor.smx":
    L 09/12/2016 - 20:52:30: [SM] [0] Line 654, E:\SM compiler\sourcemod\scripting\simple-chatprocessor.sp::OnGameFrame()
    Идет конфликт с SCP, сервер падает при попытке написать в чат:
    Watch filipok228's Counter-Strike: Global Offensive video: ServerShutDown - Plays.tv
    PHP:
    PrintToChat(i"%s%s: %s"GetClientTeam(client) < "Цвет СПЕКОВ":GetClientTeam(client) == "Цвет Т":"Цвет СТ"namegPhrases[RandomPhrase 1]);
    Нужного результата не принесло, увы, все та же нераскрашенная строка с ником и приветствием.
    --- Добавлено позже ---
    Есть надежда, что в таком виде цвет заработает вместе с SCP? Сам проверить смогу не раньше, чем вечером...
    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <scp>

    #define PLUGIN_NAME "SayHello"
    #define PLUGIN_AUTHOR "AUTHOR"
    #define PLUGIN_VERSION "0.0.0"

    char gPhrases[][] = {
        
    "Привет!",
        
    "Привет всем!",
        
    "Здарова, парни!",
        
    "q all",
        
    "Hello everybody",
        
    "Парни, привет!",
        
    "Здрасте всем",
        
    "КуКу, ребят"
    };

    public 
    Plugin:myinfo =
    {
        
    name PLUGIN_NAMEauthor PLUGIN_AUTHORdescription "auto say hello to all"version PLUGIN_VERSION,
        
    url "http://www.url.ru"
    }
    public 
    void OnClientPostAdminCheck(int client)
    {
        
    CreateTimer(15.0SayHelloclient);
    }

    public 
    Action SayHello(Handle timerany client)
    {
        
    FakeClientCommand(client"say ljrshgfjs");
    }

    public 
    Action OnChatMessage(int &clientHandle recipientschar[] namechar[] message)
    {
        if (
    StrEqual(message"ljrshgfjs"))
        {
            
    Format(nameMAXLENGTH_NAME"\x03%s"name);
            
    PrintHelloToAll(clientname);
            return 
    Plugin_Handled;
        }
        return 
    Plugin_Continue;
    }

    PrintHelloToAll(int clientchar[] name)
    {
        
    int RandomPhrase GetRandomInt(1sizeof(gPhrases));
     
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && client != i)
            {
                
    PrintToChat(i"%s: %s"namegPhrases[RandomPhrase 1]);
            }
        }
    }
    --- Добавлено позже ---
    не работает...
    --- Добавлено позже ---
    Заработало, спасибо @Danyas
    PHP:
    #pragma semicolon 1
    #include <sourcemod>
    #include <colors>

    #define PLUGIN_NAME "SayHello"
    #define PLUGIN_AUTHOR "AUTHOR"
    #define PLUGIN_VERSION "0"

    char gPhrases[][] = {
        
    "Привет!",
        
    "Привет всем!",
        
    "Здарова, парни!",
        
    "q all",
        
    "Hello everybody",
        
    "Парни, привет!",
        
    "Здрасте всем",
        
    "КуКу, ребят"
    };

    public 
    Plugin:myinfo =
    {
        
    name PLUGIN_NAMEauthor PLUGIN_AUTHORdescription "auto say hello to all"version PLUGIN_VERSION,
        
    url "http://url.ru"
    }
    public 
    void OnClientPostAdminCheck(int client)
    {
        
    CreateTimer(35.0SayHelloclient);
    }

    public 
    Action SayHello(Handle timerany client)
    {
        
    char name[256];
        
    int RandomPhrase GetRandomInt(1sizeof(gPhrases));
        if(
    IsClientConnected(client)) Format(namesizeof(name), "%N"client);
       
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && client != i)
            {
                
    CPrintToChat(i"%s%s{default}: %s"GetClientTeam(client) < "{default}":GetClientTeam(client) == "{red}":"{blue}"namegPhrases[RandomPhrase 1]);
            }
        }
    }
     
    Последнее редактирование: 21 сен 2016