core/smn_player.cpp
author Asher Baker <asherkin@gmail.com>
Fri Feb 17 03:28:02 2012 +0000 (2012-02-17)
changeset 3458 62ad320dd01a
parent 3418 b0e93f5101ef
child 3696 9588d737efe0
permissions -rw-r--r--
Generate and upload breakpad symbols if BREAKPAD_SYMBOL_SERVER variable is set. (bug 5229, r=dvander)
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
ds@1947
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@370
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@370
    28
 *
dvander@370
    29
 * Version: $Id$
dvander@370
    30
 */
dvander@370
    31
dvander@591
    32
#include "PlayerManager.h"
dvander@458
    33
#include "AdminCache.h"
faluco@280
    34
#include "sm_stringutil.h"
dvander@910
    35
#include "HalfLife2.h"
dvander@910
    36
#include "sourcemod.h"
dvander@924
    37
#include "ChatTriggers.h"
ds@992
    38
#include <inetchannel.h>
ds@992
    39
#include <iclient.h>
faluco@242
    40
dvander@1839
    41
ConVar sm_show_activity("sm_show_activity", "13", FCVAR_SPONLY, "Activity display setting (see sourcemod.cfg)");
dvander@910
    42
faluco@260
    43
static cell_t sm_GetClientCount(IPluginContext *pCtx, const cell_t *params)
faluco@242
    44
{
faluco@242
    45
	if (params[1])
faluco@242
    46
	{
dvander@448
    47
		return g_Players.NumPlayers();
faluco@242
    48
	}
faluco@242
    49
dvander@448
    50
	int maxplayers = g_Players.MaxClients();
faluco@242
    51
	int count = 0;
faluco@242
    52
	for (int i=1; i<=maxplayers; ++i)
faluco@242
    53
	{
dvander@448
    54
		CPlayer *pPlayer = g_Players.GetPlayerByIndex(i);
dvander@435
    55
		if ((pPlayer->IsConnected()) && !(pPlayer->IsInGame()))
faluco@242
    56
		{
faluco@242
    57
			count++;
faluco@242
    58
		}
faluco@242
    59
	}
faluco@242
    60
dvander@448
    61
	return (g_Players.NumPlayers() + count);
faluco@242
    62
}
faluco@242
    63
faluco@260
    64
static cell_t sm_GetMaxClients(IPluginContext *pCtx, const cell_t *params)
faluco@242
    65
{
dvander@448
    66
	return g_Players.MaxClients();
faluco@242
    67
}
faluco@242
    68
faluco@260
    69
static cell_t sm_GetClientName(IPluginContext *pCtx, const cell_t *params)
faluco@242
    70
{
faluco@242
    71
	int index = params[1];
dvander@1049
    72
dvander@1049
    73
	if (index == 0)
dvander@1049
    74
	{
dvander@1049
    75
		static ConVar *hostname = NULL;
dvander@1049
    76
		if (!hostname)
dvander@1049
    77
		{
dvander@1049
    78
			hostname = icvar->FindVar("hostname");
dvander@1049
    79
			if (!hostname)
dvander@1049
    80
			{
dvander@1049
    81
				return pCtx->ThrowNativeError("Could not find \"hostname\" cvar");
dvander@1049
    82
			}
dvander@1049
    83
		}
dvander@1049
    84
		pCtx->StringToLocalUTF8(params[2], static_cast<size_t>(params[3]), hostname->GetString(), NULL);
dvander@1049
    85
		return 1;
dvander@1049
    86
	}
dvander@1049
    87
dvander@448
    88
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
    89
	{
ds@994
    90
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@242
    91
	}
faluco@242
    92
dvander@448
    93
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
    94
	if (!pPlayer->IsConnected())
faluco@260
    95
	{
ds@470
    96
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@260
    97
	}
faluco@260
    98
dvander@435
    99
	pCtx->StringToLocalUTF8(params[2], static_cast<size_t>(params[3]), pPlayer->GetName(), NULL);
faluco@242
   100
	return 1;
faluco@242
   101
}
faluco@242
   102
faluco@260
   103
static cell_t sm_GetClientIP(IPluginContext *pCtx, const cell_t *params)
faluco@242
   104
{
faluco@242
   105
	int index = params[1];
dvander@448
   106
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   107
	{
ds@994
   108
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@242
   109
	}
faluco@242
   110
dvander@448
   111
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
   112
	if (!pPlayer->IsConnected())
faluco@260
   113
	{
ds@470
   114
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@260
   115
	}
faluco@260
   116
faluco@280
   117
	char buf[64], *ptr;
dvander@435
   118
	strcpy(buf, pPlayer->GetIPAddress());
faluco@280
   119
faluco@280
   120
	if (params[4] && (ptr = strchr(buf, ':')))
faluco@280
   121
	{
faluco@280
   122
		*ptr = '\0';
faluco@280
   123
	}
faluco@280
   124
faluco@280
   125
	pCtx->StringToLocal(params[2], static_cast<size_t>(params[3]), buf);
faluco@242
   126
	return 1;
faluco@242
   127
}
faluco@242
   128
faluco@260
   129
static cell_t sm_GetClientAuthStr(IPluginContext *pCtx, const cell_t *params)
faluco@242
   130
{
faluco@242
   131
	int index = params[1];
dvander@448
   132
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   133
	{
ds@994
   134
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@242
   135
	}
faluco@242
   136
dvander@448
   137
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
   138
	if (!pPlayer->IsConnected())
faluco@260
   139
	{
ds@470
   140
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@260
   141
	}
faluco@260
   142
dvander@449
   143
	if (!pPlayer->IsAuthorized())
dvander@449
   144
	{
dvander@449
   145
		return 0;
dvander@449
   146
	}
dvander@449
   147
dvander@435
   148
	pCtx->StringToLocal(params[2], static_cast<size_t>(params[3]), pPlayer->GetAuthString());
dvander@449
   149
faluco@242
   150
	return 1;
faluco@242
   151
}
faluco@242
   152
ds@784
   153
static cell_t sm_IsClientConnected(IPluginContext *pCtx, const cell_t *params)
faluco@242
   154
{
faluco@242
   155
	int index = params[1];
dvander@448
   156
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   157
	{
ds@994
   158
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@242
   159
	}
faluco@242
   160
dvander@448
   161
	return (g_Players.GetPlayerByIndex(index)->IsConnected()) ? 1 : 0;
faluco@242
   162
}
faluco@242
   163
ds@784
   164
static cell_t sm_IsClientInGame(IPluginContext *pCtx, const cell_t *params)
faluco@242
   165
{
faluco@242
   166
	int index = params[1];
dvander@448
   167
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   168
	{
ds@994
   169
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@242
   170
	}
faluco@242
   171
dvander@448
   172
	return (g_Players.GetPlayerByIndex(index)->IsInGame()) ? 1 : 0;
faluco@242
   173
}
faluco@242
   174
ds@784
   175
static cell_t sm_IsClientAuthorized(IPluginContext *pCtx, const cell_t *params)
faluco@242
   176
{
faluco@242
   177
	int index = params[1];
dvander@448
   178
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   179
	{
ds@994
   180
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@242
   181
	}
faluco@242
   182
dvander@448
   183
	return (g_Players.GetPlayerByIndex(index)->IsAuthorized()) ? 1 : 0;
faluco@242
   184
}
faluco@242
   185
ds@784
   186
static cell_t sm_IsClientFakeClient(IPluginContext *pCtx, const cell_t *params)
faluco@242
   187
{
faluco@242
   188
	int index = params[1];
dvander@448
   189
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   190
	{
ds@994
   191
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
faluco@260
   192
	}
faluco@260
   193
dvander@448
   194
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
   195
	if (!pPlayer->IsConnected())
faluco@260
   196
	{
ds@470
   197
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@242
   198
	}
faluco@242
   199
dvander@435
   200
	return (pPlayer->IsFakeClient()) ? 1 : 0;
faluco@260
   201
}
faluco@260
   202
skamonkey@3418
   203
static cell_t sm_IsClientSourceTV(IPluginContext *pCtx, const cell_t *params)
skamonkey@3418
   204
{
skamonkey@3418
   205
	int index = params[1];
skamonkey@3418
   206
	if ((index < 1) || (index > g_Players.GetMaxClients()))
skamonkey@3418
   207
	{
skamonkey@3418
   208
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
skamonkey@3418
   209
	}
skamonkey@3418
   210
skamonkey@3418
   211
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
skamonkey@3418
   212
	if (!pPlayer->IsConnected())
skamonkey@3418
   213
	{
skamonkey@3418
   214
		return pCtx->ThrowNativeError("Client %d is not connected", index);
skamonkey@3418
   215
	}
skamonkey@3418
   216
skamonkey@3418
   217
	return (pPlayer->IsSourceTV()) ? 1 : 0;
skamonkey@3418
   218
}
skamonkey@3418
   219
skamonkey@3418
   220
