extensions/sdkhooks/extension.h
author GoD-Tony <aangione@gmail.com>
Sun Aug 04 10:03:40 2013 -0400 (2013-08-04)
changeset 3971 d2e8100b2814
parent 3961 0dc477c29792
child 4180 71e9a3d2d38f
permissions -rw-r--r--
Added ISDKHooks interface with entity listeners (bug 5602, r=psychonic).
skamonkey@3767
     1
#ifndef _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
skamonkey@3767
     2
#define _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
skamonkey@3767
     3
skamonkey@3767
     4
#include "smsdk_ext.h"
aangione@3971
     5
#include <ISDKHooks.h>
skamonkey@3767
     6
#include <IBinTools.h>
skamonkey@3767
     7
#include <convar.h>
aangione@3971
     8
#include <sh_list.h>
skamonkey@3767
     9
skamonkey@3767
    10
#include <iplayerinfo.h>
skamonkey@3767
    11
#include <shareddefs.h>
skamonkey@3767
    12
skamonkey@3767
    13
#include "takedamageinfohack.h"
skamonkey@3767
    14
skamonkey@3767
    15
#ifndef METAMOD_PLAPI_VERSION
skamonkey@3767
    16
#define GetCGlobals pGlobals
skamonkey@3767
    17
#define GetEngineFactory engineFactory
skamonkey@3767
    18
#define GetServerFactory serverFactory
skamonkey@3767
    19
#endif
skamonkey@3767
    20
skamonkey@3767
    21
#if SOURCE_ENGINE >= SE_CSS && SOURCE_ENGINE != SE_LEFT4DEAD
skamonkey@3767
    22
#define GETMAXHEALTH_IS_VIRTUAL
skamonkey@3767
    23
#endif
skamonkey@3961
    24
#if SOURCE_ENGINE != SE_HL2DM && SOURCE_ENGINE != SE_DODS && SOURCE_ENGINE != SE_CSS && SOURCE_ENGINE != SE_TF2 && SOURCE_ENGINE != SE_LEFT4DEAD2 && SOURCE_ENGINE != SE_CSGO && SOURCE_ENGINE != SE_NUCLEARDAWN
skamonkey@3767
    25
#define GAMEDESC_CAN_CHANGE
skamonkey@3767
    26
#endif
skamonkey@3767
    27
skamonkey@3767
    28
skamonkey@3767
    29
/**
skamonkey@3767
    30
 * Globals
skamonkey@3767
    31
 */
skamonkey@3767
    32
skamonkey@3767
    33
struct HookTypeData
skamonkey@3767
    34
{
skamonkey@3767
    35
	const char *name;
skamonkey@3767
    36
	const char *dtReq;
skamonkey@3767
    37
	bool supported;
skamonkey@3767
    38
};
skamonkey@3767
    39
skamonkey@3767
    40
