plugins/include/helpers.inc
author Nicholas Hastings <skamonkey@gmail.com>
Fri Nov 04 10:01:33 2011 -0400 (2011-11-04)
changeset 3438 07a1b8a8a2ba
parent 2920 1d5645ab7ae0
permissions -rw-r--r--
Updated TF2_OnIsHolidayActive ret behavior to match doc (bug 5155, r=fyren).
dvander@460
     1
/**
ds@475
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1947
     4
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
ds@1330
     5
 * =============================================================================
ds@1330
     6
 *
ds@1330
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@460
     8
 *
ds@1330
     9
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    11
 * Free Software Foundation.
ds@1330
    12
 * 
ds@1330
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    16
 * details.
ds@1330
    17
 *
ds@1330
    18
 * You should have received a copy of the GNU General Public License along with
ds@1330
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1330
    20
 *
ds@1330
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@460
    29
 *
dvander@460
    30
 * Version: $Id$
dvander@460
    31
 */
dvander@460
    32
 
dvander@460
    33
#if defined _helpers_included
dvander@460
    34
 #endinput
dvander@460
    35
#endif
dvander@460
    36
#define _helpers_included
dvander@460
    37
dvander@460
    38
/**
dvander@982
    39
 * Formats a user's info as log text.  This is usually not needed because
dvander@982
    40
 * %L can be used to auto-format client information into a string.
dvander@460
    41
 *
dvander@460
    42
 * @param client		Client index.
dvander@460
    43
 * @param buffer		Buffer for text.
dvander@460
    44
 * @param maxlength		Maximum length of text.
dvander@460
    45
 */
dvander@460
    46
stock FormatUserLogText(client, String:buffer[], maxlength)
dvander@460
    47
{
dvander@460
    48
	decl String:auth[32];
dvander@460
    49
	decl String:name[40];
dvander@460
    50
	
dvander@460
    51
	new userid = GetClientUserId(client);
dvander@460
    52
	if (!GetClientAuthString(client, auth, sizeof(auth)))
dvander@460
    53
	{
ds@1083
    54
		strcopy(auth, sizeof(auth), "UNKNOWN");
dvander@460
    55
	}
dvander@460
    56
	if (!GetClientName(client, name, sizeof(name)))
dvander@460
    57
	{
ds@1083
    58
		strcopy(name, sizeof(name), "UNKNOWN");
dvander@460
    59
	}
dvander@460
    60
	
dvander@460
    61
	/** Currently, no team stuff ... */
dvander@460
    62
	
dvander@460
    63
	Format(buffer, maxlength, "\"%s<%d><%s><>\"", name, userid, auth);
dvander@460
    64
}
ds@621
    65
ds@621
    66
/**
ds@621
    67
 * Returns plugin handle from plugin filename.
ds@621
    68
 *
ds@621
    69
 * @param filename		Filename of the plugin to search for.
ds@622
    70
 * @return				Handle to plugin if found, INVALID_HANDLE otherwise.
ds@621
    71
 */
ds@621
    72
stock Handle:FindPluginByFile(const String:filename[])
ds@621
    73
{
ds@621
    74
	decl String:buffer[256];
ds@621
    75
	
ds@621
    76
	new Handle:iter = GetPluginIterator();
ds@621
    77
	new Handle:pl;
ds@621
    78
	
ds@621
    79
	while (MorePlugins(iter))
ds@621
    80
	{
ds@621
    81
		pl = ReadPlugin(iter);
ds@621
    82
		
ds@621
    83
		GetPluginFilename(pl, buffer, sizeof(buffer));
ds@1083
    84
		if (strcmp(buffer, filename, false) == 0)
ds@621
    85
		{
dvander@982
    86
			CloseHandle(iter);
ds@621
    87
			return pl;
ds@621
    88
		}
ds@621
    89
	}
ds@621
    90
	
ds@650
    91
	CloseHandle(iter);
ds@650
    92
	
ds@621
    93
	return INVALID_HANDLE;
ds@621
    94
}
dvander@902
    95
dvander@902
    96
/**
dvander@1627
    97
 * @deprecated Use FindTarget() or ProcessTargetString().
dvander@902
    98
 */
dvander@1627
    99
#pragma deprecated Use FindTarget() or ProcessTargetString()
dvander@902
   100
stock SearchForClients(const String:pattern[], clients[], maxClients)
dvander@902
   101
{
dvander@902
   102
	new total = 0;
dvander@902
   103
	
dvander@902
   104
	if (maxClients == 0)
dvander@902
   105
	{
dvander@902
   106
		return 0;
dvander@902
   107
	}
dvander@902
   108
	
dvander@902
   109
	if (pattern[0] == '#')
dvander@902
   110
	{
dvander@902
   111
		new input = StringToInt(pattern[1]);
dvander@902
   112
		if (!input)
dvander@902
   113
		{
dvander@902
   114
			decl String:name[65]
skamonkey@2920
   115
			for (new i=1; i<=MaxClients; i++)
dvander@902
   116
			{
dvander@902
   117
				if (!IsClientInGame(i))
dvander@902
   118
				{
dvander@902
   119
					continue;
dvander@902
   120
				}
dvander@902
   121
				GetClientName(i, name, sizeof(name));
ds@1083
   122
				if (strcmp(name, pattern, false) == 0)
dvander@902
   123
				{
dvander@902
   124
					clients[0] = i;
dvander@902
   125
					return 1;
dvander@902
   126
				}
dvander@902
   127
			}
dvander@902
   128
		} else {
dvander@902
   129
			new client = GetClientOfUserId(input);
dvander@902
   130
			if (client)
dvander@902
   131
			{
dvander@902
   132
				clients[0] = client;
dvander@902
   133
				return 1;
dvander@902
   134
			}
dvander@902
   135
		}
dvander@902
   136
	}
dvander@902
   137
	
dvander@902
   138
	decl String:name[65]
skamonkey@2920
   139
	for (new i=1; i<=MaxClients; i++)
dvander@902
   140
	{
dvander@902
   141
		if (!IsClientInGame(i))
dvander@902
   142
		{
dvander@902
   143
			continue;
dvander@902
   144
		}
dvander@902
   145
		GetClientName(i, name, sizeof(name));
dvander@902
   146
		if (StrContains(name, pattern, false) != -1)
dvander@902
   147
		{
dvander@902
   148
			clients[total++] = i;
dvander@902
   149
			if (total >= maxClients)
dvander@902
   150
			{
dvander@902
   151
				break;
dvander@902
   152
			}
dvander@902
   153
		}
dvander@902
   154
	}
dvander@902
   155
	
dvander@902
   156
	return total;
dvander@902
   157
}
ferret99gt@1177
   158
ferret99gt@1177
   159
/**
dvander@1627
   160
 * Wraps ProcessTargetString() and handles producing error messages for
ferret99gt@1177
   161
 * bad targets.
ferret99gt@1177
   162
 *
ferret99gt@1177
   163
 * @param client	Client who issued command
ferret99gt@1177
   164
 * @param target	Client's target argument
ferret99gt@1177
   165
 * @param nobots	Optional. Set to true if bots should NOT be targetted
ferret99gt@1177
   166
 * @param immunity	Optional. Set to false to ignore target immunity.
dvander@1627
   167
 * @return			Index of target client, or -1 on error.
ferret99gt@1177
   168
 */
ferret99gt@1177
   169
stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true)
ferret99gt@1177
   170
{
dvander@1627
   171
	decl String:target_name[MAX_TARGET_LENGTH];
dvander@1627
   172
	decl target_list[1], target_count, bool:tn_is_ml;
ferret99gt@1177
   173
	
dvander@1627
   174
	new flags = COMMAND_FILTER_NO_MULTI;
dvander@1627
   175
	if (nobots)
dvander@1627
   176
	{
dvander@1627
   177
		flags |= COMMAND_FILTER_NO_BOTS;
dvander@1627
   178
	}
dvander@1627
   179
	if (!immunity)
ferret99gt@1177
   180
	{
dvander@1627
   181
		flags |= COMMAND_FILTER_NO_IMMUNITY;
ferret99gt@1177
   182
	}
dvander@1627
   183
	
dvander@1627
   184
	if ((target_count = ProcessTargetString(
dvander@1627
   185
			target,
dvander@1627
   186
			client, 
dvander@1627
   187
			target_list, 
dvander@1627
   188
			1, 
dvander@1627
   189
			flags,
dvander@1627
   190
			target_name,
dvander@1627
   191
			sizeof(target_name),
dvander@1627
   192
			tn_is_ml)) > 0)
ferret99gt@1177
   193
	{
dvander@1627
   194
		return target_list[0];
dvander@1627
   195
	}
dvander@1627
   196
	else
dvander@1627
   197
	{
dvander@1627
   198
		ReplyToTargetError(client, target_count);
ferret99gt@1177
   199
		return -1;
ferret99gt@1177
   200
	}
ferret99gt@1177
   201
}
ferret99gt@1606
   202
ferret99gt@1606
   203
/**
dvander@1889
   204
 * This function is no longer supported.  It has been replaced with ReadMapList(), 
dvander@1889
   205
 * which uses a more unified caching and configuration mechanism.  This function also 
dvander@1889
   206
 * has a bug where if the cvar contents changes, the fileTime change won't be recognized.
dvander@1889
   207
 * 
ferret99gt@1606
   208
 * Loads a specified array with maps. The maps will be either loaded from mapcyclefile, or if supplied
ferret99gt@1606
   209
 * a cvar containing a file name. If the file in the cvar is bad, it will use mapcyclefile. The fileTime
ferret99gt@1606
   210
 * parameter is used to store a timestamp of the file. If specified, the file will only be reloaded if it
ferret99gt@1606
   211
 * has changed.
ferret99gt@1606
   212
 *
ferret99gt@1606
   213
 * @param array		Valid array handle, should be created with CreateArray(33) or larger. 
ferret99gt@1606
   214
 * @param fileTime	Variable containing the "last changed" time of the file. Used to avoid needless reloading.
ferret99gt@1606
   215
 * @param fileCvar	CVAR set to the file to be loaded. Optional.
dvander@1889
   216
 * @return			Number of maps loaded or 0 if in error.
ferret99gt@1606
   217
 */
dvander@1889
   218
#pragma deprecated Use ReadMapList() instead. 
ferret99gt@1606
   219
 stock LoadMaps(Handle:array, &fileTime = 0, Handle:fileCvar = INVALID_HANDLE)
ferret99gt@1606
   220
 { 
ferret99gt@1606
   221
 	decl String:mapPath[256], String:mapFile[64];
ferret99gt@1606
   222
 	new bool:fileFound = false;
ferret99gt@1606
   223
 	
ferret99gt@1606
   224
 	if (fileCvar != INVALID_HANDLE)
ferret99gt@1606
   225
 	{
ferret99gt@1606
   226
 		GetConVarString(fileCvar, mapFile, 64);
ferret99gt@1606
   227
	 	BuildPath(Path_SM, mapPath, sizeof(mapPath), mapFile);
ferret99gt@1606
   228
 		fileFound = FileExists(mapPath);
ferret99gt@1606
   229
 	}
ferret99gt@1606
   230
 
ferret99gt@1606
   231
 	if (!fileFound)
ferret99gt@1606
   232
 	{
ferret99gt@1606
   233
 		new Handle:mapCycleFile = FindConVar("mapcyclefile");
ferret99gt@1606
   234
 		GetConVarString(mapCycleFile, mapPath, sizeof(mapPath));
ferret99gt@1606
   235
 		fileFound = FileExists(mapPath);
ferret99gt@1606
   236
 	}
ferret99gt@1606
   237
 	
ferret99gt@1606
   238
 	if (!fileFound)
ferret99gt@1606
   239
 	{
ferret99gt@1606
   240
 		LogError("Failed to find a file to load maps from. No maps loaded.");
ferret99gt@1606
   241
 		ClearArray(array);
ferret99gt@1606
   242
 		
ferret99gt@1606
   243
 		return 0;		
ferret99gt@1606
   244
 	}
ferret99gt@1606
   245
 
ferret99gt@1606
   246
 	// If the file hasn't changed, there's no reason to reload
ferret99gt@1606
   247
 	// all of the maps.
ferret99gt@1606
   248
 	new newTime =  GetFileTime(mapPath, FileTime_LastChange);
ferret99gt@1606
   249
 	if (fileTime == newTime)
ferret99gt@1606
   250
 	{
ferret99gt@1606
   251
 		return GetArraySize(array);
ferret99gt@1606
   252
 	}
ferret99gt@1606
   253
 	
ferret99gt@1606
   254
 	fileTime = newTime;
ferret99gt@1606
   255
 	
ferret99gt@1606
   256
 	ClearArray(array);
ferret99gt@1606
   257
 
ferret99gt@1606
   258
 	new Handle:file = OpenFile(mapPath, "rt");
ferret99gt@1606
   259
 	if (file == INVALID_HANDLE)
ferret99gt@1606
   260
 	{
ferret99gt@1606
   261
 		LogError("Could not open file: %s", mapPath);
ferret99gt@1606
   262
 		
ferret99gt@1606
   263
 		return 0;
ferret99gt@1606
   264
 	}
ferret99gt@1606
   265
 
ferret99gt@1606
   266
	LogMessage("Loading maps from file: %s", mapPath);
ferret99gt@1606
   267
	
ferret99gt@1606
   268
 	decl String:buffer[64], len;
ferret99gt@1606
   269
 	while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer)))
ferret99gt@1606
   270
 	{
ferret99gt@1606
   271
 		TrimString(buffer);
ferret99gt@1606
   272
 
ferret99gt@1606
   273
 		if ((len = StrContains(buffer, ".bsp", false)) != -1)
ferret99gt@1606
   274
 		{
ferret99gt@1606
   275
 			buffer[len] = '\0';
ferret99gt@1606
   276
 		}
ferret99gt@1606
   277
 
ferret99gt@1606
   278
 		if (buffer[0] == '\0' || !IsValidConVarChar(buffer[0]) || !IsMapValid(buffer))
ferret99gt@1606
   279
 		{
ferret99gt@1606
   280
 			continue;
ferret99gt@1606
   281
 		}
ferret99gt@1664
   282
 		
ferret99gt@1664
   283
 		if (FindStringInArray(array, buffer) != -1)
ferret99gt@1664
   284
 		{
ferret99gt@1664
   285
 			continue;
ferret99gt@1664
   286
 		}
ferret99gt@1606
   287
 
ferret99gt@1606
   288
 		PushArrayString(array, buffer);
ferret99gt@1606
   289
 	}
ferret99gt@1606
   290
 
ferret99gt@1606
   291
 	CloseHandle(file);
ferret99gt@1606
   292
 	return GetArraySize(array);
ferret99gt@1606
   293
}