AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
|
04-23-2018
, 21:10
Re: [REQ] Detect no kill and punish ( Players which is not killing the enemies)
|
#46
|
Added:
- Reset seconds counter for reload and round end
- Different threshold seconds based on distance:
PHP Code:
new const DistanceDuration[][ DistanceFactor ] = { { 2000.0 , 99999.0 , 18 }, { 1000.0 , 1999.9 , 15 }, { 500.0 , 999.9 , 10 }, { 0.0 , 499.9 , 5 } };
Untested
PHP Code:
#include <amxmodx> #include <cstrike> #include <engine> #include <fakemeta> #include <hamsandwich> #include <fun>
new const Version[] = "0.3";
#define TESTING
#define MAX_PLAYERS 32
const m_fInReload = 54; const XO_Weapon = 4;
enum DistanceFactor { Float:DistanceStart, Float:DistanceEnd, Duration }
new g_ThinkingEntity; new g_LastEyeContact[ MAX_PLAYERS + 1 ][ MAX_PLAYERS + 1 ];
new const DistanceDuration[][ DistanceFactor ] = { { 2000.0 , 99999.0 , 18 }, { 1000.0 , 1999.9 , 15 }, { 500.0 , 999.9 , 10 }, { 0.0 , 499.9 , 5 } }; const Ignore_Weapons = ( ( 1 << CSW_KNIFE ) | ( 1 << CSW_FLASHBANG ) | ( 1 << CSW_SMOKEGRENADE ) | ( 1 << CSW_C4 ) );
public plugin_init() { register_plugin( "No-Kill Punishment" , Version , "bugsy" ); register_event( "DeathMsg" , "EventDeathMsg" , "a" ); register_logevent( "RoundEnd" , 2 , "1=Round_End" );
const DO_NOT_RELOAD = ( ( 1 << 2 ) | ( 1 << CSW_KNIFE ) | ( 1 << CSW_C4 ) | ( 1 << CSW_HEGRENADE ) | ( 1 << CSW_FLASHBANG ) | ( 1 << CSW_SMOKEGRENADE ) ); new szWeaponName[ 20 ]; for ( new i = CSW_P228 ; i <= CSW_P90 ; i++ ) { if( !( DO_NOT_RELOAD & ( 1 << i ) ) ) { get_weaponname( i , szWeaponName , charsmax( szWeaponName ) ); RegisterHam( Ham_Weapon_Reload , szWeaponName , "HamWeaponReload" , true ); } } CreateEntity(); }
public client_disconnect( id ) { ResetPlayer( id ); }
public EventDeathMsg() { ResetPlayer( read_data( 2 ) ); }
public RoundEnd() { new iPlayers[ 32 ] , iNum; get_players( iPlayers , iNum , "a" ); for ( new i = 0 ; i < iNum ; i++ ) { ResetPlayer( iPlayers[ i ] ); } }
public HamWeaponReload( const iWeapon ) { if ( get_pdata_int( iWeapon , m_fInReload , XO_Weapon ) ) { ResetPlayer( pev( iWeapon , pev_owner ) ); } }
public ViewEntity_Think( iEntity ) { new iPlayers[ 32 ] , iNum , Float:fOrigin[ 3 ] , Float:fEnemyOrigin[ 3 ] , iPlayer , iEnemy, szName[ 32 ] , szEnemyName[ 32 * 6 ] , iPos, iThresholdSeconds , iSysTime; get_players( iPlayers , iNum , "a" ); if ( iNum ) { for ( new i = 0 ; i < iNum ; i++ ) { iPlayer = iPlayers[ i ]; for ( new p = 0 ; p < iNum ; p++ ) { iEnemy = iPlayers[ p ]; #if defined TESTING //While testing this will force bots on the opposite team to only have and hold the glock. //If this is made an ignore weapon then you must change this to a different weapon. if ( is_user_bot( iEnemy ) && ( get_user_weapon( iEnemy ) != CSW_GLOCK18 ) ) { strip_user_weapons( iEnemy ); give_item( iEnemy , "weapon_glock" ); client_cmd( iEnemy , "slot2;+attack;wait;-attack" ); } #endif if ( ( iPlayer != iEnemy ) && ( cs_get_user_team( iPlayer ) != cs_get_user_team( iEnemy ) ) ) { entity_get_vector( iEnemy , EV_VEC_origin , fEnemyOrigin ); if ( !( Ignore_Weapons & ( 1 << get_user_weapon( iPlayer ) ) ) && is_in_viewcone( iPlayer , fEnemyOrigin ) ) { entity_get_vector( iPlayer , EV_VEC_origin , fOrigin ); if ( IsInLineOfSight( fOrigin , fEnemyOrigin ) ) { if ( !g_LastEyeContact[ iPlayer ][ iEnemy ] ) { g_LastEyeContact[ iPlayer ][ iEnemy ] = get_systime(); } #if defined TESTING else { get_user_name( iPlayer , szName , charsmax( szName ) ); get_user_name( iEnemy , szEnemyName , charsmax( szEnemyName ) ); client_print( 0 , print_chat , "%s CAN SEE %s - %d SECONDS" , szName , szEnemyName , ( get_systime() - g_LastEyeContact[ iPlayer ][ iEnemy ] ) ); } #endif } #if defined TESTING else { if ( g_LastEyeContact[ iPlayer ][ iEnemy ] ) { get_user_name( iPlayer , szName , charsmax( szName ) ); get_user_name( iEnemy , szEnemyName , charsmax( szEnemyName ) ); client_print( 0 , print_chat , "%s NO LONGER LOOKING AT %s" , szName , szEnemyName ); g_LastEyeContact[ iPlayer ][ iEnemy ] = 0; } } #endif } else { #if defined TESTING if ( g_LastEyeContact[ iPlayer ][ iEnemy ] ) { get_user_name( iPlayer , szName , charsmax( szName ) ); get_user_name( iEnemy , szEnemyName , charsmax( szEnemyName ) ); client_print( iPlayer , print_chat , "%s NO LONGER LOOKING AT %s" , szName , szEnemyName ); } #endif g_LastEyeContact[ iPlayer ][ iEnemy ] = 0; } } } } iSysTime = get_systime(); iThresholdSeconds = GetDistanceDuration( get_distance_f( fOrigin , fEnemyOrigin ) ); for ( new i = 0 ; i < iNum ; i++ ) { iPlayer = iPlayers[ i ]; iPos = 0; for ( new p = 0 ; p < iNum ; p++ ) { iEnemy = iPlayers[ p ]; entity_get_vector( iPlayer , EV_VEC_origin , fOrigin ); entity_get_vector( iEnemy , EV_VEC_origin , fEnemyOrigin ); iThresholdSeconds = GetDistanceDuration( get_distance_f( fOrigin , fEnemyOrigin ) ); if ( ( iPlayer != iEnemy ) && g_LastEyeContact[ iPlayer ][ iEnemy ] && ( ( iSysTime - g_LastEyeContact[ iPlayer ][ iEnemy ] ) >= iThresholdSeconds ) ) { iPos += get_user_name( iEnemy , szEnemyName[ iPos ] , charsmax( szEnemyName ) - iPos ); iPos += copy( szEnemyName[ iPos ] , charsmax( szEnemyName ) - iPos , ", " ); g_LastEyeContact[ iPlayer ][ iEnemy ] = 0; } } if ( iPos ) { get_user_name( iPlayer , szName , charsmax( szName ) ); user_kill( iPlayer ); szEnemyName[ iPos - 2 ] = EOS; client_print( 0 , print_chat , "* Killed %s for No-Killing [ %s ] !" , szName , szEnemyName ); } } } entity_set_float( g_ThinkingEntity , EV_FL_nextthink , get_gametime() + 1.0 ); }
bool:IsInLineOfSight( Float:fOrigin1[ 3 ] , Float:fOrigin2[ 3 ] ) { new iTrace , Float:fFraction; engfunc( EngFunc_TraceLine , fOrigin1 , fOrigin2 , IGNORE_MONSTERS , 0 , iTrace ); get_tr2( iTrace , TR_flFraction , fFraction ); return bool:( fFraction == 1.0 ); }
ResetPlayer( id ) { arrayset( g_LastEyeContact[ id ] , 0 , sizeof( g_LastEyeContact[] ) ); }
GetDistanceDuration( Float:fDistance ) { new iDuration = 10; for ( new i = 0 ; i < sizeof( DistanceDuration ) ; i++ ) { if ( DistanceDuration[ i ][ DistanceStart ] <= fDistance <= DistanceDuration[ i ][ DistanceEnd ] ) { iDuration = DistanceDuration[ i ][ Duration ]; break; } } return iDuration; }
CreateEntity() { g_ThinkingEntity = create_entity( "info_target" ); entity_set_string( g_ThinkingEntity , EV_SZ_classname , "view_entity" ); register_think( "view_entity" , "ViewEntity_Think" ); entity_set_float( g_ThinkingEntity , EV_FL_nextthink , get_gametime() + 1.0 ); }
__________________
Last edited by Bugsy; 04-24-2018 at 17:57.
|
|