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: }