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