Page 1 of 2

Plugin stergere admin inactivi!

Posted: 25 Jan 2019, 23:57
by Syncron~
Salut,acum mult timp am incercat sa fac eu singur un plugin care dupa un anumit timp, sa stearga adminii care nu au mai intrat de x zile/saptamani/luni pe server prin metoda nVault,dar nu am reusit, am ceva inceput daca doriti fi-l pot posta nu e nici o problema poate venitii cu idei/modificari asupra lui.
Ceea ce vreau eu sa spun este ca sunt dispus sa platesc o suma acceptabila nu una COLOSALA ,pentru acest plugin,doresc sa raspunda cei, care stiu despre ce este vorba.
Ma gandesc ca ar fii ceva util si pentru altii un asemenea plugin, acum nu stiu ce sa zic poate altii prefera munca manuala.

Note:Nu am postat la Anunturi - vanzare/cumparare,deoarece am crezut ca nu e o sectiune prea vizitata de scripteri, daca este obligatoriu, o postez acolo.
Sper ca s-a inteles ce doresc!

Re: Plugin stergere admin inactivi!

Posted: 26 Jan 2019, 15:14
by levin

Re: Plugin stergere admin inactivi!

Posted: 27 Jan 2019, 15:50
by Syncron~
Nu este ceea ce am dorit sa spun in topic! :)

Re: Plugin stergere admin inactivi!

Posted: 27 Jan 2019, 21:32
by levin
atunci vezi pe aici - cereri-pluginuri/plugin-admin-t215315.html

Re: Plugin stergere admin inactivi!

Posted: 03 Mar 2019, 16:35
by nikod1606
Levinn plugin ul ala nu e terminat e 80 la suta am facut si eu cerere pentru ca mi se pare genial si as contribui si eu cu 10 euro pentru al termina

Re: Plugin stergere admin inactivi!

Posted: 03 Mar 2019, 16:48
by levin
păi de ce e doar 80%?

Re: Plugin stergere admin inactivi!

Posted: 03 Mar 2019, 21:33
by nikod1606
am inteles ca sunt buguri la el si s-a anulat proiectul , uita te in comentarii explica baietii mai bine .

Re: Plugin stergere admin inactivi!

Posted: 03 Mar 2019, 21:44
by levin
nu stau să citesc atâtea pagini,srry

Re: Plugin stergere admin inactivi!

Posted: 04 Mar 2019, 10:54
by nikod1606
asta e sursa
| Afiseaza codul
#include < amxmodx >
#include < amxmisc >
#include < nvault >

#define PLUGIN "Admins activity"
#define VERSION "0.1"


#define MAX_WARN	5 

new g_szFile[ 64 ];
new const g_szFileName[ ] = "admini.ini" 		/* Numele la fisierul de unde sunt incarcate datele fiecarui admin */

new g_iPlayerStats[ 33 ];
new g_iPlayerMinutes[ 33 ];
new g_iPlayerWarn[ 33 ];

new g_iHourPlayer[ 33 ];


public plugin_init( )
{
	register_plugin( PLUGIN, VERSION, "falcao" );
	
	/* Verificare fisier */
	
	get_configsdir( g_szFile, sizeof( g_szFile ) -1 );
	format( g_szFile, sizeof( g_szFile ) -1, "%s/%s", g_szFile, g_szFileName );
	
	if( !file_exists( g_szFile ) )
	{
		write_file( g_szFile, "; Activitate admini", -1 );
	}
	
	/* Clcmd */
	
	register_clcmd( "say /warn", "cmdWarn" );
	register_clcmd( "say /program", "cmdProgram" );
}

