Игнорирование чата других игроков

Mr_panica

XenForo one 💖
Сообщения
931
Реакции
441
Всем привет.

Нужна небольшая помощь:
Нужен пример как можно игнорировать тестовый чат других игроков, то есть, игроки пишут, а у тебя это не должно отображается.

Видел примеры, но там нужен SCP, я не планирую его ставить)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Mr_panica, нужен любой работающий чат-процессор.
Пишешь для него модуль, который будет управлять фильтрацией сообщений и всё.
 

Mr_panica

XenForo one 💖
Сообщения
931
Реакции
441
А без него никак?
Просто из него функцию вытащить?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Mr_panica, просто плагин будет выполнять функции чатпроцессора раз нет чатпроцессора. 🤷‍♂️
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Mr_panica, там не просто: там меню настроек нужно, по хорошему.
Кроме того отсутствие на сервере других чатпроцессоров.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@Mr_panica, там не просто: там меню настроек нужно, по хорошему.
Кроме того отсутствие на сервере других чатпроцессоров.
Для csgo это не нужно, в теории, достаточно остановить отправку usermsg для необходимого получателя
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@nyood, а где тут указано название игры?
Сообщения автоматически склеены:

В оьбщем вот так можно создать менюшку:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

bool
    bGag[MAXPLAYERS+1][MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_ignore", Cmd_Ignore, "Disable chat messages from the player");

}

public Action Cmd_Ignore(int client, int args)
{
    if(client) SendMenu(client);
    return Plugin_Handled;
}

stock void SendMenu(int client, int pos = 0)
{
    char item[8], name[MAX_NAME_LENGTH];
    Menu menu = new Menu(Menu_Ignore);
    menu.SetTitle("Display chat messages from:");
    for(int i = 1; i <= MaxClients; i++)
        if(IsClientInGame(i) && !IsFakeClient(i) && i != client && CanUserTarget(client, i))
        {
            FormatEx(item, sizeof(item), "%i", GetClientUserId(i));
            if(!GetClientName(i, name, sizeof(name)) || !TrimString(name))
                FormatEx(name, sizeof(name), "unnamed (#%s)", item);
            Format(name, sizeof(name), "%s %s", bGag[client][i] ? "☐" : "☑", name);
            menu.AddItem(item, name);
        }
    if(!menu.ItemCount) menu.AddItem("", "No targets", ITEMDRAW_DISABLED);
    menu.ExitButton = true;

    if(!pos) menu.Display(client, 0);
    else menu.DisplayAt(client, GetMenuSelectionPosition(), MENU_TIME_FOREVER);
}

public int Menu_Ignore(Menu menu, MenuAction action, int client, int param)
{
    switch(action)
    {
        case MenuAction_Select:
        {
            char item[8];
            menu.GetItem(param, item, sizeof(item));
            int id = GetClientOfUserId(StringToInt(item));
            if(id) bGag[client][id] = !bGag[client][id];
            SendMenu(client, GetMenuSelectionPosition());
        }
        case MenuAction_End: CloseHandle(menu);
    }
    return 0;
}

public void OnClientPutInServer(int client)
{
    for(int i = 1; i <= MaxClients; i++) bGag[i][client] = false;
}
А потом нужно перехватывать сообщения и менять в них список получателей.
Это всё же проще сделать чатпроцессором (там в разы больше кода, чтобы перехватить сообщение и отправить изменённое).
При перехвате просто сравнить массив получателей со значением в массиве bGag[получатель][отправитель] и те индексы, где значение true, занести в новый массив, который уже использовать при передаче перехваченного текста.
 
Последнее редактирование:
Сверху Снизу