Перехват сообщения от плагина

crazyfors123

Участник
Сообщения
51
Реакции
7
Здравствуйте, я столкнулся с проблемой. У меня есть вот такой код, который отлавливает сообщение "Привет" и не даёт ему вывестись в чат. Есть ли какая то возможность, заменить слово "Привет" при выводе в чат на какое-то другое. Т.е. чтобы какой то плагин отправил Привет, но вывелось, то что мне нужно. Может кто-то знает как это можно реализовать?
C-подобный:
public void OnPluginStart()
{
    HookUserMessage(GetUserMessageId("TextMsg"), UserMessage, true);
}

public Action UserMessage(UserMsg:msg_id, Handle:pb, const players[], playersNum, bool:reliable, bool:init)
{
    decl String:text[64];
    PbReadString(pb, "params", text, sizeof(text), 0);
    if(StrContains(text, "Привет", false) != -1)
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Можно. В этом же каллбеке просим SM запустить в следующем кадре через RequestFrame() функцию, которая формирует и отправляет нужное Вам сообщение.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Ну если это прото, то и перезаписать можно сразу, битбуфер же не даст такую возможность и тут вариант с RequestFrame() или последним параметром хука, который при разных обстоятельствах, либо работает либо крашит клиент.

+ Если стоит какой-нить обработчик чата, трогающий TextMsg, то такой хук бесполезен.
Правда у клиентских сообщений есть способ обойти это

Ну и это if(StrContains(text, "Привет", false) != -1) абсурд.

По факту SM нативно не хватает форварда, отслеживающий StartMessage/All/Ex/One
 
Последнее редактирование:

crazyfors123

Участник
Сообщения
51
Реакции
7
Ну если это прото, то и перезаписать можно сразу, битбуфер же не даст такую возможность и тут вариант с RequestFrame() или последним параметром хука, который при разных обстоятельствах, либо работает либо крашит клиент.

Ну и это if(StrContains(text, "Привет", false) != -1) абсурд.

По факту SM нативно не хватает форварда, отслеживающий StartMessage/All/Ex/One
Если тебе не сложно, можешь готовый пример набросать. Я просто, что уже только не пробовал, ни в какую.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@crazyfors123
C-подобный:
#include UTF-8-string

#pragma newdecls required

#include Regex


public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    // Не дадим загрузиться, если используется BtBuffer
    // Зачем? Просто сократим пример до Proto Only
    if(!GetUserMessageType())
        return APLRes_SilentFailure;
    
    HookUserMessage(GetUserMessageId("TextMsg"), ServerMsg_CB, true);

    return APLRes_Success;
}

public Action ServerMsg_CB(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    // Отбросим все, кроме отправки в чат
    if(PbReadInt(msg, "msg_dst") != 3)
        return Plugin_Continue;

    // Получаем параметр
    static char szMessage[256];
    PbReadString(msg, "params", szMessage, sizeof(szMessage), 0);

    // Поскольку мы используем кириллицу, то стандартные функции могут работать не правильно.
    // Поэтому костылим...

    // Убираем, если уникум добавил пробелы, перед текстом
    TrimString(szMessage);

    // Ищем наше кирилическое слово в контексте
    static int i;
    i = UTF8StrContains(szMessage, "Привет", false);

    // Если оно найдено в контексте
    if(i != -1)
    {
        // В случае, если нам важно знать, цельное оно или содержится в другом.
        static Regex exp;
        if(!exp)
            exp = CompileRegex("[^a-zA-Z0-9а-яА-Я_]", PCRE_UTF8); // Ловит все, исключая указанное

        // Получаем реальный оффсет слова.
        i = GetWordStart(exp, i, szMessage);

        // Блочим, если они совпадают, иначе - отправляем
        return WordEqual(exp, szMessage[i]) ? Plugin_Handled : Plugin_Continue;
    }

    return Plugin_Continue;
}

int GetWordStart(Regex exp, int containedPos, char[] szMessage)
{
    // Если совпадение началось с начала строки - вернем же это
    if(!containedPos)
        return containedPos;

    // Получим все разрывы в тексте
    int MatchCount = exp.MatchAll(szMessage);

    // Если все сообщение без разрывов - вернем начало строки
    if(!MatchCount)
        return 0;

    for(int i; i < MatchCount; i++)
    {
        // Отбрасываем до тех пор, пока оффсет совпадения меньше нужного
        if(exp.MatchOffset(i) < containedPos)
            continue;
    
        // Возвращаем оффсет по Match - 1, т.к. текущий оффсет > нужного
        // Оффсет + 1 - исключает указание на позицию символа, полученного через регулярку
       // + Исключаем получение Match = -1
        return exp.MatchOffset((!i) ? 0 : i-1) + 1;
    }

    // Джекпот!
    return 0;
}

bool WordEqual(Regex exp, char[] szMessage)
{
    // Проверяем, есть ли подходящие нам обрывы строки.
    if(exp.Match(szMessage))
        szMessage[exp.MatchOffset(0)] = 0; // Обрываем строку по позиции первого совпадения

    // Режем пробелы
    TrimString(szMessage);

    // Возвращаем схожесть получившейся строки, перед заданой
    return UTF8StrEqual(szMessage, "Привет", false);
}
 
Последнее редактирование:

amdin55

Участник
Сообщения
121
Реакции
79
@crazyfors123
C-подобный:
#include UTF-8-string

#pragma newdecls required

#include Regex


public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    // Не дадим загрузиться, если используется BtBuffer
    // Зачем? Просто сократим пример до Proto Only
    if(!GetUserMessageType())
        return APLRes_SilentFailure;
   
    HookUserMessage(GetUserMessageId("TextMsg"), ServerMsg_CB, true);

    return APLRes_Success;
}

public Action ServerMsg_CB(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    // Отбросим все, кроме отправки в чат
    if(PbReadInt(msg, "msg_dst") != 3)
        return Plugin_Continue;

    // Получаем параметр
    static char szMessage[256];
    PbReadString(msg, "params", szMessage, sizeof(szMessage), 0);

    // Поскольку мы используем кириллицу, то стандартные функции могут работать не правильно.
    // Поэтому костылим...

    // Убираем, если уникум добавил пробелы, перед текстом
    TrimString(szMessage);

    // Ищем наше кирилическое слово в контексте
    static int i;
    i = UTF8StrContains(szMessage, "Привет", false);

    // Если оно найдено в контексте
    if(i != -1)
    {
        // В случае, если нам важно знать, цельное оно или содержится в другом.
        static Regex exp;
        if(!exp)
            exp = CompileRegex("[^a-zA-Z0-9а-яА-Я_]", PCRE_UTF8); // Ловит все, исключая указанное

        // Получаем реальный оффсет слова.
        i = GetWordStart(exp, i, szMessage);

        // Блочим, если они совпадают, иначе - отправляем
        return WordEqual(exp, szMessage[i]) ? Plugin_Handled : Plugin_Continue;
    }

    return Plugin_Continue;
}

int GetWordStart(Regex exp, int containedPos, char[] szMessage)
{
    // Если совпадение началось с начала строки - вернем же это
    if(!containedPos)
        return containedPos;

    // Получим все разрывы в тексте
    int MatchCount = exp.MatchAll(szMessage);

    // Если все сообщение без разрывов - вернем начало строки
    if(!MatchCount)
        return 0;

    for(int i; i < MatchCount; i++)
    {
        // Отбрасываем до тех пор, пока оффсет совпадения меньше нужного
        if(exp.MatchOffset(i) < containedPos)
            continue;
   
        // Возвращаем оффсет по Match - 1, т.к. текущий оффсет > нужного
        // Оффсет + 1 - исключает указание на позицию символа, полученного через регулярку
       // + Исключаем получение Match = -1
        return exp.MatchOffset((!i) ? 0 : i-1) + 1;
    }

    // Джекпот!
    return 0;
}

bool WordEqual(Regex exp, char[] szMessage)
{
    // Проверяем, есть ли подходящие нам обрывы строки.
    if(exp.Match(szMessage))
        szMessage[exp.MatchOffset(0)] = 0; // Обрываем строку по позиции первого совпадения

    // Режем пробелы
    TrimString(szMessage);

    // Возвращаем схожесть получившейся строки, перед заданой
    return UTF8StrEqual(szMessage, "Привет", false);
}
Подскажите, пожалуйста, этот плагин может убрать эти сообщения? Пробоавл менять "Привет" на "WARNING: VAC is disabled - No connection to Steam" или "WARNING/disabled", сообщения все равно видны

VAC.png
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Пробоавл менять "Привет" на "WARNING: VAC is disabled - No connection to Steam" или "WARNING/disabled", сообщения все равно видны
Ты бы добавил вывод в консоль или в хинт того текста, что отлавливает плагин, чтобы понять отлавливается ли сообщение и если да, то в каком именно виде.
А потом и думать можно.

И вообще у тебя сервер с параметром -insecure запущен?

И да в CS:S протобуфер не используется и потому у тебя этот код вообще не должен работать.

Попробуй такой код:
C-подобный:
#pragma semicolon 1

#include <usermessages>

public void OnPluginStart()
{
    HookUserMessage(GetUserMessageId("TextMsg"), ChatMsgHook, true);
}

public Action ChatMsgHook(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    static char buffer[PLATFORM_MAX_PATH];
    if(BfReadByte(msg)%2 == 0)    // TextMsg: 1 и 3 - чат, 2 - консоль, 4 - центр экрана
        return Plugin_Continue;

    BfReadString(msg, buffer, sizeof(buffer), true);
    PrintHintTextToAll(buffer);

    return Plugin_Continue;
}
Он должен выводить в хинт всем игрокам сообщения из чата в том виде, в котором они отправляются (т.е. без перевода клиентом, если он используется).
Так ты как минимум определишь что за сообщение нужно отловить и заблочить.
 

amdin55

Участник
Сообщения
121
Реакции
79
Ты бы добавил вывод в консоль или в хинт того текста, что отлавливает плагин, чтобы понять отлавливается ли сообщение и если да, то в каком именно виде.
А потом и думать можно.

И вообще у тебя сервер с параметром -insecure запущен?

И да в CS:S протобуфер не используется и потому у тебя этот код вообще не должен работать.

Попробуй такой код:
C-подобный:
#pragma semicolon 1

#include <usermessages>

public void OnPluginStart()
{
    HookUserMessage(GetUserMessageId("TextMsg"), ChatMsgHook, true);
}

public Action ChatMsgHook(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    static char buffer[PLATFORM_MAX_PATH];
    if(BfReadByte(msg)%2 == 0)    // TextMsg: 1 и 3 - чат, 2 - консоль, 4 - центр экрана
        return Plugin_Continue;

    BfReadString(msg, buffer, sizeof(buffer), true);
    PrintHintTextToAll(buffer);

    return Plugin_Continue;
}
Он должен выводить в хинт всем игрокам сообщения из чата в том виде, в котором они отправляются (т.е. без перевода клиентом, если он используется).
Так ты как минимум определишь что за сообщение нужно отловить и заблочить.
Спасибо за помощь. Код компилируется без проблем, но в логах ошибка Exception reported: Invalid message id supplied (-1)
 

amdin55

Участник
Сообщения
121
Реакции
79
В v34 отсутствует "TextMsg"?
И вообще бы приложил полный текст сообщения об ошибке из лога (начиная с Exception reported).
L 11/13/2023 - 23:30:36: SourceMod error session started
L 11/13/2023 - 23:30:36: Info (map "de_dust2") (file "/srv/cstrike/addons/sourcemod/logs/errors_20231113.log")
L 11/13/2023 - 23:30:36: [SM] Exception reported: Invalid message id supplied (-1)
L 11/13/2023 - 23:30:36: [SM] Blaming: zb_warnings.smx
L 11/13/2023 - 23:30:36: [SM] Call stack trace:
L 11/13/2023 - 23:30:36: [SM] [0] HookUserMessage
L 11/13/2023 - 23:30:36: [SM] [1] Line 7, C:\SM 1.10 - build 6490\zb_warnings.sp::OnPluginStart
L 11/13/2023 - 23:30:36: [SM] Unable to load plugin "zb_warnings.smx": Error detected in plugin startup (see error logs)
L 11/13/2023 - 23:30:37: Error log file session closed.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@amdin55, значит этот способ тебе не поможет, раз SM не может это сообщение хукать.
Или SM кривой какой-то.
 

amdin55

Участник
Сообщения
121
Реакции
79
@amdin55, значит этот способ тебе не поможет, раз SM не может это сообщение хукать.
Или SM кривой какой-то.
Погоди, ты задал интересный вопрос: "В v34 отсутствует "TextMsg"?" А я так понял, что TextMsg это примр текста, который нужно хукать. И в коде сделал так:

Код:
#pragma semicolon 1

#include <usermessages>

public void OnPluginStart()
{
    HookUserMessage(GetUserMessageId("WARNING: VAC is disabled - No connection to Steam"), ChatMsgHook, true);
}

public Action ChatMsgHook(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    static char buffer[PLATFORM_MAX_PATH];
    if(BfReadByte(msg)%2 == 1)    // TextMsg: 1 и 3 - чат, 2 - консоль, 4 - центр экрана
        return Plugin_Continue;

    BfReadString(msg, buffer, sizeof(buffer), true);
    PrintHintTextToAll(buffer);

    return Plugin_Continue;
}

Получается это не правильно?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@amdin55, я тебе дал готовый код и в нём ничего менять не нужно.
 

amdin55

Участник
Сообщения
121
Реакции
79
@amdin55, я тебе дал готовый код и в нём ничего менять не нужно.
Теперь такой ошибки нет, но появились другие. И не фильтрует сообщения от Zblock


Errors:
L 11/14/2023 - 22:25:15: SourceMod error session started
L 11/14/2023 - 22:25:15: Info (map "de_dust2") (file "/srv/cstrike/addons/sourcemod/logs/errors_20231114.log")
L 11/14/2023 - 22:25:15: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:15: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:15: [SM] Call stack trace:
L 11/14/2023 - 22:25:15: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:15: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:15: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:19: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:19: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:19: [SM] Call stack trace:
L 11/14/2023 - 22:25:19: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:19: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:19: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:19: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:19: [SM]   [5] Line 329, C:\SM 1.10 - build 6490\include\halflife.inc::PrintToChatAll
L 11/14/2023 - 22:25:19: [SM]   [6] Line 4105, C:\SM 1.10 - build 6490\warmod.sp::SayChat
L 11/14/2023 - 22:25:20: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:20: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:20: [SM] Call stack trace:
L 11/14/2023 - 22:25:20: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:20: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:20: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:20: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:20: [SM]   [5] Line 329, C:\SM 1.10 - build 6490\include\halflife.inc::PrintToChatAll
L 11/14/2023 - 22:25:20: [SM]   [6] Line 4105, C:\SM 1.10 - build 6490\warmod.sp::SayChat
L 11/14/2023 - 22:25:22: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:22: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:22: [SM] Call stack trace:
L 11/14/2023 - 22:25:22: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:22: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:22: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:22: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:22: [SM]   [5] Line 329, C:\SM 1.10 - build 6490\include\halflife.inc::PrintToChatAll
L 11/14/2023 - 22:25:22: [SM]   [6] Line 4105, C:\SM 1.10 - build 6490\warmod.sp::SayChat
L 11/14/2023 - 22:25:25: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:25: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:25: [SM] Call stack trace:
L 11/14/2023 - 22:25:25: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:25: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:25: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:25: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:25: [SM]   [5] Line 329, C:\SM 1.10 - build 6490\include\halflife.inc::PrintToChatAll
L 11/14/2023 - 22:25:25: [SM]   [6] Line 4105, C:\SM 1.10 - build 6490\warmod.sp::SayChat
L 11/14/2023 - 22:25:28: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:28: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:28: [SM] Call stack trace:
L 11/14/2023 - 22:25:28: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:28: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:28: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:28: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:28: [SM]   [5] Line 329, C:\SM 1.10 - build 6490\include\halflife.inc::PrintToChatAll
L 11/14/2023 - 22:25:28: [SM]   [6] Line 4105, C:\SM 1.10 - build 6490\warmod.sp::SayChat
L 11/14/2023 - 22:25:28: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:28: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:28: [SM] Call stack trace:
L 11/14/2023 - 22:25:28: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:28: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:28: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:28: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:28: [SM]   [5] Line 329, C:\SM 1.10 - build 6490\include\halflife.inc::PrintToChatAll
L 11/14/2023 - 22:25:28: [SM]   [6] Line 4105, C:\SM 1.10 - build 6490\warmod.sp::SayChat
L 11/14/2023 - 22:25:30: [SM] Exception reported: Could not send a usermessage
L 11/14/2023 - 22:25:30: [SM] Blaming: zb_chat.smx
L 11/14/2023 - 22:25:30: [SM] Call stack trace:
L 11/14/2023 - 22:25:30: [SM]   [0] PrintHintText
L 11/14/2023 - 22:25:30: [SM]   [1] Line 451, C:\SM 1.10 - build 6490\include\halflife.inc::PrintHintTextToAll
L 11/14/2023 - 22:25:30: [SM]   [2] Line 17, C:\SM 1.10 - build 6490\zb_chat.sp::ChatMsgHook
L 11/14/2023 - 22:25:30: [SM]   [4] PrintToChat
L 11/14/2023 - 22:25:30: [SM]   [5] Line 13, sodstats\commands\resetrank.sp::TimerAnnounce
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Exception reported: Could not send a usermessage
значит в следующем тике нужно текст отправлять
C-подобный:
#pragma semicolon 1