public client_putinserver( id )
{
	new iHour, iMinute;
	time( iHour, iMinute, _ );

	
		LoadHours( id );
		
		set_task( 60.0, "adaugareMinut", id, _, _, "b", _ );
		
		static szName[ 32 ];
		get_user_name( id, szName, sizeof( szName ) -1 );
		
		set_task( 3.0, "verifyPlayer", id );
		
		if( g_iPlayerWarn[ id ] >= MAX_WARN )
		{
			new szFile = fopen( "addons/amxmodx/configs/users.ini", "r" );
			
			if( !szFile )
				return 1;
			
			new szData[ 512 ], szParseName[ 32 ], szParsePassword[ 32 ], szParseFlags[ 32 ], szParseRFlags[ 32 ], iLine;
			
			while( !feof( szFile ) )
			{
				fgets( szFile, szData, sizeof( szData ) -1 );
				
				if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/' )
					continue;
					
				parse( szData, szParseName, sizeof( szParseName ) -1, szParsePassword, sizeof( szParsePassword ) -1, szParseFlags, sizeof( szParseFlags ) -1, szParseRFlags, sizeof( szParseRFlags ) -1 );
				
				if( equali( szParseName, szName ) )
				{
					new szPlayerInfo[ 256 ];
					format( szPlayerInfo, sizeof( szPlayerInfo ) -1, "; ^"%s^" ^"%s^" ^"%s^" ^"%s^"", szParseName, szParsePassword, szParseFlags, szParseRFlags );
					
					write_file( "addons/amxmodx/configs/users.ini", szPlayerInfo, iLine );
					
					g_iPlayerWarn[ id ] = 0;
					
					set_task( 3.0, "mesajWarn", id );
				}
				
				iLine++;
			}
			
			fclose( szFile );
		} 
	
	return 1;
}

public mesajWarn( id )
{
	C_PrintChat( id, "Ai facut !v5!c/!v5!c warn-uri. Adminul tau a fost oprit." );
}

public cmdWarn( id )
{
	new szFile = fopen( g_szFile, "r" );
	
	if( !szFile )
		return 1;
	
	new szData[ 512 ], szParseName[ 32 ], szParseHours[ 32 ];
	
	while( !feof( szFile ) )
	{
		fgets( szFile, szData, sizeof( szData ) -1 );
		
		if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/' )
			continue;
		
		parse( szData,\
			szParseName, sizeof( szParseName ),\
			szParseHours, sizeof( szParseHours ) );
		
		static szName[ 32 ];
		get_user_name( id, szName, sizeof( szName ) -1 );
		
		if( equali( szParseName, szName ) ) 
		{
			C_PrintChat( id, "Ai !v%i!c/!v%i!c warn-uri, respectati programul zilnic sau primesti remove.", g_iPlayerWarn[ id ], MAX_WARN );
		}
	}
	
	fclose( szFile );
	
	return 1;
}

public cmdProgram( id )
{
	if( get_user_flags( id ) & ADMIN_SLAY )
	{
		new szFile = fopen( g_szFile, "r" );
		
		if( !szFile )
			return 1;
		
		new szData[ 512 ], szParseName[ 32 ], szParseHours[ 32 ];
		
		while( !feof( szFile ) )
		{
			fgets( szFile, szData, sizeof( szData ) -1 );
			
			if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/' )
				continue;
			
			parse( szData, szParseName, sizeof( szParseName ), szParseHours, sizeof( szParseHours ) );
			
			static szName[ 32 ];
			get_user_name( id, szName, sizeof( szName ) -1 );

			if( equali( szParseName, szName ) ) 
			{
				C_PrintChat( id, "Mai ai !v%i!c ore pana iti termini programul de azi.", g_iHourPlayer[ id ] );
			}
		}
		
		fclose( szFile );
	}
	
	else
	{
		C_PrintChat( id, "Ne pare rau, dar nu ai admin pe server." );
	}
	
	return 1;
}

public client_disconnect( id )
{
	new iHour, iMinute;
	time( iHour, iMinute, _ );

	
		SaveHours( id );
	
}

public adaugareMinut( id )
{
	if( is_user_connected( id ) && !is_user_bot( id ) )
	{
		g_iPlayerStats[ id ] += 1;
		
		if( g_iPlayerMinutes[ id ] >= 60 )
		{
			g_iHourPlayer[ id ] -= 1;
			g_iPlayerStats[ id ] += 1;
			g_iPlayerMinutes[ id ] -= 60;
		}
	}
}

