|
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_ |