Преработка на МОТD прозорец/таблица в amx_stats (only kills)

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Отговори
Потребителски аватар

Автор на темата
MF1 CS-BG
Потребител
Потребител
Мнения: 301
Регистриран: 12 окт 2016, 21:15
Местоположение: Varna
Получена благодарност: 6 пъти
Контакти:

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от MF1 CS-BG » 30 яну 2019, 15:24

Здравейте !
Ползвам следния amx_stats

Код: Избери всички

#include < amxmodx >
#include < fvault >

enum _:RankData
{
	Rank_Kills,
	Rank_Name[ 32 ],
	Rank_SteamID[ 35 ]
};

new const g_szVaultName[ ] = "amxx_stats";

new pCvar_Top;

public plugin_init( )
{
	register_plugin( "AMXX Stats", "0.0.1", "Exolent" );
	
	register_srvcmd( "amxstats_reset", "CmdReset" );
	
	register_clcmd( "say /rank", "CmdRank" );
	register_clcmd( "say /top", "CmdTop" );
	register_clcmd( "say /top10", "CmdTop" );
	register_clcmd( "say /top15", "CmdTop" );
	
	register_event( "DeathMsg", "EventDeathMsg", "a" );
	
	pCvar_Top = register_cvar( "amxstats_top", "10" );

}

public CmdReset( )
{
	fvault_clear( g_szVaultName );
	
	server_print( "[BaseBuilder] Stats have been reset." );
	
	log_amx( "[BaseBuilder] Stats have been reset." );
	
	return PLUGIN_HANDLED;
}

public CmdRank( iPlayer )
{
	new Array:aRankData;
	new iTotal = GetPlayerRanks( aRankData );
	
	new iRank;
	new eRankData[ RankData ];
	
	if( iTotal )
	{
		new szPlayerSteamID[ 35 ];
		get_user_authid( iPlayer, szPlayerSteamID, charsmax( szPlayerSteamID ) );
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			if( equal( szPlayerSteamID, eRankData[ Rank_SteamID ] ) )
			{
				iRank = i + 1;
				break;
			}
		}
	}
	
	if( iRank )
	{
		client_print( iPlayer, print_chat, "You are ranked %i of %i with %i kill%s!", iRank, iTotal, eRankData[ Rank_Kills ], ( eRankData[ Rank_Kills ] == 1 ) ? "" : "s" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* You are not ranked because you have not killed anyone!" );
	}
	
	ArrayDestroy( aRankData );
}

public CmdTop( iPlayer )
{
	new Array:aRankData;
	new iTotal = max( 0, min( GetPlayerRanks( aRankData ), get_pcvar_num( pCvar_Top ) ) );
	
	if( iTotal )
	{
		static szMOTD[ 2500 ], iDefaultLen;
		if( !iDefaultLen )
		{
			iDefaultLen = copy( szMOTD, charsmax( szMOTD ), "<body><table align=center border=1><thead><tr><th>#.</th><th>Name</th><th>Kills</th></tr></thead><tbody>" );
		}
		
		new iLen = iDefaultLen;
		
		new eRankData[ RankData ];
		
		new szFixedName[ 128 ];
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			copy( szFixedName, charsmax( szFixedName ), eRankData[ Rank_Name ] );
			
			MakeNameMOTDSafe( szFixedName, 31 );
			
			iLen += formatex( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "<tr><td>%i</td><td>%s</td><td>%i</td></tr>", ( i + 1 ), szFixedName, eRankData[ Rank_Kills ] );
		}
		
		copy( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "</tbody></table></body>" );
		
		show_motd( iPlayer, szMOTD, "Top Players" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* No players have been put on the top!" );
	}
	
	ArrayDestroy( aRankData );
}

