Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

ZIGI89 - zdjęcie

ZIGI89

Rejestracja: 15.01.2010
Aktualnie: Nieaktywny
Poza forum Ostatnio: 02.03.2023 20:34
-----

Moje tematy

problem z amx_gagmenu.amxx

14.07.2016 19:50

witam mam problem  z pluginem  amx_gagmenu

gdy chce kogoś   zablokować  blokuje mi cały serwer

wszystkich  którzy nie maja admina

 

mogł by ktoś zobaczyć   na kod  co jest nie tak

 

wszystkie  pluginy  jakie sprawdzałem  miały to samo

 

https://forums.allie...ad.php?t=101937

#include < amxmodx >
#include < amxmisc >
#include < engine >
#include < sqlx >

#define MAX_PLAYERS 32

#define MAX_PATTERN_LEN 255

enum ( <<= 1 )
{
	GAG_CHAT = 1,
	GAG_TEAMSAY,
	GAG_VOICE
};

enum _:GagData
{
	GAG_AUTHID[ 35 ],
	GAG_TIME,
	GAG_START,
	GAG_FLAGS
};

enum _:TimeUnit
{
	TIMEUNIT_SECONDS = 0,
	TIMEUNIT_MINUTES,
	TIMEUNIT_HOURS,
	TIMEUNIT_DAYS,
	TIMEUNIT_WEEKS
};

new const g_szTimeUnitName[ TimeUnit ][ 2 ][ ] =
{
	{ "second", "seconds" },
	{ "minute", "minutes" },
	{ "hour",   "hours"   },
	{ "day",    "days"    },
	{ "week",   "weeks"   }
};

new const g_iTimeUnitMult[ TimeUnit ] =
{
	1,
	60,
	3600,
	86400,
	604800
};

new const DATETIME_FORMAT[ ] = "%Y-%m-%d %H:%M:%S";
const DATE_SIZE = 20;

new Array:g_aGagTimes;
new Array:g_aGagData;
new Trie:g_tArrayPos;
new Trie:g_tTimeUnitWords;

new g_iGagged;
new g_iThinker;
new g_iTotalGagTimes;
new g_iMsgSayText;

new g_szAuthid[ MAX_PLAYERS + 1 ][ 35 ];
new g_iMenuOption[ MAX_PLAYERS + 1 ];
new g_iMenuPosition[ MAX_PLAYERS + 1 ];
new g_iMenuPlayers[ MAX_PLAYERS + 1 ][ 32 ];
new g_iMenuFlags[ MAX_PLAYERS + 1 ];

new g_szGagFile[ 64 ];

new bool:g_bColorSupported;

new g_pCvarDefaultFlags;
new g_pCvarDefaultTime;
new g_pCvarTimeUnit;
new g_pCvarMaxTime;
new g_pCvarSQL;
new g_pCvarSQLHost;
new g_pCvarSQLUser;
new g_pCvarSQLPass;
new g_pCvarSQLDb;

new bool:g_bUsingSQL = false;
new Handle:g_hSqlTuple;

public plugin_init( )
{
	register_plugin( "AMXX Gag", "1.4.9", "xPaw & Exolent" );
	
	register_clcmd( "say",        "CmdSay" );
	register_clcmd( "say_team",   "CmdTeamSay" );
	
	register_concmd( "amx_gag",       "CmdGagPlayer",   ADMIN_KICK, "<nick or #userid> <time> <a|b|c> -- Use 0 time for permanent" );
	register_concmd( "amx_addgag",    "CmdAddGag",      ADMIN_KICK, "<authid> <time> <a|b|c> -- Use 0 time for permanent" );
	register_concmd( "amx_ungag",     "CmdUnGagPlayer", ADMIN_KICK, "<nick or #userid>" );
	register_concmd( "amx_gagmenu",   "CmdGagMenu",     ADMIN_KICK, "- displays gag menu" );
	register_srvcmd( "amx_gag_times", "CmdSetBanTimes" );
	
	register_menu( "Gag Menu", 1023, "ActionGagMenu" );
	register_menu( "Gag Flags", 1023, "ActionGagFlags" );
	register_message( get_user_msgid( "SayText" ), "MessageSayText" );
	
	g_pCvarDefaultFlags = register_cvar( "amx_gag_default_flags", "abc"   );
	g_pCvarDefaultTime  = register_cvar( "amx_gag_default_time",  "600"   );
	g_pCvarTimeUnit     = register_cvar( "amx_gag_time_units",    "0"     );
	g_pCvarMaxTime      = register_cvar( "amx_gag_max_time",      "86400" );
	g_pCvarSQL          = register_cvar( "amx_gag_sql",           "0"     );
	g_pCvarSQLHost      = register_cvar( "amx_gag_sql_host",      ""      );
	g_pCvarSQLUser      = register_cvar( "amx_gag_sql_user",      ""      );
	g_pCvarSQLPass      = register_cvar( "amx_gag_sql_pass",      ""      );
	g_pCvarSQLDb        = register_cvar( "amx_gag_sql_db",        ""      );
	
	g_tArrayPos       = TrieCreate( );
	g_aGagTimes       = ArrayCreate( );
	g_aGagData        = ArrayCreate( GagData );
	g_bColorSupported = bool:colored_menus( );
	g_iMsgSayText     = get_user_msgid( "SayText" );
	
	// let words work with the time unit cvar
	g_tTimeUnitWords = TrieCreate( );
	
	for( new i = 0; i < TimeUnit; i++ )
	{
		TrieSetCell( g_tTimeUnitWords, g_szTimeUnitName[ i ][ 0 ], i );
		TrieSetCell( g_tTimeUnitWords, g_szTimeUnitName[ i ][ 1 ], i );
	}
	
	// this is used for ungag in the menu
	ArrayPushCell( g_aGagTimes, 0 );
	
	// Gag times for the gag menu (amx_gagmenu)
	// Default values: 60 300 600 1800 3600 7200 86400
	new const iDefaultTimes[ ] = { 60, 300, 600, 1800, 3600, 7200, 86400, 0 };
	
	// Load up standard times
	for( new i = 0; i < sizeof( iDefaultTimes ); i++ )
	{
		ArrayPushCell( g_aGagTimes, iDefaultTimes[ i ] );
	}
	
	g_iTotalGagTimes = sizeof( iDefaultTimes ) + 1;
	
	// Set up entity-thinker
	new const szClassName[ ] = "gag_thinker";
	
	g_iThinker = create_entity( "info_target" );
	entity_set_string( g_iThinker, EV_SZ_classname, szClassName );
	
	register_think( szClassName, "FwdThink" );
	
	// load gags from file
	get_datadir( g_szGagFile, charsmax( g_szGagFile ) );
	add( g_szGagFile, charsmax( g_szGagFile ), "/gags.txt" );
	
	// set server's SteamID to "SERVER"
	copy( g_szAuthid[ 0 ], charsmax( g_szAuthid[ ] ), "SERVER" );
}

public plugin_cfg( )
{
	// check SQL
	InitSQL( );
	
	if( !g_bUsingSQL )
	{
		// if no SQL, load file
		LoadFromFile( );
	}
}

InitSQL( )
{
	// init SQL after configs were executed
	if( get_pcvar_num( g_pCvarSQL ) )
	{
		new szHost[ 64 ], szUser[ 64 ], szPass[ 64 ], szDb[ 64 ];
		get_pcvar_string( g_pCvarSQLHost, szHost, charsmax( szHost ) );
		get_pcvar_string( g_pCvarSQLUser, szUser, charsmax( szUser ) );
		get_pcvar_string( g_pCvarSQLPass, szPass, charsmax( szPass ) );
		get_pcvar_string( g_pCvarSQLDb,   szDb,   charsmax( szDb   ) );
		
		g_hSqlTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDb );
		
		if( g_hSqlTuple == Empty_Handle ) return;
		
		// TABLE STRUCTURE
		// admin_name VARCHAR(32) NOT NULL
		// admin_steamid VARCHAR(35) NOT NULL
		// admin_ip VARCHAR(15) NOT NULL
		// player_name VARCHAR(32) NOT NULL
		// player_steamid VARCHAR(35) NOT NULL PRIMARY KEY
		// player_ip VARCHAR(15) NOT NULL
		// date_gagged DATETIME NOT NULL
		// date_ungag DATETIME NOT NULL
		// gag_seconds INT NOT NULL
		// gag_flags VARCHAR(3) NOT NULL
		
		new iError, szError[ 128 ];
		new Handle:hDb = SQL_Connect( g_hSqlTuple, iError, szError, charsmax( szError ) );
		
		if( hDb == Empty_Handle )
		{
			log_amx( "Failed to connect to database: (%d) %s", iError, szError );
			return;
		}
		
		new Handle:hQuery = SQL_PrepareQuery( hDb, "CREATE TABLE IF NOT EXISTS gagged_players (\
			admin_name VARCHAR(32) NOT NULL,\
			admin_steamid VARCHAR(35) NOT NULL,\
			admin_ip VARCHAR(15) NOT NULL,\
			player_name VARCHAR(32) NOT NULL,\
			player_steamid VARCHAR(35) NOT NULL PRIMARY KEY,\
			player_ip VARCHAR(15) NOT NULL,\
			date_gagged DATETIME NOT NULL,\
			date_ungag DATETIME NOT NULL,\
			gag_seconds INT NOT NULL,\
			gag_flags VARCHAR(3) NOT NULL);" );
		
		if( !SQL_Execute( hQuery ) )
		{
			SQL_QueryError( hQuery, szError, charsmax( szError ) );
			log_amx( "Failed create table query: %s", szError );
		}
		else
		{
			SQL_FreeHandle( hQuery );
			
			new szDate[ DATE_SIZE ];
			get_time( DATETIME_FORMAT, szDate, charsmax( szDate ) );
			
			// load all users
			hQuery = SQL_PrepareQuery( hDb, "SELECT * FROM gagged_players WHERE date_ungag > '%s';", szDate );
			
			if( !SQL_Execute( hQuery ) )
			{
				SQL_QueryError( hQuery, szError, charsmax( szError ) );
				log_amx( "Failed load gags query: %s", szError );
			}
			else
			{
				g_bUsingSQL = true;
				
				if( SQL_NumResults( hQuery ) )
				{
					new data[ GagData ];
					new szFlags[ 4 ];
					
					new iFieldSteamID = SQL_FieldNameToNum( hQuery, "player_steamid" );
					new iFieldDateGagged = SQL_FieldNameToNum( hQuery, "date_gagged" );
					new iFieldGagTime = SQL_FieldNameToNum( hQuery, "gag_seconds" );
					new iFieldGagFlags = SQL_FieldNameToNum( hQuery, "gag_flags" );
					
					while( SQL_MoreResults( hQuery ) )
					{
						SQL_ReadResult( hQuery, iFieldSteamID, data[ GAG_AUTHID ], charsmax( data[ GAG_AUTHID ] ) );
						SQL_ReadResult( hQuery, iFieldDateGagged, szDate, charsmax( szDate ) );
						data[ GAG_TIME ] = SQL_ReadResult( hQuery, iFieldGagTime );
						SQL_ReadResult( hQuery, iFieldGagFlags, szFlags, charsmax( szFlags ) );
						
						data[ GAG_START ] = strtotime( szDate );
						data[ GAG_FLAGS ] = read_flags( szFlags );
						
						ArrayPushArray( g_aGagData, data );
						TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], g_iGagged );
						g_iGagged++;
						
						SQL_NextRow( hQuery );
					}
				}
			}
		}
		
		SQL_FreeHandle( hQuery );
		SQL_FreeHandle( hDb );
	}
}

public plugin_end( )
{
	TrieDestroy( g_tArrayPos );
	ArrayDestroy( g_aGagData );
	ArrayDestroy( g_aGagTimes );
	TrieDestroy( g_tTimeUnitWords );
}

public CmdSetBanTimes( )
{
	new iArgs = read_argc( );
	
	if( iArgs <= 1 )
	{
		server_print( "Usage: amx_gag_times <time1> [time2] [time3] ..." );
		return PLUGIN_HANDLED;
	}
	
	ArrayClear( g_aGagTimes );
	
	// this is used for ungag in the menu
	ArrayPushCell( g_aGagTimes, 0 );
	g_iTotalGagTimes = 1;
	
	// get max time allowed
	new iTimeLimit = get_pcvar_num( g_pCvarMaxTime );
	
	new szBuffer[ 32 ], iTime;
	for( new i = 1; i < iArgs; i++ )
	{
		read_argv( i, szBuffer, 31 );
		
		if( !is_str_num( szBuffer ) )
		{
			server_print( "[AMXX GAG] Time must be an integer!" );
			continue;
		}
		
		iTime = str_to_num( szBuffer );
		
		if( iTime < 0 )
		{
			server_print( "[AMXX GAG] Time must be a positive integer!" );
			continue;
		}
		
		if( 0 < iTimeLimit < iTime )
		{
			server_print( "[AMXX GAG] Time more then %d is not allowed!", iTimeLimit );
			continue;
		}
		
		ArrayPushCell( g_aGagTimes, iTime );
		g_iTotalGagTimes++;
	}
	
	return PLUGIN_HANDLED;
}

public client_putinserver( id )
{
	if( CheckGagFlag( id, GAG_VOICE ) )
	{
		set_speak( id, SPEAK_MUTED );
	}
	
	// default flags to "abc"
	g_iMenuFlags[ id ] = GAG_CHAT | GAG_TEAMSAY | GAG_VOICE;
}

public client_authorized( id )
	get_user_authid( id, g_szAuthid[ id ], 34 );

public client_disconnect( id )
{
	if( TrieKeyExists( g_tArrayPos, g_szAuthid[ id ] ) )
	{
		new szName[ 32 ];
		get_user_name( id, szName, 31 );
		
		new iPlayers[ 32 ], iNum, iPlayer;
		get_players( iPlayers, iNum, "ch" );
		
		for( new i; i < iNum; i++ )
		{
			iPlayer = iPlayers[ i ];
			
			if( get_user_flags( iPlayer ) & ADMIN_KICK )
			{
				if( g_bColorSupported )
				{
					GreenPrint( iPlayer, id, "^4[AMXX GAG]^1 Gagged player ^"^3%s^1<^4%s^1>^" has disconnected!", szName, g_szAuthid[ id ] );
				}
				else
				{
					client_print( iPlayer, print_chat, "[AMXX GAG] Gagged player ^"%s<%s>^" has disconnected!", szName, g_szAuthid[ id ] );
				}
			}
		}
	}
	
	g_szAuthid[ id ][ 0 ] = '^0';
}

public client_infochanged( id )
{
	if( !CheckGagFlag( id, ( GAG_CHAT | GAG_TEAMSAY ) ) )
	{
		return;
	}
	
	static const name[ ] = "name";
	
	static szNewName[ 32 ], szOldName[ 32 ];
	get_user_info( id, name, szNewName, 31 );
	get_user_name( id, szOldName, 31 );
	
	if( !equal( szNewName, szOldName ) )
	{
		if( g_bColorSupported )
		{
			GreenPrint( id, id, "^4[AMXX GAG]^1 Gagged players cannot change their names!" );
		}
		else
		{
			client_print( id, print_chat, "[AMXX GAG] Gagged players cannot change their names!" );
		}
		
		set_user_info( id, name, szOldName );
	}
}

public MessageSayText( )
{
	static const Cstrike_Name_Change[ ] = "#Cstrike_Name_Change";
	
	new szMessage[ sizeof( Cstrike_Name_Change ) + 1 ];
	get_msg_arg_string( 2, szMessage, charsmax( szMessage ) );
	
	if( equal( szMessage, Cstrike_Name_Change ) )
	{
		new szName[ 32 ], id;
		for( new i = 3; i <= 4; i++ )
		{
			get_msg_arg_string( i, szName, 31 );
			
			id = get_user_index( szName );
			
			if( is_user_connected( id ) )
			{
				if( CheckGagFlag( id, ( GAG_CHAT | GAG_TEAMSAY ) ) )
				{
					return PLUGIN_HANDLED;
				}
				
				break;
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public FwdThink( const iEntity )
{
	if( !g_iGagged )
		return;
	
	new iSystime = get_systime( );
	new bool:bRemovedGags = false;
	
	new bool:bUsingSQL = g_bUsingSQL;
	new Array:aRemoveSteamIDs, iNumRemoveSteamIDs;
	
	if( bUsingSQL )
	{
		aRemoveSteamIDs = ArrayCreate( 35 );
		g_bUsingSQL = false;
	}
	
	new data[ GagData ], id, szName[ 32 ];
	for( new i = 0; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		
		if( data[ GAG_TIME ] > 0 && ( data[ GAG_START ] + data[ GAG_TIME ] ) <= iSystime )
		{
			id = find_player( "c", data[ GAG_AUTHID ] );
			
			if( is_user_connected( id ) )
			{
				get_user_name( id, szName, 31 );
				
				if( g_bColorSupported )
				{
					GreenPrint( 0, id, "^4[AMXX GAG]^1 Player ^"^3%s^1^" is no longer gagged", szName );
				}
				else
				{
					client_print( 0, print_chat, "[AMXX GAG] Player ^"%s^" is no longer gagged", szName );
				}
			}
			else
			{
				if( g_bColorSupported )
				{
					GreenPrint( 0, 0, "^4[AMXX GAG]^1 SteamID ^"^3%s^1^" is no longer gagged", data[ GAG_AUTHID ] );
				}
				else
				{
					client_print( 0, print_chat, "[AMXX GAG] SteamID ^"%s^" is no longer gagged", data[ GAG_AUTHID ] );
				}
			}
			
			DeleteGag( i-- );
			
			bRemovedGags = true;
			
			if( bUsingSQL )
			{
				ArrayPushString( aRemoveSteamIDs, data[ GAG_AUTHID ] );
				iNumRemoveSteamIDs++;
			}
		}
	}
	
	if( !bUsingSQL )
	{
		if( bRemovedGags )
		{
			SaveToFile( );
		}
	}
	else
	{
		if( iNumRemoveSteamIDs )
		{
			static szQuery[ 1024 ];
			new iLen = copy( szQuery, charsmax( szQuery ), "DELETE FROM gagged_players WHERE " );
			
			for( new i = 0; i < iNumRemoveSteamIDs; i++ )
			{
				ArrayGetString( aRemoveSteamIDs, i, data[ GAG_AUTHID ], charsmax( data[ GAG_AUTHID ] ) );
				
				iLen += formatex( szQuery[ iLen ], charsmax( szQuery ) - iLen, "%splayer_steamid = ^"%s^"", i ? " OR " : "", data[ GAG_AUTHID ] );
			}
			
			szQuery[ iLen++ ] = ';';
			szQuery[ iLen ] = 0;
			
			SQL_ThreadQuery( g_hSqlTuple, "QueryDeleteMultiple", szQuery );
		}
		
		ArrayDestroy( aRemoveSteamIDs );
		
		g_bUsingSQL = true;
	}
	
	if( !g_iGagged )
		return;
	
	new iNextTime = 999999;
	for( new i = 0; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		
		if( data[ GAG_TIME ] > 0 )
			iNextTime = min( iNextTime, data[ GAG_START ] + data[ GAG_TIME ] - iSystime );
	}
	
	if( iNextTime < 999999 )
		entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + iNextTime );
}

public QueryDeleteMultiple( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed delete multiple query: (%d) %s", iError, szError );
	}
}

public CmdSay( const id )
	return CheckSay( id, 0 );

public CmdTeamSay( const id )
	return CheckSay( id, 1 );

CheckSay( const id, const bTeam )
{
	new iArrayPos;
	if( TrieGetCell( g_tArrayPos, g_szAuthid[ id ], iArrayPos ) )
	{
		new data[ GagData ];
		ArrayGetArray( g_aGagData, iArrayPos, data );
		
		new const iFlags[ ] = { GAG_CHAT, GAG_TEAMSAY };
		
		if( data[ GAG_FLAGS ] & iFlags[ bTeam ] )
		{
			if( data[ GAG_TIME ] > 0 )
			{
				new szInfo[ 128 ], iTime = data[ GAG_START ] + data[ GAG_TIME ] - get_systime( );
				
				GetTimeLength( iTime, szInfo, charsmax( szInfo ) );
				
				if( g_bColorSupported )
				{
					GreenPrint( id, id, "^4[AMXX GAG]^3 %s^1 left before your ungag!", szInfo );
				}
				else
				{
					client_print( id, print_chat, "[AMXX GAG] %s left before your ungag!", szInfo );
				}
			}
			else
			{
				if( g_bColorSupported )
				{
					GreenPrint( id, id, "^4[AMXX GAG]^3 You are gagged permanently!" );
				}
				else
				{
					client_print( id, print_chat, "[AMXX GAG] You are gagged permanently!" );
				}
			}
			
			client_print( id, print_center, "** You are gagged from%s chat! **", bTeam ? " team" : "" );
			
			return PLUGIN_HANDLED;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public CmdGagPlayer( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 2 ) )
	{
		console_print( id, "Flags: a - Chat | b - Team Chat | c - Voice communications" );
		return PLUGIN_HANDLED;
	}
	
	new szArg[ 32 ];
	read_argv( 1, szArg, 31 );
	
	new iPlayer = cmd_target( id, szArg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS );
	
	if( !iPlayer )
	{
		return PLUGIN_HANDLED;
	}
	
	new szName[ 20 ];
	get_user_name( iPlayer, szName, 19 );
	
	if( TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) )
	{
		console_print( id, "User ^"%s^" is already gagged!", szName );
		return PLUGIN_HANDLED;
	}
	
	new iFlags;
	new iGagTime;
	
	read_argv( 2, szArg, 31 );
	
	if( szArg[ 0 ] ) // No time entered
	{
		if( is_str_num( szArg ) ) // Seconds entered
		{
			iGagTime = abs( str_to_num( szArg ) );
		}
		else
		{
			console_print( id, "The value must be in seconds!" );
			return PLUGIN_HANDLED;
		}
		
		read_argv( 3, szArg, 31 );
		
		if( szArg[ 0 ] )
		{
			iFlags = read_flags( szArg );
		}
	}
	
	GagPlayer( id, iPlayer, iGagTime, iFlags );
	
	return PLUGIN_HANDLED;
}

GagPlayer( id, iPlayer, iGagTime, iFlags )
{
	new iTimeUnit = GetTimeUnit( );
	new iMaxTime = get_pcvar_num( g_pCvarMaxTime );
	iGagTime = clamp( iGagTime, 1, iMaxTime ) * g_iTimeUnitMult[ iTimeUnit ];
	
	if( !iFlags )
	{
		new szFlags[ 27 ];
		get_pcvar_string( g_pCvarDefaultFlags, szFlags, charsmax( szFlags ) );
		
		iFlags = read_flags( szFlags );
	}
	
	new data[ GagData ];
	data[ GAG_START ] = get_systime( );
	data[ GAG_TIME ]  = iGagTime;
	data[ GAG_FLAGS ] = iFlags;
	copy( data[ GAG_AUTHID ], 34, g_szAuthid[ iPlayer ] );
	
	TrieSetCell( g_tArrayPos, g_szAuthid[ iPlayer ], g_iGagged );
	ArrayPushArray( g_aGagData, data );
	
	new szFrom[ 64 ];
	
	if( iFlags & GAG_CHAT )
	{
		copy( szFrom, 63, "say" );
	}
	
	if( iFlags & GAG_TEAMSAY )
	{
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "say_team" );
		else
			add( szFrom, 63, " / say_team" );
	}
	
	if( iFlags & GAG_VOICE )
	{
		set_speak( iPlayer, SPEAK_MUTED );
		
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "voicecomm" );
		else
			add( szFrom, 63, " / voicecomm" );
	}
	
	g_iGagged++;
	
	if( iGagTime > 0 )
	{
		new Float:flGametime = get_gametime( ), Float:flNextThink;
		flNextThink = entity_get_float( g_iThinker, EV_FL_nextthink );
		
		if( !flNextThink || flNextThink > ( flGametime + iGagTime ) )
			entity_set_float( g_iThinker, EV_FL_nextthink, flGametime + iGagTime );
	}
	
	if( g_bUsingSQL )
	{
		AddGag( id, iPlayer, iGagTime, iFlags );
	}
	else
	{
		SaveToFile( );
	}
	
	new szName[ 20 ];
	get_user_name( iPlayer, szName, 19 );
	
	new szInfo[ 32 ], szAdmin[ 20 ];
	get_user_name( id, szAdmin, 19 );
	
	if( iGagTime > 0 )
	{
		new iLen = copy( szInfo, 31, "for " );
		GetTimeLength( iGagTime, szInfo[ iLen ], charsmax( szInfo ) - iLen );
	}
	else
	{
		copy( szInfo, 31, "permanently" );
	}
	
	show_activity( id, szAdmin, "Has gagged %s from speaking %s! (%s)", szName, szInfo, szFrom );
	
	console_print( id, "You have gagged ^"%s^" (%s) !", szName, szFrom );
	
	log_amx( "Gag: ^"%s<%s>^" has gagged ^"%s<%s>^" %s. (%s)", szAdmin, g_szAuthid[ id ], szName, g_szAuthid[ iPlayer ], szInfo, szFrom );
}

public CmdAddGag( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 2 ) )
	{
		console_print( id, "Flags: a - Chat | b - Team Chat | c - Voice communications" );
		return PLUGIN_HANDLED;
	}
	
	new szArg[ 32 ];
	read_argv( 1, szArg, 31 );
	
	if( !IsValidSteamID( szArg ) )
	{
		console_print( id, "Invalid SteamID provided (%s). Must be in ^"STEAM_0:X:XXXXX^" format (remember to use quotes!)", szArg );
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = find_player( "c", szArg );
	
	if( is_user_connected( iPlayer ) )
	{
		new szTime[ 12 ], szFlags[ 4 ];
		read_argv( 2, szTime,  charsmax( szTime  ) );
		read_argv( 3, szFlags, charsmax( szFlags ) );
		
		client_cmd( id, "amx_gag #%d ^"%s^" ^"%s^"", get_user_userid( iPlayer ), szTime, szFlags );
		return PLUGIN_HANDLED;
	}
	
	if( TrieKeyExists( g_tArrayPos, szArg ) )
	{
		console_print( id, "This user is already gagged!" );
		return PLUGIN_HANDLED;
	}
	
	if( GetAccessBySteamID( szArg ) & ADMIN_IMMUNITY )
	{
		console_print( id, "This user has immunity!" );
		return PLUGIN_HANDLED;
	}
	
	new data[ GagData ];
	copy( data[ GAG_AUTHID ], 34, szArg );
	
	get_pcvar_string( g_pCvarDefaultFlags, szArg, charsmax( szArg ) );
	new iFlags = read_flags( szArg );
	
	new iTimeUnit = GetTimeUnit( );
	new iMaxTime = get_pcvar_num( g_pCvarMaxTime );
	new iGagTime = clamp( get_pcvar_num( g_pCvarDefaultTime ), 1, iMaxTime );
	
	read_argv( 2, szArg, 31 );
	
	if( szArg[ 0 ] ) // No time entered
	{
		if( is_str_num( szArg ) ) // Seconds entered
		{
			iGagTime = min( abs( str_to_num( szArg ) ), iMaxTime );
		}
		else
		{
			console_print( id, "The value must be in seconds!" );
			return PLUGIN_HANDLED;
		}
		
		read_argv( 3, szArg, 31 );
		
		if( szArg[ 0 ] )
		{
			iFlags = read_flags( szArg );
		}
	}
	
	// convert to seconds
	iGagTime *= g_iTimeUnitMult[ iTimeUnit ];
	
	data[ GAG_START ] = get_systime( );
	data[ GAG_TIME ]  = iGagTime;
	data[ GAG_FLAGS ] = iFlags;
	
	TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], g_iGagged );
	ArrayPushArray( g_aGagData, data );
	
	new szFrom[ 64 ];
	
	if( iFlags & GAG_CHAT )
	{
		copy( szFrom, 63, "say" );
	}
	
	if( iFlags & GAG_TEAMSAY )
	{
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "say_team" );
		else
			add( szFrom, 63, " / say_team" );
	}
	
	if( iFlags & GAG_VOICE )
	{
		if( !szFrom[ 0 ] )
			copy( szFrom, 63, "voicecomm" );
		else
			add( szFrom, 63, " / voicecomm" );
	}
	
	g_iGagged++;
	
	if( iGagTime > 0 )
	{
		new Float:flGametime = get_gametime( ), Float:flNextThink;
		flNextThink = entity_get_float( g_iThinker, EV_FL_nextthink );
		
		if( !flNextThink || flNextThink > ( flGametime + iGagTime ) )
			entity_set_float( g_iThinker, EV_FL_nextthink, flGametime + iGagTime );
	}
	
	if( g_bUsingSQL )
	{
		AddGag( id, iPlayer, iGagTime, iFlags );
	}
	else
	{
		SaveToFile( );
	}
	
	new szInfo[ 32 ], szAdmin[ 20 ];
	get_user_name( id, szAdmin, 19 );
	
	if( iGagTime > 0 )
	{
		new iLen = copy( szInfo, 31, "for " );
		GetTimeLength( iGagTime, szInfo[ iLen ], charsmax( szInfo ) - iLen );
	}
	else
	{
		copy( szInfo, 31, "permanently" );
	}
	
	show_activity( id, szAdmin, "Has gagged a non-connected player <%s> from speaking %s! (%s)", data[ GAG_AUTHID ], szInfo, szFrom );
	
	console_print( id, "You have gagged ^"%s^" (%s) !", data[ GAG_AUTHID ], szFrom );
	
	log_amx( "Gag: ^"%s<%s>^" has gagged a non-connected player ^"<%s>^" %s. (%s)", szAdmin, g_szAuthid[ id ], data[ GAG_AUTHID ], szInfo, szFrom );
	
	return PLUGIN_HANDLED;
}

public CmdUnGagPlayer( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 2 ) )
		return PLUGIN_HANDLED;
	
	new szArg[ 32 ];
	read_argv( 1, szArg, 31 );
	
	if( szArg[ 0 ] == '@' && equali( szArg[ 1 ], "all" ) )
	{
		if( !g_iGagged )
		{
			console_print( id, "No gagged players!" );
			return PLUGIN_HANDLED;
		}
		
		DeleteAllGags( );
		
		if( entity_get_float( g_iThinker, EV_FL_nextthink ) > 0.0 )
			entity_set_float( g_iThinker, EV_FL_nextthink, 0.0 );
		
		console_print( id, "You have ungagged all players!" );
		
		new szAdmin[ 32 ];
		get_user_name( id, szAdmin, 31 );
		
		show_activity( id, szAdmin, "Has ungagged all players." );
		
		log_amx( "UnGag: ^"%s<%s>^" has ungagged all players.", szAdmin, g_szAuthid[ id ] );
		
		return PLUGIN_HANDLED;
	}
	
	new iPlayer = cmd_target( id, szArg, CMDTARGET_NO_BOTS );
	new iArrayPos, szName[ 32 ];
	
	if( !iPlayer )
	{
		// Maybe it's a steamid
		
		if( !IsValidSteamID( szArg ) )
		{
			return PLUGIN_HANDLED;
		}
		
		if( !TrieGetCell( g_tArrayPos, szArg, iArrayPos ) )
		{
			console_print( id, "This steamid is not gagged!" );
			return PLUGIN_HANDLED;
		}
		
		copy( szName, charsmax( szName ), szArg );
	}
	else
	{
		get_user_name( iPlayer, szName, charsmax( szName ) );
		
		if( !TrieGetCell( g_tArrayPos, g_szAuthid[ iPlayer ], iArrayPos ) )
		{
			console_print( id, "User ^"%s^" is not gagged!", szName );
			return PLUGIN_HANDLED;
		}
	}
	
	DeleteGag( iArrayPos );
	
	if( !g_bUsingSQL )
	{
		SaveToFile( );
	}
	
	new szAdmin[ 32 ];
	get_user_name( id, szAdmin, 31 );
	
	show_activity( id, szAdmin, "Has ungagged %s.", szName );
	
	console_print( id, "You have ungagged ^"%s^" !", szName );
	
	log_amx( "UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szAuthid[ id ], szName, g_szAuthid[ iPlayer ] );
	
	return PLUGIN_HANDLED;
}

public CmdGagMenu( const id, const iLevel, const iCid )
{
	if( !cmd_access( id, iLevel, iCid, 1 ) )
	{
		return PLUGIN_HANDLED;
	}
	
	g_iMenuOption[ id ] = 0;
	arrayset( g_iMenuPlayers[ id ], 0, 32 );
	
	DisplayGagMenu( id, g_iMenuPosition[ id ] = 0 );
	
	return PLUGIN_HANDLED;
}

#define PERPAGE 6

public ActionGagMenu( const id, const iKey )
{
	switch( iKey )
	{
		case 6: DisplayGagFlags( id );
		case 7:
		{
			++g_iMenuOption[ id ];
			g_iMenuOption[ id ] %= g_iTotalGagTimes;
			
			DisplayGagMenu( id, g_iMenuPosition[ id ] );
		}
		case 8: DisplayGagMenu( id, ++g_iMenuPosition[ id ] );
		case 9: DisplayGagMenu( id, --g_iMenuPosition[ id ] );
		default:
		{
			new iPlayer = g_iMenuPlayers[ id ][ g_iMenuPosition[ id ] * PERPAGE + iKey ];
			
			if( is_user_connected( iPlayer ) )
			{
				if( !g_iMenuOption[ id ] )
				{
					//client_cmd( id, "amx_ungag #%i", get_user_userid( iPlayer ) );
					
					new iArrayPos;
					
					if( TrieGetCell( g_tArrayPos, g_szAuthid[ iPlayer ], iArrayPos ) )
					{
						DeleteGag( iArrayPos );
						
						if( !g_bUsingSQL )
						{
							SaveToFile( );
						}
						
						new szName[ 32 ];
						get_user_name( iPlayer, szName, 31 );
						
						new szAdmin[ 32 ];
						get_user_name( id, szAdmin, 31 );
						
						show_activity( id, szAdmin, "Has ungagged %s.", szName );
						
						console_print( id, "You have ungagged ^"%s^" !", szName );
						
						log_amx( "UnGag: ^"%s<%s>^" has ungagged ^"%s<%s>^"", szAdmin, g_szAuthid[ id ], szName, g_szAuthid[ iPlayer ] );
					}
				}
				else if( !TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) )
				{
					/*new szFlags[ 4 ];
					get_flags( g_iMenuFlags[ id ], szFlags, 3 );
					
					client_cmd( id, "amx_gag #%i %i %s", get_user_userid( iPlayer ), ArrayGetCell( g_aGagTimes, g_iMenuOption[ id ] ), szFlags );*/
					
					GagPlayer( id, iPlayer, ArrayGetCell( g_aGagTimes, g_iMenuOption[ id ] ), g_iMenuFlags[ id ] );
				}
			}
			
			DisplayGagMenu( id, g_iMenuPosition[ id ] );
		}
	}
}

// I just copied this from AMXX Ban menu, so don't blame me :D
DisplayGagMenu( const id, iPosition )
{
	if( iPosition < 0 )
	{
		arrayset( g_iMenuPlayers[ id ], 0, 32 );
		return;
	}
	
	new iPlayers[ 32 ], iNum, iCount, szMenu[ 512 ], iPlayer, iFlags, szName[ 32 ];
	get_players( iPlayers, iNum, "ch" ); // Ignore bots and hltv
	
	new iStart = iPosition * PERPAGE;
	
	if( iStart >= iNum )
		iStart = iPosition = g_iMenuPosition[ id ] = 0;
	
	new iEnd = iStart + PERPAGE, iKeys = MENU_KEY_0 | MENU_KEY_8;
	new iLen = formatex( szMenu, 511, g_bColorSupported ? "\rGag Menu\R%i/%i^n^n" : "Gag Menu %i/%i^n^n", iPosition + 1, ( ( iNum + PERPAGE - 1 ) / PERPAGE ) );
	
	new bool:bUngag = bool:!g_iMenuOption[ id ];
	
	if( iEnd > iNum ) iEnd = iNum;
	
	for( new i = iStart; i < iEnd; ++i )
	{
		iPlayer = iPlayers[ i ];
		iFlags  = get_user_flags( iPlayer );
		get_user_name( iPlayer, szName, 31 );
		
		if( iPlayer == id || ( iFlags & ADMIN_IMMUNITY ) || bUngag != TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) )
		{
			++iCount;
			
			if( g_bColorSupported )
				iLen += formatex( szMenu[ iLen ], 511 - iLen, "\d%i. %s^n", iCount, szName );
			else
				iLen += formatex( szMenu[ iLen ], 511 - iLen, "#. %s^n", szName );
		}
		else
		{
			iKeys |= ( 1 << iCount );
			++iCount;
			
			iLen += formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "\r%i.\w %s\y%s\r%s^n" : "%i. %s%s%s^n", iCount, szName, TrieKeyExists( g_tArrayPos, g_szAuthid[ iPlayer ] ) ? " GAGGED" : "", ( ~iFlags & ADMIN_USER ? " *" : "" ) );
		}
	}
	
	g_iMenuPlayers[ id ] = iPlayers;
	
	new szFlags[ 4 ];
	get_flags( g_iMenuFlags[ id ], szFlags, 3 );
	
	iLen += formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? ( bUngag ? "^n\d7. Flags: %s" : "^n\r7.\y Flags:\w %s" ) : ( bUngag ? "^n#. Flags: %s" : "^n7. Flags: %s" ), szFlags );
	
	if( !bUngag )
	{
		iKeys |= MENU_KEY_7;
		
		new iGagTime = ArrayGetCell( g_aGagTimes, g_iMenuOption[ id ] );
		
		if( iGagTime )
		{
			new szTime[ 128 ];
			GetTimeLength( iGagTime * g_iTimeUnitMult[ GetTimeUnit( ) ], szTime, charsmax( szTime ) );
			
			iLen += formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r8.\y Time:\w %s^n" : "^n8. Time: %s^n", szTime );
		}
		else
			iLen += copy( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r8.\y Time: Permanent^n" : "^n8. Time: Permanent^n" );
	}
	else
		iLen += copy( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r8.\w Ungag^n" : "^n8. Ungag^n" );
	
	if( iEnd != iNum )
	{
		formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r9.\w More...^n\r0.\w %s" : "^n9. More...^n0. %s", iPosition ? "Back" : "Exit" );
		iKeys |= MENU_KEY_9;
	}
	else
		formatex( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r0.\w %s" : "^n0. %s", iPosition ? "Back" : "Exit" );
	
	show_menu( id, iKeys, szMenu, -1, "Gag Menu" );
}

public ActionGagFlags( const id, const iKey )
{
	switch( iKey )
	{
		case 9: DisplayGagMenu( id, g_iMenuPosition[ id ] );
		default:
		{
			g_iMenuFlags[ id ] ^= ( 1 << iKey );
			
			DisplayGagFlags( id );
		}
	}
}

DisplayGagFlags( const id )
{
	new szMenu[ 512 ];
	new iLen = copy( szMenu, 511, g_bColorSupported ? "\rGag Flags^n^n" : "Gag Flags^n^n" );
	
	if( g_bColorSupported )
	{
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r1.\w Chat: %s^n", ( g_iMenuFlags[ id ] & GAG_CHAT ) ? "\yYES" : "\rNO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r2.\w TeamSay: %s^n", ( g_iMenuFlags[ id ] & GAG_TEAMSAY ) ? "\yYES" : "\rNO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r3.\w Voice: %s^n", ( g_iMenuFlags[ id ] & GAG_VOICE ) ? "\yYES" : "\rNO" );
	}
	else
	{
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "1. Chat: %s^n", ( g_iMenuFlags[ id ] & GAG_CHAT ) ? "YES" : "NO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "2. TeamSay: %s^n", ( g_iMenuFlags[ id ] & GAG_TEAMSAY ) ? "YES" : "NO" );
		iLen += formatex( szMenu[ iLen ], 511 - iLen, "3. Voice: %s^n", ( g_iMenuFlags[ id ] & GAG_VOICE ) ? "YES" : "NO" );
	}
	
	copy( szMenu[ iLen ], 511 - iLen, g_bColorSupported ? "^n\r0. \wBack to Gag Menu" : "^n0. Back to Gag Menu" );
	
	show_menu( id, ( MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_0 ), szMenu, -1, "Gag Flags" );
}

CheckGagFlag( const id, const iFlag )
{
	new iArrayPos;
	
	if( TrieGetCell( g_tArrayPos, g_szAuthid[ id ], iArrayPos ) )
	{
		new data[ GagData ];
		ArrayGetArray( g_aGagData, iArrayPos, data );
		
		return ( data[ GAG_FLAGS ] & iFlag );
	}
	
	return 0;
}

DeleteAllGags( )
{
	new data[ GagData ];
	new iPlayer;
	
	for( new i = 0; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		
		iPlayer = find_player( "c", data[ GAG_AUTHID ] );
		if( is_user_connected( iPlayer ) )
			set_speak( iPlayer, SPEAK_NORMAL );
	}
	
	ArrayClear( g_aGagData );
	TrieClear( g_tArrayPos );
	g_iGagged = 0;
	
	if( g_bUsingSQL )
	{
		SQL_ThreadQuery( g_hSqlTuple, "QueryDeleteAll", "DELETE FROM gagged_players;" );
	}
}

public QueryDeleteAll( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed delete all query: (%d) %s", iError, szError );
	}
}

DeleteGag( const iArrayPos )
{
	new data[ GagData ];
	ArrayGetArray( g_aGagData, iArrayPos, data );
	
	if( data[ GAG_FLAGS ] & GAG_VOICE )
	{
		new iPlayer = find_player( "c", data[ GAG_AUTHID ] );
		if( is_user_connected( iPlayer ) )
			set_speak( iPlayer, SPEAK_NORMAL );
	}
	
	TrieDeleteKey( g_tArrayPos, data[ GAG_AUTHID ] );
	ArrayDeleteItem( g_aGagData, iArrayPos );
	g_iGagged--;
	
	for( new i = iArrayPos; i < g_iGagged; i++ )
	{
		ArrayGetArray( g_aGagData, i, data );
		TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], i );
	}
	
	if( g_bUsingSQL )
	{
		new szQuery[ 128 ];
		formatex( szQuery, charsmax( szQuery ), "DELETE FROM gagged_players WHERE player_steamid = '%s';", data[ GAG_AUTHID ] );
		
		SQL_ThreadQuery( g_hSqlTuple, "QueryDelete", szQuery );
	}
}

