dvander@1621: /**
dvander@1621: * vim: set ts=4 :
dvander@1621: * =============================================================================
dvander@1621: * SourceMod (C)2004-2007 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@1621: #define COMMAND_FILTER_ALIVE (1<<0) /* Only allow alive players */
dvander@1621: #define COMMAND_FILTER_DEAD (1<<1) /* Only filter dead players */
dvander@1621: #define COMMAND_FILTER_CONNECTED (1<<2) /* Allow players not fully in-game */
dvander@1621: #define COMMAND_FILTER_NO_IMMUNITY (1<<3) /* Ignore immunity rules */
dvander@1621: #define COMMAND_FILTER_NO_MULTI (1<<4) /* Do not allow multiple target patterns */
dvander@1621: #define COMMAND_FILTER_NO_BOTS (1<<5) /* Do not allow bots to be targetted */
dvander@1621:
dvander@1621: #define COMMAND_TARGET_NONE 0 /* No target was found */
dvander@1621: #define COMMAND_TARGET_NOT_ALIVE -1 /* Single client is not alive */
dvander@1621: #define COMMAND_TARGET_NOT_DEAD -2 /* Single client is not dead */
dvander@1621: #define COMMAND_TARGET_NOT_IN_GAME -3 /* Single client is not in game */
dvander@1621: #define COMMAND_TARGET_IMMUNE -4 /* Single client is immune */
dvander@1621: #define COMMAND_TARGET_EMPTY_FILTER -5 /* A multi-filter (such as @all) had no targets */
dvander@1621: #define COMMAND_TARGET_NOT_HUMAN -6 /* Target was not human */
dvander@1621: #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@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@1621: * @param tn_is_ml Set to 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@1621: * if one valid client is found. Otherwise, a CLIENT_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: }