dvander@560: /** ds@653: * vim: set ts=4 : ds@1330: * ============================================================================= dvander@1231: * SourceMod ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= dvander@560: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. dvander@1231: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. dvander@1231: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . dvander@1231: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . dvander@560: * dvander@560: * Version: $Id$ dvander@560: */ dvander@560: dvander@595: #include dvander@978: #include dvander@1333: #include dvander@978: #include "sm_stringutil.h" dvander@560: #include "sm_globals.h" dvander@560: #include "sourcemod.h" dvander@618: #include "PluginSys.h" dvander@618: #include "HandleSys.h" dvander@978: #include "LibrarySys.h" dvander@1371: #include "TimerSys.h" dvander@1378: #include "ForwardSys.h" dvander@1378: #include "Logger.h" dvander@1419: #include "ExtensionSys.h" dvander@618: dvander@886: #if defined PLATFORM_WINDOWS dvander@886: #include dvander@886: #elif defined PLATFORM_LINUX dvander@886: #include dvander@886: #include dvander@886: #include dvander@886: #endif dvander@886: dvander@618: HandleType_t g_PlIter; faluco@1359: ConVar sm_datetime_format("sm_datetime_format", "%m/%d/%Y - %H:%M:%S", 0, "Default formatting time rules"); dvander@1378: IForward *g_OnLogAction = NULL; dvander@618: dvander@618: class CoreNativeHelpers : dvander@618: public SMGlobalClass, dvander@618: public IHandleTypeDispatch dvander@618: { dvander@618: public: dvander@618: void OnSourceModAllInitialized() dvander@618: { dvander@618: HandleAccess hacc; dvander@618: g_HandleSys.InitAccessDefaults(NULL, &hacc); dvander@618: hacc.access[HandleAccess_Clone] = HANDLE_RESTRICT_IDENTITY|HANDLE_RESTRICT_OWNER; dvander@618: dvander@618: g_PlIter = g_HandleSys.CreateType("PluginIterator", this, 0, NULL, NULL, g_pCoreIdent, NULL); dvander@1378: dvander@1378: g_OnLogAction = g_Forwards.CreateForward("OnLogAction", dvander@1378: ET_Hook, dvander@1378: 5, dvander@1378: NULL, dvander@1378: Param_Cell, dvander@1378: Param_Cell, dvander@1378: Param_Cell, dvander@1378: Param_Cell, dvander@1378: Param_String); dvander@618: } dvander@618: void OnHandleDestroy(HandleType_t type, void *object) dvander@618: { dvander@618: IPluginIterator *iter = (IPluginIterator *)object; dvander@618: iter->Release(); dvander@618: } dvander@618: void OnSourceModShutdown() dvander@618: { dvander@1378: g_Forwards.ReleaseForward(g_OnLogAction); dvander@618: g_HandleSys.RemoveType(g_PlIter, g_pCoreIdent); dvander@618: } dvander@618: } g_CoreNativeHelpers; dvander@618: dvander@1378: void LogAction(Handle_t hndl, int type, int client, int target, const char *message) dvander@1378: { dvander@1458: if (g_OnLogAction->GetFunctionCount()) dvander@1378: { dvander@1458: cell_t result = 0; dvander@1458: g_OnLogAction->PushCell(hndl); dvander@1458: g_OnLogAction->PushCell(type); dvander@1458: g_OnLogAction->PushCell(client); dvander@1458: g_OnLogAction->PushCell(target); dvander@1458: g_OnLogAction->PushString(message); dvander@1458: g_OnLogAction->Execute(&result); dvander@1378: dvander@1458: if (result >= (ResultType)Pl_Handled) dvander@1458: { dvander@1458: return; dvander@1458: } dvander@1378: } dvander@1378: dvander@1378: const char *logtag = "SM"; dvander@1378: if (type == 2) dvander@1378: { dvander@1378: HandleError err; dvander@1378: IPlugin *pPlugin = g_PluginSys.PluginFromHandle(hndl, &err); dvander@1378: if (pPlugin) dvander@1378: { dvander@1378: logtag = pPlugin->GetFilename(); dvander@1378: } dvander@1378: } dvander@1378: dvander@1378: g_Logger.LogMessage("[%s] %s", logtag, message); dvander@1378: } dvander@560: dvander@560: static cell_t ThrowError(IPluginContext *pContext, const cell_t *params) dvander@560: { dvander@560: char buffer[512]; dvander@560: dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE); dvander@1011: dvander@560: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1); dvander@560: dvander@2193: if (pContext->GetLastNativeError() == SP_ERROR_NONE) dvander@560: { dvander@560: pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", buffer); dvander@560: } dvander@560: dvander@560: return 0; dvander@560: } dvander@560: dvander@595: static cell_t GetTime(IPluginContext *pContext, const cell_t *params) dvander@595: { dvander@1371: time_t t = GetAdjustedTime(); dvander@595: cell_t *addr; dvander@595: pContext->LocalToPhysAddr(params[1], &addr); dvander@595: dvander@595: *(time_t *)addr = t; dvander@595: dvander@595: return static_cast(t); dvander@595: } dvander@595: dvander@1333: #if defined SUBPLATFORM_SECURECRT dvander@1333: void _ignore_invalid_parameter( dvander@1333: const wchar_t * expression, dvander@1333: const wchar_t * function, dvander@1333: const wchar_t * file, dvander@1333: unsigned int line, dvander@1333: uintptr_t pReserved dvander@1333: ) dvander@1333: { dvander@1333: /* Wow we don't care, thanks Microsoft. */ dvander@1333: } dvander@1333: #endif dvander@1333: faluco@1037: static cell_t FormatTime(IPluginContext *pContext, const cell_t *params) faluco@1037: { faluco@1037: char *format, *buffer; faluco@1037: pContext->LocalToString(params[1], &buffer); faluco@1359: pContext->LocalToStringNULL(params[3], &format); faluco@1359: faluco@1359: if (format == NULL) faluco@1359: { faluco@1359: format = const_cast(sm_datetime_format.GetString()); faluco@1359: } faluco@1037: dvander@1333: #if defined SUBPLATFORM_SECURECRT dvander@1333: _invalid_parameter_handler handler = _set_invalid_parameter_handler(_ignore_invalid_parameter); dvander@1333: #endif dvander@1333: dvander@1371: time_t t = (params[4] == -1) ? GetAdjustedTime() : (time_t)params[4]; dvander@1333: size_t written = strftime(buffer, params[2], format, localtime(&t)); dvander@1333: dvander@1333: #if defined SUBPLATFORM_SECURECRT dvander@1333: _set_invalid_parameter_handler(handler); dvander@1333: #endif dvander@1333: dvander@1333: if (params[2] && format[0] != '\0' && !written) dvander@1333: { dvander@1333: pContext->ThrowNativeError("Invalid time format or buffer too small"); dvander@1333: return 0; dvander@1333: } faluco@1037: faluco@1037: return 1; faluco@1037: } faluco@1037: dvander@618: static cell_t GetPluginIterator(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: IPluginIterator *iter = g_PluginSys.GetPluginIterator(); dvander@618: dvander@618: Handle_t hndl = g_HandleSys.CreateHandle(g_PlIter, iter, pContext->GetIdentity(), g_pCoreIdent, NULL); dvander@618: dvander@618: if (hndl == BAD_HANDLE) dvander@618: { dvander@618: iter->Release(); dvander@618: } dvander@618: dvander@618: return hndl; dvander@618: } dvander@618: dvander@618: static cell_t MorePlugins(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: Handle_t hndl = (Handle_t)params[1]; dvander@618: HandleError err; dvander@618: IPluginIterator *pIter; dvander@618: dvander@618: HandleSecurity sec; dvander@618: sec.pIdentity = g_pCoreIdent; dvander@618: sec.pOwner = pContext->GetIdentity(); dvander@618: dvander@618: if ((err=g_HandleSys.ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None) dvander@618: { dvander@618: return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); dvander@618: } dvander@618: dvander@618: return pIter->MorePlugins() ? 1 : 0; dvander@618: } dvander@618: dvander@618: static cell_t ReadPlugin(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: Handle_t hndl = (Handle_t)params[1]; dvander@618: HandleError err; dvander@618: IPluginIterator *pIter; dvander@618: dvander@618: HandleSecurity sec; dvander@618: sec.pIdentity = g_pCoreIdent; dvander@618: sec.pOwner = pContext->GetIdentity(); dvander@618: dvander@618: if ((err=g_HandleSys.ReadHandle(hndl, g_PlIter, &sec, (void **)&pIter)) != HandleError_None) dvander@618: { dvander@618: return pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); dvander@618: } dvander@618: dvander@618: CPlugin *pPlugin = (CPlugin *)pIter->GetPlugin(); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return BAD_HANDLE; dvander@618: } dvander@618: dvander@618: pIter->NextPlugin(); dvander@618: dvander@618: return pPlugin->GetMyHandle(); dvander@618: } dvander@618: dvander@618: CPlugin *GetPluginFromHandle(IPluginContext *pContext, Handle_t hndl) dvander@618: { dvander@618: if (hndl == BAD_HANDLE) dvander@618: { dvander@618: return g_PluginSys.GetPluginByCtx(pContext->GetContext()); dvander@618: } else { dvander@618: HandleError err; dvander@618: CPlugin *pPlugin = (CPlugin *)g_PluginSys.PluginFromHandle(hndl, &err); dvander@618: if (!pPlugin) dvander@618: { dvander@618: pContext->ThrowNativeError("Could not read Handle %x (error %d)", hndl, err); dvander@618: } dvander@618: return pPlugin; dvander@618: } dvander@618: } dvander@618: dvander@618: static cell_t GetPluginStatus(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: return pPlugin->GetStatus(); dvander@618: } dvander@618: dvander@618: static cell_t GetPluginFilename(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: pContext->StringToLocalUTF8(params[2], params[3], pPlugin->GetFilename(), NULL); dvander@618: dvander@618: return 1; dvander@618: } dvander@618: dvander@618: static cell_t IsPluginDebugging(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: return pPlugin->IsDebugging() ? 1 : 0; dvander@618: } dvander@618: dvander@618: /* Local to plugins only */ dvander@618: enum PluginInfo dvander@618: { dvander@618: PlInfo_Name, /**< Plugin name */ dvander@618: PlInfo_Author, /**< Plugin author */ dvander@618: PlInfo_Description, /**< Plugin description */ dvander@618: PlInfo_Version, /**< Plugin verison */ dvander@618: PlInfo_URL, /**< Plugin URL */ dvander@618: }; dvander@618: dvander@618: static cell_t GetPluginInfo(IPluginContext *pContext, const cell_t *params) dvander@618: { dvander@618: CPlugin *pPlugin = GetPluginFromHandle(pContext, params[1]); dvander@618: if (!pPlugin) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: const sm_plugininfo_t *info = pPlugin->GetPublicInfo(); dvander@618: dvander@618: if (!info) dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: const char *str = NULL; dvander@618: dvander@618: switch ((PluginInfo)params[2]) dvander@618: { dvander@618: case PlInfo_Name: dvander@618: { dvander@618: str = info->name; dvander@618: break; dvander@618: } dvander@618: case PlInfo_Author: dvander@618: { dvander@618: str = info->author; dvander@618: break; dvander@618: } dvander@618: case PlInfo_Description: dvander@618: { dvander@618: str = info->description; dvander@618: break; dvander@618: } dvander@618: case PlInfo_Version: dvander@618: { dvander@618: str = info->version; dvander@618: break; dvander@618: } dvander@618: case PlInfo_URL: dvander@618: { dvander@618: str = info->url; dvander@618: break; dvander@618: } dvander@618: } dvander@618: dvander@618: if (!str || str[0] == '\0') dvander@618: { dvander@618: return 0; dvander@618: } dvander@618: dvander@618: pContext->StringToLocalUTF8(params[3], params[4], str, NULL); dvander@618: dvander@618: return 1; dvander@618: } dvander@618: dvander@837: static cell_t SetFailState(IPluginContext *pContext, const cell_t *params) dvander@837: { dvander@837: char *str; dvander@1833: CPlugin *pPlugin; dvander@1833: dvander@837: pContext->LocalToString(params[1], &str); dvander@1833: pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext()); dvander@1833: dvander@1833: if (params[0] == 1) dvander@1833: { dvander@1833: pPlugin->SetErrorState(Plugin_Error, "%s", str); dvander@1833: dvander@1833: return pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", str); dvander@1833: } dvander@1833: else dvander@1833: { dvander@1833: char buffer[2048]; dvander@837: dvander@1833: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1); dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE) dvander@1833: { dvander@1833: pPlugin->SetErrorState(Plugin_Error, "%s", str); dvander@1833: return pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "Formatting error (%s)", str); dvander@1833: } dvander@1833: else dvander@1833: { dvander@1833: pPlugin->SetErrorState(Plugin_Error, "%s", buffer); dvander@1833: return pContext->ThrowNativeErrorEx(SP_ERROR_ABORTED, "%s", buffer); dvander@1833: } dvander@1833: } dvander@837: dvander@1833: return 0; dvander@837: } dvander@837: dvander@886: static cell_t GetSysTickCount(IPluginContext *pContext, const cell_t *params) dvander@886: { dvander@886: #if defined PLATFORM_WINDOWS dvander@886: return (cell_t)GetTickCount(); dvander@886: #elif defined PLATFORM_LINUX dvander@886: tms tm; dvander@886: clock_t ticks = times(&tm); dvander@886: long ticks_per_sec = sysconf(_SC_CLK_TCK); ds@889: double fticks = (double)ticks / (double)ticks_per_sec; dvander@886: fticks *= 1000.0f; dvander@886: if (fticks > INT_MAX) dvander@886: { dvander@886: double r = (int)(fticks / INT_MAX) * (double)INT_MAX; dvander@886: fticks -= r; dvander@886: } dvander@886: return (cell_t)fticks; dvander@2471: #elif defined PLATFORM_APPLE dvander@2471: assert(false); dvander@2471: return 0; dvander@886: #endif dvander@886: } dvander@886: dvander@978: static cell_t AutoExecConfig(IPluginContext *pContext, const cell_t *params) dvander@978: { dvander@978: CPlugin *plugin = g_PluginSys.GetPluginByCtx(pContext->GetContext()); dvander@978: dvander@978: char *cfg, *folder; dvander@978: pContext->LocalToString(params[2], &cfg); dvander@978: pContext->LocalToString(params[3], &folder); dvander@978: dvander@978: if (cfg[0] == '\0') dvander@978: { dvander@978: static char temp_str[255]; dvander@978: static char temp_file[PLATFORM_MAX_PATH]; dvander@978: char *ptr; dvander@978: dvander@978: g_LibSys.GetFileFromPath(temp_str, sizeof(temp_str), plugin->GetFilename()); dvander@978: if ((ptr = strstr(temp_str, ".smx")) != NULL) dvander@978: { dvander@978: *ptr = '\0'; dvander@978: } dvander@978: dvander@978: /* We have the raw filename! */ dvander@978: UTIL_Format(temp_file, sizeof(temp_file), "plugin.%s", temp_str); dvander@978: cfg = temp_file; dvander@978: } dvander@978: dvander@978: plugin->AddConfig(params[1] ? true : false, cfg, folder); dvander@978: dvander@978: return 1; dvander@978: } dvander@978: faluco@1089: static cell_t MarkNativeAsOptional(IPluginContext *pContext, const cell_t *params) faluco@1089: { faluco@1089: char *name; faluco@1089: uint32_t idx; dvander@2193: sp_native_t *native; faluco@1089: faluco@1089: pContext->LocalToString(params[1], &name); faluco@1089: if (pContext->FindNativeByName(name, &idx) != SP_ERROR_NONE) faluco@1089: { dvander@1124: /* Oops! This HAS to silently fail! */ dvander@1124: return 0; faluco@1089: } faluco@1089: dvander@2193: pContext->GetNativeByIndex(idx, &native); dvander@2193: dvander@2193: native->flags |= SP_NTVFLAG_OPTIONAL; faluco@1089: faluco@1089: return 1; faluco@1089: } faluco@1089: faluco@1112: static cell_t RegPluginLibrary(IPluginContext *pContext, const cell_t *params) faluco@1112: { faluco@1112: char *name; faluco@1112: CPlugin *pl = g_PluginSys.GetPluginByCtx(pContext->GetContext()); faluco@1112: faluco@1112: pContext->LocalToString(params[1], &name); faluco@1112: faluco@1112: pl->AddLibrary(name); faluco@1112: faluco@1112: return 1; faluco@1112: } faluco@1112: dvander@1124: static cell_t LibraryExists(IPluginContext *pContext, const cell_t *params) dvander@1124: { dvander@1124: char *str; dvander@1124: pContext->LocalToString(params[1], &str); dvander@1124: dvander@1573: if (g_PluginSys.LibraryExists(str)) dvander@1573: { dvander@1573: return 1; dvander@1573: } dvander@1573: dvander@1573: if (g_Extensions.LibraryExists(str)) dvander@1573: { dvander@1573: return 1; dvander@1573: } dvander@1573: dvander@1573: return 0; dvander@1124: } dvander@1124: dvander@1378: static cell_t sm_LogAction(IPluginContext *pContext, const cell_t *params) dvander@1378: { dvander@1378: char buffer[2048]; dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE); dvander@1378: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 3); dvander@1378: dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE) dvander@1378: { dvander@1378: return 0; dvander@1378: } dvander@1378: dvander@1378: CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext()); dvander@1378: dvander@1378: LogAction(pPlugin->GetMyHandle(), 2, params[1], params[2], buffer); dvander@1378: dvander@1378: return 1; dvander@1378: } dvander@1378: dvander@1378: static cell_t LogToFile(IPluginContext *pContext, const cell_t *params) dvander@1378: { dvander@1378: char *file; dvander@1378: pContext->LocalToString(params[1], &file); dvander@1378: dvander@1378: char path[PLATFORM_MAX_PATH]; dvander@1378: g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "%s", file); dvander@1378: dvander@1378: FILE *fp = fopen(path, "at"); dvander@1378: if (!fp) dvander@1378: { dvander@1378: return pContext->ThrowNativeError("Could not open file \"%s\"", path); dvander@1378: } dvander@1378: dvander@1378: char buffer[2048]; dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE); dvander@1378: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); dvander@1378: dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE) dvander@1378: { dvander@1378: fclose(fp); dvander@1378: return 0; dvander@1378: } dvander@1378: dvander@1378: CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext()); dvander@1378: dvander@1378: g_Logger.LogToOpenFile(fp, "[%s] %s", pPlugin->GetFilename(), buffer); dvander@1378: dvander@1378: fclose(fp); dvander@1378: dvander@1378: return 1; dvander@1378: } dvander@1378: dvander@1378: static cell_t LogToFileEx(IPluginContext *pContext, const cell_t *params) dvander@1378: { dvander@1378: char *file; dvander@1378: pContext->LocalToString(params[1], &file); dvander@1378: dvander@1378: char path[PLATFORM_MAX_PATH]; dvander@1378: g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "%s", file); dvander@1378: dvander@1378: FILE *fp = fopen(path, "at"); dvander@1378: if (!fp) dvander@1378: { dvander@1378: return pContext->ThrowNativeError("Could not open file \"%s\"", path); dvander@1378: } dvander@1378: dvander@1378: char buffer[2048]; dvander@2042: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE); dvander@1378: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); dvander@1378: dvander@2193: if (pContext->GetLastNativeError() != SP_ERROR_NONE) dvander@1378: { dvander@1378: fclose(fp); dvander@1378: return 0; dvander@1378: } dvander@1378: dvander@1378: g_Logger.LogToOpenFile(fp, "%s", buffer); dvander@1378: dvander@1378: fclose(fp); dvander@1378: dvander@1378: return 1; dvander@1378: } dvander@1378: dvander@1419: static cell_t GetExtensionFileStatus(IPluginContext *pContext, const cell_t *params) dvander@1419: { dvander@1419: char *str; dvander@1419: pContext->LocalToString(params[1], &str); dvander@1419: dvander@1419: IExtension *pExtension = g_Extensions.FindExtensionByFile(str); dvander@1419: dvander@1419: if (!pExtension) dvander@1419: { dvander@1419: return -2; dvander@1419: } dvander@1419: dvander@1419: if (!pExtension->IsLoaded()) dvander@1419: { dvander@1419: return -1; dvander@1419: } dvander@1419: dvander@1419: char *error; dvander@1419: pContext->LocalToString(params[2], &error); dvander@1419: if (!pExtension->IsRunning(error, params[3])) dvander@1419: { dvander@1419: return 0; dvander@1419: } dvander@1419: dvander@1419: return 1; dvander@1419: } dvander@1419: dvander@1798: static cell_t FindPluginByNumber(IPluginContext *pContext, const cell_t *params) dvander@1798: { dvander@1798: CPlugin *pPlugin = g_PluginSys.GetPluginByOrder(params[1]); dvander@1798: dvander@1798: if (pPlugin == NULL) dvander@1798: { dvander@1798: return BAD_HANDLE; dvander@1798: } dvander@1798: dvander@1798: return pPlugin->GetMyHandle(); dvander@1798: } dvander@1798: dvander@2342: static cell_t VerifyCoreVersion(IPluginContext *pContext, const cell_t *params) dvander@2342: { dvander@2342: return 4; dvander@2342: } dvander@2342: dvander@560: REGISTER_NATIVES(coreNatives) dvander@560: { faluco@1089: {"AutoExecConfig", AutoExecConfig}, faluco@1089: {"GetPluginFilename", GetPluginFilename}, faluco@1089: {"GetPluginInfo", GetPluginInfo}, faluco@1089: {"GetPluginIterator", GetPluginIterator}, faluco@1089: {"GetPluginStatus", GetPluginStatus}, faluco@1089: {"GetSysTickCount", GetSysTickCount}, faluco@1089: {"GetTime", GetTime}, faluco@1089: {"IsPluginDebugging", IsPluginDebugging}, faluco@1089: {"MorePlugins", MorePlugins}, faluco@1089: {"ReadPlugin", ReadPlugin}, faluco@1089: {"ThrowError", ThrowError}, faluco@1089: {"SetFailState", SetFailState}, faluco@1089: {"FormatTime", FormatTime}, faluco@1089: {"MarkNativeAsOptional", MarkNativeAsOptional}, faluco@1112: {"RegPluginLibrary", RegPluginLibrary}, dvander@1124: {"LibraryExists", LibraryExists}, dvander@1378: {"LogAction", sm_LogAction}, dvander@1378: {"LogToFile", LogToFile}, dvander@1378: {"LogToFileEx", LogToFileEx}, dvander@1419: {"GetExtensionFileStatus", GetExtensionFileStatus}, dvander@1798: {"FindPluginByNumber", FindPluginByNumber}, dvander@2342: {"VerifyCoreVersion", VerifyCoreVersion}, faluco@1089: {NULL, NULL}, dvander@560: }; dvander@1419: