Готовое решение для работы с сообщениями/ивентами для модуля к metamod.
Установка:
Нужно хукать все функции: ( Пример для moduleconfig.h )
[pawn]
- #define FN_MessageBegin MessageBegin
- #define FN_MessageEnd MessageEnd
- #define FN_WriteByte WriteByte
- #define FN_WriteChar WriteChar
- #define FN_WriteShort WriteShort
- #define FN_WriteLong WriteLong
- #define FN_WriteAngle WriteAngle
- #define FN_WriteCoord WriteCoord
- #define FN_WriteString WriteString
- #define FN_WriteEntity WriteEntity
И вот их обработчики:
[pawn]
- #include "q_events.h"
- void MessageBegin( int msg_dest, int msg_type, const float *pOrigin, edict_t *ed )
- {
- return Events.EM_MessageBegin( msg_dest, msg_type, pOrigin, ed );
- }
- void WriteByte( int iValue )
- {
- return Events.EM_WriteByte( iValue );
- }
- void WriteChar( int iValue )
- {
- return Events.EM_WriteChar( iValue );
- }
- void WriteShort( int iValue )
- {
- return Events.EM_WriteShort( iValue );
- }
- void WriteLong( int iValue )
- {
- return Events.EM_WriteLong( iValue );
- }
- void WriteAngle( float flValue )
- {
- return Events.EM_WriteAngle( flValue );
- }
- void WriteCoord( float flValue )
- {
- return Events.EM_WriteCoord( flValue );
- }
- void WriteString( const char *sz )
- {
- return Events.EM_WriteString( sz );
- }
- void WriteEntity( int iValue )
- {
- return Events.EM_WriteEntity( iValue );
- }
- void MessageEnd( )
- {
- return Events.EM_MessageEnd( );
- }
Пример использования:
[pawn]
- #include "q_events.h"
- int Event_CurWeapon( int msg_dest, int msg_type, const float *pOrigin, edict_t *ed );
- void ClientCommand(edict_t* pPlayer)
- {
- if(!strcmp(CMD_ARGV(1), "hook"))
- {
- Events.RegisterEvent( "CurWeapon", &Event_CurWeapon );
- }
- RETURN_META(MRES_IGNORED);
- }
- int Event_CurWeapon( int msg_dest, int msg_type, const float *pOrigin, edict_t *ed )
- {
- UTIL_ClientPrint(NULL, HUD_PRINTTALK, "Event: CurWeapon dest: %d type: %d ed: %p", msg_dest, msg_type, ed);
- UTIL_ClientPrint(NULL, HUD_PRINTTALK, "Active: %d ID: %d ClippAmmo: %d", Events.GetArgInt(0), Events.GetArgInt(1), Events.GetArgInt(2));
- UTIL_ClientPrint(NULL, HUD_PRINTTALK, "%d %p", Events.GetArgInt(3), Events.GetArgString(2));
- Events.SetArg(2, 77);
- return ER_IGNORED;
- }
Тип функции-обработчика ивента: EventCallback
int Event_Handler( int msg_dest, int msg_type, const float *pOrigin, edict_t *ed );
Она возвращает одно из следующих значений:
[pawn]
- enum
- {
- ER_IGNORED = 0,
- ER_SUPERCEDE // Заблокировать ивент
- };
Функции:
[pawn]
- // Хукает ивент по имени или ид
- void RegisterEvent(const int msg_id, EventCallback func);
- void RegisterEvent(const char* msg_id, EventCallback func);
- // Получает аргумент по номеру
- int GetArgInt(int num);
- float GetArgFloat(int num);
- const char* GetArgString(int num);
- // Устанавливает аргумент по номеру
- void SetArg(int num, int set);
- void SetArg(int num, float set);
- void SetArg(int num, const char* set);
- // Получает ид ивента по имени ( Не нужно )
- int ID(const char* msg_name);
Скачать: