| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695 |
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //BUST AIM
- //
- //BustAim is a feature rich anti-aimbot include which tries to detect players who are using aimbots. BustAim is designed to
- //trigger warnings and provide administrators with vital information about the suspected player. It by itself cannot do much
- //and requires human intelligence to confirm if the player is using an aimbot.
- //License:Public Domain
- //
- //Credits:
- //Yashas
- //RedShirt & niCe & JernejL for camera/aiming functions
- //ipsLeon & Kyance for their aimbot detectors
- //Pottus for constructive criticism
- //Slice for the information regarding Maximum Weapon Firing Range
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Callbacks:
- // OnPlayerSuspectedForAimbot(playerid,hitid,weaponid,warnings)
- //
- //Stocks:
- // native BustAim::GetPlayerWeaponProfile(playerid,weaponid,&allshots,&hitshots,&max_cont_shots,&out_of_range_warns,&random_aim_warns,&proaim_tele_warns);
- // native BustAim::ResetPlayerWeaponProfile(playerid,weaponid);
- // native BustAim::GetPlayerProfile(playerid,&shotsfired,&shotshit,&max_cont_shots,&out_of_range_warns,&random_aim_warns,&proaim_tele_warns);
- // native BustAim::ResetPlayerProfile(playerid);
- // native BustAim::SetPlayerFlags(playerid,flags);
- // native BustAim::GetPlayerFlags(playerid,&flags);
- // native BustAim::ResetPlayerFlags(playerid);
- // native BustAim::GetTeleportStats(playerid,Float:arr[],sz = sizeof(arr));
- // native BustAim::GetAimStats(playerid,Float:arr[],sz = sizeof(arr))
- // native BustAim::GetRangeStats(playerid,Float:arr[],sz = sizeof(arr))
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- #if defined _INCLUDE_BUSTAIM_
- #endinput
- #endif
- #define _INCLUDE_BUSTAIM_
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- #define BustAim:: BS_
- #if !defined BUSTAIM_MAX_PL_PERCENTAGE
- #define BUSTAIM_MAX_PL_PERCENTAGE 5
- #endif
- #if !defined BUSTAIM_MAX_PING
- #define BUSTAIM_MAX_PING 600
- #endif
- #if !defined BUSTAIM_SKIP_WEAPON_IDS
- #define BUSTAIM_SKIP_WEAPON_IDS 38
- #endif
- #if !defined BUSTAIM_MAX_CONTINOUS_SHOTS
- #define BUSTAIM_MAX_CONTINOUS_SHOTS 10
- #endif
- #if !defined BUSTAIM_PROAIM_TELEPORT_PROBES
- #define BUSTAIM_PROAIM_TELEPORT_PROBES 3
- #endif
- #if !defined BUSTAIM_OUT_OF_RANGE_PROBES
- #define BUSTAIM_OUT_OF_RANGE_PROBES 2
- #endif
- #if !defined BUSTAIM_RANDOM_AIM_PROBES
- #define BUSTAIM_RANDOM_AIM_PROBES 5
- #endif
- #if !defined MIN_DIST_FOR_AIM_CHECKS
- #define MIN_DIST_FOR_AIM_CHECKS 10
- #endif
- #if !defined MAX_B2V_DEVIATION
- #define MAX_B2V_DEVIATION 15
- #endif
- #if !defined BUSTAIM_PLAYER_SPHERE_RADIUS
- #define BUSTAIM_PLAYER_SPHERE_RADIUS 3
- #endif
- #if !defined BUSTAIM_DEFAULT_PLAYER_FLAGS
- #define BUSTAIM_DEFAULT_PLAYER_FLAGS (CHECK_FOR_OUT_OF_RANGE_SHOTS | CHECK_FOR_PROAIM_TELEPORT | CHECK_FOR_RANDOM_AIM_SHOTS | CHECK_FOR_CONTINOUS_SHOTS)
- #endif
- #if !defined BUSTAIM_WSTATS_SHOTS
- #define BUSTAIM_WSTATS_SHOTS 3
- #endif
- //DO NOT CHANGE THIS
- #define BS_TOTAL_SHOOTING_WEAPONS 17 //includes RPG,HS,FT
- #if BS_TOTAL_SHOOTING_WEAPONS != 17
- #error BS_TOTAL_SHOOTING_WEAPONS should always be set to 17
- #endif
- #define BS_GetNormalWeaponRange(weaponid) BustAim_g_WeaponRangeOriginal[weaponid-22]
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- forward OnPlayerSuspectedForAimbot(playerid,hitid,weaponid,warnings);
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- enum (<<=1)
- {
- WARNING_OUT_OF_RANGE_SHOT=1,
- WARNING_PROAIM_TELEPORT,
- WARNING_RANDOM_AIM,
- WARNING_CONTINOUS_SHOTS
- }
- enum (<<=1)
- {
- PREVIOUS_SHOT_DID_DAMAGE=1,
- }
- enum (<<=1)
- {
- CHECK_FOR_OUT_OF_RANGE_SHOTS=1,
- CHECK_FOR_PROAIM_TELEPORT,
- CHECK_FOR_RANDOM_AIM_SHOTS,
- CHECK_FOR_CONTINOUS_SHOTS,
- IGNORE_PLAYER
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //Modified Slice's Max Weapon Ranges from Weapon Config Include (Added 10 units extra for every weapon to make allowance for lagging players)
- static const Float:BustAim_g_WeaponRange[] =
- {
- 45.0, // 22 - Colt 45
- 45.0, // 23 - Silenced
- 45.0, // 24 - Deagle
- 50.0, // 25 - Shotgun
- 45.0, // 26 - Sawed-off
- 50.0, // 27 - Spas
- 45.0, // 28 - UZI
- 55.0, // 29 - MP5
- 100.0, // 30 - AK47
- 120.0, // 31 - M4
- 45.0, // 32 - Tec9
- 110.0, // 33 - Cuntgun
- 320.0, // 34 - Sniper
- 0.0, // 35 - Rocket launcher
- 0.0, // 36 - Heatseeker
- 0.0, // 37 - Flamethrower
- 85.0 // 38 - Minigun
- };
- //Original Slice's Max Weapon Ranges'
- stock const Float:BustAim_g_WeaponRangeOriginal[] =
- {
- 35.0, // 22 - Colt 45
- 35.0, // 23 - Silenced
- 35.0, // 24 - Deagle
- 40.0, // 25 - Shotgun
- 35.0, // 26 - Sawed-off
- 40.0, // 27 - Spas
- 35.0, // 28 - UZI
- 45.0, // 29 - MP5
- 70.0, // 30 - AK47
- 90.0, // 31 - M4
- 35.0, // 32 - Tec9
- 100.0, // 33 - Cuntgun
- 320.0, // 34 - Sniper
- 0.0, // 35 - Rocket launcher
- 0.0, // 36 - Heatseeker
- 0.0, // 37 - Flamethrower
- 75.0 // 38 - Minigun
- };
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- static BustAim_g_PlayerSettings[MAX_PLAYERS char];
- static BustAim_g_PlayerPrevWeapon[MAX_PLAYERS char];
- static BustAim_g_IntrnlPlayerSettings[MAX_PLAYERS char];
- static BustAim_g_ContinousShots[MAX_PLAYERS char];
- static BustAim_g_RandomAimShots[MAX_PLAYERS char];
- static BustAim_g_TeleportShots[MAX_PLAYERS char];
- static BustAim_g_OutOfRangeShots[MAX_PLAYERS char];
- #if !defined BUSTAIM_DISABLE_PROFILING
- static BustAim_g_TotalRandomAimWarns[MAX_PLAYERS][BS_TOTAL_SHOOTING_WEAPONS];
- static BustAim_g_TotalTeleportWarns[MAX_PLAYERS][BS_TOTAL_SHOOTING_WEAPONS];
- static BustAim_g_TotalOutOfRangeWarns[MAX_PLAYERS][BS_TOTAL_SHOOTING_WEAPONS];
- static BustAim_g_MaxContinousShots[MAX_PLAYERS][BS_TOTAL_SHOOTING_WEAPONS];
- static BustAim_g_ShotsFired[MAX_PLAYERS][BS_TOTAL_SHOOTING_WEAPONS];
- static BustAim_g_ShotsHit[MAX_PLAYERS][BS_TOTAL_SHOOTING_WEAPONS];
- #endif
- #if !defined BUSTAIM_DISABLE_WSTATS
- static Float:BustAim_g_TeleportWarningStats[MAX_PLAYERS][BUSTAIM_WSTATS_SHOTS];
- static Float:BustAim_g_AimWarningStats[MAX_PLAYERS][BUSTAIM_WSTATS_SHOTS];
- static Float:BustAim_g_RangeWarningStats[MAX_PLAYERS][BUSTAIM_WSTATS_SHOTS];
- static Float:BustAim_g_DCTTL_temp;
- #endif
- #if !defined BUSTAIM_IS_PAUSED_FUNCTION
- static BustAim_g_LastUpdateTick[MAX_PLAYERS];
- #endif
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- static Float:internal_BS_DCTTL(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ)
- {
- static Float:TGTDistance,Float:tmpX, Float:tmpY, Float:tmpZ;
- TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ));
- tmpX = FrX * TGTDistance + CamX;
- tmpY = FrY * TGTDistance + CamY;
- tmpZ = FrZ * TGTDistance + CamZ;
- return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ));
- }
- static Float:internal_BS_GPATP(Float:x2, Float:y2, Float:X, Float:Y)
- {
- static Float:DX, Float:DY,Float:angle;
- DX = floatabs(floatsub(x2,X));
- DY = floatabs(floatsub(y2,Y));
- if (DY == 0.0 || DX == 0.0)
- {
- if(DY == 0 && DX > 0) angle = 0.0;
- else if(DY == 0 && DX < 0) angle = 180.0;
- else if(DY > 0 && DX == 0) angle = 90.0;
- else if(DY < 0 && DX == 0) angle = 270.0;
- else if(DY == 0 && DX == 0) angle = 0.0;
- }
- else
- {
- angle = atan(DX/DY);
- if(X > x2 && Y <= y2) angle += 90.0;
- else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle);
- else if(X < x2 && Y >= y2) angle -= 90.0;
- else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle);
- }
- return floatadd(angle, 90.0);
- }
- static internal_BS_GXYIFOP(&Float:x, &Float:y, Float:angle, Float:distance)
- {
- x += (distance * floatsin(-angle, degrees));
- y += (distance * floatcos(-angle, degrees));
- }
- static internal_BS_IsCameraAimingAt(weaponid,Float:x, Float:y, Float:z,Float:vector_x,Float:vector_y,Float:vector_z,Float:camera_x,Float:camera_y,Float:camera_z,Float:radius)
- {
- static Float:vertical, Float:horizontal;
- switch (weaponid)
- {
- case 34,35,36:
- {
- if (internal_BS_DCTTL(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true;
- return false;
- }
- case 30,31: {vertical = 4.0; horizontal = -1.6;}
- case 33: {vertical = 2.7; horizontal = -1.0;}
- default: {vertical = 6.0; horizontal = -2.2;}
- }
- new Float:angle = internal_BS_GPATP(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0;
- new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees);
- internal_BS_GXYIFOP(resize_x, resize_y, internal_BS_GPATP(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees));
- #if !defined BUSTAIM_DISABLE_WSTATS
- if ((BustAim_g_DCTTL_temp = internal_BS_DCTTL(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z)) < radius) return true;
- #else
- if (internal_BS_DCTTL(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true;
- #endif
- return false;
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
- {
- static Float:pX,Float:pY,Float:pZ,Float:hX,Float:hY,Float:hZ,Float:cX,Float:cY,Float:cZ;
- if(!(21 < weaponid < 39)
- || !(-1 < hittype < 5))
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot( playerid, weaponid, hittype, hitid, fX, fY, fZ );
- #else
- return 0;
- #endif
-
- if(hittype == BULLET_HIT_TYPE_NONE)
- {
- if(floatabs(fX) > 20000.0 || floatabs(fY) > 20000.0 || floatabs(fZ) > 20000.0)
- {
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
- #else
- return 0;
- #endif
- }
- }
- else
- {
- if(floatabs(fX) > 1500.0 || floatabs(fY) > 1500.0 || floatabs(fZ) > 1500.0)
- {
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
- #else
- return 0;
- #endif
- }
- }
-
- #if !defined BUSTAIM_DISABLE_PROFILING
- BustAim_g_ShotsFired[playerid][weaponid-22]++;
- #endif
-
- if(hittype == BULLET_HIT_TYPE_PLAYER)
- {
- #if !defined BUSTAIM_DISABLE_PROFILING
- BustAim_g_ShotsHit[playerid][weaponid-22]++;
- #endif
- if(BustAim_g_PlayerSettings{playerid} & IGNORE_PLAYER)
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- if(BustAim_g_PlayerPrevWeapon{playerid} != weaponid)
- {
- BustAim_g_ContinousShots{playerid} =
- BustAim_g_RandomAimShots{playerid} =
- BustAim_g_TeleportShots{playerid} =
- BustAim_g_OutOfRangeShots{playerid} = 0;
- BustAim_g_PlayerPrevWeapon{playerid} = weaponid;
- }
- if(IsPlayerNPC(hitid))
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- #if defined BUSTAIM_IS_PAUSED_FUNCTION
- if(BUSTAIM_IS_PAUSED_FUNCTION(hitid))
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- #else
- if((GetTickCount() - BustAim_g_LastUpdateTick[hitid]) > 1000)
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- #endif
- if(NetStats_PacketLossPercent(playerid) > BUSTAIM_MAX_PL_PERCENTAGE || NetStats_PacketLossPercent(hitid) > BUSTAIM_MAX_PL_PERCENTAGE)
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- if(GetPlayerPing(playerid) > BUSTAIM_MAX_PING || GetPlayerPing(hitid) > BUSTAIM_MAX_PING)
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- if(IsPlayerInAnyVehicle(playerid) || IsPlayerInAnyVehicle(hitid))
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- if(GetPlayerSurfingVehicleID(playerid) != INVALID_VEHICLE_ID || GetPlayerSurfingVehicleID(hitid) != INVALID_VEHICLE_ID)
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- switch(weaponid)
- {
- case BUSTAIM_SKIP_WEAPON_IDS:
- {
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- }
- }
-
- new warning = 0;
- GetPlayerVelocity(hitid,pX,pY,pZ);
- if(BustAim_g_PlayerSettings{playerid} & CHECK_FOR_CONTINOUS_SHOTS)
- if((pX*pX + pY*pY + pZ*pZ) > 0.01)
- if(!(++BustAim_g_ContinousShots{playerid} % BUSTAIM_MAX_CONTINOUS_SHOTS))
- warning |= WARNING_CONTINOUS_SHOTS;
- GetPlayerPos(hitid,hX,hY,hZ);
- GetPlayerLastShotVectors(playerid,pX,pY,pZ,cX,cY,cZ);
- new Float:S2V_dist = VectorSize(pX-hX,pY-hY,pZ-hZ); //Approximate Shooter to Victim Distance
- if(BustAim_g_PlayerSettings{playerid} & CHECK_FOR_OUT_OF_RANGE_SHOTS)
- {
- if(S2V_dist > BustAim_g_WeaponRange[weaponid-22])
- {
- #if !defined BUSTAIM_DISABLE_WSTATS
- BustAim_g_RangeWarningStats[playerid][BustAim_g_OutOfRangeShots{playerid}%BUSTAIM_WSTATS_SHOTS] = S2V_dist;
- #endif
- if(BustAim_g_IntrnlPlayerSettings{playerid} & PREVIOUS_SHOT_DID_DAMAGE)
- {
- if(++BustAim_g_OutOfRangeShots{playerid} > BUSTAIM_OUT_OF_RANGE_PROBES)
- {
- BustAim_g_OutOfRangeShots{playerid} = 0;
- #if !defined BUSTAIM_DISABLE_PROFILING
- BustAim_g_TotalOutOfRangeWarns[playerid][weaponid-22]++;
- #endif
- warning |= WARNING_OUT_OF_RANGE_SHOT;
- }
- BustAim_g_IntrnlPlayerSettings{playerid} &= ~PREVIOUS_SHOT_DID_DAMAGE;
- }
- }
- }
- if(BustAim_g_PlayerSettings{playerid} & CHECK_FOR_PROAIM_TELEPORT)
- if(VectorSize(cX-hX,cY-hY,cZ-hZ) > MAX_B2V_DEVIATION)
- {
- #if !defined BUSTAIM_DISABLE_WSTATS
- BustAim_g_TeleportWarningStats[playerid][BustAim_g_TeleportShots{playerid}%BUSTAIM_WSTATS_SHOTS] = VectorSize(cX-hX,cY-hY,cZ-hZ);
- #endif
- if(++BustAim_g_TeleportShots{playerid} > BUSTAIM_PROAIM_TELEPORT_PROBES)
- {
- BustAim_g_TeleportShots{playerid} = 0;
- #if !defined BUSTAIM_DISABLE_PROFILING
- BustAim_g_TotalTeleportWarns[playerid][weaponid-22]++;
- #endif
- warning |= WARNING_PROAIM_TELEPORT;
- }
- }
-
- if(BustAim_g_PlayerSettings{playerid} & CHECK_FOR_RANDOM_AIM_SHOTS)
- if(S2V_dist > MIN_DIST_FOR_AIM_CHECKS)
- {
- GetPlayerCameraFrontVector(playerid,pX,pY,pZ);
- GetPlayerCameraPos(playerid,cX,cY,cZ);
- if(!internal_BS_IsCameraAimingAt(weaponid,hX,hY,hZ,pX,pY,pZ,cX,cY,cZ,BUSTAIM_PLAYER_SPHERE_RADIUS))
- {
- #if !defined BUSTAIM_DISABLE_WSTATS
- BustAim_g_AimWarningStats[playerid][BustAim_g_RandomAimShots{playerid}%BUSTAIM_WSTATS_SHOTS] = BustAim_g_DCTTL_temp;
- #endif
- if(++BustAim_g_RandomAimShots{playerid} > BUSTAIM_RANDOM_AIM_PROBES)
- {
- BustAim_g_RandomAimShots{playerid} = 0;
- #if !defined BUSTAIM_DISABLE_PROFILING
- BustAim_g_TotalRandomAimWarns[playerid][weaponid-22]++;
- #endif
- warning |= WARNING_RANDOM_AIM;
- }
- }
- }
- if(warning)
- #if defined OnPlayerSuspectedForAimbot
- if(OnPlayerSuspectedForAimbot(playerid,hitid,weaponid,warning)) BustAim_g_PlayerSettings{playerid} |= IGNORE_PLAYER;
- #endif
- }
- else
- {
- #if !defined BUSTAIM_DISABLE_PROFILING
- if(BustAim_g_ContinousShots{playerid} > BustAim_g_MaxContinousShots[playerid][weaponid-22])
- BustAim_g_MaxContinousShots[playerid][weaponid-22] = BustAim_g_ContinousShots{playerid};
- #endif
- BustAim_g_ContinousShots{playerid} =
- BustAim_g_RandomAimShots{playerid} =
- BustAim_g_TeleportShots{playerid} =
- BustAim_g_OutOfRangeShots{playerid} = 0;
- }
- #if defined BustAim_OnPlayerWeaponShot
- return BustAim_OnPlayerWeaponShot(playerid,weaponid,hittype,hitid,fX,fY,fZ);
- #else
- return 1;
- #endif
- }
- public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
- {
- if((0 <= damagedid < MAX_PLAYERS) && (0 <= weaponid < 50)) BustAim_g_IntrnlPlayerSettings{playerid} |= PREVIOUS_SHOT_DID_DAMAGE;
- #if defined BustAim_OnPlayerGiveDamage
- return BustAim_OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerWeaponShot
- #undef OnPlayerWeaponShot
- #else
- #define _ALS_OnPlayerWeaponShot
- #endif
- #define OnPlayerWeaponShot BustAim_OnPlayerWeaponShot
- #if defined BustAim_OnPlayerWeaponShot
- forward BustAim_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
- #endif
- #if defined _ALS_OnPlayerGiveDamage
- #undef OnPlayerGiveDamage
- #else
- #define _ALS_OnPlayerGiveDamage
- #endif
- #define OnPlayerGiveDamage BustAim_OnPlayerGiveDamage
- #if defined BustAim_OnPlayerGiveDamage
- forward BustAim_OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart);
- #endif
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- #if defined BUSTAIM_DISABLE_WSTATS
- stock BustAim::GetTeleportStats(playerid,Float:arr[],sz = sizeof(arr))
- {
- #pragma unused playerid
- #pragma unused arr
- #pragma unused sz
- print("[BUST-AIM] GetTeleportStats must not be used when WSTATS is disabled.");
- }
- stock BustAim::GetRandomAimStats(playerid,Float:arr[],sz = sizeof(arr))
- {
- #pragma unused playerid
- #pragma unused arr
- #pragma unused sz
- print("[BUST-AIM] GetAimStats must not be used when WSTATS is disabled.");
- }
- stock BustAim::GetRangeStats(playerid,Float:arr[],sz = sizeof(arr))
- {
- #pragma unused playerid
- #pragma unused arr
- #pragma unused sz
- print("[BUST-AIM] GetRangeStats must not be used when WSTATS is disabled.");
- }
- #else
- stock BustAim::GetTeleportStats(playerid,Float:arr[],sz = sizeof(arr))
- {
- memcpy(_:arr,_:BustAim_g_TeleportWarningStats[playerid],0,sz*4,sz);
- }
- stock BustAim::GetRandomAimStats(playerid,Float:arr[],sz = sizeof(arr))
- {
- memcpy(_:arr,_:BustAim_g_AimWarningStats[playerid],0,sz*4,sz);
- }
- stock BustAim::GetRangeStats(playerid,Float:arr[],sz = sizeof(arr))
- {
- memcpy(_:arr,_:BustAim_g_RangeWarningStats[playerid],0,sz*4,sz);
- }
- #endif
- #if defined BUSTAIM_DISABLE_PROFILING
- stock BustAim::GetPlayerWeaponProfile(playerid,weaponid,&allshots,&hitshots,&max_cont_shots,&out_of_range_warns,&random_aim_warns,&proaim_tele_warns)
- {
- #pragma unused playerid
- #pragma unused weaponid
- print("[BUST-AIM] GetPlayerWeaponProfile must not be used when profiling is disabled.");
- }
- stock BustAim::ResetPlayerWeaponProfile(playerid,weaponid)
- {
- #pragma unused playerid
- #pragma unused weaponid
- print("[BUST-AIM] ResetWeaponProfile must not be used when profiling is disabled");
- }
- stock BustAim::GetPlayerProfile(playerid,&shotsfired,&shotshit,&max_cont_shots,&out_of_range_warns,&random_aim_warns,&proaim_tele_warns)
- {
- #pragma unused playerid
- print("[BUST-AIM] GetPlayerProfile must not be used when profiling is disabled.");
- }
- stock BustAim::ResetPlayerProfile(playerid)
- {
- #pragma unused playerid
- print("[BUST-AIM] ResetPlayerProfile must not be used when profiling is disabled.");
- }
- #else
- stock BustAim::GetPlayerWeaponProfile(playerid,weaponid,&allshots,&hitshots,&max_cont_shots,&out_of_range_warns,&random_aim_warns,&proaim_tele_warns)
- {
- if(22 <= weaponid <= 39)
- {
- weaponid -= 22;
- allshots = BustAim_g_ShotsFired[playerid][weaponid];
- hitshots = BustAim_g_ShotsHit[playerid][weaponid];
- max_cont_shots = BustAim_g_MaxContinousShots[playerid][weaponid];
- out_of_range_warns = BustAim_g_TotalOutOfRangeWarns[playerid][weaponid];
- random_aim_warns = BustAim_g_TotalRandomAimWarns[playerid][weaponid];
- proaim_tele_warns = BustAim_g_TotalTeleportWarns[playerid][weaponid];
- return 0;
- }
- return 1;
- }
- stock BustAim::ResetPlayerWeaponProfile(playerid,weaponid)
- {
- if(22 <= weaponid <= 39)
- {
- weaponid -= 22;
- BustAim_g_ShotsFired[playerid][weaponid] =
- BustAim_g_ShotsHit[playerid][weaponid] =
- BustAim_g_MaxContinousShots[playerid][weaponid] =
- BustAim_g_TotalOutOfRangeWarns[playerid][weaponid] =
- BustAim_g_TotalRandomAimWarns[playerid][weaponid] =
- BustAim_g_TotalTeleportWarns[playerid][weaponid] = 0;
- return 0;
- }
- return 1;
- }
- stock BustAim::GetPlayerProfile(playerid,&shotsfired,&shotshit,&max_cont_shots,&out_of_range_warns,&random_aim_warns,&proaim_tele_warns)
- {
- for(new i = 0;i < BS_TOTAL_SHOOTING_WEAPONS;i++)
- {
- shotsfired += BustAim_g_ShotsFired[playerid][i];
- shotshit += BustAim_g_ShotsHit[playerid][i];
- out_of_range_warns += BustAim_g_TotalOutOfRangeWarns[playerid][i];
- random_aim_warns += BustAim_g_TotalRandomAimWarns[playerid][i];
- proaim_tele_warns+= BustAim_g_TotalTeleportWarns[playerid][i];
- if(BustAim_g_MaxContinousShots[playerid][i] > max_cont_shots)
- max_cont_shots = BustAim_g_MaxContinousShots[playerid][i];
- }
- return 1;
- }
- stock BustAim::ResetPlayerProfile(playerid)
- {
- Fill68(BustAim_g_TotalRandomAimWarns[playerid]);
- Fill68(BustAim_g_TotalTeleportWarns[playerid]);
- Fill68(BustAim_g_TotalOutOfRangeWarns[playerid]);
- Fill68(BustAim_g_ShotsFired[playerid]);
- Fill68(BustAim_g_ShotsHit[playerid]);
- Fill68(BustAim_g_MaxContinousShots[playerid]);
- return 0;
- }
- #endif
- stock BustAim::SetPlayerFlags(playerid,flags)
- {
- BustAim_g_PlayerSettings{playerid} = flags;
- }
- stock BustAim::GetPlayerFlags(playerid,&flags)
- {
- flags = BustAim_g_PlayerSettings{playerid};
- }
- stock BustAim::ResetPlayerFlags(playerid)
- {
- BustAim_g_PlayerSettings{playerid} = BUSTAIM_DEFAULT_PLAYER_FLAGS;
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- static stock Fill68(loc[])
- {
- new val = 0;
- #emit LOAD.S.alt loc
- #emit LOAD.S.pri val
- #emit FILL 68
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- public OnPlayerConnect(playerid)
- {
- BustAim_g_PlayerSettings{playerid} = BUSTAIM_DEFAULT_PLAYER_FLAGS;
- BustAim_g_IntrnlPlayerSettings{playerid} =
- BustAim_g_ContinousShots{playerid} =
- BustAim_g_RandomAimShots{playerid} =
- BustAim_g_TeleportShots{playerid} =
- BustAim_g_OutOfRangeShots{playerid} = 0;
- #if !defined BUSTAIM_DISABLE_PROFILING
- Fill68(BustAim_g_TotalRandomAimWarns[playerid]);
- Fill68(BustAim_g_TotalTeleportWarns[playerid]);
- Fill68(BustAim_g_TotalOutOfRangeWarns[playerid]);
- Fill68(BustAim_g_ShotsFired[playerid]);
- Fill68(BustAim_g_ShotsHit[playerid]);
- Fill68(BustAim_g_MaxContinousShots[playerid]);
- #endif
- #if defined BustAim_OnPlayerConnect
- return BustAim_OnPlayerConnect(playerid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerConnect
- #undef OnPlayerConnect
- #else
- #define _ALS_OnPlayerConnect
- #endif
- #define OnPlayerConnect BustAim_OnPlayerConnect
- #if defined BustAim_OnPlayerConnect
- forward BustAim_OnPlayerConnect(playerid);
- #endif
- #if !defined BUSTAIM_IS_PAUSED_FUNCTION
- public OnPlayerUpdate(playerid)
- {
- BustAim_g_LastUpdateTick[playerid] = GetTickCount();
- #if defined BustAim_OnPlayerUpdate
- return BustAim_OnPlayerUpdate(playerid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerUpdate
- #undef OnPlayerUpdate
- #else
- #define _ALS_OnPlayerUpdate
- #endif
- #define OnPlayerUpdate BustAim_OnPlayerUpdate
- #if defined BustAim_OnPlayerUpdate
- forward BustAim_OnPlayerUpdate(playerid);
- #endif
- #endif
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|