public EventDeathMsg( )
{
	new iVictim = read_data( 2 );
	
	if( is_user_connected( iVictim ) )
	{
		new iKiller = read_data( 1 );
		
		if( iVictim != iKiller
		&&  is_user_connected( iKiller ) )
		{
			// killed by another player
			
			new szName[ 32 ], szSteamID[ 35 ];
			get_user_authid( iKiller, szSteamID, charsmax( szSteamID ) );
			
			new szKills[ 48 ], iKills;
			if( fvault_get_data( g_szVaultName, szSteamID, szKills, charsmax( szKills ) ) )
			{
				strbreak( szKills, szKills, charsmax( szKills ), szName, charsmax( szName ) );
				
				iKills = str_to_num( szKills );
			}
			
			if( get_user_team( iVictim ) == get_user_team( iKiller ) )
			{
				// killed by a teammate
				
				iKills--;
			}
			else
			{
				// killed by an enemy
				
				iKills++;
			}
			
			get_user_name( iKiller, szName ,charsmax( szName ) );
			
			formatex( szKills, charsmax( szKills ), "%i %s", iKills, szName );
			
			fvault_set_data( g_szVaultName, szSteamID, szKills );
		}
		else
		{
			// killed self somehow
		}
	}
}

GetPlayerRanks( &Array:aRankData )
{
	aRankData = ArrayCreate( RankData );
	new iTotal;
	
	new eRankData[ RankData ];
	
	new szFileName[ 128 ];
	_FormatVaultName( g_szVaultName, szFileName, charsmax( szFileName ) );
	
	new iFile = fopen( szFileName, "rt" );
	
	if( !iFile )
	{
		return iTotal;
	}
	
	new szFileData[ 128 ];
	new szKills[ 48 ];
	
	while( !feof( iFile ) )
	{
		fgets( iFile, szFileData, charsmax( szFileData ) );
		trim( szFileData );
		
		if( !szFileData[ 0 ] )
		{
			continue;
		}
		
		parse( szFileData, eRankData[ Rank_SteamID ], charsmax( eRankData[ Rank_SteamID ] ), szKills, charsmax( szKills ) );
		strbreak( szKills, szKills, charsmax( szKills ), eRankData[ Rank_Name ], charsmax( eRankData[ Rank_Name ] ) );
		eRankData[ Rank_Kills ] = str_to_num( szKills );
		
		ArrayPushArray( aRankData, eRankData );
		
		iTotal++;
	}
	
	fclose( iFile );
	
	ArraySort( aRankData, "SortData" );
	
	return iTotal;
}

public SortData( Array:aData, iIndex1, iIndex2, const iSortData[ ], iSortDataSize )
{
	new eData1[ RankData ], eData2[ RankData ];
	ArrayGetArray( aData, iIndex1, eData1 );
	ArrayGetArray( aData, iIndex2, eData2 );
	
	return clamp( ( eData2[ Rank_Kills ] - eData1[ Rank_Kills ] ), -1, 1 );
}

