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
9 * used or modified under the Terms and Conditions of its License Agreement,
10 * which is found in public/licenses/LICENSE.txt. As of this notice, derivative
11 * works must be licensed under the GNU General Public License (version 2 or
12 * greater). A copy of the GPL is included under public/licenses/GPL.txt.
14 * To view the latest information, see: http://www.sourcemod.net/license.php
21 #include "smsdk_ext.h"
25 * @brief Contains wrappers for making Extensions easier to write.
28 IExtension *myself = NULL; /**< Ourself */
29 IShareSys *g_pShareSys = NULL; /**< Share system */
30 IShareSys *sharesys = NULL; /**< Share system */
31 ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
32 ISourceMod *smutils = NULL; /**< SourceMod helpers */
34 #if defined SMEXT_ENABLE_FORWARDSYS
35 IForwardManager *g_pForwards = NULL; /**< Forward system */
36 IForwardManager *forwards = NULL; /**< Forward system */
38 #if defined SMEXT_ENABLE_HANDLESYS
39 IHandleSys *g_pHandleSys = NULL; /**< Handle system */
40 IHandleSys *handlesys = NULL; /**< Handle system */
42 #if defined SMEXT_ENABLE_PLAYERHELPERS
43 IPlayerManager *playerhelpers = NULL; /**< Player helpers */
44 #endif //SMEXT_ENABLE_PLAYERHELPERS
45 #if defined SMEXT_ENABLE_DBMANAGER
46 IDBManager *dbi = NULL; /**< DB Manager */
47 #endif //SMEXT_ENABLE_DBMANAGER
48 #if defined SMEXT_ENABLE_GAMECONF
49 IGameConfigManager *gameconfs = NULL; /**< Game config manager */
50 #endif //SMEXT_ENABLE_DBMANAGER
52 /** Exports the main interface */
53 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
55 return g_pExtensionIface;
58 SDKExtension::SDKExtension()
60 #if defined SMEXT_CONF_METAMOD
61 m_SourceMMLoaded = false;
62 m_WeAreUnloaded = false;
63 m_WeGotPauseChange = false;
67 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
69 g_pShareSys = sharesys = sys;
72 #if defined SMEXT_CONF_METAMOD
73 m_WeAreUnloaded = true;
75 if (!m_SourceMMLoaded)
79 snprintf(error, maxlength, "Metamod attach failed");
84 SM_GET_IFACE(SOURCEMOD, g_pSM);
86 #if defined SMEXT_ENABLE_HANDLESYS
87 SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
88 handlesys = g_pHandleSys;
90 #if defined SMEXT_ENABLE_FORWARDSYS
91 SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
92 forwards = g_pForwards;
94 #if defined SMEXT_ENABLE_PLAYERHELPERS
95 SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
97 #if defined SMEXT_ENABLE_DBMANAGER
98 SM_GET_IFACE(DBI, dbi);
100 #if defined SMEXT_ENABLE_GAMECONF
101 SM_GET_IFACE(GAMECONFIG, gameconfs);
104 if (SDK_OnLoad(error, maxlength, late))
106 #if defined SMEXT_CONF_METAMOD
107 m_WeAreUnloaded = true;
115 bool SDKExtension::IsMetamodExtension()
117 #if defined SMEXT_CONF_METAMOD
124 void SDKExtension::OnExtensionPauseChange(bool state)
126 #if defined SMEXT_CONF_METAMOD
127 m_WeGotPauseChange = true;
129 SDK_OnPauseChange(state);
132 void SDKExtension::OnExtensionsAllLoaded()
137 void SDKExtension::OnExtensionUnload()
139 #if defined SMEXT_CONF_METAMOD
140 m_WeAreUnloaded = true;
145 const char *SDKExtension::GetExtensionAuthor()
147 return SMEXT_CONF_AUTHOR;
150 const char *SDKExtension::GetExtensionDateString()
152 return SMEXT_CONF_DATESTRING;
155 const char *SDKExtension::GetExtensionDescription()
157 return SMEXT_CONF_DESCRIPTION;
160 const char *SDKExtension::GetExtensionVerString()
162 return SMEXT_CONF_VERSION;
165 const char *SDKExtension::GetExtensionName()
167 return SMEXT_CONF_NAME;
170 const char *SDKExtension::GetExtensionTag()
172 return SMEXT_CONF_LOGTAG;
175 const char *SDKExtension::GetExtensionURL()
177 return SMEXT_CONF_URL;
180 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
185 void SDKExtension::SDK_OnUnload()
189 void SDKExtension::SDK_OnPauseChange(bool paused)
193 void SDKExtension::SDK_OnAllLoaded()
197 #if defined SMEXT_CONF_METAMOD
199 PluginId g_PLID = 0; /**< Metamod plugin ID */
200 ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
201 SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
202 ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
204 IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
205 IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
207 /** Exposes the extension to Metamod */
208 SMM_API void *PL_EXPOSURE(const char *name, int *code)
210 if (name && !strcmp(name, PLAPI_NAME))
216 return static_cast<void *>(g_pExtensionIface);
221 *code = IFACE_FAILED;
227 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
231 GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
232 GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
234 m_SourceMMLoaded = true;
236 return SDK_OnMetamodLoad(ismm, error, maxlen, late);
239 bool SDKExtension::Unload(char *error, size_t maxlen)
241 if (!m_WeAreUnloaded)
245 snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
250 return SDK_OnMetamodUnload(error, maxlen);
253 bool SDKExtension::Pause(char *error, size_t maxlen)
255 if (!m_WeGotPauseChange)
259 snprintf(error, maxlen, "This extension must be paused by SourceMod.");
264 m_WeGotPauseChange = false;
266 return SDK_OnMetamodPauseChange(true, error, maxlen);
269 bool SDKExtension::Unpause(char *error, size_t maxlen)
271 if (!m_WeGotPauseChange)
275 snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
280 m_WeGotPauseChange = false;
282 return SDK_OnMetamodPauseChange(false, error, maxlen);
285 const char *SDKExtension::GetAuthor()
287 return GetExtensionAuthor();
290 const char *SDKExtension::GetDate()
292 return GetExtensionDateString();
295 const char *SDKExtension::GetDescription()
297 return GetExtensionDescription();
300 const char *SDKExtension::GetLicense()
302 return SMEXT_CONF_LICENSE;
305 const char *SDKExtension::GetLogTag()
307 return GetExtensionTag();
310 const char *SDKExtension::GetName()
312 return GetExtensionName();
315 const char *SDKExtension::GetURL()
317 return GetExtensionURL();
320 const char *SDKExtension::GetVersion()
322 return GetExtensionVerString();
325 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
330 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
335 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
342 /* Overload a few things to prevent libstdc++ linking */
343 #if defined __linux__
344 extern "C" void __cxa_pure_virtual(void)
348 void *operator new(size_t size)
353 void *operator new[](size_t size)
358 void operator delete(void *ptr)
363 void operator delete[](void * ptr)