430 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			430 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
#pragma semicolon 1
 | 
						|
 | 
						|
#include <sourcemod>
 | 
						|
#include <cstrike>
 | 
						|
#include <sdkhooks>
 | 
						|
#include <sdktools>
 | 
						|
#include <multicolors>
 | 
						|
 | 
						|
#undef REQUIRE_PLUGIN
 | 
						|
#tryinclude <zombiereloaded>
 | 
						|
#define REQUIRE_PLUGIN
 | 
						|
 | 
						|
#pragma newdecls required
 | 
						|
 | 
						|
#define DMGINSTEADOFHITS
 | 
						|
#define CASHPERHIT 4
 | 
						|
 | 
						|
#if defined DMGINSTEADOFHITS
 | 
						|
ConVar g_cvarDamageMultiplier = null;
 | 
						|
#endif
 | 
						|
 | 
						|
ConVar g_cvarInfectionGain;
 | 
						|
ConVar g_cvarMotherZombieWinGain;
 | 
						|
ConVar g_cvarHumanWinGain;
 | 
						|
ConVar g_cvarHumanTriggerGain;
 | 
						|
ConVar g_cvarRoundStartCash;
 | 
						|
ConVar g_cvarStartCash;
 | 
						|
ConVar g_cvarMaxCash;
 | 
						|
ConVar g_cvarCashRoundReset;
 | 
						|
 | 
						|
bool g_bZRLoaded;
 | 
						|
bool g_bMapEnd;
 | 
						|
bool g_bTriggerCooldown;
 | 
						|
bool g_bDisabled[2048];
 | 
						|
bool g_bAwardHumans;
 | 
						|
bool g_bAwardZombies;
 | 
						|
 | 
						|
bool g_bMotherZombie[MAXPLAYERS + 1];
 | 
						|
 | 
						|
int g_iCash[MAXPLAYERS + 1];
 | 
						|
int g_iDamageCash[MAXPLAYERS + 1];
 | 
						|
int g_iCashReconnect[256];
 | 
						|
int g_iSteamID[256];
 | 
						|
 | 
						|
public Plugin myinfo =
 | 
						|
{
 | 
						|
	name = "Cash Manager",
 | 
						|
	author = "Obus + Dogan",
 | 
						|
	description = "Manage Cash with additional gains and limits",
 | 
						|
	version = "3.0.0",
 | 
						|
	url = ""
 | 
						|
};
 | 
						|
 | 
						|
public void OnPluginStart()
 | 
						|
{
 | 
						|
#if defined DMGINSTEADOFHITS
 | 
						|
	g_cvarDamageMultiplier = CreateConVar("sm_damagecashmultiplier", "1.0", "Multiplier that decides how much cash a client shall receive upon dealing damage");
 | 
						|
	g_cvarInfectionGain = CreateConVar("sm_infectioncashgain", "500", "Cash a client shall receive upon infection [Dependency: sm_cashroundreset]");
 | 
						|
	g_cvarMotherZombieWinGain = CreateConVar("sm_motherzombiecashgain", "2500", "Cash a client shall receive upon zombie win while being motherzombie [Dependency: sm_cashroundreset]");
 | 
						|
	g_cvarHumanWinGain = CreateConVar("sm_humanwincashgain", "2500", "Cash a human shall receive upon human win [Dependency: sm_cashroundreset]");
 | 
						|
	g_cvarHumanTriggerGain = CreateConVar("sm_humantriggercashgain", "200", "Cash a human shall receive upon triggering");
 | 
						|
	g_cvarRoundStartCash = CreateConVar("sm_roundstartcash", "2500", "Minimum cash a client starts the round [Dependency: sm_cashroundreset]");
 | 
						|
	g_cvarStartCash = CreateConVar("sm_startcash", "12500", "Cash a client starts the map or round [for round Dependency: sm_cashroundreset]");
 | 
						|
	g_cvarMaxCash = CreateConVar("sm_maxcash", "45000", "Max cash you can store");
 | 
						|
	g_cvarCashRoundReset = CreateConVar("sm_cashroundreset", "0", "1 = CashManager resets the cash each round, 0 = CashManager doesn't reset the cash at all during a map", FCVAR_NONE, true, 0.0, true, 1.0);
 | 
						|
 | 
						|
	AutoExecConfig(true, "plugin.CashManager");
 | 
						|
#endif
 | 
						|
 | 
						|
	HookEvent("player_hurt", EventHook_PlayerHurt, EventHookMode_Pre);
 | 
						|
	HookEvent("player_death", EventHook_PlayerDeath, EventHookMode_Pre);
 | 
						|
	HookEvent("player_spawn", EventHook_PlayerSpawn, EventHookMode_Post);
 | 
						|
	HookEvent("round_end", EventHook_RoundEnd, EventHookMode_Post);
 | 
						|
	HookEvent("round_start", EventHook_RoundStart, EventHookMode_Post);
 | 
						|
 | 
						|
	HookEntityOutput("trigger_once", "OnStartTouch", OnStartTouch);
 | 
						|
	HookEntityOutput("func_button", "OnPressed", OnPressed);
 | 
						|
 | 
						|
	g_bMapEnd = false;
 | 
						|
}
 | 
						|
 | 
						|
