plugins/include/helpers.inc
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1177 90c066adfa6b
child 1423 e73b3563f254
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

(This day shall henceforth be known as the Eighty Column Massacre of '07)
dvander@460
     1
/**
ds@475
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@460
     4
 * SourceMod (C)2004-2007 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@926
    39
 * Provided by basecommands.sp when sm_ban is called.
dvander@926
    40
 *
dvander@927
    41
 * @param admin			Admin client index (0 for server).
dvander@926
    42
 * @param client		Client index which will be banned.
dvander@927
    43
 * @param time			Minutes banned for (0 is permanent).
dvander@926
    44
 * @param reason		Ban reason (may be empty if none exists).
dvander@982
    45
 * @return				Pl_Handled to block output, Pl_Stop to block output and action.
dvander@926
    46
 */
dvander@982
    47
forward Action:OnClientBanned(admin, client, time, const String:reason[]);
dvander@927
    48
dvander@927
    49
/**
dvander@927
    50
 * Provided by basecommands.sp when sm_addban or sm_banip is called.
dvander@927
    51
 *
dvander@927
    52
 * @param admin			Admin client index (0 for server).
dvander@927
    53
 * @param info			User info (either steamid or ip).
dvander@927
    54
 * @param time			Minutes banned for (0 is permanent).
dvander@927
    55
 * @param reason		Ban reason (may be empty if none exists).
dvander@982
    56
 * @return				Pl_Handled to block output, Pl_Stop to block output and action.
dvander@927
    57
 */
dvander@982
    58
forward Action:OnBanAdded(admin, const String:info[], time, const String:reason[]);
dvander@927
    59
dvander@927
    60
/**
dvander@927
    61
 * Provided by basecommands.sp when sm_unban or sm_unbanip is called.
dvander@927
    62
 *
dvander@927
    63
 * @param admin			Admin client index (0 for server).
dvander@927
    64
 * @param info 			User info (either steamid or ip).
dvander@982
    65
 * @return				Pl_Handled to block output, Pl_Stop to block output and action.
dvander@927
    66
 */
dvander@982
    67
forward Action:OnBanRemoved(admin, const String:info[]);
dvander@926
    68
dvander@926
    69
/**
dvander@982
    70
 * Formats a user's info as log text.  This is usually not needed because
dvander@982
    71
 * %L can be used to auto-format client information into a string.
dvander@460
    72
 *
dvander@460
    73
 * @param client		Client index.
dvander@460
    74
 * @param buffer		Buffer for text.
dvander@460
    75
 * @param maxlength		Maximum length of text.
dvander@460
    76
 */
dvander@460
    77
stock FormatUserLogText(client, String:buffer[], maxlength)
dvander@460
    78
{
dvander@460
    79
	decl String:auth[32];
dvander@460
    80
	decl String:name[40];
dvander@460
    81
	
dvander@460
    82
	new userid = GetClientUserId(client);
dvander@460
    83
	if (!GetClientAuthString(client, auth, sizeof(auth)))
dvander@460
    84
	{
ds@1083
    85
		strcopy(auth, sizeof(auth), "UNKNOWN");
dvander@460
    86
	}
dvander@460
    87
	if (!GetClientName(client, name, sizeof(name)))
dvander@460
    88
	{
ds@1083
    89
		strcopy(name, sizeof(name), "UNKNOWN");
dvander@460
    90
	}
dvander@460
    91
	
dvander@460
    92
	/** Currently, no team stuff ... */
dvander@460
    93
	
dvander@460
    94
	Format(buffer, maxlength, "\"%s<%d><%s><>\"", name, userid, auth);
dvander@460
    95
}
ds@621
    96
ds@621
    97
/**
ds@621
    98
 * Returns plugin handle from plugin filename.
ds@621
    99
 *
ds@621
   100
 * @param filename		Filename of the plugin to search for.
ds@622
   101
 * @return				Handle to plugin if found, INVALID_HANDLE otherwise.
ds@621
   102
 */
ds@621
   103
stock Handle:FindPluginByFile(const String:filename[])
ds@621
   104
{
ds@621
   105
	decl String:buffer[256];
ds@621
   106
	
ds@621
   107
	new Handle:iter = GetPluginIterator();
ds@621
   108
	new Handle:pl;
ds@621
   109
	
ds@621
   110
	while (MorePlugins(iter))
ds@621
   111
	{
ds@621
   112
		pl = ReadPlugin(iter);
ds@621
   113
		
ds@621
   114
		GetPluginFilename(pl, buffer, sizeof(buffer));
ds@1083
   115
		if (strcmp(buffer, filename, false) == 0)
ds@621
   116
		{
dvander@982
   117
			CloseHandle(iter);
ds@621
   118
			return pl;
ds@621
   119
		}
ds@621
   120
	}
ds@621
   121
	
ds@650
   122
	CloseHandle(iter);
ds@650
   123
	
ds@621
   124
	return INVALID_HANDLE;
ds@621
   125
}
dvander@902
   126
dvander@902
   127
/**
dvander@902
   128
 * Searches for clients that match an input string.
dvander@902
   129
 *
dvander@902
   130
 * Allowed patterns: 
dvander@902
   131
 *  1) #<userid> or #<exact name>
dvander@902
   132
 *  2) <partial or full name>
dvander@903
   133
 *
dvander@903
   134
 * @param pattern		Pattern to search for.
dvander@903
   135
 * @param clients		Array to store matching clients in.
dvander@903
   136
 * @param maxClients	Maximum clients in the array.
dvander@903
   137
 * @return				Number of clients found.
dvander@902
   138
 */
dvander@902
   139
stock SearchForClients(const String:pattern[], clients[], maxClients)
dvander@902
   140
{
dvander@902
   141
	new maxclients = GetMaxClients();
dvander@902
   142
	new total = 0;
dvander@902
   143
	
dvander@902
   144
	if (maxClients == 0)
dvander@902
   145
	{
dvander@902
   146
		return 0;
dvander@902
   147
	}
dvander@902
   148
	
dvander@902
   149
	if (pattern[0] == '#')
dvander@902
   150
	{
dvander@902
   151
		new input = StringToInt(pattern[1]);
dvander@902
   152
		if (!input)
dvander@902
   153
		{
dvander@902
   154
			decl String:name[65]
dvander@902
   155
			for (new i=1; i<=maxclients; i++)
dvander@902
   156
			{
dvander@902
   157
				if (!IsClientInGame(i))
dvander@902
   158
				{
dvander@902
   159
					continue;
dvander@902
   160
				}
dvander@902
   161
				GetClientName(i, name, sizeof(name));
ds@1083
   162
				if (strcmp(name, pattern, false) == 0)
dvander@902
   163
				{
dvander@902
   164
					clients[0] = i;
dvander@902
   165
					return 1;
dvander@902
   166
				}
dvander@902
   167
			}
dvander@902
   168
		} else {
dvander@902
   169
			new client = GetClientOfUserId(input);
dvander@902
   170
			if (client)
dvander@902
   171
			{
dvander@902
   172
				clients[0] = client;
dvander@902
   173
				return 1;
dvander@902
   174
			}
dvander@902
   175
		}
dvander@902
   176
	}
dvander@902
   177
	
dvander@902
   178
	decl String:name[65]
dvander@902
   179
	for (new i=1; i<=maxclients; i++)
dvander@902
   180
	{
dvander@902
   181
		if (!IsClientInGame(i))
dvander@902
   182
		{
dvander@902
   183
			continue;
dvander@902
   184
		}
dvander@902
   185
		GetClientName(i, name, sizeof(name));
dvander@902
   186
		if (StrContains(name, pattern, false) != -1)
dvander@902
   187
		{
dvander@902
   188
			clients[total++] = i;
dvander@902
   189
			if (total >= maxClients)
dvander@902
   190
			{
dvander@902
   191
				break;
dvander@902
   192
			}
dvander@902
   193
		}
dvander@902
   194
	}
dvander@902
   195
	
dvander@902
   196
	return total;
dvander@902
   197
}
ferret99gt@1177
   198
ferret99gt@1177
   199
/**
ferret99gt@1177
   200
 * Wraps SearchForClients and handles producing error messages for
ferret99gt@1177
   201
 * bad targets.
ferret99gt@1177
   202
 *
ferret99gt@1177
   203
 * @param client	Client who issued command
ferret99gt@1177
   204
 * @param target	Client's target argument
ferret99gt@1177
   205
 * @param nobots	Optional. Set to true if bots should NOT be targetted
ferret99gt@1177
   206
 * @param immunity	Optional. Set to false to ignore target immunity.
ferret99gt@1177
   207
 * @return		Index of target client, or -1 on error.
ferret99gt@1177
   208
 */
ferret99gt@1177
   209
stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true)
ferret99gt@1177
   210
{
ferret99gt@1177
   211
	new clients[2];
ferret99gt@1177
   212
	new numClients = SearchForClients(target, clients, 2);
ferret99gt@1177
   213
	
ferret99gt@1177
   214
	if (numClients == 0)
ferret99gt@1177
   215
	{
ferret99gt@1177
   216
		ReplyToCommand(client, "[SM] %t", "No matching client");
ferret99gt@1177
   217
		return -1;
ferret99gt@1177
   218
	}
ferret99gt@1177
   219
	else if (numClients > 1)
ferret99gt@1177
   220
	{
ferret99gt@1177
   221
		ReplyToCommand(client, "[SM] %t", "More than one client matches", target);
ferret99gt@1177
   222
		return -1;
ferret99gt@1177
   223
	}
ferret99gt@1177
   224
	else if (immunity && !CanUserTarget(client, clients[0]))
ferret99gt@1177
   225
	{
ferret99gt@1177
   226
		ReplyToCommand(client, "[SM] %t", "Unable to target");
ferret99gt@1177
   227
		return -1;
ferret99gt@1177
   228
	}
ferret99gt@1177
   229
	else if (nobots && IsFakeClient(clients[0]))
ferret99gt@1177
   230
	{
ferret99gt@1177
   231
		ReplyToCommand(client, "[SM] %t", "Cannot target bot");
ferret99gt@1177
   232
		return -1;
ferret99gt@1177
   233
	}
ferret99gt@1177
   234
	
ferret99gt@1177
   235
	return clients[0];
ferret99gt@1177
   236
}