extensions/batsupport/sdk/smsdk_ext.cpp
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
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 IShareSys *g_pShareSys = NULL;			/**< Share system */
    42 IExtension *myself = NULL;				/**< Ourself */
    43 IHandleSys *g_pHandleSys = NULL;		/**< Handle system */
    44 ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */
    45 IForwardManager *g_pForwards = NULL;	/**< Forward system */
    46 
    47 /** Exports the main interface */
    48 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
    49 {
    50 	return g_pExtensionIface;
    51 }
    52 
    53 SDKExtension::SDKExtension()
    54 {
    55 #if defined SMEXT_CONF_METAMOD
    56 	m_SourceMMLoaded = false;
    57 	m_WeAreUnloaded = false;
    58 	m_WeGotPauseChange = false;
    59 #endif
    60 }
    61 
    62 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
    63 {
    64 	g_pShareSys = sys;
    65 	myself = me;
    66 
    67 #if defined SMEXT_CONF_METAMOD
    68 	m_WeAreUnloaded = true;
    69 
    70 	if (!m_SourceMMLoaded)
    71 	{
    72 		if (error)
    73 		{
    74 			snprintf(error, maxlength, "Metamod attach failed");
    75 		}
    76 		return false;
    77 	}
    78 #endif
    79 
    80 	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
    81 	SM_GET_IFACE(SOURCEMOD, g_pSM);
    82 	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
    83 
    84 	if (SDK_OnLoad(error, maxlength, late))
    85 	{
    86 #if defined SMEXT_CONF_METAMOD
    87 		m_WeAreUnloaded = true;
    88 #endif
    89 		return true;
    90 	}
    91 
    92 	return false;
    93 }
    94 
    95 bool SDKExtension::IsMetamodExtension()
    96 {
    97 #if defined SMEXT_CONF_METAMOD
    98 	return true;
    99 #else
   100 	return false;
   101 #endif
   102 }
   103 
   104 void SDKExtension::OnExtensionPauseChange(bool state)
   105 {
   106 #if defined SMEXT_CONF_METAMOD
   107 	m_WeGotPauseChange = true;
   108 #endif
   109 	SDK_OnPauseChange(state);
   110 }
   111 
   112 void SDKExtension::OnExtensionsAllLoaded()
   113 {
   114 	SDK_OnAllLoaded();
   115 }
   116 
   117 void SDKExtension::OnExtensionUnload()
   118 {
   119 #if defined SMEXT_CONF_METAMOD
   120 	m_WeAreUnloaded = true;
   121 #endif
   122 	SDK_OnUnload();
   123 }
   124 
   125 const char *SDKExtension::GetExtensionAuthor()
   126 {
   127 	return SMEXT_CONF_AUTHOR;
   128 }
   129 
   130 const char *SDKExtension::GetExtensionDateString()
   131 {
   132 	return SMEXT_CONF_DATESTRING;
   133 }
   134 
   135 const char *SDKExtension::GetExtensionDescription()
   136 {
   137 	return SMEXT_CONF_DESCRIPTION;
   138 }
   139 
   140 const char *SDKExtension::GetExtensionVerString()
   141 {
   142 	return SMEXT_CONF_VERSION;
   143 }
   144 
   145 const char *SDKExtension::GetExtensionName()
   146 {
   147 	return SMEXT_CONF_NAME;
   148 }
   149 
   150 const char *SDKExtension::GetExtensionTag()
   151 {
   152 	return SMEXT_CONF_LOGTAG;
   153 }
   154 
   155 const char *SDKExtension::GetExtensionURL()
   156 {
   157 	return SMEXT_CONF_URL;
   158 }
   159 
   160 bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
   161 {
   162 	return true;
   163 }
   164 
   165 void SDKExtension::SDK_OnUnload()
   166 {
   167 }
   168 
   169 void SDKExtension::SDK_OnPauseChange(bool paused)
   170 {
   171 }
   172 
   173 void SDKExtension::SDK_OnAllLoaded()
   174 {
   175 }
   176 
   177 #if defined SMEXT_CONF_METAMOD
   178 
   179 PluginId g_PLID = 0;						/**< Metamod plugin ID */
   180 ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
   181 SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
   182 ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
   183 
   184 IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
   185 IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
   186 
   187 /** Exposes the extension to Metamod */
   188 SMM_API void *PL_EXPOSURE(const char *name, int *code)
   189 {
   190 	if (name && !strcmp(name, PLAPI_NAME))
   191 	{
   192 		if (code)
   193 		{
   194 			*code = IFACE_OK;
   195 		}
   196 		return static_cast<void *>(g_pExtensionIface);
   197 	}
   198 
   199 	if (code)
   200 	{
   201 		*code = IFACE_FAILED;
   202 	}
   203 
   204 	return NULL;
   205 }
   206 
   207 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
   208 {
   209 	PLUGIN_SAVEVARS();
   210 
   211 	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
   212 	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
   213 
   214 	m_SourceMMLoaded = true;
   215 
   216 	return SDK_OnMetamodLoad(ismm, error, maxlen, late);
   217 }
   218 
   219 bool SDKExtension::Unload(char *error, size_t maxlen)
   220 {
   221 	if (!m_WeAreUnloaded)
   222 	{
   223 		if (error)
   224 		{
   225 			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
   226 		}
   227 		return false;
   228 	}
   229 
   230 	return SDK_OnMetamodUnload(error, maxlen);
   231 }
   232 
   233 bool SDKExtension::Pause(char *error, size_t maxlen)
   234 {
   235 	if (!m_WeGotPauseChange)
   236 	{
   237 		if (error)
   238 		{
   239 			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
   240 		}
   241 		return false;
   242 	}
   243 
   244 	m_WeGotPauseChange = false;
   245 
   246 	return SDK_OnMetamodPauseChange(true, error, maxlen);
   247 }
   248 
   249 bool SDKExtension::Unpause(char *error, size_t maxlen)
   250 {
   251 	if (!m_WeGotPauseChange)
   252 	{
   253 		if (error)
   254 		{
   255 			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
   256 		}
   257 		return false;
   258 	}
   259 
   260 	m_WeGotPauseChange = false;
   261 
   262 	return SDK_OnMetamodPauseChange(false, error, maxlen);
   263 }
   264 
   265 const char *SDKExtension::GetAuthor()
   266 {
   267 	return GetExtensionAuthor();
   268 }
   269 
   270 const char *SDKExtension::GetDate()
   271 {
   272 	return GetExtensionDateString();
   273 }
   274 
   275 const char *SDKExtension::GetDescription()
   276 {
   277 	return GetExtensionDescription();
   278 }
   279 
   280 const char *SDKExtension::GetLicense()
   281 {
   282 	return SMEXT_CONF_LICENSE;
   283 }
   284 
   285 const char *SDKExtension::GetLogTag()
   286 {
   287 	return GetExtensionTag();
   288 }
   289 
   290 const char *SDKExtension::GetName()
   291 {
   292 	return GetExtensionName();
   293 }
   294 
   295 const char *SDKExtension::GetURL()
   296 {
   297 	return GetExtensionURL();
   298 }
   299 
   300 const char *SDKExtension::GetVersion()
   301 {
   302 	return GetExtensionVerString();
   303 }
   304 
   305 bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
   306 {
   307 	return true;
   308 }
   309 
   310 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
   311 {
   312 	return true;
   313 }
   314 
   315 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
   316 {
   317 	return true;
   318 }
   319 
   320 #endif
   321 
   322 /* Overload a few things to prevent libstdc++ linking */
   323 #if defined __linux__
   324 extern "C" void __cxa_pure_virtual(void)
   325 {
   326 }
   327 
   328 void *operator new(size_t size)
   329 {
   330 	return malloc(size);
   331 }
   332 
   333 void *operator new[](size_t size) 
   334 {
   335 	return malloc(size);
   336 }
   337 
   338 void operator delete(void *ptr) 
   339 {
   340 	free(ptr);
   341 }
   342 
   343 void operator delete[](void * ptr)
   344 {
   345 	free(ptr);
   346 }
   347 #endif