public verifyPlayer( id )
{
	new szFile = fopen( g_szFile, "r" );
	
	if( !szFile )
		return 1;
	
	new szData[ 512 ], szParseName[ 32 ], szParseHours[ 32 ];
	
	static szName[ 32 ];
	get_user_name( id, szName, sizeof( szName ) -1 );
	
	while( !feof( szFile ) )
	{
		fgets( szFile, szData, sizeof( szData ) -1 );
		
		if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/' )
			continue;
		
		parse( szData, szParseName, sizeof( szParseName ), szParseHours, sizeof( szParseHours ) );
		
		if( equali( szParseName, szName ) ) 
		{
			if( g_iPlayerStats[ id ] >= str_to_num( szParseHours ) )
			{
				log_to_file( "activity_admins.log", "%s si-a respectat programul cu %i/%i ore.", szName, g_iPlayerStats[ id ], str_to_num( szParseHours ) );	
			}
			
			else
			{
				log_to_file( "activity_admins.log", "%s a stat doar %i minute pe server. A primit 1 warn.", szName, g_iPlayerStats[ id ], str_to_num( szParseHours ), g_iPlayerMinutes[ id ] );
				
				C_PrintChat( id, "Atentie ! Azi ai facut !v%i!c minute. Trebuie sa stai minim !v%i!c ore.", g_iPlayerMinutes[ id ], str_to_num( szParseHours ), str_to_num( szParseHours ) );
				C_PrintChat( id, "Ai primit !v1!c warn, pentru ca nu ai stat !v%i!c ore. (!v%i!c/!v%i!c)", str_to_num( szParseHours ), g_iPlayerStats[ id ], str_to_num( szParseHours ) );
				
				g_iPlayerWarn[ id ] += 1;
			}
			
			g_iHourPlayer[ id ] =  str_to_num( szParseHours );
		}
	}
	
	fclose( szFile );
	
	return 1;
}
		
public LoadHours( id )
{
	new szVaultData[ 256 ], szVaultKey[ 32 ];
	
	static szName[ 32 ];
	get_user_name( id, szName, sizeof( szName ) -1 );
	
	format( szVaultKey, sizeof( szVaultKey ) -1, "%s", szName );
	format( szVaultData, sizeof( szVaultData ) -1, "%i#%i#%i", g_iPlayerStats[ id ], g_iPlayerMinutes[ id ], g_iPlayerWarn[ id ] );	
	
	new szVaultFile = nvault_open( "_file_activity_adm" );
	nvault_get( szVaultFile, szVaultKey, szVaultData, sizeof( szVaultData ) -1 );
	
	replace_all( szVaultData, sizeof( szVaultData ), "#", " " );
	
	new iHours[ 32 ], iWarn[ 33 ], iMinutes[ 33 ];
	parse( szVaultData,\
		iHours, sizeof( iHours ) -1,\
		iWarn, sizeof( iWarn ) -1,\
		iMinutes, sizeof( iMinutes ) -1 );
	
	g_iPlayerStats[ id ] = str_to_num( iHours );
	g_iPlayerWarn[ id ] = str_to_num( iWarn );
	g_iPlayerMinutes[ id ] = str_to_num( iMinutes );
}

public SaveHours( id )
{
	new szVaultData[ 256 ], szVaultKey[ 32 ];
	
	static szName[ 32 ];
	get_user_name( id, szName, sizeof( szName ) -1 );
	
	format( szVaultKey, sizeof( szVaultKey ) -1, "%s", szName );
	format( szVaultData, sizeof( szVaultData ) -1, "%i#%i#%i", g_iPlayerStats[ id ], g_iPlayerMinutes[ id ], g_iPlayerWarn[ id ] );
	
	new szVaultFile = nvault_open( "_file_activity_adm" );
	nvault_set( szVaultFile, szVaultKey, szVaultData );
}

stock C_PrintChat( const id, const szInput[ ], any:... )
{
	new iPlayers[ 32 ], iNum = 1;
	
	static szMsg[ 320 ], szMsg2[ 320 ];
	
	vformat( szMsg, sizeof( szMsg ) -130, szInput, 3 );
	format( szMsg2, sizeof( szMsg2 ) -130, "!c[!vHNS!c] %s", szMsg );
	
	replace_all( szMsg2, sizeof( szMsg ) -130, "!v", "^x04" );
	replace_all( szMsg2, sizeof( szMsg ) -130, "!c", "^x01" );
	replace_all( szMsg2, sizeof( szMsg ) -130, "!e", "^x03" );
	
	if( id )
	{
		iPlayers[ 0 ] = id;
	}
	
	else
	{
		get_players( iPlayers, iNum, "c" );
	}
	
	for( new i = 0; i < iNum; i++ )
	{
		if( is_user_connected( iPlayers[ i ] ) )
		{
			message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, iPlayers[ i ] );
			
			write_byte( iPlayers[ i ] );
			write_string( szMsg2 );
			
			message_end( );
		}
	}
}



probleme , la retry iei warn nu stiu de ce https://i.imgur.com/o3kh53W.png si nu se salveaza minutele warn chestii de genu mai pe scurt nu se salveaza cat stai pe sv .. sper sa poti levin sa-l faci

