From f2a80e33fd9f365c640c568a076bf8f68609636b Mon Sep 17 00:00:00 2001 From: Ryan Stecker Date: Tue, 7 Oct 2014 16:16:02 -0500 Subject: [PATCH] Expose some of ICommandLine to plugins. --- core/AMBuilder | 1 + core/smn_commandline.cpp | 131 ++++++++++++++++++++++++++++++++ plugins/include/commandline.inc | 87 +++++++++++++++++++++ plugins/include/sourcemod.inc | 1 + tools/buildbot/PackageScript | 1 + 5 files changed, 221 insertions(+) create mode 100644 core/smn_commandline.cpp create mode 100644 plugins/include/commandline.inc diff --git a/core/AMBuilder b/core/AMBuilder index 1dd911ff..cf957682 100644 --- a/core/AMBuilder +++ b/core/AMBuilder @@ -41,6 +41,7 @@ project.sources += [ 'sm_srvcmds.cpp', 'ConsoleDetours.cpp', 'vprof_tool.cpp', + 'smn_commandline.cpp', ] for sdk_name in SM.sdks: diff --git a/core/smn_commandline.cpp b/core/smn_commandline.cpp new file mode 100644 index 00000000..f103964a --- /dev/null +++ b/core/smn_commandline.cpp @@ -0,0 +1,131 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod + * 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 . + * + * 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 . + * + * Version: $Id$ + */ + +#include "HalfLife2.h" + +static cell_t sm_GetCommandLine(IPluginContext *pCtx, const cell_t *params) +{ + ICommandLine *pCmdLine = g_HL2.GetValveCommandLine(); + + if (pCmdLine == NULL) + { + return pCtx->ThrowNativeError("Unable to get valve command line"); + } + + const char *commandLine = pCmdLine->GetCmdLine(); + + if (commandLine == NULL) + { + return 0; + } + + pCtx->StringToLocal(params[1], params[2], commandLine); + + return 1; +} + +static cell_t sm_GetCommandLineParam(IPluginContext *pCtx, const cell_t *params) +{ + ICommandLine *pCmdLine = g_HL2.GetValveCommandLine(); + + if (pCmdLine == NULL) + { + return pCtx->ThrowNativeError("Unable to get valve command line"); + } + + char *param = NULL; + char *default = NULL; + pCtx->LocalToString(params[1], ¶m); + pCtx->LocalToString(params[4], ¶m); + + const char *value = pCmdLine->ParmValue(param, default); + + pCtx->StringToLocal(params[2], params[3], value); + + return 1; +} + +static cell_t sm_GetCommandLineParamNumber(IPluginContext *pCtx, const cell_t *params) +{ + ICommandLine *pCmdLine = g_HL2.GetValveCommandLine(); + + if (pCmdLine == NULL) + { + return pCtx->ThrowNativeError("Unable to get valve command line"); + } + + char *param = NULL; + pCtx->LocalToString(params[1], ¶m); + + return pCmdLine->ParmValue(param, params[2]); +} + +static cell_t sm_GetCommandLineParamFloat(IPluginContext *pCtx, const cell_t *params) +{ + ICommandLine *pCmdLine = g_HL2.GetValveCommandLine(); + + if (pCmdLine == NULL) + { + return pCtx->ThrowNativeError("Unable to get valve command line"); + } + + char *param = NULL; + pCtx->LocalToString(params[1], ¶m); + + float value = pCmdLine->ParmValue(param, sp_ctof(params[2])); + + return sp_ftoc(value); +} + +static cell_t sm_FindCommandLineParam(IPluginContext *pCtx, const cell_t *params) +{ + ICommandLine *pCmdLine = g_HL2.GetValveCommandLine(); + + if (pCmdLine == NULL) + { + return pCtx->ThrowNativeError("Unable to get valve command line"); + } + + char *param = NULL; + pCtx->LocalToString(params[1], ¶m); + + return pCmdLine->FindParm(param); +} + +REGISTER_NATIVES(commandlinenatives) +{ + {"GetCommandLine", sm_GetCommandLine}, + {"GetCommandLineParam", sm_GetCommandLineParam}, + {"GetCommandLineParamNumber", sm_GetCommandLineParamNumber}, + {"GetCommandLineParamFloat", sm_GetCommandLineParamFloat}, + {"FindCommandLineParam", sm_FindCommandLineParam}, + {NULL, NULL}, +}; diff --git a/plugins/include/commandline.inc b/plugins/include/commandline.inc new file mode 100644 index 00000000..18e8e826 --- /dev/null +++ b/plugins/include/commandline.inc @@ -0,0 +1,87 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * 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 . + * + * 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 . + * + * Version: $Id$ + */ + +#if defined _commandline_included_ + #endinput +#endif +#define _commandline_included_ + +/** + * Gets the full command line the server was launched with. + * + * @param commandLine Buffer to store the command line in. + * @param maxlen Maximum length of the command line buffer. + * @return True if the command line is valid; otherwise, false. + * @error No command line available, or no mod support. + */ +native bool:GetCommandLine(String:commandLine[], maxlen); + +/** + * Gets the value of a command line parameter the server was launched with. + * + * @param param The command line parameter to get the value of. + * @param value Buffer to store the parameter value in. + * @param maxlen Maximum length of the value buffer. + * @param defValue The default value to return if the parameter wasn't specified. + * @return True if the command line is valid; otherwise, false. + * @error No command line available, or no mod support. + */ +native GetCommandLineParam(const String:param[], String:value[], maxlen, const String:defValue[]=""); + +/** + * Gets the value of a command line parameter the server was launched with. + * + * @param param The command line parameter to get the value of. + * @param defValue The default value to return if the parameter wasn't specified. + * @return The integer value of the command line parameter value. + * @error No command line available, or no mod support. + */ +native GetCommandLineParamNumber(const String:param[], defValue=0); + +/** + * Gets the value of a command line parameter the server was launched with. + * + * @param param The command line parameter to get the value of. + * @param defValue The default value to return if the parameter wasn't specified. + * @return The floating point value of the command line parameter value. + * @error No command line available, or no mod support. + */ +native Float:GetCommandLineParamFloat(const String:param[], Float:defValue=0.0); + +/** + * Determines if a specific command line parameter is present. + * + * @param param The command line parameter to test. + * @return True if the command line parameter is specified; otherwise, false. + * @error No command line available, or no mod support. + */ +native bool:FindCommandLineParam(const String:param[]); diff --git a/plugins/include/sourcemod.inc b/plugins/include/sourcemod.inc index 0c5cac76..e57fdd51 100644 --- a/plugins/include/sourcemod.inc +++ b/plugins/include/sourcemod.inc @@ -74,6 +74,7 @@ struct Plugin #include #include #include +#include enum APLRes { diff --git a/tools/buildbot/PackageScript b/tools/buildbot/PackageScript index 59da49fe..d112a0c7 100644 --- a/tools/buildbot/PackageScript +++ b/tools/buildbot/PackageScript @@ -296,6 +296,7 @@ CopyFiles('plugins/include', 'addons/sourcemod/scripting/include', 'clientprefs.inc', 'clients.inc', 'commandfilters.inc', + 'commandline.inc', 'console.inc', 'core.inc', 'cstrike.inc',