core/smn_player.cpp
author Scott Ehlert <ds@alliedmods.net>
Thu Mar 22 21:50:20 2007 +0000 (2007-03-22)
changeset 653 ef60870067ff
parent 644 2a90d4324fc0
child 658 b46ff98c249b
permissions -rw-r--r--
More consistency of some sort...

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