138 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
#define HITGROUP_GENERIC   0
 | 
						|
#define HITGROUP_HEAD      1
 | 
						|
#define HITGROUP_CHEST     2
 | 
						|
#define HITGROUP_STOMACH   3
 | 
						|
#define HITGROUP_LEFTARM   4
 | 
						|
#define HITGROUP_RIGHTARM  5
 | 
						|
#define HITGROUP_LEFTLEG   6
 | 
						|
#define HITGROUP_RIGHTLEG  7
 | 
						|
 | 
						|
#define LOG_HIT_OFFSET     7
 | 
						|
 | 
						|
#define LOG_HIT_SHOTS      0
 | 
						|
#define LOG_HIT_HITS       1
 | 
						|
#define LOG_HIT_KILLS      2
 | 
						|
#define LOG_HIT_HEADSHOTS  3
 | 
						|
#define LOG_HIT_TEAMKILLS  4
 | 
						|
#define LOG_HIT_DAMAGE     5
 | 
						|
#define LOG_HIT_DEATHS     6
 | 
						|
#define LOG_HIT_GENERIC    7
 | 
						|
#define LOG_HIT_HEAD       8
 | 
						|
#define LOG_HIT_CHEST      9
 | 
						|
#define LOG_HIT_STOMACH    10
 | 
						|
#define LOG_HIT_LEFTARM    11
 | 
						|
#define LOG_HIT_RIGHTARM   12
 | 
						|
#define LOG_HIT_LEFTLEG    13
 | 
						|
#define LOG_HIT_RIGHTLEG   14
 | 
						|
 | 
						|
new Handle:g_weapon_trie = INVALID_HANDLE;
 | 
						|
 | 
						|
