Помощ със Statsx Shell

Въпроси и проблеми свързани с AMXModX.
Аватар
YankoNL
Извън линия
Потребител
Потребител
Мнения: 163
Регистриран на: 06 Апр 2017, 09:07
Местоположение: Варна
Се отблагодари: 22 пъти
Получена благодарност: 9 пъти

Помощ със Statsx Shell

Мнение от YankoNL » 07 Май 2022, 16:10

Здравейте, дълго време ползвах следния плъгин и днес реших да го променя драстично като махна доста от нещата. Всичко уж работи както си трябва, но когато използвам командите /rank или /me - в чата не се показва нищо. Нещата свързани с MOTD работят както си трябва. Моля, ако може някой да даде акъл къде бъркам и какво трябва да направя - да сподели.

Ето и кода който съм едитнал:

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <csx>
#include <cstrike>
#include <cromchat>

#define STATSX_SHELL_VER "2.0.3 (Custom)"
//--------------------------------

#define MAXSLOTS 32

// HUD statistics minimum duration, in seconds, to trigger the display logic.
#define HUD_MIN_DURATION    0.2

// Config plugin constants.
#define MODE_HUD_DELAY      0   // Make a 0.01 sec delay on HUD reset process.

// You can also manualy enable or disable these options by setting them to 1
// For example:
// public ShowAttackers = 1
// However amx_statscfg command is recommended

public KillerChat
public ShowAttackers
public ShowVictims
public ShowKiller
public ShowTeamScore
public ShowTotalStats
public ShowMostDisruptive
public ShowBestScore
public EndPlayer
public EndTop15
public EndMapTop
public SayHP
public SayStatsMe
public SayRankStats
public SayMe
public SayRank
public SayReport
public SayScore
public SayTop15
public SayMapTop
public SayHS
public SayKnife
public SayGrenade
public SayStatsAll
public ShowStats
public ShowDistHS
public SpecRankInfo

// Standard Contstants.
#define MAX_TEAMS               2
#define MAX_PLAYERS             32

#define MAX_NAME_LENGTH         32
#define MAX_WEAPON_LENGTH       31
#define MAX_TEXT_LENGTH         255
#define MAX_BUFFER_LENGTH       2047

// User stats parms id
#define STATS_KILLS             0
#define STATS_DEATHS            1
#define STATS_HS                2
#define STATS_TKS               3
#define STATS_SHOTS             4
#define STATS_HITS              5
#define STATS_DAMAGE            6

// Global player flags.
new BODY_PART[8][] =
{
	"WHOLEBODY", 
	"HEAD", 
	"CHEST", 
	"STOMACH", 
	"LEFTARM", 
	"RIGHTARM", 
	"LEFTLEG", 
	"RIGHTLEG"
}

new MM_BODY_PART[8][] =
{
	"WHOLEBODY", 
	"HEAD", 
	"CHEST", 
	"STOMACH", 
	"MM_LEFTARM", 
	"MM_RIGHTARM", 
	"MM_LEFTLEG", 
	"MM_RIGHTLEG"
}

// Killer information, save killer info at the time when player is killed.
#define KILLED_KILLER_ID        0   // Killer userindex/user-ID
#define KILLED_KILLER_HEALTH    1   // Killer's health
#define KILLED_KILLER_ARMOUR    2   // Killer's armour
#define KILLED_TEAM             3   // Killer's team
#define KILLED_KILLER_STATSFIX  4   // Fix to register the last hit/kill

new g_izKilled[MAX_PLAYERS][5]

// Menu variables and configuration
#define MAX_PPL_MENU_ACTIONS    2   // Number of player menu actions
#define PPL_MENU_OPTIONS        7   // Number of player options per displayed menu

new g_iPluginMode                                   = 0

new g_izUserMenuPosition[MAX_PLAYERS]               = {0, ...}
new g_izUserMenuAction[MAX_PLAYERS]                 = {0, ...}
new g_izUserMenuPlayers[MAX_PLAYERS][32]

new g_izSpecMode[MAX_PLAYERS]                       = {0, ...}

new g_izShowStatsFlags[MAX_PLAYERS]                 = {0, ...}
new g_izStatsSwitch[MAX_PLAYERS]                    = {0, ...}
new Float:g_fzShowUserStatsTime[MAX_PLAYERS]        = {0.0, ...}

new Float:g_fStartGame                              = 0.0
new g_izTeamScore[MAX_TEAMS]                        = {0, ...}
new g_izTeamEventScore[MAX_TEAMS]                   = {0, ...}
new g_izTeamRndStats[MAX_TEAMS][8]
new g_izTeamGameStats[MAX_TEAMS][8]
new g_izUserAttackerDistance[MAX_PLAYERS]           = {0, ...}
new g_izUserVictimDistance[MAX_PLAYERS][MAX_PLAYERS]
new g_izUserRndName[MAX_PLAYERS][MAX_NAME_LENGTH + 1]
new g_izUserRndStats[MAX_PLAYERS][8]
new g_izUserGameStats[MAX_PLAYERS][8]

// Common buffer to improve performance, as Small always zero-initializes all vars
new g_sBuffer[MAX_BUFFER_LENGTH + 1]                = ""
new g_sScore[MAX_TEXT_LENGTH + 1]                   = ""

new t_sText[MAX_TEXT_LENGTH + 1]                    = ""
new t_sName[MAX_NAME_LENGTH + 1]                    = ""
new t_sWpn[MAX_WEAPON_LENGTH + 1]                   = ""

new g_HudSync_SpecInfo

#define MAX_SORT_COUNT 100

new bool:szTrigger = true

new iTopX, iTopEnd, iDesign, pcvar_style, pcvar_design, pcvar_dmg, pcvar_hs, pcvar_topx

new g_Statsx_Shell_Cvars[9][] =
{
	"csstats_rank",
	"csstats_maxsize",
	"amx_statsx_duration",
	"amx_statsx_freeze",
	"amx_statsx_shell_mode",
	"amx_statsx_design",
	"amx_statsx_top_dmg_enabled",
	"amx_statsx_top_hs_enabled",
	"amx_statsx_top_topx_enabled"
}

// Themes
#define STATSX_SHELL_DESIGN_MAX 13

#define STATSX_SHELL_DESIGN1_STYLE "<meta charset=UTF-8><style>body{background:#112233;font-family:Arial}th{background:#558866;color:#FFF;padding:10px 2px;text-align:left}td{padding:4px 3px}table{background:#EEEECC;font-size:12px;font-family:Arial}h2,h3{color:#FFF;font-family:Verdana}#c{background:#E2E2BC}img{height:10px;background:#09F;margin:0 3px}#r{height:10px;background:#B6423C}#clr{background:none;color:#FFF;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN2_STYLE "<meta charset=UTF-8><style>body{font-family:Arial}th{background:#575757;color:#FFF;padding:5px;border-bottom:2px #BCE27F solid;text-align:left}td{padding:3px;border-bottom:1px #E7F0D0 solid}table{color:#3C9B4A;background:#FFF;font-size:12px}h2,h3{color:#333;font-family:Verdana}#c{background:#F0F7E2}img{height:10px;background:#62B054;margin:0 3px}#r{height:10px;background:#717171}#clr{background:none;color:#575757;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN3_STYLE "<meta charset=UTF-8><style>body{background:#E6E6E6;font-family:Verdana}th{background:#F5F5F5;color:#A70000;padding:6px;text-align:left}td{padding:2px 6px}table{color:#333;background:#E6E6E6;font-size:10px;font-family:Georgia;border:2px solid #D9D9D9}h2,h3{color:#333;}#c{background:#FFF}img{height:10px;background:#14CC00;margin:0 3px}#r{height:10px;background:#CC8A00}#clr{background:none;color:#A70000;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN4_STYLE "<meta charset=UTF-8><style>body{background:#E8EEF7;margin:2px;font-family:Tahoma}th{color:#0000CC;padding:3px}tr{text-align:left;background:#E8EEF7}td{padding:3px}table{background:#CCC;font-size:11px}h2,h3{font-family:Verdana}img{height:10px;background:#09F;margin:0 3px}#r{height:10px;background:#B6423C}#clr{background:none;color:#000;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN5_STYLE "<meta charset=UTF-8><style>body{background:#555;font-family:Arial}th{border-left:1px solid #ADADAD;border-top:1px solid #ADADAD}table{background:#3C3C3C;font-size:11px;color:#FFF;border-right:1px solid #ADADAD;border-bottom:1px solid #ADADAD;padding:3px}h2,h3{color:#FFF}#c{background:#FF9B00;color:#000}img{height:10px;background:#00E930;margin:0 3px}#r{height:10px;background:#B6423C}#clr{background:none;color:#FFF;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN6_STYLE "<meta charset=UTF-8><style>body{background:#FFF;font-family:Tahoma}th{background:#303B4A;color:#FFF}table{padding:6px 2px;background:#EFF1F3;font-size:12px;color:#222;border:1px solid #CCC}h2,h3{color:#222}#c{background:#E9EBEE}img{height:7px;background:#F8931F;margin:0 3px}#r{height:7px;background:#D2232A}#clr{background:none;color:#303B4A;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN7_STYLE "<meta charset=UTF-8><style>body{background:#FFF;font-family:Verdana}th{background:#2E2E2E;color:#FFF;text-align:left}table{padding:6px 2px;background:#FFF;font-size:11px;color:#333;border:1px solid #CCC}h2,h3{color:#333}#c{background:#F0F0F0}img{height:7px;background:#444;margin:0 3px}#r{height:7px;background:#999}#clr{background:none;color:#2E2E2E;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN8_STYLE "<meta charset=UTF-8><style>body{background:#242424;margin:20px;font-family:Tahoma}th{background:#2F3034;color:#BDB670;text-align:left} table{padding:4px;background:#4A4945;font-size:10px;color:#FFF}h2,h3{color:#D2D1CF}#c{background:#3B3C37}img{height:12px;background:#99CC00;margin:0 3px}#r{height:12px;background:#999900}#clr{background:none;color:#FFF;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN9_STYLE "<meta charset=UTF-8><style>body{background:#FFF;font-family:Tahoma}th{background:#056B9E;color:#FFF;padding:3px;text-align:left;border-top:4px solid #3986AC}td{padding:2px 6px}table{color:#006699;background:#FFF;font-size:12px;border:2px solid #006699}h2,h3{color:#F69F1C;}#c{background:#EFEFEF}img{height:5px;background:#1578D3;margin:0 3px}#r{height:5px;background:#F49F1E}#clr{background:none;color:#056B9E;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN10_STYLE "<meta charset=UTF-8><style>body{background:#4C5844;font-family:Tahoma}th{background:#1E1E1E;color:#C0C0C0;padding:2px;text-align:left;}td{padding:2px 10px}table{color:#AAC0AA;background:#424242;font-size:13px}h2,h3{color:#C2C2C2;font-family:Tahoma}#c{background:#323232}img{height:3px;background:#B4DA45;margin:0 3px}#r{height:3px;background:#6F9FC8}#clr{background:none;color:#FFF;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN11_STYLE "<meta charset=UTF-8><style>body{background:#F2F2F2;font-family:Arial}th{background:#175D8B;color:#FFF;padding:7px;text-align:left}td{padding:3px;border-bottom:1px #BFBDBD solid}table{color:#153B7C;background:#F4F4F4;font-size:11px;border:1px solid #BFBDBD}h2,h3{color:#153B7C}#c{background:#ECECEC}img{height:8px;background:#54D143;margin:0 3px}#r{height:8px;background:#C80B0F}#clr{background:none;color:#175D8B;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN12_STYLE "<meta charset=UTF-8><style>body{background:#283136;font-family:Arial}th{background:#323B40;color:#6ED5FF;padding:10px 2px;text-align:left}td{padding:4px 3px;border-bottom:1px solid #DCDCDC}table{background:#EDF1F2;font-size:10px;border:2px solid #505A62}h2,h3{color:#FFF}img{height:10px;background:#A7CC00;margin:0 3px}#r{height:10px;background:#CC3D00}#clr{background:none;color:#6ED5FF;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN13_STYLE "<meta charset=UTF-8><style>body{background:#220000;font-family:Tahoma}th{background:#3E0909;color:#FFF;padding:5px 2px;text-align:left;border-bottom:1px solid #DEDEDE}td{padding:2px 2px;}table{background:#FFF;font-size:11px;border:1px solid #791616}h2,h3{color:#FFF}#c{background:#F4F4F4;color:#7B0000}img{height:7px;background:#a00000;margin:0 3px}#r{height:7px;background:#181818}#clr{background:none;color:#CFCFCF;font-size:20px;border:0}</style>"

#define STATSX_SHELL_DEFAULT_STYLE "<meta charset=UTF-8><style>body{background:#000}tr{text-align:left}table{font-size:13px;color:#FFB000;padding:2px}h2,h3{color:#FFF;font-family:Verdana}img{height:5px;background:#0000FF;margin:0 3px}#r{height:5px;background:#FF0000}</style>"


//--------------------------------
// Initialize
//--------------------------------
public plugin_init()
{
	// Register plugin.
	register_plugin("StatsX Custom (YankoNL Edit)", STATSX_SHELL_VER, "AMXX Dev Team")
	register_dictionary("statsx_custom.txt")
	
	register_cvar("statsx_shell_ver", STATSX_SHELL_VER, FCVAR_SPONLY | FCVAR_SERVER)
	
	// Random design
	iDesign = random_num(1, STATSX_SHELL_DESIGN_MAX)
	
	pcvar_style = register_cvar("amx_statsx_shell_mode", "1")
	pcvar_design = register_cvar("amx_statsx_design", "1")
	
	pcvar_dmg = register_cvar("amx_statsx_top_dmg_enabled", "1")
	
	pcvar_hs = register_cvar("amx_statsx_top_hs_enabled", "1")
	
	pcvar_topx = register_cvar("amx_statsx_top_topx_enabled", "1")
	
	// Register events.
	register_event("TextMsg", "eventStartGame", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
	register_event("ResetHUD", "eventResetHud", "be")
	register_event("RoundTime", "eventStartRound", "bc")
	register_event("SendAudio", "eventEndRound", "a", "2=%!MRAD_terwin", "2=%!MRAD_ctwin", "2=%!MRAD_rounddraw")
	register_event("TeamScore", "eventTeamScore", "a")
	register_event("30", "eventIntermission", "a")
	register_event("TextMsg", "eventSpecMode", "bd", "2&ec_Mod")
	register_event("StatusValue", "eventShowRank", "bd", "1=2")

	// Register commands.
	register_clcmd("say /hp", "cmdHp", 0, "- display info. about your killer (chat)")
	register_clcmd("say /statsme", "cmdStatsMe", 0, "- display your stats (MOTD)")
	register_clcmd("say /rankstats", "cmdRankStats", 0, "- display your server stats (MOTD)")
	register_clcmd("say /me", "cmdMe", 0, "- display current round stats (chat)")
	register_clcmd("say /score", "cmdScore", 0, "- display last score (chat)")
	register_clcmd("say /rank", "cmdRank", 0, "- display your rank (chat)")
	register_clcmd("say /report", "cmdReport", 0, "- display weapon status (say_team)")
	register_clcmd("say /stats", "cmdStats", 0, "- display players stats (menu/MOTD)")
	register_clcmd("say /switch", "cmdSwitch", 0, "- switch client's stats on or off")
	register_clcmd("say_team /hp", "cmdHp", 0, "- display info. about your killer (chat)")
	register_clcmd("say_team /statsme", "cmdStatsMe", 0, "- display your stats (MOTD)")
	register_clcmd("say_team /rankstats", "cmdRankStats", 0, "- display your server stats (MOTD)")
	register_clcmd("say_team /me", "cmdMe", 0, "- display current round stats (chat)")
	register_clcmd("say_team /score", "cmdScore", 0, "- display last score (chat)")
	register_clcmd("say_team /rank", "cmdRank", 0, "- display your rank (chat)")
	register_clcmd("say_team /report", "cmdReport", 0, "- display weapon status (say_team_team)")
	register_clcmd("say_team /stats", "cmdStats", 0, "- display players stats (menu/MOTD)")
	register_clcmd("say_team /switch", "cmdSwitch", 0, "- switch client's stats on or off")


	register_clcmd("say /top15", "cmdPlace1", 0, "- display top 15 players (MOTD)")
	register_clcmd("say_team /top15", "cmdPlace1", 0, "- display top 15 players (MOTD)")

	// Register menus.
	register_menucmd(register_menuid("Server Stats"), 1023, "actionStatsMenu")

	// Register special configuration setting and default value.
	register_srvcmd("amx_statsx_mode", "cmdPluginMode", ADMIN_CFG, "<flags> - sets plugin options")
	 
	// Init buffers and some global vars.
	g_sBuffer[0] = 0
	save_team_chatscore()
	
	g_HudSync_SpecInfo = CreateHudSyncObj()
	
	CC_SetPrefix("&x04[&x03StatsX&x04]")
}

public plugin_cfg()
{
	new addStast[] = "amx_statscfg add ^"%s^" %s"

	server_cmd(addStast, "ST_SHOW_KILLER_CHAT", "KillerChat")
	server_cmd(addStast, "ST_SHOW_ATTACKERS", "ShowAttackers")
	server_cmd(addStast, "ST_SHOW_VICTIMS", "ShowVictims")
	server_cmd(addStast, "ST_SHOW_KILLER", "ShowKiller")
	server_cmd(addStast, "ST_SHOW_TEAM_SCORE", "ShowTeamScore")
	server_cmd(addStast, "ST_SHOW_TOTAL_STATS", "ShowTotalStats")
	server_cmd(addStast, "ST_SHOW_MOST_DISRUPTIVE", "ShowMostDisruptive")
	server_cmd(addStast, "ST_SHOW_BEST_SCORE", "ShowBestScore")
	server_cmd(addStast, "ST_SHOW_HUD_STATS_DEF", "ShowStats")
	server_cmd(addStast, "ST_SHOW_DIST_HS_HUD", "ShowDistHS")
	server_cmd(addStast, "ST_STATS_PLAYER_MAP_END", "EndPlayer")
	server_cmd(addStast, "ST_STATS_TOP15_MAP_END", "EndTop15")
	server_cmd(addStast, "ST_STATS_MAPTOP_MAP_END", "EndMapTop")
	server_cmd(addStast, "ST_SAY_HP", "SayHP")
	server_cmd(addStast, "ST_SAY_STATSME", "SayStatsMe")
	server_cmd(addStast, "ST_SAY_RANKSTATS", "SayRankStats")
	server_cmd(addStast, "ST_SAY_ME", "SayMe")
	server_cmd(addStast, "ST_SAY_RANK", "SayRank")
	server_cmd(addStast, "ST_SAY_REPORT", "SayReport")
	server_cmd(addStast, "ST_SAY_SCORE", "SayScore")
	server_cmd(addStast, "ST_SAY_TOP15", "SayTop15")
	server_cmd(addStast, "ST_SAY_MAPTOP", "SayMapTop")
	server_cmd(addStast, "ST_SAY_HS", "SayHS")
	server_cmd(addStast, "ST_SAY_KNIFE", "SayKnife")
	server_cmd(addStast, "ST_SAY_GRENADE", "SayGrenade")
	server_cmd(addStast, "ST_SAY_STATS", "SayStatsAll")
	server_cmd(addStast, "ST_SPEC_RANK", "SpecRankInfo")

	if(is_plugin_loaded("statsx.amxx", true) != -1)
	{
		server_cmd("amxx pause statsx.amxx")
	}
		
	new szCfgDir[MAX_TEXT_LENGTH], Time[9] 
	get_time("%H:%M:%S",Time,8)
	
	get_configsdir(szCfgDir, MAX_TEXT_LENGTH  - 1)
	formatex(szCfgDir, sizeof (szCfgDir) -1 , "%s/statsx_custom/statsx_custom.cfg", szCfgDir)
	server_cmd("exec %s", szCfgDir)
	
	
	server_print(" ")
	server_print("###############################################################################")
	server_print("^tTitle  : StatsX Shell Custom")
	server_print("^tVersion: %s", STATSX_SHELL_VER)
	server_print("^tAuthor : AMX MOD X DEV TEAM")
	server_print("^tEdited : MastaMan")
	server_print(" ")
	server_print("------------------------------------------------------------------------------")
	server_print(" ")
	if(file_exists(szCfgDir))
	{
		server_print("[%s] > Load settings from: statsx_shell.cfg", Time)
	}
	else
	{
		server_print("[%s] > Not found: statsx_shell.cfg ........................... [ERROR]", Time)
		server_print(" ")
		server_print("> Please reinstall plugin statsx_shell.amxx for ")
		server_print(" solve this problem or check your cfg!")
		server_print(" ")
		server_print("> Visit www.amx-server.blogspot.com for check new version and more info...")
		server_print(" ")
		server_print("###############################################################################")
		
		//log_amx("Not found: statsx_shell.cfg")
		
		
		return PLUGIN_CONTINUE
	}
	server_print(" ")
			
	new szData[MAX_TEXT_LENGTH], i
	new bool:bERROR_MESSAGE, szERROR_MESSAGE[70]
	new file = fopen(szCfgDir, "rt")
	while(!feof(file))
	{		
		new bool:g_bERROR_MESSAGE_TYPE1 = true
		new bool:g_bERROR_MESSAGE_TYPE2 = true
		
		fgets(file, szData, sizeof(szData) -1)
		
				
		if(szData[0] == '/' || szData[0] == ';' || strlen(szData) < 3)
		{
			continue
		}
	
		new param1[32], param2[32]

		parse(szData, param1, sizeof(param1), param2, sizeof(param2))
	
		////////////////////////////////////////////////
		
		for(new j = 0; j < sizeof(g_Statsx_Shell_Cvars); j++)
		{
			if(equali(param1, g_Statsx_Shell_Cvars[j]))
			{
				g_bERROR_MESSAGE_TYPE1 = false
			}
		}
		
		if(strlen(param2) < 1 || equali(param2, " "))
		{
			g_bERROR_MESSAGE_TYPE2 = true
		}
		else
		{
			g_bERROR_MESSAGE_TYPE2 = false
		}
		
		////////////////////////////////////////////////
				
		new szSpaceCount[128]
		new iLen = 0
				
		new iSpaceCount 
		
		////////////////////////////////////////////////
		
		if(!g_bERROR_MESSAGE_TYPE1)
		{						
			if(!g_bERROR_MESSAGE_TYPE2)
			{
				
				iLen = formatex(szERROR_MESSAGE, sizeof(szERROR_MESSAGE) - 1, "[%s] > Read cvar ^"%s^" ^"%s^" ", Time,param1, param2)
		
				iSpaceCount = sizeof(szERROR_MESSAGE) - iLen
					
				for(new k = 1; k < iSpaceCount; k ++)
				{
					iLen += formatex(szERROR_MESSAGE[iLen], sizeof(szERROR_MESSAGE) - iLen, ".")
				}
			
				server_print("%s%s%s", szERROR_MESSAGE, szSpaceCount, " [OK]")
				server_cmd("%s %s", param1, param2)
			}
			else
			{
				bERROR_MESSAGE = true
				
				iLen = formatex(szERROR_MESSAGE, sizeof(szERROR_MESSAGE) - 1, "[%s] > Bad value for ^"%s^" ", Time,param1)
		
				iSpaceCount = sizeof(szERROR_MESSAGE) - iLen
					
				for(new k = 1; k < iSpaceCount; k ++)
				{
					iLen += formatex(szERROR_MESSAGE[iLen], sizeof(szERROR_MESSAGE) - iLen, ".")
				}
			
				server_print("%s%s%s", szERROR_MESSAGE, szSpaceCount, " [ERROR]")
				//log_amx("Bad value for %s", param1)
			}
		}
		else
		{
			bERROR_MESSAGE = true
			
			iLen = formatex(szERROR_MESSAGE, sizeof(szERROR_MESSAGE) - 1, "[%s] > Unknown cvar ^"%s^" ", Time, param1)
		
			iSpaceCount = sizeof(szERROR_MESSAGE) - iLen
					
			for(new k = 1; k < iSpaceCount; k ++)
			{
				iLen += formatex(szERROR_MESSAGE[iLen], sizeof(szERROR_MESSAGE) - iLen, ".")
			}
			
			server_print("%s%s%s", szERROR_MESSAGE, szSpaceCount, " [ERROR]")
			//log_amx("Unknown cvar %s", param1)
		}
		
		
		i++
	}
	
	if(bERROR_MESSAGE)
	{
			server_print(" ")
			server_print("------------------------------------------------------------------------------")
			server_print(" ")
			server_print("[%s] > [!] WARNING: Read some cvar's from configuration failure!", Time)
			server_print("> Please check [ERROR] messages above...")
			server_print(" ")
			server_print("> Visit www.amx-server.blogspot.com for check new version and more info...")
			
	}
	else
	{
			server_print(" ")
			server_print("------------------------------------------------------------------------------")
			server_print(" ")
			server_print("[%s] > [OK] All settings load success!", Time)
	}
	
	fclose(file)	
	
	server_print(" ")
	server_print("###############################################################################")
	
	if(get_pcvar_num(pcvar_style))
	{
		register_clcmd("say /top", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /top10", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /top20", "cmdPlace2", 0, "- display top 20 players (MOTD)")
		register_clcmd("say /top30", "cmdPlace3", 0, "- display top 30 players (MOTD)")
		register_clcmd("say /dmg", "cmdDmg", 0, "- display top 10 dmg players (MOTD)")
		register_clcmd("say /damage", "cmdDmg", 0, "- display top 10 dmg players (MOTD)")
		register_clcmd("say /hs", "cmdHs", 0, "- display top 10 hs players (MOTD)")
		register_clcmd("say /headshot", "cmdHs", 0, "- display top 10 hs players (MOTD)")
		register_clcmd("say", "cmdTopX")
	}

	return PLUGIN_CONTINUE
}

// Set hudmessage format.
set_hudtype_specmode()
{
	set_hudmessage(255, 255, 255, 0.02, 0.96, 2, 0.05, 0.1, 0.01, 3.0, -1)
}

// Stats formulas
Float:accuracy(izStats[8])
{
	if (!izStats[STATS_SHOTS])
		return (0.0)
	
	return (100.0 * float(izStats[STATS_HITS]) / float(izStats[STATS_SHOTS]))
}

Float:effec(izStats[8])
{
	if (!izStats[STATS_KILLS])
		return (0.0)
	
	return (100.0 * float(izStats[STATS_KILLS]) / float(izStats[STATS_KILLS] + izStats[STATS_DEATHS]))
}

// Distance formula (metric)
Float:distance(iDistance)
{
	return float(iDistance) * 0.0254
}

// Get plugin config flags.
set_plugin_mode(id, sFlags[])
{
	if (sFlags[0])
		g_iPluginMode = read_flags(sFlags)
	
	get_flags(g_iPluginMode, t_sText, MAX_TEXT_LENGTH)
	console_print(id, "%L", id, "MODE_SET_TO", t_sText)
	
	return g_iPluginMode
}


// Get and format team stats, chat version
save_team_chatscore()
{
	new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS]

	// Calculate team stats
	for (new iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
	{
		fzMapEff[iTeam] = effec(g_izTeamGameStats[iTeam])
		fzMapAcc[iTeam] = accuracy(g_izTeamGameStats[iTeam])
		fzRndAcc[iTeam] = accuracy(g_izTeamRndStats[iTeam])
	}

	// Format game team stats, chat
	format(g_sScore, MAX_BUFFER_LENGTH, "%L $t%d $g/ $t%0.2f%%$g %L / $t%0.2f%% $g%L  --  %L $t%d $g/ $t%0.2f%% $g%L / $t%0.2f%% $g%L", LANG_SERVER, "MM_T", g_izTeamScore[0], 
			fzMapEff[0], LANG_SERVER, "EFF", fzMapAcc[0], LANG_SERVER, "ACC", LANG_SERVER, "MM_CT", g_izTeamScore[1], fzMapEff[1], LANG_SERVER, "EFF", fzMapAcc[1], LANG_SERVER, "ACC")
}

// Get and format killed stats: killer hp, ap, hits.
format_kill_ainfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iFound = 0
	
	if (iKiller && iKiller != id)
	{
		new izStats[8], izBody[8]
		new iLen
		
		iFound = 1
		get_user_name(iKiller, t_sName, MAX_NAME_LENGTH)
		izStats[STATS_HITS] = 0
		get_user_astats(id, iKiller, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH)

		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L (%d%L, %d%L) $g>>", id, "KILLED_BY_WITH", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]), 
						g_izKilled[id][KILLED_KILLER_HEALTH], id, "MM_HP",  g_izKilled[id][KILLED_KILLER_ARMOUR], id, "MM_AP")

		if (izStats[STATS_HITS])
		{
			for (new i = 1; i < 8; i++)
			{
				if (!izBody[i])
					continue
				
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " $g%L: $t%d$g", id, MM_BODY_PART[i], izBody[i])
			}
		}
		else
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L", id, "NO_HITS")
	}
	else
		format(sBuffer, MAX_BUFFER_LENGTH, "%L", id, "YOU_NO_KILLER")
	
	return iFound
}

// Get and format killed stats: hits, damage on killer.
format_kill_vinfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iFound = 0
	new izStats[8]
	new izBody[8]
	new iLen

	izStats[STATS_HITS] = 0
	izStats[STATS_DAMAGE] = 0
	get_user_vstats(id, iKiller, izStats, izBody)

	if (iKiller && iKiller != id)
	{
		iFound = 1
		get_user_name(iKiller, t_sName, MAX_NAME_LENGTH)
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L $g>>", id, "YOU_HIT", t_sName, izStats[STATS_HITS], izStats[STATS_DAMAGE])
	}
	else
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L $g>>", id, "LAST_RES", izStats[STATS_HITS], izStats[STATS_DAMAGE])

	if (izStats[STATS_HITS])
	{
		for (new i = 1; i < 8; i++)
		{
			if (!izBody[i])
				continue
			
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " $g%L: $t%d$g", id, MM_BODY_PART[i], izBody[i])
		}
	}
	else
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L", id, "NO_HITS")
	
	return iFound
}

format_topx(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new izStats[8], izBody[8]
	new iLen = 0

	new lKills[30], lDeaths[30], lHits[30], lShots[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
	
	
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lShots, 29, "%L", LANG_SERVER, "SHOTS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	
	iLen = format_all_themes(sBuffer, iLen)
	
		
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=100%% border=0 align=center cellpadding=0 cellspacing=1>")	
	
	if(get_pcvar_num(pcvar_style))
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs, lPot)
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs)
	}
		
	for (new i = iTopX; i < iTopEnd && MAX_BUFFER_LENGTH - iLen > 0; i++)
	{
		iLen = format_all_stats(g_sBuffer, izStats, izBody, iLen, i)
	}
}

format_place1(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iMax = get_statsnum()
	new izStats[8], izBody[8]
	new iLen = 0

	if(get_pcvar_num(pcvar_style))
	{
		if (iMax > 10)
			iMax = 10
	}
	else
	{
		if (iMax > 15)
			iMax = 15
	}

	new lFirstPlace[60], lKills[30], lDeaths[30], lHits[30], lShots[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
	
	
	format(lFirstPlace, 59, "%L", LANG_SERVER, "MM_FIRSTPLACE")
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lShots, 29, "%L", LANG_SERVER, "SHOTS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	iLen = format_all_themes(sBuffer, iLen)
	
	if(get_pcvar_num(pcvar_style))
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", lFirstPlace)
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs, lPot)
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=100%% border=0 align=center cellpadding=0 cellspacing=1>")
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs)
	}
		
	
	for (new i = 0; i < iMax && MAX_BUFFER_LENGTH - iLen > 0; i++)
	{
		iLen = format_all_stats(g_sBuffer, izStats, izBody, iLen, i)
	}
}

format_all_themes(sBuffer[MAX_BUFFER_LENGTH + 1], iLen)
{
	if(get_pcvar_num(pcvar_design)<= STATSX_SHELL_DESIGN_MAX)
	{
		iDesign = get_pcvar_num(pcvar_design)
	}
	else
	{
		if(get_pcvar_num(pcvar_design) == (STATSX_SHELL_DESIGN_MAX + 1))
		{
			iDesign = random_num(1,STATSX_SHELL_DESIGN_MAX)
		}
	}
			
	switch(iDesign)
	{
		case 1:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN1_STYLE)
		}
		
		case 2:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN2_STYLE)
		}
		
		case 3:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN3_STYLE)
		}
		
		case 4:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN4_STYLE)
		}
		
		case 5:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN5_STYLE)
		}
		
		case 6:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN6_STYLE)
		}
		
		case 7:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN7_STYLE)
		}
		
		case 8:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN8_STYLE)
		}
		
		case 9:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN9_STYLE)
		}
		
		case 10:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN10_STYLE)
		}
		
		case 11:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN11_STYLE)
		}
		
		case 12:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN12_STYLE)
		}
		
		case 13:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN13_STYLE)
		}

		default:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DEFAULT_STYLE)			
		}
	}
		
	return iLen
}

format_all_stats(sBuffer[MAX_BUFFER_LENGTH + 1], izStats[8], izBody[8], iLen, i)
{
	get_stats(i, izStats, izBody, t_sName, MAX_NAME_LENGTH)
	replace_all(t_sName, MAX_NAME_LENGTH, "<", "&lt")
	replace_all(t_sName, MAX_NAME_LENGTH, ">", "&gt")
		
	if (szTrigger)
	{
		szTrigger = false
		
		if(get_pcvar_num(pcvar_style))
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d", i + 1, t_sName, izStats[STATS_KILLS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
				
			if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
			{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
			else
			{
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
		}
		else
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_KILLS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])

		}
	}
	else
	{
		szTrigger = true
		
		if(get_pcvar_num(pcvar_style))
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%d<td>%s<td>%d<td>%d<td>%d", i + 1, t_sName, izStats[STATS_KILLS], 
					izStats[STATS_DEATHS], izStats[STATS_HS])
				
			if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
			{
				
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
			else
			{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
		}
		else
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_KILLS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
		}
	}
	
	return iLen
}

format_dmg_stats(sBuffer[MAX_BUFFER_LENGTH + 1], izStats[8], iLen, i)
{
	if (szTrigger)
	{
		szTrigger = false

		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_DAMAGE], izStats[STATS_KILLS], 
			izStats[STATS_DEATHS])
			
		if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
		else
		{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
	
	}
	else
	{
		szTrigger = true
		
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%d<td>%s<td>%d<td>%d<td>%d", i + 1, t_sName, izStats[STATS_DAMAGE], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
			
		if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
		else
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
	}
	
	return iLen
}

format_hs_stats(sBuffer[MAX_BUFFER_LENGTH + 1], izStats[8], iLen, i)
{
	if (szTrigger)
	{
		szTrigger = false

		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_HS], izStats[STATS_KILLS], 
			izStats[STATS_DEATHS])
			
		if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
		else
		{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
	
	}
	else
	{
		szTrigger = true
		
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%d<td>%s<td>%d<td>%d<td>%d", i + 1, t_sName, izStats[STATS_HS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
			
		if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
		else
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
	}
	
	return iLen
}

format_place2(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iMax = get_statsnum()
	new izStats[8], izBody[8]
	new iLen = 0

	if(get_pcvar_num(pcvar_style))
	{
		if (iMax > 20)
			iMax = 20
	}
	else
	{
		if (iMax > 15)
			iMax = 15
	}

	new lSecondPlace[60], lKills[30], lDeaths[30], lHits[30], lShots[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
	
	
	format(lSecondPlace, 59, "%L", LANG_SERVER, "MM_SECONDPLACE")
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lShots, 29, "%L", LANG_SERVER, "SHOTS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	iLen = format_all_themes(sBuffer, iLen)
	
	if(get_pcvar_num(pcvar_style))
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", lSecondPlace)
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs, lPot)
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=100%% border=0 align=center cellpadding=0 cellspacing=1>")
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs)
	}
	
	for (new i = 10; i < iMax && MAX_BUFFER_LENGTH - iLen > 0; i++)
	{
		iLen = format_all_stats(g_sBuffer, izStats, izBody, iLen, i)	
	}
}

format_place3(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iMax = get_statsnum()
	new izStats[8], izBody[8]
	new iLen = 0

	if(get_pcvar_num(pcvar_style))
	{
		if (iMax > 30)
			iMax = 30
	}
	else
	{
		if (iMax > 15)
			iMax = 15
	}
	
	new lThirdPlace[60], lKills[30], lDeaths[30], lHits[30], lShots[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
	
	
	format(lThirdPlace, 59, "%L", LANG_SERVER, "MM_THIRDPLACE")
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lShots, 29, "%L", LANG_SERVER, "SHOTS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	iLen = format_all_themes(sBuffer, iLen)
	
	if(get_pcvar_num(pcvar_style))
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", lThirdPlace)
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs, lPot)
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=100%% border=0 align=center cellpadding=0 cellspacing=1>")
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs)
	}
	
	for (new i = 20; i < iMax && MAX_BUFFER_LENGTH - iLen > 0; i++)
	{
		iLen = format_all_stats(g_sBuffer, izStats, izBody, iLen, i)
	}
}

find_max_stats(g_iStatsBase[], iMax, iExcludeID[])
{
	new g_iDataMax = 0	
	new iId
	
	for(new j = 0; j < iMax; j++)
	{
		if(!iExcludeID[j])
		{
			if(g_iStatsBase[j] > g_iDataMax)
			{	
				g_iDataMax = g_iStatsBase[j]
				iExcludeID[j] = true
				iId = j
			}
		}
	}	
	
	
	return iId
}

format_top_dmg(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iMax = get_statsnum()
	new izStats[8], izBody[8]
	new iLen = 0

	new g_iStatsBase[MAX_SORT_COUNT]
	new bool:iExcludeID[MAX_SORT_COUNT]
	
	new lDmg_Place[60], lDamage[30], lKills[30], lDeaths[30], lHits[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
	
	
	if (iMax > MAX_SORT_COUNT)
	{
		iMax = MAX_SORT_COUNT
	}
	
		
	for(new i = 0; i < iMax; i++)
	{
		get_stats(i, izStats, izBody, t_sName, MAX_NAME_LENGTH)
		
		g_iStatsBase[i] = izStats[STATS_DAMAGE]
	}
	

	
	format(lDmg_Place, 59, "%L", LANG_SERVER, "MM_DMG_PLACE")
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lDamage, 29, "%L", LANG_SERVER, "MM_DAMAGE")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	iLen = format_all_themes(sBuffer, iLen)
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", lDmg_Place)
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lDamage, lKills, lDeaths,  lPot)
			
	for(new i = 0; i < 10; i++)
	{
		get_stats(find_max_stats(g_iStatsBase, iMax, iExcludeID), izStats, izBody, t_sName, MAX_NAME_LENGTH)
		replace_all(t_sName, MAX_NAME_LENGTH, "<", "&lt")
		replace_all(t_sName, MAX_NAME_LENGTH, ">", "&gt")
		
		iLen = format_dmg_stats(g_sBuffer, izStats, iLen, i)
	}
}

format_top_hs(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iMax = get_statsnum()
	new izStats[8], izBody[8]
	new iLen = 0

	new g_iStatsBase[MAX_SORT_COUNT]
	new bool:iExcludeID[MAX_SORT_COUNT]
	
	new lHs_Place[60], lKills[30], lDeaths[30], lHits[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
	
	
	if (iMax > MAX_SORT_COUNT)
	{
		iMax = MAX_SORT_COUNT
	}
	
		
	for(new i = 0; i < iMax; i++)
	{
		get_stats(i, izStats, izBody, t_sName, MAX_NAME_LENGTH)
		
		g_iStatsBase[i] = izStats[STATS_HS]
	}
	

	
	format(lHs_Place, 59, "%L", LANG_SERVER, "MM_HS_PLACE")
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	iLen = format_all_themes(sBuffer, iLen)
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", lHs_Place)
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lHs, lKills, lDeaths,  lPot)
	
	for(new i = 0; i < 10; i++)
	{
		get_stats(find_max_stats(g_iStatsBase, iMax, iExcludeID), izStats, izBody, t_sName, MAX_NAME_LENGTH)
		replace_all(t_sName, MAX_NAME_LENGTH, "<", "&lt")
		replace_all(t_sName, MAX_NAME_LENGTH, ">", "&gt")
		
		iLen = format_hs_stats(g_sBuffer, izStats, iLen, i)
	}
}

format_rankstats(id, sBuffer[MAX_BUFFER_LENGTH + 1], iMyId = 0)
{
	new izStats[8] = {0, ...}
	new izBody[8]
	new iRankPos, iLen
	new lKills[30], lDeaths[30], lHits[30], lShots[30], lDamage[30], lEff[30], lAcc[30], lPot[45]
	
	format(lKills, 29, "%L", id, "KILLS")
	format(lDeaths, 29, "%L", id, "DEATHS")
	format(lHits, 29, "%L", id, "HITS")
	format(lShots, 29, "%L", id, "SHOTS")
	format(lDamage, 29, "%L", id, "MM_DAMAGE")
	format(lEff, 29, "%L", id, "MM_EFF")
	format(lAcc, 29, "%L", id, "MM_ACC")
	format(lPot, 44, "%L", id, "MM_POT")
	
	ucfirst(lEff)
	ucfirst(lAcc)

	iLen = format_all_themes(sBuffer, iLen)

	
	iRankPos = get_user_stats(id, izStats, izBody)
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h3>%L %L</h3>", id, (!iMyId || iMyId == id) ? "YOUR" : "PLAYERS", id, "RANK_IS", iRankPos, get_statsnum())
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<table width=40%% style=^"float:left; margin:0 7%% 0 7%%^" border=0 cellpadding=0 cellspacing=1><th colspan=2>%L</td>", id, "MM_STAT")
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%s<td>%d &nbsp&nbsp(%L)<tr><td>%s<td>%d<tr id=c><td>%s<td>%d<tr><td>%s<td>%d<tr id=c><td>%s<td>%d<tr><td>%s<td>%0.2f%%<tr id=c>", 
					lKills, izStats[STATS_KILLS], id, "MM_WITH_HS",izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS], 
					lDamage, izStats[STATS_DAMAGE], lAcc, accuracy(izStats))
	
	if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td>%s<td><img id=r width=%3.0f%%>%2.0f%%</tr>", lPot, (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
	}
	else
	{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td>%s<td><img width=%3.0f%%>%2.0f%%</tr>", lPot, (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
	}
		
	new L_BODY_PART[8][32]
	
	for (new i = 1; i < 8; i++)
	{
		format(L_BODY_PART[i], 31, "%L", id, BODY_PART[i])
	}
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "</table><table width=40%% border=0 cellpadding=0 cellspacing=1><th colspan=2>%L</td>", id, "MM_HIT")
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%s<td>%d<tr><td>%s<td>%d<tr id=c><td>%s<td>%d<tr><td>%s<td>%d<tr id=c><td>%s<td>%d<tr><td>%s<td>%d<tr id=c><td>%s<td>%d", 
					L_BODY_PART[1], izBody[1], L_BODY_PART[2], izBody[2], L_BODY_PART[3], izBody[3], L_BODY_PART[4], izBody[4], L_BODY_PART[5], 
					izBody[5], L_BODY_PART[6], izBody[6], L_BODY_PART[7], izBody[7])
}

format_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new izStats[8] = {0, ...}
	new izBody[8]
	new iWeapon, iLen
	new lKills[30], lDeaths[30], lHits[30], lShots[30], lDamage[30], lEff[30], lAcc[30], lWeapon[30], lPot[45]
	
	format(lKills, 29, "%L", id, "KILLS")
	format(lDeaths, 29, "%L", id, "DEATHS")
	format(lHits, 29, "%L", id, "HITS")
	format(lShots, 29, "%L", id, "SHOTS")
	format(lDamage, 29, "%L", id, "MM_DAMAGE")
	format(lEff, 29, "%L", id, "MM_EFF")
	format(lAcc, 29, "%L", id, "MM_ACC")
	format(lPot, 44, "%L", id, "MM_POT")
	format(lWeapon, 29, "%L", id, "WEAPON")
	
	ucfirst(lEff)
	ucfirst(lAcc)
		
	get_user_wstats(id, 0, izStats, izBody)

	iLen = format_all_themes(sBuffer, iLen)

	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=50%% border=0 cellpadding=0 cellspacing=1><th colspan=2>%L</td>", id, "MM_STAT")
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%s<td>%d &nbsp&nbsp(%L)<tr><td>%s<td>%d<tr id=c><td>%s<td>%d<tr><td>%s<td>%d<tr id=c><td>%s<td>%d<tr><td>%s<td>%0.2f<tr id=c><td>%s<td>%0.2f<tr>", 
		lKills, izStats[STATS_KILLS], id, "MM_WITH_HS",izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS], 
		lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats))
		
	if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td>%s<td><img id=r width=%3.0f%%>%2.0f%%",  lPot, (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td>%s<td><img width=%3.0f%%>%2.0f%%",  lPot, (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
	}
	
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "</table><br><table width=90%% border=0 cellpadding=0 cellspacing=1>")
	
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s<th>%s", lWeapon, lKills, lDeaths, lHits, lShots, lDamage, lAcc)
	
	new bool:szTrigger = true
	for (iWeapon = 1; iWeapon < xmod_get_maxweapons() && MAX_BUFFER_LENGTH - iLen > 0 ; iWeapon++)
	{				
		if (get_user_wstats(id, iWeapon, izStats, izBody))
		{
			xmod_get_wpnname(iWeapon, t_sWpn, MAX_WEAPON_LENGTH)
			if(szTrigger)
			{
				szTrigger = false
				
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr class=c><td>%s<td>%d<td>%d<td>%d<td>%d<td>%d<td>%3.0f", t_sWpn, izStats[STATS_KILLS], izStats[STATS_DEATHS], 
							izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_DAMAGE], accuracy(izStats))
			}
			else
			{
				szTrigger = true
				
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%s<td>%d<td>%d<td>%d<td>%d<td>%d<td>%3.0f", t_sWpn, izStats[STATS_KILLS], izStats[STATS_DEATHS], 
							izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_DAMAGE], accuracy(izStats))
			}
		}
	}
}

//------------------------------------------------------------
// Plugin commands
//------------------------------------------------------------

// Set or get plugin config flags.
public cmdPluginMode(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1)) 
		return PLUGIN_HANDLED
	
	if (read_argc() > 1)
		read_argv(1, g_sBuffer, MAX_BUFFER_LENGTH)
	else
		g_sBuffer[0] = 0
	
	set_plugin_mode(id, g_sBuffer)
	
	return PLUGIN_HANDLED
}

// Display MOTD stats.
public cmdStatsMe(id)
{
	if (!SayStatsMe)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}

	format_stats(id, g_sBuffer)
	
	get_user_name(id, t_sName, MAX_NAME_LENGTH)
	format(t_sName, MAX_NAME_LENGTH - 1, "StatsMe ^"%s^"", t_sName)
	
	show_motd(id, g_sBuffer, t_sName)
	
	return PLUGIN_CONTINUE
}

// Display MOTD rank.
public cmdRankStats(id)
{
	if (!SayRankStats)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_rankstats(id, g_sBuffer)
	
	get_user_name(id, t_sName, MAX_NAME_LENGTH)
	format(t_sName, MAX_NAME_LENGTH - 1, "RankStats ^"%s^"", t_sName)
	
	show_motd(id, g_sBuffer, t_sName)
	
	return PLUGIN_CONTINUE
}

public cmdTopX(id)
{
	if (!SayTop15)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	if(!get_pcvar_num(pcvar_topx))
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	new szArg[128]
	read_args(szArg, 127)
	remove_quotes(szArg)
	new szTopX[32]

	new szMotdTitle[30]
	
	if(equal(szArg, "/top", 4))
	{
		copy(szTopX, charsmax(szTopX), szArg[4])
		
		iTopX = str_to_num(szTopX)

		if(get_pcvar_num(pcvar_style) && iTopX > 30)
		{
			if (get_statsnum() < iTopX + 10)
			{
				iTopEnd = get_statsnum()
				iTopX = iTopEnd - 10
				
				formatex(szMotdTitle, charsmax(szMotdTitle), "%L %d - %d", LANG_SERVER, "MM_TOPX_T", iTopX + 1, iTopEnd)
			}
			else
			{
				iTopX = iTopX - 1
				iTopEnd = iTopX + 10
			
				formatex(szMotdTitle, charsmax(szMotdTitle), "%L %d - %d", LANG_SERVER, "MM_TOPX_T", iTopX + 1, iTopEnd)
			}
			
			format_topx(g_sBuffer)

			show_motd(id, g_sBuffer, szMotdTitle)
		}
	}
	
	return PLUGIN_CONTINUE
}


// Display MOTD top15 ranked.
public cmdPlace1(id)
{
	if (!SayTop15)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	new szMotdTitle[30]
	
	if(get_pcvar_num(pcvar_style))
	{
		formatex(szMotdTitle, charsmax(szMotdTitle), "10%L",id, "MM_PLACE")
	}
	else
	{
		szMotdTitle = "Top 15"
	}
	
	format_place1(g_sBuffer)
	show_motd(id, g_sBuffer, szMotdTitle)


	return PLUGIN_CONTINUE
}

public cmdPlace2(id)
{
	if (!SayTop15)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_place2(g_sBuffer)
	
	new szMotdTitle[30]
	formatex(szMotdTitle, charsmax(szMotdTitle), "20%L",id, "MM_PLACE")
	show_motd(id, g_sBuffer, szMotdTitle)
	
	return PLUGIN_CONTINUE
}

public cmdPlace3(id)
{
	if (!SayTop15)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_place3(g_sBuffer)
	
	new szMotdTitle[30]
	formatex(szMotdTitle, charsmax(szMotdTitle), "30%L",id, "MM_PLACE")
	show_motd(id, g_sBuffer, szMotdTitle)
	
	return PLUGIN_CONTINUE
}

public cmdDmg(id)
{
	if (!SayTop15)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	if(!get_pcvar_num(pcvar_dmg))
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_top_dmg(g_sBuffer)
	
	new szMotdTitle[30]
	formatex(szMotdTitle, charsmax(szMotdTitle), "%L",id, "MM_DMG_PLACE_T")
	show_motd(id, g_sBuffer, szMotdTitle)
	
	return PLUGIN_CONTINUE
}

