plugins/include/helpers.inc
author Borja Ferrer <faluco@alliedmods.net>
Mon Oct 01 21:20:30 2007 +0000 (2007-10-01)
changeset 1515 3e112467aacd
parent 1423 e73b3563f254
child 1606 4fb3959c2c96
permissions -rw-r--r--
fixed amb991, dispatchkeyvalue natives had wrong offsets
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@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@902
    97
 * Searches for clients that match an input string.
dvander@902
    98
 *
dvander@902
    99
 * Allowed patterns: 
dvander@902
   100
 *  1) #<userid> or #<exact name>
dvander@902
   101
 *  2) <partial or full name>
dvander@903
   102
 *
dvander@903
   103
 * @param pattern		Pattern to search for.
dvander@903
   104
 * @param clients		Array to store matching clients in.
dvander@903
   105
 * @param maxClients	Maximum clients in the array.
dvander@903
   106
 * @return				Number of clients found.
dvander@902
   107
 */
dvander@902
   108
stock SearchForClients(const String:pattern[], clients[], maxClients)
dvander@902
   109
{
dvander@902
   110
	new maxclients = GetMaxClients();
dvander@902
   111
	new total = 0;
dvander@902
   112
	
dvander@902
   113
	if (maxClients == 0)
dvander@902
   114
	{
dvander@902
   115
		return 0;
dvander@902
   116
	}
dvander@902
   117
	
dvander@902
   118
	if (pattern[0] == '#')
dvander@902
   119
	{
dvander@902
   120
		new input = StringToInt(pattern[1]);
dvander@902
   121
		if (!input)
dvander@902
   122
		{
dvander@902
   123
			decl String:name[65]
dvander@902
   124
			for (new i=1; i<=maxclients; i++)
dvander@902
   125
			{
dvander@902
   126
				if (!IsClientInGame(i))
dvander@902
   127
				{
dvander@902
   128
					continue;
dvander@902
   129
				}
dvander@902
   130
				GetClientName(i, name, sizeof(name));
ds@1083
   131
				if (strcmp(name, pattern, false) == 0)
dvander@902
   132
				{
dvander@902
   133
					clients[0] = i;
dvander@902
   134
					return 1;
dvander@902
   135
				}
dvander@902
   136
			}
dvander@902
   137
		} else {
dvander@902
   138
			new client = GetClientOfUserId(input);
dvander@902
   139
			if (client)
dvander@902
   140
			{
dvander@902
   141
				clients[0] = client;
dvander@902
   142
				return 1;
dvander@902
   143
			}
dvander@902
   144
		}
dvander@902
   145
	}
dvander@902
   146
	
dvander@902
   147
	decl String:name[65]
dvander@902
   148
	for (new i=1; i<=maxclients; i++)
dvander@902
   149
	{
dvander@902
   150
		if (!IsClientInGame(i))
dvander@902
   151
		{
dvander@902
   152
			continue;
dvander@902
   153
		}
dvander@902
   154
		GetClientName(i, name, sizeof(name));
dvander@902
   155
		if (StrContains(name, pattern, false) != -1)
dvander@902
   156
		{
dvander@902
   157
			clients[total++] = i;
dvander@902
   158
			if (total >= maxClients)
dvander@902
   159
			{
dvander@902
   160
				break;
dvander@902
   161
			}
dvander@902
   162
		}
dvander@902
   163
	}
dvander@902
   164
	
dvander@902
   165
	return total;
dvander@902
   166
}
ferret99gt@1177
   167
ferret99gt@1177
   168
/**
ferret99gt@1177
   169
 * Wraps SearchForClients and handles producing error messages for
ferret99gt@1177
   170
 * bad targets.
ferret99gt@1177
   171
 *
ferret99gt@1177
   172
 * @param client	Client who issued command
ferret99gt@1177
   173
 * @param target	Client's target argument
ferret99gt@1177
   174
 * @param nobots	Optional. Set to true if bots should NOT be targetted
ferret99gt@1177
   175
 * @param immunity	Optional. Set to false to ignore target immunity.
ferret99gt@1177
   176
 * @return		Index of target client, or -1 on error.
ferret99gt@1177
   177
 */
ferret99gt@1177
   178
stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true)
ferret99gt@1177
   179
{
ferret99gt@1177
   180
	new clients[2];
ferret99gt@1177
   181
	new numClients = SearchForClients(target, clients, 2);
ferret99gt@1177
   182
	
ferret99gt@1177
   183
	if (numClients == 0)
ferret99gt@1177
   184
	{
ferret99gt@1177
   185
		ReplyToCommand(client, "[SM] %t", "No matching client");
ferret99gt@1177
   186
		return -1;
ferret99gt@1177
   187
	}
ferret99gt@1177
   188
	else if (numClients > 1)
ferret99gt@1177
   189
	{
ferret99gt@1177
   190
		ReplyToCommand(client, "[SM] %t", "More than one client matches", target);
ferret99gt@1177
   191
		return -1;
ferret99gt@1177
   192
	}
ferret99gt@1177
   193
	else if (immunity && !CanUserTarget(client, clients[0]))
ferret99gt@1177
   194
	{
ferret99gt@1177
   195
		ReplyToCommand(client, "[SM] %t", "Unable to target");
ferret99gt@1177
   196
		return -1;
ferret99gt@1177
   197
	}
ferret99gt@1177
   198
	else if (nobots && IsFakeClient(clients[0]))
ferret99gt@1177
   199
	{
ferret99gt@1177
   200
		ReplyToCommand(client, "[SM] %t", "Cannot target bot");
ferret99gt@1177
   201
		return -1;
ferret99gt@1177
   202
	}
ferret99gt@1177
   203
	
ferret99gt@1177
   204
	return clients[0];
ferret99gt@1177
   205
}