core/UserMessages.h
author David Anderson <dvander@alliedmods.net>
Thu Mar 15 04:45:33 2007 +0000 (2007-03-15)
changeset 617 dc7671b320e4
parent 616 d5b1dcf38c07
child 653 ef60870067ff
permissions -rw-r--r--
fixed two spelling mistakes
dvander@592
     1
/**
dvander@592
     2
* vim: set ts=4 :
dvander@592
     3
* ===============================================================
dvander@592
     4
* SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@592
     5
* ===============================================================
dvander@592
     6
*
dvander@592
     7
* This file is not open source and may not be copied without explicit
dvander@592
     8
* written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@592
     9
* in whole or significant part.
dvander@592
    10
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@592
    11
*
dvander@592
    12
* Version: $Id$
dvander@592
    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 GetMessageName(int msgid, char *buffer, size_t maxlen) const;
dvander@592
    52
	bool HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
dvander@592
    53
	bool UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
dvander@592
    54
	bf_write *StartMessage(int msg_id, cell_t players[], unsigned int playersNum, int flags);
dvander@592
    55
	bool EndMessage();
dvander@592
    56
public:
dvander@592
    57
	bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type);
dvander@592
    58
	bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type);
dvander@592
    59
	void OnMessageEnd_Pre();
dvander@592
    60
	void OnMessageEnd_Post();
dvander@592
    61
private:
faluco@593
    62
	void _DecRefCounter();
faluco@593
    63
private:
faluco@593
    64
	List<ListenerInfo *> m_msgHooks[255];
faluco@593
    65
	List<ListenerInfo *> m_msgIntercepts[255];
faluco@593
    66
	CStack<ListenerInfo *> m_FreeListeners;
dvander@592
    67
	unsigned char m_pBase[2500];
dvander@592
    68
	IRecipientFilter *m_CurRecFilter;
dvander@592
    69
	bf_write m_InterceptBuffer;
dvander@592
    70
	bf_write *m_OrigBuffer;
dvander@592
    71
	bf_read m_ReadBuffer;
dvander@592
    72
	size_t m_HookCount;
dvander@592
    73
	bool m_InHook;
faluco@597
    74
	bool m_BlockEndPost;
dvander@592
    75
dvander@592
    76
	Trie *m_Names;
dvander@592
    77
	CellRecipientFilter m_CellRecFilter;
dvander@592
    78
	bool m_InExec;
dvander@592
    79
	int m_CurFlags;
dvander@592
    80
	int m_CurId;
dvander@592
    81
};
dvander@592
    82
dvander@616
    83
extern UserMessages g_UserMsgs;
dvander@592
    84
dvander@592
    85
#endif //_INCLUDE_SOURCEMOD_CUSERMESSAGES_H_