core/smn_player.cpp
author David Anderson <dvander@alliedmods.net>
Tue Feb 27 03:32:14 2007 +0000 (2007-02-27)
changeset 540 27a380082863
parent 518 52810a1a9620
child 591 86e97f3eda1f
permissions -rw-r--r--
added functions for target immunity testing
dvander@370
     1
/**
dvander@370
     2
 * ===============================================================
dvander@370
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     4
 * ===============================================================
dvander@370
     5
 *
dvander@370
     6
 * This file is not open source and may not be copied without explicit
dvander@370
     7
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     8
 * in whole or significant part.
dvander@370
     9
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    10
 *
dvander@370
    11
 * Version: $Id$
dvander@370
    12
 */
dvander@370
    13
faluco@242
    14
#include "CPlayerManager.h"
dvander@458
    15
#include "AdminCache.h"
faluco@280
    16
#include "sm_stringutil.h"
faluco@242
    17
faluco@260
    18
static cell_t sm_GetClientCount(IPluginContext *pCtx, const cell_t *params)
faluco@242
    19
{
faluco@242
    20
	if (params[1])
faluco@242
    21
	{
dvander@448
    22
		return g_Players.NumPlayers();
faluco@242
    23
	}
faluco@242
    24
dvander@448
    25
	int maxplayers = g_Players.MaxClients();
faluco@242
    26
	int count = 0;
faluco@242
    27
	for (int i=1; i<=maxplayers; ++i)
faluco@242
    28
	{
dvander@448
    29
		CPlayer *pPlayer = g_Players.GetPlayerByIndex(i);
dvander@435
    30
		if ((pPlayer->IsConnected()) && !(pPlayer->IsInGame()))
faluco@242
    31
		{
faluco@242
    32
			count++;
faluco@242
    33
		}
faluco@242
    34
	}
faluco@242
    35
dvander@448
    36
	return (g_Players.NumPlayers() + count);
faluco@242
    37
}
faluco@242
    38
faluco@260
    39
static cell_t sm_GetMaxClients(IPluginContext *pCtx, const cell_t *params)
faluco@242
    40
{
dvander@448
    41
	return g_Players.MaxClients();
faluco@242
    42
}
faluco@242
    43
faluco@260
    44
static cell_t sm_GetClientName(IPluginContext *pCtx, const cell_t *params)
faluco@242
    45
{
faluco@242
    46
	int index = params[1];
dvander@448
    47
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
    48
	{
ds@470
    49
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@242
    50
	}
faluco@242
    51
dvander@448
    52
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
    53
	if (!pPlayer->IsConnected())
faluco@260
    54
	{
ds@470
    55
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@260
    56
	}
faluco@260
    57
dvander@435
    58
	pCtx->StringToLocalUTF8(params[2], static_cast<size_t>(params[3]), pPlayer->GetName(), NULL);
faluco@242
    59
	return 1;
faluco@242
    60
}
faluco@242
    61
faluco@260
    62
static cell_t sm_GetClientIP(IPluginContext *pCtx, const cell_t *params)
faluco@242
    63
{
faluco@242
    64
	int index = params[1];
dvander@448
    65
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
    66
	{
ds@470
    67
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@242
    68
	}
faluco@242
    69
dvander@448
    70
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
    71
	if (!pPlayer->IsConnected())
faluco@260
    72
	{
ds@470
    73
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@260
    74
	}
faluco@260
    75
faluco@280
    76
	char buf[64], *ptr;
dvander@435
    77
	strcpy(buf, pPlayer->GetIPAddress());
faluco@280
    78
faluco@280
    79
	if (params[4] && (ptr = strchr(buf, ':')))
faluco@280
    80
	{
faluco@280
    81
		*ptr = '\0';
faluco@280
    82
	}
faluco@280
    83
faluco@280
    84
	pCtx->StringToLocal(params[2], static_cast<size_t>(params[3]), buf);
faluco@242
    85
	return 1;
faluco@242
    86
}
faluco@242
    87
faluco@260
    88
