3 * ===============================================================
4 * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC.
6 * ===============================================================
8 * This file is part of the SourceMod/SourcePawn SDK. This file may only be used
9 * or modified under the Terms and Conditions of its License Agreement, which is found
10 * in LICENSE.txt. The Terms and Conditions for making SourceMod extensions/plugins
11 * may change at any time. To view the latest information, see:
12 * http://www.sourcemod.net/license.php
19 #include "smsdk_ext.h"
23 * @brief Contains wrappers for making Extensions easier to write.
26 IShareSys *g_pShareSys = NULL; /**< Share system */
27 IExtension *myself = NULL; /**< Ourself */
28 IHandleSys *g_pHandleSys = NULL; /**< Handle system */
29 ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
30 IForwardManager *g_pForwards = NULL; /**< Forward system */
32 /** Exports the main interface */
33 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
35 return g_pExtensionIface;
38 SDKExtension::SDKExtension()
40 #if defined SMEXT_CONF_METAMOD
41 m_SourceMMLoaded = false;
42 m_WeAreUnloaded = false;
43 m_WeGotPauseChange = false;
47 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t err_max, bool late)
52 #if defined SMEXT_CONF_METAMOD
53 m_WeAreUnloaded = true;
55 if (!m_SourceMMLoaded)
59 snprintf(error, err_max, "Metamod attach failed");
65 SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
66 SM_GET_IFACE(SOURCEMOD, g_pSM);
67 SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
69 if (SDK_OnLoad(error, err_max, late))
71 #if defined SMEXT_CONF_METAMOD
72 m_WeAreUnloaded = true;
80 bool SDKExtension::IsMetamodExtension()
82 #if defined SMEXT_CONF_METAMOD
89 void SDKExtension::OnExtensionPauseChange(bool state)
91 #if defined SMEXT_CONF_METAMOD
92 m_WeGotPauseChange = true;
94 SDK_OnPauseChange(state);
97 void SDKExtension::OnExtensionsAllLoaded()
102 void SDKExtension::OnExtensionUnload()
104 #if defined SMEXT_CONF_METAMOD
105 m_WeAreUnloaded = true;
110 const char *SDKExtension::GetExtensionAuthor()
112 return SMEXT_CONF_AUTHOR;
115 const char *SDKExtension::GetExtensionDateString()
117 return SMEXT_CONF_DATESTRING;
120 const char *SDKExtension::GetExtensionDescription()
122 return SMEXT_CONF_DESCRIPTION;
125 const char *SDKExtension::GetExtensionVerString()
127 return SMEXT_CONF_VERSION;
130 const char *SDKExtension::GetExtensionName()
132 return SMEXT_CONF_NAME;
135 const char *SDKExtension::GetExtensionTag()
137 return SMEXT_CONF_LOGTAG;
140 const char *SDKExtension::GetExtensionURL()
142 return SMEXT_CONF_URL;
145 bool SDKExtension::SDK_OnLoad(char *error, size_t err_max, bool late)
150 void SDKExtension::SDK_OnUnload()
154 void SDKExtension::SDK_OnPauseChange(bool paused)
158 void SDKExtension::SDK_OnAllLoaded()
162 #if defined SMEXT_CONF_METAMOD
164 PluginId g_PLID = 0; /**< Metamod plugin ID */
165 ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
166 SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
167 ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
169 IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
170 IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
172 /** Exposes the extension to Metamod */
173 SMM_API void *PL_EXPOSURE(const char *name, int *code)
175 if (name && !strcmp(name, PLAPI_NAME))
181 return static_cast<void *>(g_pExtensionIface);
186 *code = IFACE_FAILED;
192 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
196 GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
197 GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
199 m_SourceMMLoaded = true;
201 return SDK_OnMetamodLoad(error, maxlen, late);
204 bool SDKExtension::Unload(char *error, size_t maxlen)
206 if (!m_WeAreUnloaded)
210 snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
215 return SDK_OnMetamodUnload(error, maxlen);
218 bool SDKExtension::Pause(char *error, size_t maxlen)
220 if (!m_WeGotPauseChange)
224 snprintf(error, maxlen, "This extension must be paused by SourceMod.");
229 m_WeGotPauseChange = false;
231 return SDK_OnMetamodPauseChange(true, error, maxlen);
234 bool SDKExtension::Unpause(char *error, size_t maxlen)
236 if (!m_WeGotPauseChange)
240 snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
245 m_WeGotPauseChange = false;
247 return SDK_OnMetamodPauseChange(false, error, maxlen);
250 const char *SDKExtension::GetAuthor()
252 return GetExtensionAuthor();
255 const char *SDKExtension::GetDate()
257 return GetExtensionDateString();
260 const char *SDKExtension::GetDescription()
262 return GetExtensionDescription();
265 const char *SDKExtension::GetLicense()
267 return SMEXT_CONF_LICENSE;
270 const char *SDKExtension::GetLogTag()
272 return GetExtensionTag();
275 const char *SDKExtension::GetName()
277 return GetExtensionName();
280 const char *SDKExtension::GetURL()
282 return GetExtensionURL();
285 const char *SDKExtension::GetVersion()
287 return GetExtensionVerString();
290 bool SDKExtension::SDK_OnMetamodLoad(char *error, size_t err_max, bool late)
295 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t err_max)
300 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t err_max)
307 /* Overload a few things to prevent libstdc++ linking */
308 #if defined __linux__
309 extern "C" void __cxa_pure_virtual(void)
313 void *operator new(size_t size)
318 void *operator new[](size_t size)
323 void operator delete(void *ptr)
328 void operator delete[](void * ptr)