Improved the logging situation.
This commit is contained in:
		
							parent
							
								
									b2444071ea
								
							
						
					
					
						commit
						7c7fa9a21b
					
				| @ -37,7 +37,6 @@ def BuildExtension(): | |||||||
| 	compiler = SM.DefaultCompiler() | 	compiler = SM.DefaultCompiler() | ||||||
| 
 | 
 | ||||||
| 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'extension')) | 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'extension')) | ||||||
| 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'extension', 'sdk')) |  | ||||||
| 	 | 	 | ||||||
| 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.cache['SOURCEMOD15'], 'public')) | 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.cache['SOURCEMOD15'], 'public')) | ||||||
| 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.cache['SOURCEMOD15'], 'public', 'extensions')) | 	compiler['CXXINCLUDES'].append(os.path.join(AMBuild.cache['SOURCEMOD15'], 'public', 'extensions')) | ||||||
| @ -56,9 +55,10 @@ def BuildExtension(): | |||||||
| 	binary.AddSourceFiles('extension', [ | 	binary.AddSourceFiles('extension', [ | ||||||
| 		'extension.cpp', | 		'extension.cpp', | ||||||
| 		'MemoryDownloader.cpp', | 		'MemoryDownloader.cpp', | ||||||
| 		'sdk/smsdk_ext.cpp' |  | ||||||
| 	]) | 	]) | ||||||
| 
 | 
 | ||||||
|  | 	binary.AddSourceFiles(AMBuild.cache['SOURCEMOD15'], ['public/smsdk_ext.cpp']) | ||||||
|  | 
 | ||||||
| 	if AMBuild.target['platform'] in ['linux']: | 	if AMBuild.target['platform'] in ['linux']: | ||||||
| 		link = os.path.join(AMBuild.outputFolder, extension.workFolder, 'libbreakpad_client.a') | 		link = os.path.join(AMBuild.outputFolder, extension.workFolder, 'libbreakpad_client.a') | ||||||
| 		target = os.path.join(AMBuild.outputFolder, 'breakpad', 'src', 'client', 'linux', 'libbreakpad_client.a') | 		target = os.path.join(AMBuild.outputFolder, 'breakpad', 'src', 'client', 'linux', 'libbreakpad_client.a') | ||||||
|  | |||||||
| @ -48,7 +48,9 @@ GetSpew_t GetSpew; | |||||||
| 
 | 
 | ||||||
| char spewBuffer[65536]; // Hi.
 | char spewBuffer[65536]; // Hi.
 | ||||||
| 
 | 
 | ||||||
| char buffer[512]; | char dumpStoragePath[512]; | ||||||
|  | char logPath[512]; | ||||||
|  | 
 | ||||||
| google_breakpad::ExceptionHandler *handler = NULL; | google_breakpad::ExceptionHandler *handler = NULL; | ||||||
| 
 | 
 | ||||||
| struct PluginInfo { | struct PluginInfo { | ||||||
| @ -91,10 +93,10 @@ static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, | |||||||
| 		return succeeded; | 		return succeeded; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	my_strlcpy(buffer, descriptor.path(), sizeof(buffer)); | 	my_strlcpy(dumpStoragePath, descriptor.path(), sizeof(dumpStoragePath)); | ||||||
| 	my_strlcat(buffer, ".txt", sizeof(buffer)); | 	my_strlcat(dumpStoragePath, ".txt", sizeof(dumpStoragePath)); | ||||||
| 
 | 
 | ||||||
| 	int extra = sys_open(buffer, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); | 	int extra = sys_open(dumpStoragePath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); | ||||||
| 	if (extra == -1) { | 	if (extra == -1) { | ||||||
| 		sys_write(STDOUT_FILENO, "Failed to open metadata file!\n", 30); | 		sys_write(STDOUT_FILENO, "Failed to open metadata file!\n", 30); | ||||||
| 		return succeeded; | 		return succeeded; | ||||||
| @ -234,9 +236,9 @@ static bool dumpCallback(const wchar_t* dump_path, | |||||||
| 
 | 
 | ||||||
| 	printf("Wrote minidump to: %ls\\%ls.dmp\n", dump_path, minidump_id); | 	printf("Wrote minidump to: %ls\\%ls.dmp\n", dump_path, minidump_id); | ||||||
| 
 | 
 | ||||||
| 	sprintf(buffer, "%ls\\%ls.txt", dump_path, minidump_id); | 	sprintf(dumpStoragePath, "%ls\\%ls.txt", dump_path, minidump_id); | ||||||
| 
 | 
 | ||||||
| 	FILE *extra = fopen(buffer, L"wb"); | 	FILE *extra = fopen(dumpStoragePath, L"wb"); | ||||||
| 	if (!extra) { | 	if (!extra) { | ||||||
| 		printf("Failed to open metadata file!\n"); | 		printf("Failed to open metadata file!\n"); | ||||||
| 		return succeeded; | 		return succeeded; | ||||||
| @ -255,7 +257,7 @@ static bool dumpCallback(const wchar_t* dump_path, | |||||||
| #error Bad platform. | #error Bad platform. | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| void UploadCrashDump(const char *path) | bool UploadAndDeleteCrashDump(const char *path, char *response, int maxlen) | ||||||
| { | { | ||||||
| 	IWebForm *form = webternet->CreateForm(); | 	IWebForm *form = webternet->CreateForm(); | ||||||
| 
 | 
 | ||||||
| @ -266,8 +268,7 @@ void UploadCrashDump(const char *path) | |||||||
| 	form->AddFile("upload_file_minidump", path); | 	form->AddFile("upload_file_minidump", path); | ||||||
| 
 | 
 | ||||||
| 	char metapath[512]; | 	char metapath[512]; | ||||||
| 	strcpy(metapath, path); | 	g_pSM->Format(metapath, sizeof(metapath), "%s.txt", path); | ||||||
| 	strcat(metapath, ".txt"); |  | ||||||
| 	if (libsys->PathExists(metapath)) { | 	if (libsys->PathExists(metapath)) { | ||||||
| 		form->AddFile("upload_file_metadata", metapath); | 		form->AddFile("upload_file_metadata", metapath); | ||||||
| 	} | 	} | ||||||
| @ -276,76 +277,85 @@ void UploadCrashDump(const char *path) | |||||||
| 	IWebTransfer *xfer = webternet->CreateSession(); | 	IWebTransfer *xfer = webternet->CreateSession(); | ||||||
| 	xfer->SetFailOnHTTPError(true); | 	xfer->SetFailOnHTTPError(true); | ||||||
| 
 | 
 | ||||||
| 	printf(">>> UPLOADING %s\n", path); | 	bool uploaded = xfer->PostAndDownload("http://crash.limetech.org/submit", form, &data, NULL);	 | ||||||
| 	 | 
 | ||||||
| 	if (!xfer->PostAndDownload("http://crash.limetech.org/submit", form, &data, NULL)) | 	if (response) { | ||||||
| 	{ | 		if (uploaded) { | ||||||
| 		printf(">>> UPLOAD FAILED: %s (%d)\n", xfer->LastErrorMessage(), xfer->LastErrorCode()); | 			g_pSM->Format(response, maxlen, "%s", data.GetBuffer()); | ||||||
| 	} else { | 		} else { | ||||||
| 		printf(">>> UPLOADED CRASH DUMP"); | 			g_pSM->Format(response, maxlen, "%s (%d)", xfer->LastErrorMessage(), xfer->LastErrorCode()); | ||||||
| 		printf("%s", data.GetBuffer()); | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (libsys->PathExists(metapath)) { | 	if (libsys->PathExists(metapath)) { | ||||||
| 		unlink(metapath); | 		unlink(metapath); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	unlink(path); | ||||||
|  | 
 | ||||||
|  | 	return uploaded; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class UploadThread: public IThread { | class UploadThread: public IThread | ||||||
| void RunThread(IThreadHandle *pHandle) |  | ||||||
| { | { | ||||||
| 	printf("Upload thread started.\n"); | 	void RunThread(IThreadHandle *pHandle) { | ||||||
|  | 		rootconsole->ConsolePrint("Accelerator upload thread started."); | ||||||
| 
 | 
 | ||||||
| 	IDirectory *dumps = libsys->OpenDirectory(buffer); | 		FILE *log = fopen(logPath, "a"); | ||||||
|  | 		if (!log) { | ||||||
|  | 			g_pSM->LogError(myself, "Failed to open Accelerator log file: %s", logPath); | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 	char path[512]; | 		IDirectory *dumps = libsys->OpenDirectory(dumpStoragePath); | ||||||
| 	int count = 0; | 
 | ||||||
|  | 		int count = 0; | ||||||
|  | 		int failed = 0; | ||||||
|  | 		char path[512]; | ||||||
|  | 		char response[512]; | ||||||
|  | 
 | ||||||
|  | 		while (dumps->MoreFiles()) { | ||||||
|  | 			if (!dumps->IsEntryFile()) { | ||||||
|  | 				dumps->NextEntry(); | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			const char *name = dumps->GetEntryName(); | ||||||
|  | 
 | ||||||
|  | 			int namelen = strlen(name); | ||||||
|  | 			if (namelen < 4 || strcmp(&name[namelen-4], ".dmp") != 0) { | ||||||
|  | 				dumps->NextEntry(); | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			g_pSM->Format(path, sizeof(path), "%s/%s", dumpStoragePath, name); | ||||||
|  | 			bool uploaded = UploadAndDeleteCrashDump(path, response, sizeof(response)); | ||||||
|  | 
 | ||||||
|  | 			if (uploaded) { | ||||||
|  | 				count++; | ||||||
|  | 				g_pSM->LogError(myself, "Accelerator uploaded crash dump: %s", response); | ||||||
|  | 				if (log) fprintf(log, "Uploaded crash dump: %s\n", response); | ||||||
|  | 			} else { | ||||||
|  | 				failed++; | ||||||
|  | 				g_pSM->LogError(myself, "Accelerator failed to upload crash dump: %s", response); | ||||||
|  |                                 if (log) fprintf(log, "Failed to upload crash dump: %s\n", response); | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 	while (dumps->MoreFiles()) |  | ||||||
| 	{ |  | ||||||
| 		if (!dumps->IsEntryFile()) |  | ||||||
| 		{ |  | ||||||
| 			dumps->NextEntry(); | 			dumps->NextEntry(); | ||||||
| 			continue; |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		const char *name = dumps->GetEntryName(); | 		libsys->CloseDirectory(dumps); | ||||||
| 		int namelen = strlen(name); |  | ||||||
| 
 | 
 | ||||||
| 		if (namelen < 4 || strcmp(&name[namelen-4], ".dmp") != 0) { | 		if (log) { | ||||||
| 			dumps->NextEntry(); | 			fclose(log); | ||||||
| 			continue; |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		g_pSM->Format(path, sizeof(path), "%s/%s", buffer, name); | 		rootconsole->ConsolePrint("Accelerator upload thread finished. (%d uploaded, %d failed)", count, failed); | ||||||
| 		UploadCrashDump(path); |  | ||||||
| 		 |  | ||||||
| 		int err = 0; |  | ||||||
| #if defined _LINUX |  | ||||||
| 		err = unlink(path); |  | ||||||
| #elif defined _WINDOWS |  | ||||||
| 		err = _unlink(path); |  | ||||||
| #else |  | ||||||
| #error Bad platform. |  | ||||||
| #endif |  | ||||||
| 		if (err != 0) { |  | ||||||
| 			printf(">>> FAILED TO DELETE CRASH DUMP!!!\n"); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		count++; |  | ||||||
| 		dumps->NextEntry(); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	libsys->CloseDirectory(dumps); | 	void OnTerminate(IThreadHandle *pHandle, bool cancel) { | ||||||
| 	 | 		rootconsole->ConsolePrint("Accelerator upload thread terminated. (canceled = %s)", (cancel ? "true" : "false")); | ||||||
| 	if (count > 0) { |  | ||||||
| 		printf(">>> UPLOADED %d CRASH DUMPS\n", count); |  | ||||||
| 	} | 	} | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void OnTerminate(IThreadHandle *pHandle, bool cancel) { |  | ||||||
| 	printf("Upload thread terminated. (%s)\n", (cancel ? "true" : "false")); |  | ||||||
| } |  | ||||||
| } uploadThread; | } uploadThread; | ||||||
| 
 | 
 | ||||||
| bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | ||||||
| @ -353,18 +363,20 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	sharesys->AddDependency(myself, "webternet.ext", true, true); | 	sharesys->AddDependency(myself, "webternet.ext", true, true); | ||||||
| 	SM_GET_IFACE(WEBTERNET, webternet); | 	SM_GET_IFACE(WEBTERNET, webternet); | ||||||
| 
 | 
 | ||||||
| 	g_pSM->BuildPath(Path_SM, buffer, sizeof(buffer), "data/dumps"); | 	g_pSM->BuildPath(Path_SM, dumpStoragePath, sizeof(dumpStoragePath), "data/dumps"); | ||||||
| 
 | 
 | ||||||
| 	if (!libsys->IsPathDirectory(buffer)) | 	if (!libsys->IsPathDirectory(dumpStoragePath)) | ||||||
| 	{ | 	{ | ||||||
| 		if (!libsys->CreateFolder(buffer)) | 		if (!libsys->CreateFolder(dumpStoragePath)) | ||||||
| 		{ | 		{ | ||||||
| 			if (error) | 			if (error) | ||||||
| 				g_pSM->Format(error, maxlength, "%s didn't exist and we couldn't create it :(", buffer); | 				g_pSM->Format(error, maxlength, "%s didn't exist and we couldn't create it :(", dumpStoragePath); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	g_pSM->BuildPath(Path_SM, logPath, sizeof(logPath), "logs/accelerator.log"); | ||||||
|  | 
 | ||||||
| 	threader->MakeThread(&uploadThread); | 	threader->MakeThread(&uploadThread); | ||||||
| 
 | 
 | ||||||
| 	if (!gameconfs->LoadGameConfigFile("accelerator.games", &gameconfig, error, maxlength)) { | 	if (!gameconfs->LoadGameConfigFile("accelerator.games", &gameconfig, error, maxlength)) { | ||||||
| @ -378,7 +390,7 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| #if defined _LINUX | #if defined _LINUX | ||||||
| 	google_breakpad::MinidumpDescriptor descriptor(buffer); | 	google_breakpad::MinidumpDescriptor descriptor(dumpStoragePath); | ||||||
| 	handler = new google_breakpad::ExceptionHandler(descriptor, NULL, dumpCallback, NULL, true, -1); | 	handler = new google_breakpad::ExceptionHandler(descriptor, NULL, dumpCallback, NULL, true, -1); | ||||||
| 
 | 
 | ||||||
| 	struct sigaction oact; | 	struct sigaction oact; | ||||||
| @ -387,8 +399,8 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) | |||||||
| 	 | 	 | ||||||
| 	g_pSM->AddGameFrameHook(OnGameFrame); | 	g_pSM->AddGameFrameHook(OnGameFrame); | ||||||
| #elif defined _WINDOWS | #elif defined _WINDOWS | ||||||
| 	wchar_t *buf = new wchar_t[sizeof(buffer)]; | 	wchar_t *buf = new wchar_t[sizeof(dumpStoragePath)]; | ||||||
| 	size_t num_chars = mbstowcs(buf, buffer, sizeof(buffer)); | 	size_t num_chars = mbstowcs(buf, dumpStoragePath, sizeof(dumpStoragePath)); | ||||||
| 
 | 
 | ||||||
| 	handler = new google_breakpad::ExceptionHandler(std::wstring(buf, num_chars), NULL, dumpCallback, NULL, google_breakpad::ExceptionHandler::HANDLER_ALL); | 	handler = new google_breakpad::ExceptionHandler(std::wstring(buf, num_chars), NULL, dumpCallback, NULL, google_breakpad::ExceptionHandler::HANDLER_ALL); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ | |||||||
|  * @brief Accelerator extension code header. |  * @brief Accelerator extension code header. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "smsdk_ext.hpp" | #include "smsdk_ext.h" | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * @brief Sample implementation of the SDK Extension. |  * @brief Sample implementation of the SDK Extension. | ||||||
|  | |||||||
| @ -1,465 +0,0 @@ | |||||||
| /**
 |  | ||||||
|  * 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.hpp" |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * @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 |  | ||||||
| 
 |  | ||||||
| @ -1,339 +0,0 @@ | |||||||
| /**
 |  | ||||||
|  * 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.hpp |  | ||||||
|  * @brief Contains wrappers for making Extensions easier to write. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include "smsdk_config.hpp" |  | ||||||
| #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_
 |  | ||||||
| @ -76,5 +76,6 @@ | |||||||
| //#define SMEXT_ENABLE_USERMSGS
 | //#define SMEXT_ENABLE_USERMSGS
 | ||||||
| //#define SMEXT_ENABLE_TRANSLATOR
 | //#define SMEXT_ENABLE_TRANSLATOR
 | ||||||
| //#define SMEXT_ENABLE_NINVOKE
 | //#define SMEXT_ENABLE_NINVOKE
 | ||||||
|  | #define SMEXT_ENABLE_ROOTCONSOLEMENU | ||||||
| 
 | 
 | ||||||
| #endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_
 | #endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user