diff options
| author | stephanie sappho lenzo <sappho@sappho.io> | 2023-07-13 06:11:48 -0400 | 
|---|---|---|
| committer | stephanie sappho lenzo <sappho@sappho.io> | 2023-07-13 06:11:48 -0400 | 
| commit | d643bdb4bd5cda1bed5c8de79de456782c785dff (patch) | |
| tree | 014d40ad802c2495ee36212be40dab75c623d754 /sdk | |
inital commit
Diffstat (limited to 'sdk')
| -rw-r--r-- | sdk/smsdk_config.h | 83 | ||||
| -rw-r--r-- | sdk/smsdk_ext.cpp | 465 | ||||
| -rw-r--r-- | sdk/smsdk_ext.h | 339 | 
3 files changed, 887 insertions, 0 deletions
| diff --git a/sdk/smsdk_config.h b/sdk/smsdk_config.h new file mode 100644 index 0000000..8cefb2e --- /dev/null +++ b/sdk/smsdk_config.h @@ -0,0 +1,83 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod cURL Extension + * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + *  + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation.  You must obey the GNU General Public License in + * all respects for all other code used.  Additionally, AlliedModders LLC grants + * this exception to all derivative works.  AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or <http://www.sourcemod.net/license.php>. + * + * Version: $Id$ + */ + +#ifndef _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ +#define _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ + +/** + * @file smsdk_config.h + * @brief Contains macros for configuring basic extension information. + */ + +/* Basic information exposed publicly */ +#define SMEXT_CONF_NAME			"cURL Extension" +#define SMEXT_CONF_DESCRIPTION	"cURL Extension" +#define SMEXT_CONF_VERSION		"1.3.0.0" +#define SMEXT_CONF_AUTHOR		"ben" +#define SMEXT_CONF_URL			"http://www.ZombieX2.net/" +#define SMEXT_CONF_LOGTAG		"cURL" +#define SMEXT_CONF_LICENSE		"GPL" +#define SMEXT_CONF_DATESTRING	__DATE__ + +/**  + * @brief Exposes plugin's main interface. + */ +#define SMEXT_LINK(name) SDKExtension *g_pExtensionIface = name; + +/** + * @brief Sets whether or not this plugin required Metamod. + * NOTE: Uncomment to enable, comment to disable. + */ + +//#define SMEXT_CONF_METAMOD		 + + +/** Enable interfaces you want to use here by uncommenting lines */ +//#define SMEXT_ENABLE_FORWARDSYS +#define SMEXT_ENABLE_HANDLESYS +//#define SMEXT_ENABLE_PLAYERHELPERS +//#define SMEXT_ENABLE_DBMANAGER +//#define SMEXT_ENABLE_GAMECONF +//#define SMEXT_ENABLE_MEMUTILS +//#define SMEXT_ENABLE_GAMEHELPERS +//#define SMEXT_ENABLE_TIMERSYS +#define SMEXT_ENABLE_THREADER +//#define SMEXT_ENABLE_LIBSYS +//#define SMEXT_ENABLE_MENUS +//#define SMEXT_ENABLE_ADTFACTORY +//#define SMEXT_ENABLE_PLUGINSYS +//#define SMEXT_ENABLE_ADMINSYS +//#define SMEXT_ENABLE_TEXTPARSERS +//#define SMEXT_ENABLE_USERMSGS +//#define SMEXT_ENABLE_TRANSLATOR +//#define SMEXT_ENABLE_NINVOKE + +#endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ diff --git a/sdk/smsdk_ext.cpp b/sdk/smsdk_ext.cpp new file mode 100644 index 0000000..d9c49d8 --- /dev/null +++ b/sdk/smsdk_ext.cpp @@ -0,0 +1,465 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod Base Extension Code + * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + *  + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation.  You must obey the GNU General Public License in + * all respects for all other code used.  Additionally, AlliedModders LLC grants + * this exception to all derivative works.  AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or <http://www.sourcemod.net/license.php>. + * + * Version: $Id$ + */ + +#include <stdio.h> +#include <stdlib.h> +#include "smsdk_ext.h" + +/** + * @file smsdk_ext.cpp + * @brief Contains wrappers for making Extensions easier to write. + */ + +IExtension *myself = NULL;				/**< Ourself */ +IShareSys *g_pShareSys = NULL;			/**< Share system */ +IShareSys *sharesys = NULL;				/**< Share system */ +ISourceMod *g_pSM = NULL;				/**< SourceMod helpers */ +ISourceMod *smutils = NULL;				/**< SourceMod helpers */ + +#if defined SMEXT_ENABLE_FORWARDSYS +IForwardManager *g_pForwards = NULL;	/**< Forward system */ +IForwardManager *forwards = NULL;		/**< Forward system */ +#endif +#if defined SMEXT_ENABLE_HANDLESYS +IHandleSys *g_pHandleSys = NULL;		/**< Handle system */ +IHandleSys *handlesys = NULL;			/**< Handle system */ +#endif +#if defined SMEXT_ENABLE_PLAYERHELPERS +IPlayerManager *playerhelpers = NULL;	/**< Player helpers */ +#endif //SMEXT_ENABLE_PLAYERHELPERS +#if defined SMEXT_ENABLE_DBMANAGER +IDBManager *dbi = NULL;					/**< DB Manager */ +#endif //SMEXT_ENABLE_DBMANAGER +#if defined SMEXT_ENABLE_GAMECONF +IGameConfigManager *gameconfs = NULL;	/**< Game config manager */ +#endif //SMEXT_ENABLE_DBMANAGER +#if defined SMEXT_ENABLE_MEMUTILS +IMemoryUtils *memutils = NULL; +#endif //SMEXT_ENABLE_DBMANAGER +#if defined SMEXT_ENABLE_GAMEHELPERS +IGameHelpers *gamehelpers = NULL; +#endif +#if defined SMEXT_ENABLE_TIMERSYS +ITimerSystem *timersys = NULL; +#endif +#if defined SMEXT_ENABLE_ADTFACTORY +IADTFactory *adtfactory = NULL; +#endif +#if defined SMEXT_ENABLE_THREADER +IThreader *threader = NULL; +#endif +#if defined SMEXT_ENABLE_LIBSYS +ILibrarySys *libsys = NULL; +#endif +#if defined SMEXT_ENABLE_PLUGINSYS +SourceMod::IPluginManager *plsys; +#endif +#if defined SMEXT_ENABLE_MENUS +IMenuManager *menus = NULL; +#endif +#if defined SMEXT_ENABLE_ADMINSYS +IAdminSystem *adminsys = NULL; +#endif +#if defined SMEXT_ENABLE_TEXTPARSERS +ITextParsers *textparsers = NULL; +#endif +#if defined SMEXT_ENABLE_USERMSGS +IUserMessages *usermsgs = NULL; +#endif +#if defined SMEXT_ENABLE_TRANSLATOR +ITranslator *translator = NULL; +#endif +#if defined SMEXT_ENABLE_NINVOKE +INativeInterface *ninvoke = NULL; +#endif + +/** Exports the main interface */ +PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI() +{ +	return g_pExtensionIface; +} + +SDKExtension::SDKExtension() +{ +#if defined SMEXT_CONF_METAMOD +	m_SourceMMLoaded = false; +	m_WeAreUnloaded = false; +	m_WeGotPauseChange = false; +#endif +} + +bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late) +{ +	g_pShareSys = sharesys = sys; +	myself = me; + +#if defined SMEXT_CONF_METAMOD +	m_WeAreUnloaded = true; + +	if (!m_SourceMMLoaded) +	{ +		if (error) +		{ +			snprintf(error, maxlength, "Metamod attach failed"); +		} +		return false; +	} +#endif +	SM_GET_IFACE(SOURCEMOD, g_pSM); +	smutils = g_pSM; +#if defined SMEXT_ENABLE_HANDLESYS +	SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys); +	handlesys = g_pHandleSys; +#endif +#if defined SMEXT_ENABLE_FORWARDSYS +	SM_GET_IFACE(FORWARDMANAGER, g_pForwards); +	forwards = g_pForwards; +#endif +#if defined SMEXT_ENABLE_PLAYERHELPERS +	SM_GET_IFACE(PLAYERMANAGER, playerhelpers); +#endif +#if defined SMEXT_ENABLE_DBMANAGER +	SM_GET_IFACE(DBI, dbi); +#endif +#if defined SMEXT_ENABLE_GAMECONF +	SM_GET_IFACE(GAMECONFIG, gameconfs); +#endif +#if defined SMEXT_ENABLE_MEMUTILS +	SM_GET_IFACE(MEMORYUTILS, memutils); +#endif +#if defined SMEXT_ENABLE_GAMEHELPERS +	SM_GET_IFACE(GAMEHELPERS, gamehelpers); +#endif +#if defined SMEXT_ENABLE_TIMERSYS +	SM_GET_IFACE(TIMERSYS, timersys); +#endif +#if defined SMEXT_ENABLE_ADTFACTORY +	SM_GET_IFACE(ADTFACTORY, adtfactory); +#endif +#if defined SMEXT_ENABLE_THREADER +	SM_GET_IFACE(THREADER, threader); +#endif +#if defined SMEXT_ENABLE_LIBSYS +	SM_GET_IFACE(LIBRARYSYS, libsys); +#endif +#if defined SMEXT_ENABLE_PLUGINSYS +	SM_GET_IFACE(PLUGINSYSTEM, plsys); +#endif +#if defined SMEXT_ENABLE_MENUS +	SM_GET_IFACE(MENUMANAGER, menus); +#endif +#if defined SMEXT_ENABLE_ADMINSYS +	SM_GET_IFACE(ADMINSYS, adminsys); +#endif +#if defined SMEXT_ENABLE_TEXTPARSERS +	SM_GET_IFACE(TEXTPARSERS, textparsers); +#endif +#if defined SMEXT_ENABLE_USERMSGS +	SM_GET_IFACE(USERMSGS, usermsgs); +#endif +#if defined SMEXT_ENABLE_TRANSLATOR +	SM_GET_IFACE(TRANSLATOR, translator); +#endif + +	if (SDK_OnLoad(error, maxlength, late)) +	{ +#if defined SMEXT_CONF_METAMOD +		m_WeAreUnloaded = true; +#endif +		return true; +	} + +	return false; +} + +bool SDKExtension::IsMetamodExtension() +{ +#if defined SMEXT_CONF_METAMOD +	return true; +#else +	return false; +#endif +} + +void SDKExtension::OnExtensionPauseChange(bool state) +{ +#if defined SMEXT_CONF_METAMOD +	m_WeGotPauseChange = true; +#endif +	SDK_OnPauseChange(state); +} + +void SDKExtension::OnExtensionsAllLoaded() +{ +	SDK_OnAllLoaded(); +} + +void SDKExtension::OnExtensionUnload() +{ +#if defined SMEXT_CONF_METAMOD +	m_WeAreUnloaded = true; +#endif +	SDK_OnUnload(); +} + +const char *SDKExtension::GetExtensionAuthor() +{ +	return SMEXT_CONF_AUTHOR; +} + +const char *SDKExtension::GetExtensionDateString() +{ +	return SMEXT_CONF_DATESTRING; +} + +const char *SDKExtension::GetExtensionDescription() +{ +	return SMEXT_CONF_DESCRIPTION; +} + +const char *SDKExtension::GetExtensionVerString() +{ +	return SMEXT_CONF_VERSION; +} + +const char *SDKExtension::GetExtensionName() +{ +	return SMEXT_CONF_NAME; +} + +const char *SDKExtension::GetExtensionTag() +{ +	return SMEXT_CONF_LOGTAG; +} + +const char *SDKExtension::GetExtensionURL() +{ +	return SMEXT_CONF_URL; +} + +bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late) +{ +	return true; +} + +void SDKExtension::SDK_OnUnload() +{ +} + +void SDKExtension::SDK_OnPauseChange(bool paused) +{ +} + +void SDKExtension::SDK_OnAllLoaded() +{ +} + +#if defined SMEXT_CONF_METAMOD + +PluginId g_PLID = 0;						/**< Metamod plugin ID */ +ISmmPlugin *g_PLAPI = NULL;					/**< Metamod plugin API */ +SourceHook::ISourceHook *g_SHPtr = NULL;	/**< SourceHook pointer */ +ISmmAPI *g_SMAPI = NULL;					/**< SourceMM API pointer */ + +IVEngineServer *engine = NULL;				/**< IVEngineServer pointer */ +IServerGameDLL *gamedll = NULL;				/**< IServerGameDLL pointer */ + +/** Exposes the extension to Metamod */ +SMM_API void *PL_EXPOSURE(const char *name, int *code) +{ +#if defined METAMOD_PLAPI_VERSION +	if (name && !strcmp(name, METAMOD_PLAPI_NAME)) +#else +	if (name && !strcmp(name, PLAPI_NAME)) +#endif +	{ +		if (code) +		{ +			*code = IFACE_OK; +		} +		return static_cast<void *>(g_pExtensionIface); +	} + +	if (code) +	{ +		*code = IFACE_FAILED; +	} + +	return NULL; +} + +bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) +{ +	PLUGIN_SAVEVARS(); + +#if !defined METAMOD_PLAPI_VERSION +	GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); +	GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); +#else +	GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); +	GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); +#endif + +	m_SourceMMLoaded = true; + +	return SDK_OnMetamodLoad(ismm, error, maxlen, late); +} + +bool SDKExtension::Unload(char *error, size_t maxlen) +{ +	if (!m_WeAreUnloaded) +	{ +		if (error) +		{ +			snprintf(error, maxlen, "This extension must be unloaded by SourceMod."); +		} +		return false; +	} + +	return SDK_OnMetamodUnload(error, maxlen); +} + +bool SDKExtension::Pause(char *error, size_t maxlen) +{ +	if (!m_WeGotPauseChange) +	{ +		if (error) +		{ +			snprintf(error, maxlen, "This extension must be paused by SourceMod."); +		} +		return false; +	} + +	m_WeGotPauseChange = false; + +	return SDK_OnMetamodPauseChange(true, error, maxlen); +} + +bool SDKExtension::Unpause(char *error, size_t maxlen) +{ +	if (!m_WeGotPauseChange) +	{ +		if (error) +		{ +			snprintf(error, maxlen, "This extension must be unpaused by SourceMod."); +		} +		return false; +	} + +	m_WeGotPauseChange = false; + +	return SDK_OnMetamodPauseChange(false, error, maxlen); +} + +const char *SDKExtension::GetAuthor() +{ +	return GetExtensionAuthor(); +} + +const char *SDKExtension::GetDate() +{ +	return GetExtensionDateString(); +} + +const char *SDKExtension::GetDescription() +{ +	return GetExtensionDescription(); +} + +const char *SDKExtension::GetLicense() +{ +	return SMEXT_CONF_LICENSE; +} + +const char *SDKExtension::GetLogTag() +{ +	return GetExtensionTag(); +} + +const char *SDKExtension::GetName() +{ +	return GetExtensionName(); +} + +const char *SDKExtension::GetURL() +{ +	return GetExtensionURL(); +} + +const char *SDKExtension::GetVersion() +{ +	return GetExtensionVerString(); +} + +bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late) +{ +	return true; +} + +bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength) +{ +	return true; +} + +bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength) +{ +	return true; +} + +#endif + +/* Overload a few things to prevent libstdc++ linking */ +#if defined __linux__ || defined __APPLE__ +extern "C" void __cxa_pure_virtual(void) +{ +} + +void *operator new(size_t size) +{ +	return malloc(size); +} + +void *operator new[](size_t size)  +{ +	return malloc(size); +} + +void operator delete(void *ptr)  +{ +	free(ptr); +} + +void operator delete[](void * ptr) +{ +	free(ptr); +} +#endif + diff --git a/sdk/smsdk_ext.h b/sdk/smsdk_ext.h new file mode 100644 index 0000000..210db3a --- /dev/null +++ b/sdk/smsdk_ext.h @@ -0,0 +1,339 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod Base Extension Code + * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + *  + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation.  You must obey the GNU General Public License in + * all respects for all other code used.  Additionally, AlliedModders LLC grants + * this exception to all derivative works.  AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or <http://www.sourcemod.net/license.php>. + * + * Version: $Id$ + */ + +#ifndef _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_ +#define _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_ + +/** + * @file smsdk_ext.h + * @brief Contains wrappers for making Extensions easier to write. + */ + +#include "smsdk_config.h" +#include <IExtensionSys.h> +#include <IHandleSys.h> +#include <sp_vm_api.h> +#include <sm_platform.h> +#include <ISourceMod.h> +#if defined SMEXT_ENABLE_FORWARDSYS +#include <IForwardSys.h> +#endif //SMEXT_ENABLE_FORWARDSYS +#if defined SMEXT_ENABLE_PLAYERHELPERS +#include <IPlayerHelpers.h> +#endif //SMEXT_ENABLE_PlAYERHELPERS +#if defined SMEXT_ENABLE_DBMANAGER +#include <IDBDriver.h> +#endif //SMEXT_ENABLE_DBMANAGER +#if defined SMEXT_ENABLE_GAMECONF +#include <IGameConfigs.h> +#endif +#if defined SMEXT_ENABLE_MEMUTILS +#include <IMemoryUtils.h> +#endif +#if defined SMEXT_ENABLE_GAMEHELPERS +#include <IGameHelpers.h> +#endif +#if defined SMEXT_ENABLE_TIMERSYS +#include <ITimerSystem.h> +#endif +#if defined SMEXT_ENABLE_ADTFACTORY +#include <IADTFactory.h> +#endif +#if defined SMEXT_ENABLE_THREADER +#include <IThreader.h> +#endif +#if defined SMEXT_ENABLE_LIBSYS +#include <ILibrarySys.h> +#endif +#if defined SMEXT_ENABLE_PLUGINSYS +#include <IPluginSys.h> +#endif +#if defined SMEXT_ENABLE_MENUS +#include <IMenuManager.h> +#endif +#if defined SMEXT_ENABLE_ADMINSYS +#include <IAdminSystem.h> +#endif +#if defined SMEXT_ENABLE_TEXTPARSERS +#include <ITextParsers.h> +#endif +#if defined SMEXT_ENABLE_USERMSGS +#include <IUserMessages.h> +#endif +#if defined SMEXT_ENABLE_TRANSLATOR +#include <ITranslator.h> +#endif +#if defined SMEXT_ENABLE_NINVOKE +#include <INativeInvoker.h> +#endif + +#if defined SMEXT_CONF_METAMOD +#include <ISmmPlugin.h> +#include <eiface.h> +#endif + +using namespace SourceMod; +using namespace SourcePawn; + +class SDKExtension :  +#if defined SMEXT_CONF_METAMOD +	public ISmmPlugin, +#endif +	public IExtensionInterface +{ +public: +	/** Constructor */ +	SDKExtension(); +public: +	/** +	 * @brief This is called after the initial loading sequence has been processed. +	 * +	 * @param error		Error message buffer. +	 * @param maxlength	Size of error message buffer. +	 * @param late		Whether or not the module was loaded after map load. +	 * @return			True to succeed loading, false to fail. +	 */ +	virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late); +	 +	/** +	 * @brief This is called right before the extension is unloaded. +	 */ +	virtual void SDK_OnUnload(); + +	/** +	 * @brief This is called once all known extensions have been loaded. +	 */ +	virtual void SDK_OnAllLoaded(); + +	/** +	 * @brief Called when the pause state is changed. +	 */ +	virtual void SDK_OnPauseChange(bool paused); + +#if defined SMEXT_CONF_METAMOD +	/** +	 * @brief Called when Metamod is attached, before the extension version is called. +	 * +	 * @param error			Error buffer. +	 * @param maxlength		Maximum size of error buffer. +	 * @param late			Whether or not Metamod considers this a late load. +	 * @return				True to succeed, false to fail. +	 */ +	virtual bool SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late); + +	/** +	 * @brief Called when Metamod is detaching, after the extension version is called. +	 * NOTE: By default this is blocked unless sent from SourceMod. +	 * +	 * @param error			Error buffer. +	 * @param maxlength		Maximum size of error buffer. +	 * @return				True to succeed, false to fail. +	 */ +	virtual bool SDK_OnMetamodUnload(char *error, size_t maxlength); + +	/** +	 * @brief Called when Metamod's pause state is changing. +	 * NOTE: By default this is blocked unless sent from SourceMod. +	 * +	 * @param paused		Pause state being set. +	 * @param error			Error buffer. +	 * @param maxlength		Maximum size of error buffer. +	 * @return				True to succeed, false to fail. +	 */ +	virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength); +#endif + +public: //IExtensionInterface +	virtual bool OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late); +	virtual void OnExtensionUnload(); +	virtual void OnExtensionsAllLoaded(); + +	/** Returns whether or not this is a Metamod-based extension */ +	virtual bool IsMetamodExtension(); + +	/** +	 * @brief Called when the pause state changes. +	 *  +	 * @param state			True if being paused, false if being unpaused. +	 */ +	virtual void OnExtensionPauseChange(bool state); + +	/** Returns name */ +	virtual const char *GetExtensionName(); +	/** Returns URL */ +	virtual const char *GetExtensionURL(); +	/** Returns log tag */ +	virtual const char *GetExtensionTag(); +	/** Returns author */ +	virtual const char *GetExtensionAuthor(); +	/** Returns version string */ +	virtual const char *GetExtensionVerString(); +	/** Returns description string */ +	virtual const char *GetExtensionDescription(); +	/** Returns date string */ +	virtual const char *GetExtensionDateString(); +#if defined SMEXT_CONF_METAMOD +public: //ISmmPlugin +	/** Called when the extension is attached to Metamod. */ +	virtual bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlength, bool late); +	/** Returns the author to MM */ +	virtual const char *GetAuthor(); +	/** Returns the name to MM */ +	virtual const char *GetName(); +	/** Returns the description to MM */ +	virtual const char *GetDescription(); +	/** Returns the URL to MM */ +	virtual const char *GetURL(); +	/** Returns the license to MM */ +	virtual const char *GetLicense(); +	/** Returns the version string to MM */ +	virtual const char *GetVersion(); +	/** Returns the date string to MM */ +	virtual const char *GetDate(); +	/** Returns the logtag to MM */ +	virtual const char *GetLogTag(); +	/** Called on unload */ +	virtual bool Unload(char *error, size_t maxlength); +	/** Called on pause */ +	virtual bool Pause(char *error, size_t maxlength); +	/** Called on unpause */ +	virtual bool Unpause(char *error, size_t maxlength); +private: +	bool m_SourceMMLoaded; +	bool m_WeAreUnloaded; +	bool m_WeGotPauseChange; +#endif +}; + +extern SDKExtension *g_pExtensionIface; +extern IExtension *myself; + +extern IShareSys *g_pShareSys; +extern IShareSys *sharesys;				/* Note: Newer name */ +extern ISourceMod *g_pSM; +extern ISourceMod *smutils;				/* Note: Newer name */ + +/* Optional interfaces are below */ +#if defined SMEXT_ENABLE_FORWARDSYS +extern IForwardManager *g_pForwards; +extern IForwardManager *forwards;		/* Note: Newer name */ +#endif //SMEXT_ENABLE_FORWARDSYS +#if defined SMEXT_ENABLE_HANDLESYS +extern IHandleSys *g_pHandleSys; +extern IHandleSys *handlesys;			/* Note: Newer name */ +#endif //SMEXT_ENABLE_HANDLESYS +#if defined SMEXT_ENABLE_PLAYERHELPERS +extern IPlayerManager *playerhelpers; +#endif //SMEXT_ENABLE_PLAYERHELPERS +#if defined SMEXT_ENABLE_DBMANAGER +extern IDBManager *dbi; +#endif //SMEXT_ENABLE_DBMANAGER +#if defined SMEXT_ENABLE_GAMECONF +extern IGameConfigManager *gameconfs; +#endif //SMEXT_ENABLE_DBMANAGER +#if defined SMEXT_ENABLE_MEMUTILS +extern IMemoryUtils *memutils; +#endif +#if defined SMEXT_ENABLE_GAMEHELPERS +extern IGameHelpers *gamehelpers; +#endif +#if defined SMEXT_ENABLE_TIMERSYS +extern ITimerSystem *timersys; +#endif +#if defined SMEXT_ENABLE_ADTFACTORY +extern IADTFactory *adtfactory; +#endif +#if defined SMEXT_ENABLE_THREADER +extern IThreader *threader; +#endif +#if defined SMEXT_ENABLE_LIBSYS +extern ILibrarySys *libsys; +#endif +#if defined SMEXT_ENABLE_PLUGINSYS +extern SourceMod::IPluginManager *plsys; +#endif +#if defined SMEXT_ENABLE_MENUS +extern IMenuManager *menus; +#endif +#if defined SMEXT_ENABLE_ADMINSYS +extern IAdminSystem *adminsys; +#endif +#if defined SMEXT_ENABLE_USERMSGS +extern IUserMessages *usermsgs; +#endif +#if defined SMEXT_ENABLE_TRANSLATOR +extern ITranslator *translator; +#endif +#if defined SMEXT_ENABLE_NINVOKE +extern INativeInterface *ninvoke; +#endif + +#if defined SMEXT_CONF_METAMOD +PLUGIN_GLOBALVARS(); +extern IVEngineServer *engine; +extern IServerGameDLL *gamedll; +#endif + +/** Creates a SourceMod interface macro pair */ +#define SM_MKIFACE(name) SMINTERFACE_##name##_NAME, SMINTERFACE_##name##_VERSION +/** Automates retrieving SourceMod interfaces */ +#define SM_GET_IFACE(prefix, addr) \ +	if (!g_pShareSys->RequestInterface(SM_MKIFACE(prefix), myself, (SMInterface **)&addr)) \ +	{ \ +		if (error != NULL && maxlength) \ +		{ \ +			size_t len = snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \ +			if (len >= maxlength) \ +			{ \ +				error[maxlength - 1] = '\0'; \ +			} \ +		} \ +		return false; \ +	} +/** Automates retrieving SourceMod interfaces when needed outside of SDK_OnLoad() */ +#define SM_GET_LATE_IFACE(prefix, addr) \ +	g_pShareSys->RequestInterface(SM_MKIFACE(prefix), myself, (SMInterface **)&addr) +/** Validates a SourceMod interface pointer */ +#define SM_CHECK_IFACE(prefix, addr) \ +	if (!addr) \ +	{ \ +		if (error != NULL && maxlength) \ +		{ \ +			size_t len = snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \ +			if (len >= maxlength) \ +			{ \ +				error[maxlength - 1] = '\0'; \ +			} \ +		} \ +		return false; \ +	} + +#endif // _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_ | 
