summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/console.cpp15
-rw-r--r--src/console_cmds.cpp38
-rw-r--r--src/console_internal.h9
3 files changed, 37 insertions, 25 deletions
diff --git a/src/console.cpp b/src/console.cpp
index e5d5ae962..8108e77a4 100644
--- a/src/console.cpp
+++ b/src/console.cpp
@@ -461,12 +461,17 @@ void IConsoleCmdExec(const char *cmdstr)
*/
cmd = IConsoleCmdGet(tokens[0]);
if (cmd != NULL) {
- if (cmd->hook == NULL || cmd->hook()) {
- if (!cmd->proc(t_index, tokens)) { // index started with 0
- cmd->proc(0, NULL); // if command failed, give help
- }
+ ConsoleHookResult chr = (cmd->hook == NULL ? CHR_ALLOW : cmd->hook(true));
+ switch (chr) {
+ case CHR_ALLOW:
+ if (!cmd->proc(t_index, tokens)) { // index started with 0
+ cmd->proc(0, NULL); // if command failed, give help
+ }
+ return;
+
+ case CHR_DISALLOW: return;
+ case CHR_HIDE: break;
}
- return;
}
t_index--;
diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp
index e6ad350a2..6899fd3fc 100644
--- a/src/console_cmds.cpp
+++ b/src/console_cmds.cpp
@@ -46,7 +46,7 @@ static bool _script_running;
/* console command defines */
#define DEF_CONSOLE_CMD(function) static bool function(byte argc, char *argv[])
-#define DEF_CONSOLE_HOOK(function) static bool function()
+#define DEF_CONSOLE_HOOK(function) static ConsoleHookResult function(bool echo)
/****************
@@ -55,10 +55,10 @@ static bool _script_running;
#ifdef ENABLE_NETWORK
-static inline bool NetworkAvailable()
+static inline bool NetworkAvailable(bool echo)
{
if (!_network_available) {
- IConsoleError("You cannot use this command because there is no network available.");
+ if (echo) IConsoleError("You cannot use this command because there is no network available.");
return false;
}
return true;
@@ -66,44 +66,44 @@ static inline bool NetworkAvailable()
DEF_CONSOLE_HOOK(ConHookServerOnly)
{
- if (!NetworkAvailable()) return false;
+ if (!NetworkAvailable(echo)) return CHR_DISALLOW;
if (!_network_server) {
- IConsoleError("This command is only available to a network server.");
- return false;
+ if (echo) IConsoleError("This command is only available to a network server.");
+ return CHR_DISALLOW;
}
- return true;
+ return CHR_ALLOW;
}
DEF_CONSOLE_HOOK(ConHookClientOnly)
{
- if (!NetworkAvailable()) return false;
+ if (!NetworkAvailable(echo)) return CHR_DISALLOW;
if (_network_server) {
- IConsoleError("This command is not available to a network server.");
- return false;
+ if (echo) IConsoleError("This command is not available to a network server.");
+ return CHR_DISALLOW;
}
- return true;
+ return CHR_ALLOW;
}
DEF_CONSOLE_HOOK(ConHookNeedNetwork)
{
- if (!NetworkAvailable()) return false;
+ if (!NetworkAvailable(echo)) return CHR_DISALLOW;
if (!_networking) {
- IConsoleError("Not connected. This command is only available in multiplayer.");
- return false;
+ if (echo) IConsoleError("Not connected. This command is only available in multiplayer.");
+ return CHR_DISALLOW;
}
- return true;
+ return CHR_ALLOW;
}
DEF_CONSOLE_HOOK(ConHookNoNetwork)
{
if (_networking) {
- IConsoleError("This command is forbidden in multiplayer.");
- return false;
+ if (echo) IConsoleError("This command is forbidden in multiplayer.");
+ return CHR_DISALLOW;
}
- return true;
+ return CHR_ALLOW;
}
#else
@@ -1365,7 +1365,7 @@ DEF_CONSOLE_CMD(ConListCommands)
for (cmd = _iconsole_cmds; cmd != NULL; cmd = cmd->next) {
if (argv[1] == NULL || strstr(cmd->name, argv[1]) != NULL) {
- IConsolePrintF(CC_DEFAULT, "%s", cmd->name);
+ if (cmd->hook == NULL || cmd->hook(false) != CHR_HIDE) IConsolePrintF(CC_DEFAULT, "%s", cmd->name);
}
}
diff --git a/src/console_internal.h b/src/console_internal.h
index d5f4734f1..2adf602ab 100644
--- a/src/console_internal.h
+++ b/src/console_internal.h
@@ -19,6 +19,13 @@ enum {
ICON_MAX_STREAMSIZE = 2048, ///< maximum length of a totally expanded command
};
+/** Return values of console hooks (#IConsoleHook). */
+enum ConsoleHookResult {
+ CHR_ALLOW, ///< Allow command execution.
+ CHR_DISALLOW, ///< Disallow command execution.
+ CHR_HIDE, ///< Hide the existance of the command.
+};
+
/** --Commands--
* Commands are commands, or functions. They get executed once and any
* effect they produce are carried out. The arguments to the commands
@@ -27,7 +34,7 @@ enum {
* eg. 'say "hello sexy boy"'
*/
typedef bool IConsoleCmdProc(byte argc, char *argv[]);
-typedef bool IConsoleHook();
+typedef ConsoleHookResult IConsoleHook(bool echo);
struct IConsoleCmd {
char *name; ///< name of command
IConsoleCmd *next; ///< next command in list