public QueryDelete( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed delete query: (%d) %s", iError, szError );
	}
}

LoadFromFile( )
{
	new hFile = fopen( g_szGagFile, "rt" );
	
	if( hFile )
	{
		new szData[ 128 ], szTime[ 16 ], szStart[ 16 ], szFlags[ 4 ];
		new data[ GagData ], iSystime = get_systime( ), iTimeLeft, iShortestTime = 999999;
		new bool:bRemovedGags = false;
		
		while( !feof( hFile ) )
		{
			fgets( hFile, szData, charsmax( szData ) );
			trim( szData );
			
			if( !szData[ 0 ] ) continue;
			
			parse( szData,
				data[ GAG_AUTHID ], charsmax( data[ GAG_AUTHID ] ),
				szTime, charsmax( szTime ),
				szStart, charsmax( szStart ),
				szFlags, charsmax( szFlags )
			);
			
			// remove old gags
			if( contain( szStart, "." ) > 0 ) continue;
			
			data[ GAG_TIME ] = str_to_num( szTime );
			data[ GAG_START ] = str_to_num( szStart );
			data[ GAG_FLAGS ] = read_flags( szFlags );
			
			if( data[ GAG_TIME ] > 0 )
			{
				iTimeLeft = data[ GAG_START ] + data[ GAG_TIME ] - iSystime;
				
				if( iTimeLeft <= 0 )
				{
					bRemovedGags = true;
					continue;
				}
				
				if( iShortestTime > iTimeLeft )
				{
					iShortestTime = iTimeLeft;
				}
			}
			
			TrieSetCell( g_tArrayPos, data[ GAG_AUTHID ], g_iGagged );
			ArrayPushArray( g_aGagData, data );
			g_iGagged++;
		}
		
		fclose( hFile );
		
		if( bRemovedGags )
		{
			SaveToFile( );
		}
		
		if( iShortestTime < 999999 )
		{
			entity_set_float( g_iThinker, EV_FL_nextthink, get_gametime( ) + iShortestTime );
		}
	}
}

SaveToFile( )
{
	new hFile = fopen( g_szGagFile, "wt" );
	
	if( hFile )
	{
		new data[ GagData ], szFlags[ 4 ];
		
		for( new i = 0; i < g_iGagged; i++ )
		{
			ArrayGetArray( g_aGagData, i, data );
			
			get_flags( data[ GAG_FLAGS ], szFlags, charsmax( szFlags ) );
			
			fprintf( hFile, "^"%s^" ^"%i^" ^"%i^" ^"%s^"^n", data[ GAG_AUTHID ], data[ GAG_TIME ], data[ GAG_START ], szFlags );
		}
		
		fclose( hFile );
	}
}

GetTimeUnit( )
{
	new szTimeUnit[ 64 ], iTimeUnit;
	get_pcvar_string( g_pCvarTimeUnit, szTimeUnit, charsmax( szTimeUnit ) );
	
	if( is_str_num( szTimeUnit ) )
	{
		iTimeUnit = get_pcvar_num( g_pCvarTimeUnit );
		
		if( !( 0 <= iTimeUnit < TimeUnit ) )
		{
			iTimeUnit = -1;
		}
	}
	else
	{
		strtolower( szTimeUnit );
		
		if( !TrieGetCell( g_tTimeUnitWords, szTimeUnit, iTimeUnit ) )
		{
			iTimeUnit = -1;
		}
	}
	
	if( iTimeUnit == -1 )
	{
		iTimeUnit = TIMEUNIT_SECONDS;
		
		set_pcvar_num( g_pCvarTimeUnit, TIMEUNIT_SECONDS );
	}
	
	return iTimeUnit;
}

GetTimeLength( iTime, szOutput[ ], iOutputLen )
{
	new szTimes[ TimeUnit ][ 32 ];
	new iUnit, iValue, iTotalDisplay;
	
	for( new i = TimeUnit - 1; i >= 0; i-- )
	{
		iUnit = g_iTimeUnitMult[ i ];
		iValue = iTime / iUnit;
		
		if( iValue )
		{
			formatex( szTimes[ i ], charsmax( szTimes[ ] ), "%d %s", iValue, g_szTimeUnitName[ i ][ iValue != 1 ] );
			
			iTime %= iUnit;
			
			iTotalDisplay++;
		}
	}
	
	new iLen, iTotalLeft = iTotalDisplay;
	szOutput[ 0 ] = 0;
	
	for( new i = TimeUnit - 1; i >= 0; i-- )
	{
		if( szTimes[ i ][ 0 ] )
		{
			iLen += formatex( szOutput[ iLen ], iOutputLen - iLen, "%s%s%s",
				( iTotalDisplay > 2 && iLen ) ? ", " : "",
				( iTotalDisplay > 1 && iTotalLeft == 1 ) ? ( ( iTotalDisplay > 2 ) ? "and " : " and " ) : "",
				szTimes[ i ]
			);
			
			iTotalLeft--;
		}
	}
	
	return iLen
}

GreenPrint( id, iSender, const szRawMessage[ ], any:... )
{
	if( !iSender )
	{
		new iPlayers[ 32 ], iNum;
		get_players( iPlayers, iNum, "ch" );
		
		if( !iNum ) return;
		
		iSender = iPlayers[ 0 ];
	}
	
	new szMessage[ 192 ];
	vformat( szMessage, charsmax( szMessage ), szRawMessage, 4 );
	
	message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, g_iMsgSayText, _, id );
	write_byte( iSender );
	write_string( szMessage );
	message_end( );
}

bool:IsValidSteamID( const szSteamID[ ] )
{
	// STEAM_0:(0|1):\d+
	// 012345678    90
	
	// 0-7 = STEAM_0:
	// 8 = 0 or 1
	// 9 = :
	// 10+ = integer
	
	return ( ( '0' <= szSteamID[ 8 ] <= '1' ) && szSteamID[ 9 ] == ':' && equal( szSteamID, "STEAM_0:", 8 ) && is_str_num( szSteamID[ 10 ] ) );
}

GetAccessBySteamID( const szSteamID[ ] )
{
	new szAuthData[ 44 ], iCount = admins_num( );
	
	for( new i; i < iCount; i++ )
	{
		if( admins_lookup( i, AdminProp_Flags ) & FLAG_AUTHID )
		{
			admins_lookup( i, AdminProp_Auth, szAuthData, charsmax( szAuthData ) );
			
			if( equal( szAuthData, szSteamID ) )
			{
				return admins_lookup( i, AdminProp_Access );
			}
		}
	}
	
	return 0;
}

strtotime(const string[])
{
	new szTemp[ 32 ];
	new szYear[ 5 ], szMonth[ 3 ], szDay[ 3 ], szHour[ 3 ], szMinute[ 3 ], szSecond[ 3 ];
	strtok( string, szYear,   charsmax( szYear   ), szTemp,   charsmax( szTemp   ), '-' );
	strtok( szTemp, szMonth,  charsmax( szMonth  ), szTemp,   charsmax( szTemp   ), '-' );
	strtok( szTemp, szDay,    charsmax( szDay    ), szTemp,   charsmax( szTemp   ), ' ' );
	strtok( szTemp, szHour,   charsmax( szHour   ), szTemp,   charsmax( szTemp   ), ':' );
	strtok( szTemp, szMinute, charsmax( szMinute ), szSecond, charsmax( szSecond ), ':' );
	
	return TimeToUnix( str_to_num( szYear ), str_to_num( szMonth ), str_to_num( szDay ), str_to_num( szHour ), str_to_num( szMinute ), str_to_num( szSecond ) );
}

AddGag( admin, player, iGagTime, iFlags )
{
	new szAdminName[ 32 ], szAdminIP[ 16 ];
	
	if( admin )
	{
		get_user_name( admin, szAdminName, charsmax( szAdminName ) );
	}
	else
	{
		copy( szAdminName, charsmax( szAdminName ), "SERVER" );
	}
	
	get_user_ip( admin, szAdminIP, charsmax( szAdminIP ), 1 );
	
	new szPlayerName[ 32 ], szPlayerIP[ 16 ];
	get_user_name( player, szPlayerName, charsmax( szPlayerName ) );
	get_user_ip( player, szPlayerIP, charsmax( szPlayerIP ), 1 );
	
	new szDateNow[ DATE_SIZE ], szDateUngag[ DATE_SIZE ];
	get_time( DATETIME_FORMAT, szDateNow, charsmax( szDateNow ) );
	format_time( szDateUngag, charsmax( szDateUngag ), DATETIME_FORMAT, get_systime( ) + iGagTime );
	
	new szFlags[ 4 ];
	get_flags( iFlags, szFlags, charsmax( szFlags ) );
	
	new szQuery[ 256 ];
	formatex( szQuery, charsmax( szQuery ), "REPLACE INTO gagged_players \
		(admin_name, admin_steamid, admin_ip, player_name, player_steamid, player_ip, date_gagged, date_ungag, gag_seconds, gag_flags) \
		VALUES \
		(^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^", %d, ^"%s^");",\
		szAdminName,  g_szAuthid[ admin  ], szAdminIP,\
		szPlayerName, g_szAuthid[ player ], szPlayerIP,\
		szDateNow, szDateUngag, iGagTime, szFlags );
	
	SQL_ThreadQuery( g_hSqlTuple, "QueryAdd", szQuery );
}

public QueryAdd( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:flQueueTime )
{
	switch( iFailState )
	{
		case TQUERY_CONNECT_FAILED: log_amx( "Failed to connect to database: (%d) %s", iError, szError );
		case TQUERY_QUERY_FAILED:   log_amx( "Failed add gag query: (%d) %s", iError, szError );
	}
}

// CODE BELOW FROM BUGSY'S UNIX TIME INCLUDE
// 

stock const YearSeconds[2] = 
{ 
	31536000,	//Normal year
	31622400 	//Leap year
};

stock const MonthSeconds[12] = 
{ 
	2678400, //January	31 
	2419200, //February	28
	2678400, //March	31
	2592000, //April	30
	2678400, //May		31
	2592000, //June		30
	2678400, //July		31
	2678400, //August	31
	2592000, //September	30
	2678400, //October	31
	2592000, //November	30
	2678400  //December	31
};

stock const DaySeconds = 86400;
stock const HourSeconds = 3600;
stock const MinuteSeconds = 60;