static cell_t sm_IsClientReplay(IPluginContext *pCtx, const cell_t *params)
skamonkey@3418
   221
{
skamonkey@3418
   222
	int index = params[1];
skamonkey@3418
   223
	if ((index < 1) || (index > g_Players.GetMaxClients()))
skamonkey@3418
   224
	{
skamonkey@3418
   225
		return pCtx->ThrowNativeError("Client index %d is invalid", index);
skamonkey@3418
   226
	}
skamonkey@3418
   227
skamonkey@3418
   228
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
skamonkey@3418
   229
	if (!pPlayer->IsConnected())
skamonkey@3418
   230
	{
skamonkey@3418
   231
		return pCtx->ThrowNativeError("Client %d is not connected", index);
skamonkey@3418
   232
	}
skamonkey@3418
   233
skamonkey@3418
   234
	return (pPlayer->IsReplay()) ? 1 : 0;
skamonkey@3418
   235
}
skamonkey@3418
   236
ds@1001
   237
static cell_t IsClientObserver(IPluginContext *pContext, const cell_t *params)
ds@1001
   238
{
ds@1001
   239
	int client = params[1];
ds@1001
   240
ds@1001
   241
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
ds@1001
   242
	if (!pPlayer)
ds@1001
   243
	{
ds@1001
   244
		return pContext->ThrowNativeError("Client index %d is invalid", client);
ds@1001
   245
	} else if (!pPlayer->IsInGame()) {
ds@1001
   246
		return pContext->ThrowNativeError("Client %d is not in game", client);
ds@1001
   247
	}
ds@1001
   248
ds@1001
   249
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
ds@1001
   250
	if (!pInfo)
ds@1001
   251
	{
ds@1001
   252
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
ds@1001
   253
	}
ds@1001
   254
ds@1001
   255
	return pInfo->IsObserver() ? 1 : 0;
ds@1001
   256
}
ds@1001
   257
dvander@456
   258
static cell_t sm_GetClientInfo(IPluginContext *pContext, const cell_t *params)
dvander@456
   259
{
dvander@456
   260
	int client = params[1];
dvander@456
   261
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@456
   262
	if (!pPlayer)
dvander@456
   263
	{
ds@994
   264
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@456
   265
	}
dvander@456
   266
	if (!pPlayer->IsConnected())
dvander@456
   267
	{
ds@470
   268
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@456
   269
	}
dvander@456
   270
dvander@456
   271
	char *key;
dvander@456
   272
	pContext->LocalToString(params[2], &key);
dvander@456
   273
dvander@456
   274
	const char *val = engine->GetClientConVarValue(client, key);
dvander@456
   275
	if (!val)
dvander@456
   276
	{
dvander@456
   277
		return false;
dvander@456
   278
	}
dvander@456
   279
dvander@456
   280
	pContext->StringToLocalUTF8(params[3], params[4], val, NULL);
dvander@456
   281
	return 1;
dvander@456
   282
}
dvander@456
   283
dvander@458
   284
static cell_t SetUserAdmin(IPluginContext *pContext, const cell_t *params)
dvander@458
   285
{
dvander@458
   286
	int client = params[1];
dvander@458
   287
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   288
	if (!pPlayer)
dvander@458
   289
	{
ds@994
   290
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@458
   291
	}
dvander@458
   292
	if (!pPlayer->IsConnected())
dvander@458
   293
	{
ds@470
   294
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   295
	}
dvander@1685
   296
	if (!g_Admins.IsValidAdmin(params[2]) && params[2] != INVALID_ADMIN_ID)
dvander@458
   297
	{
ds@994
   298
		return pContext->ThrowNativeError("AdminId %x is invalid", params[2]);
dvander@458
   299
	}
dvander@458
   300
dvander@458
   301
	pPlayer->SetAdminId(params[2], params[3] ? true : false);
dvander@458
   302
dvander@458
   303
	return 1;
dvander@458
   304
}
dvander@458
   305
dvander@458
   306
static cell_t GetUserAdmin(IPluginContext *pContext, const cell_t *params)
dvander@458
   307
{
dvander@458
   308
	int client = params[1];
dvander@458
   309
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   310
	if (!pPlayer)
dvander@458
   311
	{
ds@994
   312
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@458
   313
	}
dvander@458
   314
	if (!pPlayer->IsConnected())
dvander@458
   315
	{
ds@470
   316
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   317
	}
dvander@458
   318
dvander@458
   319
	return pPlayer->GetAdminId();
dvander@458
   320
}
dvander@458
   321
dvander@458
   322
static cell_t AddUserFlags(IPluginContext *pContext, const cell_t *params)
dvander@458
   323
{
dvander@458
   324
	int client = params[1];
dvander@458
   325
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   326
	if (!pPlayer)
dvander@458
   327
	{
ds@994
   328
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@458
   329
	}
dvander@458
   330
	if (!pPlayer->IsConnected())
dvander@458
   331
	{
ds@470
   332
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   333
	}
dvander@458
   334
dvander@458
   335
	AdminId id;
dvander@458
   336
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   337
	{
dvander@458
   338
		id = g_Admins.CreateAdmin(NULL);
dvander@458
   339
		pPlayer->SetAdminId(id, true);
dvander@458
   340
	}
dvander@458
   341
dvander@458
   342
	cell_t *addr;
dvander@458
   343
	for (int i=2; i<=params[0]; i++)
dvander@458
   344
	{
dvander@458
   345
		pContext->LocalToPhysAddr(params[i], &addr);
dvander@458
   346
		g_Admins.SetAdminFlag(id, (AdminFlag)*addr, true);
dvander@458
   347
	}
dvander@458
   348
dvander@458
   349
	return 1;
dvander@458
   350
}
dvander@458
   351
dvander@458
   352
static cell_t RemoveUserFlags(IPluginContext *pContext, const cell_t *params)
dvander@458
   353
{
dvander@458
   354
	int client = params[1];
dvander@458
   355
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   356
	if (!pPlayer)
dvander@458
   357
	{
ds@994
   358
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@458
   359
	}
dvander@458
   360
	if (!pPlayer->IsConnected())
dvander@458
   361
	{
ds@470
   362
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   363
	}
dvander@458
   364
	
dvander@458
   365
	AdminId id;
dvander@458
   366
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   367
	{
dvander@458
   368
		return 0;
dvander@458
   369
	}
dvander@458
   370
dvander@458
   371
	cell_t *addr;
dvander@458
   372
	for (int i=2; i<=params[0]; i++)
dvander@458
   373
	{
dvander@458
   374
		pContext->LocalToPhysAddr(params[i], &addr);
dvander@458
   375
		g_Admins.SetAdminFlag(id, (AdminFlag)*addr, false);
dvander@458
   376
	}
dvander@458
   377
dvander@458
   378
	return 1;
dvander@458
   379
}
dvander@458
   380
dvander@458
   381
static cell_t SetUserFlagBits(IPluginContext *pContext, const cell_t *params)
dvander@458
   382
{
dvander@458
   383
	int client = params[1];
dvander@458
   384
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   385
	if (!pPlayer)
dvander@458
   386
	{
ds@994
   387
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@458
   388
	}
dvander@458
   389
	if (!pPlayer->IsConnected())
dvander@458
   390
	{
ds@470
   391
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   392
	}
dvander@458
   393
dvander@458
   394
	AdminId id;
dvander@458
   395
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   396
	{
dvander@458
   397
		id = g_Admins.CreateAdmin(NULL);
dvander@458
   398
		pPlayer->SetAdminId(id, true);
dvander@458
   399
	}
dvander@458
   400
dvander@458
   401
	g_Admins.SetAdminFlags(id, Access_Effective, params[2]);
dvander@458
   402
dvander@458
   403
	return 1;
dvander@458
   404
}
dvander@458
   405
dvander@458
   406
static cell_t GetUserFlagBits(IPluginContext *pContext, const cell_t *params)
dvander@458
   407
{
dvander@458
   408
	int client = params[1];
dvander@458
   409
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   410
	if (!pPlayer)
dvander@458
   411
	{
ds@994
   412
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@458
   413
	}
dvander@458
   414
	if (!pPlayer->IsConnected())
dvander@458
   415
	{
ds@470
   416
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   417
	}
dvander@458
   418
dvander@458
   419
	AdminId id;
dvander@458
   420
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   421
	{
dvander@458
   422
		return 0;
dvander@458
   423
	}
dvander@458
   424
dvander@458
   425
	return g_Admins.GetAdminFlags(id, Access_Effective);
dvander@458
   426
}
dvander@458
   427
dvander@460
   428
static cell_t GetClientUserId(IPluginContext *pContext, const cell_t *params)
dvander@460
   429
{
dvander@460
   430
	int client = params[1];
dvander@460
   431
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@460
   432
	if (!pPlayer)
dvander@460
   433
	{
ds@994
   434
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@460
   435
	}
dvander@460
   436
	if (!pPlayer->IsConnected())
dvander@460
   437
	{
ds@470
   438
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@460
   439
	}
dvander@460
   440
dvander@460
   441
	return engine->GetPlayerUserId(pPlayer->GetEdict());
dvander@460
   442
}
dvander@460
   443
dvander@540
   444