public cmdHs(id)
{
	if (!SayTop15)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	if(!get_pcvar_num(pcvar_hs))
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_top_hs(g_sBuffer)
	
	new szMotdTitle[30]
	formatex(szMotdTitle, charsmax(szMotdTitle), "%L",id, "MM_HS_PLACE_T")
	show_motd(id, g_sBuffer, szMotdTitle)
	
	return PLUGIN_CONTINUE
}

// Display killer information.
public cmdHp(id)
{
	if (!SayHP)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	new iKiller = g_izKilled[id][KILLED_KILLER_ID]
	
	format_kill_ainfo(id, iKiller, g_sBuffer)
	CC_SendMessage(id, "%s", g_sBuffer)
	
	return PLUGIN_CONTINUE
}

// Display user stats.
public cmdMe(id)
{
	if (!SayMe)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_kill_vinfo(id, 0, g_sBuffer)
	CC_SendMessage(id,"%s", g_sBuffer)
	
	return PLUGIN_CONTINUE
}

// Display user rank
public cmdRank(id)
{
	if (!SayRank)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}

	new izStats[8], izBody[8]
	new iRankPos, iRankMax
		
	iRankPos = get_user_stats(id, izStats, izBody)
	iRankMax = get_statsnum()
	
	CromChat(id, "%L", id, "YOUR_RANK_IS", iRankPos, iRankMax, izStats[STATS_KILLS], izStats[STATS_HITS], ((effec(izStats) + accuracy(izStats)) / 2))
	
	return PLUGIN_CONTINUE
}

// Report user weapon status to team.
public cmdReport(id)
{
	if (!SayReport)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	new iWeapon, iClip, iAmmo, iHealth, iArmor
	
	iWeapon = get_user_weapon(id, iClip, iAmmo) 
	
	if (iWeapon != 0)
		xmod_get_wpnname(iWeapon, t_sWpn, MAX_WEAPON_LENGTH)
	
	iHealth = get_user_health(id) 
	iArmor = get_user_armor(id)
	
	new lWeapon[16]
	
	format(lWeapon, 15, "%L", id, "WEAPON")
	strtolower(lWeapon)
	
	if (iClip >= 0)
	{
		format(g_sBuffer, MAX_BUFFER_LENGTH, "^x04%s: ^x03%s^x04, %L: ^x03%d/%d^x04, %L: ^x03%d^x04, %L: ^x03%d", lWeapon, t_sWpn, LANG_SERVER, "AMMO", iClip, iAmmo, LANG_SERVER, "HEALTH", iHealth, LANG_SERVER, "ARMOR", iArmor) 
	}
	else
		format(g_sBuffer, MAX_BUFFER_LENGTH, "^x04%s: ^x03%s^x04, %L: ^x03%d^x04, %L: ^x03%d", lWeapon, t_sWpn[7], LANG_SERVER, "HEALTH", iHealth, LANG_SERVER, "ARMOR", iArmor) 
	
	engclient_cmd(id, "say_team", g_sBuffer)
	
	return PLUGIN_CONTINUE
} 

// Display team map score
public cmdScore(id)
{
	if (!SayScore)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	CC_SendMessage(id, "%L: %s", id, "GAME_SCORE", g_sScore)
	
	return PLUGIN_CONTINUE
}

// Client switch to enable or disable stats announcements.
public cmdSwitch(id)
{
	g_izStatsSwitch[id] = (g_izStatsSwitch[id]) ? 0 : -1 
	num_to_str(g_izStatsSwitch[id], t_sText, MAX_TEXT_LENGTH)
	client_cmd(id, "setinfo _amxstatsx %s", t_sText)
	
	new lEnDis[32]
	
	format(lEnDis, 31, "%L", id, g_izStatsSwitch[id] ? "ENABLED" : "DISABLED")
	CromChat(id, "%L", id, "STATS_ANNOUNCE", lEnDis)
	
	return PLUGIN_CONTINUE
}

// Player stats menu.
public cmdStats(id)
{
	if (!SayStatsAll)
	{
		CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	showStatsMenu(id, g_izUserMenuPosition[id] = 0)
	
	return PLUGIN_CONTINUE
}

//--------------------------------
// Menu
//--------------------------------

public actionStatsMenu(id, key)
{
	switch (key)
	{
		// Key '1' to '7', execute action on this option
		case 0..6:
		{
			new iOption, iIndex
			iOption = (g_izUserMenuPosition[id] * PPL_MENU_OPTIONS) + key
			
			if (iOption >= 0 && iOption < 32)
			{
				iIndex = g_izUserMenuPlayers[id][iOption]
			
				if (is_user_connected(iIndex))
				{
					switch (g_izUserMenuAction[id])
					{
						case 0: format_stats(iIndex, g_sBuffer)
						case 1: format_rankstats(iIndex, g_sBuffer, id)
						default: g_sBuffer[0] = 0
					}
					
					if (g_sBuffer[0])
					{
						get_user_name(iIndex, t_sName, MAX_NAME_LENGTH)
						show_motd(id, g_sBuffer, t_sName)
					}
				}
			}
			
			showStatsMenu(id, g_izUserMenuPosition[id])
		}
		// Key '8', change action
		case 7:
		{
			g_izUserMenuAction[id]++
			
			if (g_izUserMenuAction[id] >= MAX_PPL_MENU_ACTIONS)
				g_izUserMenuAction[id] = 0
			
			showStatsMenu(id, g_izUserMenuPosition[id])
		}
		// Key '9', select next page of options
		case 8: showStatsMenu(id, ++g_izUserMenuPosition[id])
		// Key '10', cancel or go back to previous menu
		case 9:
		{
			if (g_izUserMenuPosition[id] > 0)
				showStatsMenu(id, --g_izUserMenuPosition[id])
		}
	}
	
	return PLUGIN_HANDLED
}

new g_izUserMenuActionText[MAX_PPL_MENU_ACTIONS][62]

showStatsMenu(id, iMenuPos)
{
	formatex(g_izUserMenuActionText[0], charsmax(g_izUserMenuActionText[]),"\r%L", id, "MM_RANKSTATS")
	formatex(g_izUserMenuActionText[1], charsmax(g_izUserMenuActionText[]),"\r%L", id, "MM_RANK")
		
	new iLen, iKeyMask, iPlayers
	new iUserIndex, iMenuPosMax, iMenuOption, iMenuOptionMax
	
	get_players(g_izUserMenuPlayers[id], iPlayers)
	iMenuPosMax = ((iPlayers - 1) / PPL_MENU_OPTIONS) + 1
	
	// If menu pos does not excist use last menu (if players has left)
	if (iMenuPos >= iMenuPosMax)
		iMenuPos = iMenuPosMax - 1

	iUserIndex = iMenuPos * PPL_MENU_OPTIONS
	iLen = format(g_sBuffer, MAX_BUFFER_LENGTH, "\y%L\R%d/%d^n\w^n", id, "SERVER_STATS", iMenuPos + 1, iMenuPosMax)
	iMenuOptionMax = iPlayers - iUserIndex
	
	if (iMenuOptionMax > PPL_MENU_OPTIONS) 
		iMenuOptionMax = PPL_MENU_OPTIONS
	
	for (iMenuOption = 0; iMenuOption < iMenuOptionMax; iMenuOption++)
	{
		get_user_name(g_izUserMenuPlayers[id][iUserIndex++], t_sName, MAX_NAME_LENGTH)
		iKeyMask |= (1<<iMenuOption)
		iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%d. %s^n\w", iMenuOption + 1, t_sName)
	}
	
	iKeyMask |= MENU_KEY_8|MENU_KEY_0
	iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n8. %s^n\w", g_izUserMenuActionText[g_izUserMenuAction[id]])
	
	if (iPlayers > iUserIndex)
	{
		iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n9. %L...", id, "MORE")
		iKeyMask |= MENU_KEY_9
	}
	
	if (iMenuPos > 0)
		iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n0. %L", id, "BACK")
	else
		iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n0. %L", id, "EXIT")
	
	show_menu(id, iKeyMask, g_sBuffer, -1, "Server Stats")
	
	return PLUGIN_HANDLED
}

//------------------------------------------------------------
// Plugin events
//------------------------------------------------------------

// Reset game stats on game start and restart.
public eventStartGame()
{
	read_data(2, t_sText, MAX_TEXT_LENGTH)
	
	if (t_sText[6] == 'w')
	{
		read_data(3, t_sText, MAX_TEXT_LENGTH)
		g_fStartGame = get_gametime() + float(str_to_num(t_sText))
	}
	else
		g_fStartGame = get_gametime()
	
	return PLUGIN_CONTINUE
}

// Round start
public eventStartRound()
{
	new iTeam, id, i
	
	if (read_data(1) >= floatround(get_cvar_float("mp_roundtime") * 60.0,floatround_floor))
	{
		// Reset game stats on game start and restart.
		if (g_fStartGame > 0.0 && g_fStartGame <= get_gametime())
		{
			g_fStartGame = 0.0

			// Clear team and game stats.
			for (iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
			{
				g_izTeamEventScore[iTeam] = 0
				
				for (i = 0; i < 8; i++)
					g_izTeamGameStats[iTeam][i] = 0
			}

			// Clear game stats, incl '0' that is sum of all users.
			for (id = 0; id < MAX_PLAYERS; id++)
			{
				for (i = 0; i < 8; i++)
					g_izUserGameStats[id][i] = 0
			}
		}

		// Update team score with "TeamScore" event values and
		// clear team round stats.
		for (iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
		{
			g_izTeamScore[iTeam] = g_izTeamEventScore[iTeam]
			
			for (i = 0; i < 8; i++)
				g_izTeamRndStats[iTeam][i] = 0
		}

		// Clear user round stats, incl '0' that is sum of all users.
		for (id = 0; id < MAX_PLAYERS; id++)
		{
			g_izUserRndName[id][0] = 0
			
			for (i = 0; i < 8; i++)
				g_izUserRndStats[id][i] = 0
			
			g_fzShowUserStatsTime[id] = 0.0
		}
	}

	return PLUGIN_CONTINUE
}

// Save killer info on death.
public client_death(killer, victim, wpnindex, hitplace, TK)
{
	// Bail out if no killer.
	if (!killer)
		return PLUGIN_CONTINUE

	if (killer != victim)
	{
		new iaVOrigin[3], iaKOrigin[3]
		new iDistance
		
		get_user_origin(victim, iaVOrigin)
		get_user_origin(killer, iaKOrigin)
		
		g_izKilled[victim][KILLED_KILLER_ID] = killer
		g_izKilled[victim][KILLED_KILLER_HEALTH] = get_user_health(killer)
		g_izKilled[victim][KILLED_KILLER_ARMOUR] = get_user_armor(killer)
		g_izKilled[victim][KILLED_KILLER_STATSFIX] = 0

		iDistance = get_distance(iaVOrigin, iaKOrigin)
		g_izUserAttackerDistance[victim] = iDistance
		g_izUserVictimDistance[killer][victim] = iDistance
	}
	
	g_izKilled[victim][KILLED_TEAM] = get_user_team(victim)
	g_izKilled[victim][KILLED_KILLER_STATSFIX] = 1

	return PLUGIN_CONTINUE
}

public eventTeamScore()
{
	new sTeamID[1 + 1], iTeamScore
	read_data(1, sTeamID, 1)
	iTeamScore = read_data(2)
	g_izTeamEventScore[(sTeamID[0] == 'C') ? 1 : 0] = iTeamScore
	
	return PLUGIN_CONTINUE
}

public eventIntermission()
{
	if (EndPlayer || EndTop15)
		set_task(1.0, "end_game_stats", 900)
}

public end_game_stats()
{
	new iaPlayers[32], iPlayer, iPlayers, id

	if (EndPlayer)
	{
		get_players(iaPlayers, iPlayers)
		
		for (iPlayer = 0; iPlayer < iPlayers; iPlayer++)
		{
			id = iaPlayers[iPlayer]
			
			if (!g_izStatsSwitch[id])
				continue	// Do not show any stats
			
			cmdStatsMe(iaPlayers[iPlayer])
		}
	}
	else if (EndTop15)
	{
		get_players(iaPlayers, iPlayers)
		format_place1(g_sBuffer)
		
		for (iPlayer = 0; iPlayer < iPlayers; iPlayer++)
		{
			id = iaPlayers[iPlayer]
			
			if (!g_izStatsSwitch[id])
				continue	// Do not show any stats
			
			new szMotdTitle[30]
			formatex(szMotdTitle, charsmax(szMotdTitle), "1 - %L",id, "MM_PLACE")
			show_motd(iaPlayers[iPlayer], g_sBuffer, szMotdTitle)
		}
	}
	
	return PLUGIN_CONTINUE
}

public eventSpecMode(id)
{
	new sData[12]
	read_data(2, sData, 11)
	g_izSpecMode[id] = (sData[10] == '2')
	
	return PLUGIN_CONTINUE
} 

public eventShowRank(id)
{
	if (SpecRankInfo && g_izSpecMode[id])
	{
		new iPlayer = read_data(2)
		
		if (is_user_connected(iPlayer))
		{
			new izStats[8], izBody[8]
			new iRankPos, iRankMax
			
			get_user_name(iPlayer, t_sName, MAX_NAME_LENGTH)
			
			iRankPos = get_user_stats(iPlayer, izStats, izBody)
			iRankMax = get_statsnum()
			
			set_hudtype_specmode()
			ShowSyncHudMsg(id, g_HudSync_SpecInfo, "%L", id, "X_RANK_IS", t_sName, iRankPos, iRankMax)
		}
	}
	
	return PLUGIN_CONTINUE
}

public client_connect(id)
{
	if (ShowStats)
	{
		get_user_info(id, "_amxstatsx", t_sText, MAX_TEXT_LENGTH)
		g_izStatsSwitch[id] = (t_sText[0]) ? str_to_num(t_sText) : -1
	}
	else
		g_izStatsSwitch[id] = 0

	g_izKilled[id][KILLED_KILLER_ID] = 0
	g_izKilled[id][KILLED_KILLER_STATSFIX] = 0
	g_izShowStatsFlags[id] = 0		// Clear all flags
	g_fzShowUserStatsTime[id] = 0.0

	return PLUGIN_CONTINUE
}
Последно промяна от YankoNL на 07 Май 2022, 17:31, променено общо 1 път.

Аватар
nobi13
Извън линия
Потребител
Потребител
Мнения: 65
Регистриран на: 13 Дек 2017, 21:01
Се отблагодари: 3 пъти
Получена благодарност: 2 пъти

Помощ със Statsx Shell

Мнение от nobi13 » 07 Май 2022, 16:31

YankoNL написа: 07 Май 2022, 16:10 Здравейте, дълго време ползвах следния плъгин и днес реших да го променя драстично като махна доста от нещата. Всичко уж работи както си трябва, но когато използвам командите /rank или /me - в чата не се показва нищо. Нещата свързани с MOTD работят както си трябва. Моля, ако може някой да даде акъл къде бъркам и какво трябва да направя - да сподели.

Ето и кода:
► Покажи скъсения текст
Прегледай си кода ,намери реда с /rank и /me и виж далли не си премахнал реда в който принтираш съобщението в чата.
Това оригиналния сма файл ли е или твоя ?
Дали не си забранил /rank и /Me от статс настройките на сървъра ?

Аватар
YankoNL
Извън линия
Потребител
Потребител
Мнения: 163
Регистриран на: 06 Апр 2017, 09:07
Местоположение: Варна
Се отблагодари: 22 пъти
Получена благодарност: 9 пъти

Помощ със Statsx Shell

Мнение от YankoNL » 07 Май 2022, 17:38

Това е кода който аз съм едитнал. Всички настройки са както трябва и в stats.ini всички команди са позволени.
Единственото което съм променил по кода е чат съобщенията да са с cromchat и съм премахнал функциите за парите, времето, рундовете и HUD съобщенията.
Единственото което съм оставил е spec информацията за ранка, /rank, /me, /hs, /dmg, /report, /rankstats и /top.
От изброените неща горе работят само нещата свързани с MOTD, чата никакъв го няма - пък уж всичко по кода си е както трябва или не виждам къде съм сбъркал.

Аватар
Radeon
Извън линия
Потребител
Потребител
Мнения: 143
Регистриран на: 04 Апр 2021, 11:30
Се отблагодари: 2 пъти
Получена благодарност: 34 пъти
Обратна връзка:

Помощ със Statsx Shell

Мнение от Radeon » 09 Май 2022, 09:55

Според мен е трябвало само да замениш стария начин за принт на съобщение с CC_SendMessage и пред самото съобщение да сложиш цвета CC_SendMessage(id,"&x04%s", g_sBuffer) примерно за зелено или ColorChat(id,NORMAL,"^4green ^3teamcolor ^1 normal %s", g_sBuffer). И след като разгледах оригинала видях че той си е с цветни съобщения, защо не ги остави ?

Код за потвърждение: Избери целия код

CromChat(id, "%L", id, "DISABLED_MSG")
		return PLUGIN_HANDLED
	}
	
	format_kill_vinfo(id, 0, g_sBuffer)
	CC_SendMessage(id,"%s", g_sBuffer)

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Поддръжка / Помощ”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта