|
AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
|

04-28-2018
, 20:44
Re: [REQ] Detect no kill and punish ( Players which is not killing the enemies)
|
#2
|
Quote:
Originally Posted by Old.School
Bug Report : False Detection If The Player Shoot Than Run Away..
|
Need more info. If he LOOKS away then the counter resets. But if he runs away, backwards, looking at the enemy then he is technically still no shooting.
The below has reset counter on primary attack. Untested
PHP Code:
#include <amxmodx> #include <cstrike> #include <engine> #include <fakemeta> #include <hamsandwich> #include <fun>
new const Version[] = "0.4";
#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 ) ); const Do_Not_Reload = ( ( 1 << CSW_KNIFE ) | ( 1 << CSW_C4 ) | ( 1 << CSW_HEGRENADE ) | ( 1 << CSW_FLASHBANG ) | ( 1 << CSW_SMOKEGRENADE ) );
public plugin_init() { register_plugin( "No-Kill Punishment" , Version , "bugsy" ); register_event( "DeathMsg" , "EventDeathMsg" , "a" ); register_logevent( "RoundEnd" , 2 , "1=Round_End" );
for ( new i = CSW_P228 , szWeaponName[ 20 ] ; i <= CSW_P90 ; i++ ) { if ( i != 2 ) { get_weaponname( i , szWeaponName , charsmax( szWeaponName ) ); RegisterHam( Ham_Weapon_PrimaryAttack , szWeaponName , "HamPrimaryAttack" ); if( !( Do_Not_Reload & ( 1 << i ) ) ) { 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 HamPrimaryAttack( const iWeapon ) { 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 ]; } } 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-28-2018 at 20:48.
|
|