dvander@592: /** ds@653: * vim: set ts=4 : ds@653: * =============================================================== ds@653: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. ds@653: * =============================================================== ds@653: * ds@653: * This file is not open source and may not be copied without explicit ds@653: * written permission of AlliedModders LLC. This file may not be redistributed ds@653: * in whole or significant part. ds@653: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php ds@653: * ds@653: * Version: $Id$ ds@653: */ dvander@592: dvander@592: #ifndef _INCLUDE_SOURCEMOD_CUSERMESSAGES_H_ dvander@592: #define _INCLUDE_SOURCEMOD_CUSERMESSAGES_H_ dvander@592: dvander@592: #include "ShareSys.h" dvander@592: #include dvander@592: #include "sourcemm_api.h" dvander@592: #include "sm_trie.h" dvander@592: #include "CellRecipientFilter.h" dvander@592: dvander@592: using namespace SourceHook; dvander@592: using namespace SourceMod; dvander@592: dvander@592: #define INVALID_MESSAGE_ID -1 dvander@592: faluco@593: struct ListenerInfo faluco@593: { faluco@593: IUserMessageListener *Callback; faluco@593: bool IsHooked; faluco@593: bool KillMe; faluco@593: }; faluco@593: faluco@593: typedef List MsgList; faluco@593: typedef List::iterator MsgIter; dvander@592: dvander@616: class UserMessages : dvander@592: public IUserMessages, dvander@592: public SMGlobalClass dvander@592: { dvander@592: public: dvander@616: UserMessages(); dvander@616: ~UserMessages(); dvander@592: public: //SMGlobalClass ds@765: void OnSourceModStartup(bool late); dvander@592: void OnSourceModAllInitialized(); dvander@592: void OnSourceModAllShutdown(); dvander@592: public: //IUserMessages dvander@592: int GetMessageIndex(const char *msg); ds@765: bool GetMessageName(int msgid, char *buffer, size_t maxlength) const; dvander@592: bool HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false); dvander@592: bool UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false); dvander@592: bf_write *StartMessage(int msg_id, cell_t players[], unsigned int playersNum, int flags); dvander@592: bool EndMessage(); dvander@592: public: dvander@592: bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type); dvander@592: bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type); dvander@592: void OnMessageEnd_Pre(); dvander@592: void OnMessageEnd_Post(); dvander@592: private: faluco@593: void _DecRefCounter(); faluco@593: private: faluco@593: List m_msgHooks[255]; faluco@593: List m_msgIntercepts[255]; faluco@593: CStack m_FreeListeners; dvander@592: unsigned char m_pBase[2500]; dvander@592: IRecipientFilter *m_CurRecFilter; dvander@592: bf_write m_InterceptBuffer; dvander@592: bf_write *m_OrigBuffer; dvander@592: bf_read m_ReadBuffer; dvander@592: size_t m_HookCount; dvander@592: bool m_InHook; faluco@597: bool m_BlockEndPost; ds@765: bool m_FallbackSearch; dvander@592: dvander@592: Trie *m_Names; dvander@592: CellRecipientFilter m_CellRecFilter; dvander@592: bool m_InExec; dvander@592: int m_CurFlags; dvander@592: int m_CurId; dvander@592: }; dvander@592: dvander@616: extern UserMessages g_UserMsgs; dvander@592: dvander@592: #endif //_INCLUDE_SOURCEMOD_CUSERMESSAGES_H_