dvander@2168: /** dvander@2168: * vim: set ts=4 : dvander@2168: * ============================================================================= dvander@2168: * SourceMod dvander@2168: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. dvander@2168: * ============================================================================= dvander@2168: * dvander@2168: * This program is free software; you can redistribute it and/or modify it under dvander@2168: * the terms of the GNU General Public License, version 3.0, as published by the dvander@2168: * Free Software Foundation. dvander@2168: * dvander@2168: * This program is distributed in the hope that it will be useful, but WITHOUT dvander@2168: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@2168: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more dvander@2168: * details. dvander@2168: * dvander@2168: * You should have received a copy of the GNU General Public License along with dvander@2168: * this program. If not, see . dvander@2168: * dvander@2168: * As a special exception, AlliedModders LLC gives you permission to link the dvander@2168: * code of this program (as well as its derivative works) to "Half-Life 2," the dvander@2168: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software dvander@2168: * by the Valve Corporation. You must obey the GNU General Public License in dvander@2168: * all respects for all other code used. Additionally, AlliedModders LLC grants dvander@2168: * this exception to all derivative works. AlliedModders LLC defines further dvander@2168: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), dvander@2168: * or . dvander@2168: * dvander@2168: * Version: $Id$ dvander@2168: */ dvander@2168: dvander@2168: #include "PlayerManager.h" dvander@2168: #include "AdminCache.h" dvander@2168: #include "sm_stringutil.h" dvander@2168: #include "HalfLife2.h" dvander@2168: #include "sourcemod.h" dvander@2168: #include "ChatTriggers.h" dvander@2168: #include dvander@2168: #include dvander@2168: dvander@2168: ConVar sm_show_activity("sm_show_activity", "13", FCVAR_SPONLY, "Activity display setting (see sourcemod.cfg)"); dvander@2168: dvander@2168: static cell_t sm_GetClientCount(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: if (params[1]) dvander@2168: { dvander@2168: return g_Players.NumPlayers(); dvander@2168: } dvander@2168: dvander@2168: int maxplayers = g_Players.MaxClients(); dvander@2168: int count = 0; dvander@2168: for (int i=1; i<=maxplayers; ++i) dvander@2168: { dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(i); dvander@2168: if ((pPlayer->IsConnected()) && !(pPlayer->IsInGame())) dvander@2168: { dvander@2168: count++; dvander@2168: } dvander@2168: } dvander@2168: dvander@2168: return (g_Players.NumPlayers() + count); dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_GetMaxClients(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: return g_Players.MaxClients(); dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_GetClientName(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: dvander@2168: if (index == 0) dvander@2168: { dvander@2168: static ConVar *hostname = NULL; dvander@2168: if (!hostname) dvander@2168: { dvander@2168: hostname = icvar->FindVar("hostname"); dvander@2168: if (!hostname) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Could not find \"hostname\" cvar"); dvander@2168: } dvander@2168: } dvander@2168: pCtx->StringToLocalUTF8(params[2], static_cast(params[3]), hostname->GetString(), NULL); dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client %d is not connected", index); dvander@2168: } dvander@2168: dvander@2168: pCtx->StringToLocalUTF8(params[2], static_cast(params[3]), pPlayer->GetName(), NULL); dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_GetClientIP(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client %d is not connected", index); dvander@2168: } dvander@2168: dvander@2168: char buf[64], *ptr; dvander@2168: strcpy(buf, pPlayer->GetIPAddress()); dvander@2168: dvander@2168: if (params[4] && (ptr = strchr(buf, ':'))) dvander@2168: { dvander@2168: *ptr = '\0'; dvander@2168: } dvander@2168: dvander@2168: pCtx->StringToLocal(params[2], static_cast(params[3]), buf); dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_GetClientAuthStr(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client %d is not connected", index); dvander@2168: } dvander@2168: dvander@2168: if (!pPlayer->IsAuthorized()) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: pCtx->StringToLocal(params[2], static_cast(params[3]), pPlayer->GetAuthString()); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_IsClientConnected(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: return (g_Players.GetPlayerByIndex(index)->IsConnected()) ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_IsClientInGame(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: return (g_Players.GetPlayerByIndex(index)->IsInGame()) ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_IsClientAuthorized(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: return (g_Players.GetPlayerByIndex(index)->IsAuthorized()) ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_IsClientFakeClient(IPluginContext *pCtx, const cell_t *params) dvander@2168: { dvander@2168: int index = params[1]; dvander@2168: if ((index < 1) || (index > g_Players.GetMaxClients())) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client index %d is invalid", index); dvander@2168: } dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(index); dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pCtx->ThrowNativeError("Client %d is not connected", index); dvander@2168: } dvander@2168: dvander@2168: return (pPlayer->IsFakeClient()) ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t IsClientObserver(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: return pInfo->IsObserver() ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t sm_GetClientInfo(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: char *key; dvander@2168: pContext->LocalToString(params[2], &key); dvander@2168: dvander@2168: const char *val = engine->GetClientConVarValue(client, key); dvander@2168: if (!val) dvander@2168: { dvander@2168: return false; dvander@2168: } dvander@2168: dvander@2168: pContext->StringToLocalUTF8(params[3], params[4], val, NULL); dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t SetUserAdmin(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: if (!g_Admins.IsValidAdmin(params[2]) && params[2] != INVALID_ADMIN_ID) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("AdminId %x is invalid", params[2]); dvander@2168: } dvander@2168: dvander@2168: pPlayer->SetAdminId(params[2], params[3] ? true : false); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetUserAdmin(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: return pPlayer->GetAdminId(); dvander@2168: } dvander@2168: dvander@2168: static cell_t AddUserFlags(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: AdminId id; dvander@2168: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@2168: { dvander@2168: id = g_Admins.CreateAdmin(NULL); dvander@2168: pPlayer->SetAdminId(id, true); dvander@2168: } dvander@2168: dvander@2168: cell_t *addr; dvander@2168: for (int i=2; i<=params[0]; i++) dvander@2168: { dvander@2168: pContext->LocalToPhysAddr(params[i], &addr); dvander@2168: g_Admins.SetAdminFlag(id, (AdminFlag)*addr, true); dvander@2168: } dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t RemoveUserFlags(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: AdminId id; dvander@2168: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: cell_t *addr; dvander@2168: for (int i=2; i<=params[0]; i++) dvander@2168: { dvander@2168: pContext->LocalToPhysAddr(params[i], &addr); dvander@2168: g_Admins.SetAdminFlag(id, (AdminFlag)*addr, false); dvander@2168: } dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t SetUserFlagBits(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: AdminId id; dvander@2168: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@2168: { dvander@2168: id = g_Admins.CreateAdmin(NULL); dvander@2168: pPlayer->SetAdminId(id, true); dvander@2168: } dvander@2168: dvander@2168: g_Admins.SetAdminFlags(id, Access_Effective, params[2]); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetUserFlagBits(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: AdminId id; dvander@2168: if ((id=pPlayer->GetAdminId()) == INVALID_ADMIN_ID) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: return g_Admins.GetAdminFlags(id, Access_Effective); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetClientUserId(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: return engine->GetPlayerUserId(pPlayer->GetEdict()); dvander@2168: } dvander@2168: dvander@2168: static cell_t CanUserTarget(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: int target = params[2]; dvander@2168: dvander@2168: if (client == 0) dvander@2168: { dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsConnected()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: CPlayer *pTarget = g_Players.GetPlayerByIndex(target); dvander@2168: if (!pTarget) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", target); dvander@2168: } else if (!pTarget->IsConnected()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", target); dvander@2168: } dvander@2168: dvander@2168: return g_Admins.CanAdminTarget(pPlayer->GetAdminId(), pTarget->GetAdminId()) ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetClientTeam(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: return pInfo->GetTeamIndex(); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetFragCount(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: return pInfo->GetFragCount(); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetDeathCount(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: return pInfo->GetDeathCount(); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetArmorValue(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: return pInfo->GetArmorValue(); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAbsOrigin(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: cell_t *pVec; dvander@2168: pContext->LocalToPhysAddr(params[2], &pVec); dvander@2168: dvander@2168: Vector vec = pInfo->GetAbsOrigin(); dvander@2168: pVec[0] = sp_ftoc(vec.x); dvander@2168: pVec[1] = sp_ftoc(vec.y); dvander@2168: pVec[2] = sp_ftoc(vec.z); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAbsAngles(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: cell_t *pAng; dvander@2168: pContext->LocalToPhysAddr(params[2], &pAng); dvander@2168: dvander@2168: QAngle ang = pInfo->GetAbsAngles(); dvander@2168: pAng[0] = sp_ftoc(ang.x); dvander@2168: pAng[1] = sp_ftoc(ang.y); dvander@2168: pAng[2] = sp_ftoc(ang.z); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetPlayerMins(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: cell_t *pVec; dvander@2168: pContext->LocalToPhysAddr(params[2], &pVec); dvander@2168: dvander@2168: Vector vec = pInfo->GetPlayerMins(); dvander@2168: pVec[0] = sp_ftoc(vec.x); dvander@2168: pVec[1] = sp_ftoc(vec.y); dvander@2168: pVec[2] = sp_ftoc(vec.z); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetPlayerMaxs(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: cell_t *pVec; dvander@2168: pContext->LocalToPhysAddr(params[2], &pVec); dvander@2168: dvander@2168: Vector vec = pInfo->GetPlayerMaxs(); dvander@2168: pVec[0] = sp_ftoc(vec.x); dvander@2168: pVec[1] = sp_ftoc(vec.y); dvander@2168: pVec[2] = sp_ftoc(vec.z); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetWeaponName(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: const char *weapon = pInfo->GetWeaponName(); dvander@2168: pContext->StringToLocalUTF8(params[2], static_cast(params[3]), weapon ? weapon : "", NULL); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetModelName(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: const char *model = pInfo->GetModelName(); dvander@2168: pContext->StringToLocalUTF8(params[2], static_cast(params[3]), model ? model : "", NULL); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetHealth(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: return pInfo->GetHealth(); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetTimeConnected(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } else if (pPlayer->IsFakeClient()) { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: return sp_ftoc(pInfo->GetTimeConnected()); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetDataRate(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } else if (pPlayer->IsFakeClient()) { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: return pInfo->GetDataRate(); dvander@2168: } dvander@2168: dvander@2168: static cell_t IsTimingOut(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } else if (pPlayer->IsFakeClient()) { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: return pInfo->IsTimingOut() ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t GetLatency(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: float value; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: if (params[2] == MAX_FLOWS) dvander@2168: { dvander@2168: value = pInfo->GetLatency(FLOW_INCOMING) + pInfo->GetLatency(FLOW_OUTGOING); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: value = pInfo->GetLatency(params[2]); dvander@2168: } dvander@2168: dvander@2168: return sp_ftoc(value); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAvgLatency(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: float value; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: if (params[2] == MAX_FLOWS) dvander@2168: { dvander@2168: value = pInfo->GetAvgLatency(FLOW_INCOMING) + pInfo->GetAvgLatency(FLOW_OUTGOING); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: value = pInfo->GetAvgLatency(params[2]); dvander@2168: } dvander@2168: dvander@2168: return sp_ftoc(value); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAvgLoss(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: float value; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: if (params[2] == MAX_FLOWS) dvander@2168: { dvander@2168: value = pInfo->GetAvgLoss(FLOW_INCOMING) + pInfo->GetAvgLoss(FLOW_OUTGOING); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: value = pInfo->GetAvgLoss(params[2]); dvander@2168: } dvander@2168: dvander@2168: return sp_ftoc(value); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAvgChoke(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: float value; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: if (params[2] == MAX_FLOWS) dvander@2168: { dvander@2168: value = pInfo->GetAvgChoke(FLOW_INCOMING) + pInfo->GetAvgChoke(FLOW_OUTGOING); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: value = pInfo->GetAvgChoke(params[2]); dvander@2168: } dvander@2168: dvander@2168: return sp_ftoc(value); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAvgData(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: float value; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: if (params[2] == MAX_FLOWS) dvander@2168: { dvander@2168: value = pInfo->GetAvgData(FLOW_INCOMING) + pInfo->GetAvgData(FLOW_OUTGOING); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: value = pInfo->GetAvgData(params[2]); dvander@2168: } dvander@2168: dvander@2168: return sp_ftoc(value); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetAvgPackets(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: float value; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is a bot", client); dvander@2168: } dvander@2168: dvander@2168: INetChannelInfo *pInfo = engine->GetPlayerNetInfo(client); dvander@2168: dvander@2168: if (params[2] == MAX_FLOWS) dvander@2168: { dvander@2168: value = pInfo->GetAvgPackets(FLOW_INCOMING) + pInfo->GetAvgPackets(FLOW_OUTGOING); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: value = pInfo->GetAvgPackets(params[2]); dvander@2168: } dvander@2168: dvander@2168: return sp_ftoc(value); dvander@2168: } dvander@2168: dvander@2168: static cell_t GetClientOfUserId(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: return g_Players.GetClientOfUserId(params[1]); dvander@2168: } dvander@2168: dvander@2168: static cell_t _ShowActivity(IPluginContext *pContext, dvander@2168: const cell_t *params, dvander@2168: const char *tag, dvander@2168: cell_t fmt_param) dvander@2168: { dvander@2168: char message[255]; dvander@2168: char buffer[255]; dvander@2168: int value = sm_show_activity.GetInt(); dvander@2168: unsigned int replyto = g_ChatTriggers.GetReplyTo(); dvander@2168: int client = params[1]; dvander@2168: dvander@2168: const char *name = "Console"; dvander@2168: const char *sign = "ADMIN"; dvander@2168: bool display_in_chat = false; dvander@2168: if (client != 0) dvander@2168: { dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer || !pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: name = pPlayer->GetName(); dvander@2168: AdminId id = pPlayer->GetAdminId(); dvander@2168: if (id == INVALID_ADMIN_ID dvander@2168: || !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective)) dvander@2168: { dvander@2168: sign = "PLAYER"; dvander@2168: } dvander@2168: dvander@2168: /* Display the message to the client? */ dvander@2168: if (replyto == SM_REPLY_CONSOLE) dvander@2168: { dvander@2168: g_SourceMod.SetGlobalTarget(client); dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer); dvander@2168: engine->ClientPrintf(pPlayer->GetEdict(), message); dvander@2168: display_in_chat = true; dvander@2168: } dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE); dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer); dvander@2168: META_CONPRINT(message); dvander@2168: } dvander@2168: dvander@2168: if (!value) dvander@2168: { dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: int maxClients = g_Players.GetMaxClients(); dvander@2168: for (int i=1; i<=maxClients; i++) dvander@2168: { dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(i); dvander@2168: if (!pPlayer->IsInGame() dvander@2168: || pPlayer->IsFakeClient() dvander@2168: || (display_in_chat && i == client)) dvander@2168: { dvander@2168: continue; dvander@2168: } dvander@2168: AdminId id = pPlayer->GetAdminId(); dvander@2168: g_SourceMod.SetGlobalTarget(i); dvander@2168: if (id == INVALID_ADMIN_ID dvander@2168: || !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective)) dvander@2168: { dvander@2168: /* Treat this as a normal user */ dvander@2168: if ((value & 1) || (value & 2)) dvander@2168: { dvander@2168: const char *newsign = sign; dvander@2168: if ((value & 2) || (i == client)) dvander@2168: { dvander@2168: newsign = name; dvander@2168: } dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer); dvander@2168: g_HL2.TextMsg(i, HUD_PRINTTALK, message); dvander@2168: } dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: /* Treat this as an admin user */ dvander@2168: bool is_root = g_Admins.GetAdminFlag(id, Admin_Root, Access_Effective); dvander@2168: if ((value & 4) dvander@2168: || (value & 8) dvander@2168: || ((value & 16) && is_root)) dvander@2168: { dvander@2168: const char *newsign = sign; dvander@2168: if ((value & 8) || ((value & 16) && is_root) || (i == client)) dvander@2168: { dvander@2168: newsign = name; dvander@2168: } dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer); dvander@2168: g_HL2.TextMsg(i, HUD_PRINTTALK, message); dvander@2168: } dvander@2168: } dvander@2168: } dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t _ShowActivity2(IPluginContext *pContext, dvander@2168: const cell_t *params, dvander@2168: const char *tag, dvander@2168: cell_t fmt_param) dvander@2168: { dvander@2168: char message[255]; dvander@2168: char buffer[255]; dvander@2168: int value = sm_show_activity.GetInt(); dvander@2168: unsigned int replyto = g_ChatTriggers.GetReplyTo(); dvander@2168: int client = params[1]; dvander@2168: dvander@2168: const char *name = "Console"; dvander@2168: const char *sign = "ADMIN"; dvander@2168: if (client != 0) dvander@2168: { dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer || !pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: name = pPlayer->GetName(); dvander@2168: AdminId id = pPlayer->GetAdminId(); dvander@2168: if (id == INVALID_ADMIN_ID dvander@2168: || !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective)) dvander@2168: { dvander@2168: sign = "PLAYER"; dvander@2168: } dvander@2168: dvander@2168: g_SourceMod.SetGlobalTarget(client); dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: /* We don't display directly to the console because the chat text dvander@2168: * simply gets added to the console, so we don't want it to print dvander@2168: * twice. dvander@2168: */ dvander@2168: if (replyto == SM_REPLY_CONSOLE) dvander@2168: { dvander@2168: #if 0 dvander@2168: UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer); dvander@2168: engine->ClientPrintf(pPlayer->GetEdict(), message); dvander@2168: #endif dvander@2168: UTIL_Format(message, sizeof(message), "%s%s", tag, buffer); dvander@2168: g_HL2.TextMsg(client, HUD_PRINTTALK, message); dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: UTIL_Format(message, sizeof(message), "%s%s", tag, buffer); dvander@2168: g_HL2.TextMsg(client, HUD_PRINTTALK, message); dvander@2168: } dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE); dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s\n", tag, buffer); dvander@2168: META_CONPRINT(message); dvander@2168: } dvander@2168: dvander@2168: if (!value) dvander@2168: { dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: int maxClients = g_Players.GetMaxClients(); dvander@2168: for (int i=1; i<=maxClients; i++) dvander@2168: { dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(i); dvander@2168: if (!pPlayer->IsInGame() dvander@2168: || pPlayer->IsFakeClient() dvander@2168: || i == client) dvander@2168: { dvander@2168: continue; dvander@2168: } dvander@2168: AdminId id = pPlayer->GetAdminId(); dvander@2168: g_SourceMod.SetGlobalTarget(i); dvander@2168: if (id == INVALID_ADMIN_ID dvander@2168: || !g_Admins.GetAdminFlag(id, Admin_Generic, Access_Effective)) dvander@2168: { dvander@2168: /* Treat this as a normal user */ dvander@2168: if ((value & 1) || (value & 2)) dvander@2168: { dvander@2168: const char *newsign = sign; dvander@2168: if ((value & 2)) dvander@2168: { dvander@2168: newsign = name; dvander@2168: } dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer); dvander@2168: g_HL2.TextMsg(i, HUD_PRINTTALK, message); dvander@2168: } dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: /* Treat this as an admin user */ dvander@2168: bool is_root = g_Admins.GetAdminFlag(id, Admin_Root, Access_Effective); dvander@2168: if ((value & 4) dvander@2168: || (value & 8) dvander@2168: || ((value & 16) && is_root)) dvander@2168: { dvander@2168: const char *newsign = sign; dvander@2168: if ((value & 8) || ((value & 16) && is_root)) dvander@2168: { dvander@2168: newsign = name; dvander@2168: } dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, fmt_param); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: UTIL_Format(message, sizeof(message), "%s%s: %s", tag, newsign, buffer); dvander@2168: g_HL2.TextMsg(i, HUD_PRINTTALK, message); dvander@2168: } dvander@2168: } dvander@2168: } dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t ShowActivity(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: return _ShowActivity(pContext, params, "[SM] ", 2); dvander@2168: } dvander@2168: dvander@2168: static cell_t ShowActivityEx(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: char *str; dvander@2168: pContext->LocalToString(params[2], &str); dvander@2168: dvander@2168: return _ShowActivity(pContext, params, str, 3); dvander@2168: } dvander@2168: dvander@2168: static cell_t ShowActivity2(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: char *str; dvander@2168: pContext->LocalToString(params[2], &str); dvander@2168: dvander@2168: return _ShowActivity2(pContext, params, str, 3); dvander@2168: } dvander@2168: dvander@2168: static cell_t KickClient(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: /* Ignore duplicate kicks */ dvander@2168: if (pPlayer->IsInKickQueue()) dvander@2168: { dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: pPlayer->MarkAsBeingKicked(); dvander@2168: dvander@2168: if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: char kickcmd[40]; dvander@2168: UTIL_Format(kickcmd, sizeof(kickcmd), "kick %s\n", pPlayer->GetName()); dvander@2168: dvander@2168: engine->ServerCommand(kickcmd); dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: g_SourceMod.SetGlobalTarget(client); dvander@2168: dvander@2168: char buffer[256]; dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: g_HL2.AddDelayedKick(client, pPlayer->GetUserId(), buffer); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t KickClientEx(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not connected", client); dvander@2168: } dvander@2168: dvander@2168: /* Ignore duplicate kicks */ dvander@2168: if (pPlayer->IsInKickQueue()) dvander@2168: { dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: pPlayer->MarkAsBeingKicked(); dvander@2168: dvander@2168: if (pPlayer->IsFakeClient()) dvander@2168: { dvander@2168: char kickcmd[40]; dvander@2168: UTIL_Format(kickcmd, sizeof(kickcmd), "kick %s\n", pPlayer->GetName()); dvander@2168: dvander@2168: engine->ServerCommand(kickcmd); dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: g_SourceMod.SetGlobalTarget(client); dvander@2168: dvander@2168: char buffer[256]; dvander@2168: g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); dvander@2168: dvander@2168: if (pContext->GetContext()->n_err != SP_ERROR_NONE) dvander@2168: { dvander@2168: return 0; dvander@2168: } dvander@2168: dvander@2168: pPlayer->Kick(buffer); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t ChangeClientTeam(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: IPlayerInfo *pInfo = pPlayer->GetPlayerInfo(); dvander@2168: if (!pInfo) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("IPlayerInfo not supported by game"); dvander@2168: } dvander@2168: dvander@2168: pInfo->ChangeTeam(params[2]); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t RunAdminCacheChecks(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsAuthorized()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not authorized", client); dvander@2168: } dvander@2168: dvander@2168: AdminId id = pPlayer->GetAdminId(); dvander@2168: pPlayer->DoBasicAdminChecks(); dvander@2168: dvander@2168: return (id != pPlayer->GetAdminId()) ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t NotifyPostAdminCheck(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsInGame()) { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsAuthorized()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not authorized", client); dvander@2168: } dvander@2168: dvander@2168: pPlayer->NotifyPostAdminChecks(); dvander@2168: dvander@2168: return 1; dvander@2168: } dvander@2168: dvander@2168: static cell_t IsClientInKickQueue(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: int client = params[1]; dvander@2168: dvander@2168: CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); dvander@2168: dvander@2168: if (!pPlayer) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client index %d is invalid", client); dvander@2168: } dvander@2168: else if (!pPlayer->IsConnected()) dvander@2168: { dvander@2168: return pContext->ThrowNativeError("Client %d is not in game", client); dvander@2168: } dvander@2168: dvander@2168: return pPlayer->IsInKickQueue() ? 1 : 0; dvander@2168: } dvander@2168: dvander@2168: static cell_t ProcessTargetString(IPluginContext *pContext, const cell_t *params) dvander@2168: { dvander@2168: cmd_target_info_t info; dvander@2168: dvander@2168: pContext->LocalToString(params[1], (char **)&info.pattern); dvander@2168: info.admin = params[2]; dvander@2168: pContext->LocalToPhysAddr(params[3], &info.targets); dvander@2168: info.max_targets = params[4]; dvander@2168: info.flags = params[5]; dvander@2168: pContext->LocalToString(params[6], &info.target_name); dvander@2168: info.target_name_maxlength = params[7]; dvander@2168: dvander@2168: cell_t *tn_is_ml; dvander@2168: pContext->LocalToPhysAddr(params[8], &tn_is_ml); dvander@2168: dvander@2168: g_Players.ProcessCommandTarget(&info); dvander@2168: dvander@2168: if (info.target_name_style == COMMAND_TARGETNAME_ML) dvander@2168: { dvander@2168: *tn_is_ml = 1; dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: *tn_is_ml = 0; dvander@2168: } dvander@2168: dvander@2168: if (info.num_targets == 0) dvander@2168: { dvander@2168: return info.reason; dvander@2168: } dvander@2168: else dvander@2168: { dvander@2168: return info.num_targets; dvander@2168: } dvander@2168: } dvander@2168: dvander@2168: REGISTER_NATIVES(playernatives) dvander@2168: { dvander@2168: {"AddUserFlags", AddUserFlags}, dvander@2168: {"CanUserTarget", CanUserTarget}, dvander@2168: {"ChangeClientTeam", ChangeClientTeam}, dvander@2168: {"GetClientAuthString", sm_GetClientAuthStr}, dvander@2168: {"GetClientCount", sm_GetClientCount}, dvander@2168: {"GetClientInfo", sm_GetClientInfo}, dvander@2168: {"GetClientIP", sm_GetClientIP}, dvander@2168: {"GetClientName", sm_GetClientName}, dvander@2168: {"GetClientTeam", GetClientTeam}, dvander@2168: {"GetClientUserId", GetClientUserId}, dvander@2168: {"GetMaxClients", sm_GetMaxClients}, dvander@2168: {"GetUserAdmin", GetUserAdmin}, dvander@2168: {"GetUserFlagBits", GetUserFlagBits}, dvander@2168: {"IsClientAuthorized", sm_IsClientAuthorized}, dvander@2168: {"IsClientConnected", sm_IsClientConnected}, dvander@2168: {"IsFakeClient", sm_IsClientFakeClient}, dvander@2168: {"IsClientInGame", sm_IsClientInGame}, dvander@2168: {"IsClientObserver", IsClientObserver}, dvander@2168: {"RemoveUserFlags", RemoveUserFlags}, dvander@2168: {"SetUserAdmin", SetUserAdmin}, dvander@2168: {"SetUserFlagBits", SetUserFlagBits}, dvander@2168: {"GetClientDeaths", GetDeathCount}, dvander@2168: {"GetClientFrags", GetFragCount}, dvander@2168: {"GetClientArmor", GetArmorValue}, dvander@2168: {"GetClientAbsOrigin", GetAbsOrigin}, dvander@2168: {"GetClientAbsAngles", GetAbsAngles}, dvander@2168: {"GetClientMins", GetPlayerMins}, dvander@2168: {"GetClientMaxs", GetPlayerMaxs}, dvander@2168: {"GetClientWeapon", GetWeaponName}, dvander@2168: {"GetClientModel", GetModelName}, dvander@2168: {"GetClientHealth", GetHealth}, dvander@2168: {"GetClientTime", GetTimeConnected}, dvander@2168: {"GetClientDataRate", GetDataRate}, dvander@2168: {"IsClentTimingOut", IsTimingOut}, dvander@2168: {"GetClientLatency", GetLatency}, dvander@2168: {"GetClientAvgLatency", GetAvgLatency}, dvander@2168: {"GetClientAvgLoss", GetAvgLoss}, dvander@2168: {"GetClientAvgChoke", GetAvgChoke}, dvander@2168: {"GetClientAvgData", GetAvgData}, dvander@2168: {"GetClientAvgPackets", GetAvgPackets}, dvander@2168: {"GetClientOfUserId", GetClientOfUserId}, dvander@2168: {"ShowActivity", ShowActivity}, dvander@2168: {"ShowActivityEx", ShowActivityEx}, dvander@2168: {"ShowActivity2", ShowActivity2}, dvander@2168: {"KickClient", KickClient}, dvander@2168: {"KickClientEx", KickClientEx}, dvander@2168: {"RunAdminCacheChecks", RunAdminCacheChecks}, dvander@2168: {"NotifyPostAdminCheck", NotifyPostAdminCheck}, dvander@2168: {"IsClientInKickQueue", IsClientInKickQueue}, dvander@2168: {"ProcessTargetString", ProcessTargetString}, dvander@2168: {NULL, NULL} dvander@2168: }; dvander@2168: