public/sample_ext/smsdk_ext.cpp
author David Anderson <dvander@alliedmods.net>
Fri Feb 16 03:47:10 2007 +0000 (2007-02-16)
changeset 501 e209a7296936
parent 376 02c9ad824677
child 676 1ed65fdc194a
permissions -rw-r--r--
removed this potential feature, not useful enough
     1 /**
     2  * vim: set ts=4 :
     3  * ===============================================================
     4  * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
     5  * All rights reserved.
     6  * ===============================================================
     7  *
     8  *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
     9  * or modified under the Terms and Conditions of its License Agreement, which is found 
    10  * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
    11  * may change at any time.  To view the latest information, see:
    12  *   http://www.sourcemod.net/license.php
    13  *
    14  * Version: $Id$
    15  */
    16 
    17 #include <stdio.h>
    18 #include <malloc.h>
    19 #include "smsdk_ext.h"
    20 
    21 /**
    22  * @file smsdk_ext.cpp
    23  * @brief Contains wrappers for making Extensions easier to write.
    24  */
    25 
    26 IShareSys *g_pShareSys = NULL;			/**< Share system */
    27 IExtension *myself = NULL;				/**< Ourself */
    28 IHandleSys *g_pHandleSys = NULL;		/**< Handle system */
    29 ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */
    30 IForwardManager *g_pForwards = NULL;	/**< Forward system */
    31 
    32 /** Exports the main interface */
    33 PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
    34 {
    35 	return g_pExtensionIface;
    36 }
    37 
    38 SDKExtension::SDKExtension()
    39 {
    40 #if defined SMEXT_CONF_METAMOD
    41 	m_SourceMMLoaded = false;
    42 	m_WeAreUnloaded = false;
    43 	m_WeGotPauseChange = false;
    44 #endif
    45 }
    46 
    47 bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t err_max, bool late)
    48 {
    49 	g_pShareSys = sys;
    50 	myself = me;
    51 
    52 #if defined SMEXT_CONF_METAMOD
    53 	m_WeAreUnloaded = true;
    54 
    55 	if (!m_SourceMMLoaded)
    56 	{
    57 		if (error)
    58 		{
    59 			snprintf(error, err_max, "Metamod attach failed");
    60 		}
    61 		return false;
    62 	}
    63 #endif
    64 
    65 	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
    66 	SM_GET_IFACE(SOURCEMOD, g_pSM);
    67 	SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
    68 
    69 	if (SDK_OnLoad(error, err_max, late))
    70 	{
    71 #if defined SMEXT_CONF_METAMOD
    72 		m_WeAreUnloaded = true;
    73 #endif
    74 		return true;
    75 	}
    76 
    77 	return false;
    78 }
    79 
    80 bool SDKExtension::IsMetamodExtension()
    81 {
    82 #if defined SMEXT_CONF_METAMOD
    83 	return true;
    84 #else
    85 	return false;
    86 #endif
    87 }
    88 
    89 void SDKExtension::OnExtensionPauseChange(bool state)
    90 {
    91 #if defined SMEXT_CONF_METAMOD
    92 	m_WeGotPauseChange = true;
    93 #endif
    94 	SDK_OnPauseChange(state);
    95 }
    96 
    97 void SDKExtension::OnExtensionsAllLoaded()
    98 {
    99 	SDK_OnAllLoaded();
   100 }
   101 
   102 void SDKExtension::OnExtensionUnload()
   103 {
   104 #if defined SMEXT_CONF_METAMOD
   105 	m_WeAreUnloaded = true;
   106 #endif
   107 	SDK_OnUnload();
   108 }
   109 
   110 const char *SDKExtension::GetExtensionAuthor()
   111 {
   112 	return SMEXT_CONF_AUTHOR;
   113 }
   114 
   115 const char *SDKExtension::GetExtensionDateString()
   116 {
   117 	return SMEXT_CONF_DATESTRING;
   118 }
   119 
   120 const char *SDKExtension::GetExtensionDescription()
   121 {
   122 	return SMEXT_CONF_DESCRIPTION;
   123 }
   124 
   125 const char *SDKExtension::GetExtensionVerString()
   126 {
   127 	return SMEXT_CONF_VERSION;
   128 }
   129 
   130 const char *SDKExtension::GetExtensionName()
   131 {
   132 	return SMEXT_CONF_NAME;
   133 }
   134 
   135 const char *SDKExtension::GetExtensionTag()
   136 {
   137 	return SMEXT_CONF_LOGTAG;
   138 }
   139 
   140 const char *SDKExtension::GetExtensionURL()
   141 {
   142 	return SMEXT_CONF_URL;
   143 }
   144 
   145 bool SDKExtension::SDK_OnLoad(char *error, size_t err_max, bool late)
   146 {
   147 	return true;
   148 }
   149 
   150 void SDKExtension::SDK_OnUnload()
   151 {
   152 }
   153 
   154 void SDKExtension::SDK_OnPauseChange(bool paused)
   155 {
   156 }
   157 
   158 void SDKExtension::SDK_OnAllLoaded()
   159 {
   160 }
   161 
   162 #if defined SMEXT_CONF_METAMOD
   163 
   164 PluginId g_PLID = 0;						/**< Metamod plugin ID */
   165 ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */
   166 SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */
   167 ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */
   168 
   169 IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */
   170 IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */
   171 
   172 /** Exposes the extension to Metamod */
   173 SMM_API void *PL_EXPOSURE(const char *name, int *code)
   174 {
   175 	if (name && !strcmp(name, PLAPI_NAME))
   176 	{
   177 		if (code)
   178 		{
   179 			*code = IFACE_OK;
   180 		}
   181 		return static_cast<void *>(g_pExtensionIface);
   182 	}
   183 
   184 	if (code)
   185 	{
   186 		*code = IFACE_FAILED;
   187 	}
   188 
   189 	return NULL;
   190 }
   191 
   192 bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
   193 {
   194 	PLUGIN_SAVEVARS();
   195 
   196 	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
   197 	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
   198 
   199 	m_SourceMMLoaded = true;
   200 
   201 	return SDK_OnMetamodLoad(error, maxlen, late);
   202 }
   203 
   204 bool SDKExtension::Unload(char *error, size_t maxlen)
   205 {
   206 	if (!m_WeAreUnloaded)
   207 	{
   208 		if (error)
   209 		{
   210 			snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
   211 		}
   212 		return false;
   213 	}
   214 
   215 	return SDK_OnMetamodUnload(error, maxlen);
   216 }
   217 
   218 bool SDKExtension::Pause(char *error, size_t maxlen)
   219 {
   220 	if (!m_WeGotPauseChange)
   221 	{
   222 		if (error)
   223 		{
   224 			snprintf(error, maxlen, "This extension must be paused by SourceMod.");
   225 		}
   226 		return false;
   227 	}
   228 
   229 	m_WeGotPauseChange = false;
   230 
   231 	return SDK_OnMetamodPauseChange(true, error, maxlen);
   232 }
   233 
   234 bool SDKExtension::Unpause(char *error, size_t maxlen)
   235 {
   236 	if (!m_WeGotPauseChange)
   237 	{
   238 		if (error)
   239 		{
   240 			snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
   241 		}
   242 		return false;
   243 	}
   244 
   245 	m_WeGotPauseChange = false;
   246 
   247 	return SDK_OnMetamodPauseChange(false, error, maxlen);
   248 }
   249 
   250 const char *SDKExtension::GetAuthor()
   251 {
   252 	return GetExtensionAuthor();
   253 }
   254 
   255 const char *SDKExtension::GetDate()
   256 {
   257 	return GetExtensionDateString();
   258 }
   259 
   260 const char *SDKExtension::GetDescription()
   261 {
   262 	return GetExtensionDescription();
   263 }
   264 
   265 const char *SDKExtension::GetLicense()
   266 {
   267 	return SMEXT_CONF_LICENSE;
   268 }
   269 
   270 const char *SDKExtension::GetLogTag()
   271 {
   272 	return GetExtensionTag();
   273 }
   274 
   275 const char *SDKExtension::GetName()
   276 {
   277 	return GetExtensionName();
   278 }
   279 
   280 const char *SDKExtension::GetURL()
   281 {
   282 	return GetExtensionURL();
   283 }
   284 
   285 const char *SDKExtension::GetVersion()
   286 {
   287 	return GetExtensionVerString();
   288 }
   289 
   290 bool SDKExtension::SDK_OnMetamodLoad(char *error, size_t err_max, bool late)
   291 {
   292 	return true;
   293 }
   294 
   295 bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t err_max)
   296 {
   297 	return true;
   298 }
   299 
   300 bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t err_max)
   301 {
   302 	return true;
   303 }
   304 
   305 #endif
   306 
   307 /* Overload a few things to prevent libstdc++ linking */
   308 #if defined __linux__
   309 extern "C" void __cxa_pure_virtual(void)
   310 {
   311 }
   312 
   313 void *operator new(size_t size)
   314 {
   315 	return malloc(size);
   316 }
   317 
   318 void *operator new[](size_t size) 
   319 {
   320 	return malloc(size);
   321 }
   322 
   323 void operator delete(void *ptr) 
   324 {
   325 	free(ptr);
   326 }
   327 
   328 void operator delete[](void * ptr)
   329 {
   330 	free(ptr);
   331 }
   332 #endif
   333