core/EventManager.h
author David Anderson <dvander@alliedmods.net>
Fri Jun 01 02:30:29 2007 +0000 (2007-06-01)
changeset 868 bdbf922e246f
parent 713 7a8ac1106ace
child 1231 17badaf66ce4
permissions -rw-r--r--
-initial import of database natives + config
-initial import of completed database layer
-CreateIdentity now requires a non-optional second pointer. This breaks backwards compatibility for CreateIdentity(), however, this is not a function extension authors are supposed to be calling
ds@576
     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
 */
ds@576
    14
ds@582
    15
#ifndef _INCLUDE_SOURCEMOD_EVENTMANAGER_H_
ds@582
    16
#define _INCLUDE_SOURCEMOD_EVENTMANAGER_H_
ds@576
    17
ds@576
    18
#include "sm_globals.h"
ds@576
    19
#include "sourcemm_api.h"
ds@576
    20
#include "sm_trie.h"
ds@576
    21
#include <sh_list.h>
ds@577
    22
#include <sh_stack.h>
ds@576
    23
#include <IHandleSys.h>
ds@576
    24
#include <IForwardSys.h>
ds@576
    25
#include <IPluginSys.h>
ds@576
    26
ds@576
    27
using namespace SourceHook;
ds@576
    28
ds@576
    29
struct EventInfo
ds@576
    30
{
ds@576
    31
	IGameEvent *pEvent;
ds@577
    32
	IdentityToken_t *pOwner;
ds@576
    33
};
ds@576
    34
ds@576
    35
struct EventHook
ds@576
    36
{
ds@576
    37
	EventHook()
ds@576
    38
	{
ds@576
    39
		pPreHook = NULL;
ds@576
    40
		pPostHook = NULL;
ds@576
    41
		postCopy = false;
ds@684
    42
		pEventCopy = NULL;
ds@576
    43
		refCount = 0;
ds@576
    44
	}
ds@576
    45
	IChangeableForward *pPreHook;
ds@576
    46
	IChangeableForward *pPostHook;
ds@576
    47
	bool postCopy;
ds@684
    48
	IGameEvent *pEventCopy;
ds@576
    49
	unsigned int refCount;
ds@576
    50
};
ds@576
    51
ds@576
    52
enum EventHookMode
ds@576
    53
{
ds@576
    54
	EventHookMode_Pre,
ds@576
    55
	EventHookMode_Post,
ds@576
    56
	EventHookMode_PostNoCopy
ds@576
    57
};
ds@576
    58
ds@576
    59
enum EventHookError
ds@576
    60
{
ds@576
    61
	EventHookErr_Okay = 0,			/**< No error */
ds@576
    62
	EventHookErr_InvalidEvent,		/**< Specified event does not exist */
ds@576
    63
	EventHookErr_NotActive,			/**< Specified event has no active hook */
ds@576
    64
	EventHookErr_InvalidCallback,	/**< Specified event does not fire specified callback */ 
ds@576
    65
};
ds@576
    66
ds@576
    67
class EventManager :
ds@576
    68
	public SMGlobalClass,
ds@576
    69
	public IHandleTypeDispatch,
ds@576
    70
	public IPluginsListener,
ds@576
    71
	public IGameEventListener2
ds@576
    72
{
ds@576
    73
public:
ds@576
    74
	EventManager();
ds@576
    75
	~EventManager();
ds@576
    76
public: // SMGlobalClass
ds@576
    77
	void OnSourceModAllInitialized();
ds@576
    78
	void OnSourceModShutdown();
ds@576
    79
public: // IHandleTypeDispatch
ds@576
    80
	void OnHandleDestroy(HandleType_t type, void *object);
ds@576
    81
public: // IPluginsListener
ds@576
    82
	void OnPluginUnloaded(IPlugin *plugin);
ds@576
    83
public: // IGameEventListener2
ds@576
    84
	void FireGameEvent(IGameEvent *pEvent);
ds@576
    85
public:
ds@576
    86
	/**
ds@576
    87
	 * Get the 'GameEvent' handle type ID.
ds@576
    88
	 */
ds@576
    89
	inline HandleType_t GetHandleType()
ds@576
    90
	{
ds@577
    91
		return m_EventType;
ds@576
    92
	}
ds@576
    93
public:
ds@576
    94
	EventHookError HookEvent(const char *name, IPluginFunction *pFunction, EventHookMode mode=EventHookMode_Post);
ds@576
    95
	EventHookError UnhookEvent(const char *name, IPluginFunction *pFunction, EventHookMode mode=EventHookMode_Post);
ds@713
    96
	EventInfo *CreateEvent(IPluginContext *pContext, const char *name, bool force=false);
ds@712
    97
	void FireEvent(EventInfo *pInfo, bool bDontBroadcast=false);
ds@687
    98
	void CancelCreatedEvent(EventInfo *pInfo);
ds@576
    99
private: // IGameEventManager2 hooks
ds@576
   100
	bool OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast);
ds@576
   101
	bool OnFireEvent_Post(IGameEvent *pEvent, bool bDontBroadcast);
ds@576
   102
private:
ds@576
   103
	HandleType_t m_EventType;
ds@576
   104
	Trie *m_EventHooks;
ds@577
   105
	CStack<EventInfo *> m_FreeEvents;
ds@684
   106
	CStack<const char *> m_EventNames;
ds@576
   107
};
ds@576
   108
ds@576
   109
extern EventManager g_EventManager;
ds@576
   110
ds@582
   111
#endif // _INCLUDE_SOURCEMOD_EVENTMANAGER_H_