static cell_t sm_GetClientAuthStr(IPluginContext *pCtx, const cell_t *params)
faluco@242
    89
{
faluco@242
    90
	int index = params[1];
dvander@448
    91
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
    92
	{
ds@470
    93
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@242
    94
	}
faluco@242
    95
dvander@448
    96
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
    97
	if (!pPlayer->IsConnected())
faluco@260
    98
	{
ds@470
    99
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@260
   100
	}
faluco@260
   101
dvander@449
   102
	if (!pPlayer->IsAuthorized())
dvander@449
   103
	{
dvander@449
   104
		return 0;
dvander@449
   105
	}
dvander@449
   106
dvander@435
   107
	pCtx->StringToLocal(params[2], static_cast<size_t>(params[3]), pPlayer->GetAuthString());
dvander@449
   108
faluco@242
   109
	return 1;
faluco@242
   110
}
faluco@242
   111
faluco@260
   112
static cell_t sm_IsPlayerConnected(IPluginContext *pCtx, const cell_t *params)
faluco@242
   113
{
faluco@242
   114
	int index = params[1];
dvander@448
   115
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   116
	{
ds@470
   117
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@242
   118
	}
faluco@242
   119
dvander@448
   120
	return (g_Players.GetPlayerByIndex(index)->IsConnected()) ? 1 : 0;
faluco@242
   121
}
faluco@242
   122
faluco@260
   123
static cell_t sm_IsPlayerIngame(IPluginContext *pCtx, const cell_t *params)
faluco@242
   124
{
faluco@242
   125
	int index = params[1];
dvander@448
   126
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   127
	{
ds@470
   128
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@242
   129
	}
faluco@242
   130
dvander@448
   131
	return (g_Players.GetPlayerByIndex(index)->IsInGame()) ? 1 : 0;
faluco@242
   132
}
faluco@242
   133
faluco@260
   134
static cell_t sm_IsPlayerAuthorized(IPluginContext *pCtx, const cell_t *params)
faluco@242
   135
{
faluco@242
   136
	int index = params[1];
dvander@448
   137
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   138
	{
ds@470
   139
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@242
   140
	}
faluco@242
   141
dvander@448
   142
	return (g_Players.GetPlayerByIndex(index)->IsAuthorized()) ? 1 : 0;
faluco@242
   143
}
faluco@242
   144
faluco@260
   145
static cell_t sm_IsPlayerFakeClient(IPluginContext *pCtx, const cell_t *params)
faluco@242
   146
{
faluco@242
   147
	int index = params[1];
dvander@448
   148
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@242
   149
	{
ds@470
   150
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@260
   151
	}
faluco@260
   152
dvander@448
   153
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
   154
	if (!pPlayer->IsConnected())
faluco@260
   155
	{
ds@470
   156
		return pCtx->ThrowNativeError("Client %d is not connected", index);
faluco@242
   157
	}
faluco@242
   158
dvander@435
   159
	return (pPlayer->IsFakeClient()) ? 1 : 0;
faluco@260
   160
}
faluco@260
   161
dvander@456
   162
static cell_t sm_GetClientInfo(IPluginContext *pContext, const cell_t *params)
dvander@456
   163
{
dvander@456
   164
	int client = params[1];
dvander@456
   165
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@456
   166
	if (!pPlayer)
dvander@456
   167
	{
ds@470
   168
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@456
   169
	}
dvander@456
   170
	if (!pPlayer->IsConnected())
dvander@456
   171
	{
ds@470
   172
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@456
   173
	}
dvander@456
   174
dvander@456
   175
	char *key;
dvander@456
   176
	pContext->LocalToString(params[2], &key);
dvander@456
   177
dvander@456
   178
	const char *val = engine->GetClientConVarValue(client, key);
dvander@456
   179
	if (!val)
dvander@456
   180
	{
dvander@456
   181
		return false;
dvander@456
   182
	}
dvander@456
   183
dvander@456
   184
	pContext->StringToLocalUTF8(params[3], params[4], val, NULL);
dvander@456
   185
	return 1;
dvander@456
   186
}
dvander@456
   187
dvander@458
   188
static cell_t SetUserAdmin(IPluginContext *pContext, const cell_t *params)
dvander@458
   189
{
dvander@458
   190
	int client = params[1];
dvander@458
   191
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   192
	if (!pPlayer)
dvander@458
   193
	{
ds@470
   194
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   195
	}
dvander@458
   196
	if (!pPlayer->IsConnected())
dvander@458
   197
	{
ds@470
   198
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   199
	}
dvander@458
   200
	if (!g_Admins.IsValidAdmin(params[2]))
dvander@458
   201
	{
ds@470
   202
		return pContext->ThrowNativeError("AdminId %x is not valid", params[2]);
dvander@458
   203
	}
dvander@458
   204
dvander@458
   205
	pPlayer->SetAdminId(params[2], params[3] ? true : false);
dvander@458
   206
dvander@458
   207
	return 1;
dvander@458
   208
}
dvander@458
   209
dvander@458
   210
static cell_t GetUserAdmin(IPluginContext *pContext, const cell_t *params)
dvander@458
   211
{
dvander@458
   212
	int client = params[1];
dvander@458
   213
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   214
	if (!pPlayer)
dvander@458
   215
	{
ds@470
   216
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   217
	}
dvander@458
   218
	if (!pPlayer->IsConnected())
dvander@458
   219
	{
ds@470
   220
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   221
	}
dvander@458
   222
dvander@458
   223
	return pPlayer->GetAdminId();
dvander@458
   224
}
dvander@458
   225
dvander@458
   226
static cell_t AddUserFlags(IPluginContext *pContext, const cell_t *params)
dvander@458
   227
{
dvander@458
   228
	int client = params[1];
dvander@458
   229
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   230
	if (!pPlayer)
dvander@458
   231
	{
ds@470
   232
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   233
	}
dvander@458
   234
	if (!pPlayer->IsConnected())
dvander@458
   235
	{
ds@470
   236
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   237
	}
dvander@458
   238
dvander@458
   239
	AdminId id;
dvander@458
   240
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   241
	{
dvander@458
   242
		id = g_Admins.CreateAdmin(NULL);
dvander@458
   243
		pPlayer->SetAdminId(id, true);
dvander@458
   244
	}
dvander@458
   245
dvander@458
   246
	cell_t *addr;
dvander@458
   247
	for (int i=2; i<=params[0]; i++)
dvander@458
   248
	{
dvander@458
   249
		pContext->LocalToPhysAddr(params[i], &addr);
dvander@458
   250
		g_Admins.SetAdminFlag(id, (AdminFlag)*addr, true);
dvander@458
   251
	}
dvander@458
   252
dvander@458
   253
	return 1;
dvander@458
   254
}
dvander@458
   255
dvander@458
   256
static cell_t RemoveUserFlags(IPluginContext *pContext, const cell_t *params)
dvander@458
   257
{
dvander@458
   258
	int client = params[1];
dvander@458
   259
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   260
	if (!pPlayer)
dvander@458
   261
	{
ds@470
   262
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   263
	}
dvander@458
   264
	if (!pPlayer->IsConnected())
dvander@458
   265
	{
ds@470
   266
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   267
	}
dvander@458
   268
	
dvander@458
   269
	AdminId id;
dvander@458
   270
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   271
	{
dvander@458
   272
		return 0;
dvander@458
   273
	}
dvander@458
   274
dvander@458
   275
	cell_t *addr;
dvander@458
   276
	for (int i=2; i<=params[0]; i++)
dvander@458
   277
	{
dvander@458
   278
		pContext->LocalToPhysAddr(params[i], &addr);
dvander@458
   279
		g_Admins.SetAdminFlag(id, (AdminFlag)*addr, false);
dvander@458
   280
	}
dvander@458
   281
dvander@458
   282
	return 1;
dvander@458
   283
}
dvander@458
   284
dvander@458
   285
static cell_t SetUserFlagBits(IPluginContext *pContext, const cell_t *params)
dvander@458
   286
{
dvander@458
   287
	int client = params[1];
dvander@458
   288
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   289
	if (!pPlayer)
dvander@458
   290
	{
ds@470
   291
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   292
	}
dvander@458
   293
	if (!pPlayer->IsConnected())
dvander@458
   294
	{
ds@470
   295
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   296
	}
dvander@458
   297
dvander@458
   298
	AdminId id;
dvander@458
   299
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   300
	{
dvander@458
   301
		id = g_Admins.CreateAdmin(NULL);
dvander@458
   302
		pPlayer->SetAdminId(id, true);
dvander@458
   303
	}
dvander@458
   304
dvander@458
   305
	g_Admins.SetAdminFlags(id, Access_Effective, params[2]);
dvander@458
   306
dvander@458
   307
	return 1;
dvander@458
   308
}
dvander@458
   309
dvander@458
   310
