Changeset - r14907:1fcac3638575
[Not reviewed]
master
0 3 0
frosch - 14 years ago 2010-03-24 20:43:31
frosch@openttd.org
(svn r19514) -Codechange: Allow console hooks to deny existance of commands.
3 files changed with 37 insertions and 25 deletions:
0 comments (0 inline, 0 general)
src/console.cpp
Show inline comments
 
@@ -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--;
src/console_cmds.cpp
Show inline comments
 
@@ -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);
 
		}
 
	}
 

	
src/console_internal.h
Show inline comments
 
@@ -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
0 comments (0 inline, 0 general)