1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/public/smsdk_ext.cpp Wed Apr 23 21:19:28 2014 -0500
1.3 @@ -0,0 +1,483 @@
1.4 +/**
1.5 + * vim: set ts=4 sw=4 tw=99 noet:
1.6 + * =============================================================================
1.7 + * SourceMod Base Extension Code
1.8 + * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
1.9 + * =============================================================================
1.10 + *
1.11 + * This program is free software; you can redistribute it and/or modify it under
1.12 + * the terms of the GNU General Public License, version 3.0, as published by the
1.13 + * Free Software Foundation.
1.14 + *
1.15 + * This program is distributed in the hope that it will be useful, but WITHOUT
1.16 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1.17 + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
1.18 + * details.
1.19 + *
1.20 + * You should have received a copy of the GNU General Public License along with
1.21 + * this program. If not, see <http://www.gnu.org/licenses/>.
1.22 + *
1.23 + * As a special exception, AlliedModders LLC gives you permission to link the
1.24 + * code of this program (as well as its derivative works) to "Half-Life 2," the
1.25 + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
1.26 + * by the Valve Corporation. You must obey the GNU General Public License in
1.27 + * all respects for all other code used. Additionally, AlliedModders LLC grants
1.28 + * this exception to all derivative works. AlliedModders LLC defines further
1.29 + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
1.30 + * or <http://www.sourcemod.net/license.php>.
1.31 + *
1.32 + * Version: $Id$
1.33 + */
1.34 +
1.35 +#include <stdio.h>
1.36 +#include <stdlib.h>
1.37 +#include "smsdk_ext.h"
1.38 +
1.39 +/**
1.40 + * @file smsdk_ext.cpp
1.41 + * @brief Contains wrappers for making Extensions easier to write.
1.42 + */
1.43 +
1.44 +IExtension *myself = NULL; /**< Ourself */
1.45 +IShareSys *g_pShareSys = NULL; /**< Share system */
1.46 +IShareSys *sharesys = NULL; /**< Share system */
1.47 +ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
1.48 +ISourceMod *smutils = NULL; /**< SourceMod helpers */
1.49 +
1.50 +#if defined SMEXT_ENABLE_FORWARDSYS
1.51 +IForwardManager *g_pForwards = NULL; /**< Forward system */
1.52 +IForwardManager *forwards = NULL; /**< Forward system */
1.53 +#endif
1.54 +#if defined SMEXT_ENABLE_HANDLESYS
1.55 +IHandleSys *g_pHandleSys = NULL; /**< Handle system */
1.56 +IHandleSys *handlesys = NULL; /**< Handle system */
1.57 +#endif
1.58 +#if defined SMEXT_ENABLE_PLAYERHELPERS
1.59 +IPlayerManager *playerhelpers = NULL; /**< Player helpers */
1.60 +#endif //SMEXT_ENABLE_PLAYERHELPERS
1.61 +#if defined SMEXT_ENABLE_DBMANAGER
1.62 +IDBManager *dbi = NULL; /**< DB Manager */
1.63 +#endif //SMEXT_ENABLE_DBMANAGER
1.64 +#if defined SMEXT_ENABLE_GAMECONF
1.65 +IGameConfigManager *gameconfs = NULL; /**< Game config manager */
1.66 +#endif //SMEXT_ENABLE_DBMANAGER
1.67 +#if defined SMEXT_ENABLE_MEMUTILS
1.68 +IMemoryUtils *memutils = NULL;
1.69 +#endif //SMEXT_ENABLE_DBMANAGER
1.70 +#if defined SMEXT_ENABLE_GAMEHELPERS
1.71 +IGameHelpers *gamehelpers = NULL;
1.72 +#endif
1.73 +#if defined SMEXT_ENABLE_TIMERSYS
1.74 +ITimerSystem *timersys = NULL;
1.75 +#endif
1.76 +#if defined SMEXT_ENABLE_ADTFACTORY
1.77 +IADTFactory *adtfactory = NULL;
1.78 +#endif
1.79 +#if defined SMEXT_ENABLE_THREADER
1.80 +IThreader *threader = NULL;
1.81 +#endif
1.82 +#if defined SMEXT_ENABLE_LIBSYS
1.83 +ILibrarySys *libsys = NULL;
1.84 +#endif
1.85 +#if defined SMEXT_ENABLE_PLUGINSYS
1.86 +SourceMod::IPluginManager *plsys;
1.87 +#endif
1.88 +#if defined SMEXT_ENABLE_MENUS
1.89 +IMenuManager *menus = NULL;
1.90 +#endif
1.91 +#if defined SMEXT_ENABLE_ADMINSYS
1.92 +IAdminSystem *adminsys = NULL;
1.93 +#endif
1.94 +#if defined SMEXT_ENABLE_TEXTPARSERS
1.95 +ITextParsers *textparsers = NULL;
1.96 +#endif
1.97 +#if defined SMEXT_ENABLE_USERMSGS
1.98 +IUserMessages *usermsgs = NULL;
1.99 +#endif
1.100 +#if defined SMEXT_ENABLE_TRANSLATOR
1.101 +ITranslator *translator = NULL;
1.102 +#endif
1.103 +#if defined SMEXT_ENABLE_NINVOKE
1.104 +INativeInterface *ninvoke = NULL;
1.105 +#endif
1.106 +#if defined SMEXT_ENABLE_ROOTCONSOLEMENU
1.107 +IRootConsole *rootconsole = NULL;
1.108 +#endif
1.109 +
1.110 +/** Exports the main interface */
1.111 +PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
1.112 +{
1.113 + return g_pExtensionIface;
1.114 +}
1.115 +
1.116 +SDKExtension::SDKExtension()
1.117 +{
1.118 +#if defined SMEXT_CONF_METAMOD
1.119 + m_SourceMMLoaded = false;
1.120 + m_WeAreUnloaded = false;
1.121 + m_WeGotPauseChange = false;
1.122 +#endif
1.123 +}
1.124 +
1.125 +bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
1.126 +{
1.127 + g_pShareSys = sharesys = sys;
1.128 + myself = me;
1.129 +
1.130 +#if defined SMEXT_CONF_METAMOD
1.131 + m_WeAreUnloaded = true;
1.132 +
1.133 + if (!m_SourceMMLoaded)
1.134 + {
1.135 + if (error)
1.136 + {
1.137 + snprintf(error, maxlength, "Metamod attach failed");
1.138 + }
1.139 + return false;
1.140 + }
1.141 +#endif
1.142 + SM_GET_IFACE(SOURCEMOD, g_pSM);
1.143 + smutils = g_pSM;
1.144 +#if defined SMEXT_ENABLE_HANDLESYS
1.145 + SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
1.146 + handlesys = g_pHandleSys;
1.147 +#endif
1.148 +#if defined SMEXT_ENABLE_FORWARDSYS
1.149 + SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
1.150 + forwards = g_pForwards;
1.151 +#endif
1.152 +#if defined SMEXT_ENABLE_PLAYERHELPERS
1.153 + SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
1.154 +#endif
1.155 +#if defined SMEXT_ENABLE_DBMANAGER
1.156 + SM_GET_IFACE(DBI, dbi);
1.157 +#endif
1.158 +#if defined SMEXT_ENABLE_GAMECONF
1.159 + SM_GET_IFACE(GAMECONFIG, gameconfs);
1.160 +#endif
1.161 +#if defined SMEXT_ENABLE_MEMUTILS
1.162 + SM_GET_IFACE(MEMORYUTILS, memutils);
1.163 +#endif
1.164 +#if defined SMEXT_ENABLE_GAMEHELPERS
1.165 + SM_GET_IFACE(GAMEHELPERS, gamehelpers);
1.166 +#endif
1.167 +#if defined SMEXT_ENABLE_TIMERSYS
1.168 + SM_GET_IFACE(TIMERSYS, timersys);
1.169 +#endif
1.170 +#if defined SMEXT_ENABLE_ADTFACTORY
1.171 + SM_GET_IFACE(ADTFACTORY, adtfactory);
1.172 +#endif
1.173 +#if defined SMEXT_ENABLE_THREADER
1.174 + SM_GET_IFACE(THREADER, threader);
1.175 +#endif
1.176 +#if defined SMEXT_ENABLE_LIBSYS
1.177 + SM_GET_IFACE(LIBRARYSYS, libsys);
1.178 +#endif
1.179 +#if defined SMEXT_ENABLE_PLUGINSYS
1.180 + SM_GET_IFACE(PLUGINSYSTEM, plsys);
1.181 +#endif
1.182 +#if defined SMEXT_ENABLE_MENUS
1.183 + SM_GET_IFACE(MENUMANAGER, menus);
1.184 +#endif
1.185 +#if defined SMEXT_ENABLE_ADMINSYS
1.186 + SM_GET_IFACE(ADMINSYS, adminsys);
1.187 +#endif
1.188 +#if defined SMEXT_ENABLE_TEXTPARSERS
1.189 + SM_GET_IFACE(TEXTPARSERS, textparsers);
1.190 +#endif
1.191 +#if defined SMEXT_ENABLE_USERMSGS
1.192 + SM_GET_IFACE(USERMSGS, usermsgs);
1.193 +#endif
1.194 +#if defined SMEXT_ENABLE_TRANSLATOR
1.195 + SM_GET_IFACE(TRANSLATOR, translator);
1.196 +#endif
1.197 +#if defined SMEXT_ENABLE_NINVOKE
1.198 + SM_GET_IFACE(NINVOKE, ninvoke);
1.199 +#endif
1.200 +#if defined SMEXT_ENABLE_ROOTCONSOLEMENU
1.201 + SM_GET_IFACE(ROOTCONSOLE, rootconsole);
1.202 +#endif
1.203 +
1.204 + if (SDK_OnLoad(error, maxlength, late))
1.205 + {
1.206 +#if defined SMEXT_CONF_METAMOD
1.207 + m_WeAreUnloaded = true;
1.208 +#endif
1.209 + return true;
1.210 + }
1.211 +
1.212 + return false;
1.213 +}
1.214 +
1.215 +bool SDKExtension::IsMetamodExtension()
1.216 +{
1.217 +#if defined SMEXT_CONF_METAMOD
1.218 + return true;
1.219 +#else
1.220 + return false;
1.221 +#endif
1.222 +}
1.223 +
1.224 +void SDKExtension::OnExtensionPauseChange(bool state)
1.225 +{
1.226 +#if defined SMEXT_CONF_METAMOD
1.227 + m_WeGotPauseChange = true;
1.228 +#endif
1.229 + SDK_OnPauseChange(state);
1.230 +}
1.231 +
1.232 +void SDKExtension::OnExtensionsAllLoaded()
1.233 +{
1.234 + SDK_OnAllLoaded();
1.235 +}
1.236 +
1.237 +void SDKExtension::OnExtensionUnload()
1.238 +{
1.239 +#if defined SMEXT_CONF_METAMOD
1.240 + m_WeAreUnloaded = true;
1.241 +#endif
1.242 + SDK_OnUnload();
1.243 +}
1.244 +
1.245 +void SDKExtension::OnDependenciesDropped()
1.246 +{
1.247 + SDK_OnDependenciesDropped();
1.248 +}
1.249 +
1.250 +const char *SDKExtension::GetExtensionAuthor()
1.251 +{
1.252 + return SMEXT_CONF_AUTHOR;
1.253 +}
1.254 +
1.255 +const char *SDKExtension::GetExtensionDateString()
1.256 +{
1.257 + return SMEXT_CONF_DATESTRING;
1.258 +}
1.259 +
1.260 +const char *SDKExtension::GetExtensionDescription()
1.261 +{
1.262 + return SMEXT_CONF_DESCRIPTION;
1.263 +}
1.264 +
1.265 +const char *SDKExtension::GetExtensionVerString()
1.266 +{
1.267 + return SMEXT_CONF_VERSION;
1.268 +}
1.269 +
1.270 +const char *SDKExtension::GetExtensionName()
1.271 +{
1.272 + return SMEXT_CONF_NAME;
1.273 +}
1.274 +
1.275 +const char *SDKExtension::GetExtensionTag()
1.276 +{
1.277 + return SMEXT_CONF_LOGTAG;
1.278 +}
1.279 +
1.280 +const char *SDKExtension::GetExtensionURL()
1.281 +{
1.282 + return SMEXT_CONF_URL;
1.283 +}
1.284 +
1.285 +bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
1.286 +{
1.287 + return true;
1.288 +}
1.289 +
1.290 +void SDKExtension::SDK_OnUnload()
1.291 +{
1.292 +}
1.293 +
1.294 +void SDKExtension::SDK_OnPauseChange(bool paused)
1.295 +{
1.296 +}
1.297 +
1.298 +void SDKExtension::SDK_OnAllLoaded()
1.299 +{
1.300 +}
1.301 +
1.302 +void SDKExtension::SDK_OnDependenciesDropped()
1.303 +{
1.304 +}
1.305 +
1.306 +#if defined SMEXT_CONF_METAMOD
1.307 +
1.308 +PluginId g_PLID = 0; /**< Metamod plugin ID */
1.309 +ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
1.310 +SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
1.311 +ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
1.312 +
1.313 +IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
1.314 +IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
1.315 +
1.316 +/** Exposes the extension to Metamod */
1.317 +SMM_API void *PL_EXPOSURE(const char *name, int *code)
1.318 +{
1.319 +#if defined METAMOD_PLAPI_VERSION
1.320 + if (name && !strcmp(name, METAMOD_PLAPI_NAME))
1.321 +#else
1.322 + if (name && !strcmp(name, PLAPI_NAME))
1.323 +#endif
1.324 + {
1.325 + if (code)
1.326 + {
1.327 + *code = IFACE_OK;
1.328 + }
1.329 + return static_cast<void *>(g_pExtensionIface);
1.330 + }
1.331 +
1.332 + if (code)
1.333 + {
1.334 + *code = IFACE_FAILED;
1.335 + }
1.336 +
1.337 + return NULL;
1.338 +}
1.339 +
1.340 +bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
1.341 +{
1.342 + PLUGIN_SAVEVARS();
1.343 +
1.344 +#if !defined METAMOD_PLAPI_VERSION
1.345 + GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
1.346 + GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
1.347 +#else
1.348 + GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
1.349 + GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
1.350 +#endif
1.351 +
1.352 + m_SourceMMLoaded = true;
1.353 +
1.354 + return SDK_OnMetamodLoad(ismm, error, maxlen, late);
1.355 +}
1.356 +
1.357 +bool SDKExtension::Unload(char *error, size_t maxlen)
1.358 +{
1.359 + if (!m_WeAreUnloaded)
1.360 + {
1.361 + if (error)
1.362 + {
1.363 + snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
1.364 + }
1.365 + return false;
1.366 + }
1.367 +
1.368 + return SDK_OnMetamodUnload(error, maxlen);
1.369 +}
1.370 +
1.371 +bool SDKExtension::Pause(char *error, size_t maxlen)
1.372 +{
1.373 + if (!m_WeGotPauseChange)
1.374 + {
1.375 + if (error)
1.376 + {
1.377 + snprintf(error, maxlen, "This extension must be paused by SourceMod.");
1.378 + }
1.379 + return false;
1.380 + }
1.381 +
1.382 + m_WeGotPauseChange = false;
1.383 +
1.384 + return SDK_OnMetamodPauseChange(true, error, maxlen);
1.385 +}
1.386 +
1.387 +bool SDKExtension::Unpause(char *error, size_t maxlen)
1.388 +{
1.389 + if (!m_WeGotPauseChange)
1.390 + {
1.391 + if (error)
1.392 + {
1.393 + snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
1.394 + }
1.395 + return false;
1.396 + }
1.397 +
1.398 + m_WeGotPauseChange = false;
1.399 +
1.400 + return SDK_OnMetamodPauseChange(false, error, maxlen);
1.401 +}
1.402 +
1.403 +const char *SDKExtension::GetAuthor()
1.404 +{
1.405 + return GetExtensionAuthor();
1.406 +}
1.407 +
1.408 +const char *SDKExtension::GetDate()
1.409 +{
1.410 + return GetExtensionDateString();
1.411 +}
1.412 +
1.413 +const char *SDKExtension::GetDescription()
1.414 +{
1.415 + return GetExtensionDescription();
1.416 +}
1.417 +
1.418 +const char *SDKExtension::GetLicense()
1.419 +{
1.420 + return SMEXT_CONF_LICENSE;
1.421 +}
1.422 +
1.423 +const char *SDKExtension::GetLogTag()
1.424 +{
1.425 + return GetExtensionTag();
1.426 +}
1.427 +
1.428 +const char *SDKExtension::GetName()
1.429 +{
1.430 + return GetExtensionName();
1.431 +}
1.432 +
1.433 +const char *SDKExtension::GetURL()
1.434 +{
1.435 + return GetExtensionURL();
1.436 +}
1.437 +
1.438 +const char *SDKExtension::GetVersion()
1.439 +{
1.440 + return GetExtensionVerString();
1.441 +}
1.442 +
1.443 +bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
1.444 +{
1.445 + return true;
1.446 +}
1.447 +
1.448 +bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
1.449 +{
1.450 + return true;
1.451 +}
1.452 +
1.453 +bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
1.454 +{
1.455 + return true;
1.456 +}
1.457 +
1.458 +#endif
1.459 +
1.460 +/* Overload a few things to prevent libstdc++ linking */
1.461 +#if defined __linux__ || defined __APPLE__
1.462 +extern "C" void __cxa_pure_virtual(void)
1.463 +{
1.464 +}
1.465 +
1.466 +void *operator new(size_t size)
1.467 +{
1.468 + return malloc(size);
1.469 +}
1.470 +
1.471 +void *operator new[](size_t size)
1.472 +{
1.473 + return malloc(size);
1.474 +}
1.475 +
1.476 +void operator delete(void *ptr)
1.477 +{
1.478 + free(ptr);
1.479 +}
1.480 +
1.481 +void operator delete[](void * ptr)
1.482 +{
1.483 + free(ptr);
1.484 +}
1.485 +#endif
1.486 +