extensions/sdktools/sdk/smsdk_ext.cpp
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
child 2289 44045ead61cd
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
     1 /**
     2  * vim: set ts=4 :
     3  * =============================================================================
     4  * SourceMod Base Extension Code
     5  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
     6  * =============================================================================
     7  *
     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.
    11  * 
    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
    15  * details.
    16  *
    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/>.
    19  *
    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>.
    28  *
    29  * Version: $Id$
    30  */
    31 
    32 #include <stdio.h>
    33 #include <malloc.h>
    34 #include "smsdk_ext.h"
    35 
    36 /**
    37  * @file smsdk_ext.cpp
    38  * @brief Contains wrappers for making Extensions easier to write.
    39  */
    40 
    41 IExtension *myself = NULL;				/**< Ourself */
    42 IShareSys *g_pShareSys = NULL;			/**< Share system */
    43 IShareSys *sharesys = NULL;				/**< Share system */
    44 ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */
    45 ISourceMod *smutils = NULL;				/**< SourceMod helpers */
    46 
    47 #if defined SMEXT_ENABLE_FORWARDSYS
    48 IForwardManager *g_pForwards = NULL;	/**< Forward system */
    49 IForwardManager *forwards = NULL;		/**< Forward system */
    50 #endif
    51 #if defined SMEXT_ENABLE_HANDLESYS
    52 IHandleSys *g_pHandleSys = NULL;		/**< Handle system */
    53 IHandleSys *handlesys = NULL;			/**< Handle system */
    54 #endif
    55 #if defined SMEXT_ENABLE_PLAYERHELPERS
    56 IPlayerManager *playerhelpers = NULL;	/**< Player helpers */
    57 #endif //SMEXT_ENABLE_PLAYERHELPERS
    58 #if defined SMEXT_ENABLE_DBMANAGER
    59 IDBManager *dbi = NULL;					/**< DB Manager */
    60 #endif //SMEXT_ENABLE_DBMANAGER
    61 #if defined SMEXT_ENABLE_GAMECONF
    62 IGameConfigManager *gameconfs = NULL;	/**< Game config manager */
    63 #endif //SMEXT_ENABLE_DBMANAGER
    64 #if defined SMEXT_ENABLE_MEMUTILS
    65 IMemoryUtils *memutils = NULL;
    66 #endif //SMEXT_ENABLE_DBMANAGER
    67 #if defined SMEXT_ENABLE_GAMEHELPERS
    68 IGameHelpers *gamehelpers = NULL;
    69 #endif
    70 #if defined SMEXT_ENABLE_TIMERSYS
    71 ITimerSystem *timersys = NULL;
    72 #endif
    73 #if defined SMEXT_ENABLE_ADTFACTORY
    74 IADTFactory *adtfactory = NULL;
    75 #endif
    76 #if defined SMEXT_ENABLE_THREADER
    77 IThreader *threader = NULL;
    78 #endif
    79 #if defined SMEXT_ENABLE_LIBSYS
    80 ILibrarySys *libsys = NULL;
    81 #endif
    82 #if defined SMEXT_ENABLE_PLUGINSYS
    83 SourceMod::IPluginManager *plsys;
    84 #endif
    85 
    86 /** Exports the main interface */
    87 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
    88 {
    89 	return g_pExtensionIface;
    90 }
    91 
    92 SDKExtension::SDKExtension()
    93 {
    94 #if defined SMEXT_CONF_METAMOD
    95 	m_SourceMMLoaded = false;
    96 	m_WeAreUnloaded = false;
    97 	m_WeGotPauseChange = false;
    98 #endif
    99 }
   100 
   101 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
   102 {
   103 	g_pShareSys = sharesys = sys;
   104 	myself = me;
   105 
   106 #if defined SMEXT_CONF_METAMOD
   107 	m_WeAreUnloaded = true;
   108 
   109 	if (!m_SourceMMLoaded)
   110 	{
   111 		if (error)
   112 		{
   113 			snprintf(error, maxlength, "Metamod attach failed");
   114 		}
   115 		return false;
   116 	}
   117 #endif
   118 	SM_GET_IFACE(SOURCEMOD, g_pSM);
   119 	smutils = g_pSM;
   120 #if defined SMEXT_ENABLE_HANDLESYS
   121 	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
   122 	handlesys = g_pHandleSys;
   123 #endif
   124 #if defined SMEXT_ENABLE_FORWARDSYS
   125 	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
   126 	forwards = g_pForwards;
   127 #endif
   128 #if defined SMEXT_ENABLE_PLAYERHELPERS
   129 	SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
   130 #endif
   131 #if defined SMEXT_ENABLE_DBMANAGER
   132 	SM_GET_IFACE(DBI, dbi);
   133 #endif
   134 #if defined SMEXT_ENABLE_GAMECONF
   135 	SM_GET_IFACE(GAMECONFIG, gameconfs);
   136 #endif
   137 #if defined SMEXT_ENABLE_MEMUTILS
   138 	SM_GET_IFACE(MEMORYUTILS, memutils);
   139 #endif
   140 #if defined SMEXT_ENABLE_GAMEHELPERS
   141 	SM_GET_IFACE(GAMEHELPERS, gamehelpers);
   142 #endif
   143 #if defined SMEXT_ENABLE_TIMERSYS
   144 	SM_GET_IFACE(TIMERSYS, timersys);
   145 #endif
   146 #if defined SMEXT_ENABLE_ADTFACTORY
   147 	SM_GET_IFACE(ADTFACTORY, adtfactory);
   148 #endif
   149 #if defined SMEXT_ENABLE_THREADER
   150 	SM_GET_IFACE(THREADER, threader);
   151 #endif
   152 #if defined SMEXT_ENABLE_LIBSYS
   153 	SM_GET_IFACE(LIBRARYSYS, libsys);
   154 #endif
   155 #if defined SMEXT_ENABLE_PLUGINSYS
   156 	SM_GET_IFACE(PLUGINSYSTEM, plsys);
   157 #endif
   158 
   159 	if (SDK_OnLoad(error, maxlength, late))
   160 	{
   161 #if defined SMEXT_CONF_METAMOD
   162 		m_WeAreUnloaded = true;
   163 #endif
   164 		return true;
   165 	}
   166 
   167 	return false;
   168 }
   169 
   170 bool SDKExtension::IsMetamodExtension()
   171 {
   172 #if defined SMEXT_CONF_METAMOD
   173 	return true;
   174 #else
   175 	return false;
   176 #endif
   177 }
   178 
   179 void SDKExtension::OnExtensionPauseChange(bool state)
   180 {
   181 #if defined SMEXT_CONF_METAMOD
   182 	m_WeGotPauseChange = true;
   183 #endif
   184 	SDK_OnPauseChange(state);
   185 }
   186 
   187 void SDKExtension::OnExtensionsAllLoaded()
   188 {
   189 	SDK_OnAllLoaded();
   190 }
   191 
   192 void SDKExtension::OnExtensionUnload()
   193 {
   194 #if defined SMEXT_CONF_METAMOD
   195 	m_WeAreUnloaded = true;
   196 #endif
   197 	SDK_OnUnload();
   198 }
   199 
   200 const char *SDKExtension::GetExtensionAuthor()
   201 {
   202 	return SMEXT_CONF_AUTHOR;
   203 }
   204 
   205 const char *SDKExtension::GetExtensionDateString()
   206 {
   207 	return SMEXT_CONF_DATESTRING;
   208 }
   209 
   210 const char *SDKExtension::GetExtensionDescription()
   211 {
   212 	return SMEXT_CONF_DESCRIPTION;
   213 }
   214 
   215 const char *SDKExtension::GetExtensionVerString()
   216 {
   217 	return SMEXT_CONF_VERSION;
   218 }
   219 
   220 const char *SDKExtension::GetExtensionName()
   221 {
   222 	return SMEXT_CONF_NAME;
   223 }
   224 
   225 const char *SDKExtension::GetExtensionTag()
   226 {
   227 	return SMEXT_CONF_LOGTAG;
   228 }
   229 
   230 const char *SDKExtension::GetExtensionURL()
   231 {
   232 	return SMEXT_CONF_URL;
   233 }
   234 
   235 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
   236 {
   237 	return true;
   238 }
   239 
   240 void SDKExtension::SDK_OnUnload()
   241 {
   242 }
   243 
   244 void SDKExtension::SDK_OnPauseChange(bool paused)
   245 {
   246 }
   247 
   248 void SDKExtension::SDK_OnAllLoaded()
   249 {
   250 }
   251 
   252 #if defined SMEXT_CONF_METAMOD
   253 
   254 PluginId g_PLID = 0;						/**< Metamod plugin ID */
   255 ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
   256 SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
   257 ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
   258 
   259 IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
   260 IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
   261 
   262 /** Exposes the extension to Metamod */
   263 SMM_API void *PL_EXPOSURE(const char *name, int *code)
   264 {
   265 	if (name && !strcmp(name, METAMOD_PLAPI_NAME))
   266 	{
   267 		if (code)
   268 		{
   269 			*code = IFACE_OK;
   270 		}
   271 		return static_cast<void *>(g_pExtensionIface);
   272 	}
   273 
   274 	if (code)
   275 	{
   276 		*code = IFACE_FAILED;
   277 	}
   278 
   279 	return NULL;
   280 }
   281 
   282 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
   283 {
   284 	PLUGIN_SAVEVARS();
   285 
   286 	GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
   287 	GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
   288 
   289 	m_SourceMMLoaded = true;
   290 
   291 	return SDK_OnMetamodLoad(ismm, error, maxlen, late);
   292 }
   293 
   294 bool SDKExtension::Unload(char *error, size_t maxlen)
   295 {
   296 	if (!m_WeAreUnloaded)
   297 	{
   298 		if (error)
   299 		{
   300 			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
   301 		}
   302 		return false;
   303 	}
   304 
   305 	return SDK_OnMetamodUnload(error, maxlen);
   306 }
   307 
   308 bool SDKExtension::Pause(char *error, size_t maxlen)
   309 {
   310 	if (!m_WeGotPauseChange)
   311 	{
   312 		if (error)
   313 		{
   314 			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
   315 		}
   316 		return false;
   317 	}
   318 
   319 	m_WeGotPauseChange = false;
   320 
   321 	return SDK_OnMetamodPauseChange(true, error, maxlen);
   322 }
   323 
   324 bool SDKExtension::Unpause(char *error, size_t maxlen)
   325 {
   326 	if (!m_WeGotPauseChange)
   327 	{
   328 		if (error)
   329 		{
   330 			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
   331 		}
   332 		return false;
   333 	}
   334 
   335 	m_WeGotPauseChange = false;
   336 
   337 	return SDK_OnMetamodPauseChange(false, error, maxlen);
   338 }
   339 
   340 const char *SDKExtension::GetAuthor()
   341 {
   342 	return GetExtensionAuthor();
   343 }
   344 
   345 const char *SDKExtension::GetDate()
   346 {
   347 	return GetExtensionDateString();
   348 }
   349 
   350 const char *SDKExtension::GetDescription()
   351 {
   352 	return GetExtensionDescription();
   353 }
   354 
   355 const char *SDKExtension::GetLicense()
   356 {
   357 	return SMEXT_CONF_LICENSE;
   358 }
   359 
   360 const char *SDKExtension::GetLogTag()
   361 {
   362 	return GetExtensionTag();
   363 }
   364 
   365 const char *SDKExtension::GetName()
   366 {
   367 	return GetExtensionName();
   368 }
   369 
   370 const char *SDKExtension::GetURL()
   371 {
   372 	return GetExtensionURL();
   373 }
   374 
   375 const char *SDKExtension::GetVersion()
   376 {
   377 	return GetExtensionVerString();
   378 }
   379 
   380 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
   381 {
   382 	return true;
   383 }
   384 
   385 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
   386 {
   387 	return true;
   388 }
   389 
   390 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
   391 {
   392 	return true;
   393 }
   394 
   395 #endif
   396 
   397 /* Overload a few things to prevent libstdc++ linking */
   398 #if defined __linux__
   399 extern "C" void __cxa_pure_virtual(void)
   400 {
   401 }
   402 
   403 void *operator new(size_t size)
   404 {
   405 	return malloc(size);
   406 }
   407 
   408 void *operator new[](size_t size) 
   409 {
   410 	return malloc(size);
   411 }
   412 
   413 void operator delete(void *ptr) 
   414 {
   415 	free(ptr);
   416 }
   417 
   418 void operator delete[](void * ptr)
   419 {
   420 	free(ptr);
   421 }
   422 #endif