dvander@460: /** ds@475: * vim: set ts=4 : ds@1330: * ============================================================================= ds@1947: * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= ds@1330: * ds@1330: * This file is part of the SourceMod/SourcePawn SDK. dvander@460: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. ds@1330: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. ds@1330: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . ds@1330: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . 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@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@1627: * @deprecated Use FindTarget() or ProcessTargetString(). dvander@902: */ dvander@1627: #pragma deprecated Use FindTarget() or ProcessTargetString() 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: /** dvander@1627: * Wraps ProcessTargetString() 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. dvander@1627: * @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: { dvander@1627: decl String:target_name[MAX_TARGET_LENGTH]; dvander@1627: decl target_list[1], target_count, bool:tn_is_ml; ferret99gt@1177: dvander@1627: new flags = COMMAND_FILTER_NO_MULTI; dvander@1627: if (nobots) dvander@1627: { dvander@1627: flags |= COMMAND_FILTER_NO_BOTS; dvander@1627: } dvander@1627: if (!immunity) ferret99gt@1177: { dvander@1627: flags |= COMMAND_FILTER_NO_IMMUNITY; ferret99gt@1177: } dvander@1627: dvander@1627: if ((target_count = ProcessTargetString( dvander@1627: target, dvander@1627: client, dvander@1627: target_list, dvander@1627: 1, dvander@1627: flags, dvander@1627: target_name, dvander@1627: sizeof(target_name), dvander@1627: tn_is_ml)) > 0) ferret99gt@1177: { dvander@1627: return target_list[0]; dvander@1627: } dvander@1627: else dvander@1627: { dvander@1627: ReplyToTargetError(client, target_count); ferret99gt@1177: return -1; ferret99gt@1177: } ferret99gt@1177: } ferret99gt@1606: ferret99gt@1606: /** dvander@1889: * This function is no longer supported. It has been replaced with ReadMapList(), dvander@1889: * which uses a more unified caching and configuration mechanism. This function also dvander@1889: * has a bug where if the cvar contents changes, the fileTime change won't be recognized. dvander@1889: * ferret99gt@1606: * Loads a specified array with maps. The maps will be either loaded from mapcyclefile, or if supplied ferret99gt@1606: * a cvar containing a file name. If the file in the cvar is bad, it will use mapcyclefile. The fileTime ferret99gt@1606: * parameter is used to store a timestamp of the file. If specified, the file will only be reloaded if it ferret99gt@1606: * has changed. ferret99gt@1606: * ferret99gt@1606: * @param array Valid array handle, should be created with CreateArray(33) or larger. ferret99gt@1606: * @param fileTime Variable containing the "last changed" time of the file. Used to avoid needless reloading. ferret99gt@1606: * @param fileCvar CVAR set to the file to be loaded. Optional. dvander@1889: * @return Number of maps loaded or 0 if in error. ferret99gt@1606: */ dvander@1889: #pragma deprecated Use ReadMapList() instead. ferret99gt@1606: stock LoadMaps(Handle:array, &fileTime = 0, Handle:fileCvar = INVALID_HANDLE) ferret99gt@1606: { ferret99gt@1606: decl String:mapPath[256], String:mapFile[64]; ferret99gt@1606: new bool:fileFound = false; ferret99gt@1606: ferret99gt@1606: if (fileCvar != INVALID_HANDLE) ferret99gt@1606: { ferret99gt@1606: GetConVarString(fileCvar, mapFile, 64); ferret99gt@1606: BuildPath(Path_SM, mapPath, sizeof(mapPath), mapFile); ferret99gt@1606: fileFound = FileExists(mapPath); ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: if (!fileFound) ferret99gt@1606: { ferret99gt@1606: new Handle:mapCycleFile = FindConVar("mapcyclefile"); ferret99gt@1606: GetConVarString(mapCycleFile, mapPath, sizeof(mapPath)); ferret99gt@1606: fileFound = FileExists(mapPath); ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: if (!fileFound) ferret99gt@1606: { ferret99gt@1606: LogError("Failed to find a file to load maps from. No maps loaded."); ferret99gt@1606: ClearArray(array); ferret99gt@1606: ferret99gt@1606: return 0; ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: // If the file hasn't changed, there's no reason to reload ferret99gt@1606: // all of the maps. ferret99gt@1606: new newTime = GetFileTime(mapPath, FileTime_LastChange); ferret99gt@1606: if (fileTime == newTime) ferret99gt@1606: { ferret99gt@1606: return GetArraySize(array); ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: fileTime = newTime; ferret99gt@1606: ferret99gt@1606: ClearArray(array); ferret99gt@1606: ferret99gt@1606: new Handle:file = OpenFile(mapPath, "rt"); ferret99gt@1606: if (file == INVALID_HANDLE) ferret99gt@1606: { ferret99gt@1606: LogError("Could not open file: %s", mapPath); ferret99gt@1606: ferret99gt@1606: return 0; ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: LogMessage("Loading maps from file: %s", mapPath); ferret99gt@1606: ferret99gt@1606: decl String:buffer[64], len; ferret99gt@1606: while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer))) ferret99gt@1606: { ferret99gt@1606: TrimString(buffer); ferret99gt@1606: ferret99gt@1606: if ((len = StrContains(buffer, ".bsp", false)) != -1) ferret99gt@1606: { ferret99gt@1606: buffer[len] = '\0'; ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: if (buffer[0] == '\0' || !IsValidConVarChar(buffer[0]) || !IsMapValid(buffer)) ferret99gt@1606: { ferret99gt@1606: continue; ferret99gt@1606: } ferret99gt@1664: ferret99gt@1664: if (FindStringInArray(array, buffer) != -1) ferret99gt@1664: { ferret99gt@1664: continue; ferret99gt@1664: } ferret99gt@1606: ferret99gt@1606: PushArrayString(array, buffer); ferret99gt@1606: } ferret99gt@1606: ferret99gt@1606: CloseHandle(file); ferret99gt@1606: return GetArraySize(array); ferret99gt@1606: }