#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < fvault >
#pragma semicolon 1
#define FM_TEAM_RANDOM 5
new const g_szVaultName[ ] = "JailBreak Ct Ban";
enum _:ArrayData
{
FreeKill,
Name[ 32 ],
SteamID[ 35 ],
Reason[ 35 ]
};
enum _:Teams
{
FM_TEAM_UNASSIGNED,
FM_TEAM_T,
FM_TEAM_CT,
FM_TEAM_SPECTATOR
};
new FreeKiller[ 33 ];
new ForwardFreeKiller_PutInServer;
new ForwardFreeKiller_Authorized;
new ForwardFreeKiller_Disconnect;
new ForwardFreeKiller_JoinCT;
new ForwardReturn;
new cvar_Enabled;
public plugin_init( ) {
register_plugin( "FreeKiller List", "0.0.7", "CreePs" );
register_dictionary("freekiller_list.txt");
register_event( "TeamInfo", "Event_Teaminfo", "a" );
register_concmd( "add_freekiller", "cmdAddFreeKill", ADMIN_BAN, "<name / userid> <reason>" );
register_menucmd(register_menuid("Team_Select", 1), (1<<0)|(1<<1)|(1<<4)|(1<<5), "cmdTeamSelect");
register_clcmd( "jointeam", "cmdJoinTeam" );
register_clcmd( "say /fklist", "cmdShowList" );
register_clcmd( "say /mystats", "cmdShowStats" );
register_clcmd( "say /mystatus", "cmdShowStats" );
register_clcmd( "say /fkdata", "cmdShowDataManagement" );
cvar_Enabled = register_cvar( "freekiller_list", "1" );
ForwardFreeKiller_PutInServer = CreateMultiForward( "Forward_FreeKiller_putinserver", ET_IGNORE, FP_CELL );
ForwardFreeKiller_Authorized = CreateMultiForward( "Forward_FreeKiller_authorized", ET_IGNORE, FP_CELL );
ForwardFreeKiller_Disconnect = CreateMultiForward( "Forward_FreeKiller_disconnect", ET_IGNORE, FP_CELL );
ForwardFreeKiller_JoinCT = CreateMultiForward( "Forward_FreeKiller_joinct", ET_IGNORE, FP_CELL );
}
public plugin_natives( )
{
register_library( "freekiller_list" );
register_native( "is_user_freekiller", "_is_user_freekiller" );
register_native( "set_user_freekiller", "_set_user_freekiller" );
}
public _is_user_freekiller( plugin, params )
{
return FreeKiller[ get_param( 1 ) ];
}
public _set_user_freekiller( plugin, params )
{
new client = get_param( 1 );
new authid[ 35 ], name[ 32 ], data[ 64 ], reason[ 35 ];
get_user_authid( client, authid, sizeof( authid ) - 1 );
get_user_name( client, name, sizeof( name ) - 1 );
get_string(3, reason, sizeof( reason ) - 1 );
formatex( data, sizeof( data ) - 1, "^"%d^" ^"%s^" ^"%s^"", max( 0, get_param( 2 ) ), name, reason );
fvault_set_data( g_szVaultName, authid, data );
Load( client, false, false );
}
public Event_Teaminfo( )
{
if( ! get_pcvar_num( cvar_Enabled ) )
return;
new client = read_data( 1 );
new team[ 12 ];
read_data( 2, team, sizeof( team ) - 1 );
if( team[ 0 ] == 'C' && FreeKiller[ client ] )
{
MoveFromCT( client );
}
}
public cmdAddFreeKill( client, level, cid )
{
if( ! cmd_access( client, level, cid, 3 ) || ! get_pcvar_num( cvar_Enabled ) )
{
return PLUGIN_HANDLED;
}
static arg[ 35 ];
read_argv( 1, arg, sizeof( arg ) - 1 );
new target = cmd_target( client, arg, CMDTARGET_NO_BOTS );
if( target)
{
new name[ 32 ], nameAdmin[ 32 ], authid[ 35 ];
get_user_name( client, nameAdmin, sizeof( nameAdmin ) - 1 );
get_user_name( target, name, sizeof( name ) - 1 );
get_user_authid( target, authid, sizeof( authid ) - 1 );
read_argv( 2, arg, sizeof( arg ) - 1 );
if( ! arg[ 0 ] )
{
//ERROR: reason has not found
return PLUGIN_HANDLED;
}
new data[ 64 ];
if( fvault_get_data( g_szVaultName, authid, data, sizeof( data ) ) )
{
console_print( client, "%L", client, "TARGET_REGISTER" );
return PLUGIN_HANDLED;
}
formatex( data, sizeof( data ) - 1, "1 ^"%s^" ^"%s^"", name, arg );
fvault_set_data( g_szVaultName, authid, data );
log_amx( "%L", client, "FREEKILLER_ADDED_LOG", nameAdmin, name, authid, arg );
console_print( client, "%L", client, "FREEKILLER_ADDED_MSG", name, authid, arg );
Load( target, false, false );
if( get_user_team( target ) == FM_TEAM_CT )
MoveFromCT( target );
}
return PLUGIN_HANDLED;
}
public cmdTeamSelect( client, team )
{
if( FreeKiller[ client ] && get_pcvar_num( cvar_Enabled ) )
{
if( team == FM_TEAM_CT
|| team == FM_TEAM_RANDOM )
{
client_print( client, print_chat, "[AMXX] %L", client, "CANT_JOIN_CT" );
engclient_cmd(client, "chooseteam");
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}
public cmdJoinTeam( client )
{
new arg[ 4 ];
read_argv( 1, arg, sizeof( arg ) - 1 );
new team = str_to_num( arg );
if( FreeKiller[ client ] && get_pcvar_num( cvar_Enabled ) )
{
if( team == FM_TEAM_CT
|| team == FM_TEAM_RANDOM )
{
client_print( client, print_chat, "[AMXX] %L", client, "CANT_JOIN_CT" );
engclient_cmd(client, "chooseteam");
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}
public cmdShowList( client )
{
if( ! get_pcvar_num( cvar_Enabled ) )
return;
new Array:aData;
new Total = GetPlayerStats( aData );
new count = 0;
new eData[ ArrayData ];
console_print( client, "***********************************************************" );
console_print( client, "%L", client, "LIST_START_MSG" );
console_print( client, "" );
for( new i = 0; i < Total; i++ )
{
ArrayGetArray( aData, i, eData );
if(eData[ FreeKill ] != 0 )
{
count++;
console_print (client, "%L", client, "LIST_INFO", eData[ Name ], eData[ SteamID ], eData[ Reason ] );
}
}
if( ! count)
console_print( client, "%L", client, "LIST_EMPTY" );
console_print( client, "" );
console_print( client, "***********************************************************" );
client_print( client, print_chat, "[AMXX] %L", client, "SEND_TO_CONSOLE" );
}
public cmdShowStats( client )
{
if( ! get_pcvar_num( cvar_Enabled ) )
return;
client_print( client, print_chat, "[AMXX] %L %L", client, "CLIENT_STATUS", client, FreeKiller[ client ] ? "BANNED" : "NOT_BANNED" );
}
public cmdShowDataManagement( client )
{
if( access( client, ADMIN_BAN ) && get_pcvar_num( cvar_Enabled ) )
{
new Array:aData;
new eData[ ArrayData ];
static title[ 128 ], item[ 128 ];
new Total = GetPlayerStats( aData );
if( ! Total )
{
client_print( client, print_chat, "[AMXX] %L", client, "MENU_NO_DATA" );
return;
}
formatex( title, sizeof( title ) - 1, "\y%L", client, "MENU_TITLE", Total );
new menu = menu_create( title, "caseDataManagement" );
for( new i = 0; i < Total; i++ )
{
ArrayGetArray( aData, i, eData );
formatex( item, sizeof( item ) - 1, "%s\r - \d[%L\d]", eData[ Name ], client, eData[ FreeKill ] ? "MENU_BANNED" : "MENU_FREEZE" );
menu_additem( menu, item, eData[ SteamID ] );
}
menu_setprop( menu, MPROP_EXITNAME, "\yClose" );
menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
menu_display( client, menu, 0 );
}
}
public caseDataManagement( client, menu, item )
{
if( item == MENU_EXIT || ! get_pcvar_num( cvar_Enabled ) )
{
menu_destroy( menu );
return;
}
static _access, key[ 32 ], callback;
menu_item_getinfo( menu, item, _access, key, sizeof( key ) - 1, _, _, callback );
menu_destroy( menu );
PlayerData( client, key );
}
public PlayerData( client, key[ ] )
{
new data[ 64 ], szFreekiller[ 16 ], name[ 32 ], szReason[ 35 ];
fvault_get_data( g_szVaultName, key, data, sizeof( data ) - 1 );
parse( data, szFreekiller, sizeof( szFreekiller ) - 1, name, sizeof( name ) - 1, szReason, sizeof( szReason ) - 1 );
static title[ 128 ], item[ 128 ];
formatex( title, sizeof( title ) - 1, "\y%L", client, "MENU_TITLE_2", name, key, szReason );
new menu = menu_create( title, "casePlayerData" );
formatex( item, sizeof( item ) - 1, "%L %L^n", client, "MENU_ITEM_1", LANG_SERVER, str_to_num( szFreekiller ) ? "BANNED" : "NOT_BANNED" );
menu_additem( menu, item, key );
formatex( item, sizeof( item ) - 1, "\y%L", client, "MENU_ITEM_2", key, szReason );
menu_additem( menu, item, key );
menu_setprop( menu, MPROP_EXITNAME, "\yBack" );
menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
menu_display( client, menu, 0 );
}
public casePlayerData( client, menu, item )
{
if( item == MENU_EXIT || ! get_pcvar_num( cvar_Enabled ) )
{
menu_destroy( menu );
cmdShowDataManagement( client );
return;
}
static _access, key[ 32 ], callback;
menu_item_getinfo( menu, item, _access, key, sizeof( key ) - 1, _, _, callback );
menu_destroy( menu );
new find = find_player( "c", key );
switch( item )
{
case 0:
{
new data[ 64 ], szFreekiller[ 13 ], name[ 32 ], szReason[ 35 ];
fvault_get_data( g_szVaultName, key, data, sizeof( data ) - 1 );
parse( data, szFreekiller, sizeof( szFreekiller ) - 1, name, sizeof( name ) - 1, szReason, sizeof( szReason ) - 1 );
formatex( data, sizeof( data ) - 1, "^"%d^" ^"%s^" ^"%s^"", ! str_to_num( szFreekiller ), name, szReason );
fvault_set_data( g_szVaultName, key, data );
PlayerData( client, key );
}
case 1:
{
fvault_remove_key( g_szVaultName, key );
cmdShowDataManagement( client );
}
}
if( is_user_connected( find ) )
{
Load( find, false, false );
if( get_user_team( find ) == FM_TEAM_CT && FreeKiller[ find ] )
MoveFromCT( find );
}
return;
}
public client_putinserver( client )
{
Load( client, true, ForwardFreeKiller_PutInServer );
}
public client_authorized( client )
{
Load( client, true, ForwardFreeKiller_Authorized );
}
public client_disconnect( client )
{
if( FreeKiller[ client ] && get_pcvar_num( cvar_Enabled ) )
{
ExecuteForward( ForwardFreeKiller_Disconnect, ForwardReturn, client );
}
}
MoveFromCT( client )
{
if( ! is_user_connected( client ) )
return;
new alive = false;
if( is_user_alive( client ) )
alive = true;
fm_set_user_team( client, FM_TEAM_T );
if( alive )
fm_DispatchSpawn( client );
ExecuteForward( ForwardFreeKiller_JoinCT, ForwardReturn, client );
client_print( client, print_chat, "[AMXX] %L", client, "BANNED_MSG" );
}
GetPlayerStats( &Array:aData )
{
aData = ArrayCreate( ArrayData );
new Total;
new eData[ ArrayData ];
new vault_total = fvault_size(g_szVaultName);
new szData[128], szFreeKiller[16];
for( new i = 0; i < vault_total; i++ )
{
fvault_get_keyname(g_szVaultName, i, eData[ SteamID ], sizeof( eData[ SteamID ] ) - 1);
fvault_get_data(g_szVaultName, eData[ SteamID ], szData, sizeof(szData) - 1);
parse(szData, szFreeKiller, charsmax(szFreeKiller), eData[ Name ], charsmax( eData[ Name ] ), eData[ Reason ], charsmax( eData[ Reason ] ) );
eData[ FreeKill ] = str_to_num( szFreeKiller );
Total++;
ArrayPushArray(aData, eData);
}
return Total;
}
Load( client, join_forward, forward_type )
{
if( ! is_user_bot( client ) && ! is_user_hltv( client ) && get_pcvar_num( cvar_Enabled ) )
{
new data[ 64 ], name[ 32 ], authid[ 35 ], szFreeKiller[ 16 ];
get_user_authid( client, authid, sizeof( authid ) - 1 );
if( fvault_get_data( g_szVaultName, authid, data, sizeof( data ) - 1 ) )
{
strbreak( data, szFreeKiller, charsmax( szFreeKiller ), name, charsmax( name ) );
FreeKiller[ client ] = str_to_num( szFreeKiller );
if( FreeKiller[ client ] && join_forward )
{
ExecuteForward( forward_type, ForwardReturn, client );
}
return str_to_num( szFreeKiller );
}
else
{
FreeKiller[ client ] = false;
}
}
return 0;
}
stock fm_set_user_team( client, team )
{
set_pdata_int( client, 114, team );
static const TeamInfo[ Teams ][ ] =
{
"UNASSIGNED",
"TERRORIST",
"CT",
"SPECTATOR"
};
dllfunc(DLLFunc_ClientUserInfoChanged, client, engfunc(EngFunc_GetInfoKeyBuffer, client));
message_begin( MSG_ALL, get_user_msgid( "TeamInfo" ) ) ;
write_byte( client );
write_string( TeamInfo[ team ] );
message_end( );
}
stock fm_DispatchSpawn( client ) /* Fixed One */
{
if ( !is_user_connected( client ) || !pev_valid( client )
|| get_user_team( client ) == FM_TEAM_UNASSIGNED )
{
return 0;
}
user_silentkill( client );
set_pev( client, pev_deadflag, DEAD_RESPAWNABLE );
dllfunc( DLLFunc_Think, client );
dllfunc( DLLFunc_Spawn, client );
return 1;
}