#include <usermessages>

static char sBuffer[PLATFORM_MAX_PATH];

public void OnPluginStart()
{
    HookUserMessage(GetUserMessageId("TextMsg"), ChatMsgHook, true);
}

public Action ChatMsgHook(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    if(BfReadByte(msg)%2 == 0)    // TextMsg: 1 и 3 - чат, 2 - консоль, 4 - центр экрана
        return Plugin_Continue;

    BfReadString(msg, sBuffer, sizeof(sBuffer), true);
    RequestFrame(RequestFrame_Callback);

    return Plugin_Continue;
}

public void RequestFrame_Callback(any data)
{
    if(sBuffer[0]) PrintHintTextToAll(sBuffer);
    sBuffer[0] = 0;
}
 

amdin55

Участник
Сообщения
121
Реакции
79
@Grey83, никаких ошибок нет в логах, но и текст не фильтрует. Честно говоря мне не совсем понятно как этот код определяет, что нужно заблокировать это сообщения "WARNING: VAC is disabled - No connection to Steam"

vac2.png
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Подскажите, пожалуйста, этот плагин может убрать эти сообщения?

Посмотреть вложение 115514
Если стоит чат-процессор, то нет.
Ну а если его нет, и сообщение плагином по-человечески отправляется, то нужно только переделать под битбуффер
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@amdin55, я же писал, что мой код не для фильтрации, а чтобы узнать какой текст нужно фильтрировать.
Кроме того в тексте у тебя используется раскраска и для сравнения нужно будет указать код цвета, иначе плагин будет считать что сообщение не совпадает.
Сообщения автоматически склеены:

@amdin55, и вообще: что за Zblock у тебя стоит и при чём тут квар zb_warnings?
 
Последнее редактирование:

amdin55

Участник
Сообщения
121
Реакции
79
@amdin55, я же писал, что мой код не для фильтрации, а чтобы узнать какой текст нужно фильтрировать.
Кроме того в тексте у тебя используется раскраска и для сравнения нужно будет указать код цвета, иначе плагин будет считать что сообщение не совпадает.
Сообщения автоматически склеены:

@amdin55, и вообще: что за Zblock у тебя стоит и при чём тут квар zb_warnings?
zBlock Server Plugin [4.4] игра css v34. Только эта версия адекватно работает. Насчет zb_warnings я ошибся, думал этот квар отвечает за отображения этих варнингов.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Насчет zb_warnings я ошибся, думал этот квар отвечает за отображения этих варнингов.
это не квар, это клиентская команда:
zb_warnings
Показывает информацию о не правильной конфигурации сервера, если есть замечания

И да, сообщение VAC is disabled - No connection to Steam пишет zBlock.
Сообщения автоматически склеены:

Пробуй вот такой код для блокировки этого сообщения:
C-подобный:
#pragma semicolon 1

#include <usermessages>

public void OnPluginStart()
{
    HookUserMessage(GetUserMessageId("TextMsg"), ChatMsgHook, true);
}

public Action ChatMsgHook(UserMsg msg_id, Handle msg, const int[] players, int playersNum, bool reliable, bool init)
{
    static char sBuffer[PLATFORM_MAX_PATH];
    if(BfReadByte(msg)%2 == 0    // TextMsg: 1 и 3 - чат, 2 - консоль, 4 - центр экрана
    || BfReadString(msg, sBuffer, sizeof(sBuffer), true) < 40
    || StrContains(sBuffer, "VAC is disabled - No connection to Steam") == -1)
        return Plugin_Continue;

    return Plugin_Handled;
}
 
Последнее редактирование:
Сверху Снизу