Перехватить сообщения.

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Нужно прихватить и заблокировать сообщения. Игрок подключился, отключится и сменил команду.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
(тут можно в комментах ещё версии глянуть)

Ещё можно глянуть как это делают плагины, которые сами выводят такие сообщения (они блочат дефолтные сообщения обычно)
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Grey83,
C++:
HookEvent("player_team", Event_PlayerTeam, EventHookMode_Pre);

public Action:Event_PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(!dontBroadcast)
    {
        SetEventBroadcast(event, true);
    }
}
Так блокируется сообщение. Но когда игрок меняет команду. В меню выбора команды один клик нечего не происходит на второй меняет.
Нужно поймать событие игрок поменял команду. Заблокировать сообщение и вывести свое. Это не должно влиять на смену команды игроком.
 

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
@oleg_nelasy, 🤔
C-подобный:
HookEvent("player_team", Event_PlayerTeam, EventHookMode_Pre);

public Action:Event_PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
  
    if (!dontBroadcast)
    {
        SetEventBroadcast(event, true);
    }
      
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    int oldTeam = GetEventInt(event, "oldteam");
    int newTeam = GetEventInt(event, "team");
      
    if (client > 0 && client <= MaxClients && IsClientInGame(client) && oldTeam != newTeam)
    {
      CreateTimer(0.1, Timer_ShowTeamChangeMessage, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
    }
  
    return Plugin_Continue;
}

public Action Timer_ShowTeamChangeMessage(Handle timer, int userid)
{
    int client = GetClientOfUserId(userid);
    if (client > 0 && IsClientInGame(client))
    {
        int team = GetClientTeam(client);
        char teamName[32];
      
        switch (team)
        {
            case 1: teamName = "Spectators";
            case 2: teamName = "Terrorists";
            case 3: teamName = "Counter-Terrorists";
            default: teamName = "Unknown";
        }
      
        PrintToChatAll("%N has joined %s team", client, teamName);
    }
  
    return Plugin_Stop;
}

Блокирует стандартное сообщение о смене команды
Проверяет, что смена команды действительно произошла
Через небольшой таймер выводит ваше кастомное сообщение
Не мешает игроку нормально сменить команду
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Не мешает игроку нормально сменить команду
если это имеется в виду проблема в CS:GO, то решение более 3 лет существует без таймеров
Сообщения автоматически склеены:

А плагин с заменой сообщений (моя версия) у меня на винте с 2019-го хранится
 

Вложения

  • simple_announce 1.1.1.sp
    5.9 КБ · Просмотры: 6

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
Просто автор не написал для какой игры ему это нужно.
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Grey83, Попробовал как у вас в примере но похоже я что-то недопонял.
C++:
public Action Event_Team(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client && !dontBroadcast)
    {
        event.BroadcastDisabled = true;
      
        switch(event.GetInt("team"))
        {
            case 1: PrintToChatAll("Игрок %N перешёл в Наблюдение", client);
            case 2: PrintToChatAll("Игрок %N зашёл за Террористов", client);
            case 3: PrintToChatAll("Игрок %N зашёл за Спецназ", client);
        }
    }
    return Plugin_Continue;
}
Эффект тот же.
@DENZEL519, Позже попробую версию с таймером но мне кажется проблема будет таже.
Как только я делаю event.BroadcastDisabled = true Сразу возникает проблема. Сам код отрабатывает сообщение блокируется и все что я сделал после блока работает. Но в меню при выборе команды приходится кликать несколько раз.
 

DENZEL519

Работаю с AI !
Сообщения
417
Реакции
198
@oleg_nelasy, Опишите всё что вам нужно чтобы делал плагин, и для какой игры.
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
У меня стоит такое на сервере, и вроде все работает:

Code:
public void OnPluginStart(){
    HookEvent("player_connect", OnPlayerConnect, EventHookMode_Pre);
    HookEvent("player_disconnect", OnPlayerDisconnect, EventHookMode_Pre);
    HookEvent("player_team", OnPlayerTeam, EventHookMode_Pre);
    HookUserMessage(GetUserMessageId("TextMsg"), OnTextMsg, true);
}
public void OnPlayerConnect(Event event, const char[] name, bool dontBroadcast){
    if(!dontBroadcast)
        event.BroadcastDisabled = true;
   
    // Игрок подключается на сервер
}
public Action OnPlayerDisconnect(Event event, const char[] name, bool dontBroadcast){
    if(!dontBroadcast)
        event.BroadcastDisabled = true;

    // Игрок отключился от сервера

    return Plugin_Handled;
}
public Action OnPlayerTeam(Event event, const char[] name, bool dontBroadcast){
    if(!dontBroadcast && !event.GetBool("disconnect") && !event.GetBool("silent")){
        event.BroadcastDisabled = true;
        int client = GetClientOfUserId(event.GetInt("userid"));
        if(client){
            switch(event.GetInt("team")){
                case 1: ChatCore_PrintToChat(other, "{-}{nick_grd}%N{!nick_grd}{text} переходит к {lightgreen}Наблюдателям {#960000}ϟ", client);
                case 2: ChatCore_PrintToChat(other, "{-}{nick_grd}%N{!nick_grd}{text} переходит к {red}Террористам {#960000}ϟ", client);
                case 3: ChatCore_PrintToChat(other, "{-}{nick_grd}%N{!nick_grd}{text} переходит к {blue}Спецназовцам {#960000}ϟ", client);
            }
        }
    }
    return Plugin_Handled;
}
public Action OnTextMsg(UserMsg msg_id, Handle bf, const players[], int playersNum, bool reliable, bool init){
    if(BfReadByte(bf) == 1){
        char message[64];
        int len = BfReadString(bf, message, sizeof(message));
        if((len == 15 && message[0] == '#' && message[1] == 'G' && message[6] == 'c') || (len == 33 && message[0] == '#' && message[19] == 'G' && message[24] == 'c')) // блокировка чего-то, не помню чего
            return Plugin_Handled;
    }
    return Plugin_Continue;
}


Правда у меня игра CSS v34, хотя и в ксго должно работать
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
если нужно только заблочить сообщения в чате (и выбор команды будет правильно работать), то должен работать такой код:
C-подобный:
public void OnPluginStart()
{
	HookEvent("player_connect", Event_Block, EventHookMode_Pre);
	HookEvent("player_connect_client", Event_Block, EventHookMode_Pre);
	HookEvent("player_disconnect", Event_Block, EventHookMode_Pre);
	HookEvent("player_team", Event_Block, EventHookMode_Pre);
}

public Action Event_Block(Event event, const char[] name, bool dontBroadcast)
{
	if(dontBroadcast)
		return Plugin_Continue;

	event.BroadcastDisabled = true;

	static int userid, client;
	if(name[7] == 't' && event.GetInt("team") && (client = GetClientOfUserId((userid = event.GetInt("userid")))))
	{
		Event send = CreateEvent("player_team");
		send.SetInt("userid", userid);
		send.FireToClient(client);
		CancelCreatedEvent(send);
	}

	return Plugin_Changed;
}
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Grey83, Спасибо. Вот так работает и вывод который мне нужен.


C-подобный:
public Action Event_Team(Event event, const char[] name, bool dontBroadcast)
{
    if(dontBroadcast)
        return Plugin_Continue;

    event.BroadcastDisabled = true;

    static int userid, client;
    if(name[7] == 't' && event.GetInt("team") && (client = GetClientOfUserId((userid = event.GetInt("userid")))))
    {
        Event send = CreateEvent("player_team");
        send.SetInt("userid", userid);
        send.FireToClient(client);
        CancelCreatedEvent(send);
    }

    switch(event.GetInt("team"))
    {
        case 1: PrintToChatAll("Игрок %N перешёл в Наблюдение", client);
        case 2: PrintToChatAll("Игрок %N зашёл за Террористов", client);
        case 3: PrintToChatAll("Игрок %N зашёл за Спецназ", client);
    }
    return Plugin_Changed;
}
Сообщения автоматически склеены:
 
Последнее редактирование:
Сверху Снизу