sfcnr/gamemodes/irresistible/anticheat/rapidfire.pwn

70 lines
1.7 KiB
Plaintext

/*
* Irresistible Gaming (c) 2018
* Developed by Lorenc
* Module: anticheat\rapidfire.pwn
* Purpose: rapid fire detection as well as invalid bullet filtering
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Variables ** */
static stock
p_RapidFireTickCount [ MAX_PLAYERS ],
p_RapidFireShots [ MAX_PLAYERS char ]
;
/* ** Hooks ** */
hook OnPlayerDisconnect( playerid, reason ) {
if ( 0 <= playerid < MAX_PLAYERS ) {
p_RapidFireShots{ playerid } = 0;
}
return 1;
}
hook OnPlayerWeaponShot( playerid, weaponid, hittype, hitid, Float: fX, Float: fY, Float: fZ )
{
new
keys, ud, lr;
GetPlayerKeys( playerid, keys, ud, lr );
// Simple. But effective. Anti-Shooting Hacks.
if ( ! ( keys & KEY_FIRE ) ) {
return Y_HOOKS_BREAK_RETURN_0;
}
// Invalid weapon id
if ( ! ( 22 <= weaponid <= 34 ) && weaponid != 38 ) {
return Y_HOOKS_BREAK_RETURN_0;
}
// Invalid hit (very far offset from player)
if ( hittype == BULLET_HIT_TYPE_PLAYER && ( ( fX >= 10.0 || fX <= -10.0 ) || ( fY >= 10.0 || fY <= -10.0 ) || ( fZ >= 10.0 || fZ <= -10.0 ) ) ) {
return Y_HOOKS_BREAK_RETURN_0;
}
// Anti-Rapid Fire
if ( ! p_RapidFireTickCount[ playerid ] ) p_RapidFireTickCount[ playerid ] = GetTickCount( );
else
{
new
iInterval = GetTickCount( ) - p_RapidFireTickCount[ playerid ];
if ( ( iInterval <= 35 && ( weaponid != 38 && weaponid != 28 && weaponid != 32 ) ) || ( iInterval <= 370 && ( weaponid == 34 || weaponid == 33 ) ) )
{
if ( p_RapidFireShots{ playerid } ++ >= 5 ) {
CallLocalFunction( "OnPlayerCheatDetected", "ddd", playerid, CHEAT_TYPE_RAPIDFIRE, 0 );
return Y_HOOKS_BREAK_RETURN_0;
}
}
else
{
p_RapidFireShots{ playerid } = 0;
}
p_RapidFireTickCount[ playerid ] = GetTickCount( );
}
return 1;
}