core/UserMessages.h
author Scott Ehlert <ds@alliedmods.net>
Sat Apr 21 17:03:28 2007 +0000 (2007-04-21)
changeset 702 ff520b71249c
parent 698 8c68fc683dba
child 765 d78dd115f23a
permissions -rw-r--r--
Wow, how did I forget this - exported IMemoryUtils interface
dvander@592
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@653
     3
 * ===============================================================
ds@653
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@653
     5
 * ===============================================================
ds@653
     6
 *
ds@653
     7
 * This file is not open source and may not be copied without explicit
ds@653
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
ds@653
     9
 * in whole or significant part.
ds@653
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
ds@653
    11
 *
ds@653
    12
 * Version: $Id$
ds@653
    13
 */
dvander@592
    14
dvander@592
    15
#ifndef _INCLUDE_SOURCEMOD_CUSERMESSAGES_H_
dvander@592
    16
#define _INCLUDE_SOURCEMOD_CUSERMESSAGES_H_
dvander@592
    17
dvander@592
    18
#include "ShareSys.h"
dvander@592
    19
#include <IUserMessages.h>
dvander@592
    20
#include "sourcemm_api.h"
dvander@592
    21
#include "sm_trie.h"
dvander@592
    22
#include "CellRecipientFilter.h"
dvander@592
    23
dvander@592
    24
using namespace SourceHook;
dvander@592
    25
using namespace SourceMod;
dvander@592
    26
dvander@592
    27
#define INVALID_MESSAGE_ID -1
dvander@592
    28
faluco@593
    29
struct ListenerInfo
faluco@593
    30
{
faluco@593
    31
	IUserMessageListener *Callback;
faluco@593
    32
	bool IsHooked;
faluco@593
    33
	bool KillMe;
faluco@593
    34
};
faluco@593
    35
faluco@593
    36
typedef List<ListenerInfo *> MsgList;
faluco@593
    37
typedef List<ListenerInfo *>::iterator MsgIter;
dvander@592
    38
dvander@616
    39
class UserMessages : 
dvander@592
    40
	public IUserMessages,
dvander@592
    41
	public SMGlobalClass
dvander@592
    42
{
dvander@592
    43
public:
dvander@616
    44
	UserMessages();
dvander@616
    45
	~UserMessages();
dvander@592
    46
public: //SMGlobalClass
dvander@592
    47
	void OnSourceModAllInitialized();
dvander@592
    48
	void OnSourceModAllShutdown();
dvander@592
    49
public: //IUserMessages
dvander@592
    50
	int GetMessageIndex(const char *msg);
dvander@592
    51
	bool HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
dvander@592
    52
	bool UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
dvander@592
    53
	bf_write *StartMessage(int msg_id, cell_t players[], unsigned int playersNum, int flags);
dvander@592
    54
	bool EndMessage();
dvander@592
    55
public:
dvander@592
    56
	bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type);
dvander@592
    57
	bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type);
dvander@592
    58
	void OnMessageEnd_Pre();
dvander@592
    59
	void OnMessageEnd_Post();
dvander@592
    60
private:
faluco@593
    61
	void _DecRefCounter();
faluco@593
    62
private:
faluco@593
    63
	List<ListenerInfo *> m_msgHooks[255];
faluco@593
    64
	List<ListenerInfo *> m_msgIntercepts[255];
faluco@593
    65
	CStack<ListenerInfo *> m_FreeListeners;
dvander@592
    66
	unsigned char m_pBase[2500];
dvander@592
    67
	IRecipientFilter *m_CurRecFilter;
dvander@592
    68
	bf_write m_InterceptBuffer;
dvander@592
    69
	bf_write *m_OrigBuffer;
dvander@592
    70
	bf_read m_ReadBuffer;
dvander@592
    71
	size_t m_HookCount;
dvander@592
    72
	bool m_InHook;
faluco@597
    73
	bool m_BlockEndPost;
dvander@592
    74
dvander@592
    75
	Trie *m_Names;
dvander@592
    76
	CellRecipientFilter m_CellRecFilter;
dvander@592
    77
	bool m_InExec;
dvander@592
    78
	int m_CurFlags;
dvander@592
    79
	int m_CurId;
dvander@592
    80
};
dvander@592
    81
dvander@616
    82
extern UserMessages g_UserMsgs;
dvander@592
    83
dvander@592
    84
#endif //_INCLUDE_SOURCEMOD_CUSERMESSAGES_H_