3 * =============================================================================
4 * SourceMod Base Extension Code
5 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
34 #include "smsdk_ext.h"
38 * @brief Contains wrappers for making Extensions easier to write.
41 IShareSys *g_pShareSys = NULL; /**< Share system */
42 IExtension *myself = NULL; /**< Ourself */
43 IHandleSys *g_pHandleSys = NULL; /**< Handle system */
44 ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
45 IForwardManager *g_pForwards = NULL; /**< Forward system */
47 /** Exports the main interface */
48 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
50 return g_pExtensionIface;
53 SDKExtension::SDKExtension()
55 #if defined SMEXT_CONF_METAMOD
56 m_SourceMMLoaded = false;
57 m_WeAreUnloaded = false;
58 m_WeGotPauseChange = false;
62 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
67 #if defined SMEXT_CONF_METAMOD
68 m_WeAreUnloaded = true;
70 if (!m_SourceMMLoaded)
74 snprintf(error, maxlength, "Metamod attach failed");
80 SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
81 SM_GET_IFACE(SOURCEMOD, g_pSM);
82 SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
84 if (SDK_OnLoad(error, maxlength, late))
86 #if defined SMEXT_CONF_METAMOD
87 m_WeAreUnloaded = true;
95 bool SDKExtension::IsMetamodExtension()
97 #if defined SMEXT_CONF_METAMOD
104 void SDKExtension::OnExtensionPauseChange(bool state)
106 #if defined SMEXT_CONF_METAMOD
107 m_WeGotPauseChange = true;
109 SDK_OnPauseChange(state);
112 void SDKExtension::OnExtensionsAllLoaded()
117 void SDKExtension::OnExtensionUnload()
119 #if defined SMEXT_CONF_METAMOD
120 m_WeAreUnloaded = true;
125 const char *SDKExtension::GetExtensionAuthor()
127 return SMEXT_CONF_AUTHOR;
130 const char *SDKExtension::GetExtensionDateString()
132 return SMEXT_CONF_DATESTRING;
135 const char *SDKExtension::GetExtensionDescription()
137 return SMEXT_CONF_DESCRIPTION;
140 const char *SDKExtension::GetExtensionVerString()
142 return SMEXT_CONF_VERSION;
145 const char *SDKExtension::GetExtensionName()
147 return SMEXT_CONF_NAME;
150 const char *SDKExtension::GetExtensionTag()
152 return SMEXT_CONF_LOGTAG;
155 const char *SDKExtension::GetExtensionURL()
157 return SMEXT_CONF_URL;
160 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
165 void SDKExtension::SDK_OnUnload()
169 void SDKExtension::SDK_OnPauseChange(bool paused)
173 void SDKExtension::SDK_OnAllLoaded()
177 #if defined SMEXT_CONF_METAMOD
179 PluginId g_PLID = 0; /**< Metamod plugin ID */
180 ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
181 SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
182 ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
184 IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
185 IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
187 /** Exposes the extension to Metamod */
188 SMM_API void *PL_EXPOSURE(const char *name, int *code)
190 if (name && !strcmp(name, PLAPI_NAME))
196 return static_cast<void *>(g_pExtensionIface);
201 *code = IFACE_FAILED;
207 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
211 GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
212 GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
214 m_SourceMMLoaded = true;
216 return SDK_OnMetamodLoad(ismm, error, maxlen, late);
219 bool SDKExtension::Unload(char *error, size_t maxlen)
221 if (!m_WeAreUnloaded)
225 snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
230 return SDK_OnMetamodUnload(error, maxlen);
233 bool SDKExtension::Pause(char *error, size_t maxlen)
235 if (!m_WeGotPauseChange)
239 snprintf(error, maxlen, "This extension must be paused by SourceMod.");
244 m_WeGotPauseChange = false;
246 return SDK_OnMetamodPauseChange(true, error, maxlen);
249 bool SDKExtension::Unpause(char *error, size_t maxlen)
251 if (!m_WeGotPauseChange)
255 snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
260 m_WeGotPauseChange = false;
262 return SDK_OnMetamodPauseChange(false, error, maxlen);
265 const char *SDKExtension::GetAuthor()
267 return GetExtensionAuthor();
270 const char *SDKExtension::GetDate()
272 return GetExtensionDateString();
275 const char *SDKExtension::GetDescription()
277 return GetExtensionDescription();
280 const char *SDKExtension::GetLicense()
282 return SMEXT_CONF_LICENSE;
285 const char *SDKExtension::GetLogTag()
287 return GetExtensionTag();
290 const char *SDKExtension::GetName()
292 return GetExtensionName();
295 const char *SDKExtension::GetURL()
297 return GetExtensionURL();
300 const char *SDKExtension::GetVersion()
302 return GetExtensionVerString();
305 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
310 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
315 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
322 /* Overload a few things to prevent libstdc++ linking */
323 #if defined __linux__
324 extern "C" void __cxa_pure_virtual(void)
328 void *operator new(size_t size)
333 void *operator new[](size_t size)
338 void operator delete(void *ptr)
343 void operator delete[](void * ptr)