00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <stdio.h>
00033 #include <malloc.h>
00034 #include "smsdk_ext.h"
00035
00036
00037
00038
00039
00040
00041 IExtension *myself = NULL;
00042 IShareSys *g_pShareSys = NULL;
00043 IShareSys *sharesys = NULL;
00044 ISourceMod *g_pSM = NULL;
00045 ISourceMod *smutils = NULL;
00046
00047 #if defined SMEXT_ENABLE_FORWARDSYS
00048 IForwardManager *g_pForwards = NULL;
00049 IForwardManager *forwards = NULL;
00050 #endif
00051 #if defined SMEXT_ENABLE_HANDLESYS
00052 IHandleSys *g_pHandleSys = NULL;
00053 IHandleSys *handlesys = NULL;
00054 #endif
00055 #if defined SMEXT_ENABLE_PLAYERHELPERS
00056 IPlayerManager *playerhelpers = NULL;
00057 #endif //SMEXT_ENABLE_PLAYERHELPERS
00058 #if defined SMEXT_ENABLE_DBMANAGER
00059 IDBManager *dbi = NULL;
00060 #endif //SMEXT_ENABLE_DBMANAGER
00061 #if defined SMEXT_ENABLE_GAMECONF
00062 IGameConfigManager *gameconfs = NULL;
00063 #endif //SMEXT_ENABLE_DBMANAGER
00064 #if defined SMEXT_ENABLE_MEMUTILS
00065 IMemoryUtils *memutils = NULL;
00066 #endif //SMEXT_ENABLE_DBMANAGER
00067 #if defined SMEXT_ENABLE_GAMEHELPERS
00068 IGameHelpers *gamehelpers = NULL;
00069 #endif
00070 #if defined SMEXT_ENABLE_TIMERSYS
00071 ITimerSystem *timersys = NULL;
00072 #endif
00073 #if defined SMEXT_ENABLE_ADTFACTORY
00074 IADTFactory *adtfactory = NULL;
00075 #endif
00076 #if defined SMEXT_ENABLE_THREADER
00077 IThreader *threader = NULL;
00078 #endif
00079 #if defined SMEXT_ENABLE_LIBSYS
00080 ILibrarySys *libsys = NULL;
00081 #endif
00082 #if defined SMEXT_ENABLE_PLUGINSYS
00083 SourceMod::IPluginManager *plsys;
00084 #endif
00085 #if defined SMEXT_ENABLE_MENUS
00086 IMenuManager *menus = NULL;
00087 #endif
00088 #if defined SMEXT_ENABLE_ADMINSYS
00089 IAdminSystem *adminsys = NULL;
00090 #endif
00091 #if defined SMEXT_ENABLE_TEXTPARSERS
00092 ITextParsers *textparsers = NULL;
00093 #endif
00094 #if defined SMEXT_ENABLE_USERMSGS
00095 IUserMessages *usermsgs = NULL;
00096 #endif
00097 #if defined SMEXT_ENABLE_TRANSLATOR
00098 ITranslator *translator = NULL;
00099 #endif
00100
00101
00102 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
00103 {
00104 return g_pExtensionIface;
00105 }
00106
00107 SDKExtension::SDKExtension()
00108 {
00109 #if defined SMEXT_CONF_METAMOD
00110 m_SourceMMLoaded = false;
00111 m_WeAreUnloaded = false;
00112 m_WeGotPauseChange = false;
00113 #endif
00114 }
00115
00116 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
00117 {
00118 g_pShareSys = sharesys = sys;
00119 myself = me;
00120
00121 #if defined SMEXT_CONF_METAMOD
00122 m_WeAreUnloaded = true;
00123
00124 if (!m_SourceMMLoaded)
00125 {
00126 if (error)
00127 {
00128 snprintf(error, maxlength, "Metamod attach failed");
00129 }
00130 return false;
00131 }
00132 #endif
00133 SM_GET_IFACE(SOURCEMOD, g_pSM);
00134 smutils = g_pSM;
00135 #if defined SMEXT_ENABLE_HANDLESYS
00136 SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
00137 handlesys = g_pHandleSys;
00138 #endif
00139 #if defined SMEXT_ENABLE_FORWARDSYS
00140 SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
00141 forwards = g_pForwards;
00142 #endif
00143 #if defined SMEXT_ENABLE_PLAYERHELPERS
00144 SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
00145 #endif
00146 #if defined SMEXT_ENABLE_DBMANAGER
00147 SM_GET_IFACE(DBI, dbi);
00148 #endif
00149 #if defined SMEXT_ENABLE_GAMECONF
00150 SM_GET_IFACE(GAMECONFIG, gameconfs);
00151 #endif
00152 #if defined SMEXT_ENABLE_MEMUTILS
00153 SM_GET_IFACE(MEMORYUTILS, memutils);
00154 #endif
00155 #if defined SMEXT_ENABLE_GAMEHELPERS
00156 SM_GET_IFACE(GAMEHELPERS, gamehelpers);
00157 #endif
00158 #if defined SMEXT_ENABLE_TIMERSYS
00159 SM_GET_IFACE(TIMERSYS, timersys);
00160 #endif
00161 #if defined SMEXT_ENABLE_ADTFACTORY
00162 SM_GET_IFACE(ADTFACTORY, adtfactory);
00163 #endif
00164 #if defined SMEXT_ENABLE_THREADER
00165 SM_GET_IFACE(THREADER, threader);
00166 #endif
00167 #if defined SMEXT_ENABLE_LIBSYS
00168 SM_GET_IFACE(LIBRARYSYS, libsys);
00169 #endif
00170 #if defined SMEXT_ENABLE_PLUGINSYS
00171 SM_GET_IFACE(PLUGINSYSTEM, plsys);
00172 #endif
00173 #if defined SMEXT_ENABLE_MENUS
00174 SM_GET_IFACE(MENUMANAGER, menus);
00175 #endif
00176 #if defined SMEXT_ENABLE_ADMINSYS
00177 SM_GET_IFACE(ADMINSYS, adminsys);
00178 #endif
00179 #if defined SMEXT_ENABLE_TEXTPARSERS
00180 SM_GET_IFACE(TEXTPARSERS, textparsers);
00181 #endif
00182 #if defined SMEXT_ENABLE_USERMSGS
00183 SM_GET_IFACE(USERMSGS, usermsgs);
00184 #endif
00185 #if defined SMEXT_ENABLE_TRANSLATOR
00186 SM_GET_IFACE(TRANSLATOR, translator);
00187 #endif
00188
00189 if (SDK_OnLoad(error, maxlength, late))
00190 {
00191 #if defined SMEXT_CONF_METAMOD
00192 m_WeAreUnloaded = true;
00193 #endif
00194 return true;
00195 }
00196
00197 return false;
00198 }
00199
00200 bool SDKExtension::IsMetamodExtension()
00201 {
00202 #if defined SMEXT_CONF_METAMOD
00203 return true;
00204 #else
00205 return false;
00206 #endif
00207 }
00208
00209 void SDKExtension::OnExtensionPauseChange(bool state)
00210 {
00211 #if defined SMEXT_CONF_METAMOD
00212 m_WeGotPauseChange = true;
00213 #endif
00214 SDK_OnPauseChange(state);
00215 }
00216
00217 void SDKExtension::OnExtensionsAllLoaded()
00218 {
00219 SDK_OnAllLoaded();
00220 }
00221
00222 void SDKExtension::OnExtensionUnload()
00223 {
00224 #if defined SMEXT_CONF_METAMOD
00225 m_WeAreUnloaded = true;
00226 #endif
00227 SDK_OnUnload();
00228 }
00229
00230 const char *SDKExtension::GetExtensionAuthor()
00231 {
00232 return SMEXT_CONF_AUTHOR;
00233 }
00234
00235 const char *SDKExtension::GetExtensionDateString()
00236 {
00237 return SMEXT_CONF_DATESTRING;
00238 }
00239
00240 const char *SDKExtension::GetExtensionDescription()
00241 {
00242 return SMEXT_CONF_DESCRIPTION;
00243 }
00244
00245 const char *SDKExtension::GetExtensionVerString()
00246 {
00247 return SMEXT_CONF_VERSION;
00248 }
00249
00250 const char *SDKExtension::GetExtensionName()
00251 {
00252 return SMEXT_CONF_NAME;
00253 }
00254
00255 const char *SDKExtension::GetExtensionTag()
00256 {
00257 return SMEXT_CONF_LOGTAG;
00258 }
00259
00260 const char *SDKExtension::GetExtensionURL()
00261 {
00262 return SMEXT_CONF_URL;
00263 }
00264
00265 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
00266 {
00267 return true;
00268 }
00269
00270 void SDKExtension::SDK_OnUnload()
00271 {
00272 }
00273
00274 void SDKExtension::SDK_OnPauseChange(bool paused)
00275 {
00276 }
00277
00278 void SDKExtension::SDK_OnAllLoaded()
00279 {
00280 }
00281
00282 #if defined SMEXT_CONF_METAMOD
00283
00284 PluginId g_PLID = 0;
00285 ISmmPlugin *g_PLAPI = NULL;
00286 SourceHook::ISourceHook *g_SHPtr = NULL;
00287 ISmmAPI *g_SMAPI = NULL;
00288
00289 IVEngineServer *engine = NULL;
00290 IServerGameDLL *gamedll = NULL;
00291
00292
00293 SMM_API void *PL_EXPOSURE(const char *name, int *code)
00294 {
00295 #if defined METAMOD_PLAPI_VERSION
00296 if (name && !strcmp(name, METAMOD_PLAPI_NAME))
00297 #else
00298 if (name && !strcmp(name, PLAPI_NAME))
00299 #endif
00300 {
00301 if (code)
00302 {
00303 *code = IFACE_OK;
00304 }
00305 return static_cast<void *>(g_pExtensionIface);
00306 }
00307
00308 if (code)
00309 {
00310 *code = IFACE_FAILED;
00311 }
00312
00313 return NULL;
00314 }
00315
00316 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
00317 {
00318 PLUGIN_SAVEVARS();
00319
00320 #if !defined METAMOD_PLAPI_VERSION
00321 GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
00322 GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
00323 #else
00324 GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
00325 GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
00326 #endif
00327
00328 m_SourceMMLoaded = true;
00329
00330 return SDK_OnMetamodLoad(ismm, error, maxlen, late);
00331 }
00332
00333 bool SDKExtension::Unload(char *error, size_t maxlen)
00334 {
00335 if (!m_WeAreUnloaded)
00336 {
00337 if (error)
00338 {
00339 snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
00340 }
00341 return false;
00342 }
00343
00344 return SDK_OnMetamodUnload(error, maxlen);
00345 }
00346
00347 bool SDKExtension::Pause(char *error, size_t maxlen)
00348 {
00349 if (!m_WeGotPauseChange)
00350 {
00351 if (error)
00352 {
00353 snprintf(error, maxlen, "This extension must be paused by SourceMod.");
00354 }
00355 return false;
00356 }
00357
00358 m_WeGotPauseChange = false;
00359
00360 return SDK_OnMetamodPauseChange(true, error, maxlen);
00361 }
00362
00363 bool SDKExtension::Unpause(char *error, size_t maxlen)
00364 {
00365 if (!m_WeGotPauseChange)
00366 {
00367 if (error)
00368 {
00369 snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
00370 }
00371 return false;
00372 }
00373
00374 m_WeGotPauseChange = false;
00375
00376 return SDK_OnMetamodPauseChange(false, error, maxlen);
00377 }
00378
00379 const char *SDKExtension::GetAuthor()
00380 {
00381 return GetExtensionAuthor();
00382 }
00383
00384 const char *SDKExtension::GetDate()
00385 {
00386 return GetExtensionDateString();
00387 }
00388
00389 const char *SDKExtension::GetDescription()
00390 {
00391 return GetExtensionDescription();
00392 }
00393
00394 const char *SDKExtension::GetLicense()
00395 {
00396 return SMEXT_CONF_LICENSE;
00397 }
00398
00399 const char *SDKExtension::GetLogTag()
00400 {
00401 return GetExtensionTag();
00402 }
00403
00404 const char *SDKExtension::GetName()
00405 {
00406 return GetExtensionName();
00407 }
00408
00409 const char *SDKExtension::GetURL()
00410 {
00411 return GetExtensionURL();
00412 }
00413
00414 const char *SDKExtension::GetVersion()
00415 {
00416 return GetExtensionVerString();
00417 }
00418
00419 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
00420 {
00421 return true;
00422 }
00423
00424 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
00425 {
00426 return true;
00427 }
00428
00429 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
00430 {
00431 return true;
00432 }
00433
00434 #endif
00435
00436
00437 #if defined __linux__
00438 extern "C" void __cxa_pure_virtual(void)
00439 {
00440 }
00441
00442 void *operator new(size_t size)
00443 {
00444 return malloc(size);
00445 }
00446
00447 void *operator new[](size_t size)
00448 {
00449 return malloc(size);
00450 }
00451
00452 void operator delete(void *ptr)
00453 {
00454 free(ptr);
00455 }
00456
00457 void operator delete[](void * ptr)
00458 {
00459 free(ptr);
00460 }
00461 #endif