core/smn_player.cpp
author Scott Ehlert <ds@alliedmods.net>
Sat Feb 17 05:33:31 2007 +0000 (2007-02-17)
changeset 511 c29f8796bcf4
parent 492 6533d89c8ef6
child 518 52810a1a9620
permissions -rw-r--r--
Initial fixes to ensure static strings passed to new convars
Also fixed minor warning in smn_bitbuffer.cpp
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
faluco@280
   162
static cell_t sm_PrintToServer(IPluginContext *pCtx, const cell_t *params)
faluco@280
   163
{
faluco@280
   164
	char buffer[1024];
faluco@280
   165
	char *fmt;
faluco@280
   166
	int arg = 2;
faluco@280
   167
faluco@280
   168
	pCtx->LocalToString(params[1], &fmt);
faluco@280
   169
	size_t res = atcprintf(buffer, sizeof(buffer)-2, fmt, pCtx, params, &arg);
faluco@280
   170
faluco@280
   171
	buffer[res++] = '\n';
faluco@280
   172
	buffer[res] = '\0';
faluco@280
   173
faluco@280
   174
	META_CONPRINT(buffer);
faluco@280
   175
faluco@280
   176
	return 1;
faluco@280
   177
}
faluco@280
   178
dvander@456
   179
static cell_t sm_GetClientInfo(IPluginContext *pContext, const cell_t *params)
dvander@456
   180
{
dvander@456
   181
	int client = params[1];
dvander@456
   182
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@456
   183
	if (!pPlayer)
dvander@456
   184
	{
ds@470
   185
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@456
   186
	}
dvander@456
   187
	if (!pPlayer->IsConnected())
dvander@456
   188
	{
ds@470
   189
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@456
   190
	}
dvander@456
   191
dvander@456
   192
	char *key;
dvander@456
   193
	pContext->LocalToString(params[2], &key);
dvander@456
   194
dvander@456
   195
	const char *val = engine->GetClientConVarValue(client, key);
dvander@456
   196
	if (!val)
dvander@456
   197
	{
dvander@456
   198
		return false;
dvander@456
   199
	}
dvander@456
   200
dvander@456
   201
	pContext->StringToLocalUTF8(params[3], params[4], val, NULL);
dvander@456
   202
	return 1;
dvander@456
   203
}
dvander@456
   204
faluco@280
   205
static cell_t sm_PrintToConsole(IPluginContext *pCtx, const cell_t *params)
faluco@280
   206
{
faluco@280
   207
	int index = params[1];
dvander@448
   208
	if ((index < 1) || (index > g_Players.GetMaxClients()))
faluco@280
   209
	{
ds@470
   210
		return pCtx->ThrowNativeError("Invalid client index %d", index);
faluco@280
   211
	}
faluco@280
   212
dvander@448
   213
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
dvander@435
   214
	if (!pPlayer->IsInGame())
faluco@280
   215
	{
ds@470
   216
		return pCtx->ThrowNativeError("Client %d is not in game", index);
faluco@280
   217
	}
faluco@280
   218
faluco@280
   219
	char buffer[1024];
faluco@280
   220
	char *fmt;
faluco@280
   221
	int arg = 3;
faluco@280
   222
faluco@280
   223
	pCtx->LocalToString(params[2], &fmt);
faluco@280
   224
	size_t res = atcprintf(buffer, sizeof(buffer)-2, fmt, pCtx, params, &arg);
faluco@280
   225
faluco@280
   226
	buffer[res++] = '\n';
faluco@280
   227
	buffer[res] = '\0';
faluco@280
   228
dvander@435
   229
	engine->ClientPrintf(pPlayer->GetEdict(), buffer);
faluco@280
   230
faluco@280
   231
	return 1;
faluco@280
   232
}
faluco@280
   233
dvander@458
   234
static cell_t SetUserAdmin(IPluginContext *pContext, const cell_t *params)
dvander@458
   235
{
dvander@458
   236
	int client = params[1];
dvander@458
   237
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   238
	if (!pPlayer)
dvander@458
   239
	{
ds@470
   240
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   241
	}
dvander@458
   242
	if (!pPlayer->IsConnected())
dvander@458
   243
	{
ds@470
   244
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   245
	}
dvander@458
   246
	if (!g_Admins.IsValidAdmin(params[2]))
dvander@458
   247
	{
ds@470
   248
		return pContext->ThrowNativeError("AdminId %x is not valid", params[2]);
dvander@458
   249
	}
dvander@458
   250
dvander@458
   251
	pPlayer->SetAdminId(params[2], params[3] ? true : false);
dvander@458
   252
dvander@458
   253
	return 1;
dvander@458
   254
}
dvander@458
   255
dvander@458
   256
static cell_t GetUserAdmin(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
	return pPlayer->GetAdminId();
dvander@458
   270
}
dvander@458
   271
dvander@458
   272
static cell_t AddUserFlags(IPluginContext *pContext, const cell_t *params)
dvander@458
   273
{
dvander@458
   274
	int client = params[1];
dvander@458
   275
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   276
	if (!pPlayer)
dvander@458
   277
	{
ds@470
   278
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   279
	}
dvander@458
   280
	if (!pPlayer->IsConnected())
dvander@458
   281
	{
ds@470
   282
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   283
	}
dvander@458
   284
dvander@458
   285
	AdminId id;
dvander@458
   286
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   287
	{
dvander@458
   288
		id = g_Admins.CreateAdmin(NULL);
dvander@458
   289
		pPlayer->SetAdminId(id, true);
dvander@458
   290
	}
dvander@458
   291
dvander@458
   292
	cell_t *addr;
dvander@458
   293
	for (int i=2; i<=params[0]; i++)
dvander@458
   294
	{
dvander@458
   295
		pContext->LocalToPhysAddr(params[i], &addr);
dvander@458
   296
		g_Admins.SetAdminFlag(id, (AdminFlag)*addr, true);
dvander@458
   297
	}
dvander@458
   298
dvander@458
   299
	return 1;
dvander@458
   300
}
dvander@458
   301
