sfcnr/pawno/include/anticheat/autocbug.inc
2016-12-21 02:27:43 +11:00

84 lines
2.9 KiB
PHP

/*
PROJECT <> SA:MP Anticheat Plug-in
LICENSE <> See LICENSE in the top level directory.
AUTHOR(S) <> Lorenc_ (zeelorenc@hotmail.com)
PURPOSE <> Providing datastructures for the internal SA:MP Server.
Copyright (C) 2014 SA:MP Anticheat Plug-in.
The Project is available on https://github.com/myudev/SAMPAC
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include < anticheat\global >
#include < anticheat\player >
// Definitions (Global)
#define AUTOCBUG_TICKS_DEAGLE ( 500 ) // prev 600
#define AUTOCBUG_TICKS_SHOTGUN ( 850 )
#define AUTOCBUG_TICKS_COUNTRY ( 750 )
#define AUTOCBUG_TICKS_SNIPER ( 750 )
// Functions (Player)
stock vAutoCbugKeyState( playerid, newkeys, oldkeys )
{
if( !p_cbugKeyTicks[ playerid ] )
p_cbugKeyTicks[ playerid ] = GetTickCount( ), p_cbugWarns{ playerid } = 0;
if( ( ( ( newkeys & ( KEY_CROUCH ) ) == ( KEY_CROUCH ) ) || ( ( oldkeys & ( KEY_CROUCH ) ) == ( KEY_CROUCH ) ) ) )
p_cbugKeyTicks[ playerid ] = GetTickCount( ), p_cbugWarns{ playerid } = 0;
}
stock vCheckForAutoCbug( playerid, weaponid )
{
// Anti-Rapid Fire
if( !p_cbugFireTicks[ playerid ] ) p_cbugFireTicks[ playerid ] = GetTickCount( );
else
{
new
iTicks = GetTickCount( ),
iInterval = iTicks - p_cbugFireTicks[ playerid ],
iKeyInterval = iTicks - p_cbugKeyTicks[ playerid ],
iHardInterval = 1000
;
if( weaponid == WEAPON_DEAGLE || weaponid == WEAPON_SHOTGUN || weaponid == WEAPON_RIFLE || weaponid == WEAPON_SNIPER )
{
new
iCompare = iKeyInterval - iInterval,
Float: fOwnPacketLoss = NetStats_PacketLossPercent( playerid )
;
switch( weaponid )
{
case WEAPON_DEAGLE: iHardInterval = AUTOCBUG_TICKS_DEAGLE;
case WEAPON_SHOTGUN: iHardInterval = AUTOCBUG_TICKS_SHOTGUN;
case WEAPON_RIFLE: iHardInterval = AUTOCBUG_TICKS_COUNTRY;
case WEAPON_SNIPER: iHardInterval = AUTOCBUG_TICKS_SNIPER;
}
if( iInterval < iHardInterval && iCompare > 1500 && fOwnPacketLoss < 0.8 ) {
if( p_cbugWarns{ playerid }++ >= 2 ) {
printf( "[autocbug detect] %d detected (wep %d, interval %d, compare %d, warns %d)", playerid, weaponid, iInterval, iCompare, p_cbugWarns{ playerid });
CallLocalFunction( "OnPlayerCheatDetected", "dd", playerid, CHEAT_TYPE_AUTOCBUG );
}
}
}
p_cbugFireTicks[ playerid ] = iTicks;
}
}