Помогите с написанием плагина

.samuello

Участник
Сообщения
69
Реакции
53
Всем привет, нужна ваша помощь написанием плагина.
Плагин выводит сообщение при смене ника, но проблема в том что сама игра или сервер тоже выводит его.

Как убрать стандартное сообщение?
8xenmtsvqPE.jpg


Исходный код:
PHP:
#include <sourcemod>
#include <morecolors>
public void OnPluginStart()
{
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action eChangeNick(Event event, const char[] name, bool dontBroadcast)
{
    char newname[32];
    event.GetString("newname", newname, 32);
    int UserID = GetClientOfUserId(event.GetInt("userid"));
    CPrintToChatAll("{whiteweakdark}|SQEE| {purple}%N {white}сменил ник на {purple}%s", UserID, newname);
    return Plugin_Handled; 
}
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #2
@Gleezer,
PHP:
#include <sourcemod>
#include <morecolors>
public void OnPluginStart()
{
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action eChangeNick(Event event, const char[] name, bool dontBroadcast)
{
    char newname[32];
    event.GetString("newname", newname, 32);
    int UserID = GetClientOfUserId(event.GetInt("userid"));
    CPrintToChatAll("{whiteweakdark}|SQEE| {purple}%N {white}сменил ник на {purple}%s", UserID, newname);
    event.BroadcastDisabled = true;
    return Plugin_Handled;
}
 
Последнее редактирование:

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #4
@Gleezer, обновил пост, проверь так.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #6
@Gleezer, а если заменить return Plugin_Handled на return Plugin_Continue ? Забыл, что только Plugin_Handled запрещает вывод.
 
Последнее редактирование:

Kailo

Участник
Сообщения
194
Реакции
896
Тогда хукани UserMsg, отвечающий за вывод сообщения в чат.
Вероятнее всего это будет "SayText2".
Для хука используй HookUserMessage, а для получения id сообщения по его имени GetUserMessageType.
Если это css (как я понял, хотя стоит сообщать при создании темы), то будет использоваться bitbuffer.
Пример работы с UserMsg и SayText2 в частности: powerlord/sourcemod-snippets
Тут тебе будет важен параметр msg_name - кодовое имя фразы. Его ты можешь найти или в файлах перевода, или предварительно сделать хук с выводом (по сути можешь использовать тот плагин из примера, он для этого и предназначен), и посмотреть название фразы, которая оповещает о смене имени. Должно быть что-то вроде "#SFUI_Name_Changed".
Собственно потом делаешь в хуке фильтр, если имя фразы равное нужному, блокируешь отправку сообщений.
P.S. Когда все сделаешь не забудь сюда выложить результат, чтобы если люди захотят сделать подобное, нашли не только тему с подобным вопросом, но и ответ на него.
 
Последнее редактирование:

.samuello

Участник
Сообщения
69
Реакции
53
Тогда хукани UserMsg, отвечающий за вывод сообщения в чат.
Вероятнее всего это будет "SayText2".
Для хука используй HookUserMessage, а для получения id сообщения по его имени GetUserMessageType.
Если это css (как я понял, хотя стоит сообщать при создании темы), то будет использоваться bitbuffer.
Пример работы с UserMsg и SayText2 в частотности: powerlord/sourcemod-snippets
Тут тебе будет важен параметр msg_name - кодовое имя фразы. Его ты можешь найти или в файлах перевода, или предварительно сделать хук с выводом (по сути можешь использовать тот плагин, он для этого и предназначен), и посмотреть название фразы, которая оповещает о смене имени. Должно быть что-то вроде "#SFUI_Name_Changed".
Собственно потом делаешь в хуке фильтр, если имя фразы равное нужному, блокируешь отправку сообщений.
P.S. Когда все сделаешь не забудь сюда выложить результат, чтобы если люди захотят сделать подобное, нашли не только тему с подобным вопросом, но и ответ на него.
Ок, спасибо за ответ, значит надо узнать подробнее о хуках.
 

.samuello

Участник
Сообщения
69
Реакции
53
Простите что так долго, просто что-то времени не было.
Вот исходник готового плагина, может кому-то пригодиться.
PHP:
#include <sourcemod>
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("SayText2"), SayText2, true);
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action:SayText2(UserMsg:msg_id, Handle:bf, players[], playersNum, bool:reliable, bool:init)
{
    if(!reliable)
    {
        return Plugin_Continue;
    }
    new String:buffer[25];
    BfReadChar(bf);
    BfReadChar(bf);
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "#Cstrike_Name_Change"))
    {
        return Plugin_Handled;
    } 
    return Plugin_Continue;
}
public Action eChangeNick(Event:event, const char[] name, bool:dontBroadcast)
{
    char newname[32];
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    event.GetString("newname", newname, sizeof(newname));
    PrintToChatAll("\x07FF4000[NameChange] \x07FFFFFFИгрок \x07AAAAAA%N \x07FFFFFFсменил свой ник на \x07AAAAAA%s", iClient, newname);
    return Plugin_Handled;
}
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Увидел и захотел взять себе "на потом" для серверов в CS:S v34, подправил. Вдруг кому-нибудь нужно =)

PHP:
#include <sourcemod>
#include <colors>
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("SayText2"), SayText2, true);
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action:SayText2(UserMsg:msg_id, Handle:bf, players[], playersNum, bool:reliable, bool:init)
{
    if(!reliable)
    {
        return Plugin_Continue;
    }
    new String:buffer[25];
    BfReadChar(bf);
    BfReadChar(bf);
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "#Cstrike_Name_Change"))
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
public Action eChangeNick(Event:event, const char[] name, bool:dontBroadcast)
{
    char newname[32];
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    event.GetString("newname", newname, sizeof(newname));
    CPrintToChatAll("\x04Server \x01| \x04Игрок \x03%N \x04сменил свой ник на \x03%s", iClient, newname);
    return Plugin_Handled;
}
awp_lego_20001.jpg
Компилировал и ставил на SM 1.9. Ради прикола пробовал скомпилировать на 1.6.3 - не хочет
 

Вложения

  • ChangeName.rar
    11.2 КБ · Просмотры: 3

Kailo

Участник
Сообщения
194
Реакции
896
Ради прикола пробовал скомпилировать на 1.6.3 - не хочет
Тут намешаны старый и новый синтаксисы, плохо так делать. Вот полностью на старом, должно компилироваться на 1.6.3.
PHP:
#include <sourcemod>
#include <colors>
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("SayText2"), SayText2, true);
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action:SayText2(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    if(!reliable)
    {
        return Plugin_Continue;
    }
    new String:buffer[25];
    BfReadChar(bf);
    BfReadChar(bf);
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "#Cstrike_Name_Change"))
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
public Action:eChangeNick(Handle:event, const String:name[], bool:dontBroadcast)
{
    new String:newname[32];
    new iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    GetEventString(event, "newname", newname, sizeof(newname));
    CPrintToChatAll("\x04Server \x01| \x04Игрок \x03%N \x04сменил свой ник на \x03%s", iClient, newname);
    return Plugin_Handled;
}
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Тут намешаны старый и новый синтаксисы, плохо так делать. Вот полностью на старом, должно компилироваться на 1.6.3.
PHP:
#include <sourcemod>
#include <colors>
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("SayText2"), SayText2, true);
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action:SayText2(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    if(!reliable)
    {
        return Plugin_Continue;
    }
    new String:buffer[25];
    BfReadChar(bf);
    BfReadChar(bf);
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "#Cstrike_Name_Change"))
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
public Action:eChangeNick(Handle:event, const String:name[], bool:dontBroadcast)
{
    new String:newname[32];
    new iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    GetEventString(event, "newname", newname, sizeof(newname));
    CPrintToChatAll("\x04Server \x01| \x04Игрок \x03%N \x04сменил свой ник на \x03%s", iClient, newname);
    return Plugin_Handled;
}
А я всё равно на 1.9 сижу =)
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Простите что так долго, просто что-то времени не было.
Вот исходник готового плагина, может кому-то пригодиться.
PHP:
#include <sourcemod>
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("SayText2"), SayText2, true);
    HookEvent("player_changename", eChangeNick, EventHookMode_Pre);
}
public Action:SayText2(UserMsg:msg_id, Handle:bf, players[], playersNum, bool:reliable, bool:init)
{
    if(!reliable)
    {
        return Plugin_Continue;
    }
    new String:buffer[25];
    BfReadChar(bf);
    BfReadChar(bf);
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "#Cstrike_Name_Change"))
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
public Action eChangeNick(Event:event, const char[] name, bool:dontBroadcast)
{
    char newname[32];
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    event.GetString("newname", newname, sizeof(newname));
    PrintToChatAll("\x07FF4000[NameChange] \x07FFFFFFИгрок \x07AAAAAA%N \x07FFFFFFсменил свой ник на \x07AAAAAA%s", iClient, newname);
    return Plugin_Handled;
}
@Paranoiiik, @Kailo, Можете подправить под кс го пожалуйста?
 
Сверху Снизу