stock TimeToUnix( const iYear , const iMonth , const iDay , const iHour , const iMinute , const iSecond )
{
	new i;
	new iTimeStamp;

	for ( i = 1970 ; i < iYear ; i++ )
		iTimeStamp += YearSeconds[ IsLeapYear(i) ];

	for ( i = 1 ; i < iMonth ; i++ )
		iTimeStamp += SecondsInMonth( iYear , i );

	iTimeStamp += ( ( iDay - 1 ) * DaySeconds );
	iTimeStamp += ( iHour * HourSeconds );
	iTimeStamp += ( iMinute * MinuteSeconds );
	iTimeStamp += iSecond;

	return iTimeStamp;
}

stock SecondsInMonth( const iYear , const iMonth ) 
{
	return ( ( IsLeapYear( iYear ) && ( iMonth == 2 ) ) ? ( MonthSeconds[iMonth - 1] + DaySeconds ) : MonthSeconds[iMonth - 1] );
}

stock IsLeapYear( const iYear ) 
{
	return ( ( (iYear % 4) == 0) && ( ( (iYear % 100) != 0) || ( (iYear % 400) == 0 ) ) );
}

problem z antyspam-advanced

09.04.2016 13:06

http://amxx.pl/topic...yspam-advanced/

 

 

witam 

mam problem    z pluginem antyspam-advanced w/w link

 

chciałem  go dodać by wywalało  graczy  spamujących reklamami  i  innymi bajerami

ale plugin mi nie działa

 

po wpisaniu w konsole  amxx list   wyskakuje  ze  antyspam-advanced runnging

ale gdy spamuje nic się nie dzieje

 

ani  na ustawieniach standardowych   ani

na moich cvar

 

próbowałem  to na   zombi modzie    i  serwerze testowym   na którym nie mam admina

 

 

jeśli macie jakiś pomysł   będę wdzięczny

 

zalezy mi  na  ustawieniu  czasu co ile można pisać 

 

bo gracze maja  bindy   na kupowanie laserminy

#include <amxmodx>
#include <colorchat>

#define VERSION 	"0.1"

#define TASK_CD 	1337
#define tempId(%1) 	(%1 -= TASK_CD)

#pragma semicolon 1;

new const gszBlockMisc[][] = { "spk fvox/blip.wav", "Przestan spamowac na chatcie!"};

new g_iMaxPlayers;

new fCvarTime, iCvarType, iCvarSound, iCvarKickAsPunishment, iCvarKickAfter;

new g_iTimes[33];

new Array:gBlockCmd;

public plugin_init(){
	register_plugin("Anty Spam Advanced", VERSION, "diablix");
	
	register_clcmd("say", "handleSay");
	register_clcmd("say_team", "handleSay");
	
	fCvarTime 		= register_cvar("spam_delay", "2.5"); 	// co ile można pisać
	iCvarType 		= register_cvar("spam_infotype", "0"); 	// 1 - konsola | 0 - chat
	iCvarSound 		= register_cvar("spam_sound", "1"); 	// 1 - tak | 0 - nie
	iCvarKickAsPunishment 	= register_cvar("spam_kick", "0"); 	// 1 - kickuj | 0 - nie
	iCvarKickAfter		= register_cvar("spam_kickafter", "0"); 	// jezeli spam_kick jest rowny 1 -> po piecokrotnym spamie gracz zostanie wyrzucony
	
	g_iMaxPlayers = get_maxplayers();
	
	gBlockCmd = ArrayCreate(1, g_iMaxPlayers);
	
	set_task(5.0, "taskDisableOldOne");
}

@client_connect(id){
	g_iTimes[id] = 0;
	for(new i = 0; i < ArraySize(gBlockCmd) ; i++){
		if(id == ArrayGetCell(gBlockCmd, i)){
			ArrayDeleteItem(gBlockCmd, i);
		}
	}
}

@taskDisableOldOne(){
	if(is_plugin_loaded("Anti Flood"))
		set_cvar_float("amx_flood_time", 0.1);
}

@handleSay(id){
	new szText[192];
	read_argv(1, szText, sizeof szText - 1);
	
	if(strlen(szText)){
		for(new i = 0; i < ArraySize(gBlockCmd) ; i++){
			if(id == ArrayGetCell(gBlockCmd, i)){
				switch(get_pcvar_num(iCvarType)){
					case 0:{
						#if defined _colorchat_included
						ColorChat(id, GREY, gszBlockMisc[1]);
						#else
						client_print(id, 3, gszBlockMisc[1]);
						#endif
					}
					default: console_print(id, gszBlockMisc[1]);
				}
				
				if(get_pcvar_num(iCvarSound))
					client_cmd(id, "%s", gszBlockMisc[0]);
				
				return 1;
			}
		}
		
		ArrayPushCell(gBlockCmd, id);
		set_task(get_pcvar_float(fCvarTime), "taskRemoveCd", id + TASK_CD);
		
		if(get_pcvar_num(iCvarKickAsPunishment) && get_pcvar_num(iCvarKickAfter)){
			g_iTimes[id] ++;
			
			if(g_iTimes[id] >= get_pcvar_num(iCvarKickAfter)){
				if(task_exists(id + TASK_CD)) remove_task(id + TASK_CD);
				
				new szName[32];
				get_user_name(id, szName, sizeof szName - 1);
				
				server_cmd("kick ^"%s^" ^"%s^"", szName, gszBlockMisc[1]);
			}
		}
	}
	
	return 0;
}

@taskRemoveCd(id){
	id = tempId(id);
	
	for(new i = 0; i < ArraySize(gBlockCmd) ; i++){
		if(id == ArrayGetCell(gBlockCmd, i)){
			ArrayDeleteItem(gBlockCmd, i);
		}
	}
}

prośba o zablokowanie unlimitedclip dla goldak i plasmagun

21.02.2016 15:11

witam chciał bym prosić  o  zablokowanie  unlimitedclip dla  goldak i plasma gan

 

posiadam serwer zombi mod 4.3

 

dokładnie chodzi mi o nie możność korzystanie z unlimited ammo  na tych dwóch broniach

 

kolega  kiedyś  zablokował możliwość zakupu goldak  po zakupieniu nieskończoności

ale da się  kupić  goldak  a potem unlimited clip

plasmagun w ogóle niejest zablokowana

 

 

oto   .sms

 

 

unlimitedclip

/*================================================================================
	
	-------------------------------------------
	-*- [ZP] Extra Item: Unlimited Clip 1.0 -*-
	-------------------------------------------
	
	~~~~~~~~~~~~~~~
	- Description -
	~~~~~~~~~~~~~~~
	
	This item/upgrade gives players unlimited clip ammo for a single round.
	
================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <zombieplague>

/*================================================================================
 [Plugin Customization]
=================================================================================*/

new const g_item_name[] = { "Nieskonczone ammo (1 runda)" }
const g_item_cost = 50
const g_maplimit = 2;

/*============================================================================*/

// CS Offsets
#if cellbits == 32
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CLIPAMMO = 65
#endif
const OFFSET_LINUX_WEAPONS = 4

// Max Clip for weapons
new const MAXCLIP[] = { -1, 13, -1, 10, 1, 7, -1, 30, 30, 1, 30, 20, 25, 30, 35, 25, 12, 20,
			10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50 }

new g_itemid_infammo, g_has_unlimited_clip[33]
const MAX_STATS_SAVED = 64;
new g_times_bought[33];
new db_name[MAX_STATS_SAVED][32] // player name
new db_times_bought[MAX_STATS_SAVED] // ammo pack count
new db_slot_i;
new g_maxplayers;

native zp_get_user_goldenak(id);

public plugin_init()
{
	register_plugin("[ZP] Extra: Unlimited Clip", "1.0", "MeRcyLeZZ")
	g_itemid_infammo = zp_register_extra_item(g_item_name, g_item_cost, ZP_TEAM_HUMAN, 0)	
	register_forward(FM_ClientDisconnect, "fw_ClientDisconnect")
	register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
	register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")
	
	g_maxplayers = get_maxplayers()
	
	// Reserved saving slots starts on maxplayers+1
	db_slot_i = g_maxplayers+1
}

public plugin_natives(){
	register_native("zp_set_user_unlimited_clip", "native_set_user_clip", 1);
	register_native("zp_get_user_unlimited_clip", "native_get_user_clip", 1);
}

// Player buys our upgrade, set the unlimited ammo flag
public zp_extra_item_selected(player, itemid)
{
	if (itemid == g_itemid_infammo){
		if (!zp_get_user_goldenak(player)){
			if (g_times_bought[player] < g_maplimit){
				g_has_unlimited_clip[player] = true
				g_times_bought[player]++;
				client_print(player, print_chat, "Kupiles Nieskonczonosc Ammo. Mozesz je jeszcze kupic %d razy", g_maplimit - g_times_bought[player]);

			}
			else{
				client_print(player, print_chat, "Wykorzystales limit kupna Nieskonczonego Ammo na tej mapie");
				return ZP_PLUGIN_HANDLED;
			}
		}
		else{
				client_print(player, print_chat, "Nie mozesz kupic Nieskonczonego Ammo posiadajac Zlotego Kalacha!");
				return ZP_PLUGIN_HANDLED;
		}
	}
}

// Reset flags for all players on newround
public event_round_start()
{
	for (new id; id <= 32; id++) g_has_unlimited_clip[id] = false;
}

// Unlimited clip code
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
	// Player doesn't have the unlimited clip upgrade
	if (!g_has_unlimited_clip[msg_entity])
		return;
	
	// Player not alive or not an active weapon
	if (!is_user_alive(msg_entity) || get_msg_arg_int(1) != 1)
		return;
	
	static weapon, clip
	weapon = get_msg_arg_int(2) // get weapon ID
	clip = get_msg_arg_int(3) // get weapon clip
	
	// Unlimited Clip Ammo
	if (MAXCLIP[weapon] > 2) // skip grenades
	{
		set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon]) // HUD should show full clip all the time
		
		if (clip < 2) // refill when clip is nearly empty
		{
			// Get the weapon entity
			static wname[32], weapon_ent
			get_weaponname(weapon, wname, sizeof wname - 1)
			weapon_ent = fm_find_ent_by_owner(-1, wname, msg_entity)
			
			// Set max clip on weapon
			fm_set_weapon_ammo(weapon_ent, MAXCLIP[weapon])
		}
	}
}

// Find entity by its owner (from fakemeta_util)
stock fm_find_ent_by_owner(entity, const classname[], owner)
{
	while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) {}
	
	return entity;
}

// Set Weapon Clip Ammo
stock fm_set_weapon_ammo(entity, amount)
{
	set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}

// Save player's stats to database
save_stats(id)
{
	new g_playername[64];
	get_user_name(id, g_playername, charsmax(g_playername));
	// Check whether there is another record already in that slot
	if (db_name[id][0] && !equal(g_playername, db_name[id]))
	{
		// If DB size is exceeded, write over old records
		if (db_slot_i >= sizeof db_name)
			db_slot_i = g_maxplayers+1
		
		// Move previous record onto an additional save slot
		copy(db_name[db_slot_i], charsmax(db_name[]), db_name[id])
		db_times_bought[db_slot_i] = db_times_bought[id]
		db_slot_i++
	}
	
	// Now save the current player stats
	copy(db_name[id], charsmax(db_name[]), g_playername) // name
	db_times_bought[id] = g_times_bought[id] // usesnum
}

// Load player's stats from database (if a record is found)
load_stats(id)
{
	new g_playername[64];
	get_user_name(id, g_playername, charsmax(g_playername));
	// Look for a matching record
	static i
	for (i = 0; i < sizeof db_name; i++)
	{
		if (equal(g_playername, db_name[i]))
		{
			// Bingo!
			g_times_bought[id] = db_times_bought[i]
			return;
		}
	}
}

public client_putinserver(id)
{
	load_stats(id);
}

public fw_ClientDisconnect(id)
{
	save_stats(id);
}

public native_set_user_clip(id){
	g_has_unlimited_clip[id] = true;
	return 1;
}

public native_get_user_clip(id){
	return g_has_unlimited_clip[id];
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang3082\\ f0\\ fs16 \n\\ par }
*/

goldak

/*
[ZP] Extra Item: Golden Ak 47
Team: Humans

Description: This plugin adds a new weapon for Human Teams.
Weapon Cost: 30

Features:
- This weapon do more damage
- This weapon has zoom
- Launch Lasers
- This weapon has unlimited bullets

Credits:

KaOs - For his Dual MP5 mod

Cvars:


- zp_goldenak_dmg_multiplier <5> - Damage Multiplier for Golden Ak 47
- zp_goldenak_gold_bullets <1|0> - Golden bullets effect ?
- zp_goldenak_custom_model <1|0> - Golden ak Custom Model
- zp_goldenak_unlimited_clip <1|0> - Golden ak Unlimited Clip 

*/



#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <cstrike>
#include <zombie_plague_advance>

native zp_get_user_unlimited_clip(id)

#define is_valid_player(%1) (1 <= %1 <= 32)

new AK_V_MODEL[64] = "models/zombie_plague/v_golden_ak47.mdl"
new AK_P_MODEL[64] = "models/zombie_plague/p_golden_ak47.mdl"

/* Pcvars */
new const cvar_goldbullets = 0,  cvar_custommodel = 1, cvar_uclip = 0;
new const Float: cvar_dmgmultiplier = 2.0;
// Item ID
new g_itemid
new const g_item_cost = 32

new bool:g_HasAk[33]

new g_hasZoom[ 33 ]
new bullets[ 33 ]

// Sprite
new m_spriteTexture

const Wep_ak47 = ((1<<CSW_AK47))