CreatePopulateWeaponTrie()
 | 
						|
{
 | 
						|
	// Create a Trie
 | 
						|
	g_weapon_trie = CreateTrie();
 | 
						|
 | 
						|
	// Initial populate
 | 
						|
	for (new i = 0; i < MAX_LOG_WEAPONS; i++)
 | 
						|
	{
 | 
						|
		if (g_weapon_list[i][0] == 0)
 | 
						|
		{
 | 
						|
			// some games have a couple blanks as place holders (so array indexes match with weapon ids)
 | 
						|
			decl String:randomKey[6];
 | 
						|
			Format(randomKey, sizeof(randomKey), "%c%c%c%c%c%c", GetURandomInt(), GetURandomInt(), GetURandomInt(), GetURandomInt(), GetURandomInt(), GetURandomInt());
 | 
						|
			SetTrieValue(g_weapon_trie, randomKey, i);
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
 | 
						|
		SetTrieValue(g_weapon_trie, g_weapon_list[i], i);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
dump_player_stats(client)
 | 
						|
{
 | 
						|
	if (IsClientInGame(client) && IsClientConnected(client))
 | 
						|
	{
 | 
						|
		decl String: player_authid[64];
 | 
						|
		if (!GetClientAuthString(client, player_authid, sizeof(player_authid)))
 | 
						|
		{
 | 
						|
			strcopy(player_authid, sizeof(player_authid), "UNKNOWN");
 | 
						|
		}
 | 
						|
		new player_team_index = GetClientTeam(client);
 | 
						|
 | 
						|
		new player_userid = GetClientUserId(client);
 | 
						|
 | 
						|
		new is_logged;
 | 
						|
		for (new i = 0; (i < MAX_LOG_WEAPONS); i++)
 | 
						|
		{
 | 
						|
			#if defined INS
 | 
						|
			if (g_weapon_stats[client][i][LOG_HIT_HITS] > 0)
 | 
						|
			{
 | 
						|
				LogToGame("\"%N<%d><%s><%s>\" triggered \"weaponstats\" (weapon \"weapon_%s\") (shots \"%d\") (hits \"%d\") (kills \"%d\") (headshots \"%d\") (tks \"%d\") (damage \"%d\") (deaths \"%d\")", client, player_userid, player_authid, g_team_list[player_team_index], g_weapon_list[i], g_weapon_stats[client][i][LOG_HIT_SHOTS], g_weapon_stats[client][i][LOG_HIT_HITS], g_weapon_stats[client][i][LOG_HIT_KILLS], g_weapon_stats[client][i][LOG_HIT_HEADSHOTS], g_weapon_stats[client][i][LOG_HIT_TEAMKILLS], g_weapon_stats[client][i][LOG_HIT_DAMAGE], g_weapon_stats[client][i][LOG_HIT_DEATHS]);
 | 
						|
				LogToGame("\"%N<%d><%s><%s>\" triggered \"weaponstats2\" (weapon \"weapon_%s\") (head \"%d\") (chest \"%d\") (stomach \"%d\") (leftarm \"%d\") (rightarm \"%d\") (leftleg \"%d\") (rightleg \"%d\")", client, player_userid, player_authid, g_team_list[player_team_index], g_weapon_list[i], g_weapon_stats[client][i][LOG_HIT_HEAD], g_weapon_stats[client][i][LOG_HIT_CHEST], g_weapon_stats[client][i][LOG_HIT_STOMACH], g_weapon_stats[client][i][LOG_HIT_LEFTARM], g_weapon_stats[client][i][LOG_HIT_RIGHTARM], g_weapon_stats[client][i][LOG_HIT_LEFTLEG], g_weapon_stats[client][i][LOG_HIT_RIGHTLEG]);
 | 
						|
			#else
 | 
						|
			if (g_weapon_stats[client][i][LOG_HIT_SHOTS] > 0)
 | 
						|
			{
 | 
						|
				#if defined GES
 | 
						|
				LogToGame("\"%N<%d><%s><%s>\" triggered \"weaponstats\" (weapon \"weapon_%s\") (shots \"%d\") (hits \"%d\") (kills \"%d\") (headshots \"%d\") (tks \"%d\") (damage \"%d\") (deaths \"%d\")", client, player_userid, player_authid, g_team_list[player_team_index], g_weapon_loglist[i], g_weapon_stats[client][i][LOG_HIT_SHOTS], g_weapon_stats[client][i][LOG_HIT_HITS], g_weapon_stats[client][i][LOG_HIT_KILLS], g_weapon_stats[client][i][LOG_HIT_HEADSHOTS], g_weapon_stats[client][i][LOG_HIT_TEAMKILLS], g_weapon_stats[client][i][LOG_HIT_DAMAGE], g_weapon_stats[client][i][LOG_HIT_DEATHS]);
 | 
						|
				LogToGame("\"%N<%d><%s><%s>\" triggered \"weaponstats2\" (weapon \"weapon_%s\") (head \"%d\") (chest \"%d\") (stomach \"%d\") (leftarm \"%d\") (rightarm \"%d\") (leftleg \"%d\") (rightleg \"%d\")", client, player_userid, player_authid, g_team_list[player_team_index], g_weapon_loglist[i], g_weapon_stats[client][i][LOG_HIT_HEAD], g_weapon_stats[client][i][LOG_HIT_CHEST], g_weapon_stats[client][i][LOG_HIT_STOMACH], g_weapon_stats[client][i][LOG_HIT_LEFTARM], g_weapon_stats[client][i][LOG_HIT_RIGHTARM], g_weapon_stats[client][i][LOG_HIT_LEFTLEG], g_weapon_stats[client][i][LOG_HIT_RIGHTLEG]);
 | 
						|
				#else
 | 
						|
				LogToGame("\"%N<%d><%s><%s>\" triggered \"weaponstats\" (weapon \"%s\") (shots \"%d\") (hits \"%d\") (kills \"%d\") (headshots \"%d\") (tks \"%d\") (damage \"%d\") (deaths \"%d\")", client, player_userid, player_authid, g_team_list[player_team_index], g_weapon_list[i], g_weapon_stats[client][i][LOG_HIT_SHOTS], g_weapon_stats[client][i][LOG_HIT_HITS], g_weapon_stats[client][i][LOG_HIT_KILLS], g_weapon_stats[client][i][LOG_HIT_HEADSHOTS], g_weapon_stats[client][i][LOG_HIT_TEAMKILLS], g_weapon_stats[client][i][LOG_HIT_DAMAGE], g_weapon_stats[client][i][LOG_HIT_DEATHS]);
 | 
						|
				LogToGame("\"%N<%d><%s><%s>\" triggered \"weaponstats2\" (weapon \"%s\") (head \"%d\") (chest \"%d\") (stomach \"%d\") (leftarm \"%d\") (rightarm \"%d\") (leftleg \"%d\") (rightleg \"%d\")", client, player_userid, player_authid, g_team_list[player_team_index], g_weapon_list[i], g_weapon_stats[client][i][LOG_HIT_HEAD], g_weapon_stats[client][i][LOG_HIT_CHEST], g_weapon_stats[client][i][LOG_HIT_STOMACH], g_weapon_stats[client][i][LOG_HIT_LEFTARM], g_weapon_stats[client][i][LOG_HIT_RIGHTARM], g_weapon_stats[client][i][LOG_HIT_LEFTLEG], g_weapon_stats[client][i][LOG_HIT_RIGHTLEG]);
 | 
						|
				#endif
 | 
						|
			#endif
 | 
						|
				is_logged++;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if (is_logged > 0)
 | 
						|
		{
 | 
						|
			reset_player_stats(client);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
reset_player_stats(client)
 | 
						|
{
 | 
						|
	for (new i = 0; (i < MAX_LOG_WEAPONS); i++)
 | 
						|
	{
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_SHOTS]     = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_HITS]      = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_KILLS]     = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_HEADSHOTS] = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_TEAMKILLS] = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_DAMAGE]    = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_DEATHS]    = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_GENERIC]   = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_HEAD]      = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_CHEST]     = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_STOMACH]   = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_LEFTARM]   = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_RIGHTARM]  = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_LEFTLEG]   = 0;
 | 
						|
		g_weapon_stats[client][i][LOG_HIT_RIGHTLEG]  = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
stock get_weapon_index(const String:weapon_name[])
 | 
						|
{
 | 
						|
	new index = -1;
 | 
						|
	GetTrieValue(g_weapon_trie, weapon_name, index);
 | 
						|
	return index;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
WstatsDumpAll()
 | 
						|
{
 | 
						|
	for (new i = 1; i <= MaxClients; i++)
 | 
						|
	{
 | 
						|
		dump_player_stats(i);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
OnPlayerDisconnect(client)
 | 
						|
{
 | 
						|
	if(client > 0 && IsClientInGame(client))
 | 
						|
	{
 | 
						|
		dump_player_stats(client);
 | 
						|
		reset_player_stats(client);
 | 
						|
	}
 | 
						|
} |