Как вытащить из чата то, что пишут игроки?

NightHunter

Участник
Сообщения
25
Реакции
2
В чем суть? Если игрок пишет какое-то сообщение с определенным словом, (как я понимаю, с помощью ивента player_say) отловить его и к примеру переписать.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
{
    if(client != 0 && !IsFakeClient(client))
    {
        decl String:sText[192];
        strcopy(sText, sizeof(sText), sArgs);
        TrimString(sText);
        StripQuotes(sText);
        new bool: AllChat = StrEqual(command, "say");
        LogMessage("%N написал в %s чат сообщение: %s", client, AllChat ? "общий" : "командный", sText);
    }
}
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Я же возвратов действия не делаю, значит не обязательно. Можно конечно добавить return Plugin_Continue; перед последней скобкой, но зачем?
--- Добавлено позже ---
а, переписать, пардон, не до читал шапку
 

NightHunter

Участник
Сообщения
25
Реакции
2
PHP:
public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
{
    if(client != 0 && !IsFakeClient(client))
    {
        decl String:sText[192];
        strcopy(sText, sizeof(sText), sArgs);
        TrimString(sText);
        StripQuotes(sText);
        new bool: AllChat = StrEqual(command, "say");
        LogMessage("%N написал в %s чат сообщение: %s", client, AllChat ? "общий" : "командный", sText);
    }
}

PHP:
public OnPluginStart()
{
    HookEvent("player_say", OnClientSayCommand); //error 100: function prototypes do not match
}

public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
{
    if(client != 0 && !IsFakeClient(client))
    {
        decl String:sText[192];
        strcopy(sText, sizeof(sText), sArgs);
        TrimString(sText);
        StripQuotes(sText);
        new bool: AllChat = StrEqual(command, "say");
        LogMessage("%N написал в %s чат сообщение: %s", client, AllChat ? "общий" : "командный", sText);
    }
}

По скольку я еще очень туп в этом, то не могли бы Вы подсказать как отловить любое определенное слово?
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
public OnPluginStart()
{
    HookEvent("player_say", OnClientSayCommand); //error 100: function prototypes do not match
}

public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
{
    if(client != 0 && !IsFakeClient(client))
    {
        decl String:sText[192];
        strcopy(sText, sizeof(sText), sArgs);
        TrimString(sText);
        StripQuotes(sText);
        new bool: AllChat = StrEqual(command, "say");
        LogMessage("%N написал в %s чат сообщение: %s", client, AllChat ? "общий" : "командный", sText);
    }
}

По скольку я еще очень туп в этом, то не могли бы Вы подсказать как отловить любое определенное слово?

Оффтоп

Весь плагин:
PHP:
public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
{
    if(client != 0 && !IsFakeClient(client))
    {
        decl String:sText[192];
        strcopy(sText, sizeof(sText), sArgs);
        TrimString(sText);
        StripQuotes(sText);
      
      
        if(StrEqual(sText, "плохо"))
        {
            PrintToChat(client, "хорошо");
            return Plugin_Handled;
        }
      
    }
    return Plugin_Continue;
}

Отлавливает текст "плохо", и пишет ему "хорошо" в чате.
 
Последнее редактирование:

NightHunter

Участник
Сообщения
25
Реакции
2
ОффтопНу простите, только начал. За плагин большое спасибо.
 

NightHunter

Участник
Сообщения
25
Реакции
2
Оффтоп
Человек в чате пишет "Вася: Продам бла-бла-бла", плагин выдает "[TRADE] Вася: Продам бля-бла-бла"
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Оффтоп
Человек в чате пишет "Вася: Продам бла-бла-бла", плагин выдает "[TRADE] Вася: Продам бля-бла-бла"
По другому никак иначе))
Такое лучше делать модулем с simple chat processor redux что бы проблем никаких не было с другими чат-плагинами.

PHP:
#include <scp>

public Action:OnChatMessage(&author, Handle:recipients, String:name[], String:message[])
{
    if(StrContains(message, "продам", false) || StrContains(message, "sell", false))
    {
        Format(name, 192, "[TRADE] %s", name);
        return Plugin_Changed;
    }
   
    return Plugin_Continue;
}

Добавил sell - потому что с русскими буквами StrContains может работать не адекватно. (для теста)
 

NightHunter

Участник
Сообщения
25
Реакции
2
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
PrintToChat(client, "хорошо");
PHP:
FakeClientCommand(client, "%s хорошо", command);
Для того, чтобы сообщение было в точности от того игрока, кто его писал, но с изменённым смыслом. Однако, данная конструкция адекватно не поддерживает длинные сообщения. Оффтоп
 

NightHunter

Участник
Сообщения
25
Реакции
2
По другому никак иначе))
Такое лучше делать модулем с simple chat processor redux что бы проблем никаких не было с другими чат-плагинами.

PHP:
#include <scp>

public Action:OnChatMessage(&author, Handle:recipients, String:name[], String:message[])
{
    if(StrContains(message, "продам", false) || StrContains(message, "sell", false))
    {
        Format(name, 192, "[TRADE] %s", name);
        return Plugin_Changed;
    }
  
    return Plugin_Continue;
}

Добавил sell - потому что с русскими буквами StrContains может работать не адекватно. (для теста)

Поставил все на сервер, он любое сообщение переделывает в [TRADE] Вася: *то что Вася написал*
Не зависимо от того присутствует ли там "sell" или "продам"
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Сверху Снизу