plugins/include/commandfilters.inc
changeset 1952 b7aa2b626807
child 2015 39c6f6f945db
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/plugins/include/commandfilters.inc	Sun Mar 30 07:00:22 2008 +0000
     1.3 @@ -0,0 +1,130 @@
     1.4 +/**
     1.5 + * vim: set ts=4 :
     1.6 + * =============================================================================
     1.7 + * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
     1.8 + * =============================================================================
     1.9 + *
    1.10 + * This file is part of the SourceMod/SourcePawn SDK.
    1.11 + *
    1.12 + * This program is free software; you can redistribute it and/or modify it under
    1.13 + * the terms of the GNU General Public License, version 3.0, as published by the
    1.14 + * Free Software Foundation.
    1.15 + * 
    1.16 + * This program is distributed in the hope that it will be useful, but WITHOUT
    1.17 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    1.18 + * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    1.19 + * details.
    1.20 + *
    1.21 + * You should have received a copy of the GNU General Public License along with
    1.22 + * this program.  If not, see <http://www.gnu.org/licenses/>.
    1.23 + *
    1.24 + * As a special exception, AlliedModders LLC gives you permission to link the
    1.25 + * code of this program (as well as its derivative works) to "Half-Life 2," the
    1.26 + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    1.27 + * by the Valve Corporation.  You must obey the GNU General Public License in
    1.28 + * all respects for all other code used.  Additionally, AlliedModders LLC grants
    1.29 + * this exception to all derivative works.  AlliedModders LLC defines further
    1.30 + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    1.31 + * or <http://www.sourcemod.net/license.php>.
    1.32 + *
    1.33 + * Version: $Id$
    1.34 + */
    1.35 + 
    1.36 +#if defined _commandfilters_included
    1.37 + #endinput
    1.38 +#endif
    1.39 +#define _commandfilters_included
    1.40 +
    1.41 +#define MAX_TARGET_LENGTH			64
    1.42 +
    1.43 +#define COMMAND_FILTER_ALIVE		(1<<0)		/**< Only allow alive players */
    1.44 +#define COMMAND_FILTER_DEAD			(1<<1)		/**< Only filter dead players */
    1.45 +#define COMMAND_FILTER_CONNECTED	(1<<2)		/**< Allow players not fully in-game */
    1.46 +#define COMMAND_FILTER_NO_IMMUNITY	(1<<3)		/**< Ignore immunity rules */
    1.47 +#define COMMAND_FILTER_NO_MULTI		(1<<4)		/**< Do not allow multiple target patterns */
    1.48 +#define COMMAND_FILTER_NO_BOTS		(1<<5)		/**< Do not allow bots to be targetted */
    1.49 +
    1.50 +#define COMMAND_TARGET_NONE			0			/**< No target was found */
    1.51 +#define COMMAND_TARGET_NOT_ALIVE	-1			/**< Single client is not alive */
    1.52 +#define COMMAND_TARGET_NOT_DEAD		-2			/**< Single client is not dead */
    1.53 +#define COMMAND_TARGET_NOT_IN_GAME	-3			/**< Single client is not in game */
    1.54 +#define COMMAND_TARGET_IMMUNE		-4			/**< Single client is immune */
    1.55 +#define COMMAND_TARGET_EMPTY_FILTER	-5			/**< A multi-filter (such as @all) had no targets */
    1.56 +#define COMMAND_TARGET_NOT_HUMAN	-6			/**< Target was not human */
    1.57 +#define COMMAND_TARGET_AMBIGUOUS	-7			/**< Partial name had too many targets */
    1.58 +
    1.59 +/**
    1.60 + * Processes a generic command target string, and resolves it to a list 
    1.61 + * of clients or one client, based on filtering rules and a pattern.
    1.62 + *
    1.63 + * @param pattern		Pattern to find clients against.
    1.64 + * @param admin			Admin performing the action, or 0 if the server.
    1.65 + * @param targets		Array to hold targets.
    1.66 + * @param max_targets	Maximum size of the targets array.
    1.67 + * @param filter_flags	Filter flags.
    1.68 + * @param target_name	Buffer to store the target name.
    1.69 + * @param tn_maxlength	Maximum length of the target name buffer.
    1.70 + * @param tn_is_ml		Set to true if the target name buffer is an ML phrase,
    1.71 + *						false if it is a normal string.
    1.72 + * @return				If a multi-target pattern was used, the number of clients found 
    1.73 + *						is returned.  If a single-target pattern was used, 1 is returned 
    1.74 + *						if one valid client is found.  Otherwise, a CLIENT_TARGET reason 
    1.75 + *						for failure is returned.
    1.76 + */
    1.77 +native ProcessTargetString(const String:pattern[],
    1.78 +						   admin, 
    1.79 +						   targets[],
    1.80 +						   max_targets,
    1.81 +						   filter_flags,
    1.82 +						   String:target_name[],
    1.83 +						   tn_maxlength,
    1.84 +						   &bool:tn_is_ml);
    1.85 +
    1.86 +/**
    1.87 + * Replies to a client with a given message describing a targetting 
    1.88 + * failure reason.
    1.89 + *
    1.90 + * Note: The translation phrases are found in common.phrases.txt.
    1.91 + *
    1.92 + * @param client		Client index, or 0 for server.
    1.93 + * @param reason		COMMAND_TARGET reason.
    1.94 + * @noreturn
    1.95 + */
    1.96 +stock ReplyToTargetError(client, reason)
    1.97 +{
    1.98 +	switch (reason)
    1.99 +	{
   1.100 +		case COMMAND_TARGET_NONE:
   1.101 +		{
   1.102 +			ReplyToCommand(client, "[SM] %t", "No matching client");
   1.103 +		}
   1.104 +		case COMMAND_TARGET_NOT_ALIVE:
   1.105 +		{
   1.106 +			ReplyToCommand(client, "[SM] %t", "Target must be alive");
   1.107 +		}
   1.108 +		case COMMAND_TARGET_NOT_DEAD:
   1.109 +		{
   1.110 +			ReplyToCommand(client, "[SM] %t", "Target must be dead");
   1.111 +		}
   1.112 +		case COMMAND_TARGET_NOT_IN_GAME:
   1.113 +		{
   1.114 +			ReplyToCommand(client, "[SM] %t", "Target is not in game");
   1.115 +		}
   1.116 +		case COMMAND_TARGET_IMMUNE:
   1.117 +		{
   1.118 +			ReplyToCommand(client, "[SM] %t", "Unable to target");
   1.119 +		}
   1.120 +		case COMMAND_TARGET_EMPTY_FILTER:
   1.121 +		{
   1.122 +			ReplyToCommand(client, "[SM] %t", "No matching clients");
   1.123 +		}
   1.124 +		case COMMAND_TARGET_NOT_HUMAN:
   1.125 +		{
   1.126 +			ReplyToCommand(client, "[SM] %t", "Cannot target bot");
   1.127 +		}
   1.128 +		case COMMAND_TARGET_AMBIGUOUS:
   1.129 +		{
   1.130 +			ReplyToCommand(client, "[SM] %t", "More than one client matched");
   1.131 +		}
   1.132 +	}
   1.133 +}