make anticheat more independent with y_hooks + fix death bug with explosive rounds

This commit is contained in:
Lorenc Pekaj 2018-05-13 02:26:14 +10:00
parent b20467df2d
commit 9453ebe2aa
4 changed files with 569 additions and 709 deletions

View File

@ -239,7 +239,6 @@ stock
// Forwards (Global) // Forwards (Global)
public OnPlayerCheatDetected( playerid, detection ); public OnPlayerCheatDetected( playerid, detection );
public OnPlayerDamagePlayer( playerid, damagedid, Float: amount, weaponid, bodypart );
// Functions (Global) // Functions (Global)

View File

@ -23,11 +23,23 @@
with this program; if not, see <http://www.gnu.org/licenses/>. with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
#if !defined AC_HITPOINTS_INCLUDED /* ** Includes ** */
#include < YSI\y_hooks >
// Forwards /* ** Variables ** */
public OnPlayerTakePlayerDamage ( playerid, issuerid, &Float: amount, weaponid, bodypart ); static stock
public OnPlayerDeathEx ( playerid, killerid, reason, Float: damage, bodypart ); Float: p_PlayerHealth [ MAX_PLAYERS ] [ E_PLAYER_HITPOINTS ],
Float: p_PlayerArmour [ MAX_PLAYERS ] [ E_PLAYER_HITPOINTS ],
Float: p_LastDamageIssued [ MAX_PLAYERS ],
p_LastTookDamage [ MAX_PLAYERS ],
p_LastDamageIssuer [ MAX_PLAYERS ] = { INVALID_PLAYER_ID, ... },
p_LastWeaponIssuer [ MAX_PLAYERS ]
;
/* ** Forwards ** */
forward OnPlayerDamagePlayer ( playerid, damagedid, Float: amount, weaponid, bodypart );
forward OnPlayerTakePlayerDamage ( playerid, issuerid, &Float: amount, weaponid, bodypart );
forward OnPlayerDeathEx ( playerid, killerid, reason, Float: damage, bodypart );
// Function (AC_UpdateKillerData) // Function (AC_UpdateKillerData)
@ -62,13 +74,13 @@
if( amount <= 0.0 && p_acSpawned{ playerid } ) if( amount <= 0.0 && p_acSpawned{ playerid } )
{ {
if( ( GetTickCount( ) - p_LastTookDamage[ playerid ] ) > 2500 ) if( ( GetTickCount( ) - p_LastTookDamage[ playerid ] ) > 2500 ) {
p_LastDamageIssuer[ playerid ] = INVALID_PLAYER_ID, p_LastWeaponIssuer[ playerid ] = 47; p_LastDamageIssuer[ playerid ] = INVALID_PLAYER_ID, p_LastWeaponIssuer[ playerid ] = 47;
p_acSpawned{ playerid } = false; // They're dead!
OnPlayerDeathEx( playerid, p_LastDamageIssuer[ playerid ], p_LastWeaponIssuer[ playerid ], 3.3, 3 );
} }
p_acSpawned{ playerid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, p_LastDamageIssuer[ playerid ], p_LastWeaponIssuer[ playerid ], 3.3, 3 );
}
return SetPlayerHealth( playerid, amount ); return SetPlayerHealth( playerid, amount );
} }
@ -99,9 +111,9 @@
stock AC_SetPlayerTeam( playerid, teamid ) stock AC_SetPlayerTeam( playerid, teamid )
{ {
if( teamid != AC_DEFAULT_TEAM ) if( teamid != AC_DEFAULT_TEAM ) {
printf("[ACWarning] You cannot use SetPlayerTeam as you have hitpoint hack detection enabled (teamid %d, default %d).", teamid, AC_DEFAULT_TEAM ); printf("[ACWarning] You cannot use SetPlayerTeam as you have hitpoint hack detection enabled (teamid %d, default %d).", teamid, AC_DEFAULT_TEAM );
}
return SetPlayerTeam( playerid, AC_DEFAULT_TEAM ); return SetPlayerTeam( playerid, AC_DEFAULT_TEAM );
} }
@ -112,6 +124,177 @@
#endif #endif
#define SetPlayerTeam AC_SetPlayerTeam #define SetPlayerTeam AC_SetPlayerTeam
/* ** Callback Hooks ** */
hook OnPlayerConnect( playerid )
{
if ( 0 <= playerid < MAX_PLAYERS )
{
p_PlayerHealth[ playerid ] [ E_UPDATE_FAIL ] = 0;
p_PlayerArmour[ playerid ] [ E_UPDATE_FAIL ] = 0;
}
return 1;
}
hook OnPlayerSpawn( playerid )
{
// Health/Armour Hack
p_PlayerHealth[ playerid ] [ E_UPDATE_FAIL ] = 0;
p_PlayerHealth[ playerid ] [ E_POINTS ] = 100.0;
p_PlayerArmour[ playerid ] [ E_UPDATE_FAIL ] = 0;
p_PlayerArmour[ playerid ] [ E_POINTS ] = 0.0;
SetPlayerTeam( playerid, AC_DEFAULT_TEAM ); // Set everyone the same team
return 1;
}
hook OnPlayerTakeDamage( playerid, issuerid, Float: amount, weaponid, bodypart )
{
new
is_npc = IsPlayerNPC( issuerid );
p_LastTookDamage[ playerid ] = GetTickCount( );
p_LastDamageIssuer[ playerid ] = issuerid;
p_LastWeaponIssuer[ playerid ] = weaponid;
p_LastDamageIssued[ playerid ] = amount;
//if( !( issuerid != INVALID_PLAYER_ID && IsPlayerInAnyVehicle( issuerid ) && GetPlayerVehicleSeat( issuerid ) == 0 && ( weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN ) ) )
// return 0;
// Allow hunter damage/sparrow
if( !( issuerid != INVALID_PLAYER_ID && IsPlayerInAnyVehicle( issuerid ) && GetPlayerVehicleSeat( issuerid ) == 0 && ( weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN ) ) && !is_npc )
{
// Ignore unreliable and invalid damage
if( weaponid < 0 || weaponid >= sizeof( s_ValidDamageGiven ) || s_ValidDamageGiven[ weaponid ] )
return 0;
}
if( ac_IsPlayerSpawned( playerid ) )
{
if( issuerid != INVALID_PLAYER_ID && ! is_npc )
{
if( OnPlayerTakePlayerDamage( playerid, issuerid, amount, weaponid, bodypart ) )
{
new Float: tmp, Float: tmp_amount = amount;
if( p_PlayerArmour[ playerid ] [ E_POINTS ] )
{
if( ( tmp = p_PlayerArmour[ playerid ] [ E_POINTS ] - tmp_amount ) < 0.0 ) {
tmp_amount -= p_PlayerArmour[ playerid ] [ E_POINTS ];
p_PlayerArmour[ playerid ] [ E_POINTS ] = 0.0;
} else {
p_PlayerArmour[ playerid ] [ E_POINTS ] = tmp;
tmp_amount = 0.0;
}
}
if( ( p_PlayerHealth[ playerid ] [ E_POINTS ] -= tmp_amount ) < 0.0 ) {
p_acSpawned{ playerid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, issuerid, weaponid, amount, bodypart );
}
SetPlayerArmour( playerid, p_PlayerArmour[ playerid ] [ E_POINTS ] );
SetPlayerHealth( playerid, p_PlayerHealth[ playerid ] [ E_POINTS ] );
CallRemoteFunction( "OnPlayerDamagePlayer", "ddfdd", issuerid, playerid, amount, weaponid, bodypart );
}
}
else
{
new Float: tmp, Float: tmp_amount = amount;
if( !( weaponid == 53 || weaponid == 54 || weaponid == 50 ) && p_PlayerArmour[ playerid ] [ E_POINTS ] )
{
if( ( tmp = p_PlayerArmour[ playerid ] [ E_POINTS ] - tmp_amount ) < 0.0 ) {
tmp_amount -= p_PlayerArmour[ playerid ] [ E_POINTS ];
p_PlayerArmour[ playerid ] [ E_POINTS ] = 0.0;
} else {
p_PlayerArmour[ playerid ] [ E_POINTS ] = tmp;
tmp_amount = 0.0;
}
}
// printf("OnPlayerTakeDamage( %d, %d, %f, %d, %d ) %f", playerid, issuerid, amount, weaponid, bodypart, p_PlayerHealth[ playerid ] [ E_POINTS ] );
if( ( p_PlayerHealth[ playerid ] [ E_POINTS ] -= tmp_amount ) <= ( weaponid == 37 ? 0.99999 : 0.0 ) ) {
// find any possible killers prior
if( ( GetTickCount( ) - p_LastTookDamage[ playerid ] ) > 2500 ) {
p_LastDamageIssuer[ playerid ] = issuerid, p_LastWeaponIssuer[ playerid ] = weaponid;
}
p_acSpawned{ playerid } = false; // They're dead!
if ( weaponid == 37 || weaponid == 51 ) SetPlayerHealth( playerid, -1 ); // Death bug fix
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, p_LastDamageIssuer[ playerid ], p_LastWeaponIssuer[ playerid ], amount, bodypart );
}
}
}
return 1;
}
hook OnPlayerGiveDamage( playerid, damagedid, Float: amount, weaponid, bodypart )
{
// Ignore unreliable and invalid damage
if ( weaponid < 0 || weaponid >= sizeof( s_ValidDamageGiven ) || !s_ValidDamageGiven[ weaponid ] )
return 0;
if( weaponid < 0 || weaponid >= sizeof( s_ValidMaxDamage ) || amount > s_ValidMaxDamage[ weaponid ] + 2.0 ) // 2.0 safety margin
return 0;
if( damagedid == INVALID_PLAYER_ID )
return 0;
if( IsPlayerInAnyVehicle( playerid ) && GetPlayerVehicleSeat( playerid ) == 0 && ( weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN ) )
return 0;
if ( !IsPlayerNPC( damagedid ) )
{
if( !ac_IsPlayerSpawned( damagedid ) )
return 0;
if( ( !IsPlayerStreamedIn( playerid, damagedid ) && !( GetTickCount( ) - p_acUpdateTime[ damagedid ] >= 2595 ) ) || !IsPlayerStreamedIn( damagedid, playerid ) )
return 0;
//printf("OnPlayerGiveDamage( %d, %d, %f, %d, %d )", playerid, damagedid, amount, weaponid, bodypart );
//p_LastTookDamage[ damagedid ] = GetTickCount( );
//p_LastDamageIssuer[ damagedid ] = playerid;
//p_LastWeaponIssuer[ damagedid ] = weaponid;
//p_LastDamageIssued[ damagedid ] = amount;
if( OnPlayerTakePlayerDamage( damagedid, playerid, amount, weaponid, bodypart ) )
{
new
Float: tmp,
Float: distance = ac_GetDistanceBetweenPlayers( playerid, damagedid ), // Calc distance between players
Float: tmp_amount = amount // this amount is extremely unreliable
;
//printf("Proposed dmg %f kinda %f (min: %f, max: %f, rng: %f)", amount, tmp_amount, GetWeaponMinRange( weaponid ), GetWeaponMaxRange( weaponid ), distance );
if( distance > s_WeaponRange[ weaponid ] + 2.0 )
return 0; //printf(" INVALID RANGE %f (MAX %f)", distance, GetWeaponMaxRange( weaponid ) ), 0;
if( p_PlayerArmour[ damagedid ] [ E_POINTS ] )
{
if( ( tmp = p_PlayerArmour[ damagedid ] [ E_POINTS ] - tmp_amount ) < 0.0 ) {
tmp_amount -= p_PlayerArmour[ damagedid ] [ E_POINTS ];
p_PlayerArmour[ damagedid ] [ E_POINTS ] = 0.0;
} else {
p_PlayerArmour[ damagedid ] [ E_POINTS ] = tmp;
tmp_amount = 0.0;
}
}
if( ( p_PlayerHealth[ damagedid ] [ E_POINTS ] -= tmp_amount ) < 0.0 ) {
p_acSpawned{ damagedid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", damagedid, playerid, weaponid, amount, bodypart );
}
SetPlayerArmour( damagedid, p_PlayerArmour[ damagedid ] [ E_POINTS ] );
SetPlayerHealth( damagedid, p_PlayerHealth[ damagedid ] [ E_POINTS ] );
CallRemoteFunction( "OnPlayerDamagePlayer", "ddfdd", playerid, damagedid, amount, weaponid, bodypart );
}
}
return 1;
}
// Functions (Player) // Functions (Player)
stock vCheckForHealthHacks( playerid, iTicks ) stock vCheckForHealthHacks( playerid, iTicks )
{ {
@ -226,11 +409,43 @@
} }
} }
/* hook OnPlayerDeath(playerid, killerid, reason)
@function ForcePlayerKill {
@description forces a kill on a player if ( !IsPlayerNPC( playerid ) )
@return void {
*/ // Health/Armour Hack
if( GetPVarInt( playerid, "CustomKill" ) )
{
new
customKiller = GetPVarInt( playerid, "KillerID" );
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, customKiller != playerid ? customKiller : INVALID_PLAYER_ID, GetPVarInt( playerid, "WeaponID" ), 3.3, 3 );
DeletePVar( playerid, "KillerID" );
DeletePVar( playerid, "WeaponID" );
DeletePVar( playerid, "CustomKill" );
}
// Died in Vehicle
else if( GetPlayerVehicleID( playerid ) && ac_IsPlayerSpawned( playerid ) )
{
if( ( GetTickCount( ) - p_LastTookDamage[ playerid ] ) > 2500 )
p_LastDamageIssuer[ playerid ] = INVALID_PLAYER_ID, p_LastWeaponIssuer[ playerid ] = 51;
p_acSpawned{ playerid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, p_LastDamageIssuer[ playerid ], p_LastWeaponIssuer[ playerid ], 3.3, 3 );
}
// General
p_acSpawned{ playerid } = false;
// Airbrake
p_abLastTick[ playerid ] = GetTickCount( ) + 3000;
}
return 1;
}
/* ** Functions ** */
stock ForcePlayerKill( playerid, killerid, weaponid ) stock ForcePlayerKill( playerid, killerid, weaponid )
{ {
SetPVarInt( playerid, "KillerID", killerid ); SetPVarInt( playerid, "KillerID", killerid );
@ -239,6 +454,3 @@
SetPlayerHealth( playerid, -1 ); SetPlayerHealth( playerid, -1 );
} }
#define AC_HITPOINTS_INCLUDED
#endif

