Фильтровать сообщение можно с помощью:
[pawn]
if (msg_type == GET_USER_MSG_ID(PLID, "TeamScore", NULL))
[/pawn]
[pawn]
#define GET_USER_MSG_ID (*gpMetaUtilFuncs->pfnGetUserMsgID)
[/pawn]
Note the PLID keyword passed to each function. This is
basically a "plugin id" to indicate to Metamod which plugin is calling the
function (else it's difficult to tell), and is a macro that should be
specified verbatim with each call. (Currently, the macro is merely the
plugin_info struct pointer returned by the plugin via Meta_Query;
in the future this could change to some other identifier.)
Тебе еще нужно поставить хуки на WriteByte, WriteChar и т.д. С помощью них эти аргументы и передаются. TeamName - string, Score - short. Значит тебе нужны
pfnWriteShort и
pfnWriteString.
В
pfnMessageBegin делаешь фильтрацию нужного сообщения и передаешь там же указатель на свою функцию, где будет обработка этих аргументов, то есть создаешь к примеру:
[pawn]
void (*Msg_Function) (void *) = NULL;
void Hook_TeamScore(void *p);
[/pawn]
В pfnMessageBegin делаешь проверки, если получили TeamScore, то прописываешь:
[pawn]
Msg_Function = Hook_TeamScore;
[/pawn]
Сама функция
Hook_TeamScore:
[pawn]
void Hook_TeamScore(void *p)
{
// В i_Arg храним индекс аргумента в сообщении
static int i_Arg = 0;
// В i_Score будем хранить значение аргумента Score
static int i_Score;
// TeamName
if (i_Arg == 0)
{
char c_TeamName[20];
i_Arg++;
memset(c_TeamName, 0, sizeof(c_TeamName));
strcpy(c_TeamName, (char *)p);
}
// Score
else if (i_Arg == 1)
{
i_Arg = 0;
i_Score = *(int *) p;
}
}
[/pawn]
В
pfnWriteShort получаем значение i_Value и передаем в нашу функцию Hook_TeamScore:
[pawn]
void pfnWriteShort(int i_Value)
{
if (Hook_TeamScore)
(*Hook_TeamScore) ((void *) &i_Value);
RETURN_META (MRES_IGNORED);
}
[/pawn]
Точно также и для
pfnWriteString:
[pawn]
void pfnWriteString(const char *c_String)
{
if (Hook_TeamScore)
(*Hook_TeamScore) ((void *) c_String);
RETURN_META (MRES_IGNORED);
}
[/pawn]
И напоследок делаем хук на конец отправленного сообщения
pfnMessageEnd:
[pawn]
void pfnMessageEnd(void)
{
if (Hook_TeamScore)
{
(*Hook_TeamScore) (NULL);
Hook_TeamScore = NULL;
}
RETURN_META (MRES_IGNORED);
}
[/pawn]