enum SDKHookType
skamonkey@3767
    41
{
skamonkey@3767
    42
	SDKHook_EndTouch,
skamonkey@3767
    43
	SDKHook_FireBulletsPost,
skamonkey@3767
    44
	SDKHook_OnTakeDamage,
skamonkey@3767
    45
	SDKHook_OnTakeDamagePost,
skamonkey@3767
    46
	SDKHook_PreThink,
skamonkey@3767
    47
	SDKHook_PostThink,
skamonkey@3767
    48
	SDKHook_SetTransmit,
skamonkey@3767
    49
	SDKHook_Spawn,
skamonkey@3767
    50
	SDKHook_StartTouch,
skamonkey@3767
    51
	SDKHook_Think,
skamonkey@3767
    52
	SDKHook_Touch,
skamonkey@3767
    53
	SDKHook_TraceAttack,
skamonkey@3767
    54
	SDKHook_TraceAttackPost,
skamonkey@3767
    55
	SDKHook_WeaponCanSwitchTo,
skamonkey@3767
    56
	SDKHook_WeaponCanUse,
skamonkey@3767
    57
	SDKHook_WeaponDrop,
skamonkey@3767
    58
	SDKHook_WeaponEquip,
skamonkey@3767
    59
	SDKHook_WeaponSwitch,
skamonkey@3767
    60
	SDKHook_ShouldCollide,
skamonkey@3767
    61
	SDKHook_PreThinkPost,
skamonkey@3767
    62
	SDKHook_PostThinkPost,
skamonkey@3767
    63
	SDKHook_ThinkPost,
skamonkey@3767
    64
	SDKHook_EndTouchPost,
skamonkey@3767
    65
	SDKHook_GroundEntChangedPost,
skamonkey@3767
    66
	SDKHook_SpawnPost,
skamonkey@3767
    67
	SDKHook_StartTouchPost,
skamonkey@3767
    68
	SDKHook_TouchPost,
skamonkey@3767
    69
	SDKHook_VPhysicsUpdate,
skamonkey@3767
    70
	SDKHook_VPhysicsUpdatePost,
skamonkey@3767
    71
	SDKHook_WeaponCanSwitchToPost,
skamonkey@3767
    72
	SDKHook_WeaponCanUsePost,
skamonkey@3767
    73
	SDKHook_WeaponDropPost,
skamonkey@3767
    74
	SDKHook_WeaponEquipPost,
skamonkey@3767
    75
	SDKHook_WeaponSwitchPost,
skamonkey@3767
    76
	SDKHook_Use,
skamonkey@3767
    77
	SDKHook_UsePost,
skamonkey@3767
    78
	SDKHook_Reload,
skamonkey@3767
    79
	SDKHook_ReloadPost,
skamonkey@3767
    80
	SDKHook_GetMaxHealth,
skamonkey@3767
    81
	SDKHook_MAXHOOKS
skamonkey@3767
    82
};
skamonkey@3767
    83
skamonkey@3767
    84
enum HookReturn
skamonkey@3767
    85
{
skamonkey@3767
    86
	HookRet_Successful,
skamonkey@3767
    87
	HookRet_InvalidEntity,
skamonkey@3767
    88
	HookRet_InvalidHookType,
skamonkey@3767
    89
	HookRet_NotSupported,
skamonkey@3767
    90
	HookRet_BadEntForHookType,
skamonkey@3767
    91
};
skamonkey@3767
    92
skamonkey@3767
    93
#if SOURCE_ENGINE >= SE_CSS
skamonkey@3767
    94
typedef void *(*ReticulateSplines)();
skamonkey@3767
    95
#endif
skamonkey@3767
    96
skamonkey@3767
    97
/**
skamonkey@3767
    98
 * Classes
skamonkey@3767
    99
 */
skamonkey@3767
   100
class IPhysicsObject;
skamonkey@3767
   101
typedef CBaseEntity CBaseCombatWeapon;
skamonkey@3767
   102
skamonkey@3767
   103
class HookList
skamonkey@3767
   104
{
skamonkey@3767
   105
public:
skamonkey@3767
   106
	int entity;
skamonkey@3767
   107
	SDKHookType type;
skamonkey@3767
   108
	IPluginFunction *callback;
skamonkey@3767
   109
};
skamonkey@3767
   110
skamonkey@3767
   111
class IEntityListener
skamonkey@3767
   112
{
skamonkey@3767
   113
public:
skamonkey@3767
   114
	virtual void OnEntityCreated( CBaseEntity *pEntity ) {};
skamonkey@3767
   115
	virtual void OnEntitySpawned( CBaseEntity *pEntity ) {};
skamonkey@3767
   116
	virtual void OnEntityDeleted( CBaseEntity *pEntity ) {};
skamonkey@3767
   117
};
skamonkey@3767
   118
skamonkey@3767
   119
class SDKHooks :
skamonkey@3767
   120
	public SDKExtension,
skamonkey@3767
   121
	public IConCommandBaseAccessor,
skamonkey@3767
   122
	public IPluginsListener,
skamonkey@3767
   123
	public IFeatureProvider,
skamonkey@3767
   124
	public IEntityListener,
aangione@3971
   125
	public IClientListener,
aangione@3971
   126
	public ISDKHooks
skamonkey@3767
   127
{
skamonkey@3767
   128
public:
skamonkey@3767
   129
	/**
skamonkey@3767
   130
	 * @brief This is called after the initial loading sequence has been processed.
skamonkey@3767
   131
	 *
skamonkey@3767
   132
	 * @param error		Error message buffer.
skamonkey@3767
   133
	 * @param maxlength	Size of error message buffer.
skamonkey@3767
   134
	 * @param late		Whether or not the module was loaded after map load.
skamonkey@3767
   135
	 * @return			True to succeed loading, false to fail.
skamonkey@3767
   136
	 */
skamonkey@3767
   137
	virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late);
skamonkey@3767
   138
	
skamonkey@3767
   139
	/**
skamonkey@3767
   140
	 * @brief This is called right before the extension is unloaded.
skamonkey@3767
   141
	 */
skamonkey@3767
   142
	virtual void SDK_OnUnload();
skamonkey@3767
   143
skamonkey@3767
   144
	/**
skamonkey@3767
   145
	 * @brief This is called once all known extensions have been loaded.
skamonkey@3767
   146
	 * Note: It is is a good idea to add natives here, if any are provided.
skamonkey@3767
   147
	 */
skamonkey@3767
   148
	virtual void SDK_OnAllLoaded();
skamonkey@3767
   149
skamonkey@3767
   150
	/**
skamonkey@3767
   151
	 * @brief Called when the pause state is changed.
skamonkey@3767
   152
	 */
skamonkey@3767
   153
	//virtual void SDK_OnPauseChange(bool paused);
skamonkey@3767
   154
skamonkey@3767
   155
	/**
skamonkey@3767
   156
	 * @brief this is called when Core wants to know if your extension is working.
skamonkey@3767
   157
	 *
skamonkey@3767
   158
	 * @param error		Error message buffer.
skamonkey@3767
   159
	 * @param maxlength	Size of error message buffer.
skamonkey@3767
   160
	 * @return			True if working, false otherwise.
skamonkey@3767
   161
	 */
skamonkey@3767
   162
	//virtual bool QueryRunning(char *error, size_t maxlength);
januk@3774
   163
januk@3774
   164
	/** Returns version string */
januk@3774
   165
	virtual const char *GetExtensionVerString();
januk@3774
   166
januk@3774
   167
	/** Returns date string */
januk@3774
   168
	virtual const char *GetExtensionDateString();
januk@3774
   169
skamonkey@3767
   170
public:
skamonkey@3767
   171
#if defined SMEXT_CONF_METAMOD
skamonkey@3767
   172
	/**
skamonkey@3767
   173
	 * @brief Called when Metamod is attached, before the extension version is called.
skamonkey@3767
   174
	 *
skamonkey@3767
   175
	 * @param error			Error buffer.
skamonkey@3767
   176
	 * @param maxlength		Maximum size of error buffer.
skamonkey@3767
   177
	 * @param late			Whether or not Metamod considers this a late load.
skamonkey@3767
   178
	 * @return				True to succeed, false to fail.
skamonkey@3767
   179
	 */
skamonkey@3767
   180
	virtual bool SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late);
skamonkey@3767
   181
skamonkey@3767
   182
	/**
skamonkey@3767
   183
	 * @brief Called when Metamod is detaching, after the extension version is called.
skamonkey@3767
   184
	 * NOTE: By default this is blocked unless sent from SourceMod.
skamonkey@3767
   185
	 *
skamonkey@3767
   186
	 * @param error			Error buffer.
skamonkey@3767
   187
	 * @param maxlength		Maximum size of error buffer.
skamonkey@3767
   188
	 * @return				True to succeed, false to fail.
skamonkey@3767
   189
	 */
skamonkey@3767
   190
	//virtual bool SDK_OnMetamodUnload(char *error, size_t maxlength);
skamonkey@3767
   191
skamonkey@3767
   192
	/**
skamonkey@3767
   193
	 * @brief Called when Metamod's pause state is changing.
skamonkey@3767
   194
	 * NOTE: By default this is blocked unless sent from SourceMod.
skamonkey@3767
   195
	 *
skamonkey@3767
   196
	 * @param paused		Pause state being set.
skamonkey@3767
   197
	 * @param error			Error buffer.
skamonkey@3767
   198
	 * @param maxlength		Maximum size of error buffer.
skamonkey@3767
   199
	 * @return				True to succeed, false to fail.
skamonkey@3767
   200
	 */
skamonkey@3767
   201
	//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
skamonkey@3767
   202
#endif
skamonkey@3767
   203
skamonkey@3767
   204
public:  // IPluginsListener
skamonkey@3767
   205
	virtual void OnPluginLoaded(IPlugin *plugin);
skamonkey@3767
   206
	virtual void OnPluginUnloaded(IPlugin *plugin);
skamonkey@3767
   207
skamonkey@3767
   208
public:  // IConCommandBaseAccessor
skamonkey@3767
   209
	virtual bool RegisterConCommandBase(ConCommandBase *pVar);
skamonkey@3767
   210
skamonkey@3767
   211
public:  // IFeatureProvider
skamonkey@3767
   212
	virtual FeatureStatus GetFeatureStatus(FeatureType type, const char *name);
skamonkey@3767
   213
skamonkey@3767
   214
public:  // IEntityListener
skamonkey@3767
   215
	virtual void OnEntityCreated(CBaseEntity *pEntity);
skamonkey@3767
   216
	virtual void OnEntityDeleted(CBaseEntity *pEntity);
skamonkey@3767
   217
skamonkey@3767
   218
public:  // IClientListener
skamonkey@3767
   219
	virtual void OnClientPutInServer(int client);
skamonkey@3767
   220
aangione@3971
   221
public:  // ISDKHooks
aangione@3971
   222
	virtual void AddEntityListener(ISMEntityListener *listener);
aangione@3971
   223
	virtual void RemoveEntityListener(ISMEntityListener *listener);
aangione@3971
   224
aangione@3971
   225
private:
aangione@3971
   226
	SourceHook::List<ISMEntityListener *> m_EntListeners;
aangione@3971
   227
skamonkey@3767
   228
public:
skamonkey@3767
   229
	/**
skamonkey@3767
   230
	 * Functions
skamonkey@3767
   231
	 */
skamonkey@3767
   232
	cell_t Call(int entity, SDKHookType type, int other=-2);
skamonkey@3767
   233
	cell_t Call(CBaseEntity *pEnt, SDKHookType type, int other=-2);
skamonkey@3767
   234
	cell_t Call(CBaseEntity *pEnt, SDKHookType type, CBaseEntity *pOther);
skamonkey@3767
   235
	void SetupHooks();
skamonkey@3767
   236
skamonkey@3767
   237
	HookReturn Hook(int entity, SDKHookType type, IPluginFunction *callback);
skamonkey@3767
   238
	void Unhook(int index);
skamonkey@3767
   239
skamonkey@3767
   240
	/**
skamonkey@3767
   241
	 * IServerGameDLL & IVEngineServer Hook Handlers
skamonkey@3767
   242
	 */
skamonkey@3767
   243
#ifdef GAMEDESC_CAN_CHANGE
skamonkey@3767
   244
	const char *Hook_GetGameDescription();
skamonkey@3767
   245
#endif
skamonkey@3767
   246
	const char *Hook_GetMapEntitiesString();
skamonkey@3767
   247
	bool Hook_LevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background);
skamonkey@3767
   248
skamonkey@3767
   249
	/**
skamonkey@3767
   250
	 * CBaseEntity Hook Handlers
skamonkey@3767
   251
	 */
skamonkey@3767
   252
	void Hook_EndTouch(CBaseEntity *pOther);
skamonkey@3767
   253
	void Hook_EndTouchPost(CBaseEntity *pOther);
skamonkey@3767
   254
	void Hook_FireBulletsPost(const FireBulletsInfo_t &info);
skamonkey@3767
   255
#ifdef GETMAXHEALTH_IS_VIRTUAL
skamonkey@3767
   256
	int Hook_GetMaxHealth();
skamonkey@3767
   257
#endif
skamonkey@3767
   258
	void Hook_GroundEntChangedPost();
skamonkey@3767
   259
	int Hook_OnTakeDamage(CTakeDamageInfoHack &info);
skamonkey@3767
   260
	int Hook_OnTakeDamagePost(CTakeDamageInfoHack &info);
skamonkey@3767
   261
	void Hook_PreThink();
skamonkey@3767
   262
	void Hook_PreThinkPost();
skamonkey@3767
   263
	void Hook_PostThink();
