core/UserMessages.h
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
child 2289 44045ead61cd
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
ds@1952
     1
/**
ds@1952
     2
 * vim: set ts=4 :
ds@1952
     3
 * =============================================================================
ds@1952
     4
 * SourceMod
ds@1952
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
ds@1952
     6
 * =============================================================================
ds@1952
     7
 *
ds@1952
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1952
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1952
    10
 * Free Software Foundation.
ds@1952
    11
 * 
ds@1952
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1952
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1952
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1952
    15
 * details.
ds@1952
    16
 *
ds@1952
    17
 * You should have received a copy of the GNU General Public License along with
ds@1952
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1952
    19
 *
ds@1952
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1952
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1952
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1952
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1952
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1952
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1952
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1952
    27
 * or <http://www.sourcemod.net/license.php>.
ds@1952
    28
 *
ds@1952
    29
 * Version: $Id$
ds@1952
    30
 */
ds@1952
    31
ds@1952
    32
#ifndef _INCLUDE_SOURCEMOD_CUSERMESSAGES_H_
ds@1952
    33
#define _INCLUDE_SOURCEMOD_CUSERMESSAGES_H_
ds@1952
    34
ds@1952
    35
#include "ShareSys.h"
ds@1952
    36
#include <IUserMessages.h>
ds@1952
    37
#include "sourcemm_api.h"
ds@1952
    38
#include "sm_trie.h"
ds@1952
    39
#include "CellRecipientFilter.h"
ds@1952
    40
ds@1952
    41
using namespace SourceHook;
ds@1952
    42
using namespace SourceMod;
ds@1952
    43
ds@1952
    44
#define INVALID_MESSAGE_ID -1
ds@1952
    45
ds@1952
    46
struct ListenerInfo
ds@1952
    47
{
ds@1952
    48
	IUserMessageListener *Callback;
ds@1952
    49
	bool IsHooked;
ds@1952
    50
	bool KillMe;
ds@1952
    51
};
ds@1952
    52
ds@1952
    53
typedef List<ListenerInfo *> MsgList;
ds@1952
    54
typedef List<ListenerInfo *>::iterator MsgIter;
ds@1952
    55
ds@1952
    56
class UserMessages : 
ds@1952
    57
	public IUserMessages,
ds@1952
    58
	public SMGlobalClass
ds@1952
    59
{
ds@1952
    60
public:
ds@1952
    61
	UserMessages();
ds@1952
    62
	~UserMessages();
ds@1952
    63
public: //SMGlobalClass
ds@1952
    64
	void OnSourceModStartup(bool late);
ds@1952
    65
	void OnSourceModAllInitialized();
ds@1952
    66
	void OnSourceModAllShutdown();
ds@1952
    67
public: //IUserMessages
ds@1952
    68
	int GetMessageIndex(const char *msg);
ds@1952
    69
	bool GetMessageName(int msgid, char *buffer, size_t maxlength) const;
ds@1952
    70
	bool HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
ds@1952
    71
	bool UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
ds@1952
    72
	bf_write *StartMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags);
ds@1952
    73
	bool EndMessage();
ds@1952
    74
public:
ds@1952
    75
	bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type);
ds@1952
    76
	bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type);
ds@1952
    77
	void OnMessageEnd_Pre();
ds@1952
    78
	void OnMessageEnd_Post();
ds@1952
    79
private:
ds@1952
    80
	void _DecRefCounter();
ds@1952
    81
private:
ds@1952
    82
	List<ListenerInfo *> m_msgHooks[255];
ds@1952
    83
	List<ListenerInfo *> m_msgIntercepts[255];
ds@1952
    84
	CStack<ListenerInfo *> m_FreeListeners;
ds@1952
    85
	unsigned char m_pBase[2500];
ds@1952
    86
	IRecipientFilter *m_CurRecFilter;
ds@1952
    87
	bf_write m_InterceptBuffer;
ds@1952
    88
	bf_write *m_OrigBuffer;
ds@1952
    89
	bf_read m_ReadBuffer;
ds@1952
    90
	size_t m_HookCount;
ds@1952
    91
	bool m_InHook;
ds@1952
    92
	bool m_BlockEndPost;
ds@1952
    93
	bool m_FallbackSearch;
ds@1952
    94
ds@1952
    95
	Trie *m_Names;
ds@1952
    96
	CellRecipientFilter m_CellRecFilter;
ds@1952
    97
	bool m_InExec;
ds@1952
    98
	int m_CurFlags;
ds@1952
    99
	int m_CurId;
ds@1952
   100
};
ds@1952
   101
ds@1952
   102
extern UserMessages g_UserMsgs;
ds@1952
   103
ds@1952
   104
#endif //_INCLUDE_SOURCEMOD_CUSERMESSAGES_H_