public/sample_ext/sdk/smsdk_ext.cpp

Go to the documentation of this file.
00001 /**
00002  * vim: set ts=4 :
00003  * =============================================================================
00004  * SourceMod Base Extension Code
00005  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
00006  * =============================================================================
00007  *
00008  * This program is free software; you can redistribute it and/or modify it under
00009  * the terms of the GNU General Public License, version 3.0, as published by the
00010  * Free Software Foundation.
00011  * 
00012  * This program is distributed in the hope that it will be useful, but WITHOUT
00013  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00014  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
00015  * details.
00016  *
00017  * You should have received a copy of the GNU General Public License along with
00018  * this program.  If not, see <http://www.gnu.org/licenses/>.
00019  *
00020  * As a special exception, AlliedModders LLC gives you permission to link the
00021  * code of this program (as well as its derivative works) to "Half-Life 2," the
00022  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
00023  * by the Valve Corporation.  You must obey the GNU General Public License in
00024  * all respects for all other code used.  Additionally, AlliedModders LLC grants
00025  * this exception to all derivative works.  AlliedModders LLC defines further
00026  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
00027  * or <http://www.sourcemod.net/license.php>.
00028  *
00029  * Version: $Id: smsdk_ext.cpp 2132 2008-05-10 09:23:55Z dvander $
00030  */
00031 
00032 #include <stdio.h>
00033 #include <malloc.h>
00034 #include "smsdk_ext.h"
00035 
00036 /**
00037  * @file smsdk_ext.cpp
00038  * @brief Contains wrappers for making Extensions easier to write.
00039  */
00040 
00041 IExtension *myself = NULL;                                  /**< Ourself */
00042 IShareSys *g_pShareSys = NULL;                              /**< Share system */
00043 IShareSys *sharesys = NULL;                                 /**< Share system */
00044 ISourceMod *g_pSM = NULL;                                   /**< SourceMod helpers */
00045 ISourceMod *smutils = NULL;                                 /**< SourceMod helpers */
00046 
00047 #if defined SMEXT_ENABLE_FORWARDSYS
00048 IForwardManager *g_pForwards = NULL;    /**< Forward system */
00049 IForwardManager *forwards = NULL;                 /**< Forward system */
00050 #endif
00051 #if defined SMEXT_ENABLE_HANDLESYS
00052 IHandleSys *g_pHandleSys = NULL;                  /**< Handle system */
00053 IHandleSys *handlesys = NULL;                     /**< Handle system */
00054 #endif
00055 #if defined SMEXT_ENABLE_PLAYERHELPERS
00056 IPlayerManager *playerhelpers = NULL;   /**< Player helpers */
00057 #endif //SMEXT_ENABLE_PLAYERHELPERS
00058 #if defined SMEXT_ENABLE_DBMANAGER
00059 IDBManager *dbi = NULL;                                               /**< DB Manager */
00060 #endif //SMEXT_ENABLE_DBMANAGER
00061 #if defined SMEXT_ENABLE_GAMECONF
00062 IGameConfigManager *gameconfs = NULL;   /**< Game config manager */
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 /** Exports the main interface */
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;                                                            /**< Metamod plugin ID */
00285 ISmmPlugin *g_PLAPI = NULL;                                           /**< Metamod plugin API */
00286 SourceHook::ISourceHook *g_SHPtr = NULL;          /**< SourceHook pointer */
00287 ISmmAPI *g_SMAPI = NULL;                                              /**< SourceMM API pointer */
00288 
00289 IVEngineServer *engine = NULL;                                        /**< IVEngineServer pointer */
00290 IServerGameDLL *gamedll = NULL;                                       /**< IServerGameDLL pointer */
00291 
00292 /** Exposes the extension to Metamod */
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 /* Overload a few things to prevent libstdc++ linking */
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

Generated on Fri Nov 21 03:10:06 2008 for SourceMod SDK by  doxygen 1.5.1