dvander@2168: /** dvander@2168: * vim: set ts=4 : dvander@2168: * ============================================================================= dvander@2168: * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. dvander@2168: * ============================================================================= dvander@2168: * dvander@2168: * This file is part of the SourceMod/SourcePawn SDK. dvander@2168: * dvander@2168: * This program is free software; you can redistribute it and/or modify it under dvander@2168: * the terms of the GNU General Public License, version 3.0, as published by the dvander@2168: * Free Software Foundation. dvander@2168: * dvander@2168: * This program is distributed in the hope that it will be useful, but WITHOUT dvander@2168: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@2168: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more dvander@2168: * details. dvander@2168: * dvander@2168: * You should have received a copy of the GNU General Public License along with dvander@2168: * this program. If not, see . dvander@2168: * dvander@2168: * As a special exception, AlliedModders LLC gives you permission to link the dvander@2168: * code of this program (as well as its derivative works) to "Half-Life 2," the dvander@2168: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software dvander@2168: * by the Valve Corporation. You must obey the GNU General Public License in dvander@2168: * all respects for all other code used. Additionally, AlliedModders LLC grants dvander@2168: * this exception to all derivative works. AlliedModders LLC defines further dvander@2168: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), dvander@2168: * or . dvander@2168: * dvander@2168: * Version: $Id$ dvander@2168: */ dvander@2168: dvander@2168: #if defined _commandfilters_included dvander@2168: #endinput dvander@2168: #endif dvander@2168: #define _commandfilters_included dvander@2168: dvander@2168: #define MAX_TARGET_LENGTH 64 dvander@2168: dvander@2168: #define COMMAND_FILTER_ALIVE (1<<0) /**< Only allow alive players */ dvander@2168: #define COMMAND_FILTER_DEAD (1<<1) /**< Only filter dead players */ dvander@2168: #define COMMAND_FILTER_CONNECTED (1<<2) /**< Allow players not fully in-game */ dvander@2168: #define COMMAND_FILTER_NO_IMMUNITY (1<<3) /**< Ignore immunity rules */ dvander@2168: #define COMMAND_FILTER_NO_MULTI (1<<4) /**< Do not allow multiple target patterns */ dvander@2168: #define COMMAND_FILTER_NO_BOTS (1<<5) /**< Do not allow bots to be targetted */ dvander@2168: dvander@2168: #define COMMAND_TARGET_NONE 0 /**< No target was found */ dvander@2168: #define COMMAND_TARGET_NOT_ALIVE -1 /**< Single client is not alive */ dvander@2168: #define COMMAND_TARGET_NOT_DEAD -2 /**< Single client is not dead */ dvander@2168: #define COMMAND_TARGET_NOT_IN_GAME -3 /**< Single client is not in game */ dvander@2168: #define COMMAND_TARGET_IMMUNE -4 /**< Single client is immune */ dvander@2168: #define COMMAND_TARGET_EMPTY_FILTER -5 /**< A multi-filter (such as @all) had no targets */ dvander@2168: #define COMMAND_TARGET_NOT_HUMAN -6 /**< Target was not human */ dvander@2168: #define COMMAND_TARGET_AMBIGUOUS -7 /**< Partial name had too many targets */ dvander@2168: dvander@2168: /** dvander@2168: * Processes a generic command target string, and resolves it to a list dvander@2168: * of clients or one client, based on filtering rules and a pattern. dvander@2168: * dvander@2168: * Note that you should use LoadTranslations("common.phrases") in OnPluginStart(), dvander@2168: * as that file is guaranteed to contain all of the translatable phrases that dvander@2168: * ProcessTargetString() will return. dvander@2168: * dvander@2168: * @param pattern Pattern to find clients against. dvander@2168: * @param admin Admin performing the action, or 0 if the server. dvander@2168: * @param targets Array to hold targets. dvander@2168: * @param max_targets Maximum size of the targets array. dvander@2168: * @param filter_flags Filter flags. dvander@2168: * @param target_name Buffer to store the target name. dvander@2168: * @param tn_maxlength Maximum length of the target name buffer. dvander@2168: * @param tn_is_ml OUTPUT: Will be true if the target name buffer is an ML phrase, dvander@2168: * false if it is a normal string. dvander@2168: * @return If a multi-target pattern was used, the number of clients found dvander@2168: * is returned. If a single-target pattern was used, 1 is returned dvander@2168: * if one valid client is found. Otherwise, a COMMAND_TARGET reason dvander@2168: * for failure is returned. dvander@2168: */ dvander@2168: native ProcessTargetString(const String:pattern[], dvander@2168: admin, dvander@2168: targets[], dvander@2168: max_targets, dvander@2168: filter_flags, dvander@2168: String:target_name[], dvander@2168: tn_maxlength, dvander@2168: &bool:tn_is_ml); dvander@2168: dvander@2168: /** dvander@2168: * Replies to a client with a given message describing a targetting dvander@2168: * failure reason. dvander@2168: * dvander@2168: * Note: The translation phrases are found in common.phrases.txt. dvander@2168: * dvander@2168: * @param client Client index, or 0 for server. dvander@2168: * @param reason COMMAND_TARGET reason. dvander@2168: * @noreturn dvander@2168: */ dvander@2168: stock ReplyToTargetError(client, reason) dvander@2168: { dvander@2168: switch (reason) dvander@2168: { dvander@2168: case COMMAND_TARGET_NONE: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "No matching client"); dvander@2168: } dvander@2168: case COMMAND_TARGET_NOT_ALIVE: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "Target must be alive"); dvander@2168: } dvander@2168: case COMMAND_TARGET_NOT_DEAD: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "Target must be dead"); dvander@2168: } dvander@2168: case COMMAND_TARGET_NOT_IN_GAME: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "Target is not in game"); dvander@2168: } dvander@2168: case COMMAND_TARGET_IMMUNE: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "Unable to target"); dvander@2168: } dvander@2168: case COMMAND_TARGET_EMPTY_FILTER: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "No matching clients"); dvander@2168: } dvander@2168: case COMMAND_TARGET_NOT_HUMAN: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "Cannot target bot"); dvander@2168: } dvander@2168: case COMMAND_TARGET_AMBIGUOUS: dvander@2168: { dvander@2168: ReplyToCommand(client, "[SM] %t", "More than one client matched"); dvander@2168: } dvander@2168: } dvander@2168: }