class CEvent { DWORD dwUnknown[ 5 ]; public: const char * pszEvent; }; typedef void ( * tBroadcastEvent )( DWORD dwEventID, const char * pszFmt ... ); tBroadcastEvent oBroadcastEvent = 0; void BroadcastEvent( DWORD dwEventID, const char * pszFmt, const char * pszArgs ... ) { _asm pushad CEvent * pEvent = *(CEvent**)( *reinterpret_cast( dwList[ "EventBase" ].Get() ) + dwEventID * 4 ); add_log( "%x %s %s", dwEventID, pEvent->pszEvent, pszFmt ); if( pszFmt && *pszFmt ) { va_list vaList; va_start( vaList, pszFmt ); if( dwEventID == 0x111 /* || !strcmp( pEvent->pszEvent, "CHAT_MSG_SAY" ) */ ) // CHAT_MSG_SAY { const char * pszMessage = va_arg( vaList, const char * ); const char * pszSender = va_arg( vaList, const char * ); const char * pszLanguage = va_arg( vaList, const char * ); add_log( "[%s] said: %s %s", pszSender, pszMessage, pszLanguage ); } va_end( vaList ); } _asm popad oBroadcastEvent( dwEventID, pszFmt, pszArgs ); }