changeset 14917:eea6004124b6 draft

(svn r19514) -Codechange: Allow console hooks to deny existance of commands.
author frosch <frosch@openttd.org>
date Wed, 24 Mar 2010 20:43:31 +0000
parents 3fe6183f468a
children ec91e5febc5d
files src/console.cpp src/console_cmds.cpp src/console_internal.h
diffstat 3 files changed, 37 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/console.cpp
+++ b/src/console.cpp
@@ -461,12 +461,17 @@
 	 */
 	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--;
--- a/src/console_cmds.cpp
+++ b/src/console_cmds.cpp
@@ -46,7 +46,7 @@
 
 /* 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 @@
 
 #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 @@
 
 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 @@
 
 	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);
 		}
 	}
 
--- a/src/console_internal.h
+++ b/src/console_internal.h
@@ -19,6 +19,13 @@
 	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 @@
  * 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