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