static cell_t CanUserTarget(IPluginContext *pContext, const cell_t *params)
dvander@540
   445
{
dvander@540
   446
	int client = params[1];
dvander@540
   447
	int target = params[2];
dvander@540
   448
dvander@1035
   449
	if (client == 0)
dvander@1035
   450
	{
dvander@1035
   451
		return 1;
dvander@1035
   452
	}
dvander@1035
   453
dvander@540
   454
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@540
   455
	if (!pPlayer)
dvander@540
   456
	{
ds@994
   457
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@540
   458
	} else if (!pPlayer->IsConnected()) {
ds@994
   459
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@540
   460
	}
dvander@540
   461
dvander@540
   462
	CPlayer *pTarget = g_Players.GetPlayerByIndex(target);
dvander@540
   463
	if (!pTarget)
dvander@540
   464
	{
ds@994
   465
		return pContext->ThrowNativeError("Client index %d is invalid", target);
dvander@540
   466
	} else if (!pTarget->IsConnected()) {
ds@994
   467
		return pContext->ThrowNativeError("Client %d is not connected", target);
dvander@540
   468
	}
dvander@540
   469
dvander@540
   470
	return g_Admins.CanAdminTarget(pPlayer->GetAdminId(), pTarget->GetAdminId()) ? 1 : 0;
dvander@540
   471
}
dvander@540
   472
dvander@644
   473
static cell_t GetClientTeam(IPluginContext *pContext, const cell_t *params)
dvander@644
   474
{
dvander@644
   475
	int client = params[1];
dvander@644
   476
dvander@644
   477
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@644
   478
	if (!pPlayer)
dvander@644
   479
	{
ds@994
   480
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@644
   481
	} else if (!pPlayer->IsInGame()) {
ds@994
   482
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@644
   483
	}
dvander@644
   484
dvander@644
   485
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
dvander@644
   486
	if (!pInfo)
dvander@644
   487
	{
dvander@644
   488
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
dvander@644
   489
	}
dvander@644
   490
dvander@644
   491
	return pInfo->GetTeamIndex();
dvander@644
   492
}
dvander@644
   493
faluco@658
   494
static cell_t GetFragCount(IPluginContext *pContext, const cell_t *params)
faluco@658
   495
{
faluco@658
   496
	int client = params[1];
faluco@658
   497
faluco@658
   498
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   499
	if (!pPlayer)
faluco@658
   500
	{
ds@994
   501
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   502
	} else if (!pPlayer->IsInGame()) {
ds@994
   503
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   504
	}
faluco@658
   505
faluco@658
   506
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   507
	if (!pInfo)
faluco@658
   508
	{
faluco@658
   509
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   510
	}
faluco@658
   511
faluco@658
   512
	return pInfo->GetFragCount();
faluco@658
   513
}
faluco@658
   514
faluco@658
   515
static cell_t GetDeathCount(IPluginContext *pContext, const cell_t *params)
faluco@658
   516
{
faluco@658
   517
	int client = params[1];
faluco@658
   518
faluco@658
   519
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   520
	if (!pPlayer)
faluco@658
   521
	{
ds@994
   522
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   523
	} else if (!pPlayer->IsInGame()) {
ds@994
   524
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   525
	}
faluco@658
   526
faluco@658
   527
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   528
	if (!pInfo)
faluco@658
   529
	{
faluco@658
   530
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   531
	}
faluco@658
   532
faluco@658
   533
	return pInfo->GetDeathCount();
faluco@658
   534
}
faluco@658
   535
faluco@658
   536
static cell_t GetArmorValue(IPluginContext *pContext, const cell_t *params)
faluco@658
   537
{
faluco@658
   538
	int client = params[1];
faluco@658
   539
faluco@658
   540
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   541
	if (!pPlayer)
faluco@658
   542
	{
ds@994
   543
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   544
	} else if (!pPlayer->IsInGame()) {
ds@994
   545
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   546
	}
faluco@658
   547
faluco@658
   548
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   549
	if (!pInfo)
faluco@658
   550
	{
faluco@658
   551
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   552
	}
faluco@658
   553
faluco@658
   554
	return pInfo->GetArmorValue();
faluco@658
   555
}
faluco@658
   556
faluco@658
   557
static cell_t GetAbsOrigin(IPluginContext *pContext, const cell_t *params)
faluco@658
   558
{
faluco@658
   559
	int client = params[1];
faluco@658
   560
faluco@658
   561
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   562
	if (!pPlayer)
faluco@658
   563
	{
ds@994
   564
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   565
	} else if (!pPlayer->IsInGame()) {
ds@994
   566
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   567
	}
faluco@658
   568
faluco@658
   569
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   570
	if (!pInfo)
faluco@658
   571
	{
faluco@658
   572
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   573
	}
faluco@658
   574
faluco@658
   575
	cell_t *pVec;
faluco@658
   576
	pContext->LocalToPhysAddr(params[2], &pVec);
faluco@658
   577
faluco@658
   578
	Vector vec = pInfo->GetAbsOrigin();
faluco@658
   579
	pVec[0] = sp_ftoc(vec.x);
faluco@658
   580
	pVec[1] = sp_ftoc(vec.y);
faluco@658
   581
	pVec[2] = sp_ftoc(vec.z);
faluco@658
   582
faluco@658
   583
	return 1;
faluco@658
   584
}
faluco@658
   585
faluco@658
   586
static cell_t GetAbsAngles(IPluginContext *pContext, const cell_t *params)
faluco@658
   587
{
faluco@658
   588
	int client = params[1];
faluco@658
   589
faluco@658
   590
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   591
	if (!pPlayer)
faluco@658
   592
	{
ds@994
   593
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   594
	} else if (!pPlayer->IsInGame()) {
ds@994
   595
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   596
	}
faluco@658
   597
faluco@658
   598
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   599
	if (!pInfo)
faluco@658
   600
	{
faluco@658
   601
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   602
	}
faluco@658
   603
faluco@658
   604
	cell_t *pAng;
faluco@658
   605
	pContext->LocalToPhysAddr(params[2], &pAng);
faluco@658
   606
faluco@658
   607
	QAngle ang = pInfo->GetAbsAngles();
faluco@658
   608
	pAng[0] = sp_ftoc(ang.x);
faluco@658
   609
	pAng[1] = sp_ftoc(ang.y);
faluco@658
   610
	pAng[2] = sp_ftoc(ang.z);
faluco@658
   611
faluco@658
   612
	return 1;
faluco@658
   613
}
faluco@658
   614
faluco@658
   615
static cell_t GetPlayerMins(IPluginContext *pContext, const cell_t *params)
faluco@658
   616
{
faluco@658
   617
	int client = params[1];
faluco@658
   618
faluco@658
   619
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   620
	if (!pPlayer)
faluco@658
   621
	{
ds@994
   622
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   623
	} else if (!pPlayer->IsInGame()) {
ds@994
   624
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   625
	}
faluco@658
   626
faluco@658
   627
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   628
	if (!pInfo)
faluco@658
   629
	{
faluco@658
   630
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   631
	}
faluco@658
   632
faluco@658
   633
	cell_t *pVec;
faluco@658
   634
	pContext->LocalToPhysAddr(params[2], &pVec);
faluco@658
   635
faluco@658
   636
	Vector vec = pInfo->GetPlayerMins();
faluco@658
   637
	pVec[0] = sp_ftoc(vec.x);
faluco@658
   638
	pVec[1] = sp_ftoc(vec.y);
faluco@658
   639
	pVec[2] = sp_ftoc(vec.z);
faluco@658
   640
faluco@658
   641
	return 1;
faluco@658
   642
}
faluco@658
   643
faluco@658
   644
static cell_t GetPlayerMaxs(IPluginContext *pContext, const cell_t *params)
faluco@658
   645
{
faluco@658
   646
	int client = params[1];
faluco@658
   647
faluco@658
   648
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   649
	if (!pPlayer)
faluco@658
   650
	{
ds@994
   651
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   652
	} else if (!pPlayer->IsInGame()) {
ds@994
   653
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   654
	}
faluco@658
   655
faluco@658
   656
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   657
	if (!pInfo)
faluco@658
   658
	{
faluco@658
   659
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   660
	}
faluco@658
   661
faluco@658
   662
	cell_t *pVec;
faluco@658
   663
	pContext->LocalToPhysAddr(params[2], &pVec);
faluco@658
   664
faluco@658
   665
	Vector vec = pInfo->GetPlayerMaxs();
faluco@658
   666
	pVec[0] = sp_ftoc(vec.x);
faluco@658
   667
	pVec[1] = sp_ftoc(vec.y);
faluco@658
   668
	pVec[2] = sp_ftoc(vec.z);
faluco@658
   669
faluco@658
   670
	return 1;
faluco@658
   671
}
faluco@658
   672
faluco@658
   673
static cell_t GetWeaponName(IPluginContext *pContext, const cell_t *params)
faluco@658
   674
{
faluco@658
   675
	int client = params[1];
faluco@658
   676
faluco@658
   677
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   678
	if (!pPlayer)
faluco@658
   679
	{
ds@994
   680
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   681
	} else if (!pPlayer->IsInGame()) {
ds@994
   682
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   683
	}
faluco@658
   684
faluco@658
   685
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   686
	if (!pInfo)
faluco@658
   687
	{
faluco@658
   688
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   689
	}
faluco@658
   690
faluco@756
   691
	const char *weapon = pInfo->GetWeaponName();
faluco@756
   692
	pContext->StringToLocalUTF8(params[2], static_cast<size_t>(params[3]), weapon ? weapon : "", NULL);
faluco@658
   693
faluco@658
   694
	return 1;
faluco@658
   695
}
faluco@658
   696
faluco@658
   697