public plugin_init()
{	
	// Register The Plugin
	register_plugin("[ZP] Extra: Golden Ak 47", "1.1", "AlejandroSk")
	// Register Zombie Plague extra item
	g_itemid = zp_register_extra_item("Zloty Kalach", g_item_cost , ZP_TEAM_HUMAN, 1)
	// Death Msg
	register_event("DeathMsg", "Death", "a")
	// Weapon Pick Up
	register_event("WeapPickup","checkModel","b","1=19")
	// Current Weapon Event
	register_event("CurWeapon","checkWeapon","be","1=1")
	register_event("CurWeapon", "make_tracer", "be", "1=1", "3>0")
	// Ham TakeDamage
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_forward( FM_CmdStart, "fw_CmdStart" )
	RegisterHam(Ham_Spawn, "player", "fwHamPlayerSpawnPost", 1)
	
}

public plugin_natives(){
	register_native("zp_set_user_goldenak", "native_set_user_goldenak", 1);
	register_native("zp_get_user_goldenak", "native_get_user_goldenak", 1);
}

public client_connect(id)
{
	g_HasAk[id] = false
}

public client_disconnect(id)
{
	g_HasAk[id] = false
}

public Death()
{
	g_HasAk[read_data(2)] = false
}

public fwHamPlayerSpawnPost(id)
{
	g_HasAk[id] = false
}

public plugin_precache()
{
	precache_model(AK_V_MODEL)
	precache_model(AK_P_MODEL)
	m_spriteTexture = precache_model("sprites/dot.spr")
	precache_sound("weapons/zoom.wav")
}

public zp_user_infected_post(id)
{
	if (zp_get_user_zombie(id))
	{
		g_HasAk[id] = false
	}
}

public checkModel(id)
{
	if ( zp_get_user_zombie(id) )
		return PLUGIN_HANDLED
	
	new szWeapID = read_data(2)
	
	if ( szWeapID == CSW_AK47 && g_HasAk[id] == true && cvar_custommodel )
	{
		set_pev(id, pev_viewmodel2, AK_V_MODEL)
		set_pev(id, pev_weaponmodel2, AK_P_MODEL)
	}
	return PLUGIN_HANDLED
}

public checkWeapon(id)
{
	new plrClip, plrAmmo, plrWeap[32]
	new plrWeapId
	
	plrWeapId = get_user_weapon(id, plrClip , plrAmmo)
	
	if (plrWeapId == CSW_AK47 && g_HasAk[id])
	{
		checkModel(id)
	}
	else 
	{
		return PLUGIN_CONTINUE
	}
	
	if (plrClip == 0 && cvar_uclip)
	{
		// If the user is out of ammo..
		get_weaponname(plrWeapId, plrWeap, 31)
		// Get the name of their weapon
		give_item(id, plrWeap)
		engclient_cmd(id, plrWeap) 
		engclient_cmd(id, plrWeap)
		engclient_cmd(id, plrWeap)
	}
	
	ExecuteHamB(Ham_GiveAmmo, id, 3, "762nato", 3)
	
	return PLUGIN_HANDLED
}



public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
	if (attacker >= 1 && attacker <= 31){
		if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] )
		{
			SetHamParamFloat(4, damage * cvar_dmgmultiplier)
		}
	}
}

public fw_CmdStart( id, uc_handle, seed )
{
	if( !is_user_alive( id ) ) 
		return PLUGIN_HANDLED
	
	if( ( get_uc( uc_handle, UC_Buttons ) & IN_ATTACK2 ) && !( pev( id, pev_oldbuttons ) & IN_ATTACK2 ) )
	{
		new szClip, szAmmo
		new szWeapID = get_user_weapon( id, szClip, szAmmo )
		
		if( szWeapID == CSW_AK47 && g_HasAk[id] == true && !g_hasZoom[id] == true)
		{
			g_hasZoom[id] = true
			cs_set_user_zoom( id, CS_SET_AUGSG552_ZOOM, 0 )
			emit_sound( id, CHAN_ITEM, "weapons/zoom.wav", 0.20, 2.40, 0, 100 )
		}
		
		else if ( szWeapID == CSW_AK47 && g_HasAk[id] == true && g_hasZoom[id])
		{
			g_hasZoom[ id ] = false
			cs_set_user_zoom( id, CS_RESET_ZOOM, 0 )
			
		}
		
	}
	return PLUGIN_HANDLED
}


public make_tracer(id)
{
	if (cvar_goldbullets)
	{
		new clip,ammo
		new wpnid = get_user_weapon(id,clip,ammo)
		new pteam[16]
		
		get_user_team(id, pteam, 15)
		
		if ((bullets[id] > clip) && (wpnid == CSW_AK47) && g_HasAk[id]) 
		{
			new vec1[3], vec2[3]
			get_user_origin(id, vec1, 1) // origin; your camera point.
			get_user_origin(id, vec2, 4) // termina; where your bullet goes (4 is cs-only)
			
			
			//BEAMENTPOINTS
			message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
			write_byte (0)     //TE_BEAMENTPOINTS 0
			write_coord(vec1[0])
			write_coord(vec1[1])
			write_coord(vec1[2])
			write_coord(vec2[0])
			write_coord(vec2[1])
			write_coord(vec2[2])
			write_short( m_spriteTexture )
			write_byte(1) // framestart
			write_byte(5) // framerate
			write_byte(2) // life
			write_byte(10) // width
			write_byte(0) // noise
			write_byte( 255 )     // r, g, b
			write_byte( 215 )       // r, g, b
			write_byte( 0 )       // r, g, b
			write_byte(200) // brightness
			write_byte(150) // speed
			message_end()
		}
	
		bullets[id] = clip
	}
	
}

public zp_extra_item_selected(player, itemid)
{
	if ( itemid == g_itemid)
	{
		if (!zp_get_user_unlimited_clip(player)){
			if ( user_has_weapon(player, CSW_AK47) )
			{
				drop_prim(player)
			}
			
			fm_give_item(player, "weapon_ak47")
			g_HasAk[player] = true;
		}
		else {
			client_print(player, print_chat, "Nie mozesz kupic Zlotego AK-47 jesli posiadasz Nieskonczonosc Amunicji!");
			return ZP_PLUGIN_HANDLED;
		}
	}
}

stock drop_prim(id) 
{
	new weapons[32], num
	get_user_weapons(id, weapons, num)
	for (new i = 0; i < num; i++) {
		if (Wep_ak47 & (1<<weapons[i])) 
		{
			static wname[32]
			get_weaponname(weapons[i], wname, sizeof wname - 1)
			engclient_cmd(id, "drop", wname)
		}
	}
}

public native_get_user_goldenak(id){
	return g_HasAk[id];
}

public native_set_user_goldenak(id){
	g_HasAk[id] = true;
	return 1;
}

plasmagun

/* Plugin generated by AMXX-Studio */

#include < AmxModX >
#include < FakeMeta >
#include < HamSandwich >
#include < ZombiePlague >
#include < xs >

#define PLUGIN 		"PlasmaGun"
#define VERSION 	"0.1"
#define AUTHOR 		"Opo4uMapy"

//##########Cvars [Start]##########//

#define WEAPON_MULTI_DAMAGE		1.0	// Ěíîćčňĺëü óđîíŕ (Đŕáîňŕĺň ĺńëč çŕďóůĺíî ACTIVE_TRACCE_ATTACK_DAMAGE)
#define WEAPON_TIME_NEXT_ATTACK 	0.15	// Âđĺě˙ ÷ĺđĺç ńęîëüęî áóäĺň âîçěîćíŕ ńëĺä. ŕňňŕęŕ
#define WEAPON_TIME_RELOAD		3.19	// Âđĺě˙ ďĺđĺçŕđ˙äęč
#define WEAPON__SPEED			0.20

#define WEAPON_BALL_SPEED		2000	// Ńęîđîńňü řŕđŕ
#define WEAPON_BALL_DAMAGE		60.0	// Óđîí řŕđŕ
#define WEAPON_BALL_RADIUS_EXPLODE	2.0	// Đŕäčóń âçđűâŕ řŕđŕ
#define WEAPON_BALL_SIZE		random_float(random_float(0.1 , 0.2), random_float(0.3, 0.4)) // Đŕçěĺđ řŕđŕ

#define CLIP				30	// Ďŕňđîíű â îáîéěĺ
#define AMMO				200	// Ďŕňđîíű â çŕďŕńĺ
#define ACTIVE_ZOMBIE_PLAGUE 1

//#define ACTIVE_SHOOT_DECALS			// Âęëţ÷čňü äĺęŕëč(äűđęč) îň âűńňđĺëîâ
//#define ACTIVE_SHELL				// Âęëţ÷čňü/âűęëţ÷čňü ăčëüçű
//#define ACTIVE_TRACCE_ATTACK_DAMAGE		// Âęëţ÷čňü óđîí ń ďîěîůüţ ňđĺéń ŕňňŕę

enum	// Îňäŕ÷ŕ
{
	x = -5.0,
	y = 0.0,
	z = 0.0
}

//##########Cvars [End]##########//

#define WEAPON_NEW		"weapon_plasmagun"
#define WEAPON_REFERANCE	"weapon_m249"
#define CLASS_NAME_BALL		"EntBall"

#define STATEMENT_FALLBACK(%0,%1,%2)	public %0()<>{return %1;} public %0()<%2>{return %1;}

const m_iClip 				= 	51	// îôôńĺň îáîéěű
const m_pPlayer 			= 	41 	// îôôńĺň äë˙ ďîëó÷ĺíčĺ id čăđîęŕ
const m_fInReload			=	54 	// îôôńĺň äë˙ ďîëó÷ĺíč˙ ďĺđĺçŕđ˙äęč
const m_iShellLate 			= 	57 	// îôôńĺň ăčëüç
const m_pActiveItem			= 	373 	// îôôńĺň get_pdata_cbase 
const m_flNextAttack 			= 	83 	// îôôńĺň äë˙ áëęčđîâŕíč˙ íŕćŕňčĺ
const m_flEjectBrass  			= 	111 	// îôôńĺň äë˙ âűëĺňŕ ăčëüç ń çŕäĺđćęîé
const m_szAnimExtention	 		= 	492	// îôôńĺň äë˙ óńňŕíîâęč ŕíčěŕöčč íŕ čăđîęĺ
const m_afButtonPressed 		= 	246  	// îôôńĺň äë˙ âűńňđĺëŕ čç ďčńňîëĺňŕ
const m_flTimeWeaponIdle		= 	48  	// îôôńĺň äë˙ ŕíčěŕöčč idle 
const m_flNextPrimaryAttack 		= 	46 	// îôôńĺň äë˙ ńęîđîńňč ââűńňđĺëŕ ďĺđâč÷íîé ŕňŕęč
const m_flNextSecondaryAttack		=	47	// îôôńĺň äë˙ ńęîđîńňč ââűńňđĺëŕ âňîđč÷íîé ŕňŕęč
const m_rgpPlayerItems_CBasePlayer	=	367
const m_rgpPlayerItems_CWeaponBox 	= 	34
const m_iShotsFired			=	64
const m_pNext				=	42 
const OFFSET_LINUX_WEAPONS     		=	4 	// îôôńĺň äë˙ ďóřęč
const OFFSET_LINUX    			=    	5 	// îôôńĺň äë˙ čăđîęŕ 

enum
{
	IDLE = 0,	// 1
	RELOAD,		// 2
	DRAW,		// 3
	SHOOT,		// 4
	SHOOT_END	// 5
}

new const Resources_Models[3][] = 
{
	"models/pzb_zombie/v_plasmagun.mdl",		// 0
	"models/pzb_zombie/p_plasmagun.mdl",		// 1
	"models/pzb_zombie/w_plasmagun.mdl"		// 2
}

new const Resources_Sounds[2][] = 
{
	"weapons/pzb_zombie/plasmagun-1.wav",		// 0
	"weapons/pzb_zombie/plasmagun_exp.wav"		// 1
}

new const Resources_WeaponList[2][] = 
{
	"sprites/zm/640hud3.spr",			// 0
	"sprites/zm/640hud91.spr"			// 1
}

new const Resources_Sprites[2][] =
{
	"sprites/pzb_zombie/plasmaball.spr",		// 0
	"sprites/pzb_zombie/plasmabomb.spr"		// 1
}

new const OFFSET_AMMO[31] =  // Îôńĺňű ďŕňđîíîâ
{
	0, 385, 0, 378, 0, 381, 0, 382, 380, 0, 386, 383, 382, 380, 380, 380, 382, 386, 377, 386, 379, 381, 380, 386, 378, 0, 384, 380, 378, 0, 383
}
#if defined ACTIVE_TRACCE_ATTACK_DAMAGE
new const TRACE_ATTACK[][] = 
{
	"func_breakable", 
	"hostage_entity",
	"info_target", 
	"player" 
}
#endif

#if defined ACTIVE_SHELL
new g_Shell
new const SHELL_MODEL[] = "models/rshell.mdl"
#endif

new g_WeaponID = 0, g_WeaponKey, g_SpriteExp, g_item

new g_iForwardDecalIndex, g_WeaponListData[8]

public plugin_init() 
{
	//Authors
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	//Ham
	RegisterHam(Ham_Spawn, 			"weaponbox", 		"Weapon_SpawnPost", 		1)
	RegisterHam(Ham_Touch,			"env_sprite",		"Weapon_Ball_Touch",		1)
	RegisterHam(Ham_Item_Deploy,		WEAPON_REFERANCE,	"Weapon_Deploy",		1)
	RegisterHam(Ham_Weapon_Reload, 		WEAPON_REFERANCE, 	"Hook_Reload", 			0)
	RegisterHam(Ham_Weapon_PrimaryAttack, 	WEAPON_REFERANCE, 	"Hook_PrimaryAttack_Pre",	0)
	RegisterHam(Ham_Item_AddToPlayer, 	WEAPON_REFERANCE, 	"Weapon_AddToPlayer",		0)
	RegisterHam(Ham_Item_PostFrame,		WEAPON_REFERANCE, 	"Weapon_ItemPostFrame",	0)

	#if defined ACTIVE_TRACCE_ATTACK_DAMAGE
	for(new i = 0; i < sizeof TRACE_ATTACK; i++)
	{
		RegisterHam(Ham_TraceAttack, TRACE_ATTACK[i], "Hook_TraceAttack", 0)
	}
	#endif
	
	//Forward
	register_forward(FM_UpdateClientData, 	"fw_UpdateClientData_Post", 	1)
	register_forward(FM_PlaybackEvent, 	"fw_PlaybackEvent",		0)
	register_forward(FM_SetModel, 		"fw_SetModel",			0)
	register_forward(FM_AddToFullPack, 	"CPlayer__AddToFullPack_post", 	1)
	register_forward(FM_CheckVisibility, 	"CEntity__CheckVisibility",	0)
	
	#if defined ACTIVE_SHOOT_DECALS
	register_forward(FM_TraceLine,		"FakeMeta_TraceLine_Post",	1)
	#endif

	#if defined ACTIVE_ZOMBIE_PLAGUE
	g_item = zp_register_extra_item("Wyrzutnia Plazmy", 15, ZP_TEAM_HUMAN, 1)
	#else
	register_clcmd("plasmagun", "Weapon_Give")
	#endif
	
	//Other's
	g_WeaponID = get_weaponid(WEAPON_REFERANCE)
	unregister_forward(FM_DecalIndex, g_iForwardDecalIndex, true)
}

public plugin_precache()
{
	g_WeaponKey = engfunc(EngFunc_AllocString, WEAPON_NEW)
	register_message(78, "Hook_WeaponList")
	
	new i
	
	for(i = 0; i < sizeof Resources_Models; i++)
		precache_model(Resources_Models[i])
		
	for(i = 0; i < sizeof Resources_Sounds; i++)
		precache_sound(Resources_Sounds[i])
	
	for(i = 0; i < sizeof Resources_Sprites; i++)
		precache_model(Resources_Sprites[i])
		
	for(i = 0; i < sizeof Resources_WeaponList; i++)
		precache_generic(Resources_WeaponList[i])
		
	PRECACHE_SOUNDS_FROM_MODEL(Resources_Models[0])
	
	#if defined ACTIVE_SHELL
	g_Shell = precache_model(SHELL_MODEL)
	#endif
	g_SpriteExp = precache_model(Resources_Sprites[1])
	
	new Buffer[32]
	formatex(Buffer, charsmax(Buffer), "sprites/%s.txt", WEAPON_NEW)
	precache_generic(Buffer)
	
	g_iForwardDecalIndex = register_forward(FM_DecalIndex, "FakeMeta_DecalIndex_Post", true)

	register_clcmd(WEAPON_NEW, "Weapon_Hook")
}

public Weapon_Hook(id)
{
	engclient_cmd(id, WEAPON_REFERANCE)
	return PLUGIN_HANDLED
}

#if defined ACTIVE_ZOMBIE_PLAGUE
public zp_extra_item_selected(id, itemid)
{
	if(itemid == g_item)
	{
		Weapon_Give(id)
	}
}
#endif

public Weapon_Deploy(weapon)
{		
	static id
	
	if(!CheckItem(weapon, id))
		return HAM_IGNORED

	#if defined ACTIVE_SHOOT_DECALS
	if(zp_get_user_zombie(id))
		return
	#endif

	set_pev(id, pev_viewmodel2, Resources_Models[0])
	set_pev(id, pev_weaponmodel2, Resources_Models[1])

	WeaponList(id, WEAPON_NEW)
	Weapon_SendAnim(id, DRAW)
	
	set_pdata_string(id, m_szAnimExtention * 4, "rifle", -1, OFFSET_LINUX * 4)
	set_pdata_float(id, m_flNextAttack, WEAPON_TIME_NEXT_ATTACK, OFFSET_LINUX)
	
	return HAM_IGNORED
}

public Weapon_AddToPlayer(weapon, id) 
{
	if(pev_valid(weapon) != 2 || pev_valid(id) != 2)
		return HAM_IGNORED
		
	if(pev(weapon, pev_impulse) == g_WeaponKey) 
	{
  		WeaponList(id, WEAPON_NEW)
		return HAM_HANDLED
	}
	else
	{
		WeaponList(id, WEAPON_REFERANCE)
		return HAM_IGNORED
	}
	return HAM_IGNORED
}

public fw_SetModel(entity) <WeaponBox: Enabled>
{
	state WeaponBox: Disabled

	if(pev_valid(entity) != 2) 
		return FMRES_IGNORED

	for(new i, iItem; i < 6; i++)
	{
		iItem = get_pdata_cbase(entity, m_rgpPlayerItems_CWeaponBox + i, OFFSET_LINUX_WEAPONS)
		
		if(pev_valid(iItem) == 2 && pev(iItem, pev_impulse) == g_WeaponKey)
		{
			InstallWorldModel(entity)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}
STATEMENT_FALLBACK(fw_SetModel, FMRES_IGNORED, WeaponBox: Disabled)

public Hook_PrimaryAttack_Pre(weapon)
{
	static id
	
	if(CheckItem(weapon, id))
	{
		Weapon_PrimaryAttack_Pre(weapon, id)
		return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}

public Weapon_PrimaryAttack_Pre(Weapon, id)
{
	static Float:vecPuncheAngle[3]

	state FireBullets: Enabled
	
	pev(id, pev_punchangle, vecPuncheAngle)
	ExecuteHam(Ham_Weapon_PrimaryAttack, Weapon)
	set_pev(id, pev_punchangle, vecPuncheAngle)
	state FireBullets: Disabled

	if(get_pdata_int(Weapon, m_iClip, OFFSET_LINUX_WEAPONS) <= 0)
		return

	if(!get_pdata_int(id, OFFSET_AMMO[g_WeaponID]))
		return

	#if defined ACTIVE_SHOOT_DECALS
	if(zp_get_user_zombie(id))
		return
	#endif

	set_pev(id, pev_punchangle, Float:{x, y, z})
	
	#if defined ACTIVE_SHELL
	cmdBrass(Weapon, id, g_Shell)
	#endif

	CreateBall(id)
	Weapon_SendAnim(id, SHOOT)
	emit_sound(id, CHAN_WEAPON, Resources_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	set_pdata_float(Weapon, m_flNextPrimaryAttack , WEAPON__SPEED , OFFSET_LINUX_WEAPONS)
	set_pdata_float(Weapon, m_flTimeWeaponIdle, WEAPON__SPEED + 3.0, OFFSET_LINUX_WEAPONS)
}

public Weapon_Ball_Touch(entity)
{
	if(!pev_valid(entity)) 
		return
	
	static ClassName[32] 
	pev(entity, pev_classname, ClassName, charsmax(ClassName))
	
	if(equali(ClassName, CLASS_NAME_BALL))
	{
		static Float:flOrigin[3]
		pev(entity, pev_origin, flOrigin)
		
		engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0)
		write_byte(TE_EXPLOSION)
		engfunc(EngFunc_WriteCoord, flOrigin[0])
		engfunc(EngFunc_WriteCoord, flOrigin[1])
		engfunc(EngFunc_WriteCoord, flOrigin[2])
		write_short(g_SpriteExp)
		write_byte(5)
		write_byte(15)
		write_byte(TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NOSOUND)
		message_end()
		
		emit_sound(entity, CHAN_WEAPON, Resources_Sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

		new victim  = FM_NULLENT,
		attacker = pev(entity, pev_iuser1)
		
		while((victim = engfunc(EngFunc_FindEntityInSphere, victim, flOrigin, WEAPON_BALL_RADIUS_EXPLODE)) != 0)
		{
			if(!is_user_alive(victim) || victim == attacker)
				continue

			#if defined ACTIVE_SHOOT_DECALS
			if(!zp_get_user_zombie(victim))
				return
			#endif
				
			ExecuteHamB(Ham_TakeDamage, victim, attacker, attacker, WEAPON_BALL_DAMAGE, DMG_SONIC)
		}
		engfunc(EngFunc_RemoveEntity, entity)
	}
}

public Weapon_ItemPostFrame(weapon) 
{
	static id
	id = get_pdata_cbase(weapon, m_pPlayer, OFFSET_LINUX_WEAPONS)

	if(!CheckItem(weapon, id))
		return

	#if defined ACTIVE_SHOOT_DECALS
	if(zp_get_user_zombie(id))
		return
	#endif

	if(!get_pdata_int(weapon, m_fInReload, OFFSET_LINUX_WEAPONS) || get_pdata_float(id, m_flNextAttack) > 0.0)
		return

	new iAmmo = get_pdata_int(id, OFFSET_AMMO[g_WeaponID])
	new iClip = get_pdata_int(weapon, m_iClip, OFFSET_LINUX_WEAPONS)
	new j = min(CLIP - iClip, iAmmo)

	set_pdata_int(weapon, m_iClip, iClip + j, OFFSET_LINUX_WEAPONS)
	set_pdata_int(id, OFFSET_AMMO[g_WeaponID], iAmmo - j)
	set_pdata_int(weapon, m_fInReload, 0, OFFSET_LINUX_WEAPONS)
}

public Hook_Reload(weapon) 
{    
	static id
	
	if(CheckItem(weapon, id))
	{
		Weapon_Reload(weapon, id)
		return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}

public Weapon_Reload(weapon, id)
{
	if(get_pdata_int(id, OFFSET_AMMO[g_WeaponID]) <= 0)
		return

	#if defined ACTIVE_SHOOT_DECALS
	if(zp_get_user_zombie(id))
		return
	#endif
		
	ExecuteHam(Ham_Weapon_Reload, weapon)

	Weapon_SendAnim(id, RELOAD)

	set_pdata_float(id, m_flNextAttack, WEAPON_TIME_RELOAD)
	set_pdata_int(weapon, m_fInReload, 1, OFFSET_LINUX_WEAPONS)
	set_pdata_float(weapon, m_flTimeWeaponIdle, WEAPON_TIME_RELOAD, OFFSET_LINUX_WEAPONS)
}

public Weapon_Give(id)
{
	if(pev_valid(id) != 2)
		return FM_NULLENT
	
	new entity, Float:Origin[3]
	pev(id, pev_origin, Origin)
	
	if ((entity = Weapon_Create(Origin)) != FM_NULLENT)
	{
		Player_DropWeapons(id, ExecuteHamB(Ham_Item_ItemSlot, entity))
		
		set_pev(entity, pev_spawnflags, pev(entity, pev_spawnflags) | SF_NORESPAWN)
		dllfunc(DLLFunc_Touch, entity, id)
		
		set_pdata_int(id, OFFSET_AMMO[g_WeaponID], AMMO, OFFSET_LINUX)
		
		return entity
	}
	
	return FM_NULLENT
}

Weapon_Create(const Float: vecOrigin[3] = {0.0, 0.0, 0.0}, const Float: vecAngles[3] = {0.0, 0.0, 0.0})
{
	new entity

	static iszAllocStringCached
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_REFERANCE)))
	{
		entity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
	}
	
	if(pev_valid(entity) != 2)
	{
		return FM_NULLENT
	}
	
	dllfunc(DLLFunc_Spawn, entity)
	engfunc(EngFunc_SetOrigin, entity, vecOrigin)
	
	set_pdata_int(entity, m_iClip, CLIP ,OFFSET_LINUX_WEAPONS)

	set_pev_string(entity, pev_classname, g_WeaponKey)
	set_pev(entity, pev_impulse, g_WeaponKey)
	set_pev(entity, pev_angles, vecAngles)
	
	InstallWorldModel(entity)
	 
	return entity
}

public Weapon_SpawnPost(entity)
{
	if(pev_valid(entity) == 2)
	{
		state (pev_valid(pev(entity, pev_owner)) == 2) WeaponBox: Enabled
	}
	
	return HAM_IGNORED
}
#if defined ACTIVE_SHOOT_DECALS
public FakeMeta_TraceLine_Post(const Float: vecTraceStart[3], const Float: vecTraceEnd[3], const fNoMonsters, const iEntToSkip, const iTrace) <FireBullets: Enabled>
{
	static Float: vecEndPos[3]
	
	get_tr2(iTrace, TR_vecEndPos, vecEndPos)
	engfunc(EngFunc_TraceLine, vecEndPos, vecTraceStart, fNoMonsters, iEntToSkip, 0)
	
	UTIL_GunshotDecalTrace(0)
	UTIL_GunshotDecalTrace(iTrace, true)
	
	return FMRES_IGNORED
}
STATEMENT_FALLBACK(FakeMeta_TraceLine_Post, FMRES_IGNORED, FireBullets: Disabled)
#endif
#if defined ACTIVE_TRACCE_ATTACK_DAMAGE
public Hook_TraceAttack(entity, iAttacker, Float:flDamage) <FireBullets: Enabled>
{
	SetHamParamFloat(3, flDamage * WEAPON_MULTI_DAMAGE)
	return HAM_IGNORED
}
STATEMENT_FALLBACK(Hook_TraceAttack, HAM_IGNORED, FireBullets: Disabled)
#endif

public fw_PlaybackEvent() <FireBullets: Enabled>
{
	return FMRES_SUPERCEDE
}
STATEMENT_FALLBACK(fw_PlaybackEvent, FMRES_IGNORED, FireBullets: Disabled)

public fw_UpdateClientData_Post(id, SendWeapons, CD_Handle )
{
	static iItem
	
	if(CheckItem2(id, iItem))
	{
		set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
	}
}

#if defined ACTIVE_SHELL
public cmdBrass(Weapon, id, ModelIndex)
{
        set_pdata_int(Weapon, m_iShellLate, ModelIndex, OFFSET_LINUX)
        set_pdata_float(id, m_flEjectBrass, get_gametime())
}
#endif

public Hook_WeaponList(MsgID, MsgDest, MsgEntity)
{
	new WeaponName[32]
	get_msg_arg_string(1, WeaponName, charsmax(WeaponName))
		
	if (!strcmp(WeaponName, WEAPON_REFERANCE))
	{
		for(new i, a = sizeof g_WeaponListData; i < a; i++)
		{
			g_WeaponListData[i] = get_msg_arg_int(i + 2)
		}
	}
}

CreateBall(id)
{
	static entity
	
	if((entity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))))
	{
		static Float:vOrigin[3], Float:vVelocity[3], vAngles[3]

		get_weapon_position(id, vOrigin, 40.0, 12.0, -5.0)
		
		set_pev(entity, pev_classname, CLASS_NAME_BALL)
		set_pev(entity, pev_movetype, MOVETYPE_FLY)
		set_pev(entity, pev_solid, SOLID_SLIDEBOX)
		
		engfunc(EngFunc_SetModel, entity, Resources_Sprites[0])
		engfunc(EngFunc_SetOrigin, entity, vOrigin)
		engfunc(EngFunc_SetSize, entity, Float:{ 0.0, 0.0, 0.0 }, Float:{ 0.0, 0.0, 0.0 })
		
		set_pev(entity, pev_renderfx, kRenderFxGlowShell)
		set_pev(entity, pev_rendermode, kRenderTransAdd)
		set_pev(entity, pev_renderamt, 255.0)
		set_pev(entity, pev_scale, WEAPON_BALL_SIZE)
		set_pev(entity, pev_iuser1, id)
		
		velocity_by_aim(id, WEAPON_BALL_SPEED, vVelocity)
		
		set_pev(entity, pev_velocity, vVelocity)
		engfunc(EngFunc_VecToAngles, vVelocity, vAngles)
		set_pev(entity, pev_angles, vAngles)
	}
}