public void OnAllPluginsLoaded()
 | 
						|
{
 | 
						|
	g_bZRLoaded = LibraryExists("zombiereloaded");
 | 
						|
}
 | 
						|
 | 
						|
public void OnLibraryAdded(const char[] sName)
 | 
						|
{
 | 
						|
	if(strcmp(sName, "zombiereloaded", false) == 0)
 | 
						|
		g_bZRLoaded = true;
 | 
						|
}
 | 
						|
 | 
						|
public void OnLibraryRemoved(const char[] sName)
 | 
						|
{
 | 
						|
	if(strcmp(sName, "zombiereloaded", false) == 0)
 | 
						|
		g_bZRLoaded = false;
 | 
						|
}
 | 
						|
 | 
						|
public void OnMapStart()
 | 
						|
{
 | 
						|
	for(int i = 0; i < 256; i++)
 | 
						|
	{
 | 
						|
		g_iSteamID[i] = 0;
 | 
						|
		g_iCashReconnect[i] = -1;
 | 
						|
	}
 | 
						|
 | 
						|
	for(int i = 1; i <= MaxClients; i++)
 | 
						|
		g_iCash[i] = -1;
 | 
						|
 | 
						|
	g_bMapEnd = false;
 | 
						|
}
 | 
						|
 | 
						|
public void OnMapEnd()
 | 
						|
{
 | 
						|
	g_bMapEnd = true;
 | 
						|
}
 | 
						|
 | 
						|
