3 * ================================================================
4 * SourceMod Sample Extension
5 * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
6 * ================================================================
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License,
10 * version 3.0, as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to
21 * link the code of this program (as well as its derivative works) to
22 * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any
23 * Game MODs that run on software by the Valve Corporation. You must
24 * obey the GNU General Public License in all respects for all other
25 * code used. Additionally, AlliedModders LLC grants this exception
26 * to all derivative works. AlliedModders LLC defines further
27 * exceptions, found in LICENSE.txt (as of this writing, version
28 * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
35 #include "smsdk_ext.h"
39 * @brief Contains wrappers for making Extensions easier to write.
42 IExtension *myself = NULL; /**< Ourself */
43 IShareSys *g_pShareSys = NULL; /**< Share system */
44 IShareSys *sharesys = NULL; /**< Share system */
45 ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
46 ISourceMod *smutils = NULL; /**< SourceMod helpers */
48 #if defined SMEXT_ENABLE_FORWARDSYS
49 IForwardManager *g_pForwards = NULL; /**< Forward system */
50 IForwardManager *forwards = NULL; /**< Forward system */
52 #if defined SMEXT_ENABLE_HANDLESYS
53 IHandleSys *g_pHandleSys = NULL; /**< Handle system */
54 IHandleSys *handlesys = NULL; /**< Handle system */
56 #if defined SMEXT_ENABLE_PLAYERHELPERS
57 IPlayerManager *playerhelpers = NULL; /**< Player helpers */
58 #endif //SMEXT_ENABLE_PLAYERHELPERS
59 #if defined SMEXT_ENABLE_DBMANAGER
60 IDBManager *dbi = NULL; /**< DB Manager */
61 #endif //SMEXT_ENABLE_DBMANAGER
62 #if defined SMEXT_ENABLE_GAMECONF
63 IGameConfigManager *gameconfs = NULL; /**< Game config manager */
64 #endif //SMEXT_ENABLE_DBMANAGER
65 #if defined SMEXT_ENABLE_MEMUTILS
66 IMemoryUtils *memutils = NULL;
67 #endif //SMEXT_ENABLE_DBMANAGER
68 #if defined SMEXT_ENABLE_GAMEHELPERS
69 IGameHelpers *gamehelpers = NULL;
71 #if defined SMEXT_ENABLE_TIMERSYS
72 ITimerSystem *timersys = NULL;
74 #if defined SMEXT_ENABLE_ADTFACTORY
75 IADTFactory *adtfactory = NULL;
77 #if defined SMEXT_ENABLE_THREADER
78 IThreader *threader = NULL;
80 #if defined SMEXT_ENABLE_LIBSYS
81 ILibrarySys *libsys = NULL;
84 /** Exports the main interface */
85 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
87 return g_pExtensionIface;
90 SDKExtension::SDKExtension()
92 #if defined SMEXT_CONF_METAMOD
93 m_SourceMMLoaded = false;
94 m_WeAreUnloaded = false;
95 m_WeGotPauseChange = false;
99 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
101 g_pShareSys = sharesys = sys;
104 #if defined SMEXT_CONF_METAMOD
105 m_WeAreUnloaded = true;
107 if (!m_SourceMMLoaded)
111 snprintf(error, maxlength, "Metamod attach failed");
116 SM_GET_IFACE(SOURCEMOD, g_pSM);
118 #if defined SMEXT_ENABLE_HANDLESYS
119 SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
120 handlesys = g_pHandleSys;
122 #if defined SMEXT_ENABLE_FORWARDSYS
123 SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
124 forwards = g_pForwards;
126 #if defined SMEXT_ENABLE_PLAYERHELPERS
127 SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
129 #if defined SMEXT_ENABLE_DBMANAGER
130 SM_GET_IFACE(DBI, dbi);
132 #if defined SMEXT_ENABLE_GAMECONF
133 SM_GET_IFACE(GAMECONFIG, gameconfs);
135 #if defined SMEXT_ENABLE_MEMUTILS
136 SM_GET_IFACE(MEMORYUTILS, memutils);
138 #if defined SMEXT_ENABLE_GAMEHELPERS
139 SM_GET_IFACE(GAMEHELPERS, gamehelpers);
141 #if defined SMEXT_ENABLE_TIMERSYS
142 SM_GET_IFACE(TIMERSYS, timersys);
144 #if defined SMEXT_ENABLE_ADTFACTORY
145 SM_GET_IFACE(ADTFACTORY, adtfactory);
147 #if defined SMEXT_ENABLE_THREADER
148 SM_GET_IFACE(THREADER, threader);
150 #if defined SMEXT_ENABLE_LIBSYS
151 SM_GET_IFACE(LIBRARYSYS, libsys);
154 if (SDK_OnLoad(error, maxlength, late))
156 #if defined SMEXT_CONF_METAMOD
157 m_WeAreUnloaded = true;
165 bool SDKExtension::IsMetamodExtension()
167 #if defined SMEXT_CONF_METAMOD
174 void SDKExtension::OnExtensionPauseChange(bool state)
176 #if defined SMEXT_CONF_METAMOD
177 m_WeGotPauseChange = true;
179 SDK_OnPauseChange(state);
182 void SDKExtension::OnExtensionsAllLoaded()
187 void SDKExtension::OnExtensionUnload()
189 #if defined SMEXT_CONF_METAMOD
190 m_WeAreUnloaded = true;
195 const char *SDKExtension::GetExtensionAuthor()
197 return SMEXT_CONF_AUTHOR;
200 const char *SDKExtension::GetExtensionDateString()
202 return SMEXT_CONF_DATESTRING;
205 const char *SDKExtension::GetExtensionDescription()
207 return SMEXT_CONF_DESCRIPTION;
210 const char *SDKExtension::GetExtensionVerString()
212 return SMEXT_CONF_VERSION;
215 const char *SDKExtension::GetExtensionName()
217 return SMEXT_CONF_NAME;
220 const char *SDKExtension::GetExtensionTag()
222 return SMEXT_CONF_LOGTAG;
225 const char *SDKExtension::GetExtensionURL()
227 return SMEXT_CONF_URL;
230 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
235 void SDKExtension::SDK_OnUnload()
239 void SDKExtension::SDK_OnPauseChange(bool paused)
243 void SDKExtension::SDK_OnAllLoaded()
247 #if defined SMEXT_CONF_METAMOD
249 PluginId g_PLID = 0; /**< Metamod plugin ID */
250 ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
251 SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
252 ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
254 IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
255 IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
257 /** Exposes the extension to Metamod */
258 SMM_API void *PL_EXPOSURE(const char *name, int *code)
260 if (name && !strcmp(name, PLAPI_NAME))
266 return static_cast<void *>(g_pExtensionIface);
271 *code = IFACE_FAILED;
277 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
281 GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
282 GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
284 m_SourceMMLoaded = true;
286 return SDK_OnMetamodLoad(ismm, error, maxlen, late);
289 bool SDKExtension::Unload(char *error, size_t maxlen)
291 if (!m_WeAreUnloaded)
295 snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
300 return SDK_OnMetamodUnload(error, maxlen);
303 bool SDKExtension::Pause(char *error, size_t maxlen)
305 if (!m_WeGotPauseChange)
309 snprintf(error, maxlen, "This extension must be paused by SourceMod.");
314 m_WeGotPauseChange = false;
316 return SDK_OnMetamodPauseChange(true, error, maxlen);
319 bool SDKExtension::Unpause(char *error, size_t maxlen)
321 if (!m_WeGotPauseChange)
325 snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
330 m_WeGotPauseChange = false;
332 return SDK_OnMetamodPauseChange(false, error, maxlen);
335 const char *SDKExtension::GetAuthor()
337 return GetExtensionAuthor();
340 const char *SDKExtension::GetDate()
342 return GetExtensionDateString();
345 const char *SDKExtension::GetDescription()
347 return GetExtensionDescription();
350 const char *SDKExtension::GetLicense()
352 return SMEXT_CONF_LICENSE;
355 const char *SDKExtension::GetLogTag()
357 return GetExtensionTag();
360 const char *SDKExtension::GetName()
362 return GetExtensionName();
365 const char *SDKExtension::GetURL()
367 return GetExtensionURL();
370 const char *SDKExtension::GetVersion()
372 return GetExtensionVerString();
375 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
380 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
385 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
392 /* Overload a few things to prevent libstdc++ linking */
393 #if defined __linux__
394 extern "C" void __cxa_pure_virtual(void)
398 void *operator new(size_t size)
403 void *operator new[](size_t size)
408 void operator delete(void *ptr)
413 void operator delete[](void * ptr)