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
51 #if defined SMEXT_ENABLE_MEMUTILS
52 IMemoryUtils *memutils = NULL;
53 #endif //SMEXT_ENABLE_DBMANAGER
54 #if defined SMEXT_ENABLE_GAMEHELPERS
55 IGameHelpers *gamehelpers = NULL;
57 #if defined SMEXT_ENABLE_TIMERSYS
58 ITimerSystem *timersys = NULL;
60 #if defined SMEXT_ENABLE_ADTFACTORY
61 IADTFactory *adtfactory = NULL;
63 #if defined SMEXT_ENABLE_THREADER
64 IThreader *threader = NULL;
66 #if defined SMEXT_ENABLE_LIBSYS
67 ILibrarySys *libsys = NULL;
70 /** Exports the main interface */
71 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
73 return g_pExtensionIface;
76 SDKExtension::SDKExtension()
78 #if defined SMEXT_CONF_METAMOD
79 m_SourceMMLoaded = false;
80 m_WeAreUnloaded = false;
81 m_WeGotPauseChange = false;
85 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
87 g_pShareSys = sharesys = sys;
90 #if defined SMEXT_CONF_METAMOD
91 m_WeAreUnloaded = true;
93 if (!m_SourceMMLoaded)
97 snprintf(error, maxlength, "Metamod attach failed");
102 SM_GET_IFACE(SOURCEMOD, g_pSM);
104 #if defined SMEXT_ENABLE_HANDLESYS
105 SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
106 handlesys = g_pHandleSys;
108 #if defined SMEXT_ENABLE_FORWARDSYS
109 SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
110 forwards = g_pForwards;
112 #if defined SMEXT_ENABLE_PLAYERHELPERS
113 SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
115 #if defined SMEXT_ENABLE_DBMANAGER
116 SM_GET_IFACE(DBI, dbi);
118 #if defined SMEXT_ENABLE_GAMECONF
119 SM_GET_IFACE(GAMECONFIG, gameconfs);
121 #if defined SMEXT_ENABLE_MEMUTILS
122 SM_GET_IFACE(MEMORYUTILS, memutils);
124 #if defined SMEXT_ENABLE_GAMEHELPERS
125 SM_GET_IFACE(GAMEHELPERS, gamehelpers);
127 #if defined SMEXT_ENABLE_TIMERSYS
128 SM_GET_IFACE(TIMERSYS, timersys);
130 #if defined SMEXT_ENABLE_ADTFACTORY
131 SM_GET_IFACE(ADTFACTORY, adtfactory);
133 #if defined SMEXT_ENABLE_THREADER
134 SM_GET_IFACE(THREADER, threader);
136 #if defined SMEXT_ENABLE_LIBSYS
137 SM_GET_IFACE(LIBRARYSYS, libsys);
140 if (SDK_OnLoad(error, maxlength, late))
142 #if defined SMEXT_CONF_METAMOD
143 m_WeAreUnloaded = true;
151 bool SDKExtension::IsMetamodExtension()
153 #if defined SMEXT_CONF_METAMOD
160 void SDKExtension::OnExtensionPauseChange(bool state)
162 #if defined SMEXT_CONF_METAMOD
163 m_WeGotPauseChange = true;
165 SDK_OnPauseChange(state);
168 void SDKExtension::OnExtensionsAllLoaded()
173 void SDKExtension::OnExtensionUnload()
175 #if defined SMEXT_CONF_METAMOD
176 m_WeAreUnloaded = true;
181 const char *SDKExtension::GetExtensionAuthor()
183 return SMEXT_CONF_AUTHOR;
186 const char *SDKExtension::GetExtensionDateString()
188 return SMEXT_CONF_DATESTRING;
191 const char *SDKExtension::GetExtensionDescription()
193 return SMEXT_CONF_DESCRIPTION;
196 const char *SDKExtension::GetExtensionVerString()
198 return SMEXT_CONF_VERSION;
201 const char *SDKExtension::GetExtensionName()
203 return SMEXT_CONF_NAME;
206 const char *SDKExtension::GetExtensionTag()
208 return SMEXT_CONF_LOGTAG;
211 const char *SDKExtension::GetExtensionURL()
213 return SMEXT_CONF_URL;
216 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
221 void SDKExtension::SDK_OnUnload()
225 void SDKExtension::SDK_OnPauseChange(bool paused)
229 void SDKExtension::SDK_OnAllLoaded()
233 #if defined SMEXT_CONF_METAMOD
235 PluginId g_PLID = 0; /**< Metamod plugin ID */
236 ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
237 SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
238 ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
240 IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
241 IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
243 /** Exposes the extension to Metamod */
244 SMM_API void *PL_EXPOSURE(const char *name, int *code)
246 if (name && !strcmp(name, PLAPI_NAME))
252 return static_cast<void *>(g_pExtensionIface);
257 *code = IFACE_FAILED;
263 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
267 GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
268 GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
270 m_SourceMMLoaded = true;
272 return SDK_OnMetamodLoad(ismm, error, maxlen, late);
275 bool SDKExtension::Unload(char *error, size_t maxlen)
277 if (!m_WeAreUnloaded)
281 snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
286 return SDK_OnMetamodUnload(error, maxlen);
289 bool SDKExtension::Pause(char *error, size_t maxlen)
291 if (!m_WeGotPauseChange)
295 snprintf(error, maxlen, "This extension must be paused by SourceMod.");
300 m_WeGotPauseChange = false;
302 return SDK_OnMetamodPauseChange(true, error, maxlen);
305 bool SDKExtension::Unpause(char *error, size_t maxlen)
307 if (!m_WeGotPauseChange)
311 snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
316 m_WeGotPauseChange = false;
318 return SDK_OnMetamodPauseChange(false, error, maxlen);
321 const char *SDKExtension::GetAuthor()
323 return GetExtensionAuthor();
326 const char *SDKExtension::GetDate()
328 return GetExtensionDateString();
331 const char *SDKExtension::GetDescription()
333 return GetExtensionDescription();
336 const char *SDKExtension::GetLicense()
338 return SMEXT_CONF_LICENSE;
341 const char *SDKExtension::GetLogTag()
343 return GetExtensionTag();
346 const char *SDKExtension::GetName()
348 return GetExtensionName();
351 const char *SDKExtension::GetURL()
353 return GetExtensionURL();
356 const char *SDKExtension::GetVersion()
358 return GetExtensionVerString();
361 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
366 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
371 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
378 /* Overload a few things to prevent libstdc++ linking */
379 #if defined __linux__
380 extern "C" void __cxa_pure_virtual(void)
384 void *operator new(size_t size)
389 void *operator new[](size_t size)
394 void operator delete(void *ptr)
399 void operator delete[](void * ptr)