stock MakeNameMOTDSafe( szName[ 128 ], iMaxChars )
{
	szName[ 32 ] = 0;
	
	replace_all( szName, 127, "&", "&amp;" );
	replace_all( szName, 127, "<", "&lt;" );
	replace_all( szName, 127, ">", "&gt;" );
	replace_all( szName, 127, "^"", "&quot;" );
	
	if( iMaxChars > 128 ) return;
	
	new iLast;
	for( new i = 0; i < 128 && szName[ i ]; )
	{
		if( szName[ i ] == '&' )
		{
			if( equal( szName[ i ], "&amp;", 5 ) )
			{
				i += 4;
			}
			else if( equal( szName[ i ], "&quot;", 6 ) )
			{
				i += 5;
			}
			else if( equal( szName[ i ], "&lt;", 4 ) || equal( szName[ i ], "&gt;", 4 ) )
			{
				i += 3;
			}
		}
		
		if( ++i > iMaxChars )
		{
			break;
		}
		
		iLast = i;
	}
	
	szName[ iLast ] = 0;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
но в момента MOTD ми излиза така: http://prntscr.com/lmqc55
мъчих се да намеря решение, но не виждам от как да го оправя.. искам да се вижда в черно името на играча или да сменя целият стил на MOTD екрана..
примерно нещо като това: Изображение

Някой по-запознат да помогне ? Благодаря ! :)
Последна промяна от MF1 CS-BG на 09 фев 2019, 20:54, променено общо 1 път.
The Best Zombie BaseBuilder server in Bulgaria is online again ! Join now.
93.123.18.54:27018 :bg:

Потребителски аватар

Автор на темата
MF1 CS-BG
Потребител
Потребител
Мнения: 301
Регистриран: 12 окт 2016, 21:15
Местоположение: Varna
Получена благодарност: 6 пъти
Контакти:

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от MF1 CS-BG » 09 фев 2019, 20:52

От няколко месеца насам се мъча по темата, за слабите ми познания днес стигнах до някакъв напредък -> промених изяцяло MOTD като този от 2рата снимка, но не успях да изкарам името на играча...
пробвах да го изкарам чрез

Код: Избери всички

get_user_name 
+

Код: Избери всички

eRankData[ Rank_Name ]
но тогава ми изкарва името на сървъра ....:headbang: :mad:
не искам да бъда нагъл, но много искам да видя къде бъркам и как точно трябва да бъде оправен този "бъг"... отделил съм общо над 5-6 часа над този проблем.. . вие тук сте ми последната надежда..... и все тайно се надявам някой да погледне темата но уви.... много ли е трудна редакцията ?
Мисля, че в тази функция е проблема:

Код: Избери всички

public CmdTop( iPlayer )
{
	new Array:aRankData;
	new iTotal = max( 0, min( GetPlayerRanks( aRankData ), get_pcvar_num( pCvar_Top ) ) );
	
	if( iTotal )
	{
		static szMOTD[ 2500 ], iDefaultLen;
		if( !iDefaultLen )
		{
			iDefaultLen = copy( szMOTD, charsmax( szMOTD ), "<body><table align=center border=1><thead><tr><th>#.</th><th>Name</th><th>Kills</th></tr></thead><tbody>" );
		}
		
		new iLen = iDefaultLen;
		
		new eRankData[ RankData ];
		
		new szFixedName[ 128 ];
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			copy( szFixedName, charsmax( szFixedName ), eRankData[ Rank_Name ] );
			
			MakeNameMOTDSafe( szFixedName, 31 );
			
			iLen += formatex( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "<tr><td>%i</td><td>%s</td><td>%i</td></tr>", ( i + 1 ), szFixedName, eRankData[ Rank_Kills ] );
		}
		
		copy( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "</tbody></table></body>" );
		
		show_motd( iPlayer, szMOTD, "Top Players" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* No players have been put on the top!" );
	}
	
	ArrayDestroy( aRankData );
}
Ето и код за подобен на този MOTD от втората снимка(желания за краен ефект) който ползвах за да "закърпя" нещо:

Код: Избери всички

public cmdTop10(id)
{
   pos = copy(g_Buffer,2047,"<html><head><body><style type= ^"text/css^">")
   pos += copy(g_Buffer[pos],2047-pos,"body{font-family:Verdana;font-size:12px;font-weight:bold;color:#4F94CD;background-color:#000000;}.style1 {color:#4F94CD;font-weight:bold;font-size:12px;}.style2{font-family:Verdana;font-size:11px;font-weight:bold;color:#FFFFFF;}</style><center><font size=4><font color:#4F94CD><B>Best 10 Players</B></color></front><hr size=0 color=black></head>")
   pos += copy(g_Buffer[pos],2047-pos,"<body><center><table><tr class=^"style1^"><td>Rank</td><td>Name</td><td>Points</td></tr>")

   new imax = get_statsnum()

   if (imax > 10)
      imax = 10

   for(new a = 0; a < imax; ++a)
   {
      get_stats(a,stats,body,name,31)
      while( contain ( name, "<" ) != -1 )
         replace( name, 32, "<", "&lt;" )

      pos += format(g_Buffer[pos],2047-pos, "<tr class=^"style2^"><td>[ %d ]</td><td>%s</td><td>%d</td>",a+1,name,stats[0])
   }
   copy(g_Buffer[pos],2047-pos,"</table><hr size=0 color=black></font>www.playi.info")

   show_motd(id,g_Buffer,"Top")

   return PLUGIN_CONTINUE
}
Плъгина и MOTD взех от тази тема: https://forums.alliedmods.net/showthread.php?t=126256
Не ме разбирайте погрешно, благодаря ви !
The Best Zombie BaseBuilder server in Bulgaria is online again ! Join now.
93.123.18.54:27018 :bg:

Потребителски аватар

<VeCo>
AMXX Скриптър
AMXX Скриптър
Мнения: 77
Регистриран: 28 яну 2019, 19:01
Се отблагодари: 2 пъти
Получена благодарност: 23 пъти

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от <VeCo> » 09 фев 2019, 22:34

Е сега на мястото на името какво изкарва? Не трябва ли да си го има по принцип?
Последна промяна от <VeCo> на 09 фев 2019, 22:38, променено общо 1 път.
:pepo_think3:

Потребителски аватар

enemys
Потребител
Потребител
Мнения: 15
Регистриран: 07 фев 2019, 22:35
Получена благодарност: 1 път

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от enemys » 09 фев 2019, 22:37

Изкарва името на сървъра

Потребителски аватар

Автор на темата
MF1 CS-BG
Потребител
Потребител
Мнения: 301
Регистриран: 12 окт 2016, 21:15
Местоположение: Varna
Получена благодарност: 6 пъти
Контакти:

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от MF1 CS-BG » 09 фев 2019, 22:39

<VeCo> написа:
09 фев 2019, 22:34
Е сега на мястото на името какво изкарва? Не трябва ли да си го има по принцип?
Премахнах мойте изработки и оставих оригиналния код и показва това от първия пост: http://prntscr.com/lmqc55
The Best Zombie BaseBuilder server in Bulgaria is online again ! Join now.
93.123.18.54:27018 :bg:

Потребителски аватар

<VeCo>
AMXX Скриптър
AMXX Скриптър
Мнения: 77
Регистриран: 28 яну 2019, 19:01
Се отблагодари: 2 пъти
Получена благодарност: 23 пъти

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от <VeCo> » 09 фев 2019, 23:04

Запазваше по SteamID, оправих го да запазва по име.
Редактирах кода от първия пост, оправи си го с твоя стил:

Код: Избери всички

#include < amxmodx >
#include < fvault >

enum _:RankData
{
	Rank_Kills,
	Rank_Name[ 32 ]
};

new const g_szVaultName[ ] = "amxx_stats";

new pCvar_Top;

public plugin_init( )
{
	register_plugin( "AMXX Stats", "0.0.1", "Exolent" );
	
	register_srvcmd( "amxstats_reset", "CmdReset" );
	
	register_clcmd( "say /rank", "CmdRank" );
	register_clcmd( "say /top", "CmdTop" );
	register_clcmd( "say /top10", "CmdTop" );
	register_clcmd( "say /top15", "CmdTop" );
	
	register_event( "DeathMsg", "EventDeathMsg", "a" );
	
	pCvar_Top = register_cvar( "amxstats_top", "10" );

}

public CmdReset( )
{
	fvault_clear( g_szVaultName );
	
	server_print( "[BaseBuilder] Stats have been reset." );
	
	log_amx( "[BaseBuilder] Stats have been reset." );
	
	return PLUGIN_HANDLED;
}

public CmdRank( iPlayer )
{
	new Array:aRankData;
	new iTotal = GetPlayerRanks( aRankData );
	
	new iRank;
	new eRankData[ RankData ];
	
	if( iTotal )
	{
		new szPlayerName[ 32 ];
		get_user_name( iPlayer, szPlayerName, charsmax( szPlayerName ) );
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			if( equal( szPlayerName, eRankData[ Rank_Name ] ) )
			{
				iRank = i + 1;
				break;
			}
		}
	}
	
	if( iRank )
	{
		client_print( iPlayer, print_chat, "You are ranked %i of %i with %i kill%s!", iRank, iTotal, eRankData[ Rank_Kills ], ( eRankData[ Rank_Kills ] == 1 ) ? "" : "s" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* You are not ranked because you have not killed anyone!" );
	}
	
	ArrayDestroy( aRankData );
}

public CmdTop( iPlayer )
{
	new Array:aRankData;
	new iTotal = max( 0, min( GetPlayerRanks( aRankData ), get_pcvar_num( pCvar_Top ) ) );
	
	if( iTotal )
	{
		static szMOTD[ 2500 ], iDefaultLen;
		if( !iDefaultLen )
		{
			iDefaultLen = copy( szMOTD, charsmax( szMOTD ), "<body><table align=center border=1><thead><tr><th>#.</th><th>Name</th><th>Kills</th></tr></thead><tbody>" );
		}
		
		new iLen = iDefaultLen;
		
		new eRankData[ RankData ];
		
		new szFixedName[ 128 ];
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			copy( szFixedName, charsmax( szFixedName ), eRankData[ Rank_Name ] );
			
			MakeNameMOTDSafe( szFixedName, 31 );
			
			iLen += formatex( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "<tr><td>%i</td><td>%s</td><td>%i</td></tr>", ( i + 1 ), szFixedName, eRankData[ Rank_Kills ] );
		}
		
		copy( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "</tbody></table></body>" );
		
		show_motd( iPlayer, szMOTD, "Top Players" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* No players have been put on the top!" );
	}
	
	ArrayDestroy( aRankData );
}

public EventDeathMsg( )
{
	new iVictim = read_data( 2 );
	
	if( is_user_connected( iVictim ) )
	{
		new iKiller = read_data( 1 );
		
		if( iVictim != iKiller
		&&  is_user_connected( iKiller ) )
		{
			// killed by another player
			
			new szName[ 32 ];
			get_user_name( iKiller, szName, charsmax( szName ) );
			
			new szKills[ 48 ], iKills;
			if( fvault_get_data( g_szVaultName, szName, szKills, charsmax( szKills ) ) )
			{
				iKills = str_to_num( szKills );
			}
			
			if( get_user_team( iVictim ) == get_user_team( iKiller ) )
			{
				// killed by a teammate
				
				iKills--;
			}
			else
			{
				// killed by an enemy
				
				iKills++;
			}
			
			get_user_name( iKiller, szName ,charsmax( szName ) );
			
            num_to_str(iKills, szKills, charsmax(szKills))
            
			fvault_set_data( g_szVaultName, szName, szKills );
		}
		else
		{
			// killed self somehow
		}
	}
}

GetPlayerRanks( &Array:aRankData )
{
	aRankData = ArrayCreate( RankData );
	new iTotal;
	
	new eRankData[ RankData ];
	
	new szFileName[ 128 ];
	_FormatVaultName( g_szVaultName, szFileName, charsmax( szFileName ) );
	
	new iFile = fopen( szFileName, "rt" );
	
	if( !iFile )
	{
		return iTotal;
	}
	
	new szFileData[ 128 ];
	new szKills[ 48 ];
	
	while( !feof( iFile ) )
	{
		fgets( iFile, szFileData, charsmax( szFileData ) );
		trim( szFileData );
		
		if( !szFileData[ 0 ] )
		{
			continue;
		}
		
		parse( szFileData, eRankData[ Rank_Name ], charsmax( eRankData[ Rank_Name ] ), szKills, charsmax( szKills ) );
        eRankData[ Rank_Kills ] = str_to_num( szKills );
		
		ArrayPushArray( aRankData, eRankData );
		
		iTotal++;
	}
	
	fclose( iFile );
	
	ArraySort( aRankData, "SortData" );
	
	return iTotal;
}

public SortData( Array:aData, iIndex1, iIndex2, const iSortData[ ], iSortDataSize )
{
	new eData1[ RankData ], eData2[ RankData ];
	ArrayGetArray( aData, iIndex1, eData1 );
	ArrayGetArray( aData, iIndex2, eData2 );
	
	return clamp( ( eData2[ Rank_Kills ] - eData1[ Rank_Kills ] ), -1, 1 );
}

stock MakeNameMOTDSafe( szName[ 128 ], iMaxChars )
{
	szName[ 32 ] = 0;
	
	replace_all( szName, 127, "&", "&amp;" );
	replace_all( szName, 127, "<", "&lt;" );
	replace_all( szName, 127, ">", "&gt;" );
	replace_all( szName, 127, "^"", "&quot;" );
	
	if( iMaxChars > 128 ) return;
	
	new iLast;
	for( new i = 0; i < 128 && szName[ i ]; )
	{
		if( szName[ i ] == '&' )
		{
			if( equal( szName[ i ], "&amp;", 5 ) )
			{
				i += 4;
			}
			else if( equal( szName[ i ], "&quot;", 6 ) )
			{
				i += 5;
			}
			else if( equal( szName[ i ], "&lt;", 4 ) || equal( szName[ i ], "&gt;", 4 ) )
			{
				i += 3;
			}
		}
		
		if( ++i > iMaxChars )
		{
			break;
		}
		
		iLast = i;
	}
	
	szName[ iLast ] = 0;
}
:pepo_think3:

Потребителски аватар

Автор на темата
MF1 CS-BG
Потребител
Потребител
Мнения: 301
Регистриран: 12 окт 2016, 21:15
Местоположение: Varna
Получена благодарност: 6 пъти
Контакти:

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от MF1 CS-BG » 09 фев 2019, 23:15

<VeCo> написа:
09 фев 2019, 23:04
Запазваше по SteamID, оправих го да запазва по име.
Редактирах кода от първия пост, оправи си го с твоя стил:

Код: Избери всички

#include < amxmodx >
#include < fvault >

enum _:RankData
{
	Rank_Kills,
	Rank_Name[ 32 ]
};

new const g_szVaultName[ ] = "amxx_stats";

new pCvar_Top;

public plugin_init( )
{
	register_plugin( "AMXX Stats", "0.0.1", "Exolent" );
	
	register_srvcmd( "amxstats_reset", "CmdReset" );
	
	register_clcmd( "say /rank", "CmdRank" );
	register_clcmd( "say /top", "CmdTop" );
	register_clcmd( "say /top10", "CmdTop" );
	register_clcmd( "say /top15", "CmdTop" );
	
	register_event( "DeathMsg", "EventDeathMsg", "a" );
	
	pCvar_Top = register_cvar( "amxstats_top", "10" );

}

public CmdReset( )
{
	fvault_clear( g_szVaultName );
	
	server_print( "[BaseBuilder] Stats have been reset." );
	
	log_amx( "[BaseBuilder] Stats have been reset." );
	
	return PLUGIN_HANDLED;
}

public CmdRank( iPlayer )
{
	new Array:aRankData;
	new iTotal = GetPlayerRanks( aRankData );
	
	new iRank;
	new eRankData[ RankData ];
	
	if( iTotal )
	{
		new szPlayerName[ 32 ];
		get_user_name( iPlayer, szPlayerName, charsmax( szPlayerName ) );
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			if( equal( szPlayerName, eRankData[ Rank_Name ] ) )
			{
				iRank = i + 1;
				break;
			}
		}
	}
	
	if( iRank )
	{
		client_print( iPlayer, print_chat, "You are ranked %i of %i with %i kill%s!", iRank, iTotal, eRankData[ Rank_Kills ], ( eRankData[ Rank_Kills ] == 1 ) ? "" : "s" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* You are not ranked because you have not killed anyone!" );
	}
	
	ArrayDestroy( aRankData );
}

public CmdTop( iPlayer )
{
	new Array:aRankData;
	new iTotal = max( 0, min( GetPlayerRanks( aRankData ), get_pcvar_num( pCvar_Top ) ) );
	
	if( iTotal )
	{
		static szMOTD[ 2500 ], iDefaultLen;
		if( !iDefaultLen )
		{
			iDefaultLen = copy( szMOTD, charsmax( szMOTD ), "<body><table align=center border=1><thead><tr><th>#.</th><th>Name</th><th>Kills</th></tr></thead><tbody>" );
		}
		
		new iLen = iDefaultLen;
		
		new eRankData[ RankData ];
		
		new szFixedName[ 128 ];
		
		for( new i = 0; i < iTotal; i++ )
		{
			ArrayGetArray( aRankData, i, eRankData );
			
			copy( szFixedName, charsmax( szFixedName ), eRankData[ Rank_Name ] );
			
			MakeNameMOTDSafe( szFixedName, 31 );
			
			iLen += formatex( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "<tr><td>%i</td><td>%s</td><td>%i</td></tr>", ( i + 1 ), szFixedName, eRankData[ Rank_Kills ] );
		}
		
		copy( szMOTD[ iLen ], charsmax( szMOTD ) - iLen, "</tbody></table></body>" );
		
		show_motd( iPlayer, szMOTD, "Top Players" );
	}
	else
	{
		client_print( iPlayer, print_chat, "* No players have been put on the top!" );
	}
	
	ArrayDestroy( aRankData );
}

public EventDeathMsg( )
{
	new iVictim = read_data( 2 );
	
	if( is_user_connected( iVictim ) )
	{
		new iKiller = read_data( 1 );
		
		if( iVictim != iKiller
		&&  is_user_connected( iKiller ) )
		{
			// killed by another player
			
			new szName[ 32 ];
			get_user_name( iKiller, szName, charsmax( szName ) );
			
			new szKills[ 48 ], iKills;
			if( fvault_get_data( g_szVaultName, szName, szKills, charsmax( szKills ) ) )
			{
				iKills = str_to_num( szKills );
			}
			
			if( get_user_team( iVictim ) == get_user_team( iKiller ) )
			{
				// killed by a teammate
				
				iKills--;
			}
			else
			{
				// killed by an enemy
				
				iKills++;
			}
			
			get_user_name( iKiller, szName ,charsmax( szName ) );
			
            num_to_str(iKills, szKills, charsmax(szKills))
            
			fvault_set_data( g_szVaultName, szName, szKills );
		}
		else
		{
			// killed self somehow
		}
	}
}

GetPlayerRanks( &Array:aRankData )
{
	aRankData = ArrayCreate( RankData );
	new iTotal;
	
	new eRankData[ RankData ];
	
	new szFileName[ 128 ];
	_FormatVaultName( g_szVaultName, szFileName, charsmax( szFileName ) );
	
	new iFile = fopen( szFileName, "rt" );
	
	if( !iFile )
	{
		return iTotal;
	}
	
	new szFileData[ 128 ];
	new szKills[ 48 ];
	
	while( !feof( iFile ) )
	{
		fgets( iFile, szFileData, charsmax( szFileData ) );
		trim( szFileData );
		
		if( !szFileData[ 0 ] )
		{
			continue;
		}
		
		parse( szFileData, eRankData[ Rank_Name ], charsmax( eRankData[ Rank_Name ] ), szKills, charsmax( szKills ) );
        eRankData[ Rank_Kills ] = str_to_num( szKills );
		
		ArrayPushArray( aRankData, eRankData );
		
		iTotal++;
	}
	
	fclose( iFile );
	
	ArraySort( aRankData, "SortData" );
	
	return iTotal;
}

public SortData( Array:aData, iIndex1, iIndex2, const iSortData[ ], iSortDataSize )
{
	new eData1[ RankData ], eData2[ RankData ];
	ArrayGetArray( aData, iIndex1, eData1 );
	ArrayGetArray( aData, iIndex2, eData2 );
	
	return clamp( ( eData2[ Rank_Kills ] - eData1[ Rank_Kills ] ), -1, 1 );
}

stock MakeNameMOTDSafe( szName[ 128 ], iMaxChars )
{
	szName[ 32 ] = 0;
	
	replace_all( szName, 127, "&", "&amp;" );
	replace_all( szName, 127, "<", "&lt;" );
	replace_all( szName, 127, ">", "&gt;" );
	replace_all( szName, 127, "^"", "&quot;" );
	
	if( iMaxChars > 128 ) return;
	
	new iLast;
	for( new i = 0; i < 128 && szName[ i ]; )
	{
		if( szName[ i ] == '&' )
		{
			if( equal( szName[ i ], "&amp;", 5 ) )
			{
				i += 4;
			}
			else if( equal( szName[ i ], "&quot;", 6 ) )
			{
				i += 5;
			}
			else if( equal( szName[ i ], "&lt;", 4 ) || equal( szName[ i ], "&gt;", 4 ) )
			{
				i += 3;
			}
		}
		
		if( ++i > iMaxChars )
		{
			break;
		}
		
		iLast = i;
	}
	
	szName[ iLast ] = 0;
}
малеее най-сетне се появи, но в момента е така - http://prntscr.com/mix8dd
има ли начин да показва имената :?

Добавено преди 2 минути 41 секунди:


всъщност всичко е точно вече... трябва да премахна fvalut файла :)
БЛАГОДАРЯ ТИ !
Какво точно направи ?
The Best Zombie BaseBuilder server in Bulgaria is online again ! Join now.
93.123.18.54:27018 :bg:

Потребителски аватар

<VeCo>
AMXX Скриптър
AMXX Скриптър
Мнения: 77
Регистриран: 28 яну 2019, 19:01
Се отблагодари: 2 пъти
Получена благодарност: 23 пъти

Преработка на МОТD прозорец/таблица в amx_stats (only kills)

Мнение от <VeCo> » 09 фев 2019, 23:20

Мда, щото са били запазени със SteamID :/
Трябва да се редактира файла и да се изчистат SteamID-тата, ако искаш прати го на ЛС.
:pepo_think3:

Отговори

Върни се в “Заявки за плъгини”

Кой е на линия

Потребители, разглеждащи този форум: Няма регистрирани потребители и 1 гост