WeaponList(id, const WeaponName[32])
{
	engfunc(EngFunc_MessageBegin, MSG_ONE, 78, {0.0, 0.0, 0.0}, id)
	write_string(WeaponName)
		
	for(new i, a = sizeof g_WeaponListData; i < a; i++)
	{
		write_byte(g_WeaponListData[i])
	}
	message_end()
}

InstallWorldModel(entity)
	engfunc(EngFunc_SetModel, entity, Resources_Models[2])

Weapon_SendAnim(id, anim)
{
	set_pev(id, pev_weaponanim, anim)

	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0.0, 0.0, 0.0}, id)
	write_byte(anim)
	write_byte(0)
	message_end()
}

stock bool:CheckItem(weapon, &id)
{
	if(pev_valid(weapon) == 2 && pev(weapon, pev_impulse) == g_WeaponKey)
	{
		id = get_pdata_cbase(weapon, m_pPlayer, OFFSET_LINUX_WEAPONS)
		if(pev_valid(id) == 2)
			return true
	}
	return false
}

stock bool:CheckItem2(id, &iItem)
{
	if(pev_valid(id) != 2)
	{
		return false
	}
	
	iItem = get_pdata_cbase(id, m_pActiveItem, OFFSET_LINUX)
	
	if(pev_valid(iItem) != 2 || pev(iItem, pev_impulse) != g_WeaponKey)
	{
		return false
	}
	
	return true
}

Player_DropWeapons(id, iSlot)
{
	new WeaponName[32], entity = get_pdata_cbase(id, m_rgpPlayerItems_CBasePlayer + iSlot, OFFSET_LINUX)

	while(pev_valid(entity) == 2)
	{
		pev(entity, pev_classname, WeaponName, charsmax(WeaponName))
		engclient_cmd(id, "drop", WeaponName)

		entity = get_pdata_cbase(entity, m_pNext, OFFSET_LINUX_WEAPONS)
	}
}

stock get_weapon_position(id, Float:fOrigin[], Float:add_forward = 0.0, Float:add_right = 0.0, Float:add_up = 0.0)
{
	static Float:Angles[3],Float:ViewOfs[3], Float:vAngles[3]
	static Float:Forward[3], Float:Right[3], Float:Up[3]
	
	pev(id, pev_v_angle, vAngles)
	pev(id, pev_origin, fOrigin)
	pev(id, pev_view_ofs, ViewOfs)
	xs_vec_add(fOrigin, ViewOfs, fOrigin)
	
	pev(id, pev_angles, Angles)
	
	Angles[0] = vAngles[0]
	
	engfunc(EngFunc_MakeVectors, Angles)
	
	global_get(glb_v_forward, Forward)
	global_get(glb_v_right, Right)
	global_get(glb_v_up, Up)
	
	xs_vec_mul_scalar(Forward, add_forward, Forward)
	xs_vec_mul_scalar(Right, add_right, Right)
	xs_vec_mul_scalar(Up, add_up, Up)
	
	fOrigin[0] = fOrigin[0] + Forward[0] + Right[0] + Up[0]
	fOrigin[1] = fOrigin[1] + Forward[1] + Right[1] + Up[1]
	fOrigin[2] = fOrigin[2] + Forward[2] + Right[2] + Up[2]
}
#if defined ACTIVE_SHOOT_DECALS
//Decals
//By KORD
#define INSTANCE(%0) ((%0 == -1) ? 0 : %0)

new Array:g_hDecals

public FakeMeta_DecalIndex_Post()
{
	if(!g_hDecals)
		g_hDecals = ArrayCreate(1, 1)
	
	ArrayPushCell(g_hDecals, get_orig_retval())
}

UTIL_GunshotDecalTrace(const iTrace, const bool: bIsGunshot = false)
{
	static iHit;
	static iMessage;
	static iDecalIndex;
	
	static Float: flFraction; 
	static Float: vecEndPos[3];
	
	iHit = INSTANCE(get_tr2(iTrace, TR_pHit));
	
	if (iHit && pev_valid(iHit) != 2 || (pev(iHit, pev_flags) & FL_KILLME))
	{
		return;
	}
	
	if (pev(iHit, pev_solid) != SOLID_BSP && pev(iHit, pev_movetype) != MOVETYPE_PUSHSTEP)
	{
		return;
	}
	
	iDecalIndex = ExecuteHamB(Ham_DamageDecal, iHit, 0);
	
	if (iDecalIndex < 0 || iDecalIndex >=  ArraySize(g_hDecals))
	{
		return;
	}
	
	iDecalIndex = ArrayGetCell(g_hDecals, iDecalIndex);
	
	get_tr2(iTrace, TR_flFraction, flFraction);
	get_tr2(iTrace, TR_vecEndPos, vecEndPos);
	
	if (iDecalIndex < 0 || flFraction >= 1.0)
	{
		return;
	}
	
	if (bIsGunshot)
	{
		iMessage = TE_GUNSHOTDECAL
	}
	else
	{
		iMessage = TE_DECAL;
		
		if (iHit != 0)
		{
			if (iDecalIndex > 255)
			{
				iMessage = TE_DECALHIGH
				iDecalIndex -= 256
			}
		}
		else
		{
			iMessage = TE_WORLDDECAL
			
			if (iDecalIndex > 255)
			{
				iMessage = TE_WORLDDECALHIGH
				iDecalIndex -= 256
			}
		}
	}
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEndPos, 0)
	write_byte(iMessage)
	engfunc(EngFunc_WriteCoord, vecEndPos[0])
	engfunc(EngFunc_WriteCoord, vecEndPos[1])
	engfunc(EngFunc_WriteCoord, vecEndPos[2])
	
	if (bIsGunshot)
	{
		write_short(iHit)
		write_byte(iDecalIndex)
	}
	else 
	{
		write_byte(iDecalIndex)
		
		if (iHit)
		{
			write_short(iHit)
		}
	}
    
	message_end()
}
#endif
PRECACHE_SOUNDS_FROM_MODEL(const szModelPath[])
{
	new iFile
	
	if ((iFile = fopen(szModelPath, "rt")))
	{
		new szSoundPath[64]
		
		new iNumSeq, iSeqIndex
		new iEvent, iNumEvents, iEventIndex
		
		fseek(iFile, 164, SEEK_SET)
		fread(iFile, iNumSeq, BLOCK_INT)
		fread(iFile, iSeqIndex, BLOCK_INT)
		
		for (new k, i = 0; i < iNumSeq; i++)
		{
			fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET)
			fread(iFile, iNumEvents, BLOCK_INT)
			fread(iFile, iEventIndex, BLOCK_INT)
			fseek(iFile, iEventIndex + 176 * i, SEEK_SET)

			for (k = 0; k < iNumEvents; k++)
			{
				fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET)
				fread(iFile, iEvent, BLOCK_INT)
				fseek(iFile, 4, SEEK_CUR)
				
				if (iEvent != 5004)
				{
					continue
				}

				fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR)
				
				if (strlen(szSoundPath))
				{
					strtolower(szSoundPath)
					precache_sound(szSoundPath)
				}
			}
		}
	}
	
	fclose(iFile);
}

Poblem po usunieciu bazy danych

18.02.2016 17:58

WITAM  nie bardzo wiem jaka mam wersje  amxbans  bo nie ja ja instalowałem

na www pisze amxbans 1 6  a tu takiej  wersji nie mam  niemniej proszę o pomoc

 

 

chciałem  osunąć  historie banów, na  forum znalazłem  ze trzeba   osunąć  bazę  i stworzyć  nowa

zrobiłem tak 

pobrałem kopie

usunąłem amx_bans

utworzyłem nowy amxbans

 

na stronie amxbans  pokazuje, kto był zbanowany, przez kogo ,jaki powód ,i na jak długo

ale podczas dawania  bana na serwerze wywala 

z  historia pierwszego bana

iw konsoli   jest  konsola z pierwszego bana

 

mógł by mi ktoś poradzić co z tym zrobić

 

 

 

 

przywrócenie  kopi nie wchodzi w grę plik jest chyba za doży

problem z admin widzi przez szybe

24.01.2016 22:39

http://amxx.pl/topic...ck-przez-szyby/

witam pobrałem  plugin  admin widzi przez szybę  i nie działa mi  on 

a właściwie  nie działa tak jak powinien

 

gdy  widzę gracza bez przeszkód    to pokazuje jego  nick  jak na   ss darkgl

 

ale nie widzę  go przez szybę

a  plugin mi potrzebny   aby admin widział przez szybę kto blokuje/nie zaraza/ skanuje takie tam do  zombi moda

 

jak  by ktoś mógł pomoc był bym wdzieczny

 

jakby  jeszcze poprawić,   aby  aby pokazywało  to  tylko  jak gracz jest za szyba

albo  pokazywało się  u spodu    ekranu  był bym wdzięczny   bo plugin miesza się z innym

}

public fwdPreThink(id)
{
	if( !is_user_alive( id ) || !( get_user_flags(id) & ADMIN_KICK ) ){
		return;
	}
	
	
	new id2,
		body;
		
	get_user_aiming(id, id2, body);
	
	if(is_user_alive(id2)){
		showNick( id2 , id );
	}
	else{
		new Float:fOrigin[3],Float:fView[3],Float:fAngles[3];
		
		pev(id,pev_origin,fOrigin);
		pev(id,pev_view_ofs,fView);
		
		xs_vec_add(fOrigin,fView,fOrigin);
		
		pev(id,pev_v_angle,fAngles);
		
		angle_vector(fAngles,ANGLEVECTOR_FORWARD,fAngles);
		
		xs_vec_mul_scalar(fAngles,9999.0,fAngles);
		
		xs_vec_add(fOrigin,fAngles,fAngles);
		
		new ptr = create_tr2();
		
		engfunc(EngFunc_TraceLine, fOrigin, fAngles, IGNORE_GLASS | IGNORE_MISSILE | DONT_IGNORE_MONSTERS, id, ptr);
		
		new pHit = get_tr2(ptr,TR_pHit);
		
		free_tr2(ptr)
		
		if(is_user_alive(pHit)){
			showNick( pHit , id );
		}
	}
}

showNick( idVictim , idShow ){
	new szName[ 64 ];
		
	get_user_name( idVictim, szName, charsmax( szName ) );
	
	set_hudmessage(get_user_team(idVictim) == 1 ? 255 : 0, 0, get_user_team(idVictim) == 2 ? 255 : 0, -1.0, 0.60, 0 , 0.0 , 0.1 , 0.1 , 0.1 );
	ShowSyncHudMsg( idShow, gSyncMsgHandler, "Nick: %s", szName );