static cell_t GetModelName(IPluginContext *pContext, const cell_t *params)
faluco@658
   698
{
faluco@658
   699
	int client = params[1];
faluco@658
   700
faluco@658
   701
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   702
	if (!pPlayer)
faluco@658
   703
	{
ds@994
   704
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   705
	} else if (!pPlayer->IsInGame()) {
ds@994
   706
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   707
	}
faluco@658
   708
faluco@658
   709
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   710
	if (!pInfo)
faluco@658
   711
	{
faluco@658
   712
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   713
	}
faluco@658
   714
faluco@756
   715
	const char *model = pInfo->GetModelName();
faluco@756
   716
	pContext->StringToLocalUTF8(params[2], static_cast<size_t>(params[3]), model ? model : "", NULL);
faluco@658
   717
faluco@658
   718
	return 1;
faluco@658
   719
}
faluco@658
   720
faluco@658
   721
static cell_t GetHealth(IPluginContext *pContext, const cell_t *params)
faluco@658
   722
{
faluco@658
   723
	int client = params[1];
faluco@658
   724
faluco@658
   725
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@658
   726
	if (!pPlayer)
faluco@658
   727
	{
ds@994
   728
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@658
   729
	} else if (!pPlayer->IsInGame()) {
ds@994
   730
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@658
   731
	}
faluco@658
   732
faluco@658
   733
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
faluco@658
   734
	if (!pInfo)
faluco@658
   735
	{
faluco@658
   736
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
faluco@658
   737
	}
faluco@658
   738
faluco@658
   739
	return pInfo->GetHealth();
faluco@658
   740
}
faluco@658
   741
faluco@682
   742
static cell_t GetTimeConnected(IPluginContext *pContext, const cell_t *params)
faluco@682
   743
{
faluco@682
   744
	int client = params[1];
faluco@682
   745
faluco@682
   746
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   747
	if (!pPlayer)
faluco@682
   748
	{
ds@994
   749
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@682
   750
	} else if (!pPlayer->IsInGame()) {
ds@994
   751
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@682
   752
	} else if (pPlayer->IsFakeClient()) {
ds@994
   753
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   754
	}
faluco@682
   755
faluco@682
   756
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   757
	if (pInfo == NULL)
dvander@2961
   758
	{
dvander@2961
   759
		return 0;
dvander@2961
   760
	}
faluco@682
   761
faluco@682
   762
	return sp_ftoc(pInfo->GetTimeConnected());
faluco@682
   763
}
faluco@682
   764
faluco@682
   765
static cell_t GetDataRate(IPluginContext *pContext, const cell_t *params)
faluco@682
   766
{
faluco@682
   767
	int client = params[1];
faluco@682
   768
faluco@682
   769
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   770
	if (!pPlayer)
faluco@682
   771
	{
ds@994
   772
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@682
   773
	} else if (!pPlayer->IsInGame()) {
ds@994
   774
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@682
   775
	} else if (pPlayer->IsFakeClient()) {
ds@994
   776
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   777
	}
faluco@682
   778
faluco@682
   779
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   780
	if (pInfo == NULL)
dvander@2961
   781
	{
dvander@2961
   782
		return 0;
dvander@2961
   783
	}
faluco@682
   784
faluco@682
   785
	return pInfo->GetDataRate();
faluco@682
   786
}
faluco@682
   787
faluco@682
   788
static cell_t IsTimingOut(IPluginContext *pContext, const cell_t *params)
faluco@682
   789
{
faluco@682
   790
	int client = params[1];
faluco@682
   791
faluco@682
   792
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   793
	if (!pPlayer)
faluco@682
   794
	{
ds@994
   795
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@682
   796
	} else if (!pPlayer->IsInGame()) {
ds@994
   797
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@682
   798
	} else if (pPlayer->IsFakeClient()) {
ds@994
   799
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   800
	}
faluco@682
   801
faluco@682
   802
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   803
	if (pInfo == NULL)
dvander@2961
   804
	{
dvander@2961
   805
		return 1;
dvander@2961
   806
	}
faluco@682
   807
faluco@682
   808
	return pInfo->IsTimingOut() ? 1 : 0;
faluco@682
   809
}
faluco@682
   810
faluco@682
   811
static cell_t GetLatency(IPluginContext *pContext, const cell_t *params)
faluco@682
   812
{
faluco@682
   813
	int client = params[1];
dvander@2054
   814
	float value;
faluco@682
   815
faluco@682
   816
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   817
	if (!pPlayer)
faluco@682
   818
	{
ds@994
   819
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2054
   820
	}
dvander@2054
   821
	else if (!pPlayer->IsInGame())
dvander@2054
   822
	{
ds@994
   823
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@2054
   824
	}
dvander@2054
   825
	else if (pPlayer->IsFakeClient())
dvander@2054
   826
	{
ds@994
   827
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   828
	}
faluco@682
   829
faluco@682
   830
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   831
	if (pInfo == NULL)
dvander@2961
   832
	{
dvander@2961
   833
		return sp_ftoc(-1);
dvander@2961
   834
	}
faluco@682
   835
dvander@2054
   836
	if (params[2] == MAX_FLOWS)
dvander@2054
   837
	{
dvander@2054
   838
		value = pInfo->GetLatency(FLOW_INCOMING) + pInfo->GetLatency(FLOW_OUTGOING);
dvander@2054
   839
	}
dvander@2054
   840
	else
dvander@2054
   841
	{
dvander@2054
   842
		value = pInfo->GetLatency(params[2]);
dvander@2054
   843
	}
dvander@2054
   844
dvander@2054
   845
	return sp_ftoc(value);
faluco@682
   846
}
faluco@682
   847
faluco@682
   848
static cell_t GetAvgLatency(IPluginContext *pContext, const cell_t *params)
faluco@682
   849
{
faluco@682
   850
	int client = params[1];
dvander@2054
   851
	float value;
faluco@682
   852
faluco@682
   853
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   854
	if (!pPlayer)
faluco@682
   855
	{
ds@994
   856
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2054
   857
	}
dvander@2054
   858
	else if (!pPlayer->IsInGame())
dvander@2054
   859
	{
ds@994
   860
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@2054
   861
	}
dvander@2054
   862
	else if (pPlayer->IsFakeClient())
dvander@2054
   863
	{
ds@994
   864
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   865
	}
faluco@682
   866
faluco@682
   867
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   868
	if (pInfo == NULL)
dvander@2961
   869
	{
dvander@2961
   870
		return sp_ftoc(-1);
dvander@2961
   871
	}
faluco@682
   872
dvander@2054
   873
	if (params[2] == MAX_FLOWS)
dvander@2054
   874
	{
dvander@2054
   875
		value = pInfo->GetAvgLatency(FLOW_INCOMING) + pInfo->GetAvgLatency(FLOW_OUTGOING);
dvander@2054
   876
	}
dvander@2054
   877
	else
dvander@2054
   878
	{
dvander@2054
   879
		value = pInfo->GetAvgLatency(params[2]);
dvander@2054
   880
	}
dvander@2054
   881
dvander@2054
   882
	return sp_ftoc(value);
faluco@682
   883
}
faluco@682
   884
faluco@682
   885
static cell_t GetAvgLoss(IPluginContext *pContext, const cell_t *params)
faluco@682
   886
{
faluco@682
   887
	int client = params[1];
dvander@2054
   888
	float value;
faluco@682
   889
faluco@682
   890
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   891
	if (!pPlayer)
faluco@682
   892
	{
ds@994
   893
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2054
   894
	}
dvander@2054
   895
	else if (!pPlayer->IsInGame())
dvander@2054
   896
	{
ds@994
   897
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@2054
   898
	}
dvander@2054
   899
	else if (pPlayer->IsFakeClient())
dvander@2054
   900
	{
ds@994
   901
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   902
	}
faluco@682
   903
faluco@682
   904
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   905
	if (pInfo == NULL)
dvander@2961
   906
	{
dvander@2961
   907
		return sp_ftoc(-1);
dvander@2961
   908
	}
faluco@682
   909
dvander@2054
   910
	if (params[2] == MAX_FLOWS)
dvander@2054
   911
	{
dvander@2054
   912
		value = pInfo->GetAvgLoss(FLOW_INCOMING) + pInfo->GetAvgLoss(FLOW_OUTGOING);
dvander@2054
   913
	}
dvander@2054
   914
	else
dvander@2054
   915
	{
dvander@2054
   916
		value = pInfo->GetAvgLoss(params[2]);
dvander@2054
   917
	}
dvander@2054
   918
dvander@2054
   919
	return sp_ftoc(value);
faluco@682
   920
}
faluco@682
   921
faluco@682
   922
static cell_t GetAvgChoke(IPluginContext *pContext, const cell_t *params)
faluco@682
   923
{
faluco@682
   924
	int client = params[1];
dvander@2054
   925
	float value;
faluco@682
   926
faluco@682
   927
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   928
	if (!pPlayer)
faluco@682
   929
	{
ds@994
   930
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2054
   931
	}
dvander@2054
   932
	else if (!pPlayer->IsInGame())
dvander@2054
   933
	{
ds@994
   934
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@2054
   935
	}
dvander@2054
   936
	else if (pPlayer->IsFakeClient())
dvander@2054
   937
	{
ds@994
   938
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   939
	}
faluco@682
   940
faluco@682
   941
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   942
	if (pInfo == NULL)
dvander@2961
   943
	{
dvander@2961
   944
		return sp_ftoc(-1);
dvander@2961
   945
	}
faluco@682
   946
dvander@2054
   947
	if (params[2] == MAX_FLOWS)
dvander@2054
   948
	{
dvander@2054
   949
		value = pInfo->GetAvgChoke(FLOW_INCOMING) + pInfo->GetAvgChoke(FLOW_OUTGOING);
dvander@2054
   950
	}
dvander@2054
   951
	else
dvander@2054
   952
	{
dvander@2054
   953
		value = pInfo->GetAvgChoke(params[2]);
dvander@2054
   954
	}
dvander@2054
   955
dvander@2054
   956
	return sp_ftoc(value);
faluco@682
   957
}
faluco@682
   958