public void OnClientPutInServer(int client)
 | 
						|
{
 | 
						|
	if(IsFakeClient(client) || g_bMapEnd || g_cvarCashRoundReset.BoolValue)
 | 
						|
		return;
 | 
						|
 | 
						|
	int iSteamID = GetSteamAccountID(client);
 | 
						|
 | 
						|
	g_iCash[client] = g_cvarStartCash.IntValue;
 | 
						|
	SetEntProp(client, Prop_Send, "m_iAccount", g_cvarStartCash.IntValue);
 | 
						|
 | 
						|
	for(int i = 0; i < 256; i++)
 | 
						|
	{
 | 
						|
		if(iSteamID == g_iSteamID[i])
 | 
						|
		{
 | 
						|
			g_iCash[client] = g_iCashReconnect[i];
 | 
						|
			SetEntProp(client, Prop_Send, "m_iAccount", g_iCash[client]);
 | 
						|
			CreateTimer(3.0, MessageReconnect, client);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public Action MessageReconnect(Handle timer, int client)
 | 
						|
{
 | 
						|
	if(!IsClientInGame(client))
 | 
						|
		return Plugin_Handled;
 | 
						|
 | 
						|
	CPrintToChat(client, "{cyan}[UNLOZE CashManager] {white}Restored your cash: {yellow}$%d{white}.", g_iCash[client]);
 | 
						|
 | 
						|
	return Plugin_Handled;
 | 
						|
}
 | 
						|
 | 
						|
public void OnClientDisconnect(int client)
 | 
						|
{
 | 
						|
	g_iDamageCash[client] = 0;
 | 
						|
 | 
						|
	if(IsFakeClient(client) || !IsClientInGame(client) || g_cvarCashRoundReset.BoolValue)
 | 
						|
		return;
 | 
						|
 | 
						|
	int iSteamID = GetSteamAccountID(client);
 | 
						|
 | 
						|
	for(int i = 0; i < 256; i++)
 | 
						|
	{
 | 
						|
		if(iSteamID == g_iSteamID[i])
 | 
						|
		{
 | 
						|
			g_iCashReconnect[i] = GetEntProp(client, Prop_Send, "m_iAccount");
 | 
						|
			return;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	for(int i = 0; i < 256; i++)
 | 
						|
	{
 | 
						|
		if(g_iSteamID[i] == 0)
 | 
						|
		{
 | 
						|
			g_iSteamID[i] = iSteamID;
 | 
						|
			g_iCashReconnect[i] = GetEntProp(client, Prop_Send, "m_iAccount");
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	g_iCash[client] = -1;
 | 
						|
	g_bMotherZombie[client] = false;
 | 
						|
}
 | 
						|
 | 
						|
public void ZR_OnClientInfected(int client, int attacker, bool motherInfect, bool respawnOverride, bool respawn)
 | 
						|
{
 | 
						|
	if(g_cvarCashRoundReset.BoolValue)
 | 
						|
		return;
 | 
						|
 | 
						|
	g_bMotherZombie[client] = motherInfect;
 | 
						|
 | 
						|
	if(!motherInfect && IsValidClient(attacker) && !(GetEntProp(attacker, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue))
 | 
						|
	{
 | 
						|
		SetEntProp(attacker, Prop_Send, "m_iAccount", GetEntProp(attacker, Prop_Send, "m_iAccount") + g_cvarInfectionGain.IntValue);
 | 
						|
		CPrintToChat(attacker, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for infecting an Human.", g_cvarInfectionGain.IntValue);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public void OnStartTouch(const char[] sOutput, int iCaller, int iActivator, float fDelay)
 | 
						|
{
 | 
						|
	if (!IsValidClient(iActivator))
 | 
						|
		return;
 | 
						|
 | 
						|
	if (g_bDisabled[iCaller] || g_bTriggerCooldown)
 | 
						|
		return;
 | 
						|
 | 
						|
	if (!(ZR_IsClientHuman(iActivator)))
 | 
						|
		return;
 | 
						|
 | 
						|
	g_bDisabled[iCaller] = true;
 | 
						|
	g_bTriggerCooldown = true;
 | 
						|
 | 
						|
	float fTriggerCD = GetConVarFloat(FindConVar("sm_trigger_reward_cd"));
 | 
						|
 | 
						|
	CreateTimer(fTriggerCD, ResetTriggerCD);
 | 
						|
 | 
						|
	if(!(GetEntProp(iActivator, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue))
 | 
						|
	{
 | 
						|
		SetEntProp(iActivator, Prop_Send, "m_iAccount", GetEntProp(iActivator, Prop_Send, "m_iAccount") + g_cvarHumanTriggerGain.IntValue);
 | 
						|
		CPrintToChat(iActivator, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for getting a Trigger.", g_cvarHumanTriggerGain.IntValue);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public void OnPressed(const char[] sOutput, int iCaller, int iActivator, float fDelay)
 | 
						|
{
 | 
						|
	if(!IsValidClient(iActivator))
 | 
						|
		return;
 | 
						|
 | 
						|
	if (g_bDisabled[iCaller] || g_bTriggerCooldown)
 | 
						|
		return;
 | 
						|
 | 
						|
	if (!(ZR_IsClientHuman(iActivator)))
 | 
						|
		return;
 | 
						|
 | 
						|
	int iParent = INVALID_ENT_REFERENCE;
 | 
						|
	if ((iParent = GetEntPropEnt(iCaller, Prop_Data, "m_hMoveParent")) != INVALID_ENT_REFERENCE)
 | 
						|
	{
 | 
						|
		char sClassname[64];
 | 
						|
		GetEdictClassname(iParent, sClassname, sizeof(sClassname));
 | 
						|
 | 
						|
		if (strncmp(sClassname, "weapon_", 7, false) == 0)
 | 
						|
			return;
 | 
						|
	}
 | 
						|
 | 
						|
	g_bDisabled[iCaller] = true;
 | 
						|
	g_bTriggerCooldown= true;
 | 
						|
 | 
						|
	float fTriggerCD = GetConVarFloat(FindConVar("sm_trigger_reward_cd"));
 | 
						|
 | 
						|
	CreateTimer(fTriggerCD, ResetTriggerCD);
 | 
						|
 | 
						|
	if(!(GetEntProp(iActivator, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue))
 | 
						|
	{
 | 
						|
		SetEntProp(iActivator, Prop_Send, "m_iAccount", GetEntProp(iActivator, Prop_Send, "m_iAccount") + g_cvarHumanTriggerGain.IntValue);
 | 
						|
		CPrintToChat(iActivator, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for getting a Trigger.", g_cvarHumanTriggerGain.IntValue);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public Action ResetTriggerCD(Handle timer)
 | 
						|
{
 | 
						|
	g_bTriggerCooldown = false;
 | 
						|
}
 | 
						|
 | 
						|
public Action EventHook_RoundEnd(Event hEvent, const char[] sEventName, bool bDontBroadcast)
 | 
						|
{
 | 
						|
	if(g_cvarCashRoundReset.BoolValue)
 | 
						|
		return Plugin_Handled;
 | 
						|
 | 
						|
	g_bAwardHumans = (hEvent.GetInt("winner") == CS_TEAM_CT);
 | 
						|
	g_bAwardZombies = (hEvent.GetInt("winner") == CS_TEAM_T);
 | 
						|
 | 
						|
	RequestFrame(RequestFrame_Callback3);
 | 
						|
 | 
						|
	return Plugin_Handled;
 | 
						|
}
 | 
						|
 | 
						|
public Action EventHook_RoundStart(Event hEvent, const char[] sEventName, bool bDontBroadcast)
 | 
						|
{
 | 
						|
	for(int i = 1; i <= MaxClients; i++)
 | 
						|
	{
 | 
						|
		g_bMotherZombie[i] = false;
 | 
						|
		g_iDamageCash[i] = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	for(int i = 0; i < 2048; i++)
 | 
						|
		g_bDisabled[i] = false;
 | 
						|
}
 | 
						|
 | 
						|
public Action EventHook_PlayerHurt(Event hEvent, const char[] sEventName, bool bDontBroadcast)
 | 
						|
{
 | 
						|
	if(!g_bZRLoaded)
 | 
						|
		return Plugin_Continue;
 | 
						|
 | 
						|
	int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
 | 
						|
 | 
						|
	if(!IsValidClient(iAttacker) || !ZR_IsClientHuman(iAttacker))
 | 
						|
		return Plugin_Continue;
 | 
						|
 | 
						|
	int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));
 | 
						|
 | 
						|
	if(!IsValidClient(iVictim) || !ZR_IsClientZombie(iVictim))
 | 
						|
		return Plugin_Continue;
 | 
						|
 | 
						|
	char sWeapon[16];
 | 
						|
 | 
						|
	hEvent.GetString("weapon", sWeapon, sizeof(sWeapon));
 | 
						|
 | 
						|
	if(!strncmp(sWeapon, "knife", 5))
 | 
						|
		return Plugin_Continue;
 | 
						|
 | 
						|
	if(GetEntProp(iAttacker, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)
 | 
						|
		return Plugin_Continue;
 | 
						|
 | 
						|
#if defined DMGINSTEADOFHITS
 | 
						|
	float fDamage = float(hEvent.GetInt("dmg_health"));
 | 
						|
 | 
						|
	SetEntProp(iAttacker, Prop_Send, "m_iAccount", GetEntProp(iAttacker, Prop_Send, "m_iAccount") + RoundToNearest(fDamage > 0.0 ? fDamage * g_cvarDamageMultiplier.FloatValue : 1.0));
 | 
						|
	g_iDamageCash[iAttacker] = g_iDamageCash[iAttacker] + RoundToNearest(fDamage > 0.0 ? fDamage * g_cvarDamageMultiplier.FloatValue : 1.0);
 | 
						|
 | 
						|
	if(g_iDamageCash[iAttacker] >= 1000)
 | 
						|
	{
 | 
						|
		g_iDamageCash[iAttacker] = 0;
 | 
						|
		CPrintToChat(iAttacker, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$1000{white} for damaging the Zombies.");
 | 
						|
	}
 | 
						|
#else
 | 
						|
	SetEntProp(iAttacker, Prop_Send, "m_iAccount", GetEntProp(iAttacker, Prop_Send, "m_iAccount") + CASHPERHIT);
 | 
						|
#endif
 | 
						|
 | 
						|
	return Plugin_Continue;
 | 
						|
}
 | 
						|
 | 
						|
public Action EventHook_PlayerDeath(Event hEvent, const char[] sEventName, bool bDontBroadcast)
 | 
						|
{
 | 
						|
	int client = GetClientOfUserId(hEvent.GetInt("userid"));
 | 
						|
	int attacker = GetClientOfUserId(hEvent.GetInt("attacker"));
 | 
						|
 | 
						|
	if(!IsValidClient(attacker))
 | 
						|
		return Plugin_Continue;
 | 
						|
 | 
						|
	if(!g_cvarCashRoundReset.BoolValue)
 | 
						|
	{
 | 
						|
		g_iCash[client] = GetEntProp(client, Prop_Send, "m_iAccount");
 | 
						|
 | 
						|
		char sWeapon[16];
 | 
						|
		hEvent.GetString("weapon", sWeapon, sizeof(sWeapon));
 | 
						|
 | 
						|
		if(ZR_IsClientZombie(attacker) && StrEqual(sWeapon, "knife", true) && !(GetEntProp(attacker, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) //nemesis kill
 | 
						|
		{
 | 
						|
			SetEntProp(attacker, Prop_Send, "m_iAccount", GetEntProp(attacker, Prop_Send, "m_iAccount") + g_cvarInfectionGain.IntValue);
 | 
						|
			CPrintToChat(attacker, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for killing an Human.", g_cvarInfectionGain.IntValue);
 | 
						|
		}
 | 
						|
		else if(ZR_IsClientZombie(attacker)) // regular infection
 | 
						|
		{
 | 
						|
			return Plugin_Continue;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	int iPacked = (attacker<<16) | (GetEntProp(attacker, Prop_Send, "m_iAccount")&0xFFFF);
 | 
						|
 | 
						|
	RequestFrame(RequestFrame_Callback2, iPacked);
 | 
						|
 | 
						|
	return Plugin_Continue;
 | 
						|
}
 | 
						|
 | 
						|
public Action EventHook_PlayerSpawn(Event hEvent, const char[] sEventName, bool bDontBroadcast)
 | 
						|
{
 | 
						|
	int client = GetClientOfUserId(hEvent.GetInt("userid"));
 | 
						|
 | 
						|
	RequestFrame(RequestFrame_Callback, client);
 | 
						|
 | 
						|
	return Plugin_Continue;
 | 
						|
}
 | 
						|
 | 
						|
public void RequestFrame_Callback(int client)
 | 
						|
{
 | 
						|
	if(!IsValidClient(client))
 | 
						|
		return;
 | 
						|
 | 
						|
	if(g_cvarCashRoundReset.BoolValue)
 | 
						|
	{
 | 
						|
		SetEntProp(client, Prop_Send, "m_iAccount", g_cvarStartCash.IntValue);
 | 
						|
		CPrintToChat(client, "{cyan}[UNLOZE CashManager] {white}Resetting your Cash to {yellow}$%d{white}.", g_cvarStartCash.IntValue);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	if(g_iCash[client] >= 0 && g_iCash[client] < g_cvarRoundStartCash.IntValue) //Player is (almost) broke
 | 
						|
		SetEntProp(client, Prop_Send, "m_iAccount", g_cvarRoundStartCash.IntValue);
 | 
						|
	else if(g_iCash[client] >= 0 && g_iCash[client] < g_cvarMaxCash.IntValue) //Player isn't broke
 | 
						|
		SetEntProp(client, Prop_Send, "m_iAccount", g_iCash[client]);
 | 
						|
	else if(g_iCash[client] >= 0 && g_iCash[client] >= g_cvarMaxCash.IntValue) //Player hit limit
 | 
						|
		SetEntProp(client, Prop_Send, "m_iAccount", g_cvarMaxCash.IntValue);
 | 
						|
 | 
						|
	return;
 | 
						|
}
 | 
						|
 | 
						|
public void RequestFrame_Callback2(int iPacked)
 | 
						|
{
 | 
						|
	int iOldCash = iPacked&0xFFFF;
 | 
						|
	int iAttacker = iPacked>>16;
 | 
						|
 | 
						|
	SetEntProp(iAttacker, Prop_Send, "m_iAccount", iOldCash);
 | 
						|
}
 | 
						|
 | 
						|
public void RequestFrame_Callback3()
 | 
						|
{
 | 
						|
	for(int i = 1; i <= MaxClients; i++)
 | 
						|
	{
 | 
						|
		if(!IsClientInGame(i))
 | 
						|
			continue;
 | 
						|
 | 
						|
		if(IsPlayerAlive(i) && GetClientTeam(i) == CS_TEAM_CT && g_bAwardHumans && !(GetEntProp(i, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue))
 | 
						|
		{
 | 
						|
			SetEntProp(i, Prop_Send, "m_iAccount", GetEntProp(i, Prop_Send, "m_iAccount") + g_cvarHumanWinGain.IntValue);
 | 
						|
			CPrintToChat(i, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for winning as Human.", g_cvarHumanWinGain.IntValue);
 | 
						|
			g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount");
 | 
						|
		}
 | 
						|
		else if(IsPlayerAlive(i) && GetClientTeam(i) == CS_TEAM_T && g_bAwardZombies && g_bMotherZombie[i] && !(GetEntProp(i, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue))
 | 
						|
		{
 | 
						|
			SetEntProp(i, Prop_Send, "m_iAccount", GetEntProp(i, Prop_Send, "m_iAccount") + g_cvarMotherZombieWinGain.IntValue);
 | 
						|
			CPrintToChat(i, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for winning as MotherZombie.", g_cvarMotherZombieWinGain.IntValue);
 | 
						|
			g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount");
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount");
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
stock bool IsValidClient(int client)
 | 
						|
{
 | 
						|
	return (client > 0 && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client));
 | 
						|
} |