dvander@458
   302
static cell_t RemoveUserFlags(IPluginContext *pContext, const cell_t *params)
dvander@458
   303
{
dvander@458
   304
	int client = params[1];
dvander@458
   305
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   306
	if (!pPlayer)
dvander@458
   307
	{
ds@470
   308
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   309
	}
dvander@458
   310
	if (!pPlayer->IsConnected())
dvander@458
   311
	{
ds@470
   312
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   313
	}
dvander@458
   314
	
dvander@458
   315
	AdminId id;
dvander@458
   316
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   317
	{
dvander@458
   318
		return 0;
dvander@458
   319
	}
dvander@458
   320
dvander@458
   321
	cell_t *addr;
dvander@458
   322
	for (int i=2; i<=params[0]; i++)
dvander@458
   323
	{
dvander@458
   324
		pContext->LocalToPhysAddr(params[i], &addr);
dvander@458
   325
		g_Admins.SetAdminFlag(id, (AdminFlag)*addr, false);
dvander@458
   326
	}
dvander@458
   327
dvander@458
   328
	return 1;
dvander@458
   329
}
dvander@458
   330
dvander@458
   331
static cell_t SetUserFlagBits(IPluginContext *pContext, const cell_t *params)
dvander@458
   332
{
dvander@458
   333
	int client = params[1];
dvander@458
   334
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   335
	if (!pPlayer)
dvander@458
   336
	{
ds@470
   337
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   338
	}
dvander@458
   339
	if (!pPlayer->IsConnected())
dvander@458
   340
	{
ds@470
   341
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   342
	}
dvander@458
   343
dvander@458
   344
	AdminId id;
dvander@458
   345
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   346
	{
dvander@458
   347
		id = g_Admins.CreateAdmin(NULL);
dvander@458
   348
		pPlayer->SetAdminId(id, true);
dvander@458
   349
	}
dvander@458
   350
dvander@458
   351
	g_Admins.SetAdminFlags(id, Access_Effective, params[2]);
dvander@458
   352
dvander@458
   353
	return 1;
dvander@458
   354
}
dvander@458
   355
dvander@458
   356
static cell_t GetUserFlagBits(IPluginContext *pContext, const cell_t *params)
dvander@458
   357
{
dvander@458
   358
	int client = params[1];
dvander@458
   359
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@458
   360
	if (!pPlayer)
dvander@458
   361
	{
ds@470
   362
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@458
   363
	}
dvander@458
   364
	if (!pPlayer->IsConnected())
dvander@458
   365
	{
ds@470
   366
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@458
   367
	}
dvander@458
   368
dvander@458
   369
	AdminId id;
dvander@458
   370
	if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID)
dvander@458
   371
	{
dvander@458
   372
		return 0;
dvander@458
   373
	}
dvander@458
   374
dvander@458
   375
	return g_Admins.GetAdminFlags(id, Access_Effective);
dvander@458
   376
}
dvander@458
   377
dvander@460
   378
static cell_t GetClientUserId(IPluginContext *pContext, const cell_t *params)
dvander@460
   379
{
dvander@460
   380
	int client = params[1];
dvander@460
   381
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@460
   382
	if (!pPlayer)
dvander@460
   383
	{
ds@470
   384
		return pContext->ThrowNativeError("Invalid client index %d", client);
dvander@460
   385
	}
dvander@460
   386
	if (!pPlayer->IsConnected())
dvander@460
   387
	{
ds@470
   388
		return pContext->ThrowNativeError("Client %d is not connected", client);
dvander@460
   389
	}
dvander@460
   390
dvander@460
   391
	return engine->GetPlayerUserId(pPlayer->GetEdict());
dvander@460
   392
}
dvander@460
   393
faluco@260
   394
REGISTER_NATIVES(playernatives)
faluco@260
   395
{
faluco@260
   396
	{"GetMaxClients",			sm_GetMaxClients},
faluco@260
   397
	{"GetClientCount",			sm_GetClientCount},
faluco@260
   398
	{"GetClientName",			sm_GetClientName},
faluco@260
   399
	{"GetClientIP",				sm_GetClientIP},
faluco@260
   400
	{"GetClientAuthString",		sm_GetClientAuthStr},
dvander@492
   401
	{"IsClientConnected",		sm_IsPlayerConnected},
faluco@260
   402
	{"IsPlayerInGame",			sm_IsPlayerIngame},
dvander@492
   403
	{"IsClientAuthorized",		sm_IsPlayerAuthorized},
dvander@492
   404
	{"IsFakeClient",			sm_IsPlayerFakeClient},
faluco@280
   405
	{"PrintToServer",			sm_PrintToServer},
faluco@280
   406
	{"PrintToConsole",			sm_PrintToConsole},
dvander@456
   407
	{"GetClientInfo",			sm_GetClientInfo},
dvander@458
   408
	{"SetUserAdmin",			SetUserAdmin},
dvander@464
   409
	{"GetUserAdmin",			GetUserAdmin},
dvander@458
   410
	{"AddUserFlags",			AddUserFlags},
dvander@458
   411
	{"RemoveUserFlags",			RemoveUserFlags},
dvander@458
   412
	{"SetUserFlagBits",			SetUserFlagBits},
dvander@458
   413
	{"GetUserFlagBits",			GetUserFlagBits},
dvander@460
   414
	{"GetClientUserId",			GetClientUserId},
faluco@260
   415
	{NULL,						NULL}
dvander@351
   416
};
dvander@351
   417