skamonkey@3767
   264
	void Hook_PostThinkPost();
skamonkey@3767
   265
	bool Hook_Reload();
skamonkey@3767
   266
	bool Hook_ReloadPost();
skamonkey@3767
   267
	void Hook_SetTransmit(CCheckTransmitInfo *pInfo, bool bAlways);
skamonkey@3767
   268
	bool Hook_ShouldCollide(int collisonGroup, int contentsMask);
skamonkey@3767
   269
	void Hook_Spawn();
skamonkey@3767
   270
	void Hook_SpawnPost();
skamonkey@3767
   271
	void Hook_StartTouch(CBaseEntity *pOther);
skamonkey@3767
   272
	void Hook_StartTouchPost(CBaseEntity *pOther);
skamonkey@3767
   273
	void Hook_Think();
skamonkey@3767
   274
	void Hook_ThinkPost();
skamonkey@3767
   275
	void Hook_Touch(CBaseEntity *pOther);
skamonkey@3767
   276
	void Hook_TouchPost(CBaseEntity *pOther);
skamonkey@3961
   277
#if SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_TF2
skamonkey@3767
   278
	void Hook_TraceAttack(CTakeDamageInfoHack &info, const Vector &vecDir, trace_t *ptr, void *pUnknownJK);
skamonkey@3767
   279
	void Hook_TraceAttackPost(CTakeDamageInfoHack &info, const Vector &vecDir, trace_t *ptr, void *pUnknownJK);
skamonkey@3767
   280
#else
skamonkey@3767
   281
	void Hook_TraceAttack(CTakeDamageInfoHack &info, const Vector &vecDir, trace_t *ptr);
skamonkey@3767
   282
	void Hook_TraceAttackPost(CTakeDamageInfoHack &info, const Vector &vecDir, trace_t *ptr);
skamonkey@3767
   283
#endif
skamonkey@3767
   284
	void Hook_UpdateOnRemove();
skamonkey@3767
   285
	void Hook_Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
skamonkey@3767
   286
	void Hook_UsePost(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
skamonkey@3767
   287
	void Hook_VPhysicsUpdate(IPhysicsObject *pPhysics);
skamonkey@3767
   288
	void Hook_VPhysicsUpdatePost(IPhysicsObject *pPhysics);
skamonkey@3767
   289
	bool Hook_WeaponCanSwitchTo(CBaseCombatWeapon *pWeapon);
skamonkey@3767
   290
	bool Hook_WeaponCanSwitchToPost(CBaseCombatWeapon *pWeapon);
skamonkey@3767
   291
	bool Hook_WeaponCanUse(CBaseCombatWeapon *pWeapon);
skamonkey@3767
   292
	bool Hook_WeaponCanUsePost(CBaseCombatWeapon *pWeapon);
skamonkey@3767
   293
	void Hook_WeaponDrop(CBaseCombatWeapon *pWeapon, const Vector *pvecTarget, const Vector *pVelocity);
skamonkey@3767
   294
	void Hook_WeaponDropPost(CBaseCombatWeapon *pWeapon, const Vector *pvecTarget, const Vector *pVelocity);
skamonkey@3767
   295
	void Hook_WeaponEquip(CBaseCombatWeapon *pWeapon);
skamonkey@3767
   296
	void Hook_WeaponEquipPost(CBaseCombatWeapon *pWeapon);
skamonkey@3767
   297
	bool Hook_WeaponSwitch(CBaseCombatWeapon *pWeapon, int viewmodelindex);
skamonkey@3767
   298
	bool Hook_WeaponSwitchPost(CBaseCombatWeapon *pWeapon, int viewmodelindex);
skamonkey@3767
   299
	
skamonkey@3767
   300
private:
skamonkey@3767
   301
	void RemoveEntityHooks(CBaseEntity *pEnt);
skamonkey@3767
   302
};
skamonkey@3767
   303
skamonkey@3767
   304
extern CGlobalVars *gpGlobals;
skamonkey@3767
   305
extern CUtlVector<HookList> g_HookList;
skamonkey@3767
   306
skamonkey@3767
   307
extern ICvar *icvar;
skamonkey@3767
   308
#endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_