Re: Plugin stergere admin inactivi!

Posted: 04 Mar 2019, 14:17
by levin
eu văd că merge bine, ai luat warn că nu ai stat 4 ore, ci doar 1 minut

Re: Plugin stergere admin inactivi!

Posted: 04 Mar 2019, 15:56
by nikod1606
testeaza cand da-i retry sa vezi ca iti da warn .. si uite logs din admin activity L 03/04/2019 - 10:47:58: Log file started (file "cstrike/addons/amxmodx/logs/activity_admins.log") (game "cstrike") (amx "1.8.2-dev")
L 03/04/2019 - 10:47:58: Nikod a stat doar 1 minute pe server. A primit 1 warn.
L 03/04/2019 - 10:49:24: Nikod a stat doar 2 minute pe server. A primit 1 warn.
L 03/04/2019 - 10:50:41: Nikod a stat doar 2 minute pe server. A primit 1 warn.
L 03/04/2019 - 10:52:12: Nikod si-a respectat programul cu 6/4 ore.
L 03/04/2019 - 10:52:43: Nikod si-a respectat programul cu 7/4 ore.
L 03/04/2019 - 13:18:48: Nikod si-a respectat programul cu 24/4 ore.
L 03/04/2019 - 13:19:29: Nikod si-a respectat programul cu 25/4 ore.
cand s-au inregistrat 25 de ore ? de la 10 la 13 ? ...
el e facut pe ziua respectiva sa nu iesi deloc cred 4 ore incontinu , dar daca da-i retry sa ti se pastreze minutele pe care le-ai jucat in ziua respectiva si poti sa-l faci si fiind un raport saptamanal ..

Re: Plugin stergere admin inactivi!

Posted: 04 Mar 2019, 19:57
by levin

Code: Select all

#include < amxmodx >
#include < amxmisc >
#include < nvault >

#define PLUGIN "Admins activity"
#define VERSION "0.1"

#pragma tabsize 0
#define MAX_WARN	5 

new g_szFile[ 128 ];
new const g_szFileName[ ] = "admini.ini" 		/* Numele la fisierul de unde sunt incarcate datele fiecarui admin */

new g_iPlayerWarn[ 33 ];
new g_iPlayerMinutes[ 33 ];
new g_iHourPlayer[ 33 ];
new szName[ 33 ][32];

new szData[ 512 ], szParseName[ 32 ], szParsePassword[ 32 ], szParseFlags[ 32 ], szParseRFlags[ 32 ], iLine,
szParseHours[ 32 ],szFile,szVaultData[ 256 ], szVaultKey[ 32 ];

new const nVault_Name[]="Activitate_Admini"
new g_vault

public plugin_init( )
{
	register_plugin( PLUGIN, VERSION, "falcao" );
	
	/* Verificare fisier */
	
	get_configsdir( g_szFile, sizeof( g_szFile ) -1 );
	formatex( g_szFile, sizeof( g_szFile ) -1, "%s/%s", g_szFile, g_szFileName );
	
	if( !file_exists( g_szFile ) )
	{
		write_file( g_szFile, "; Adaugare ^"nume admin^" ^"ore necesare^"^n; Pentru evitarea citirii cuiva pune ^";^" in fata sa.");
	}
	
	/* Clcmd */
	
	register_clcmd( "say /warn", "cmdWarn" );
	register_clcmd( "say /program", "cmdProgram" );
	
	
	g_vault = nvault_open(nVault_Name)
	if(g_vault == INVALID_HANDLE)
		set_fail_state("Eroare la deschiderea bazei de date din vault.")
	
	set_task(5.0,"read_vault",_,_,_,"b")
}

public read_vault() {
	new iPlayers[32],iNum,id,i;
	get_players(iPlayers,iNum,"c");
	for(i = 0; i < iNum; i++)
	{
		id = iPlayers[i];
		if(!is_user_admin(id))	continue;
		SaveHours(id);
	}
}

public client_infochanged(id) {
	SaveHours(id);
	new newname[32];
	get_user_info(id,"name",newname,charsmax(newname));
	if(!equal(newname,szName[id]))
	{
		set_task(0.3,"LoadHours",id);
		copy( szName[ id ], charsmax(szName[]), newname );
	}
}

public client_putinserver( id )
{
	if(is_user_bot(id)||!is_user_admin(id))	return;
	
	get_user_name( id, szName[id], charsmax(szName[]) );
	
	LoadHours( id );
	
	set_task( 3.0, "verifyPlayer", id );
	
	set_task( 60.0, "adaugareMinut", id, _, _, "b");
}

public client_disconnect( id )
{	
	SaveHours( id );
	remove_task(id);
}

public adaugareMinut( id )
{
	if( is_user_connected( id ) )
	{
		g_iPlayerMinutes[ id ]++;
		
		if( g_iPlayerMinutes[ id ] == 60 )
		{
			g_iHourPlayer[ id ] ++;
			g_iPlayerMinutes[ id ] = 0;
		}
	}
}

public verifyPlayer( id )
{
	szFile = fopen( g_szFile, "rt" );
	
	if( !szFile )
		return 1;
	
	while( !feof( szFile ) )
	{
		fgets( szFile, szData, sizeof( szData ) -1 );
		
		if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/'||!szData[0] )
			continue;
		
		parse( szData, szParseName, sizeof( szParseName ), szParseHours, sizeof( szParseHours ) );
		
		if( equal( szParseName, szName[id] ) ) 
		{
			if( g_iHourPlayer[ id ] >= str_to_num( szParseHours ) )
			{
				log_to_file( "activity_admins.log", "%s si-a respectat programul cu %d/%d or%s.", szName[id], g_iHourPlayer[ id ], str_to_num( szParseHours ),str_to_num( szParseHours )==1?"a":"e" );	
			}
			else
			{
				log_to_file( "activity_admins.log", "%s a stat doar %d minut%s pe server. A primit +1 warn.", szName[id], g_iPlayerMinutes[ id ],g_iPlayerMinutes[ id ]==1?"":"e" );
				
				C_PrintChat( id, "Atentie ! Azi ai facut !v%d!c minut%s. Trebuie sa stai minim !v%d!c or%s.", g_iPlayerMinutes[ id ],g_iPlayerMinutes[ id ]==1?"":"e", str_to_num( szParseHours ), str_to_num( szParseHours )==1?"a":"e" );
				C_PrintChat( id, "Ai primit !v+1!c warn, pentru ca nu ai stat !v%d!c or%s. (!v%d!c/!v%d!c)", str_to_num( szParseHours ),str_to_num( szParseHours )==1?"a":"e", g_iHourPlayer[ id ], str_to_num( szParseHours ) );
				
				if(++g_iPlayerWarn[ id ]>=MAX_WARN)	check_access(id)
				else	g_iPlayerWarn[ id ] ++;
			}
			
			break;
		}
	}
	
	fclose( szFile );
	
	return 1;
}

public mesajWarn( id )
{
	C_PrintChat( id, "Ai facut !v%d!c/!v%d!v warn!c-uri.!e Adminul tau a fost oprit!c.",MAX_WARN,MAX_WARN );
	//remove_task(id);
	return PLUGIN_HANDLED;
}

public check_access(id)
{
	if( g_iPlayerWarn[ id ] >= MAX_WARN )
	{
		szFile = fopen( "addons/amxmodx/configs/users.ini", "rt" );
		
		if( !szFile )
			return;
		
		while( !feof( szFile ) )
		{
			fgets( szFile, szData, sizeof( szData ) -1 );
			
			if( szData[ 0 ] == ';' || !szData[0])
				continue;
			
			parse( szData, szParseName, sizeof( szParseName ) -1, szParsePassword, sizeof( szParsePassword ) -1, szParseFlags, sizeof( szParseFlags ) -1, szParseRFlags, sizeof( szParseRFlags ) -1 );
			
			if( equal( szParseName, szName[id] ) )
			{
				new szPlayerInfo[ 256 ];
				formatex( szPlayerInfo, sizeof( szPlayerInfo ) -1, "; ^"%s^" ^"%s^" ^"%s^" ^"%s^"", szParseName, szParsePassword, szParseFlags, szParseRFlags );
				
				write_file( "addons/amxmodx/configs/users.ini", szPlayerInfo, iLine );
				
				g_iPlayerWarn[ id ] = 0;
				
				log_to_file( "activity_admins.log", "%s a primit remove pentru nerespectarea programului impus.", szName[id] );
				
				set_task( 3.0, "mesajWarn", id );
				
				break;
			}
			
			iLine++;
		}
		
		fclose( szFile );
	}
}

public cmdWarn( id )
{
	szFile = fopen( g_szFile, "rt" );
	
	if( !szFile )
		return 1;
	
	while( !feof( szFile ) )
	{
		fgets( szFile, szData, sizeof( szData ) -1 );
		
		if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/'||!szData[0] )
			continue;
		
		parse( szData,\
		szParseName, sizeof( szParseName ),\
		szParseHours, sizeof( szParseHours ) );
		
		if( equal( szParseName, szName[id] ) ) 
		{
			if(g_iPlayerWarn[ id ]<MAX_WARN)	C_PrintChat( id, "Ai !v%d!c/!v%d!c warn-uri, respectati programul zilnic sau primesti!e remove!c.", g_iPlayerWarn[ id ], MAX_WARN );
			else if(g_iPlayerWarn[ id ]>=MAX_WARN)	C_PrintChat( id, "Ai primit!v remove!c din cauza acumularii a!v %d!c/!v%d!e WARN!c-uri.", MAX_WARN,MAX_WARN );
				break
		}
	}
	
	fclose( szFile );
	
	return 1;
}

public cmdProgram( id )
{
	if( is_user_admin(id) )
	{
		szFile = fopen( g_szFile, "rt" );
		
		if( !szFile )
			return 1;
		
		while( !feof( szFile ) )
		{
			fgets( szFile, szData, sizeof( szData ) -1 );
			
			if( szData[ 0 ] == ';' || szData[ 0 ] == '!' || szData[ 0 ] == '/' && szData[ 1 ] == '/'||!szData[0] )
				continue;
			
			parse( szData, szParseName, sizeof( szParseName ), szParseHours, sizeof( szParseHours ) );
			
			if( equal( szParseName, szName[id] ) ) 
			{
				C_PrintChat( id, "Mai ai !v%i!c or%s pana iti termini programul de azi.", g_iHourPlayer[ id ],g_iHourPlayer[ id ]==1?"a":"e" );
				break;
			}
		}
		
		fclose( szFile );
	}
	else
	{
		C_PrintChat( id, "Ne pare rau, dar nu ai admin pe server." );
	}
	
	return 1;
}

public LoadHours( id )
{	
	formatex( szVaultKey, sizeof( szVaultKey ) -1, "%s", szName[id] );
	formatex( szVaultData, sizeof( szVaultData ) -1, "%d %d %d", g_iHourPlayer[ id ], g_iPlayerMinutes[ id ], g_iPlayerWarn[ id ] );	
	
	nvault_get( g_vault, szVaultKey, szVaultData, sizeof( szVaultData ) -1 );
	
	new iHours[ 32 ], iWarn[ 33 ], iMinutes[ 33 ];
	parse( szVaultData,\
	iHours, sizeof( iHours ) -1,\
	iWarn, sizeof( iWarn ) -1,\
	iMinutes, sizeof( iMinutes ) -1 );
	
	g_iHourPlayer[ id ] = str_to_num( iHours );
	g_iPlayerWarn[ id ] = str_to_num( iWarn );
	g_iPlayerMinutes[ id ] = str_to_num( iMinutes );
}

public SaveHours( id )
{
	formatex( szVaultKey, sizeof( szVaultKey ) -1, "%s", szName[id] );
	formatex( szVaultData, sizeof( szVaultData ) -1, "%d %d %d", g_iHourPlayer[ id ], g_iPlayerMinutes[ id ], g_iPlayerWarn[ id ] );
	
	nvault_set( g_vault, szVaultKey, szVaultData );
}

public plugin_end() nvault_close(g_vault)

stock C_PrintChat( const id, const szInput[ ], any:... )
{
	static szMesage[192];
	vformat(szMesage, charsmax(szMesage), szInput, 3);
	
	replace_all(szMesage, charsmax(szMesage), "!c", "^1");
	replace_all(szMesage, charsmax(szMesage), "!e", "^3");
	replace_all(szMesage, charsmax(szMesage), "!v", "^4");
	replace_all(szMesage, charsmax(szMesage), "!e2", "^0");
	
	static g_msg_SayText = 0;
	if(!g_msg_SayText)	g_msg_SayText = get_user_msgid("SayText");
	
	new Players[32], iNum = 1, i;
	
	if(id) Players[0] = id;
	else get_players(Players, iNum, "ch");
	
	for(--iNum; iNum >= 0; iNum--) 
	{
		i = Players[iNum];
		
		message_begin(MSG_ONE_UNRELIABLE, g_msg_SayText, _, i);
		write_byte(i);
		write_string(szMesage);
		message_end();
	}
}