faluco@682
   959
static cell_t GetAvgData(IPluginContext *pContext, const cell_t *params)
faluco@682
   960
{
faluco@682
   961
	int client = params[1];
dvander@2054
   962
	float value;
faluco@682
   963
faluco@682
   964
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
   965
	if (!pPlayer)
faluco@682
   966
	{
ds@994
   967
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2054
   968
	}
dvander@2054
   969
	else if (!pPlayer->IsInGame())
dvander@2054
   970
	{
ds@994
   971
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@2054
   972
	}
dvander@2054
   973
	else if (pPlayer->IsFakeClient())
dvander@2054
   974
	{
ds@994
   975
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
   976
	}
faluco@682
   977
faluco@682
   978
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
dvander@2961
   979
	if (pInfo == NULL)
dvander@2961
   980
	{
dvander@2961
   981
		return 0;
dvander@2961
   982
	}
faluco@682
   983
dvander@2054
   984
	if (params[2] == MAX_FLOWS)
dvander@2054
   985
	{
dvander@2054
   986
		value = pInfo->GetAvgData(FLOW_INCOMING) + pInfo->GetAvgData(FLOW_OUTGOING);
dvander@2054
   987
	}
dvander@2054
   988
	else
dvander@2054
   989
	{
dvander@2054
   990
		value = pInfo->GetAvgData(params[2]);
dvander@2054
   991
	}
dvander@2054
   992
dvander@2054
   993
	return sp_ftoc(value);
faluco@682
   994
}
faluco@682
   995
faluco@682
   996
static cell_t GetAvgPackets(IPluginContext *pContext, const cell_t *params)
faluco@682
   997
{
faluco@682
   998
	int client = params[1];
dvander@2054
   999
	float value;
faluco@682
  1000
faluco@682
  1001
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@682
  1002
	if (!pPlayer)
faluco@682
  1003
	{
ds@994
  1004
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2054
  1005
	}
dvander@2054
  1006
	else if (!pPlayer->IsInGame())
dvander@2054
  1007
	{
ds@994
  1008
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@2054
  1009
	}
dvander@2054
  1010
	else if (pPlayer->IsFakeClient())
dvander@2054
  1011
	{
ds@994
  1012
		return pContext->ThrowNativeError("Client %d is a bot", client);
faluco@682
  1013
	}
faluco@682
  1014
faluco@682
  1015
	INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client);
faluco@682
  1016
dvander@2961
  1017
	if (pInfo == NULL)
dvander@2961
  1018
	{
dvander@2961
  1019
		return 0;
dvander@2961
  1020
	}
dvander@2961
  1021
dvander@2054
  1022
	if (params[2] == MAX_FLOWS)
dvander@2054
  1023
	{
dvander@2054
  1024
		value = pInfo->GetAvgPackets(FLOW_INCOMING) + pInfo->GetAvgPackets(FLOW_OUTGOING);
dvander@2054
  1025
	}
dvander@2054
  1026
	else
dvander@2054
  1027
	{
dvander@2054
  1028
		value = pInfo->GetAvgPackets(params[2]);
dvander@2054
  1029
	}
dvander@2054
  1030
dvander@2054
  1031
	return sp_ftoc(value);
faluco@682
  1032
}
faluco@682
  1033
faluco@682
  1034
static cell_t GetClientOfUserId(IPluginContext *pContext, const cell_t *params)
faluco@682
  1035
{
faluco@682
  1036
	return g_Players.GetClientOfUserId(params[1]);
faluco@682
  1037
}
faluco@682
  1038
dvander@1621
  1039
static cell_t _ShowActivity(IPluginContext *pContext,
dvander@1621
  1040
							const cell_t *params,
dvander@1621
  1041
							const char *tag,
dvander@1624
  1042
							cell_t fmt_param)
dvander@910
  1043
{
dvander@924
  1044
	char message[255];
dvander@924
  1045
	char buffer[255];
dvander@910
  1046
	int value = sm_show_activity.GetInt();
dvander@924
  1047
	unsigned int replyto = g_ChatTriggers.GetReplyTo();
dvander@910
  1048
	int client = params[1];
dvander@910
  1049
dvander@910
  1050
	const char *name = "Console";
dvander@910
  1051
	const char *sign = "ADMIN";
dvander@924
  1052
	bool display_in_chat = false;
dvander@910
  1053
	if (client != 0)
dvander@910
  1054
	{
dvander@910
  1055
		CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@910
  1056
		if (!pPlayer || !pPlayer->IsConnected())
dvander@910
  1057
		{
dvander@910
  1058
			return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@910
  1059
		}
dvander@910
  1060
		name = pPlayer->GetName();
dvander@910
  1061
		AdminId id = pPlayer->GetAdminId();
dvander@910
  1062
		if (id == INVALID_ADMIN_ID
dvander@910
  1063
			|| !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective))
dvander@910
  1064
		{
dvander@910
  1065
			sign = "PLAYER";
dvander@910
  1066
		}
dvander@924
  1067
dvander@924
  1068
		/* Display the message to the client? */
dvander@924
  1069
		if (replyto == SM_REPLY_CONSOLE)
dvander@924
  1070
		{
dvander@924
  1071
			g_SourceMod.SetGlobalTarget(client);
dvander@1104
  1072
			g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1621
  1073
dvander@2193
  1074
			if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1621
  1075
			{
dvander@1621
  1076
				return 0;
dvander@1621
  1077
			}
dvander@1621
  1078
dvander@1104
  1079
			UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer);
dvander@924
  1080
			engine->ClientPrintf(pPlayer->GetEdict(), message);
dvander@924
  1081
			display_in_chat = true;
dvander@924
  1082
		}
dvander@1621
  1083
	}
dvander@1621
  1084
	else
dvander@1621
  1085
	{
dvander@2042
  1086
		g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
dvander@1104
  1087
		g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1621
  1088
dvander@2193
  1089
		if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1621
  1090
		{
dvander@1621
  1091
			return 0;
dvander@1621
  1092
		}
dvander@1621
  1093
dvander@1104
  1094
		UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer);
dvander@924
  1095
		META_CONPRINT(message);
dvander@910
  1096
	}
dvander@910
  1097
dvander@924
  1098
	if (!value)
dvander@924
  1099
	{
dvander@924
  1100
		return 1;
dvander@924
  1101
	}
dvander@924
  1102
dvander@910
  1103
	int maxClients = g_Players.GetMaxClients();
dvander@910
  1104
	for (int i=1; i<=maxClients; i++)
dvander@910
  1105
	{
dvander@910
  1106
		CPlayer *pPlayer = g_Players.GetPlayerByIndex(i);
dvander@924
  1107
		if (!pPlayer->IsInGame() 
dvander@924
  1108
			|| pPlayer->IsFakeClient()
dvander@924
  1109
			|| (display_in_chat && i == client))
dvander@910
  1110
		{
dvander@910
  1111
			continue;
dvander@910
  1112
		}
dvander@910
  1113
		AdminId id = pPlayer->GetAdminId();
dvander@910
  1114
		g_SourceMod.SetGlobalTarget(i);
dvander@910
  1115
		if (id == INVALID_ADMIN_ID
dvander@910
  1116
			|| !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective))
dvander@910
  1117
		{
dvander@910
  1118
			/* Treat this as a normal user */
dvander@910
  1119
			if ((value & 1) || (value & 2))
dvander@910
  1120
			{
dvander@910
  1121
				const char *newsign = sign;
dvander@1621
  1122
				if ((value & 2) || (i == client))
dvander@910
  1123
				{
dvander@910
  1124
					newsign = name;
dvander@910
  1125
				}
dvander@1104
  1126
				g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1621
  1127
dvander@2193
  1128
				if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1621
  1129
				{
dvander@1621
  1130
					return 0;
dvander@1621
  1131
				}
dvander@1621
  1132
dvander@1104
  1133
				UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer);
dvander@910
  1134
				g_HL2.TextMsg(i, HUD_PRINTTALK, message);
dvander@910
  1135
			}
dvander@1621
  1136
		}
dvander@1621
  1137
		else
dvander@1621
  1138
		{
dvander@910
  1139
			/* Treat this as an admin user */
dvander@910
  1140
			bool is_root = g_Admins.GetAdminFlag(id, Admin_Root, Access_Effective);
dvander@910
  1141
			if ((value & 4) 
dvander@910
  1142
				|| (value & 8)
dvander@910
  1143
				|| ((value & 16) && is_root))
dvander@910
  1144
			{
dvander@910
  1145
				const char *newsign = sign;
dvander@1621
  1146
				if ((value & 8) || ((value & 16) && is_root) || (i == client))
dvander@910
  1147
				{
dvander@910
  1148
					newsign = name;
dvander@910
  1149
				}
dvander@1104
  1150
				g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1621
  1151
dvander@2193
  1152
				if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1621
  1153
				{
dvander@1621
  1154
					return 0;
dvander@1621
  1155
				}
dvander@1621
  1156
dvander@1104
  1157
				UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer);
dvander@910
  1158
				g_HL2.TextMsg(i, HUD_PRINTTALK, message);
dvander@910
  1159
			}
