View Single Post
Bugsy
AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
Old 04-23-2018 , 21:10   Re: [REQ] Detect no kill and punish ( Players which is not killing the enemies)
Reply With Quote #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 }
}; 
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_LastEyeContactMAX_PLAYERS ][ MAX_PLAYERS ];

new const 
DistanceDuration[][ DistanceFactor ] = 
{
    { 
2000.0 99999.0 18 },
    { 
1000.0 1999.9 15 },
    { 
500.0 999.9 10 },
    { 
0.0 499.9 }
};
        
const 
Ignore_Weapons = ( ( << CSW_KNIFE ) | ( << CSW_FLASHBANG ) | ( << CSW_SMOKEGRENADE ) | ( << CSW_C4 ) );

public 
plugin_init() 
{
    
register_plugin"No-Kill Punishment" Version "bugsy" );
    
    
register_event"DeathMsg" "EventDeathMsg" "a" );
    
register_logevent"RoundEnd" "1=Round_End" );

    const 
DO_NOT_RELOAD = ( ( << ) | ( << CSW_KNIFE ) | ( << CSW_C4 ) | ( << CSW_HEGRENADE ) | ( << CSW_FLASHBANG ) | ( << CSW_SMOKEGRENADE ) );
    new 
szWeaponName20 ];
    
    for ( new 
CSW_P228 <= CSW_P90 i++ )
    {
        if( !( 
DO_NOT_RELOAD & ( << i  ) ) )
        {
            
get_weaponnameszWeaponName charsmaxszWeaponName ) );
            
RegisterHamHam_Weapon_Reload szWeaponName "HamWeaponReload" true );
        }
    }
    
    
CreateEntity();
}

public 
client_disconnectid )
{
    
ResetPlayerid );
}

public 
EventDeathMsg()
{
    
ResetPlayerread_data) );
}

public 
RoundEnd()
{
    new 
iPlayers32 ] , iNum;
    
    
get_playersiPlayers iNum "a" );
    
    for ( new 
iNum i++ )
    {
        
ResetPlayeriPlayers] );
    }
}

public 
HamWeaponReload( const iWeapon )
{
    if ( 
get_pdata_intiWeapon m_fInReload XO_Weapon ) )
    {
        
ResetPlayerpeviWeapon pev_owner ) );
    }
}


public 
ViewEntity_ThinkiEntity )
{
    new 
iPlayers32 ] , iNum Float:fOrigin] , Float:fEnemyOrigin] , iPlayer iEnemyszName32 ] , szEnemyName32 ] , iPosiThresholdSeconds iSysTime;
    
    
get_playersiPlayers iNum "a" );
    
    if ( 
iNum )
    {
        for ( new 
iNum i++ )
        {
            
iPlayer iPlayers];
            
            for ( new 
iNum p++ )
            {
                
iEnemy iPlayers];
                
                
#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_botiEnemy ) && ( get_user_weaponiEnemy ) != CSW_GLOCK18 ) )
                {
                    
strip_user_weaponsiEnemy );
                    
give_itemiEnemy "weapon_glock" );
                    
client_cmdiEnemy "slot2;+attack;wait;-attack" );
                }
                
#endif
                
                
if ( ( iPlayer != iEnemy ) && ( cs_get_user_teamiPlayer ) != cs_get_user_teamiEnemy ) ) )
                {
                    
entity_get_vectoriEnemy EV_VEC_origin fEnemyOrigin );
                    
                    if ( !( 
Ignore_Weapons & ( << get_user_weaponiPlayer ) ) ) && is_in_viewconeiPlayer fEnemyOrigin ) )
                    {
                        
entity_get_vectoriPlayer EV_VEC_origin fOrigin );
                
                        if ( 
IsInLineOfSightfOrigin fEnemyOrigin ) )
                        {
                            if ( !
g_LastEyeContactiPlayer ][ iEnemy ] )
                            {
                                
g_LastEyeContactiPlayer ][ iEnemy ] = get_systime();
                            }
                            
#if defined TESTING
                            
else
                            {
                                
get_user_nameiPlayer szName charsmaxszName ) );
                                
get_user_nameiEnemy szEnemyName charsmaxszEnemyName ) );
                                
client_printprint_chat "%s CAN SEE %s - %d SECONDS" szName szEnemyName , ( get_systime() - g_LastEyeContactiPlayer ][ iEnemy ] ) );
                            }
                            
#endif
                        
}
                        
#if defined TESTING
                        
else
                        {
                            if ( 
g_LastEyeContactiPlayer ][ iEnemy ] )
                            {
                                
get_user_nameiPlayer szName charsmaxszName ) );
                                
get_user_nameiEnemy szEnemyName charsmaxszEnemyName ) );
                                
client_printprint_chat "%s NO LONGER LOOKING AT %s" szName szEnemyName );
                                
g_LastEyeContactiPlayer ][ iEnemy ] = 0;
                            }
                        }
                        
#endif
                    
}
                    else
                    {
                        
#if defined TESTING
                        
if ( g_LastEyeContactiPlayer ][ iEnemy ] )
                        {
                            
get_user_nameiPlayer szName charsmaxszName ) );
                            
get_user_nameiEnemy szEnemyName charsmaxszEnemyName ) );
                            
client_printiPlayer print_chat "%s NO LONGER LOOKING AT %s" szName szEnemyName );
                        }
                        
#endif
                        
                        
g_LastEyeContactiPlayer ][ iEnemy ] = 0;
                    }
                }
            }
        }
        
        
iSysTime get_systime();
        
        
iThresholdSeconds GetDistanceDurationget_distance_ffOrigin fEnemyOrigin ) );
        
        for ( new 
iNum i++ )
        {
            
iPlayer iPlayers];
            
iPos 0;
            
            for ( new 
iNum p++ )
            {
                
iEnemy iPlayers];
                
                
entity_get_vectoriPlayer EV_VEC_origin fOrigin );
                
entity_get_vectoriEnemy EV_VEC_origin fEnemyOrigin );
                
                
iThresholdSeconds GetDistanceDurationget_distance_ffOrigin fEnemyOrigin ) );
                
                if ( ( 
iPlayer != iEnemy ) && g_LastEyeContactiPlayer ][ iEnemy ] && ( ( iSysTime g_LastEyeContactiPlayer ][ iEnemy ] ) >= iThresholdSeconds ) )
                {
                    
iPos += get_user_nameiEnemy szEnemyNameiPos ] , charsmaxszEnemyName ) - iPos );
                    
iPos += copyszEnemyNameiPos ] , charsmaxszEnemyName ) - iPos ", " );
                    
                    
g_LastEyeContactiPlayer ][ iEnemy ] = 0;
                }
            }
            
            if ( 
iPos )
            {
                
get_user_nameiPlayer szName charsmaxszName ) );
                
user_killiPlayer );
                
                
szEnemyNameiPos ] = EOS;
                
client_printprint_chat "* Killed %s for No-Killing [ %s ] !" szName szEnemyName );
            }
        }
    }
    
    
entity_set_floatg_ThinkingEntity EV_FL_nextthink get_gametime() + 1.0 );
}

bool:IsInLineOfSightFloat:fOrigin1] , Float:fOrigin2] )
{
    new 
iTrace Float:fFraction;
    
    
engfuncEngFunc_TraceLine fOrigin1 fOrigin2 IGNORE_MONSTERS iTrace );
    
get_tr2iTrace TR_flFraction fFraction );
    
    return 
bool:( fFraction == 1.0 );
}

ResetPlayerid )
{
    
arraysetg_LastEyeContactid ] , sizeofg_LastEyeContact[] ) );
}

GetDistanceDurationFloat:fDistance )
{
    new 
iDuration 10;
    
    for ( new 
sizeofDistanceDuration ) ; i++ )
    {
        if ( 
DistanceDuration][ DistanceStart ] <= fDistance <= DistanceDuration][ DistanceEnd ] )
        {
            
iDuration DistanceDuration][ Duration ];
            break;
        }
    }
    
    return 
iDuration;
}

CreateEntity()
{
    
g_ThinkingEntity create_entity"info_target" );
    
entity_set_stringg_ThinkingEntity EV_SZ_classname "view_entity" );
    
register_think"view_entity" "ViewEntity_Think" );
    
entity_set_floatg_ThinkingEntity EV_FL_nextthink get_gametime() + 1.0 );

__________________

Last edited by Bugsy; 04-24-2018 at 17:57.
Bugsy is offline