dvander@460: /** ds@475: * vim: set ts=4 : dvander@460: * =============================================================== dvander@460: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@460: * =============================================================== dvander@460: * dvander@460: * This file is part of the SourceMod/SourcePawn SDK. This file may only be used dvander@460: * or modified under the Terms and Conditions of its License Agreement, which is found dvander@460: * in LICENSE.txt. The Terms and Conditions for making SourceMod extensions/plugins dvander@460: * may change at any time. To view the latest information, see: dvander@460: * http://www.sourcemod.net/license.php dvander@460: * dvander@460: * Version: $Id$ dvander@460: */ dvander@460: dvander@460: #if defined _helpers_included dvander@460: #endinput dvander@460: #endif dvander@460: #define _helpers_included dvander@460: dvander@460: /** dvander@926: * Provided by basecommands.sp when sm_ban is called. dvander@926: * dvander@927: * @param admin Admin client index (0 for server). dvander@926: * @param client Client index which will be banned. dvander@927: * @param time Minutes banned for (0 is permanent). dvander@926: * @param reason Ban reason (may be empty if none exists). dvander@982: * @return Pl_Handled to block output, Pl_Stop to block output and action. dvander@926: */ dvander@982: forward Action:OnClientBanned(admin, client, time, const String:reason[]); dvander@927: dvander@927: /** dvander@927: * Provided by basecommands.sp when sm_addban or sm_banip is called. dvander@927: * dvander@927: * @param admin Admin client index (0 for server). dvander@927: * @param info User info (either steamid or ip). dvander@927: * @param time Minutes banned for (0 is permanent). dvander@927: * @param reason Ban reason (may be empty if none exists). dvander@982: * @return Pl_Handled to block output, Pl_Stop to block output and action. dvander@927: */ dvander@982: forward Action:OnBanAdded(admin, const String:info[], time, const String:reason[]); dvander@927: dvander@927: /** dvander@927: * Provided by basecommands.sp when sm_unban or sm_unbanip is called. dvander@927: * dvander@927: * @param admin Admin client index (0 for server). dvander@927: * @param info User info (either steamid or ip). dvander@982: * @return Pl_Handled to block output, Pl_Stop to block output and action. dvander@927: */ dvander@982: forward Action:OnBanRemoved(admin, const String:info[]); dvander@926: dvander@926: /** dvander@982: * Formats a user's info as log text. This is usually not needed because dvander@982: * %L can be used to auto-format client information into a string. dvander@460: * dvander@460: * @param client Client index. dvander@460: * @param buffer Buffer for text. dvander@460: * @param maxlength Maximum length of text. dvander@460: */ dvander@460: stock FormatUserLogText(client, String:buffer[], maxlength) dvander@460: { dvander@460: decl String:auth[32]; dvander@460: decl String:name[40]; dvander@460: dvander@460: new userid = GetClientUserId(client); dvander@460: if (!GetClientAuthString(client, auth, sizeof(auth))) dvander@460: { ds@1083: strcopy(auth, sizeof(auth), "UNKNOWN"); dvander@460: } dvander@460: if (!GetClientName(client, name, sizeof(name))) dvander@460: { ds@1083: strcopy(name, sizeof(name), "UNKNOWN"); dvander@460: } dvander@460: dvander@460: /** Currently, no team stuff ... */ dvander@460: dvander@460: Format(buffer, maxlength, "\"%s<%d><%s><>\"", name, userid, auth); dvander@460: } ds@621: ds@621: /** ds@621: * Returns plugin handle from plugin filename. ds@621: * ds@621: * @param filename Filename of the plugin to search for. ds@622: * @return Handle to plugin if found, INVALID_HANDLE otherwise. ds@621: */ ds@621: stock Handle:FindPluginByFile(const String:filename[]) ds@621: { ds@621: decl String:buffer[256]; ds@621: ds@621: new Handle:iter = GetPluginIterator(); ds@621: new Handle:pl; ds@621: ds@621: while (MorePlugins(iter)) ds@621: { ds@621: pl = ReadPlugin(iter); ds@621: ds@621: GetPluginFilename(pl, buffer, sizeof(buffer)); ds@1083: if (strcmp(buffer, filename, false) == 0) ds@621: { dvander@982: CloseHandle(iter); ds@621: return pl; ds@621: } ds@621: } ds@621: ds@650: CloseHandle(iter); ds@650: ds@621: return INVALID_HANDLE; ds@621: } dvander@902: dvander@902: /** dvander@902: * Searches for clients that match an input string. dvander@902: * dvander@902: * Allowed patterns: dvander@902: * 1) # or # dvander@902: * 2) dvander@903: * dvander@903: * @param pattern Pattern to search for. dvander@903: * @param clients Array to store matching clients in. dvander@903: * @param maxClients Maximum clients in the array. dvander@903: * @return Number of clients found. dvander@902: */ dvander@902: stock SearchForClients(const String:pattern[], clients[], maxClients) dvander@902: { dvander@902: new maxclients = GetMaxClients(); dvander@902: new total = 0; dvander@902: dvander@902: if (maxClients == 0) dvander@902: { dvander@902: return 0; dvander@902: } dvander@902: dvander@902: if (pattern[0] == '#') dvander@902: { dvander@902: new input = StringToInt(pattern[1]); dvander@902: if (!input) dvander@902: { dvander@902: decl String:name[65] dvander@902: for (new i=1; i<=maxclients; i++) dvander@902: { dvander@902: if (!IsClientInGame(i)) dvander@902: { dvander@902: continue; dvander@902: } dvander@902: GetClientName(i, name, sizeof(name)); ds@1083: if (strcmp(name, pattern, false) == 0) dvander@902: { dvander@902: clients[0] = i; dvander@902: return 1; dvander@902: } dvander@902: } dvander@902: } else { dvander@902: new client = GetClientOfUserId(input); dvander@902: if (client) dvander@902: { dvander@902: clients[0] = client; dvander@902: return 1; dvander@902: } dvander@902: } dvander@902: } dvander@902: dvander@902: decl String:name[65] dvander@902: for (new i=1; i<=maxclients; i++) dvander@902: { dvander@902: if (!IsClientInGame(i)) dvander@902: { dvander@902: continue; dvander@902: } dvander@902: GetClientName(i, name, sizeof(name)); dvander@902: if (StrContains(name, pattern, false) != -1) dvander@902: { dvander@902: clients[total++] = i; dvander@902: if (total >= maxClients) dvander@902: { dvander@902: break; dvander@902: } dvander@902: } dvander@902: } dvander@902: dvander@902: return total; dvander@902: } ferret99gt@1177: ferret99gt@1177: /** ferret99gt@1177: * Wraps SearchForClients and handles producing error messages for ferret99gt@1177: * bad targets. ferret99gt@1177: * ferret99gt@1177: * @param client Client who issued command ferret99gt@1177: * @param target Client's target argument ferret99gt@1177: * @param nobots Optional. Set to true if bots should NOT be targetted ferret99gt@1177: * @param immunity Optional. Set to false to ignore target immunity. ferret99gt@1177: * @return Index of target client, or -1 on error. ferret99gt@1177: */ ferret99gt@1177: stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true) ferret99gt@1177: { ferret99gt@1177: new clients[2]; ferret99gt@1177: new numClients = SearchForClients(target, clients, 2); ferret99gt@1177: ferret99gt@1177: if (numClients == 0) ferret99gt@1177: { ferret99gt@1177: ReplyToCommand(client, "[SM] %t", "No matching client"); ferret99gt@1177: return -1; ferret99gt@1177: } ferret99gt@1177: else if (numClients > 1) ferret99gt@1177: { ferret99gt@1177: ReplyToCommand(client, "[SM] %t", "More than one client matches", target); ferret99gt@1177: return -1; ferret99gt@1177: } ferret99gt@1177: else if (immunity && !CanUserTarget(client, clients[0])) ferret99gt@1177: { ferret99gt@1177: ReplyToCommand(client, "[SM] %t", "Unable to target"); ferret99gt@1177: return -1; ferret99gt@1177: } ferret99gt@1177: else if (nobots && IsFakeClient(clients[0])) ferret99gt@1177: { ferret99gt@1177: ReplyToCommand(client, "[SM] %t", "Cannot target bot"); ferret99gt@1177: return -1; ferret99gt@1177: } ferret99gt@1177: ferret99gt@1177: return clients[0]; ferret99gt@1177: }