dvander@910
  1160
		}
dvander@910
  1161
	}
dvander@910
  1162
dvander@910
  1163
	return 1;
dvander@910
  1164
}
dvander@910
  1165
dvander@1624
  1166
static cell_t _ShowActivity2(IPluginContext *pContext,
dvander@1624
  1167
							 const cell_t *params,
dvander@1624
  1168
							 const char *tag,
dvander@1624
  1169
							 cell_t fmt_param)
dvander@1624
  1170
{
dvander@1624
  1171
	char message[255];
dvander@1624
  1172
	char buffer[255];
dvander@1624
  1173
	int value = sm_show_activity.GetInt();
dvander@1624
  1174
	unsigned int replyto = g_ChatTriggers.GetReplyTo();
dvander@1624
  1175
	int client = params[1];
dvander@1624
  1176
dvander@1624
  1177
	const char *name = "Console";
dvander@1624
  1178
	const char *sign = "ADMIN";
dvander@1624
  1179
	if (client != 0)
dvander@1624
  1180
	{
dvander@1624
  1181
		CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@1624
  1182
		if (!pPlayer || !pPlayer->IsConnected())
dvander@1624
  1183
		{
dvander@1624
  1184
			return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@1624
  1185
		}
dvander@1624
  1186
		name = pPlayer->GetName();
dvander@1624
  1187
		AdminId id = pPlayer->GetAdminId();
dvander@1624
  1188
		if (id == INVALID_ADMIN_ID
dvander@1624
  1189
			|| !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective))
dvander@1624
  1190
		{
dvander@1624
  1191
			sign = "PLAYER";
dvander@1624
  1192
		}
dvander@1624
  1193
dvander@1624
  1194
		g_SourceMod.SetGlobalTarget(client);
dvander@1624
  1195
		g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1624
  1196
dvander@2193
  1197
		if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1624
  1198
		{
dvander@1624
  1199
			return 0;
dvander@1624
  1200
		}
dvander@1624
  1201
dvander@1624
  1202
		/* We don't display directly to the console because the chat text 
dvander@1624
  1203
		 * simply gets added to the console, so we don't want it to print 
dvander@1624
  1204
		 * twice.
dvander@1624
  1205
		 */
dvander@1624
  1206
		if (replyto == SM_REPLY_CONSOLE)
dvander@1624
  1207
		{
dvander@1624
  1208
#if 0
dvander@1624
  1209
			UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer);
dvander@1624
  1210
			engine->ClientPrintf(pPlayer->GetEdict(), message);
dvander@1624
  1211
#endif
dvander@1624
  1212
			UTIL_Format(message, sizeof(message), "%s%s", tag, buffer);
dvander@1624
  1213
			g_HL2.TextMsg(client, HUD_PRINTTALK, message);
dvander@1624
  1214
		}
dvander@1624
  1215
		else
dvander@1624
  1216
		{
dvander@1624
  1217
			UTIL_Format(message, sizeof(message), "%s%s", tag, buffer);
dvander@1624
  1218
			g_HL2.TextMsg(client, HUD_PRINTTALK, message);
dvander@1624
  1219
		}
dvander@1624
  1220
	}
dvander@1624
  1221
	else
dvander@1624
  1222
	{
dvander@2042
  1223
		g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
dvander@1624
  1224
		g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1624
  1225
dvander@2193
  1226
		if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1624
  1227
		{
dvander@1624
  1228
			return 0;
dvander@1624
  1229
		}
dvander@1624
  1230
dvander@1624
  1231
		UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer);
dvander@1624
  1232
		META_CONPRINT(message);
dvander@1624
  1233
	}
dvander@1624
  1234
dvander@1624
  1235
	if (!value)
dvander@1624
  1236
	{
dvander@1624
  1237
		return 1;
dvander@1624
  1238
	}
dvander@1624
  1239
dvander@1624
  1240
	int maxClients = g_Players.GetMaxClients();
dvander@1624
  1241
	for (int i=1; i<=maxClients; i++)
dvander@1624
  1242
	{
dvander@1624
  1243
		CPlayer *pPlayer = g_Players.GetPlayerByIndex(i);
dvander@1624
  1244
		if (!pPlayer->IsInGame() 
dvander@1624
  1245
			|| pPlayer->IsFakeClient()
dvander@1624
  1246
			|| i == client)
dvander@1624
  1247
		{
dvander@1624
  1248
			continue;
dvander@1624
  1249
		}
dvander@1624
  1250
		AdminId id = pPlayer->GetAdminId();
dvander@1624
  1251
		g_SourceMod.SetGlobalTarget(i);
dvander@1624
  1252
		if (id == INVALID_ADMIN_ID
dvander@1624
  1253
			|| !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective))
dvander@1624
  1254
		{
dvander@1624
  1255
			/* Treat this as a normal user */
dvander@1624
  1256
			if ((value & 1) || (value & 2))
dvander@1624
  1257
			{
dvander@1624
  1258
				const char *newsign = sign;
dvander@1624
  1259
				if ((value & 2))
dvander@1624
  1260
				{
dvander@1624
  1261
					newsign = name;
dvander@1624
  1262
				}
dvander@1624
  1263
				g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1624
  1264
dvander@2193
  1265
				if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1624
  1266
				{
dvander@1624
  1267
					return 0;
dvander@1624
  1268
				}
dvander@1624
  1269
dvander@1624
  1270
				UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer);
dvander@1624
  1271
				g_HL2.TextMsg(i, HUD_PRINTTALK, message);
dvander@1624
  1272
			}
dvander@1624
  1273
		}
dvander@1624
  1274
		else
dvander@1624
  1275
		{
dvander@1624
  1276
			/* Treat this as an admin user */
dvander@1624
  1277
			bool is_root = g_Admins.GetAdminFlag(id, Admin_Root, Access_Effective);
dvander@1624
  1278
			if ((value & 4) 
dvander@1624
  1279
				|| (value & 8)
dvander@1624
  1280
				|| ((value & 16) && is_root))
dvander@1624
  1281
			{
dvander@1624
  1282
				const char *newsign = sign;
dvander@1624
  1283
				if ((value & 8) || ((value & 16) && is_root))
dvander@1624
  1284
				{
dvander@1624
  1285
					newsign = name;
dvander@1624
  1286
				}
dvander@1624
  1287
				g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param);
dvander@1624
  1288
dvander@2193
  1289
				if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1624
  1290
				{
dvander@1624
  1291
					return 0;
dvander@1624
  1292
				}
dvander@1624
  1293
dvander@1624
  1294
				UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer);
dvander@1624
  1295
				g_HL2.TextMsg(i, HUD_PRINTTALK, message);
dvander@1624
  1296
			}
dvander@1624
  1297
		}
dvander@1624
  1298
	}
dvander@1624
  1299
dvander@1624
  1300
	return 1;
dvander@1624
  1301
}
dvander@1624
  1302
dvander@1104
  1303
static cell_t ShowActivity(IPluginContext *pContext, const cell_t *params)
dvander@1104
  1304
{
dvander@1624
  1305
	return _ShowActivity(pContext, params, "[SM] ", 2);
dvander@1104
  1306
}
dvander@1104
  1307
dvander@1104
  1308
static cell_t ShowActivityEx(IPluginContext *pContext, const cell_t *params)
dvander@1104
  1309
{
dvander@1104
  1310
	char *str;
dvander@1104
  1311
	pContext->LocalToString(params[2], &str);
dvander@1104
  1312
dvander@1624
  1313
	return _ShowActivity(pContext, params, str, 3);
dvander@1621
  1314
}
dvander@1621
  1315
dvander@1621
  1316
static cell_t ShowActivity2(IPluginContext *pContext, const cell_t *params)
dvander@1621
  1317
{
dvander@1621
  1318
	char *str;
dvander@1621
  1319
	pContext->LocalToString(params[2], &str);
dvander@1621
  1320
dvander@1624
  1321
	return _ShowActivity2(pContext, params, str, 3);
dvander@1104
  1322
}
dvander@1104
  1323
ds@992
  1324
static cell_t KickClient(IPluginContext *pContext, const cell_t *params)
ds@992
  1325
{
ds@992
  1326
	int client = params[1];
ds@992
  1327
ds@992
  1328
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
ds@992
  1329
	if (!pPlayer)
ds@992
  1330
	{
ds@994
  1331
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2162
  1332
	}
dvander@2162
  1333
	else if (!pPlayer->IsConnected())
dvander@2162
  1334
	{
ds@992
  1335
		return pContext->ThrowNativeError("Client %d is not connected", client);
ds@992
  1336
	}
ds@992
  1337
dvander@2162
  1338
	/* Ignore duplicate kicks */
dvander@2162
  1339
	if (pPlayer->IsInKickQueue())
dvander@2162
  1340
	{
dvander@2162
  1341
		return 1;
dvander@2162
  1342
	}
dvander@2162
  1343
dvander@1011
  1344
	g_SourceMod.SetGlobalTarget(client);
dvander@1011
  1345
ds@992
  1346
	char buffer[256];
ds@992
  1347
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
ds@992
  1348
dvander@2193
  1349
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@2162
  1350
	{
dvander@2162
  1351
		return 0;
dvander@2162
  1352
	}
dvander@2162
  1353
skamonkey@3400
  1354
	if (pPlayer->IsFakeClient())
skamonkey@3400
  1355
	{
skamonkey@3400
  1356
		// Kick uses the kickid command for bots. It is already delayed
skamonkey@3400
  1357
		// until the next frame unless someone flushes command buffer
skamonkey@3400
  1358
		pPlayer->Kick(buffer);
skamonkey@3400
  1359
		return 1;
skamonkey@3400
  1360
	}
skamonkey@3400
  1361
skamonkey@3400
  1362
	pPlayer->MarkAsBeingKicked();
dvander@2162
  1363
	g_HL2.AddDelayedKick(client, pPlayer->GetUserId(), buffer);
dvander@2162
  1364
dvander@2162
  1365
	return 1;
dvander@2162
  1366
}
dvander@2162
  1367
dvander@2162
  1368
static cell_t KickClientEx(IPluginContext *pContext, const cell_t *params)
dvander@2162
  1369
{
dvander@2162
  1370
	int client = params[1];
dvander@2162
  1371
dvander@2162
  1372
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@2162
  1373
	if (!pPlayer)
dvander@2162
  1374
	{
dvander@2162
  1375
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@2162
  1376
	}
dvander@2162
  1377
	else if (!pPlayer->IsConnected())
dvander@2162
  1378
	{
dvander@2162
  1379
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@2162
  1380
	}
dvander@2162
  1381
ds@1952
  1382
	g_SourceMod.SetGlobalTarget(client);
ds@1952
  1383
ds@1952
  1384
	char buffer[256];
ds@1952
  1385
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
ds@1952
  1386
dvander@2193
  1387
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1273
  1388
	{
dvander@1273
  1389
		return 0;
dvander@1273
  1390
	}
dvander@1273
  1391
dvander@1576
  1392
	pPlayer->Kick(buffer);
ds@992
  1393
ds@992
  1394
	return 1;
ds@992
  1395
}
ds@992
  1396
dvander@1033
  1397
static cell_t ChangeClientTeam(IPluginContext *pContext, const cell_t *params)
dvander@1033
  1398
{
dvander@1033
  1399
	int client = params[1];
dvander@1033
  1400
dvander@1033
  1401
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@1033
  1402
	if (!pPlayer)
dvander@1033
  1403
	{
dvander@1033
  1404
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@1621
  1405
	}
dvander@1621
  1406
	else if (!pPlayer->IsInGame())
dvander@1621
  1407
	{
dvander@1033
  1408
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@1033
  1409
	}
dvander@1033
  1410
dvander@1033
  1411
	IPlayerInfo *pInfo = pPlayer->GetPlayerInfo();
dvander@1033
  1412
	if (!pInfo)
dvander@1033
  1413
	{
dvander@1033
  1414
		return pContext->ThrowNativeError("IPlayerInfo not supported by game");
dvander@1033
  1415
	}
dvander@1033
  1416
dvander@1033
  1417
	pInfo->ChangeTeam(params[2]);
dvander@1033
  1418
dvander@1033
  1419
	return 1;
dvander@1033
  1420
}
dvander@1033
  1421
dvander@1273
  1422
static cell_t RunAdminCacheChecks(IPluginContext *pContext, const cell_t *params)
dvander@1273
  1423
{
dvander@1273
  1424
	int client = params[1];
dvander@1273
  1425
dvander@1273
  1426
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@1273
  1427
	if (!pPlayer)
dvander@1273
  1428
	{
dvander@1273
  1429
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@1621
  1430
	}
dvander@1621
  1431
	else if (!pPlayer->IsInGame())
dvander@1621
  1432
	{
dvander@1273
  1433
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@1621
  1434
	}
dvander@1621
  1435
	else if (!pPlayer->IsAuthorized())
dvander@1621
  1436
	{
dvander@1273
  1437
		return pContext->ThrowNativeError("Client %d is not authorized", client);
dvander@1273
  1438
	}
dvander@1273
  1439
dvander@1273
  1440
	AdminId id = pPlayer->GetAdminId();
dvander@1273
  1441
	pPlayer->DoBasicAdminChecks();
dvander@1273
  1442
dvander@1273
  1443
	return (id != pPlayer->GetAdminId()) ? 1 : 0;
dvander@1273
  1444
}
dvander@1273
  1445
dvander@1273
  1446
static cell_t NotifyPostAdminCheck(IPluginContext *pContext, const cell_t *params)
dvander@1273
  1447
{
dvander@1273
  1448
	int client = params[1];
dvander@1273
  1449
dvander@1273
  1450
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@1273
  1451
	if (!pPlayer)
dvander@1273
  1452
	{
dvander@1273
  1453
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@1621
  1454
	}
dvander@1621
  1455
	else if (!pPlayer->IsInGame()) {
dvander@1273
  1456
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@1621
  1457
	}
dvander@1621
  1458
	else if (!pPlayer->IsAuthorized())
dvander@1621
  1459
	{
dvander@1273
  1460
		return pContext->ThrowNativeError("Client %d is not authorized", client);
dvander@1273
  1461
	}
dvander@1273
  1462
dvander@1273
  1463
	pPlayer->NotifyPostAdminChecks();
dvander@1273
  1464
dvander@1273
  1465
	return 1;
dvander@1273
  1466
}
dvander@1273
  1467
dvander@1509
  1468
static cell_t IsClientInKickQueue(IPluginContext *pContext, const cell_t *params)
dvander@1509
  1469
{
dvander@1509
  1470
	int client = params[1];
dvander@1509
  1471
dvander@1509
  1472
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@1509
  1473
dvander@1509
  1474
	if (!pPlayer)
dvander@1509
  1475
	{
dvander@1509
  1476
		return pContext->ThrowNativeError("Client index %d is invalid", client);
dvander@1509
  1477
	}
dvander@1509
  1478
	else if (!pPlayer->IsConnected())
dvander@1509
  1479
	{
dvander@1509
  1480
		return pContext->ThrowNativeError("Client %d is not in game", client);
dvander@1509
  1481
	}
dvander@1509
  1482
dvander@1509
  1483
	return pPlayer->IsInKickQueue() ? 1 : 0;
dvander@1509
  1484
}
dvander@1509
  1485
dvander@1621
  1486
static cell_t ProcessTargetString(IPluginContext *pContext, const cell_t *params)
dvander@1621
  1487
{
dvander@1621
  1488
	cmd_target_info_t info;
dvander@1621
  1489
dvander@1621
  1490
	pContext->LocalToString(params[1], (char **)&info.pattern);
dvander@1621
  1491
	info.admin = params[2];
dvander@1621
  1492
	pContext->LocalToPhysAddr(params[3], &info.targets);
dvander@1621
  1493
	info.max_targets = params[4];
dvander@1621
  1494
	info.flags = params[5];
dvander@1621
  1495
	pContext->LocalToString(params[6], &info.target_name);
dvander@1621
  1496
	info.target_name_maxlength = params[7];
dvander@1621
  1497
dvander@1621
  1498
	cell_t *tn_is_ml;
dvander@1621
  1499
	pContext->LocalToPhysAddr(params[8], &tn_is_ml);
dvander@1621
  1500
dvander@1621
  1501
	g_Players.ProcessCommandTarget(&info);
dvander@1621
  1502
dvander@1621
  1503
	if (info.target_name_style == COMMAND_TARGETNAME_ML)
dvander@1621
  1504
	{
dvander@1621
  1505
		*tn_is_ml = 1;
dvander@1621
  1506
	}
dvander@1621
  1507
	else
dvander@1621
  1508
	{
dvander@1621
  1509
		*tn_is_ml = 0;
dvander@1621
  1510
	}
dvander@1621
  1511
dvander@1621
  1512
	if (info.num_targets == 0)
dvander@1621
  1513
	{
dvander@1621
  1514
		return info.reason;
dvander@1621
  1515
	}
dvander@1621
  1516
	else
dvander@1621
  1517
	{
dvander@1621
  1518
		return info.num_targets;
dvander@1621
  1519
	}
dvander@1621
  1520
}
dvander@1621
  1521
dvander@2318
  1522
static cell_t FormatActivitySource(IPluginContext *pContext, const cell_t *params)
dvander@2318
  1523
{
dvander@2318
  1524
	int value;
dvander@2318
  1525
	int client;
dvander@2318
  1526
	int target;
dvander@2318
  1527
	CPlayer *pTarget;
dvander@2318
  1528
	AdminId aidTarget;
dvander@2318
  1529
	const char *identity[2] = {"Console", "ADMIN"};
dvander@2318
  1530
dvander@2318
  1531
	client = params[1];
dvander@2318
  1532
	target = params[2];
dvander@2318
  1533
dvander@2318
  1534
	if ((pTarget = g_Players.GetPlayerByIndex(target)) == NULL)
dvander@2318
  1535
	{
dvander@2318
  1536
		return pContext->ThrowNativeError("Invalid client index %d", target);
dvander@2318
  1537
	}
dvander@2318
  1538
	if (!pTarget->IsConnected())
dvander@2318
  1539
	{
dvander@2318
  1540
		return pContext->ThrowNativeError("Client %d not connected", target);
dvander@2318
  1541
	}
dvander@2318
  1542
dvander@2318
  1543
	value = sm_show_activity.GetInt();
dvander@2318
  1544
dvander@2318
  1545
	if (client != 0)
dvander@2318
  1546
	{
dvander@2318
  1547
		CPlayer *pPlayer;
dvander@2318
  1548
dvander@2318
  1549
		if ((pPlayer = g_Players.GetPlayerByIndex(client)) == NULL)
dvander@2318
  1550
		{
dvander@2318
  1551
			return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@2318
  1552
		}
dvander@2318
  1553
		if (!pPlayer->IsConnected())
dvander@2318
  1554
		{
dvander@2318
  1555
			return pContext->ThrowNativeError("Client %d not connected", client);
dvander@2318
  1556
		}
dvander@2318
  1557
dvander@2318
  1558
		identity[0] = pPlayer->GetName();
dvander@2318
  1559
dvander@2318
  1560
		AdminId id = pPlayer->GetAdminId();
dvander@2318
  1561
		if (id == INVALID_ADMIN_ID
dvander@2318
  1562
			|| !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective))
dvander@2318
  1563
		{
dvander@2318
  1564
			identity[1] = "PLAYER";
dvander@2318
  1565
		}
dvander@2318
  1566
	}
dvander@2318
  1567
dvander@2318
  1568
	int mode = 1;
dvander@2318
  1569
	bool bShowActivity = false;
dvander@2318
  1570
dvander@2318
  1571
	if ((aidTarget = pTarget->GetAdminId()) == INVALID_ADMIN_ID
dvander@2318
  1572
		|| !g_Admins.GetAdminFlag(aidTarget, Admin_Generic, Access_Effective))
dvander@2318
  1573
	{
dvander@2318
  1574
		/* Treat this as a normal user */
dvander@2318
  1575
		if ((value & 1) || (value & 2))
dvander@2318
  1576
		{
dvander@2318
  1577
			if ((value & 2) || (target == client))
dvander@2318
  1578
			{
dvander@2318
  1579
				mode = 0;
dvander@2318
  1580
			}
dvander@2318
  1581
			bShowActivity = true;
dvander@2318
  1582
		}
dvander@2318
  1583
	}
dvander@2318
  1584
	else
dvander@2318
  1585
	{
dvander@2318
  1586
		/* Treat this as an admin user */
dvander@2318
  1587
		bool is_root = g_Admins.GetAdminFlag(aidTarget, Admin_Root, Access_Effective);
dvander@2318
  1588
		if ((value & 4) 
dvander@2318
  1589
			|| (value & 8)
dvander@2318
  1590
			|| ((value & 16) && is_root))
dvander@2318
  1591
		{
dvander@2318
  1592
			if ((value & 8) || ((value & 16) && is_root) || (target == client))
dvander@2318
  1593
			{
dvander@2318
  1594
				mode = 0;
dvander@2318
  1595
			}
dvander@2318
  1596
			bShowActivity = true;
dvander@2318
  1597
		}
dvander@2318
  1598
	}
dvander@2318
  1599
dvander@2318
  1600
	/* Otherwise, send it back to the script. */
dvander@2318
  1601
	pContext->StringToLocalUTF8(params[3], params[4], identity[mode], NULL);
dvander@2318
  1602
dvander@2318
  1603
	return bShowActivity ? 1 : 0;
dvander@2318
  1604
}
dvander@2318
  1605
pred@2591
  1606
static cell_t sm_GetClientSerial(IPluginContext *pContext, const cell_t *params)
pred@2591
  1607
{
pred@2591
  1608
	int client = params[1];
pred@2591
  1609
pred@2591
  1610
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
pred@2591
  1611
	if (!pPlayer)
pred@2591
  1612
	{
pred@2591
  1613
		return pContext->ThrowNativeError("Client index %d is invalid", client);
pred@2591
  1614
	}
pred@2591
  1615
pred@2591
  1616
	return pPlayer->GetSerial();
pred@2591
  1617
}
pred@2591
  1618
pred@2591
  1619
static cell_t sm_GetClientFromSerial(IPluginContext *pContext, const cell_t *params)
pred@2591
  1620
{
pred@2591
  1621
	return g_Players.GetClientFromSerial(params[1]);
pred@2591
  1622
}
pred@2591
  1623
faluco@260
  1624
REGISTER_NATIVES(playernatives)
faluco@260
  1625
{
dvander@644
  1626
	{"AddUserFlags",			AddUserFlags},
dvander@644
  1627
	{"CanUserTarget",			CanUserTarget},
dvander@1033
  1628
	{"ChangeClientTeam",		ChangeClientTeam},
dvander@644
  1629
	{"GetClientAuthString",		sm_GetClientAuthStr},
faluco@260
  1630
	{"GetClientCount",			sm_GetClientCount},
dvander@644
  1631
	{"GetClientInfo",			sm_GetClientInfo},
faluco@260
  1632
	{"GetClientIP",				sm_GetClientIP},
dvander@644
  1633
	{"GetClientName",			sm_GetClientName},
dvander@644
  1634
	{"GetClientTeam",			GetClientTeam},
dvander@644
  1635
	{"GetClientUserId",			GetClientUserId},
dvander@644
  1636
	{"GetMaxClients",			sm_GetMaxClients},
dvander@644
  1637
	{"GetUserAdmin",			GetUserAdmin},
dvander@644
  1638
	{"GetUserFlagBits",			GetUserFlagBits},
ds@784
  1639
	{"IsClientAuthorized",		sm_IsClientAuthorized},
ds@784
  1640
	{"IsClientConnected",		sm_IsClientConnected},
ds@784
  1641
	{"IsFakeClient",			sm_IsClientFakeClient},
skamonkey@3418
  1642
	{"IsClientSourceTV",		sm_IsClientSourceTV},
skamonkey@3418
  1643
	{"IsClientReplay",			sm_IsClientReplay},
ds@784
  1644
	{"IsClientInGame",			sm_IsClientInGame},
ds@1001
  1645
	{"IsClientObserver",		IsClientObserver},
dvander@458
  1646
	{"RemoveUserFlags",			RemoveUserFlags},
dvander@644
  1647
	{"SetUserAdmin",			SetUserAdmin},
dvander@458
  1648
	{"SetUserFlagBits",			SetUserFlagBits},
faluco@658
  1649
	{"GetClientDeaths",			GetDeathCount},
faluco@658
  1650
	{"GetClientFrags",			GetFragCount},
faluco@658
  1651
	{"GetClientArmor",			GetArmorValue},
faluco@658
  1652
	{"GetClientAbsOrigin",		GetAbsOrigin},
faluco@658
  1653
	{"GetClientAbsAngles",		GetAbsAngles},
faluco@658
  1654
	{"GetClientMins",			GetPlayerMins},
faluco@658
  1655
	{"GetClientMaxs",			GetPlayerMaxs},
faluco@658
  1656
	{"GetClientWeapon",			GetWeaponName},
faluco@658
  1657
	{"GetClientModel",			GetModelName},
faluco@658
  1658
	{"GetClientHealth",			GetHealth},
dvander@691
  1659
	{"GetClientTime",			GetTimeConnected},
dvander@691
  1660
	{"GetClientDataRate",		GetDataRate},
dvander@2375
  1661
	{"IsClientTimingOut",		IsTimingOut},
dvander@691
  1662
	{"GetClientLatency",		GetLatency},
dvander@691
  1663
	{"GetClientAvgLatency",		GetAvgLatency},
dvander@691
  1664
	{"GetClientAvgLoss",		GetAvgLoss},
dvander@691
  1665
	{"GetClientAvgChoke",		GetAvgChoke},
dvander@691
  1666
	{"GetClientAvgData",		GetAvgData},
dvander@691
  1667
	{"GetClientAvgPackets",		GetAvgPackets},
faluco@682
  1668
	{"GetClientOfUserId",		GetClientOfUserId},
dvander@910
  1669
	{"ShowActivity",			ShowActivity},
dvander@1110
  1670
	{"ShowActivityEx",			ShowActivityEx},
dvander@1621
  1671
	{"ShowActivity2",			ShowActivity2},
ds@992
  1672
	{"KickClient",				KickClient},
dvander@2162
  1673
	{"KickClientEx",			KickClientEx},
dvander@1273
  1674
	{"RunAdminCacheChecks",		RunAdminCacheChecks},
dvander@1273
  1675
	{"NotifyPostAdminCheck",	NotifyPostAdminCheck},
dvander@1509
  1676
	{"IsClientInKickQueue",		IsClientInKickQueue},
dvander@1621
  1677
	{"ProcessTargetString",		ProcessTargetString},
dvander@2318
  1678
	{"FormatActivitySource",	FormatActivitySource},
pred@2591
  1679
	{"GetClientSerial",			sm_GetClientSerial},
pred@2591
  1680
	{"GetClientFromSerial",		sm_GetClientFromSerial},
faluco@260
  1681
	{NULL,						NULL}
dvander@351
  1682
};
dvander@1423
  1683