static cell_t GetUserFlagBits(IPluginContext *pContext, const cell_t *params)
dvander@458
   311
{
dvander@458
   312
	int client = params[1];
dvander@458
   313
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   314
	if (!pPlayer)
dvander@458
   315
	{
ds@470
   316
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   317
	}
dvander@458
   318
	if (!pPlayer->IsConnected())
dvander@458
   319
	{
ds@470
   320
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   321
	}
dvander@458
   322
dvander@458
   323
	AdminId id;
dvander@458
   324
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   325
	{
dvander@458
   326
		return 0;
dvander@458
   327
	}
dvander@458
   328
dvander@458
   329
	return g_Admins.GetAdminFlags(id, Access_Effective);
dvander@458
   330
}
dvander@458
   331
dvander@460
   332
static cell_t GetClientUserId(IPluginContext *pContext, const cell_t *params)
dvander@460
   333
{
dvander@460
   334
	int client = params[1];
dvander@460
   335
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@460
   336
	if (!pPlayer)
dvander@460
   337
	{
ds@470
   338
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@460
   339
	}
dvander@460
   340
	if (!pPlayer->IsConnected())
dvander@460
   341
	{
ds@470
   342
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@460
   343
	}
dvander@460
   344
dvander@460
   345
	return engine->GetPlayerUserId(pPlayer->GetEdict());
dvander@460
   346
}
dvander@460
   347
dvander@540
   348
static cell_t CanUserTarget(IPluginContext *pContext, const cell_t *params)
dvander@540
   349
{
dvander@540
   350
	int client = params[1];
dvander@540
   351
	int target = params[2];
dvander@540
   352
dvander@540
   353
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@540
   354
	if (!pPlayer)
dvander@540
   355
	{
dvander@540
   356
		return pContext->ThrowNativeError("Player %d is not a valid client", client);
dvander@540
   357
	} else if (!pPlayer->IsConnected()) {
dvander@540
   358
		return pContext->ThrowNativeError("Player %d is not connected", client);
dvander@540
   359
	}
dvander@540
   360
dvander@540
   361
	CPlayer *pTarget = g_Players.GetPlayerByIndex(target);
dvander@540
   362
	if (!pTarget)
dvander@540
   363
	{
dvander@540
   364
		return pContext->ThrowNativeError("Player %d is not a valid client", target);
dvander@540
   365
	} else if (!pTarget->IsConnected()) {
dvander@540
   366
		return pContext->ThrowNativeError("Player %d is not connected", target);
dvander@540
   367
	}
dvander@540
   368
dvander@540
   369
	return g_Admins.CanAdminTarget(pPlayer->GetAdminId(), pTarget->GetAdminId()) ? 1 : 0;
dvander@540
   370
}
dvander@540
   371
faluco@260
   372
REGISTER_NATIVES(playernatives)
faluco@260
   373
{
faluco@260
   374
	{"GetMaxClients",			sm_GetMaxClients},
faluco@260
   375
	{"GetClientCount",			sm_GetClientCount},
faluco@260
   376
	{"GetClientName",			sm_GetClientName},
faluco@260
   377
	{"GetClientIP",				sm_GetClientIP},
faluco@260
   378
	{"GetClientAuthString",		sm_GetClientAuthStr},
dvander@492
   379
	{"IsClientConnected",		sm_IsPlayerConnected},
faluco@260
   380
	{"IsPlayerInGame",			sm_IsPlayerIngame},
dvander@492
   381
	{"IsClientAuthorized",		sm_IsPlayerAuthorized},
dvander@492
   382
	{"IsFakeClient",			sm_IsPlayerFakeClient},
dvander@456
   383
	{"GetClientInfo",			sm_GetClientInfo},
dvander@458
   384
	{"SetUserAdmin",			SetUserAdmin},
dvander@464
   385
	{"GetUserAdmin",			GetUserAdmin},
dvander@458
   386
	{"AddUserFlags",			AddUserFlags},
dvander@458
   387
	{"RemoveUserFlags",			RemoveUserFlags},
dvander@458
   388
	{"SetUserFlagBits",			SetUserFlagBits},
dvander@458
   389
	{"GetUserFlagBits",			GetUserFlagBits},
dvander@460
   390
	{"GetClientUserId",			GetClientUserId},
dvander@540
   391
	{"CanUserTarget",			CanUserTarget},
faluco@260
   392
	{NULL,						NULL}
dvander@351
   393
};
dvander@351
   394