#pragma semicolon 1
#pragma newdecls required
#include <sdkhooks>
bool bLate;
int iKills[MAXPLAYERS+1];
float fDmg[MAXPLAYERS+1];
public Plugin myinfo =
{
name = "Round kill & damage stats",
author = "Grey83",
description = "Shows to the player at the end of the each round statistics of kills and damage that he inflicted",
version = "1.0.0",
url = "http://steamcommunity.com/groups/grey83ds"
};
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
bLate = late;
return APLRes_Success;
}
public void OnPluginStart()
{
HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
HookEvent("round_end", Event_End, EventHookMode_PostNoCopy);
HookEvent("player_death", Event_Death);
if(bLate)
{
for(int i = 1; i <= MaxClients; i++) if(IsClientAuthorized(i)) OnClientPostAdminCheck(i);
bLate = false;
}
}
public void OnClientPostAdminCheck(int client)
{
iKills[client] = 0;
fDmg[client] = 0.0;
SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamage);
}
public void OnTakeDamage(int victim, int attacker, int inflictor, float damage, int damagetype)
{
if(((damagetype & DMG_BULLET) || (damagetype & DMG_SLASH) || (damagetype & DMG_BLAST) || (damagetype & DMG_CLUB)
|| (damagetype & DMG_BUCKSHOT)) && IsClientsValid(attacker, victim))
fDmg[attacker] += damage;
}
public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
for(int i = 1; i <= MaxClients; i++)
{
iKills[i] = 0;
fDmg[i] = 0.0;
}
}
public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
static char msg[256];
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i) && fDmg[i])
{
if(!fDmg[i]) Format(msg, 256, "насчитали %i ворон", GetRandomInt(0, 99));
else
{
Format(msg, 256, "нанесли при этом %i урона.", RoundToNearest(fDmg[i]));
if(!iKills[i]) Format(msg, 256, "никого не убили, но %s", msg);
else Format(msg, 256, "убили %i противников и %s", iKills[i], msg);
}
PrintToChat(i, "В течении раунда Вы %s", msg);
}
}
public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
static int attacker;
if(IsClientsValid((attacker = GetClientOfUserId(event.GetInt("attacker"))), GetClientOfUserId(event.GetInt("userid"))))
iKills[attacker]++;
}
stock bool IsClientsValid(int attacker, int victim)
{
static int teamA, teamV;
return IsClientValid(attacker, true) && !IsFakeClient(attacker) && IsClientValid(victim)
&& (teamV = GetClientTeam(victim)) > 1 && (teamA = GetClientTeam(attacker)) > 1 && teamA != teamV;
}
stock bool IsClientValid(int client, bool in_game = false)
{
return 0 < client <= MaxClients && (!in_game || IsClientInGame(client));
}