dvander@370: /** dvander@370: * =============================================================== dvander@370: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@370: * =============================================================== dvander@370: * dvander@370: * This file is not open source and may not be copied without explicit dvander@370: * written permission of AlliedModders LLC. This file may not be redistributed dvander@370: * in whole or significant part. dvander@370: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@370: * dvander@370: * Version: $Id$ dvander@370: */ dvander@370: dvander@591: #include "PlayerManager.h" dvander@458: #include "AdminCache.h" faluco@280: #include "sm_stringutil.h" faluco@242: faluco@260: static cell_t sm_GetClientCount(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: if (params[1]) faluco@242: { dvander@448: return g_Players.NumPlayers(); faluco@242: } faluco@242: dvander@448: int maxplayers = g_Players.MaxClients(); faluco@242: int count = 0; faluco@242: for (int i=1; i<=maxplayers; ++i) faluco@242: { dvander@448: CPlayer *pPlayer = g_Players.GetPlayerByIndex(i); dvander@435: if ((pPlayer->IsConnected()) && !(pPlayer->IsInGame())) faluco@242: { faluco@242: count++; faluco@242: } faluco@242: } faluco@242: dvander@448: return (g_Players.NumPlayers() + count); faluco@242: } faluco@242: faluco@260: static cell_t sm_GetMaxClients(IPluginContext *pCtx, const cell_t *params) faluco@242: { dvander@448: return g_Players.MaxClients(); faluco@242: } faluco@242: faluco@260: static cell_t sm_GetClientName(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@242: } faluco@242: dvander@448: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@435: if (!pPlayer->IsConnected()) faluco@260: { ds@470: return pCtx->ThrowNativeError("Client %d is not connected", index); faluco@260: } faluco@260: dvander@435: pCtx->StringToLocalUTF8(params[2], static_cast(params[3]), pPlayer->GetName(), NULL); faluco@242: return 1; faluco@242: } faluco@242: faluco@260: static cell_t sm_GetClientIP(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@242: } faluco@242: dvander@448: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@435: if (!pPlayer->IsConnected()) faluco@260: { ds@470: return pCtx->ThrowNativeError("Client %d is not connected", index); faluco@260: } faluco@260: faluco@280: char buf[64], *ptr; dvander@435: strcpy(buf, pPlayer->GetIPAddress()); faluco@280: faluco@280: if (params[4] && (ptr = strchr(buf, ':'))) faluco@280: { faluco@280: *ptr = '\0'; faluco@280: } faluco@280: faluco@280: pCtx->StringToLocal(params[2], static_cast(params[3]), buf); faluco@242: return 1; faluco@242: } faluco@242: faluco@260: static cell_t sm_GetClientAuthStr(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@242: } faluco@242: dvander@448: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@435: if (!pPlayer->IsConnected()) faluco@260: { ds@470: return pCtx->ThrowNativeError("Client %d is not connected", index); faluco@260: } faluco@260: dvander@449: if (!pPlayer->IsAuthorized()) dvander@449: { dvander@449: return 0; dvander@449: } dvander@449: dvander@435: pCtx->StringToLocal(params[2], static_cast(params[3]), pPlayer->GetAuthString()); dvander@449: faluco@242: return 1; faluco@242: } faluco@242: faluco@260: static cell_t sm_IsPlayerConnected(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@242: } faluco@242: dvander@448: return (g_Players.GetPlayerByIndex(index)->IsConnected()) ? 1 : 0; faluco@242: } faluco@242: faluco@260: static cell_t sm_IsPlayerIngame(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@242: } faluco@242: dvander@448: return (g_Players.GetPlayerByIndex(index)->IsInGame()) ? 1 : 0; faluco@242: } faluco@242: faluco@260: static cell_t sm_IsPlayerAuthorized(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@242: } faluco@242: dvander@448: return (g_Players.GetPlayerByIndex(index)->IsAuthorized()) ? 1 : 0; faluco@242: } faluco@242: faluco@260: static cell_t sm_IsPlayerFakeClient(IPluginContext *pCtx, const cell_t *params) faluco@242: { faluco@242: int index = params[1]; dvander@448: if ((index < 1) || (index > g_Players.GetMaxClients())) faluco@242: { ds@470: return pCtx->ThrowNativeError("Invalid client index %d", index); faluco@260: } faluco@260: dvander@448: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@435: if (!pPlayer->IsConnected()) faluco@260: { ds@470: return pCtx->ThrowNativeError("Client %d is not connected", index); faluco@242: } faluco@242: dvander@435: return (pPlayer->IsFakeClient()) ? 1 : 0; faluco@260: } faluco@260: dvander@456: static cell_t sm_GetClientInfo(IPluginContext *pContext, const cell_t *params) dvander@456: { dvander@456: int client = params[1]; dvander@456: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@456: if (!pPlayer) dvander@456: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@456: } dvander@456: if (!pPlayer->IsConnected()) dvander@456: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@456: } dvander@456: dvander@456: char *key; dvander@456: pContext->LocalToString(params[2], &key); dvander@456: dvander@456: const char *val = engine->GetClientConVarValue(client, key); dvander@456: if (!val) dvander@456: { dvander@456: return false; dvander@456: } dvander@456: dvander@456: pContext->StringToLocalUTF8(params[3], params[4], val, NULL); dvander@456: return 1; dvander@456: } dvander@456: dvander@458: static cell_t SetUserAdmin(IPluginContext *pContext, const cell_t *params) dvander@458: { dvander@458: int client = params[1]; dvander@458: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@458: if (!pPlayer) dvander@458: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@458: } dvander@458: if (!pPlayer->IsConnected()) dvander@458: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@458: } dvander@458: if (!g_Admins.IsValidAdmin(params[2])) dvander@458: { ds@470: return pContext->ThrowNativeError("AdminId %x is not valid", params[2]); dvander@458: } dvander@458: dvander@458: pPlayer->SetAdminId(params[2], params[3] ? true : false); dvander@458: dvander@458: return 1; dvander@458: } dvander@458: dvander@458: static cell_t GetUserAdmin(IPluginContext *pContext, const cell_t *params) dvander@458: { dvander@458: int client = params[1]; dvander@458: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@458: if (!pPlayer) dvander@458: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@458: } dvander@458: if (!pPlayer->IsConnected()) dvander@458: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@458: } dvander@458: dvander@458: return pPlayer->GetAdminId(); dvander@458: } dvander@458: dvander@458: static cell_t AddUserFlags(IPluginContext *pContext, const cell_t *params) dvander@458: { dvander@458: int client = params[1]; dvander@458: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@458: if (!pPlayer) dvander@458: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@458: } dvander@458: if (!pPlayer->IsConnected()) dvander@458: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@458: } dvander@458: dvander@458: AdminId id; dvander@458: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@458: { dvander@458: id = g_Admins.CreateAdmin(NULL); dvander@458: pPlayer->SetAdminId(id, true); dvander@458: } dvander@458: dvander@458: cell_t *addr; dvander@458: for (int i=2; i<=params[0]; i++) dvander@458: { dvander@458: pContext->LocalToPhysAddr(params[i], &addr); dvander@458: g_Admins.SetAdminFlag(id, (AdminFlag)*addr, true); dvander@458: } dvander@458: dvander@458: return 1; dvander@458: } dvander@458: dvander@458: static cell_t RemoveUserFlags(IPluginContext *pContext, const cell_t *params) dvander@458: { dvander@458: int client = params[1]; dvander@458: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@458: if (!pPlayer) dvander@458: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@458: } dvander@458: if (!pPlayer->IsConnected()) dvander@458: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@458: } dvander@458: dvander@458: AdminId id; dvander@458: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@458: { dvander@458: return 0; dvander@458: } dvander@458: dvander@458: cell_t *addr; dvander@458: for (int i=2; i<=params[0]; i++) dvander@458: { dvander@458: pContext->LocalToPhysAddr(params[i], &addr); dvander@458: g_Admins.SetAdminFlag(id, (AdminFlag)*addr, false); dvander@458: } dvander@458: dvander@458: return 1; dvander@458: } dvander@458: dvander@458: static cell_t SetUserFlagBits(IPluginContext *pContext, const cell_t *params) dvander@458: { dvander@458: int client = params[1]; dvander@458: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@458: if (!pPlayer) dvander@458: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@458: } dvander@458: if (!pPlayer->IsConnected()) dvander@458: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@458: } dvander@458: dvander@458: AdminId id; dvander@458: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@458: { dvander@458: id = g_Admins.CreateAdmin(NULL); dvander@458: pPlayer->SetAdminId(id, true); dvander@458: } dvander@458: dvander@458: g_Admins.SetAdminFlags(id, Access_Effective, params[2]); dvander@458: dvander@458: return 1; dvander@458: } dvander@458: dvander@458: static cell_t GetUserFlagBits(IPluginContext *pContext, const cell_t *params) dvander@458: { dvander@458: int client = params[1]; dvander@458: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@458: if (!pPlayer) dvander@458: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@458: } dvander@458: if (!pPlayer->IsConnected()) dvander@458: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@458: } dvander@458: dvander@458: AdminId id; dvander@458: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@458: { dvander@458: return 0; dvander@458: } dvander@458: dvander@458: return g_Admins.GetAdminFlags(id, Access_Effective); dvander@458: } dvander@458: dvander@460: static cell_t GetClientUserId(IPluginContext *pContext, const cell_t *params) dvander@460: { dvander@460: int client = params[1]; dvander@460: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@460: if (!pPlayer) dvander@460: { ds@470: return pContext->ThrowNativeError("Invalid client index %d", client); dvander@460: } dvander@460: if (!pPlayer->IsConnected()) dvander@460: { ds@470: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@460: } dvander@460: dvander@460: return engine->GetPlayerUserId(pPlayer->GetEdict()); dvander@460: } dvander@460: dvander@540: static cell_t CanUserTarget(IPluginContext *pContext, const cell_t *params) dvander@540: { dvander@540: int client = params[1]; dvander@540: int target = params[2]; dvander@540: dvander@540: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@540: if (!pPlayer) dvander@540: { dvander@540: return pContext->ThrowNativeError("Player %d is not a valid client", client); dvander@540: } else if (!pPlayer->IsConnected()) { dvander@540: return pContext->ThrowNativeError("Player %d is not connected", client); dvander@540: } dvander@540: dvander@540: CPlayer *pTarget = g_Players.GetPlayerByIndex(target); dvander@540: if (!pTarget) dvander@540: { dvander@540: return pContext->ThrowNativeError("Player %d is not a valid client", target); dvander@540: } else if (!pTarget->IsConnected()) { dvander@540: return pContext->ThrowNativeError("Player %d is not connected", target); dvander@540: } dvander@540: dvander@540: return g_Admins.CanAdminTarget(pPlayer->GetAdminId(), pTarget->GetAdminId()) ? 1 : 0; dvander@540: } dvander@540: dvander@644: static cell_t GetClientTeam(IPluginContext *pContext, const cell_t *params) dvander@644: { dvander@644: int client = params[1]; dvander@644: dvander@644: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@644: if (!pPlayer) dvander@644: { dvander@644: return pContext->ThrowNativeError("Player %d is not a valid client", client); dvander@644: } else if (!pPlayer->IsInGame()) { dvander@644: return pContext->ThrowNativeError("Player %d is not in game", client); dvander@644: } dvander@644: dvander@644: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@644: if (!pInfo) dvander@644: { dvander@644: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@644: } dvander@644: dvander@644: return pInfo->GetTeamIndex(); dvander@644: } dvander@644: faluco@260: REGISTER_NATIVES(playernatives) faluco@260: { dvander@644: {"AddUserFlags", AddUserFlags}, dvander@644: {"CanUserTarget", CanUserTarget}, dvander@644: {"GetClientAuthString", sm_GetClientAuthStr}, faluco@260: {"GetClientCount", sm_GetClientCount}, dvander@644: {"GetClientInfo", sm_GetClientInfo}, faluco@260: {"GetClientIP", sm_GetClientIP}, dvander@644: {"GetClientName", sm_GetClientName}, dvander@644: {"GetClientTeam", GetClientTeam}, dvander@644: {"GetClientUserId", GetClientUserId}, dvander@644: {"GetMaxClients", sm_GetMaxClients}, dvander@644: {"GetUserAdmin", GetUserAdmin}, dvander@644: {"GetUserFlagBits", GetUserFlagBits}, dvander@644: {"IsClientAuthorized", sm_IsPlayerAuthorized}, dvander@492: {"IsClientConnected", sm_IsPlayerConnected}, dvander@492: {"IsFakeClient", sm_IsPlayerFakeClient}, dvander@644: {"IsPlayerInGame", sm_IsPlayerIngame}, dvander@458: {"RemoveUserFlags", RemoveUserFlags}, dvander@644: {"SetUserAdmin", SetUserAdmin}, dvander@458: {"SetUserFlagBits", SetUserFlagBits}, faluco@260: {NULL, NULL} dvander@351: }; dvander@351: