[FilterScript] Anti-2shot
#1

hey,
This will effectively freeze any player that doesn't shoot the whole sawnoff clip. No silly timers or simple methods.
The player that gets punished will get froze, in milliseconds, whatever FREEZE_TIME is set to; however, the player will still take damage.

Needs y_bit.inc from YSI.

pawn Код:
#include <a_samp>
#include <YSI/y_bit.inc>

#define FREEZE_TIME       (650) // The time a player will get froze after evading reload and switching back.
#define PUNISH_THRESOLD  (2500) // If the player doesn't switch back the weapon in <PUNISH_THRESOLD> ms, ignore it.
#define iPlayer  playerid

#pragma tabsize 0

new
    BitArray:g_abIsSawnoffClipUsed< MAX_PLAYERS >,
    BitArray:g_abThisBitchDidntReload< MAX_PLAYERS >,
             g_iReloadEvadeTime[ MAX_PLAYERS ],
             g_iSawnoffAmmo[ MAX_PLAYERS ],
             g_cFiredShots[ MAX_PLAYERS char ],
             g_cPreviousWeapon[ MAX_PLAYERS char ]
;

public OnPlayerSpawn( iPlayer )
{
    g_iSawnoffAmmo[ iPlayer ] = -1;
    g_cFiredShots{ iPlayer } = 0;
    g_cPreviousWeapon{ iPlayer } = 0;
   
    Bit_Vet( g_abIsSawnoffClipUsed, iPlayer );
    Bit_Vet( g_abThisBitchDidntReload, iPlayer );
}

public OnPlayerUpdate( iPlayer )
{
    static
        s_iState,
        s_iSpecialAction
    ;
   
    s_iState = GetPlayerState( iPlayer );
    s_iSpecialAction = GetPlayerSpecialAction( iPlayer );
   
    if ( s_iState == PLAYER_STATE_ONFOOT && ( s_iSpecialAction == SPECIAL_ACTION_NONE || s_iSpecialAction == SPECIAL_ACTION_DUCK ) )
    {
        static
            s_iWeapon,
            s_iAmmo
        ;
       
        s_iWeapon = GetPlayerWeapon( iPlayer );
        s_iAmmo = GetPlayerAmmo( iPlayer );
       
        if ( g_cPreviousWeapon{ iPlayer } != s_iWeapon )
        {
            if ( g_cPreviousWeapon{ iPlayer } == WEAPON_SAWEDOFF )
            {
                if ( Bit_Get( g_abIsSawnoffClipUsed, iPlayer ) )
                {
                    static
                        s_iWeaponState
                    ;
                   
                    s_iWeaponState = GetPlayerWeaponState( iPlayer );
                   
                    if ( ( s_iWeaponState == WEAPONSTATE_MORE_BULLETS || s_iWeaponState == WEAPONSTATE_LAST_BULLET ) && g_cFiredShots{ iPlayer } != 4 )
                    {
                        Bit_Let( g_abThisBitchDidntReload, iPlayer );
                       
                        g_iReloadEvadeTime[ iPlayer ] = GetTickCount( );
                    }
                }
               
                g_cFiredShots{ iPlayer } = 0;
            }
            else if ( s_iWeapon == WEAPON_SAWEDOFF )
            {
                if ( Bit_Get( g_abThisBitchDidntReload, iPlayer ) )
                {
                    if ( GetTickCount( ) - g_iReloadEvadeTime[ iPlayer ] < PUNISH_THRESOLD )
                    {
                        new
                            Float:fVX,
                            Float:fVY,
                            Float:fVZ
                        ;
                       
                        GetPlayerVelocity( iPlayer, fVX, fVY, fVZ );
                       
                        if ( floatabs( fVZ ) < 0.15 )
                        {
                            ClearAnimations( iPlayer, 1 );
                           
                            ApplyAnimation( playerid, "PED", "XPRESSscratch", 0.0, 1, 0, 0, 0, FREEZE_TIME, 1 );
                        }
                    }
                   
                    Bit_Vet( g_abThisBitchDidntReload, iPlayer );
                }
            }
           
            g_cPreviousWeapon{ iPlayer } = s_iWeapon;
        }
       
        if ( s_iWeapon == WEAPON_SAWEDOFF )
        {
            if ( g_iSawnoffAmmo[ iPlayer ] == -1 )
                g_iSawnoffAmmo[ iPlayer ] = GetPlayerAmmo( iPlayer );
            else
            {
                if ( GetPlayerWeaponState( iPlayer ) == WEAPONSTATE_RELOADING )
                {
                    if ( Bit_Get( g_abIsSawnoffClipUsed, iPlayer ) )
                        Bit_Vet( g_abIsSawnoffClipUsed, iPlayer );
                }
                else
                {
                    if ( g_iSawnoffAmmo[ iPlayer ] != s_iAmmo )
                    {
                        if ( s_iAmmo < g_iSawnoffAmmo[ iPlayer ] )
                        {
                            Bit_Let( g_abIsSawnoffClipUsed, iPlayer );
                           
                            g_cFiredShots{ iPlayer } += g_iSawnoffAmmo[ iPlayer ] - s_iAmmo;
                        }
                        else
                        {
                            g_cFiredShots{ iPlayer } = 0;
                           
                            Bit_Vet( g_abIsSawnoffClipUsed, iPlayer );
                        }
                       
                        g_iSawnoffAmmo[ iPlayer ] = s_iAmmo;
                    }
                }
            }
        }
        else if ( g_iSawnoffAmmo[ iPlayer ] != -1 || Bit_Get( g_abIsSawnoffClipUsed, iPlayer ) )
        {
            g_iSawnoffAmmo[ iPlayer ] = -1;
           
            Bit_Vet( g_abIsSawnoffClipUsed, iPlayer );
           
            g_cFiredShots{ iPlayer } = 0;
        }
    }
    else if ( g_iSawnoffAmmo[ iPlayer ] != -1 || Bit_Get( g_abIsSawnoffClipUsed, iPlayer ) )
    {
        g_iSawnoffAmmo[ iPlayer ] = -1;
       
        Bit_Vet( g_abIsSawnoffClipUsed, iPlayer );
       
        g_cFiredShots{ iPlayer } = 0;
    }
   
    return 1;
}
Reply
#2

Uhh yeah, I completely understood that code .

Might try and use this hehe
Reply
#3

Quote:
Originally Posted by Hiddos
Посмотреть сообщение
Uhh yeah, I completely understood that code .

Might try and use this hehe
Please do so! I've made some simple tests to see if players are trying to abuse the animation being set.
Reply
#4

Great job.
Reply
#5

Good job Slice .

You're a nice scripter!
Reply
#6

Nice idea, simple implementation.
This is another great example of a well-written piece of code, short but with a great function.
I like your script, keep on
Reply
#7

already tested it its good
Reply
#8

I can't load YSI inc.
Reply
#9

Quote:
Originally Posted by MyLife
Посмотреть сообщение
I can't load YSI inc.
Download YSI and put it in your "include" folder.

http://www.y-less.com/YSI/YSI_1.0.zip
Reply
#10

Quote:
Originally Posted by g_aSlice
Посмотреть сообщение
Download YSI and put it in your "include" folder.

http://www.y-less.com/YSI/YSI_1.0.zip
Thank you.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)