View File

@ -24,7 +24,13 @@
*/ */
#if !defined AC_INCLUDED #if !defined AC_INCLUDED
#include < a_samp > #define AC_INCLUDED
#else
#endinput
#endif
/* ** Includes ** */
#include < YSI\y_hooks >
// Function Hook (PutPlayerInVehicle) // Function Hook (PutPlayerInVehicle)
@ -47,7 +53,7 @@
// Callback Hook (OnPlayerConnect) // Callback Hook (OnPlayerConnect)
public OnPlayerConnect( playerid ) hook OnPlayerConnect( playerid )
{ {
if ( !IsPlayerNPC( playerid ) ) if ( !IsPlayerNPC( playerid ) )
{ {
@ -61,8 +67,6 @@
RemoveBuildingForPlayer( playerid, 1977, 0.0, 0.0, 0.0, 6000.0 ); RemoveBuildingForPlayer( playerid, 1977, 0.0, 0.0, 0.0, 6000.0 );
// Reset Variables // Reset Variables
p_PlayerHealth [ playerid ] [ E_UPDATE_FAIL ] = 0;
p_PlayerArmour [ playerid ] [ E_UPDATE_FAIL ] = 0;
p_acSpawned { playerid } = false; p_acSpawned { playerid } = false;
//p_SpectatePermission { playerid } = false; //p_SpectatePermission { playerid } = false;
p_abDetected { playerid } = 0; p_abDetected { playerid } = 0;
@ -74,40 +78,16 @@
for ( new i = 0; i < AC_MAX_WEAPONS; i++ ) for ( new i = 0; i < AC_MAX_WEAPONS; i++ )
p_PlayerHasWeapon [ playerid ] { i } = false; p_PlayerHasWeapon [ playerid ] { i } = false;
} }
#if defined SAMPAC_OnPlayerConnect
return SAMPAC_OnPlayerConnect( playerid );
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerConnect
forward SAMPAC_OnPlayerConnect( playerid );
#endif
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect SAMPAC_OnPlayerConnect
// Callback Hook (OnPlayerSpawn) // Callback Hook (OnPlayerSpawn)
public OnPlayerSpawn( playerid ) hook OnPlayerSpawn( playerid )
{ {
// General // General
p_acSpawned{ playerid } = true; p_acSpawned{ playerid } = true;
// Health/Armour Hack
p_PlayerHealth[ playerid ] [ E_UPDATE_FAIL ] = 0;
p_PlayerHealth[ playerid ] [ E_POINTS ] = 100.0;
p_PlayerArmour[ playerid ] [ E_UPDATE_FAIL ] = 0;
p_PlayerArmour[ playerid ] [ E_POINTS ] = 0.0;
SetPlayerTeam( playerid, AC_DEFAULT_TEAM ); // Set everyone the same team
// Weapon Hack // Weapon Hack
for ( new i = 0; i < 3; i++ ) for ( new i = 0; i < 3; i++ )
{ {
@ -121,257 +101,12 @@
// Airbrake // Airbrake
p_abDetected{ playerid } = 0; p_abDetected{ playerid } = 0;
p_abLastTick[ playerid ] = GetTickCount( ) + 3000; p_abLastTick[ playerid ] = GetTickCount( ) + 3000;
#if defined SAMPAC_OnPlayerSpawn
return SAMPAC_OnPlayerSpawn( playerid );
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerSpawn
forward SAMPAC_OnPlayerSpawn( playerid );
#endif
#if defined _ALS_OnPlayerSpawn
#undef OnPlayerSpawn
#else
#define _ALS_OnPlayerSpawn
#endif
#define OnPlayerSpawn SAMPAC_OnPlayerSpawn
// Callback Hook (OnPlayerDeath)
public OnPlayerDeath(playerid, killerid, reason)
{
if ( !IsPlayerNPC( playerid ) )
{
// Health/Armour Hack
if( GetPVarInt( playerid, "CustomKill" ) )
{
new
customKiller = GetPVarInt( playerid, "KillerID" );
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, customKiller != playerid ? customKiller : INVALID_PLAYER_ID, GetPVarInt( playerid, "WeaponID" ), 3.3, 3 );
DeletePVar( playerid, "KillerID" );
DeletePVar( playerid, "WeaponID" );
DeletePVar( playerid, "CustomKill" );
}
else if( GetPlayerVehicleID( playerid ) && ac_IsPlayerSpawned( playerid ) ) // Died in Vehicle
{
if( ( GetTickCount( ) - p_LastTookDamage[ playerid ] ) > 2500 )
p_LastDamageIssuer[ playerid ] = INVALID_PLAYER_ID, p_LastWeaponIssuer[ playerid ] = 51;
p_acSpawned{ playerid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, p_LastDamageIssuer[ playerid ], p_LastWeaponIssuer[ playerid ], 3.3, 3 );
}
// General
p_acSpawned{ playerid } = false;
// Airbrake
p_abLastTick[ playerid ] = GetTickCount( ) + 3000;
}
#if defined SAMPAC_OnPlayerDeath
return SAMPAC_OnPlayerDeath(playerid, killerid, reason);
#else
return 1;
#endif
}
#if defined SAMPAC_OnPlayerDeath
forward SAMPAC_OnPlayerDeath(playerid, killerid, reason);
#endif
#if defined _ALS_OnPlayerDeath
#undef OnPlayerDeath
#else
#define _ALS_OnPlayerDeath
#endif
#define OnPlayerDeath SAMPAC_OnPlayerDeath
// Callback Hook (OnPlayerTakeDamage)
public OnPlayerTakeDamage( playerid, issuerid, Float: amount, weaponid, bodypart )
{
new
is_npc = IsPlayerNPC( issuerid );
p_LastTookDamage[ playerid ] = GetTickCount( );
p_LastDamageIssuer[ playerid ] = issuerid;
p_LastWeaponIssuer[ playerid ] = weaponid;
p_LastDamageIssued[ playerid ] = amount;
//if( !( issuerid != INVALID_PLAYER_ID && IsPlayerInAnyVehicle( issuerid ) && GetPlayerVehicleSeat( issuerid ) == 0 && ( weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN ) ) )
// return 0;
// Allow hunter damage/sparrow
if( !( issuerid != INVALID_PLAYER_ID && IsPlayerInAnyVehicle( issuerid ) && GetPlayerVehicleSeat( issuerid ) == 0 && ( weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN ) ) && !is_npc )
{
// Ignore unreliable and invalid damage
if( weaponid < 0 || weaponid >= sizeof( s_ValidDamageGiven ) || s_ValidDamageGiven[ weaponid ] )
return 0;
}
if( ac_IsPlayerSpawned( playerid ) )
{
if( issuerid != INVALID_PLAYER_ID && ! is_npc )
{
if( OnPlayerTakePlayerDamage( playerid, issuerid, amount, weaponid, bodypart ) )
{
new Float: tmp, Float: tmp_amount = amount;
if( p_PlayerArmour[ playerid ] [ E_POINTS ] )
{
if( ( tmp = p_PlayerArmour[ playerid ] [ E_POINTS ] - tmp_amount ) < 0.0 ) {
tmp_amount -= p_PlayerArmour[ playerid ] [ E_POINTS ];
p_PlayerArmour[ playerid ] [ E_POINTS ] = 0.0;
} else {
p_PlayerArmour[ playerid ] [ E_POINTS ] = tmp;
tmp_amount = 0.0;
}
}
if( ( p_PlayerHealth[ playerid ] [ E_POINTS ] -= tmp_amount ) < 0.0 ) {
p_acSpawned{ playerid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, issuerid, weaponid, amount, bodypart );
}
SetPlayerArmour( playerid, p_PlayerArmour[ playerid ] [ E_POINTS ] );
SetPlayerHealth( playerid, p_PlayerHealth[ playerid ] [ E_POINTS ] );
CallRemoteFunction( "OnPlayerDamagePlayer", "ddfdd", issuerid, playerid, amount, weaponid, bodypart );
}
}
else
{
new Float: tmp, Float: tmp_amount = amount;
if( !( weaponid == 53 || weaponid == 54 || weaponid == 50 ) && p_PlayerArmour[ playerid ] [ E_POINTS ] )
{
if( ( tmp = p_PlayerArmour[ playerid ] [ E_POINTS ] - tmp_amount ) < 0.0 ) {
tmp_amount -= p_PlayerArmour[ playerid ] [ E_POINTS ];
p_PlayerArmour[ playerid ] [ E_POINTS ] = 0.0;
} else {
p_PlayerArmour[ playerid ] [ E_POINTS ] = tmp;
tmp_amount = 0.0;
}
}
//printf("OnPlayerTakeDamage( %d, %d, %f, %d, %d ) %f", playerid, issuerid, amount, weaponid, bodypart, p_PlayerHealth[ playerid ] [ E_POINTS ] );
if( ( p_PlayerHealth[ playerid ] [ E_POINTS ] -= tmp_amount ) <= ( weaponid == 37 ? 0.99999 : 0.0 ) ) {
p_acSpawned{ playerid } = false; // They're dead!
if ( weaponid == 37 ) SetPlayerHealth( playerid, -1 );
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", playerid, issuerid, weaponid, amount, bodypart );
}
}
}
#if defined SAMPAC_OnPlayerTakeDamage
return SAMPAC_OnPlayerTakeDamage(playerid, issuerid, amount, weaponid, bodypart);
#else
return 0;
#endif
}
#if defined SAMPAC_OnPlayerTakeDamage
forward SAMPAC_OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart);
#endif
#if defined _ALS_OnPlayerTakeDamage
#undef OnPlayerTakeDamage
#else
#define _ALS_OnPlayerTakeDamage
#endif
#define OnPlayerTakeDamage SAMPAC_OnPlayerTakeDamage
// Callback Hook (OnPlayerGiveDamage)
public OnPlayerGiveDamage( playerid, damagedid, Float: amount, weaponid, bodypart )
{
// Ignore unreliable and invalid damage
if ( weaponid < 0 || weaponid >= sizeof( s_ValidDamageGiven ) || !s_ValidDamageGiven[ weaponid ] )
return 0;
if( weaponid < 0 || weaponid >= sizeof( s_ValidMaxDamage ) || amount > s_ValidMaxDamage[ weaponid ] + 2.0 ) // 2.0 safety margin
return 0;
if( damagedid == INVALID_PLAYER_ID )
return 0;
if( IsPlayerInAnyVehicle( playerid ) && GetPlayerVehicleSeat( playerid ) == 0 && ( weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN ) )
return 0;
if ( !IsPlayerNPC( damagedid ) )
{
if( !ac_IsPlayerSpawned( damagedid ) )
return 0;
if( ( !IsPlayerStreamedIn( playerid, damagedid ) && !( GetTickCount( ) - p_acUpdateTime[ damagedid ] >= 2595 ) ) || !IsPlayerStreamedIn( damagedid, playerid ) )
return 0;
//printf("OnPlayerGiveDamage( %d, %d, %f, %d, %d )", playerid, damagedid, amount, weaponid, bodypart );
//p_LastTookDamage[ damagedid ] = GetTickCount( );
//p_LastDamageIssuer[ damagedid ] = playerid;
//p_LastWeaponIssuer[ damagedid ] = weaponid;
//p_LastDamageIssued[ damagedid ] = amount;
if( OnPlayerTakePlayerDamage( damagedid, playerid, amount, weaponid, bodypart ) )
{
new
Float: tmp,
Float: distance = ac_GetDistanceBetweenPlayers( playerid, damagedid ), // Calc distance between players
Float: tmp_amount = amount // this amount is extremely unreliable
;
//printf("Proposed dmg %f kinda %f (min: %f, max: %f, rng: %f)", amount, tmp_amount, GetWeaponMinRange( weaponid ), GetWeaponMaxRange( weaponid ), distance );
if( distance > s_WeaponRange[ weaponid ] + 2.0 )
return 0; //printf(" INVALID RANGE %f (MAX %f)", distance, GetWeaponMaxRange( weaponid ) ), 0;
if( p_PlayerArmour[ damagedid ] [ E_POINTS ] )
{
if( ( tmp = p_PlayerArmour[ damagedid ] [ E_POINTS ] - tmp_amount ) < 0.0 ) {
tmp_amount -= p_PlayerArmour[ damagedid ] [ E_POINTS ];
p_PlayerArmour[ damagedid ] [ E_POINTS ] = 0.0;
} else {
p_PlayerArmour[ damagedid ] [ E_POINTS ] = tmp;
tmp_amount = 0.0;
}
}
if( ( p_PlayerHealth[ damagedid ] [ E_POINTS ] -= tmp_amount ) < 0.0 ) {
p_acSpawned{ damagedid } = false; // They're dead!
CallRemoteFunction( "OnPlayerDeathEx", "ddfd", damagedid, playerid, weaponid, amount, bodypart );
}
SetPlayerArmour( damagedid, p_PlayerArmour[ damagedid ] [ E_POINTS ] );
SetPlayerHealth( damagedid, p_PlayerHealth[ damagedid ] [ E_POINTS ] );
CallRemoteFunction( "OnPlayerDamagePlayer", "ddfdd", playerid, damagedid, amount, weaponid, bodypart );
}
}
#if defined SAMPAC_OnPlayerGiveDamage
return SAMPAC_OnPlayerGiveDamage( playerid, damagedid, Float: amount, weaponid, bodypart );
#else
return 0;
#endif
}
#if defined SAMPAC_OnPlayerGiveDamage
forward SAMPAC_OnPlayerGiveDamage( playerid, damagedid, Float: amount, weaponid, bodypart );
#endif
#if defined _ALS_OnPlayerGiveDamage
#undef OnPlayerGiveDamage
#else
#define _ALS_OnPlayerGiveDamage
#endif
#define OnPlayerGiveDamage SAMPAC_OnPlayerGiveDamage
// Hook (OnPlayerStateChange) // Hook (OnPlayerStateChange)
public OnPlayerStateChange( playerid, newstate, oldstate ) hook OnPlayerStateChange( playerid, newstate, oldstate )
{ {
if ( !IsPlayerNPC( playerid ) ) if ( !IsPlayerNPC( playerid ) )
{ {
@ -400,27 +135,12 @@
// Airbrake // Airbrake
p_abLastTick[ playerid ] = GetTickCount( ) + 3000; p_abLastTick[ playerid ] = GetTickCount( ) + 3000;
} }
#if defined SAMPAC_OnPlayerStateChange
return SAMPAC_OnPlayerStateChange( playerid, newstate, oldstate );
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerStateChange
forward SAMPAC_OnPlayerStateChange( playerid, newstate, oldstate );
#endif
#if defined _ALS_OnPlayerStateChange
#undef OnPlayerStateChange
#else
#define _ALS_OnPlayerStateChange
#endif
#define OnPlayerStateChange SAMPAC_OnPlayerStateChange
// Hook (OnPlayerUpdate) // Hook (OnPlayerUpdate)
public OnPlayerUpdate( playerid ) hook OnPlayerUpdate( playerid )
{ {
if( !ac_IsPlayerSpawned( playerid ) ) if( !ac_IsPlayerSpawned( playerid ) )
return 0; // Not Spawned, No SYNC! return 0; // Not Spawned, No SYNC!
@ -442,79 +162,34 @@
bCheckPlayerRemoteJacking ( playerid ); bCheckPlayerRemoteJacking ( playerid );
} }
} }
#if defined SAMPAC_OnPlayerUpdate
return SAMPAC_OnPlayerUpdate( playerid );
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerUpdate
forward SAMPAC_OnPlayerUpdate( playerid );
#endif
#if defined _ALS_OnPlayerUpdate
#undef OnPlayerUpdate
#else
#define _ALS_OnPlayerUpdate
#endif
#define OnPlayerUpdate SAMPAC_OnPlayerUpdate
// Hook (OnPlayerRequestClass) // Hook (OnPlayerRequestClass)
public OnPlayerRequestClass( playerid, classid ) hook OnPlayerRequestClass( playerid, classid )
{ {
// General // General
p_acSpawned{ playerid } = false; p_acSpawned{ playerid } = false;
p_SelectedClassID[ playerid ] = classid; p_SelectedClassID[ playerid ] = classid;
#if defined SAMPAC_OnPlayerRequestClass
return SAMPAC_OnPlayerRequestClass( playerid, classid );
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerRequestClass
forward SAMPAC_OnPlayerRequestClass( playerid, classid );
#endif
#if defined _ALS_OnPlayerRequestClass
#undef OnPlayerRequestClass
#else
#define _ALS_OnPlayerRequestClass
#endif
#define OnPlayerRequestClass SAMPAC_OnPlayerRequestClass
// Callback Hook (OnPlayerKeyStateChange) // Callback Hook (OnPlayerKeyStateChange)
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{ {
if( !IsPlayerNPC( playerid ) ) if( !IsPlayerNPC( playerid ) )
{ {
vWeaponHackCheck ( playerid, newkeys ); vWeaponHackCheck ( playerid, newkeys );
vAutoCbugKeyState ( playerid, newkeys, oldkeys ); vAutoCbugKeyState ( playerid, newkeys, oldkeys );
} }
#if defined SAMPAC_OnPlayerKeyStateChange
return SAMPAC_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerKeyStateChange
forward SAMPAC_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
#endif
#if defined _ALS_OnPlayerKeyStateChange
#undef OnPlayerKeyStateChange
#else
#define _ALS_OnPlayerKeyStateChange
#endif
#define OnPlayerKeyStateChange SAMPAC_OnPlayerKeyStateChange
// Callback Hook (OnPlayerWeaponShot) // Callback Hook (OnPlayerWeaponShot)
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) hook OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{ {
//printf("OnPlayerWeaponShot(%d, %d, %d, %d, %f, %f, %f)",playerid, weaponid, hittype, hitid, fX, fY, fZ); //printf("OnPlayerWeaponShot(%d, %d, %d, %d, %f, %f, %f)",playerid, weaponid, hittype, hitid, fX, fY, fZ);
@ -526,23 +201,5 @@
vCheckForAutoCbug( playerid, weaponid ); vCheckForAutoCbug( playerid, weaponid );
vCheckForSilentAimbot( playerid, hittype, hitid ); vCheckForSilentAimbot( playerid, hittype, hitid );
#if defined SAMPAC_OnPlayerWeaponShot
return SAMPAC_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
#else
return 1; return 1;
#endif
} }
#if defined SAMPAC_OnPlayerWeaponShot
forward SAMPAC_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
#endif
#if defined _ALS_OnPlayerWeaponShot
#undef OnPlayerWeaponShot
#else
#define _ALS_OnPlayerWeaponShot
#endif
#define OnPlayerWeaponShot SAMPAC_OnPlayerWeaponShot
#define AC_INCLUDED
#endif

View File

@ -48,14 +48,6 @@ new
bool: p_acSpawned [ MAX_PLAYERS char ], bool: p_acSpawned [ MAX_PLAYERS char ],
p_acUpdateTime [ MAX_PLAYERS ], p_acUpdateTime [ MAX_PLAYERS ],
// Health/Armour
Float: p_PlayerHealth [ MAX_PLAYERS ] [ E_PLAYER_HITPOINTS ],
Float: p_PlayerArmour [ MAX_PLAYERS ] [ E_PLAYER_HITPOINTS ],
Float: p_LastDamageIssued [ MAX_PLAYERS ],
p_LastTookDamage [ MAX_PLAYERS ],
p_LastDamageIssuer [ MAX_PLAYERS ] = { INVALID_PLAYER_ID, ... },
p_LastWeaponIssuer [ MAX_PLAYERS ],
// Weapon Hacks // Weapon Hacks
bool: p_PlayerHasWeapon [ MAX_PLAYERS ] [ AC_MAX_WEAPONS char ], bool: p_PlayerHasWeapon [ MAX_PLAYERS ] [ AC_MAX_WEAPONS char ],
//p_PlayerWeaponUpdateTime [ MAX_PLAYERS ], //p_PlayerWeaponUpdateTime [ MAX_PLAYERS ],