1
0

anticheat2.pwn 87 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350
  1. /* Anti-Cheat v2.0
  2. Slice (weapon-config.inc data from weapons.dat)
  3. Jingles (modified and added custom checks)
  4. */
  5. // add autocbug
  6. #include <YSI\y_hooks>
  7. new PLoss; // Temp. var to toggle packet loss function.
  8. // From 3DTryg Funcs By AbyssMorgan (http://forum.sa-mp.com/showthread.php?t=591010)
  9. #define GetRotationFor2Point2D(%0,%1,%2,%3,%4) (CompRotationFloat((atan2((%3)-(%1),(%2)-(%0))-90.0),(%4)))
  10. #define GetDistanceBetweenPoints3D(%1,%2,%3,%4,%5,%6) VectorSize((%1)-(%4),(%2)-(%5),(%3)-(%6))
  11. stock Float:CompRotationFloat(Float:rotation,&Float:crotation=0.0){
  12. crotation = rotation;
  13. while(crotation < 0.0) crotation += 360.0;
  14. while(crotation >= 360.0) crotation -= 360.0;
  15. return crotation;
  16. }
  17. //new code version support 3D made by Abyss Morgan
  18. stock bool:GetRotationFor2Point3D(Float:x,Float:y,Float:z,Float:tx,Float:ty,Float:tz,&Float:rx,&Float:rz){
  19. new Float:radius = GetDistanceBetweenPoints3D(x,y,z,tx,ty,tz);
  20. if(radius <= 0.0) return false;
  21. CompRotationFloat(-(acos((tz-z)/radius)-90.0),rx);
  22. CompRotationFloat((atan2(ty-y,tx-x)-90.0),rz);
  23. return true;`
  24. }
  25. // Made by Fusez
  26. stock Float:GetPlayerPacketloss(playerid) {
  27. if(PLoss == 1) return 0.0;
  28. if(!IsPlayerConnected(playerid)) return 0.0;
  29. new nstats[400+1], nstats_loss[20], start, end;
  30. GetPlayerNetworkStats(playerid, nstats, sizeof(nstats));
  31. start = strfind(nstats,"packetloss",true);
  32. end = strfind(nstats,"%",true,start);
  33. strmid(nstats_loss, nstats, start+12, end, sizeof(nstats_loss));
  34. return floatstr(nstats_loss);
  35. }
  36. enum E_SHOT_INFO {
  37. acl_Tick,
  38. acl_Weapon,
  39. acl_HitType,
  40. acl_HitId,
  41. acl_Hits,
  42. Float:acl_fPos[3],
  43. Float:acl_fTargetPos[3],
  44. Float:acl_fOrigin[3],
  45. Float:acl_fHitPos[3],
  46. Float:acl_fDistance,
  47. bool:acl_Valid,
  48. }
  49. static ac_LastUpdate[MAX_PLAYERS] = {-1, ...};
  50. static ac_RejectedHitsIdx[MAX_PLAYERS];
  51. static ac_iCBugFreeze[MAX_PLAYERS];
  52. static arrLastBulletData[MAX_PLAYERS][E_SHOT_INFO];
  53. static ac_LastBulletIdx[MAX_PLAYERS];
  54. static ac_LastBulletTicks[MAX_PLAYERS][10];
  55. static ac_LastBulletWeapons[MAX_PLAYERS][10];
  56. static ac_LastExplosive[MAX_PLAYERS];
  57. static ac_LastHitTicks[MAX_PLAYERS][10];
  58. static ac_LastHitWeapons[MAX_PLAYERS][10];
  59. static ac_LastHitIdx[MAX_PLAYERS];
  60. static Float:ac_PlayerMaxHealth[MAX_PLAYERS] = {100.0, ...};
  61. // Max continuous shots.
  62. static ac_MaxWeaponContShots[] = {
  63. 0, // 0 - Fist
  64. 0, // 1 - Brass knuckles
  65. 0, // 2 - Golf club
  66. 0, // 3 - Nitestick
  67. 0, // 4 - Knife
  68. 0, // 5 - Bat
  69. 0, // 6 - Shovel
  70. 0, // 7 - Pool cue
  71. 0, // 8 - Katana
  72. 0, // 9 - Chainsaw
  73. 0, // 10 - Dildo
  74. 0, // 11 - Dildo 2
  75. 0, // 12 - Vibrator
  76. 0, // 13 - Vibrator 2
  77. 0, // 14 - Flowers
  78. 0, // 15 - Cane
  79. 0, // 16 - Grenade
  80. 0, // 17 - Teargas
  81. 0, // 18 - Molotov
  82. 0, // 19 - Vehicle M4 (custom)
  83. 0, // 20 - Vehicle minigun (custom)
  84. 0, // 21
  85. 10, // 22 - Colt 45
  86. 10, // 23 - Silenced
  87. 10, // 24 - Deagle
  88. 10, // 25 - Shotgun
  89. 20, // 26 - Sawed-off
  90. 20, // 27 - Spas
  91. 30, // 28 - UZI
  92. 30, // 29 - MP5
  93. 30, // 30 - AK47
  94. 30, // 31 - M4
  95. 30, // 32 - Tec9
  96. 10, // 33 - Cuntgun
  97. 10, // 34 - Sniper
  98. 0, // 35 - Rocket launcher
  99. 0, // 36 - Heatseeker
  100. 0, // 37 - Flamethrower
  101. 400, // 38 - Minigun
  102. 0, // 39 - Satchel
  103. 0, // 40 - Detonator
  104. 0, // 41 - Spraycan
  105. 0, // 42 - Fire extinguisher
  106. 0, // 43 - Camera
  107. 0, // 44 - Night vision
  108. 0, // 45 - Infrared
  109. 0, // 46 - Parachute
  110. 0, // 47 - Fake pistol
  111. 0 // 48 - Pistol whip (custom)
  112. };
  113. // The default weapon range (from weapon.dat)
  114. // Note that due to various bugs, these can be exceeded, but
  115. // this include blocks out-of-range values.
  116. static Float:ac_WeaponRange[] = {
  117. 0.0, // 0 - Fist
  118. 0.0, // 1 - Brass knuckles
  119. 0.0, // 2 - Golf club
  120. 0.0, // 3 - Nitestick
  121. 0.0, // 4 - Knife
  122. 0.0, // 5 - Bat
  123. 0.0, // 6 - Shovel
  124. 0.0, // 7 - Pool cue
  125. 0.0, // 8 - Katana
  126. 0.0, // 9 - Chainsaw
  127. 0.0, // 10 - Dildo
  128. 0.0, // 11 - Dildo 2
  129. 0.0, // 12 - Vibrator
  130. 0.0, // 13 - Vibrator 2
  131. 0.0, // 14 - Flowers
  132. 0.0, // 15 - Cane
  133. 0.0, // 16 - Grenade
  134. 0.0, // 17 - Teargas
  135. 0.0, // 18 - Molotov
  136. 90.0, // 19 - Vehicle M4 (custom)
  137. 75.0, // 20 - Vehicle minigun (custom)
  138. 0.0, // 21
  139. 35.0, // 22 - Colt 45
  140. 35.0, // 23 - Silenced
  141. 35.0, // 24 - Deagle
  142. 40.0, // 25 - Shotgun
  143. 35.0, // 26 - Sawed-off
  144. 40.0, // 27 - Spas
  145. 35.0, // 28 - UZI
  146. 45.0, // 29 - MP5
  147. 70.0, // 30 - AK47
  148. 90.0, // 31 - M4
  149. 35.0, // 32 - Tec9
  150. 100.0, // 33 - Cuntgun
  151. 320.0, // 34 - Sniper
  152. 0.0, // 35 - Rocket launcher
  153. 0.0, // 36 - Heatseeker
  154. 0.0, // 37 - Flamethrower
  155. 75.0 // 38 - Minigun
  156. };
  157. enum {
  158. HIT_NO_DAMAGEDID,
  159. HIT_INVALID_WEAPON,
  160. HIT_LAST_SHOT_INVALID,
  161. HIT_MULTIPLE_PLAYERS,
  162. HIT_MULTIPLE_PLAYERS_SHOTGUN,
  163. HIT_DYING_PLAYER,
  164. HIT_SAME_TEAM,
  165. HIT_UNSTREAMED,
  166. HIT_INVALID_HITTYPE,
  167. HIT_BEING_RESYNCED,
  168. HIT_NOT_SPAWNED,
  169. HIT_OUT_OF_RANGE,
  170. HIT_TOO_FAR_FROM_SHOT,
  171. SHOOTING_RATE_TOO_FAST,
  172. SHOOTING_RATE_TOO_FAST_MULTIPLE,
  173. HIT_RATE_TOO_FAST,
  174. HIT_RATE_TOO_FAST_MULTIPLE,
  175. HIT_KNIFE_FAILED,
  176. HIT_TOO_FAR_FROM_ORIGIN,
  177. HIT_INVALID_DAMAGE,
  178. HIT_SAME_VEHICLE,
  179. HIT_OWN_VEHICLE,
  180. HIT_INVALID_VEHICLE,
  181. HIT_DISCONNECTED
  182. }
  183. // Must be in sync with the enum above
  184. // Used in debug messages and GetRejectedHit
  185. stock const g_HitRejectReasons[][] = {
  186. "None or invalid player shot",
  187. "Invalid weapon",
  188. "Last shot invalid",
  189. "One bullet hit %d players",
  190. "Hit too many players with shotgun: %d",
  191. "Hit a dying player",
  192. "Hit a teammate",
  193. "Hit someone that can't see you (not streamed in)",
  194. "Invalid hit type: %d",
  195. "Hit while being resynced",
  196. "Hit when not spawned or dying",
  197. "Hit out of range (%f > %f)",
  198. "Hit player too far from hit position (dist %f)",
  199. "Shooting rate too fast: %d (%d samples, max %d)",
  200. "Shooting rate too fast: %d (%d samples, multiple weapons)",
  201. "Hit rate too fast: %d (%d samples, max %d)",
  202. "Hit rate too fast: %d (%d samples, multiple weapons)",
  203. "The knife kill did not sync",
  204. "Damage inflicted too far from current position (dist %f)",
  205. "Invalid weapon damage (%.4f)",
  206. "Hit a player in the same vehicle",
  207. "Hit the vehicle you're in",
  208. "Hit invalid vehicle: %d",
  209. "Hit a disconnected player ID: %d"
  210. };
  211. stock const g_WeaponName[57][59] = {
  212. {"Fist" }, {"Brass knuckles"}, {"Golf club" },
  213. {"Nightstick" }, {"Knife" }, {"Bat" },
  214. {"Shovel" }, {"Pool cue" }, {"Katana" },
  215. {"Chainsaw" }, {"Purple dildo" }, {"Dildo" },
  216. {"Vibrator" }, {"Vibrator" }, {"Flowers" },
  217. {"Cane" }, {"Grenade" }, {"Tear gas" },
  218. {"Molotov" }, {"Vehicle gun" }, {"Vehicle gun" },
  219. {"" }, {"Colt 45" }, {"Silenced pistol" },
  220. {"Deagle" }, {"Shotgun" }, {"Sawn-off shotgun" },
  221. {"Combat shotgun" }, {"Mac-10" }, {"MP5" },
  222. {"AK-47" }, {"M4" }, {"Tec-9" },
  223. {"Cuntgun" }, {"Sniper" }, {"Rocket launcher" },
  224. {"Heat seeking RPG" }, {"Flamethrower" }, {"Minigun" },
  225. {"Satchel" }, {"Detonator" }, {"Spraycan" },
  226. {"Fire extinguisher"}, {"Camera" }, {"Night vision goggles"},
  227. {"Infrared goggles" }, {"Parachute" }, {"Fake pistol" },
  228. {"Pistol whip" }, {"Vehicle" }, {"Helicopter blades" },
  229. {"Explosion" }, {"Car parking" }, {"Drowning" },
  230. {"Collision" }, {"Splat" }, {"Unknown" }
  231. };
  232. stock const ac_ACNames[][] = {
  233. "Aimbot",
  234. "(Auto) C-Bug",
  235. "Silent Aim",
  236. "Pro-Aim",
  237. "Range Hacks",
  238. "Speed Hacks",
  239. "Vehicle Hacks",
  240. "Command Spamming",
  241. "Car Surfing",
  242. "Ninja Jacking",
  243. "Ghost Hacks",
  244. "Name Tags",
  245. "Airbreaking",
  246. "Infinite Stamina",
  247. "Health/Armor Hacks",
  248. "Dialog Spoofing",
  249. "Rejected Hits (view-only)",
  250. "Desync"
  251. };
  252. // #define AC_DEBUG
  253. #define HACKTIMER_INTERVAL 5000
  254. #define BODY_PART_UNKNOWN 0
  255. #define WEAPON_UNARMED 0
  256. #define WEAPON_VEHICLE_M4 19
  257. #define WEAPON_VEHICLE_MINIGUN 20
  258. #define WEAPON_PISTOLWHIP 48
  259. #define WEAPON_HELIBLADES 50
  260. #define WEAPON_EXPLOSION 51
  261. #define WEAPON_CARPARK 52
  262. #define WEAPON_UNKNOWN 55
  263. #define AC_MAX_REJECTED_HITS 15
  264. #define AC_MAX_DAMAGE_RANGES 5
  265. enum e_WeaponDataAC {
  266. ac_iBulletsFired[46],
  267. ac_iBulletsHit[46],
  268. ac_iFakeMiss[46]
  269. }
  270. new arrWeaponDataAC[MAX_PLAYERS][e_WeaponDataAC];
  271. enum e_WeaponData {
  272. ac_DamageRangeSteps,
  273. Float:ac_WeaponDamage,
  274. Float:ac_DamageRangeRanges[AC_MAX_DAMAGE_RANGES],
  275. Float:ac_DamageRangeValues[AC_MAX_DAMAGE_RANGES]
  276. }
  277. new arrWeaponData[55][e_WeaponData];
  278. // Given in AC_OnRejectedHit
  279. enum E_REJECTED_HIT {
  280. acr_iReason,
  281. acr_iTime,
  282. acr_iWeaponID,
  283. acr_szName[MAX_PLAYER_NAME],
  284. acr_iDamagedID,
  285. acr_iInfo[3]
  286. }
  287. new arrRejectedHitData[MAX_PLAYERS][AC_MAX_REJECTED_HITS][E_REJECTED_HIT];
  288. new ac_iSilentAimWarnings[MAX_PLAYERS],
  289. ac_iSilentAimWarnings2[MAX_PLAYERS],
  290. ac_iSilentAimWarnings3[MAX_PLAYERS],
  291. ac_iSilentAimTick[MAX_PLAYERS],
  292. ac_iGhostHackWarnings[MAX_PLAYERS],
  293. ac_iPlayerKeySpam[MAX_PLAYERS],
  294. ac_iVehicleDriverID[MAX_PLAYERS],
  295. ac_iLastVehicleID[MAX_PLAYERS],
  296. ac_TotalShots[MAX_PLAYERS],
  297. ac_HitsIssued[MAX_PLAYERS],
  298. bool:ac_IsDead[MAX_PLAYERS],
  299. bool:ac_BeingResynced[MAX_PLAYERS],
  300. iShotVariance = 5;
  301. ptask HackCheck_Micro[1000](playerid) {
  302. if(PlayerInfo[playerid][pAdmin] < 2)
  303. {
  304. if(IsSpawned[playerid] && gPlayerLogged{playerid} && playerTabbed[playerid] < 1) {
  305. if(ac_ACToggle[AC_AIRBREAKING] && AC_AirBreaking(playerid)) AC_Process(playerid, AC_AIRBREAKING);
  306. /* Reset arrPAntiCheat bits that were set in callback wrappers */
  307. Bit_Off(arrPAntiCheat[playerid], ac_bitValidPlayerPos);
  308. Bit_Off(arrPAntiCheat[playerid], ac_bitValidSpectating);
  309. }
  310. }
  311. }
  312. ptask HackCheck[HACKTIMER_INTERVAL](playerid) {
  313. DeletePVar(playerid, "ACCooldown");
  314. arrAntiCheat[playerid][ac_iCommandCount] = 0;
  315. ac_iPlayerKeySpam[playerid] = 0;
  316. arrAntiCheat[playerid][ac_iSpeed] = GetPlayerSpeed(playerid);
  317. ac_iSilentAimWarnings[playerid] = 0;
  318. ac_iSilentAimWarnings2[playerid] = 0;
  319. ac_iSilentAimWarnings3[playerid] = 0;
  320. ac_iGhostHackWarnings[playerid] = 0;
  321. if(PlayerInfo[playerid][pAdmin] < 2)
  322. {
  323. if(IsSpawned[playerid] && gPlayerLogged{playerid} && playerTabbed[playerid] < 1) {
  324. if(ac_ACToggle[AC_CARSURFING] && AC_IsPlayerSurfing(playerid)) AC_Process(playerid, AC_CARSURFING, INVALID_PLAYER_ID);
  325. if(ac_ACToggle[AC_HEALTHARMORHACKS] && AC_PlayerHealthArmor(playerid)) AC_Process(playerid, AC_HEALTHARMORHACKS, INVALID_PLAYER_ID);
  326. if(ac_ACToggle[AC_INFINITESTAMINA] && AC_InfiniteStamina(playerid)) AC_Process(playerid, AC_INFINITESTAMINA);
  327. }
  328. }
  329. }
  330. timer AC_RevivePlayer[5000](playerid) {
  331. format(szMiscArray, sizeof(szMiscArray), "SYSTEM: %s(%d) has been revived by [SYSTEM]", GetPlayerNameEx(playerid), GetPlayerSQLId(playerid), GetPlayerNameEx(playerid));
  332. Log("logs/system.log", szMiscArray);
  333. KillEMSQueue(playerid);
  334. ClearAnimationsEx(playerid);
  335. SetHealth(playerid, 100);
  336. }
  337. timer AC_ResetPVars[2000](playerid, processid) {
  338. switch(processid) {
  339. case 0: {
  340. ac_iLastVehicleID[playerid] = INVALID_VEHICLE_ID;
  341. }
  342. case 1: {
  343. DeletePVar(playerid, "PCMute");
  344. }
  345. }
  346. }
  347. timer AC_ResetAnim[2000](playerid) {
  348. ClearAnimationsEx(playerid, 1);
  349. }
  350. hook OnGameModeInit() {
  351. for(new i = 1; i < sizeof(ac_ACToggle); ++i) ac_ACToggle[i] = false;
  352. /* Default On: */
  353. ac_ACToggle[AC_NINJAJACK] = true;
  354. ac_ACToggle[AC_DIALOGSPOOFING] = true;
  355. AC_InitWeaponData();
  356. }
  357. /*
  358. CMD:rehashpareas(playerid, params[]) {
  359. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  360. if(!ac_ACToggle[AC_NAMETAGS]) return SendClientMessageEx(playerid, COLOR_GRAD1, "This feature isn't enabled in /system.");
  361. new iRange;
  362. if(sscanf(params, "d", iRange)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /resetpareas [range]");
  363. if(!(0 < iRange < 70)) return SendClientMessageEx(playerid, COLOR_GRAD1, "Invalid range (between 0 and 70).");
  364. new szData[2];
  365. szData[0] = STREAMER_AREATYPE_PLAYERAREA; // to make sure we can recognize this as a player area type.
  366. foreach(new i : Player) {
  367. foreach(new x : Player) if(!IsPlayerInDynamicArea(x, arrAntiCheat[i][ac_iPlayerAreaID])) ShowPlayerNameTagForPlayer(x, i, false);
  368. szData[1] = i;
  369. DestroyDynamicArea(arrAntiCheat[i][ac_iPlayerAreaID]);
  370. arrAntiCheat[i][ac_iPlayerAreaID] = CreateDynamicSphere(0.0, 0.0, 0.0, iRange);
  371. AttachDynamicAreaToPlayer(arrAntiCheat[i][ac_iPlayerAreaID], i, 0.0, 0.0, 0.0);
  372. Streamer_SetArrayData(STREAMER_TYPE_AREA, arrAntiCheat[i][ac_iPlayerAreaID], E_STREAMER_EXTRA_ID, szData, sizeof(szData));
  373. }
  374. format(szMiscArray, sizeof(szMiscArray), "%s set the player nametag distance to %d meters.", GetPlayerNameEx(playerid), iRange);
  375. ABroadCast(COLOR_YELLOW, szMiscArray, 2 );
  376. return 1;
  377. }
  378. */
  379. /*
  380. CMD:setnametagdistance(playerid, params[]) {
  381. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  382. new iRange;
  383. if(sscanf(params, "d", iRange)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /setnametagdistance [range]");
  384. if(!(0 < iRange < 70)) return SendClientMessageEx(playerid, COLOR_GRAD1, "Invalid range (between 0 and 70).");
  385. new szData[2];
  386. szData[0] = STREAMER_AREATYPE_PLAYERAREA; // to make sure we can recognize this as a player area type.
  387. foreach(new i : Player) {
  388. szData[1] = i;
  389. DestroyDynamicArea(arrAntiCheat[i][ac_iPlayerAreaID]);
  390. arrAntiCheat[i][ac_iPlayerAreaID] = CreateDynamicSphere(0.0, 0.0, 0.0, iRange);
  391. AttachDynamicAreaToPlayer(arrAntiCheat[i][ac_iPlayerAreaID], i, 0.0, 0.0, 0.0);
  392. Streamer_SetArrayData(STREAMER_TYPE_AREA, arrAntiCheat[i][ac_iPlayerAreaID], E_STREAMER_EXTRA_ID, szData, sizeof(szData));
  393. }
  394. format(szMiscArray, sizeof(szMiscArray), "You set the nametag distance to %d meters.", iRange);
  395. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  396. return 1;
  397. }
  398. */
  399. hook OnPlayerConnect(playerid) {
  400. /*
  401. new szData[2];
  402. szData[0] = STREAMER_AREATYPE_PLAYERAREA; // to make sure we can recognize this as a player area type.
  403. szData[1] = playerid;
  404. arrAntiCheat[playerid][ac_iPlayerAreaID] = CreateDynamicSphere(0.0, 0.0, 0.0, 25.0);
  405. AttachDynamicAreaToPlayer(arrAntiCheat[playerid][ac_iPlayerAreaID], playerid, 0.0, 0.0, 0.0);
  406. Streamer_SetArrayData(STREAMER_TYPE_AREA, arrAntiCheat[playerid][ac_iPlayerAreaID], E_STREAMER_EXTRA_ID, szData, sizeof(szData));
  407. if(ac_ACToggle[AC_NAMETAGS]) {
  408. foreach(new i : Player) {
  409. if(!IsPlayerInDynamicArea(playerid, arrAntiCheat[i][ac_iPlayerAreaID])) {
  410. ShowPlayerNameTagForPlayer(i, playerid, false); // So people don't see the playerid when they shouldn't
  411. ShowPlayerNameTagForPlayer(playerid, i, false); // So the player doesn't see the others when they shouldn't
  412. }
  413. }
  414. }
  415. */
  416. new iTick = GetTickCount();
  417. arrAntiCheat[playerid][ac_iVehID] = INVALID_VEHICLE_ID;
  418. arrAntiCheat[playerid][ac_iShots][0] = 0;
  419. arrAntiCheat[playerid][ac_iShots][1] = 0;
  420. arrAntiCheat[playerid][ac_fPos][0] = 0;
  421. arrAntiCheat[playerid][ac_fPos][1] = 0;
  422. arrAntiCheat[playerid][ac_fPos][2] = 0;
  423. arrAntiCheat[playerid][ac_fCamPos][0] = 0;
  424. arrAntiCheat[playerid][ac_fCamPos][1] = 0;
  425. arrAntiCheat[playerid][ac_fCamPos][2] = 0;
  426. arrAntiCheat[playerid][ac_fCamPos][3] = 0;
  427. arrAntiCheat[playerid][ac_fCamPos][4] = 0;
  428. arrAntiCheat[playerid][ac_fCamPos][5] = 0;
  429. arrAntiCheat[playerid][ac_fCamFVector][0] = 0;
  430. arrAntiCheat[playerid][ac_fCamFVector][1] = 0;
  431. arrAntiCheat[playerid][ac_fCamFVector][2] = 0;
  432. arrAntiCheat[playerid][ac_fCamFVector][3] = 0;
  433. arrAntiCheat[playerid][ac_fCamFVector][4] = 0;
  434. arrAntiCheat[playerid][ac_fCamFVector][5] = 0;
  435. arrAntiCheat[playerid][ac_fPlayerAngle][0] = 0;
  436. arrAntiCheat[playerid][ac_fPlayerAngle][1] = 0;
  437. arrAntiCheat[playerid][ac_iLastTargetID] = INVALID_PLAYER_ID;
  438. arrAntiCheat[playerid][ac_fAimAccuracy] = 0;
  439. for(new i; i < AC_MAX; ++i) arrAntiCheat[playerid][ac_iFlags][i] = 0;
  440. arrAntiCheat[playerid][ac_iCommandCount] = 0;
  441. //if(IsValidDynamicArea(arrAntiCheat[playerid][ac_iPlayerAreaID])) DestroyDynamicArea(arrAntiCheat[playerid][ac_iPlayerAreaID]);
  442. arrAntiCheat[playerid][ac_fProbability] = 0;
  443. arrAntiCheat[playerid][ac_iCheatingIndex][0] = 0;
  444. arrAntiCheat[playerid][ac_iCheatingIndex][1] = 0;
  445. arrAntiCheat[playerid][ac_iIsCheating] = false;
  446. arrAntiCheat[playerid][ac_inTrainingMode] = false;
  447. Bit_Off(arrPAntiCheat[playerid], ac_bitValidPlayerPos);
  448. Bit_Off(arrPAntiCheat[playerid], ac_bitValidSpectating);
  449. ac_LastUpdate[playerid] = iTick;
  450. ac_PlayerMaxHealth[playerid] = 100.0;
  451. ac_LastExplosive[playerid] = 0;
  452. ac_LastBulletIdx[playerid] = 0;
  453. ac_LastHitIdx[playerid] = 0;
  454. ac_RejectedHitsIdx[playerid] = 0;
  455. ac_TotalShots[playerid] = 0;
  456. ac_HitsIssued[playerid] = 0;
  457. ac_IsDead[playerid] = false;
  458. ac_iCBugFreeze[playerid] = 0;
  459. arrLastBulletData[playerid][acl_Tick] = 0;
  460. arrLastBulletData[playerid][acl_Weapon] = 0;
  461. arrLastBulletData[playerid][acl_HitType] = HIT_INVALID_HITTYPE;
  462. arrLastBulletData[playerid][acl_HitId] = INVALID_PLAYER_ID;
  463. arrLastBulletData[playerid][acl_fPos][0] = 0;
  464. arrLastBulletData[playerid][acl_fPos][1] = 0;
  465. arrLastBulletData[playerid][acl_fPos][2] = 0;
  466. arrLastBulletData[playerid][acl_fTargetPos][0] = 0;
  467. arrLastBulletData[playerid][acl_fTargetPos][1] = 0;
  468. arrLastBulletData[playerid][acl_fTargetPos][2] = 0;
  469. arrLastBulletData[playerid][acl_fOrigin][0] = 0;
  470. arrLastBulletData[playerid][acl_fOrigin][1] = 0;
  471. arrLastBulletData[playerid][acl_fOrigin][2] = 0;
  472. arrLastBulletData[playerid][acl_fHitPos][0] = 0;
  473. arrLastBulletData[playerid][acl_fHitPos][1] = 0;
  474. arrLastBulletData[playerid][acl_fHitPos][2] = 0;
  475. arrLastBulletData[playerid][acl_fDistance] = 0;
  476. arrLastBulletData[playerid][acl_Hits] = 0;
  477. for (new i; i < 46; i++) {
  478. arrWeaponDataAC[playerid][ac_iBulletsFired][i] = 0;
  479. arrWeaponDataAC[playerid][ac_iBulletsHit][i] = 0;
  480. arrWeaponDataAC[playerid][ac_iFakeMiss][i] = 0;
  481. }
  482. for (new i; i < sizeof(arrRejectedHitData[]); i++) {
  483. arrRejectedHitData[playerid][i][acr_iTime] = 0;
  484. }
  485. ac_iSilentAimWarnings[playerid] = 0;
  486. ac_iSilentAimWarnings2[playerid] = 0;
  487. ac_iSilentAimWarnings3[playerid] = 0;
  488. ac_iSilentAimTick[playerid] = 0;
  489. ac_iGhostHackWarnings[playerid] = 0;
  490. }
  491. /*
  492. hook OnPlayerDisconnect(playerid, reason) {
  493. if(IsValidDynamicArea(arrAntiCheat[playerid][ac_iPlayerAreaID])) DestroyDynamicArea(arrAntiCheat[playerid][ac_iPlayerAreaID]);
  494. //if(IsValidDynamic3DTextLabel(PlayerLabel[playerid])) DestroyDynamic3DTextLabel(PlayerLabel[playerid]);
  495. }
  496. */
  497. /*
  498. hook OnPlayerEnterDynamicArea(playerid, areaid) {
  499. if(ac_ACToggle[AC_NAMETAGS]) {
  500. new szData[2];
  501. Streamer_GetArrayData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, szData, sizeof(szData));
  502. if(szData[0] == STREAMER_AREATYPE_PLAYERAREA) ShowPlayerNameTagForPlayer(playerid, szData[1], 1);
  503. }
  504. }
  505. hook OnPlayerLeaveDynamicArea(playerid, areaid) {
  506. if(ac_ACToggle[AC_NAMETAGS]) {
  507. new szData[2];
  508. Streamer_GetArrayData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, szData, sizeof(szData));
  509. if(szData[0] == STREAMER_AREATYPE_PLAYERAREA) ShowPlayerNameTagForPlayer(playerid, szData[1], 0);
  510. }
  511. }
  512. */
  513. /*
  514. hook OnPlayerCommandReceived(playerid, cmdtext[]) {
  515. arrAntiCheat[playerid][ac_iCommandCount]++;
  516. switch(arrAntiCheat[playerid][ac_iCommandCount]) {
  517. case 0 .. 9: {}
  518. case 10 .. 15: {
  519. AC_Process(playerid, AC_CMDSPAM, arrAntiCheat[playerid][ac_iCommandCount]);
  520. return 0;
  521. }
  522. default: {
  523. AC_Process(playerid, AC_CMDSPAM, arrAntiCheat[playerid][ac_iCommandCount]);
  524. return 0;
  525. }
  526. }
  527. return 1;
  528. }
  529. */
  530. hook OnPlayerUpdate(playerid) {
  531. if(ac_ACToggle[AC_SPEEDHACKS]) AC_SpeedHacks(playerid);
  532. if(IsPlayerInAnyVehicle(playerid)){
  533. if(GetPlayerVehicleID(playerid) != arrAntiCheat[playerid][ac_iVehID]) {
  534. arrAntiCheat[playerid][ac_iVehID] = INVALID_VEHICLE_ID;
  535. new Float:fPos[3];
  536. GetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]);
  537. SetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]+1);
  538. AC_Process(playerid, AC_VEHICLEHACKS);
  539. }
  540. }
  541. ac_LastUpdate[playerid] = GetTickCount();
  542. return 1;
  543. }
  544. hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
  545. if(newkeys == KEY_YES) ac_iPlayerKeySpam[playerid]++;
  546. if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) {
  547. if(newkeys & KEY_FIRE) {
  548. new weaponid = GetPlayerWeapon(playerid);
  549. switch (weaponid) {
  550. case WEAPON_BOMB, WEAPON_SATCHEL: ac_LastExplosive[playerid] = WEAPON_SATCHEL;
  551. case WEAPON_ROCKETLAUNCHER, WEAPON_HEATSEEKER, WEAPON_GRENADE: ac_LastExplosive[playerid] = weaponid;
  552. }
  553. }
  554. if(newkeys & KEY_CROUCH) {
  555. if(IsPlayerInAnyVehicle(playerid) || GetPVarType(playerid, "EventToken") || (GetPVarType(playerid, "IsInArena") && PaintBallArena[GetPVarInt(playerid, "IsInArena")][pbExploitPerm] == 1)) return 1;
  556. new iTick = GetTickCount(),
  557. iDiff = iTick - arrLastBulletData[playerid][acl_Tick];
  558. if(arrLastBulletData[playerid][acl_Tick] && iDiff < 1200 && !ac_iCBugFreeze[playerid]) {
  559. AC_Process(playerid, AC_CBUG);
  560. ac_iCBugFreeze[playerid] = GetTickCount();
  561. }
  562. }
  563. }
  564. return 1;
  565. }
  566. hook OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
  567. if(!ispassenger) ac_iVehicleDriverID[playerid] = GetDriverID(vehicleid);
  568. arrAntiCheat[playerid][ac_iVehID] = vehicleid;
  569. }
  570. hook OnPlayerStateChange(playerid, newstate, oldstate) {
  571. if(newstate == PLAYER_STATE_DRIVER) ac_iLastVehicleID[playerid] = GetPlayerVehicleID(playerid);
  572. if(oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT) defer AC_ResetPVars(playerid, 0);
  573. }
  574. hook OnPlayerSpawn(playerid) {
  575. ac_LastUpdate[playerid] = GetTickCount();
  576. if(ac_IsDead[playerid]) ac_IsDead[playerid] = false;
  577. }
  578. hook OnPlayerDeath(playerid, killerid, reason) {
  579. ac_IsDead[playerid] = true;
  580. new iKillerID = GetDriverID(ac_iLastVehicleID[playerid]),
  581. iKillerVehID = GetPlayerVehicleID(iKillerID);
  582. if(iKillerID != INVALID_PLAYER_ID) {
  583. if(ac_iVehicleDriverID[iKillerID] == playerid || (iKillerVehID == ac_iLastVehicleID[playerid] && iKillerVehID != INVALID_VEHICLE_ID)) {
  584. new Float:fPos[3];
  585. GetPlayerPos(iKillerID, fPos[0], fPos[1], fPos[2]);
  586. if(IsPlayerInRangeOfPoint(playerid, 15.0, fPos[0], fPos[1], fPos[2]) && GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(iKillerID)) {
  587. AC_Process(playerid, AC_NINJAJACK, iKillerID);
  588. }
  589. }
  590. }
  591. }
  592. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  593. if(arrAntiCheat[playerid][ac_iFlags][AC_DIALOGSPOOFING] > 0) return 1;
  594. switch(dialogid) {
  595. case DIALOG_AC_MAIN: {
  596. if(response) {
  597. if(ac_ACToggle[listitem]) {
  598. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM] %s turned off the %s detection.", GetPlayerNameEx(playerid), ac_ACNames[listitem]);
  599. ac_ACToggle[listitem] = false;
  600. }
  601. else {
  602. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM] %s turned on the %s detection.", GetPlayerNameEx(playerid), ac_ACNames[listitem]);
  603. ac_ACToggle[listitem] = true;
  604. }
  605. Log("logs/ACSystem.log", szMiscArray);
  606. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  607. }
  608. }
  609. }
  610. return 0;
  611. }
  612. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) {
  613. szMiscArray[0] = 0;
  614. if(IsPlayerPaused(playerid) && ac_iGhostHackWarnings[playerid] > 5) AC_Process(playerid, AC_GHOSTHACKS, weaponid);
  615. if(!IsCorrectCameraMode(playerid)) AC_Process(playerid, AC_DESYNC, GetPlayerCameraMode(playerid));
  616. new vehmodel = GetVehicleModel(GetPlayerVehicleID(playerid));
  617. if(hittype == BULLET_HIT_TYPE_PLAYER && (BadFloat(fX) || BadFloat(fY) || BadFloat(fZ))) {
  618. Kick(playerid); // CRASHER DETECTED
  619. return 0;
  620. }
  621. if(weaponid == WEAPON_SILENCED && pTazer{playerid} == 1) {
  622. new iShots = GetPVarInt(playerid, "TazerShots");
  623. if(iShots > 0) {
  624. SetPVarInt(playerid, "TazerShots", iShots - 1);
  625. }
  626. if(iShots < 1) {
  627. TazerTimeout[playerid] = 12;
  628. SetTimerEx("TazerTimer",1000,false,"d",playerid);
  629. SendClientMessageEx(playerid, COLOR_WHITE, "Your tazer is recharging!");
  630. RemovePlayerWeapon(playerid, 23);
  631. GivePlayerValidWeapon(playerid, pTazerReplace{playerid});
  632. format(szMiscArray, sizeof(szMiscArray), "* %s holsters their tazer.", GetPlayerNameEx(playerid));
  633. ProxDetector(4.0, playerid, szMiscArray, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
  634. pTazer{playerid} = 0;
  635. }
  636. }
  637. if(GetPVarInt(playerid, "EventToken") == 0 && !GetPVarType(playerid, "IsInArena") && (vehmodel != 425 && vehmodel != 432 && vehmodel != 447 && vehmodel != 464 && vehmodel != 476 && vehmodel != 520) && GetWeaponSlot(weaponid) != -1) {
  638. if(PlayerInfo[playerid][pGuns][GetWeaponSlot(weaponid)] != weaponid) return 1;
  639. }
  640. if(hittype == BULLET_HIT_TYPE_PLAYER) {
  641. if(!IsPlayerStreamedIn(playerid, hitid) || !IsPlayerStreamedIn(hitid, playerid)) return 0;
  642. }
  643. if(weaponid == 24 || weaponid == 25 || weaponid == 26/* || weaponid == 31*/) {
  644. ++PlayerShots[playerid];
  645. }
  646. if(weaponid == 34) {
  647. ++PlayerSniperShots[playerid];
  648. }
  649. /* if(GetPVarInt(playerid, "FireStart") == 1) {
  650. if(fX != 0 && fY != 0 && hittype != BULLET_HIT_TYPE_PLAYER && hittype != BULLET_HIT_TYPE_VEHICLE) {
  651. if(gettime() > GetPVarInt(playerid, "fCooldown")) CreateStructureFire(fX, fY, fZ, GetPlayerVirtualWorld(playerid));
  652. }
  653. }
  654. */
  655. #if defined AC_DEBUG
  656. if(hittype == BULLET_HIT_TYPE_PLAYER) {
  657. AC_SendDebugMessage(playerid, "OnPlayerWeaponShot(%s shot %s with %s at %f, %f, %f) ", GetPlayerNameEx(playerid), GetPlayerNameEx(hitid), AC_GetWeaponName(weaponid), fX, fY, fZ);
  658. }
  659. else if(hittype) {
  660. AC_SendDebugMessage(playerid, "OnPlayerWeaponShot(%s shot %s %d with %s at %f, %f, %f", GetPlayerNameEx(playerid), GetPlayerNameEx(hitid), AC_GetWeaponName(weaponid), fX, fY, fZ);
  661. }
  662. else {
  663. AC_SendDebugMessage(playerid, "OnPlayerWeaponShot(%s shot with %s at %f, %f, %f)", GetPlayerNameEx(playerid), AC_GetWeaponName(weaponid), fX, fY, fZ);
  664. }
  665. #endif
  666. arrLastBulletData[playerid][acl_Valid] = false;
  667. arrLastBulletData[playerid][acl_Hits] = false;
  668. // C-Bug
  669. if(ac_iCBugFreeze[playerid] && GetTickCount() - ac_iCBugFreeze[playerid] < 900) {
  670. return 0;
  671. }
  672. ac_iCBugFreeze[playerid] = 0;
  673. // Desync
  674. new damagedid = INVALID_PLAYER_ID;
  675. if(hittype == BULLET_HIT_TYPE_PLAYER && hitid != INVALID_PLAYER_ID) {
  676. if(!IsPlayerConnected(hitid)) {
  677. AC_AddRejectedHit(playerid, hitid, HIT_DISCONNECTED, weaponid, hittype);
  678. return 0;
  679. }
  680. damagedid = hitid;
  681. }
  682. // Invalid hit type
  683. if(hittype < 0 || hittype > 4) {
  684. AC_AddRejectedHit(playerid, damagedid, HIT_INVALID_HITTYPE, weaponid, hittype);
  685. return 0;
  686. }
  687. // Hitting when player isn't spawned.
  688. if(!IsPlayerSpawned(playerid)) {
  689. AC_AddRejectedHit(playerid, damagedid, HIT_NOT_SPAWNED, weaponid, hittype);
  690. return 0;
  691. }
  692. // Just in case
  693. if(!IsBulletWeapon(weaponid)) {
  694. AC_AddRejectedHit(playerid, damagedid, HIT_INVALID_WEAPON, weaponid, hittype);
  695. return 0;
  696. }
  697. new Float:fOriginX, Float:fOriginY, Float:fOriginZ, Float:fHitPosX, Float:fHitPosY, Float:fHitPosZ,
  698. Float:x, Float:y, Float:z;
  699. GetPlayerPos(playerid, x, y, z);
  700. GetPlayerLastShotVectors(playerid, fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ);
  701. new Float:fDistance = VectorSize(fOriginX - fHitPosX, fOriginY - fHitPosY, fOriginZ - fHitPosZ),
  702. Float:origin_dist = VectorSize(fOriginX - x, fOriginY - y, fOriginZ - z);
  703. if(origin_dist > 15.0) {
  704. new iVehCheck = IsPlayerInAnyVehicle(hitid) || GetPlayerSurfingVehicleID(playerid);
  705. if((!iVehCheck && GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID) || origin_dist > 50.0) {
  706. AC_AddRejectedHit(playerid, damagedid, HIT_TOO_FAR_FROM_ORIGIN, weaponid, _:origin_dist);
  707. return 0;
  708. }
  709. }
  710. // Bullet range check.
  711. if(hittype != BULLET_HIT_TYPE_NONE) {
  712. if(fDistance > ac_WeaponRange[weaponid] + 10.0) {
  713. if(hittype == BULLET_HIT_TYPE_PLAYER) {
  714. AC_AddRejectedHit(playerid, damagedid, HIT_OUT_OF_RANGE, weaponid, _:fDistance, _:ac_WeaponRange[weaponid]);
  715. }
  716. return 0;
  717. }
  718. if(hittype == BULLET_HIT_TYPE_PLAYER) {
  719. if(IsPlayerInAnyVehicle(playerid) && GetPlayerVehicleID(playerid) == GetPlayerVehicleID(hitid)) {
  720. AC_AddRejectedHit(playerid, damagedid, HIT_SAME_VEHICLE, weaponid);
  721. return 0;
  722. }
  723. new Float:fHitDist = GetPlayerDistanceFromPoint(hitid, fHitPosX, fHitPosY, fHitPosZ),
  724. iVehCheck = IsPlayerInAnyVehicle(hitid);
  725. if ((!iVehCheck && fHitDist > 20.0) || fHitDist > 50.0) {
  726. AC_AddRejectedHit(playerid, damagedid, HIT_TOO_FAR_FROM_SHOT, weaponid, _:fHitDist);
  727. return 0;
  728. }
  729. }
  730. }
  731. new iTick = GetTickCount();
  732. if(iTick == 0) iTick = 1;
  733. new idx = (ac_LastBulletIdx[playerid] + 1) % sizeof(ac_LastBulletTicks[]);
  734. // JIT plugin fix
  735. if (idx < 0) {
  736. idx += sizeof(ac_LastBulletTicks[]);
  737. }
  738. ac_LastBulletIdx[playerid] = idx;
  739. ac_LastBulletTicks[playerid][idx] = iTick;
  740. ac_LastBulletWeapons[playerid][idx] = weaponid;
  741. ac_TotalShots[playerid]++;
  742. /* LOG FUNCTIONS */
  743. arrLastBulletData[playerid][acl_Tick] = GetTickCount();
  744. arrLastBulletData[playerid][acl_Weapon] = weaponid;
  745. arrLastBulletData[playerid][acl_HitType] = hittype;
  746. arrLastBulletData[playerid][acl_HitId] = hitid;
  747. arrLastBulletData[playerid][acl_fPos][0] = fX;
  748. arrLastBulletData[playerid][acl_fPos][1] = fY;
  749. arrLastBulletData[playerid][acl_fPos][2] = fZ;
  750. if(hitid != INVALID_PLAYER_ID) {
  751. arrLastBulletData[playerid][acl_fTargetPos][0] = fHitPosX;
  752. arrLastBulletData[playerid][acl_fTargetPos][1] = fHitPosY;
  753. arrLastBulletData[playerid][acl_fTargetPos][2] = fHitPosZ;
  754. }
  755. arrLastBulletData[playerid][acl_fOrigin][0] = fOriginX;
  756. arrLastBulletData[playerid][acl_fOrigin][1] = fOriginY;
  757. arrLastBulletData[playerid][acl_fOrigin][2] = fOriginZ;
  758. arrLastBulletData[playerid][acl_fHitPos][0] = fHitPosX;
  759. arrLastBulletData[playerid][acl_fHitPos][1] = fHitPosY;
  760. arrLastBulletData[playerid][acl_fHitPos][2] = fHitPosZ;
  761. arrLastBulletData[playerid][acl_fDistance] = fDistance;
  762. arrLastBulletData[playerid][acl_Hits] = 0;
  763. /*
  764. AimBot check 2 and:
  765. Pro Aim Check by Pottus
  766. Reference: http://forum.sa-mp.com/showpost.php?p=3038425
  767. */
  768. if(hittype == BULLET_HIT_TYPE_PLAYER) {
  769. if(!playerTabbed[hitid]) {
  770. /*
  771. Too many false positives.
  772. if(GetPlayerSpeed(hitid) > 3) {
  773. arrAntiCheat[playerid][ac_iShots][1]++;
  774. if(arrAntiCheat[playerid][ac_iShots][1] > ac_MaxWeaponContShots[weaponid] + 15) AC_Process(playerid, AC_AIMBOT, weaponid);
  775. }
  776. */
  777. if(ac_ACToggle[3]) {
  778. if(ProAimCheck(playerid, hitid)) {
  779. arrAntiCheat[playerid][ac_iFlags][3]++;
  780. if(arrAntiCheat[playerid][ac_iFlags][3] > 3) AC_Flag(playerid, AC_PROAIM, weaponid, arrAntiCheat[playerid][ac_iFlags][3]);
  781. }
  782. }
  783. }
  784. else arrAntiCheat[playerid][ac_iShots][1] = 0;
  785. }
  786. // AimBot Player Scheme
  787. arrWeaponDataAC[playerid][ac_iBulletsFired][weaponid]++;
  788. if(hittype == BULLET_HIT_TYPE_PLAYER && ac_MaxWeaponContShots[weaponid] && !IsPlayerPaused(hitid)) {
  789. if(!playerTabbed[hitid]) {
  790. new fSpeed = GetPlayerSpeed(hitid);
  791. if(fSpeed > 5) { // subject to discussion
  792. arrWeaponDataAC[playerid][ac_iBulletsHit][weaponid]++;
  793. //if(!(++arrAntiCheat[playerid][ac_iShots][0] % ac_MaxWeaponContShots[weaponid])) AC_Process(playerid, AC_AIMBOT, weaponid);
  794. new iRelevantMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][weaponid] - arrWeaponDataAC[playerid][ac_iBulletsHit][weaponid] - arrWeaponDataAC[playerid][ac_iFakeMiss][weaponid],
  795. Float:fRatio;
  796. iRelevantMiss++; // Can't divide by 0.
  797. fRatio = arrWeaponDataAC[playerid][ac_iBulletsHit][weaponid] / iRelevantMiss;
  798. if(arrWeaponDataAC[playerid][ac_iBulletsFired][weaponid] > 50 && fRatio > 3) AC_Flag(playerid, AC_AIMBOT, weaponid, fRatio);
  799. }
  800. else arrWeaponDataAC[playerid][ac_iFakeMiss][weaponid]++;
  801. }
  802. }
  803. else arrAntiCheat[playerid][ac_iShots][0] = 0; // reset it when missed :)
  804. return 1;
  805. }
  806. ProAimCheck(playerid, hitid) {
  807. new
  808. Float: fOrigin[3],
  809. Float: fHit[3];
  810. GetPlayerLastShotVectors(playerid, fOrigin[0], fOrigin[1], fOrigin[2], fHit[0], fHit[1], fHit[2]);
  811. new Float:fPlayerHitPos[3];
  812. GetPlayerPos(hitid, fPlayerHitPos[0], fPlayerHitPos[1], fPlayerHitPos[2]);
  813. new Float:fDistance = GetPlayerDistanceFromPoint(hitid, fHit[0], fHit[1], fHit[2]);
  814. if(fDistance >= iShotVariance && fDistance <= 300.0) return 1;
  815. return 0;
  816. }
  817. AC_SpeedHacks(playerid) {
  818. new iSpeed = GetPlayerSpeed(playerid),
  819. Float:fVel[3];
  820. if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT && GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID && GetPlayerSpecialAction(playerid) != SPECIAL_ACTION_USEJETPACK && iSpeed > 45) {
  821. GetPlayerVelocity(playerid, fVel[0], fVel[1], fVel[2]);
  822. if(fVel[2] == 0) {
  823. if(GetPlayerPacketloss(playerid) < 0.3) AC_Process(playerid, AC_SPEEDHACKS);
  824. }
  825. }
  826. }
  827. AC_InfiniteStamina(playerid) {
  828. if(arrAntiCheat[playerid][ac_iSpeed] > 24) arrAntiCheat[playerid][ac_iFlags][AC_INFINITESTAMINA]++;
  829. else arrAntiCheat[playerid][ac_iFlags][AC_INFINITESTAMINA] = 0;
  830. // Subject to discussion (HACKTIMER_INTERVAL * NUMBER = 5 seconds * 8 = 40 seconds running faster than 24).
  831. if(arrAntiCheat[playerid][ac_iFlags][AC_INFINITESTAMINA] > 8) return 1;
  832. return 0;
  833. }
  834. AC_AirBreaking(i) {
  835. if(GetPlayerSurfingVehicleID(i) != INVALID_VEHICLE_ID) return 0;
  836. new Float:fPos[3],
  837. iDistance;
  838. GetPlayerPos(i, fPos[0], fPos[1], fPos[2]);
  839. if(arrAntiCheat[i][ac_fPos][0] == 0.0 || arrAntiCheat[i][ac_fPos][1] == 0.0 || arrAntiCheat[i][ac_fPos][2] == 0.0 ||
  840. Bit_State(arrPAntiCheat[i], ac_bitValidPlayerPos) || Bit_State(arrPAntiCheat[i], ac_bitValidSpectating) || GetPlayerState(i) == PLAYER_STATE_SPECTATING) {
  841. arrAntiCheat[i][ac_fPos][0] = fPos[0];
  842. arrAntiCheat[i][ac_fPos][1] = fPos[1];
  843. arrAntiCheat[i][ac_fPos][2] = fPos[2];
  844. return 0;
  845. }
  846. iDistance = floatround(GetDistanceBetweenPoints(fPos[0], fPos[1], fPos[2], arrAntiCheat[i][ac_fPos][0], arrAntiCheat[i][ac_fPos][1], arrAntiCheat[i][ac_fPos][2]));
  847. arrAntiCheat[i][ac_fPos][0] = fPos[0];
  848. arrAntiCheat[i][ac_fPos][1] = fPos[1];
  849. arrAntiCheat[i][ac_fPos][2] = fPos[2];
  850. #if defined AC_DEBUG
  851. format(szMiscArray, sizeof(szMiscArray), "Distance: %d (%f, %f, %f, %f, %f, %f)", iDistance, fPos[0], fPos[1], fPos[2], arrAntiCheat[i][ac_fPos][0], arrAntiCheat[i][ac_fPos][1], arrAntiCheat[i][ac_fPos][2]);
  852. SendClientMessage(i, 0xFFFFFFFF, szMiscArray);
  853. #endif
  854. new iSpeed = GetPlayerSpeed(i);
  855. if(IsPlayerInAnyVehicle(i)) {
  856. #if defined AC_DEBUG
  857. format(szMiscArray, sizeof(szMiscArray), "VEH SPEED: %d", iSpeed);
  858. SendClientMessage(i, 0xFFFFFFFF, szMiscArray);
  859. #endif
  860. if(iSpeed < 0.2 && iDistance > iSpeed + 30) return 1;
  861. }
  862. else {
  863. #if defined AC_DEBUG
  864. format(szMiscArray, sizeof(szMiscArray), "FOOT SPEED: %d", iSpeed);
  865. SendClientMessage(i, 0xFFFFFFFF, szMiscArray);
  866. #endif
  867. if(iDistance > iSpeed + 30) return 1;
  868. }
  869. return 0;
  870. }
  871. hook OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) {
  872. if((!IsPlayerStreamedIn(playerid, damagedid) && !IsPlayerPaused(damagedid)) || !IsPlayerStreamedIn(damagedid, playerid)) {
  873. AC_AddRejectedHit(playerid, damagedid, HIT_UNSTREAMED, weaponid, damagedid);
  874. return 0;
  875. }
  876. if(!IsPlayerSpawned(playerid)) {
  877. // OnPlayerWeaponShot copy prevention.
  878. if(!IsBulletWeapon(weaponid) || arrLastBulletData[playerid][acl_Valid]) {
  879. AC_AddRejectedHit(playerid, damagedid, HIT_NOT_SPAWNED, weaponid);
  880. }
  881. return 0;
  882. }
  883. new iTick = GetTickCount();
  884. if(iTick == 0) iTick = 1;
  885. new idx = (ac_LastHitIdx[playerid] + 1) % sizeof(ac_LastHitTicks[]);
  886. // JIT plugin fix
  887. if (idx < 0) {
  888. idx += sizeof(ac_LastHitTicks[]);
  889. }
  890. ac_LastHitIdx[playerid] = idx;
  891. ac_LastHitTicks[playerid][idx] = iTick;
  892. ac_LastHitWeapons[playerid][idx] = weaponid;
  893. ac_HitsIssued[playerid] += 1;
  894. if(IsBulletWeapon(weaponid) && !IsPlayerPaused(damagedid)) {
  895. new Float:fPos[3];
  896. GetPlayerPos(damagedid, fPos[0], fPos[1], fPos[2]);
  897. new Float:fDistance = GetPlayerDistanceFromPoint(playerid, fPos[0], fPos[1], fPos[2]);
  898. if(fDistance > ac_WeaponRange[weaponid] + 2.0) {
  899. AC_AddRejectedHit(playerid, damagedid, HIT_OUT_OF_RANGE, weaponid, _:fDistance, _:ac_WeaponRange[weaponid]);
  900. AC_Process(playerid, AC_RANGEHACKS, weaponid);
  901. return 0;
  902. }
  903. }
  904. if(ac_ACToggle[AC_SILENTAIM]) {
  905. // Anti Silent-Aim (Jingles)
  906. if(GetPlayerPacketloss(playerid) < 0.5 && GetPlayerPacketloss(damagedid) < 0.5) {
  907. if(GetTickCount() - ac_iSilentAimTick[playerid] > 50) {
  908. ac_iSilentAimTick[playerid] = GetTickCount();
  909. if(GetPlayerSpecialAction(playerid) != SPECIAL_ACTION_USEJETPACK) {
  910. if(!IsPlayerInAnyVehicle(damagedid)) {
  911. if(20 < weaponid < 35 || weaponid > 54) {
  912. new szWeapon[32],
  913. iCameraMode = GetPlayerCameraMode(playerid);
  914. GetWeaponName(weaponid, szWeapon, 32);
  915. // Pro Aim
  916. new Float:fOriginX,
  917. Float:fOriginY,
  918. Float:fOriginZ,
  919. Float:fHitPosX,
  920. Float:fHitPosY,
  921. Float:fHitPosZ,
  922. Float:fDistance;
  923. GetPlayerLastShotVectors(playerid, fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ);
  924. fDistance = GetPlayerDistanceFromPoint(damagedid, fHitPosX, fHitPosY, fHitPosZ);
  925. if(iCameraMode != 4 && iCameraMode != 55) {
  926. if(GetPlayerTargetPlayer(playerid) != damagedid) {
  927. ac_iSilentAimWarnings[playerid]++;
  928. if(ac_iSilentAimWarnings[playerid] > 10) {
  929. AC_Process(playerid, AC_SILENTAIM, weaponid, damagedid, 1);
  930. }
  931. }
  932. if(fDistance <= 0.1) {
  933. ac_iSilentAimWarnings2[playerid]++;
  934. if(ac_iSilentAimWarnings2[playerid] > 4) {
  935. AC_Process(playerid, AC_SILENTAIM, weaponid, damagedid, 2);
  936. }
  937. }
  938. else ac_iSilentAimWarnings2[playerid] = 0;
  939. if(weaponid != 28 && weaponid != 32) {
  940. new Float:fPos[3],
  941. Float:fAngle[2];
  942. if(fDistance < 100)
  943. {
  944. GetRotationFor2Point2D(fOriginX, fOriginY, fHitPosX, fHitPosY, fAngle[0]);
  945. GetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]);
  946. GetPlayerFacingAngle(playerid, fAngle[1]);
  947. new Float:fDifference;
  948. fDifference = floatabs((360 - fAngle[1]) - (360 - fAngle[0]));
  949. if(fDifference > 10) {
  950. ac_iSilentAimWarnings3[playerid]++;
  951. if(ac_iSilentAimWarnings3[playerid] > 3) {
  952. AC_Process(playerid, AC_SILENTAIM, weaponid, damagedid, 3);
  953. }
  954. }
  955. }
  956. }
  957. }
  958. // ProAim
  959. /*
  960. if(fDistance >= MAX_SHOT_VARIANCE && fDistance < 300.0) {
  961. ac_iSilentAimWarnings[playerid]++;
  962. if(ac_iSilentAimWarnings[playerid] > 5) {
  963. format(szMiscArray, sizeof(szMiscArray), "%s is using pro aim (%d).", GetPlayerNameExt(playerid), ac_iSilentAimWarnings[playerid]);
  964. SendClientMessageToAll(COLOR_YELLOW, szMiscArray);
  965. }
  966. }
  967. */
  968. }
  969. }
  970. }
  971. }
  972. }
  973. }
  974. return 0;
  975. }
  976. // Is called after OnPlayerWeaponShot
  977. hook OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart) {
  978. // Ignore unreliable and invalid damage
  979. if(playerid == INVALID_PLAYER_ID) return 0;
  980. // Carjack damage
  981. if(weaponid == 54 && _:amount == _:0.0) {
  982. // SendClientMessageToAll(0xFFFFFFFF, "NJ?");
  983. return 0;
  984. }
  985. // Climb bug
  986. if(weaponid == WEAPON_COLLISION) {
  987. new iAnimIdx = GetPlayerAnimationIndex(playerid);
  988. if(1061 <= iAnimIdx <= 1067) {
  989. // AC_SendDebugMessage(playerid, "Climb bug.");
  990. return 0;
  991. }
  992. }
  993. //AC_InflictDamage(playerid, amount, issuerid, weaponid, bodypart); // Server Sided Health
  994. return 1;
  995. }
  996. stock AC_InitWeaponData() {
  997. // Default weapon.dat
  998. arrWeaponData[0][ac_WeaponDamage] = 1.0; // 0 - Fist
  999. arrWeaponData[1][ac_WeaponDamage] = 1.0; // 1 - Brass knuckles
  1000. arrWeaponData[2][ac_WeaponDamage] = 1.0; // 2 - Golf club
  1001. arrWeaponData[3][ac_WeaponDamage] = 1.0; // 3 - Nitestick
  1002. arrWeaponData[4][ac_WeaponDamage] = 1.0; // 4 - Knife
  1003. arrWeaponData[5][ac_WeaponDamage] = 1.0; // 5 - Bat
  1004. arrWeaponData[6][ac_WeaponDamage] = 1.0; // 6 - Shovel
  1005. arrWeaponData[7][ac_WeaponDamage] = 1.0; // 7 - Pool cue
  1006. arrWeaponData[8][ac_WeaponDamage] = 1.0; // 8 - Katana
  1007. arrWeaponData[9][ac_WeaponDamage] = 1.0; // 9 - Chainsaw
  1008. arrWeaponData[10][ac_WeaponDamage] = 1.0; // 10 - Dildo
  1009. arrWeaponData[11][ac_WeaponDamage] = 1.0; // 11 - Dildo 2
  1010. arrWeaponData[12][ac_WeaponDamage] = 1.0; // 12 - Vibrator
  1011. arrWeaponData[13][ac_WeaponDamage] = 1.0; // 13 - Vibrator 2
  1012. arrWeaponData[14][ac_WeaponDamage] = 1.0; // 14 - Flowers
  1013. arrWeaponData[15][ac_WeaponDamage] = 1.0; // 15 - Cane
  1014. arrWeaponData[16][ac_WeaponDamage] = 82.5; // 16 - Grenade
  1015. arrWeaponData[17][ac_WeaponDamage] = 0.0; // 17 - Teargas
  1016. arrWeaponData[18][ac_WeaponDamage] = 1.0; // 18 - Molotov
  1017. arrWeaponData[19][ac_WeaponDamage] = 9.9; // 19 - Vehicle M4 (custom)
  1018. arrWeaponData[20][ac_WeaponDamage] = 46.2; // 20 - Vehicle minigun (custom)
  1019. arrWeaponData[21][ac_WeaponDamage] = 0.0; // 21
  1020. arrWeaponData[22][ac_WeaponDamage] = 8.25; // 22 - Colt 45
  1021. arrWeaponData[23][ac_WeaponDamage] = 13.2; // 23 - Silenced
  1022. arrWeaponData[24][ac_WeaponDamage] = 46.2; // 24 - Deagle
  1023. arrWeaponData[25][ac_WeaponDamage] = 3.3; // 25 - Shotgun
  1024. arrWeaponData[26][ac_WeaponDamage] = 3.3; // 26 - Sawed-off
  1025. arrWeaponData[27][ac_WeaponDamage] = 4.95; // 27 - Spas
  1026. arrWeaponData[28][ac_WeaponDamage] = 6.6; // 28 - UZI
  1027. arrWeaponData[29][ac_WeaponDamage] = 8.25; // 29 - MP5
  1028. arrWeaponData[30][ac_WeaponDamage] = 9.9; // 30 - AK47
  1029. arrWeaponData[31][ac_WeaponDamage] = 9.9; // 31 - M4
  1030. arrWeaponData[32][ac_WeaponDamage] = 6.6; // 32 - Tec9
  1031. arrWeaponData[33][ac_WeaponDamage] = 24.75; // 33 - Cuntgun
  1032. arrWeaponData[34][ac_WeaponDamage] = 41.25; // 34 - Sniper
  1033. arrWeaponData[35][ac_WeaponDamage] = 82.5; // 35 - Rocket launcher
  1034. arrWeaponData[36][ac_WeaponDamage] = 82.5; // 36 - Heatseeker
  1035. arrWeaponData[37][ac_WeaponDamage] = 1.0; // 37 - Flamethrower
  1036. arrWeaponData[38][ac_WeaponDamage] = 46.2; // 38 - Minigun
  1037. arrWeaponData[39][ac_WeaponDamage] = 82.5; // 39 - Satchel
  1038. arrWeaponData[40][ac_WeaponDamage] = 0.0; // 40 - Detonator
  1039. arrWeaponData[41][ac_WeaponDamage] = 0.33; // 41 - Spraycan
  1040. arrWeaponData[42][ac_WeaponDamage] = 0.33; // 42 - Fire extinguisher
  1041. arrWeaponData[43][ac_WeaponDamage] = 0.0; // 43 - Camera
  1042. arrWeaponData[44][ac_WeaponDamage] = 0.0; // 44 - Night vision
  1043. arrWeaponData[45][ac_WeaponDamage] = 0.0;// 45 - Infrared
  1044. arrWeaponData[46][ac_WeaponDamage] = 0.0; // 46 - Parachute
  1045. arrWeaponData[47][ac_WeaponDamage] = 0.0; // 47 - Fake pistol
  1046. arrWeaponData[48][ac_WeaponDamage] = 2.64; // 48 - Pistol whip (custom)
  1047. arrWeaponData[49][ac_WeaponDamage] = 9.9; // 49 - Vehicle
  1048. arrWeaponData[50][ac_WeaponDamage] = 330.0; // 50 - Helicopter blades
  1049. arrWeaponData[51][ac_WeaponDamage] = 82.5; // 51 - Explosion
  1050. arrWeaponData[52][ac_WeaponDamage] = 1.0; // 52 - Car park (custom)
  1051. arrWeaponData[53][ac_WeaponDamage] = 1.0; // 53 - Drowning
  1052. arrWeaponData[54][ac_WeaponDamage] = 165.0; // 54 - Splat
  1053. }
  1054. stock AC_AddRejectedHit(playerid, damagedid, reason, weapon, inf0 = 0, inf1 = 0, inf2 = 0) {
  1055. new idx = ac_RejectedHitsIdx[playerid];
  1056. if (arrRejectedHitData[playerid][idx][acr_iTime]) {
  1057. idx += 1;
  1058. if (idx >= sizeof(arrRejectedHitData[])) {
  1059. idx = 0;
  1060. }
  1061. ac_RejectedHitsIdx[playerid] = idx;
  1062. }
  1063. arrRejectedHitData[playerid][idx][acr_iReason] = reason;
  1064. arrRejectedHitData[playerid][idx][acr_iTime] = gettime();
  1065. arrRejectedHitData[playerid][idx][acr_iWeaponID] = weapon;
  1066. arrRejectedHitData[playerid][idx][acr_iDamagedID] = damagedid;
  1067. arrRejectedHitData[playerid][idx][acr_iInfo][0] = inf0;
  1068. arrRejectedHitData[playerid][idx][acr_iInfo][2] = inf1;
  1069. arrRejectedHitData[playerid][idx][acr_iInfo][2] = inf2;
  1070. if (damagedid != INVALID_PLAYER_ID) {
  1071. GetPlayerName(damagedid, arrRejectedHitData[playerid][idx][acr_szName], MAX_PLAYER_NAME);
  1072. }
  1073. else {
  1074. arrRejectedHitData[playerid][idx][acr_szName][0] = '#';
  1075. arrRejectedHitData[playerid][idx][acr_szName][1] = '\0';
  1076. }
  1077. }
  1078. /*stock IsPlayerPaused(playerid) {
  1079. return (GetTickCount() - ac_LastUpdate[playerid] > 2000);
  1080. }*/
  1081. stock IsPlayerSpawned(playerid) {
  1082. if(ac_IsDead[playerid] || ac_BeingResynced[playerid]) {
  1083. return false;
  1084. }
  1085. switch (GetPlayerState(playerid)) {
  1086. case PLAYER_STATE_ONFOOT .. PLAYER_STATE_PASSENGER, PLAYER_STATE_SPAWNED: return true;
  1087. }
  1088. return false;
  1089. }
  1090. forward Float:AngleBetweenPoints(Float:x1, Float:y1, Float:x2, Float:y2);
  1091. stock Float:AngleBetweenPoints(Float:x1, Float:y1, Float:x2, Float:y2) {
  1092. return -(90.0 - atan2(y1 - y2, x1 - x2));
  1093. }
  1094. forward GetPlayerSpeed(i);
  1095. stock GetPlayerSpeed(i) {
  1096. new Float:fVel[3],
  1097. iSpeed;
  1098. if(IsPlayerInAnyVehicle(i)) GetVehicleVelocity(GetPlayerVehicleID(i), fVel[0], fVel[1], fVel[2]);
  1099. else GetPlayerVelocity(i, fVel[0], fVel[1], fVel[2]);
  1100. iSpeed = floatround(floatsqroot(((fVel[0]*fVel[0])+(fVel[1]*fVel[1]))+(fVel[2]*fVel[2])) * 136.666667, floatround_round);
  1101. return iSpeed;
  1102. }
  1103. stock GetDriverID(iVehID) {
  1104. if(iVehID == INVALID_VEHICLE_ID) return INVALID_PLAYER_ID;
  1105. foreach(new i : Player) {
  1106. if(GetPlayerVehicleID(i) == iVehID && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
  1107. }
  1108. return INVALID_PLAYER_ID;
  1109. }
  1110. AC_Flag(playerid, processid, iExtraID = INVALID_PLAYER_ID, Float:fInfo = 0.0) {
  1111. switch(processid) {
  1112. case AC_PROAIM: {
  1113. new iInfo = floatround(fInfo);
  1114. if(iInfo > 6) AC_Process(playerid, AC_PROAIM, iExtraID);
  1115. else {
  1116. format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}AimBot - I flagged %s for using pro-aim (%dx) with their %s.", GetPlayerNameEx(playerid), iInfo, AC_GetWeaponName(iExtraID));
  1117. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1118. }
  1119. }
  1120. case AC_AIMBOT: {
  1121. if(fInfo > 20) AC_Process(playerid, AC_AIMBOT, iExtraID);
  1122. else {
  1123. format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}AimBot - I flagged %s for a high hit-ratio (%.1f) with their %s.", GetPlayerNameEx(playerid), fInfo, AC_GetWeaponName(iExtraID));
  1124. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1125. }
  1126. }
  1127. }
  1128. }
  1129. AC_Process(playerid, processid, iExtraID = INVALID_PLAYER_ID, iExtraID2 = -1, iExtraID3 = -1) {
  1130. if(PlayerInfo[playerid][pAdmin] > 1 && PlayerInfo[playerid][pTogReports] == 0) return 1;
  1131. if(!ac_ACToggle[processid]) return 1;
  1132. arrAntiCheat[playerid][ac_iFlags][processid]++;
  1133. if(GetPVarType(playerid, "ACCooldown") && GetPVarInt(playerid, "ACCooldown") == processid) return 1;
  1134. SetPVarInt(playerid, "ACCooldown", processid);
  1135. //if(arrAntiCheat[playerid][ac_iFlags][processid] == 1 || arrAntiCheat[playerid][ac_iFlags][processid] % 5 == 0) { // prevent spamming
  1136. {
  1137. new szQuery[512];
  1138. szMiscArray[0] = 0;
  1139. switch(processid) {
  1140. case AC_AIMBOT: {
  1141. format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is using Aimbot", GetPlayerNameEx(playerid));
  1142. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1143. new iTotalMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID],
  1144. iRelevantMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] - arrWeaponDataAC[playerid][ac_iFakeMiss][iExtraID];
  1145. iRelevantMiss++; // Can't divide by 0;
  1146. new Float:fRatio = arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] / iRelevantMiss;
  1147. format(szQuery, sizeof(szQuery), "INSERT INTO `ac` (`DBID`, `timestamp`, `type`, `flags`, `extraid`, `totalfired`, `hits`, `rmisses`, `tmisses`, `ratio`) VALUES (%d, NOW(), %d, %d, %d, %d, %d, %d, %d, %.1f)",
  1148. PlayerInfo[playerid][pId], processid, arrAntiCheat[playerid][ac_iFlags][processid], iExtraID, arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID], arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID], iRelevantMiss, iTotalMiss, fRatio);
  1149. mysql_tquery(MainPipeline, szQuery, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1150. return 1;
  1151. }
  1152. case AC_CBUG: {
  1153. PlayerPlaySound(playerid, 1055, 0.0, 0.0, 0.0);
  1154. if(arrLastBulletData[playerid][acl_Valid] && floatabs(arrLastBulletData[playerid][acl_fHitPos][0]) > 1.0 && floatabs(arrLastBulletData[playerid][acl_fPos][1]) > 1.0) {
  1155. SetPlayerFacingAngle(playerid, AngleBetweenPoints(
  1156. arrLastBulletData[playerid][acl_fPos][0],
  1157. arrLastBulletData[playerid][acl_fPos][1],
  1158. arrLastBulletData[playerid][acl_fOrigin][0],
  1159. arrLastBulletData[playerid][acl_fOrigin][1]
  1160. ));
  1161. }
  1162. new w, a;
  1163. GetPlayerWeaponData(playerid, 0, w, a);
  1164. ClearAnimationsEx(playerid, 1);
  1165. ApplyAnimation(playerid, "PED", "IDLE_stance", 4.1, 0, 0, 0, 0, 0, 1);
  1166. defer AC_ResetAnim(playerid);
  1167. GivePlayerWeapon(playerid, w, 0);
  1168. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: Please do not C-Bug / CS.");
  1169. return 1;
  1170. }
  1171. case AC_SILENTAIM: {
  1172. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM]: %s (%d) used Silent Aim (detector %d) on %s (%d) with a %s (warnings: %d).", GetPlayerNameExt(playerid), PlayerInfo[playerid][pId], iExtraID3, GetPlayerNameExt(iExtraID2), PlayerInfo[iExtraID2][pId], AC_GetWeaponName(iExtraID), arrAntiCheat[playerid][ac_iFlags][processid]);
  1173. Log("logs/anticheat.log", szMiscArray);
  1174. /*
  1175. if(arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] > 0) {
  1176. new iTotalMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID],
  1177. iRelevantMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] - arrWeaponDataAC[playerid][ac_iFakeMiss][iExtraID];
  1178. iRelevantMiss++; // Can't divide by 0;
  1179. new Float:fRatio = arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] / iRelevantMiss;
  1180. format(szQuery, sizeof(szQuery), "INSERT INTO `ac` (`DBID`, `timestamp`, `type`, `flags`, `extraid`, `totalfired`, `hits`, `rmisses`, `tmisses`, `ratio`) VALUES (%d, NOW(), %d, %d, %d, %d, %d, %d, %d, %.1f)",
  1181. PlayerInfo[playerid][pId], processid, arrAntiCheat[playerid][ac_iFlags][processid], iExtraID, arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID], arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID], iRelevantMiss, iTotalMiss, fRatio);
  1182. mysql_tquery(MainPipeline, szQuery, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1183. }
  1184. */
  1185. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You were kicked for being desynced.");
  1186. SetTimerEx("KickEx", 1000, 0, "i", playerid);
  1187. format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is using Silent Aim (detector %d) on %s with a %s (warnings: %d).", GetPlayerNameExt(playerid), iExtraID3, GetPlayerNameExt(iExtraID2), AC_GetWeaponName(iExtraID), arrAntiCheat[playerid][ac_iFlags][processid]);
  1188. }
  1189. case AC_PROAIM: {
  1190. format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is using Pro-Aim.", GetPlayerNameEx(playerid));
  1191. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1192. new iTotalMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID],
  1193. iRelevantMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] - arrWeaponDataAC[playerid][ac_iFakeMiss][iExtraID];
  1194. iRelevantMiss++; // Can't divide by 0;
  1195. new Float:fRatio = arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] / iRelevantMiss;
  1196. format(szQuery, sizeof(szQuery), "INSERT INTO `ac` (`DBID`, `timestamp`, `type`, `flags`, `extraid`, `totalfired`, `hits`, `rmisses`, `tmisses`, `ratio`) VALUES (%d, NOW(), %d, %d, %d, %d, %d, %d, %d, %.1f)",
  1197. PlayerInfo[playerid][pId], processid, arrAntiCheat[playerid][ac_iFlags][processid], iExtraID, arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID], arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID], iRelevantMiss, iTotalMiss, fRatio);
  1198. mysql_tquery(MainPipeline, szQuery, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1199. if(arrAntiCheat[playerid][ac_iFlags][processid] > 15) {
  1200. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You were kicked for being desynced.");
  1201. SetTimerEx("KickEx", 1000, 0, "i", playerid);
  1202. }
  1203. return 1;
  1204. }
  1205. case AC_RANGEHACKS: {
  1206. format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is using range-hacks.", GetPlayerNameEx(playerid));
  1207. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1208. new iTotalMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID],
  1209. iRelevantMiss = arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID] - arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] - arrWeaponDataAC[playerid][ac_iFakeMiss][iExtraID];
  1210. iRelevantMiss++; // Can't divide by 0;
  1211. new Float:fRatio = arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID] / iRelevantMiss;
  1212. format(szQuery, sizeof(szQuery), "INSERT INTO `ac` (`DBID`, `timestamp`, `type`, `flags`, `extraid`, `totalfired`, `hits`, `rmisses`, `tmisses`, `ratio`) VALUES (%d, NOW(), %d, %d, %d, %d, %d, %d, %d, %.1f)",
  1213. PlayerInfo[playerid][pId], processid, arrAntiCheat[playerid][ac_iFlags][processid], iExtraID, arrWeaponDataAC[playerid][ac_iBulletsFired][iExtraID], arrWeaponDataAC[playerid][ac_iBulletsHit][iExtraID], iRelevantMiss, iTotalMiss, fRatio);
  1214. mysql_tquery(MainPipeline, szQuery, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1215. return 1;
  1216. }
  1217. case AC_SPEEDHACKS: format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is using speed hacks (B2, B5)", GetPlayerNameEx(playerid));
  1218. case AC_VEHICLEHACKS: format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is using vehicle hacks.", GetPlayerNameEx(playerid));
  1219. case AC_CMDSPAM: {
  1220. if(iExtraID > 15) {
  1221. SendClientMessageEx(playerid, COLOR_YELLOW, "You are muted from submitting commands.");
  1222. format(szMiscArray, sizeof(szMiscArray), "{AA3333}AdmWarning{FFFF00}: %s is spamming commands (%d times).", GetPlayerNameEx(playerid), arrAntiCheat[playerid][ac_iCommandCount]);
  1223. }
  1224. else return SendClientMessageEx(playerid, COLOR_YELLOW, "You are muted from submitting commands.");
  1225. }
  1226. case AC_CARSURFING: {
  1227. new Float:fPos[3];
  1228. GetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]);
  1229. SetPlayerPos(playerid, fPos[0] + 1.0, fPos[1] + 1.0, fPos[2]);
  1230. PlayAnimEx(playerid, "PED", "BIKE_fallR", 4.1, 0, 1, 1, 1, 0, 1);
  1231. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: Please do not car surf.");
  1232. return 1;
  1233. }
  1234. case AC_NINJAJACK: {
  1235. defer AC_RevivePlayer(playerid);
  1236. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You will be revived from the ninja-jacking in a few seconds.");
  1237. SendClientMessageEx(iExtraID, COLOR_LIGHTRED, "[SYSTEM]: You were caught plausibly ninja-jacking. Admins were warned.");
  1238. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM]: %s has plausibly ninja-jacked %s.", GetPlayerNameEx(iExtraID), GetPlayerNameEx(playerid));
  1239. }
  1240. case AC_AIRBREAKING: format(szMiscArray, sizeof(szMiscArray), "{AA3333}[SYSTEM]: {FFFF00}%s is AirBreaking.", GetPlayerNameEx(playerid));
  1241. case AC_HEALTHARMORHACKS: {
  1242. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You were kicked for plausibly health/armor hacking.");
  1243. SetTimerEx("KickEx", 1000, 0, "i", iExtraID);
  1244. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM]: %s was kicked for (plausibly!) health/armor hacking. Refrain from taking more action until fully tested.", GetPlayerNameEx(playerid));
  1245. }
  1246. case AC_DIALOGSPOOFING: {
  1247. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM]: %s is spoofing dialogs (dialog ID: %d).", GetPlayerNameEx(playerid), iExtraID);
  1248. Log("logs/anticheat.log", szMiscArray);
  1249. }
  1250. case AC_GHOSTHACKS: {
  1251. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You were kicked for being desynced.");
  1252. SetTimerEx("KickEx", 1000, 0, "i", playerid);
  1253. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM]: %s is using ghost hacks (Shooting while AFK). WeaponID: %d", GetPlayerNameEx(playerid), iExtraID);
  1254. Log("logs/anticheat.log", szMiscArray);
  1255. }
  1256. case AC_DESYNC: {
  1257. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM]: %s has a weird camera mode (probably aimbot). Camera Mode: %d.", GetPlayerNameEx(playerid), iExtraID);
  1258. Log("logs/anticheat.log", szMiscArray);
  1259. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You were kicked for being desynced.");
  1260. SetTimerEx("KickEx", 1000, 0, "i", playerid);
  1261. }
  1262. }
  1263. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1264. format(szQuery, sizeof(szQuery), "INSERT INTO `ac` (`DBID`, `timestamp`, `type`, `flags`, `extraid`, `totalfired`, `hits`, `rmisses`, `tmisses`, `ratio`) VALUES (%d, NOW(), %d, %d, %d, %d, %d, %d, %d, %.1f)",
  1265. PlayerInfo[playerid][pId], processid, arrAntiCheat[playerid][ac_iFlags][processid], iExtraID, -1, -1, -1, -1, 0.0);
  1266. mysql_tquery(MainPipeline, szQuery, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1267. }
  1268. return 1;
  1269. }
  1270. AC_IsPlayerSurfing(playerid) {
  1271. if(zombieevent) return 0;
  1272. if(PlayerInfo[playerid][pAdmin] >= 2) return 0;
  1273. new iVehID = GetPlayerSurfingVehicleID(playerid);
  1274. if(iVehID == INVALID_VEHICLE_ID) return 0;
  1275. switch(GetVehicleModel(iVehID)) {
  1276. case 403, 406, 422, 430, 432, 433, 443, 446, 452, 453, 454, 455, 470, 472, 473, 478, 484, 493, 500, 514, 515, 525, 543, 554, 578, 595, 605, 607: return 0;
  1277. case 417, 423, 416, 425, 427, 431, 437, 447, 469, 487, 488, 497, 508, 528, 537, 538, 449, 548, 563, 56, 570, 577, 590, 592, 490: return 0; // often modded vehicles
  1278. }
  1279. return 1;
  1280. }
  1281. AC_KeySpamCheck(playerid) {
  1282. if(GetPVarType(playerid, "PCMute")) {
  1283. SendClientMessageEx(playerid, COLOR_WHITE, "[SYSTEM]: You are currently blocked from using interaction keys.");
  1284. return 0;
  1285. }
  1286. if(ac_iPlayerKeySpam[playerid] > 4) {
  1287. SetPVarInt(playerid, "PCMute", 1);
  1288. defer AC_ResetPVars[10000](playerid, 1);
  1289. SendClientMessageEx(playerid, COLOR_LIGHTRED, "[SYSTEM]: You were muted for spamming an interaction key. Refrain from doing it again.");
  1290. return 0;
  1291. }
  1292. return 1;
  1293. }
  1294. AC_PlayerHealthArmor(playerid) {
  1295. if(GetPVarInt(playerid, "Injured") == 1) return 0;
  1296. if(PlayerInfo[playerid][pHospital] > 0) return 0;
  1297. new Float:fData[4];
  1298. GetPlayerHealth(playerid, fData[0]);
  1299. GetHealth(playerid, fData[1]);
  1300. GetPlayerArmour(playerid, fData[2]);
  1301. GetArmour(playerid, fData[3]);
  1302. if(fData[1] < -40) {
  1303. format(szMiscArray, sizeof(szMiscArray), "[SYSTEM (BETA)]: %s (%d) may be health hacking.", GetPlayerNameEx(playerid), playerid);
  1304. ABroadCast(COLOR_LIGHTRED, szMiscArray, 2);
  1305. }
  1306. if(fData[0] > (fData[1] + 10.0) || fData[2] > (fData[3] + 10.0)) return 1;
  1307. return 0;
  1308. }
  1309. stock AC_GetWeaponName(weaponid) {
  1310. new szWeaponName[32];
  1311. if(!(0 <= weaponid <= sizeof(g_WeaponName))) format(szWeaponName, sizeof(szWeaponName), "Weapon %d", weaponid);
  1312. else strunpack(szWeaponName, g_WeaponName[weaponid], sizeof(szWeaponName));
  1313. return szWeaponName;
  1314. }
  1315. stock IsBulletWeapon(weaponid) {
  1316. return (WEAPON_COLT45 <= weaponid <= WEAPON_SNIPER) || weaponid == WEAPON_MINIGUN;
  1317. }
  1318. stock IsHighRateWeapon(weaponid) {
  1319. switch (weaponid) {
  1320. case WEAPON_FLAMETHROWER, WEAPON_DROWN, WEAPON_CARPARK,
  1321. WEAPON_SPRAYCAN, WEAPON_FIREEXTINGUISHER: {
  1322. return true;
  1323. }
  1324. }
  1325. return false;
  1326. }
  1327. stock IsMeleeWeapon(weaponid) {
  1328. return (WEAPON_UNARMED <= weaponid <= WEAPON_KATANA) || (WEAPON_DILDO <= weaponid <= WEAPON_CANE) || weaponid == WEAPON_PISTOLWHIP;
  1329. }
  1330. IsCorrectCameraMode(playerid) {
  1331. switch(GetPlayerCameraMode(playerid)) {
  1332. case 4, 7, 8, 15, 46, 51, 53, 55: return 1;
  1333. }
  1334. return 0;
  1335. }
  1336. CMD:system(playerid, params[]) {
  1337. if(!IsAdminLevel(playerid, ADMIN_SENIOR)) return 1;
  1338. format(szMiscArray, sizeof(szMiscArray), "Detecting\tStatus\n\
  1339. Aimbot\t%s\n\
  1340. (Auto) C-Bug\t%s\n\
  1341. Silent Aim\t%s\n\
  1342. Pro-Aim\t%s\n\
  1343. Weapon Range Hacks\t%s\n\
  1344. Speed Hacks (B2-B5)\t%s\n\
  1345. Vehicle Hacks\t%s\n\
  1346. Command Spamming\t%s\n\
  1347. Car Surfing\t%s\n\
  1348. Ninja Jacking\t%s\n\
  1349. Ghost Hacks\t%s\n\
  1350. Name Tags\t%s\n\
  1351. Airbreaking\t%s\n\
  1352. Infinite Stamina\t%s\n\
  1353. ---------\t%s\n\
  1354. Dialog Spoofing\t%s\n\
  1355. Rejected Hits\t%s\n\
  1356. Desync\t%s",
  1357. (ac_ACToggle[AC_AIMBOT] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1358. (ac_ACToggle[AC_CBUG] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1359. (ac_ACToggle[AC_SILENTAIM] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1360. (ac_ACToggle[AC_PROAIM] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1361. (ac_ACToggle[AC_RANGEHACKS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1362. (ac_ACToggle[AC_SPEEDHACKS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1363. (ac_ACToggle[AC_VEHICLEHACKS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1364. (ac_ACToggle[AC_CMDSPAM] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1365. (ac_ACToggle[AC_CARSURFING] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1366. (ac_ACToggle[AC_NINJAJACK] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1367. (ac_ACToggle[AC_GHOSTHACKS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1368. (ac_ACToggle[AC_NAMETAGS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1369. (ac_ACToggle[AC_AIRBREAKING] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1370. (ac_ACToggle[AC_INFINITESTAMINA] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1371. (ac_ACToggle[AC_HEALTHARMORHACKS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1372. (ac_ACToggle[AC_DIALOGSPOOFING] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1373. (ac_ACToggle[AC_REJECTHITS] == true) ? ("{00FF00}On") : ("{FF0000}Off"),
  1374. (ac_ACToggle[AC_DESYNC] == true) ? ("{00FF00}On") : ("{FF0000}Off"));
  1375. ShowPlayerDialogEx(playerid, DIALOG_AC_MAIN, DIALOG_STYLE_TABLIST_HEADERS, "[SYSTEM]: Anti-Cheat", szMiscArray, "Toggle", "");
  1376. return 1;
  1377. }
  1378. CMD:aimcheck(playerid, params[]) {
  1379. if(!IsAdminLevel(playerid, ADMIN_SENIOR)) return 1;
  1380. new uPlayer,
  1381. szTitle[32 + MAX_PLAYER_NAME];
  1382. if(sscanf(params, "u", uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /aimcheck [playerid/name]");
  1383. if(!IsPlayerConnected(uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "You specified an invalid player.");
  1384. format(szMiscArray, sizeof(szMiscArray), "Weapon (total fired)\tHit --- Real Miss (of Total Missed)\tRatio\n");
  1385. new Float:fRatio,
  1386. iTotalMiss,
  1387. iRelevantMiss;
  1388. for(new i; i < 46; ++i) {
  1389. if(IsBulletWeapon(i)) {
  1390. iTotalMiss = arrWeaponDataAC[uPlayer][ac_iBulletsFired][i] - arrWeaponDataAC[uPlayer][ac_iBulletsHit][i];
  1391. iRelevantMiss = arrWeaponDataAC[uPlayer][ac_iBulletsFired][i] - arrWeaponDataAC[uPlayer][ac_iBulletsHit][i] - arrWeaponDataAC[uPlayer][ac_iFakeMiss][i];
  1392. iRelevantMiss++;
  1393. fRatio = arrWeaponDataAC[uPlayer][ac_iBulletsHit][i] / iRelevantMiss;
  1394. if(arrWeaponDataAC[uPlayer][ac_iBulletsFired][i] < 30) {
  1395. format(szMiscArray, sizeof(szMiscArray), "%s {FFFFFF}[IGNORE] %s (tot: %d)\tHit: %d --- Miss: %d (missed total: %d)\tRatio: %.1f\n", szMiscArray, AC_GetWeaponName(i), arrWeaponDataAC[uPlayer][ac_iBulletsFired][i],
  1396. arrWeaponDataAC[uPlayer][ac_iBulletsHit][i], iRelevantMiss, iTotalMiss, fRatio);
  1397. }
  1398. else if(fRatio < 1.5) {
  1399. format(szMiscArray, sizeof(szMiscArray), "%s {FFFFFF}%s (tot: %d)\tHit: %d --- Miss: %d (missed total: %d)\tRatio: %.1f\n", szMiscArray, AC_GetWeaponName(i), arrWeaponDataAC[uPlayer][ac_iBulletsFired][i],
  1400. arrWeaponDataAC[uPlayer][ac_iBulletsHit][i], iRelevantMiss, iTotalMiss, fRatio);
  1401. }
  1402. else if(1.5 <= fRatio < 3.0) {
  1403. format(szMiscArray, sizeof(szMiscArray), "%s {FFFF00}%s (tot: %d)\t{FFFF00}Hit: %d --- Miss: %d (missed total: %d)\t{FFFF00}Ratio: %.1f\n", szMiscArray, AC_GetWeaponName(i), arrWeaponDataAC[uPlayer][ac_iBulletsFired][i],
  1404. arrWeaponDataAC[uPlayer][ac_iBulletsHit][i], iRelevantMiss, iTotalMiss, fRatio);
  1405. }
  1406. else {
  1407. format(szMiscArray, sizeof(szMiscArray), "%s {FF0000}%s (tot: %d)\t{FF0000}Hit: %d --- Miss: %d (missed total: %d)\t{FF0000}Ratio: %.1f\n", szMiscArray, AC_GetWeaponName(i), arrWeaponDataAC[uPlayer][ac_iBulletsFired][i],
  1408. arrWeaponDataAC[uPlayer][ac_iBulletsHit][i], iRelevantMiss, iTotalMiss, fRatio);
  1409. }
  1410. }
  1411. }
  1412. format(szTitle, sizeof(szTitle), "Aimbot Check | Weapon Data {FFFF00}(%s)", GetPlayerNameEx(uPlayer));
  1413. ShowPlayerDialogEx(playerid, DIALOG_NOTHING, DIALOG_STYLE_TABLIST_HEADERS, szTitle, szMiscArray, "<>", "");
  1414. SendClientMessageEx(playerid, COLOR_YELLOW, "---------- [ ANTICHEAT ] ----------");
  1415. SendClientMessageEx(playerid, COLOR_GRAD1, "Jingles:");
  1416. SendClientMessageEx(playerid, COLOR_GRAD1, "");
  1417. SendClientMessageEx(playerid, COLOR_GRAD1, "Player ratios for some weapons (especially Combat Shotguns (SPAS)) can be high even though they're not aimbotting.");
  1418. format(szMiscArray, sizeof(szMiscArray), "Only make conclusions if the total shots fired is higher than approx. 50. TIMESTAMP: %s", date(gettime(), 3));
  1419. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1420. SendClientMessageEx(playerid, COLOR_YELLOW, "------------------------------ ");
  1421. return 1;
  1422. }
  1423. CMD:acflags(playerid, params[]) {
  1424. if(!IsAdminLevel(playerid, ADMIN_SENIOR)) return 1;
  1425. new uPlayer,
  1426. szTitle[32 + MAX_PLAYER_NAME];
  1427. if(sscanf(params, "u", uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /acflags [playerid/name]");
  1428. if(!IsPlayerConnected(uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "You specified an invalid player.");
  1429. format(szMiscArray, sizeof(szMiscArray), "Name\tFlags");
  1430. for(new i; i < AC_MAX; ++i) {
  1431. switch(arrAntiCheat[uPlayer][ac_iFlags][i]) {
  1432. case 0: format(szMiscArray, sizeof(szMiscArray), "%s\n{FFFFFF}%s\t%d", szMiscArray, ac_ACNames[i], arrAntiCheat[uPlayer][ac_iFlags][i]);
  1433. case 1 .. 9: format(szMiscArray, sizeof(szMiscArray), "%s\n{FFFF00}%s\t{FFFF00}%d", szMiscArray, ac_ACNames[i], arrAntiCheat[uPlayer][ac_iFlags][i]);
  1434. default: format(szMiscArray, sizeof(szMiscArray), "%s\n{FF0000}%s\t{FF0000}%d", szMiscArray, ac_ACNames[i], arrAntiCheat[uPlayer][ac_iFlags][i]);
  1435. }
  1436. }
  1437. format(szTitle, sizeof(szTitle), "AC System Flags | %s", GetPlayerNameEx(uPlayer));
  1438. ShowPlayerDialogEx(playerid, DIALOG_NOTHING, DIALOG_STYLE_TABLIST_HEADERS, szTitle, szMiscArray, "<>", "");
  1439. return 1;
  1440. }
  1441. CMD:resetacflags(playerid, params[]) {
  1442. if(!IsAdminLevel(playerid, ADMIN_SENIOR)) return 1;
  1443. new uPlayer;
  1444. if(sscanf(params, "u", uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /resetacflags [playerid/name]");
  1445. if(!IsPlayerConnected(uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "You specified an invalid player.");
  1446. for(new i; i < AC_MAX; ++i) arrAntiCheat[uPlayer][ac_iFlags][i] = 0;
  1447. format(szMiscArray, sizeof(szMiscArray), "You removed %s's anticheat flags.", GetPlayerNameEx(uPlayer));
  1448. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1449. format(szMiscArray, sizeof(szMiscArray), "Administrator %s removed your anticheat flags.", GetPlayerNameEx(playerid));
  1450. SendClientMessageEx(uPlayer, COLOR_YELLOW, szMiscArray);
  1451. return 1;
  1452. }
  1453. CMD:rejects(playerid, params[]) {
  1454. if(!IsAdminLevel(playerid, ADMIN_SENIOR)) return 1;
  1455. new uPlayer,
  1456. szTitle[32 + MAX_PLAYER_NAME];
  1457. if(sscanf(params, "u", uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /aimcheck [playerid/name]");
  1458. if(!IsPlayerConnected(uPlayer)) return SendClientMessage(playerid, 0xFFFFFFFF, "You specified an invalid player.");
  1459. format(szMiscArray, sizeof(szMiscArray), "Reason || Date\tWeapon\tTarget || (Info (0, 1, 2))\n");
  1460. for(new idx; idx < AC_MAX_REJECTED_HITS; ++idx) {
  1461. format(szMiscArray, sizeof(szMiscArray), "%s\n%s || %s\t%s\t%s || (Info: %d, %d, %d)",
  1462. szMiscArray,
  1463. g_HitRejectReasons[arrRejectedHitData[uPlayer][idx][acr_iReason]],
  1464. date(arrRejectedHitData[uPlayer][idx][acr_iTime], 1),
  1465. AC_GetWeaponName(arrRejectedHitData[uPlayer][idx][acr_iWeaponID]),
  1466. GetPlayerNameEx(arrRejectedHitData[uPlayer][idx][acr_iDamagedID]),
  1467. arrRejectedHitData[uPlayer][idx][acr_iInfo][0],
  1468. arrRejectedHitData[uPlayer][idx][acr_iInfo][2],
  1469. arrRejectedHitData[uPlayer][idx][acr_iInfo][2]);
  1470. }
  1471. format(szTitle, sizeof(szTitle), "Rejected Shots | Weapon Data (%s)", GetPlayerNameEx(uPlayer));
  1472. ShowPlayerDialogEx(playerid, 32767, DIALOG_STYLE_TABLIST_HEADERS, szTitle, szMiscArray, "<>", "");
  1473. return 1;
  1474. }
  1475. CMD:resetaim(playerid, params[]) {
  1476. if(!IsAdminLevel(playerid, ADMIN_SENIOR)) return 1;
  1477. foreach(new i : Player) {
  1478. for(new j; j < 46; ++j) {
  1479. arrWeaponDataAC[i][ac_iBulletsHit][j] = 0;
  1480. arrWeaponDataAC[i][ac_iBulletsFired][j] = 0;
  1481. arrWeaponDataAC[i][ac_iFakeMiss][j] = 0;
  1482. }
  1483. }
  1484. return 1;
  1485. }
  1486. CMD:listacflags(playerid, params[]) {
  1487. if(PlayerInfo[playerid][pAdmin] >= 2) {
  1488. SendClientMessageEx(playerid, COLOR_GREEN, "____________________ Current players flagged by the anti pro-aim system: ____________________");
  1489. foreach(new i: Player) {
  1490. if(arrAntiCheat[i][ac_iFlags][AC_PROAIM] > 0) {
  1491. format(szMiscArray, sizeof szMiscArray, "%s (ID: %d) - %d flags.", GetPlayerNameEx(i), i, PlayerInfo[i][pProAimFlags]);
  1492. SendClientMessage(playerid, COLOR_GRAD1, szMiscArray);
  1493. }
  1494. }
  1495. if(PlayerInfo[playerid][pAdmin] >= 4) SendClientMessage(playerid, COLOR_GRAD2, "NOTE: If you are certain a player is not hacking, you may use /resetpaflags.");
  1496. }
  1497. else return SendClientMessageEx(playerid, COLOR_GRAD2, "You're not authorized to use this command.");
  1498. return 1;
  1499. }
  1500. CMD:setproaimvar(playerid, params[]) {
  1501. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  1502. if(sscanf(params, "d", iShotVariance)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /setproaimvar [range]");
  1503. if(!(0 < strval(params) < 30)) return SendClientMessageEx(playerid, COLOR_GRAD1, "Set it between 0 and 30.");
  1504. iShotVariance = strval(params);
  1505. format(szMiscArray, sizeof(szMiscArray), "You set the shot variance to: %d", iShotVariance);
  1506. SendClientMessageEx(playerid, COLOR_GRAD1, szMiscArray);
  1507. return 1;
  1508. }
  1509. CMD:ploss(playerid, params[]) {
  1510. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  1511. if(PLoss) PLoss = 0;
  1512. else PLoss = 1;
  1513. SendClientMessageEx(playerid, COLOR_GRAD1, "You toggled the packet loss function.");
  1514. return 1;
  1515. }
  1516. /* Custom Anti-Aimbot by Jingles
  1517. 1) Cheating (C), with C ∈ [true,false],
  1518. 2) Player Moving (M p ) with M p ∈ [true, f alse],
  1519. 3) Target moving (Mt) with Mt ∈ [true,false],
  1520. 4) Changing aiming direction (deltaD), with deltaD ∈[true, f alse],
  1521. 5) Distance from aiming target (D), with D ∈ [0,1,2,3] in which larger the value implies further away is the distance and,
  1522. 6) Aiming accuracy (A) with A ∈ [0, 1, 2, 3] in which the lower the value implies higher is the aiming accuracy.
  1523. Using these data, one can obtain the following prior proba- bility distributions by counting frequencies and then normalize the values:
  1524. 1) P(Ct|Ct−1), and
  1525. 2) P(At|At−1,Ct,Mtp,Mt,△Dt,Dt),
  1526. Inferring the probability of cheating for any particular player follows the following steps.
  1527. At the very first time slice where t = 0, we initialize P(C ̃ = true) to 0.5 (i.e., a player is 0 equally likely to be a cheater or an honest player).
  1528. For each time slice t, the inference carries out in two stages: (See paper)
  1529. stock AC_BayesianNetwork(playerid, iTargetID) {
  1530. if(!arrAntiCheat[playerid][ac_inTrainingMode]) return 1;
  1531. new bool:iWasHit,
  1532. iSpeed[2],
  1533. bool:isPlayerMoving[2],
  1534. Float:fDistanceToTarget,
  1535. Float:fAimAccuracy[2],
  1536. Float:fDeltaAimAccuracy,
  1537. Float:fDeltaAimingDirection;
  1538. if(iTargetID == INVALID_PLAYER_ID) {
  1539. iTargetID = arrAntiCheat[playerid][ac_iLastTargetID];
  1540. iWasHit = false;
  1541. }
  1542. else {
  1543. arrAntiCheat[playerid][ac_iLastTargetID] = iTargetID;
  1544. iWasHit = true;
  1545. }
  1546. iSpeed[0] = GetPlayerSpeed(playerid);
  1547. iSpeed[1] = GetPlayerSpeed(iTargetID);
  1548. if(iSpeed[0] > 0) isPlayerMoving[0] = true; // Mp
  1549. if(iSpeed[1] > 0) isPlayerMoving[1] = true; // Mt
  1550. GetPlayerFacingAngle(playerid, arrAntiCheat[playerid][ac_fPlayerAngle][0]); //delta D
  1551. fDistanceToTarget = GetDistanceBetweenPlayers(playerid, iTargetID); //D
  1552. GetPlayerCameraPos(playerid, arrAntiCheat[playerid][ac_fCamPos][0], arrAntiCheat[playerid][ac_fCamPos][1], arrAntiCheat[playerid][ac_fCamPos][2]);
  1553. GetPlayerCameraFrontVector(playerid, arrAntiCheat[playerid][ac_fCamFVector][0], arrAntiCheat[playerid][ac_fCamFVector][1], arrAntiCheat[playerid][ac_fCamFVector][2]);
  1554. if(arrAntiCheat[playerid][ac_fCamFVector][3] != 0) {
  1555. fDeltaAimingDirection = arrAntiCheat[playerid][ac_fPlayerAngle][1]-arrAntiCheat[playerid][ac_fPlayerAngle][0];
  1556. if(arrLastBulletData[playerid][acl_fTargetPos][0] != 0) {
  1557. // t
  1558. fAimAccuracy[0] = DistanceCameraTargetToLocation(
  1559. arrAntiCheat[playerid][ac_fCamPos][0], arrAntiCheat[playerid][ac_fCamPos][1], arrAntiCheat[playerid][ac_fCamPos][2],
  1560. arrLastBulletData[playerid][acl_fTargetPos][0], arrLastBulletData[playerid][acl_fTargetPos][1], arrLastBulletData[playerid][acl_fTargetPos][2],
  1561. arrAntiCheat[playerid][ac_fCamFVector][0], arrAntiCheat[playerid][ac_fCamFVector][1], arrAntiCheat[playerid][ac_fCamFVector][2]
  1562. );
  1563. // t-1
  1564. fAimAccuracy[1] = DistanceCameraTargetToLocation(
  1565. arrAntiCheat[playerid][ac_fCamPos][0], arrAntiCheat[playerid][ac_fCamPos][1], arrAntiCheat[playerid][ac_fCamPos][2],
  1566. arrLastBulletData[playerid][acl_fTargetPos][0], arrLastBulletData[playerid][acl_fTargetPos][1], arrLastBulletData[playerid][acl_fTargetPos][2],
  1567. arrAntiCheat[playerid][ac_fCamFVector][3], arrAntiCheat[playerid][ac_fCamFVector][4], arrAntiCheat[playerid][ac_fCamFVector][5]
  1568. );
  1569. }
  1570. }
  1571. // Normalize:
  1572. if(fDeltaAimingDirection < 0) fDeltaAimingDirection = fDeltaAimingDirection * -1; // Always positive.
  1573. switch(fDeltaAimingDirection) {
  1574. case 0 .. 10: fDeltaAimingDirection = 0;
  1575. case 11 .. 40: fDeltaAimingDirection = 1;
  1576. case 41 .. 100: fDeltaAimingDirection = 2;
  1577. default: fDeltaAimingDirection = 3;
  1578. }
  1579. switch(fDistanceToTarget) {
  1580. case 0 .. 5: fDistanceToTarget = 0;
  1581. case 6 .. 10: fDistanceToTarget = 1;
  1582. case 11 .. 20: fDistanceToTarget = 2;
  1583. default: fDistanceToTarget = 3;
  1584. }
  1585. fDeltaAimAccuracy = fAimAccuracy[1] - fAimAccuracy[0];
  1586. if(fAimAccuracy[0] <= 1.5) fAimAccuracy[0] = 0;
  1587. if(1.5 < fAimAccuracy[0] <= 6) fAimAccuracy[0] = 1;
  1588. if(6 < fAimAccuracy[0] <= 10) fAimAccuracy[0] = 2;
  1589. if(fAimAccuracy[0] > 10) fAimAccuracy[0] = 3;
  1590. if(fAimAccuracy[1] <= 1.5) fAimAccuracy[1] = 0;
  1591. if(1.5 < fAimAccuracy[1] <= 6) fAimAccuracy[1] = 1;
  1592. if(6 < fAimAccuracy[1] <= 10) fAimAccuracy[1] = 2;
  1593. if(fAimAccuracy[1] > 10) fAimAccuracy[1] = 3;
  1594. switch(fDeltaAimAccuracy) {
  1595. case 0 .. 4: fDeltaAimAccuracy = 0;
  1596. case 5 .. 7: fDeltaAimAccuracy = 1;
  1597. case 8 .. 13: fDeltaAimAccuracy = 2;
  1598. default: fDeltaAimAccuracy = 3;
  1599. }
  1600. arrAntiCheat[playerid][ac_fCamFVector][3] = arrAntiCheat[playerid][ac_fCamFVector][0];
  1601. arrAntiCheat[playerid][ac_fCamFVector][4] = arrAntiCheat[playerid][ac_fCamFVector][1];
  1602. arrAntiCheat[playerid][ac_fCamFVector][5] = arrAntiCheat[playerid][ac_fCamFVector][2];
  1603. arrAntiCheat[playerid][ac_fPlayerAngle][1] = arrAntiCheat[playerid][ac_fPlayerAngle][0];
  1604. format(szMiscArray, sizeof(szMiscArray), "IC: %d, TH: %d, MP: %d, MT: %d, DTT: %0.1f, DAimDir: %0.1f, AimAcc: %0.1f, AimAcc(t-1): %0.1f, DAimAcc: %0.1f",
  1605. arrAntiCheat[playerid][ac_iIsCheating], iWasHit, isPlayerMoving[0], isPlayerMoving[1], fDistanceToTarget, fDeltaAimingDirection, fAimAccuracy[0], fAimAccuracy[1], fDeltaAimAccuracy);
  1606. SendClientMessageEx(playerid, COLOR_GRAD1, szMiscArray);
  1607. format(szMiscArray, sizeof(szMiscArray), "INSERT INTO `aimbot` (`pID`, `Username`, `time`, `ischeating`, `truehit`, `accuracy`, `aimingdirection`, `playerspeed`, `targetspeed`, `distance`, `deltaaim`) VALUES \
  1608. (%d, '%s', %d, %d, %d, %0.1f, %0.1f, %d, %d, %0.1f, %0.1f)",
  1609. PlayerInfo[playerid][pId],
  1610. GetPlayerNameExt(playerid),
  1611. gettime(),
  1612. arrAntiCheat[playerid][ac_iIsCheating],
  1613. iWasHit,
  1614. fAimAccuracy[0],
  1615. fDeltaAimingDirection,
  1616. iSpeed[0],
  1617. iSpeed[1],
  1618. fDistanceToTarget,
  1619. fDeltaAimAccuracy);
  1620. mysql_tquery(MainPipeline, szMiscArray, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1621. return 1;
  1622. }
  1623. stock AC_Probability(playerid, iTargetID) {
  1624. new Float:fDeltaAimingDirection,
  1625. Float:fPlayerAngle[2], //t and t=-1
  1626. Float:fAimAccuracy[2], //t and t=-1
  1627. Float:fDeltaCrossHair,
  1628. Float:fDeltaAimAccuracy;
  1629. new iSpeed[2], // 0 == player, 1 == target
  1630. bool:isPlayerMoving[2], // 0 == player, 1 == target
  1631. Float:fDistanceToTarget;
  1632. if(iTargetID != INVALID_PLAYER_ID) {
  1633. iSpeed[0] = GetPlayerSpeed(playerid);
  1634. iSpeed[1] = GetPlayerSpeed(iTargetID);
  1635. if(iSpeed[0] > 0) isPlayerMoving[0] = true; // Mp
  1636. if(iSpeed[1] > 0) isPlayerMoving[1] = true; // Mt
  1637. GetPlayerFacingAngle(playerid, fPlayerAngle[0]); //delta D
  1638. fDistanceToTarget = GetDistanceBetweenPlayers(playerid, iTargetID); //D
  1639. }
  1640. GetPlayerCameraPos(playerid, arrAntiCheat[playerid][ac_fCamPos][0], arrAntiCheat[playerid][ac_fCamPos][1], arrAntiCheat[playerid][ac_fCamPos][2]);
  1641. GetPlayerCameraFrontVector(playerid, arrAntiCheat[playerid][ac_fCamFVector][0], arrAntiCheat[playerid][ac_fCamFVector][1], arrAntiCheat[playerid][ac_fCamFVector][2]);
  1642. if(arrAntiCheat[playerid][ac_fCamFVector][3] != 0) {
  1643. fDeltaAimingDirection = fPlayerAngle[1]-fPlayerAngle[0];
  1644. if(arrLastBulletData[playerid][acl_fTargetPos][0] != 0) {
  1645. // t
  1646. fAimAccuracy[0] = DistanceCameraTargetToLocation(
  1647. arrAntiCheat[playerid][ac_fCamPos][0], arrAntiCheat[playerid][ac_fCamPos][1], arrAntiCheat[playerid][ac_fCamPos][2],
  1648. arrLastBulletData[playerid][acl_fTargetPos][0], arrLastBulletData[playerid][acl_fTargetPos][1], arrLastBulletData[playerid][acl_fTargetPos][2],
  1649. arrAntiCheat[playerid][ac_fCamFVector][0], arrAntiCheat[playerid][ac_fCamFVector][1], arrAntiCheat[playerid][ac_fCamFVector][2]
  1650. );
  1651. // t-1
  1652. fAimAccuracy[1] = DistanceCameraTargetToLocation(
  1653. arrAntiCheat[playerid][ac_fCamPos][0], arrAntiCheat[playerid][ac_fCamPos][1], arrAntiCheat[playerid][ac_fCamPos][2],
  1654. arrLastBulletData[playerid][acl_fTargetPos][0], arrLastBulletData[playerid][acl_fTargetPos][1], arrLastBulletData[playerid][acl_fTargetPos][2],
  1655. arrAntiCheat[playerid][ac_fCamFVector][3], arrAntiCheat[playerid][ac_fCamFVector][4], arrAntiCheat[playerid][ac_fCamFVector][5]
  1656. );
  1657. }
  1658. }
  1659. format(szMiscArray, sizeof(szMiscArray), "%s aimed %0.1f units from the target. Before, they aimed: %0.1f from the target. Target distance: %0.1f", GetPlayerNameEx(playerid), fAimAccuracy[0], fAimAccuracy[1], fDistanceToTarget);
  1660. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1661. format(szMiscArray, sizeof(szMiscArray), "%s aimed %0.1f units off from before.", GetPlayerNameEx(playerid), fDeltaAimingDirection);
  1662. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1663. if(fDeltaCrossHair < 2.0) fDeltaCrossHair = 0;
  1664. else fDeltaCrossHair = 1;
  1665. switch(fDeltaAimingDirection) {
  1666. case 0 .. 19: fDeltaAimingDirection = 0;
  1667. case 20 .. 45: fDeltaAimingDirection = 1;
  1668. case 46 .. 75: fDeltaAimingDirection = 2;
  1669. default: fDeltaAimingDirection = 3;
  1670. }
  1671. switch(fDistanceToTarget) {
  1672. case 0 .. 4: fDistanceToTarget = 0;
  1673. case 5 .. 9: fDistanceToTarget = 1;
  1674. case 10 .. 14: fDistanceToTarget = 2;
  1675. default: fDistanceToTarget = 3;
  1676. }
  1677. fDeltaAimAccuracy = fAimAccuracy[1] - fAimAccuracy[0];
  1678. if(fAimAccuracy[0] <= 1.5) fAimAccuracy[0] = 0;
  1679. if(1.5 < fAimAccuracy[0] <= 6) fAimAccuracy[0] = 1;
  1680. if(6 < fAimAccuracy[0] <= 10) fAimAccuracy[0] = 2;
  1681. if(fAimAccuracy[0] > 10) fAimAccuracy[0] = 3;
  1682. if(fAimAccuracy[1] <= 1.5) fAimAccuracy[1] = 0;
  1683. if(1.5 < fAimAccuracy[1] <= 6) fAimAccuracy[1] = 1;
  1684. if(6 < fAimAccuracy[1] <= 10) fAimAccuracy[1] = 2;
  1685. if(fAimAccuracy[1] > 10) fAimAccuracy[1] = 3;
  1686. fPlayerAngle[1] = fPlayerAngle[0];
  1687. arrAntiCheat[playerid][ac_fCamFVector][3] = arrAntiCheat[playerid][ac_fCamFVector][0];
  1688. arrAntiCheat[playerid][ac_fCamFVector][4] = arrAntiCheat[playerid][ac_fCamFVector][1];
  1689. arrAntiCheat[playerid][ac_fCamFVector][5] = arrAntiCheat[playerid][ac_fCamFVector][2];
  1690. // The Equation:
  1691. // Computation of our variables:
  1692. // P(At|At−1,Ct,Mtp,Mt,Pt,Dt,△Dt,△At)
  1693. arrAntiCheat[playerid][ac_fAimAccuracy] = isPlayerMoving[0] + isPlayerMoving[1] + fDeltaCrossHair + fDistanceToTarget + fDeltaAimingDirection + fAimAccuracy[0] + fDeltaAimAccuracy;
  1694. // 1:
  1695. arrAntiCheat[playerid][ac_fProbability] = arrAntiCheat[playerid][ac_fAimAccuracy] * arrAntiCheat[playerid][ac_iCheatingIndex][1] + arrAntiCheat[playerid][ac_fAimAccuracy] * (1.0 - arrAntiCheat[playerid][ac_iCheatingIndex][1]);
  1696. // 2:
  1697. new Float:T,
  1698. Float:F;
  1699. T = arrAntiCheat[playerid][ac_fAimAccuracy] * arrAntiCheat[playerid][ac_fProbability]; // etc.
  1700. F = arrAntiCheat[playerid][ac_fAimAccuracy] * (arrAntiCheat[playerid][ac_fAimAccuracy] - arrAntiCheat[playerid][ac_fProbability]);
  1701. arrAntiCheat[playerid][ac_iCheatingIndex][0] = T / (T + F); // on t=0;
  1702. format(szMiscArray, sizeof(szMiscArray), "Prob: %0.1f, CI(t): %d, CI(t-1): %d, MP: %d, MT: %d, DCH: %d, DTT: %d, DAimDir: %d, AimAcc: %d, DAimAcc: %d",
  1703. arrAntiCheat[playerid][ac_fProbability], arrAntiCheat[playerid][ac_iCheatingIndex][0], arrAntiCheat[playerid][ac_iCheatingIndex][1],
  1704. isPlayerMoving[0], isPlayerMoving[1], fDeltaCrossHair, fDistanceToTarget, fDeltaAimingDirection, fAimAccuracy[0], fDeltaAimAccuracy);
  1705. SendClientMessageEx(playerid, COLOR_GRAD1, szMiscArray);
  1706. arrAntiCheat[playerid][ac_iCheatingIndex][1] = arrAntiCheat[playerid][ac_iCheatingIndex][0]; // t-1 = t;
  1707. format(szMiscArray, sizeof(szMiscArray), "INSERT INTO `aimbot` (`pID`, `time`, `ratio`, `accuracy`, `aimingdirection`, `playerspeed`, `targetspeed`, `distance`, `deltaaim`) VALUES \
  1708. (%d, %d, %0.1f, %0.1f, %0.1f, %d, %d, %d, %d)",
  1709. PlayerInfo[playerid][pId],
  1710. gettime(),
  1711. arrAntiCheat[playerid][ac_iCheatingIndex][0],
  1712. fAimAccuracy[0],
  1713. fDeltaAimingDirection,
  1714. iSpeed[0],
  1715. iSpeed[1],
  1716. fDistanceToTarget,
  1717. fDeltaAimAccuracy);
  1718. mysql_tquery(MainPipeline, szMiscArray, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1719. return 1;
  1720. }
  1721. CMD:analytics(playerid, params[]) {
  1722. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  1723. new uPlayer;
  1724. if(sscanf(params, "u", uPlayer)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /analytics [playerid / part of name]");
  1725. if(!IsPlayerConnected(uPlayer)) return 1;
  1726. format(szMiscArray, sizeof(szMiscArray), "Player: %s\n\n\
  1727. Average Accuracy: %0.1f",
  1728. GetPlayerNameEx(uPlayer),
  1729. floatdiv(arrAntiCheat[uPlayer][ac_fAimAccuracy], ac_TotalShots[uPlayer]));
  1730. ShowPlayerDialogEx(playerid, DIALOG_NOTHING, DIALOG_STYLE_MSGBOX, "Player Analytics", szMiscArray, "Okay", "");
  1731. return 1;
  1732. }
  1733. */
  1734. /*
  1735. CMD:setcheating(playerid, params[]) {
  1736. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  1737. new uPlayer;
  1738. if(sscanf(params, "u", uPlayer)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /setcheating [0/1]");
  1739. if(arrAntiCheat[uPlayer][ac_iIsCheating]) {
  1740. format(szMiscArray, sizeof(szMiscArray), "You set %s to a honest player.", GetPlayerNameEx(uPlayer));
  1741. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1742. arrAntiCheat[uPlayer][ac_iIsCheating] = 0;
  1743. }
  1744. else {
  1745. format(szMiscArray, sizeof(szMiscArray), "You set %s to a cheating player.", GetPlayerNameEx(uPlayer));
  1746. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1747. arrAntiCheat[uPlayer][ac_iIsCheating] = 1;
  1748. }
  1749. return 1;
  1750. }
  1751. CMD:settraining(playerid, params[]) {
  1752. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  1753. new uPlayer;
  1754. if(sscanf(params, "u", uPlayer)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /settraining [0/1]");
  1755. if(arrAntiCheat[uPlayer][ac_inTrainingMode]) {
  1756. format(szMiscArray, sizeof(szMiscArray), "You removed %s from the BN training.", GetPlayerNameEx(uPlayer));
  1757. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1758. arrAntiCheat[uPlayer][ac_inTrainingMode] = 0;
  1759. }
  1760. else {
  1761. format(szMiscArray, sizeof(szMiscArray), "You added %s to the BN training.", GetPlayerNameEx(uPlayer));
  1762. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  1763. arrAntiCheat[uPlayer][ac_inTrainingMode] = 1;
  1764. }
  1765. return 1;
  1766. }
  1767. */
  1768. /*
  1769. CMD:acresults(playerid, params[]) {
  1770. if(!IsAdminLevel(playerid, ADMIN_SENIOR, 1)) return 1;
  1771. mysql_tquery(MainPipeline, "SELECT * FROM `aimbot` WHERE `accuracy` = '3'", true, "OnACQueryResult", "i", 3);
  1772. return 1;
  1773. }
  1774. new iACCountTracker[6],
  1775. iFrequency,
  1776. ACTrackCount;
  1777. forward OnACQueryResult(i);
  1778. public OnACQueryResult(i) {
  1779. new iRows;
  1780. iRows = cache_get_row_count(MainPipeline);
  1781. for(iACCountTracker[0] = 0; iACCountTracker[0] < 2; iACCountTracker[0]++) { // ischeaitng
  1782. for(iACCountTracker[1] = 0; iACCountTracker[1] < 4; iACCountTracker[1]++) { // aimingdirection
  1783. for(iACCountTracker[2] = 0; iACCountTracker[2] < 2; iACCountTracker[2]++) { //playerspeed
  1784. for(iACCountTracker[3] = 0; iACCountTracker[3] < 2; iACCountTracker[3]++) { //targetspeed
  1785. for(iACCountTracker[4] = 0; iACCountTracker[4] < 4; iACCountTracker[4]++) { // distance
  1786. for(iACCountTracker[5] = 0; iACCountTracker[5] < 4; iACCountTracker[5]++) ACSQLQuery(i, iRows); // deltaaim
  1787. }
  1788. }
  1789. }
  1790. }
  1791. }
  1792. i = i - 1;
  1793. if(i < 0) return SendClientMessageToAll(-1, "done");
  1794. else {
  1795. format(szMiscArray, sizeof(szMiscArray), "SELECT * FROM `aimbot` WHERE `accuracy` = '%d'", i);
  1796. mysql_tquery(MainPipeline, szMiscArray, true, "OnACQueryResult", "i", i);
  1797. }
  1798. return 1;
  1799. }
  1800. forward OnACQueryResult2(i, iRows);
  1801. public OnACQueryResult2(i, iRows) {
  1802. iFrequency = cache_get_row_count(MainPipeline);
  1803. printf("%d ::: %0.1f, %d, %d, %d, %d, %d, %d, %d", ACTrackCount, floatdiv(iFrequency, iRows) * 100, i, iACCountTracker[0], iACCountTracker[1], iACCountTracker[2], iACCountTracker[3], iACCountTracker[4], iACCountTracker[5]);
  1804. format(szMiscArray, sizeof(szMiscArray), "INSERT INTO `aimbayesian` (`probability`, `ischeating`, `accuracy`, `aimingdirection`, `playerspeed`, `targetspeed`, `distance`, `deltaaim`) VALUES \
  1805. (%0.1f, %d, %d, %d, %d, %d, %d, %d)",
  1806. floatdiv(iFrequency, iRows) * 100, iACCountTracker[0], i, iACCountTracker[1], iACCountTracker[2], iACCountTracker[3], iACCountTracker[4], iACCountTracker[5]);
  1807. mysql_tquery(MainPipeline, szMiscArray, false, "OnQueryFinish", "i", SENDDATA_THREAD);
  1808. ACTrackCount++;
  1809. }
  1810. stock ACSQLQuery(i, iRows) {
  1811. format(szMiscArray, sizeof(szMiscArray), "SELECT * FROM `aimbot` WHERE `accuracy` = '%d' AND `ischeating` = '%d' \
  1812. AND `aimingdirection` = '%d' AND `playerspeed` = '%d' AND `targetspeed` = '%d' AND `distance` = '%d' AND `deltaaim` = '%d'",
  1813. i, iACCountTracker[0], iACCountTracker[1], iACCountTracker[2], iACCountTracker[3], iACCountTracker[4], iACCountTracker[5]);
  1814. mysql_tquery(MainPipeline, szMiscArray, true, "OnACQueryResult2", "ii", i, iRows);
  1815. }
  1816. */
  1817. /*
  1818. GetHealthArmorForLabel(playerid) {
  1819. // -----
  1820. new Float:fHealth,
  1821. Float:fArmour;
  1822. GetHealth(playerid, fHealth);
  1823. GetArmour(playerid, fArmour);
  1824. if(IsPlayerPaused(playerid)) {
  1825. if(!fArmour) format(szMiscArray, sizeof(szMiscArray), "%s (%d)\n(Tabbed)\n\n{FF0000}-[%s{FF0000}]-", GetPlayerNameEx(playerid), playerid, GetPValueForLabel(fHealth));
  1826. else format(szMiscArray, sizeof(szMiscArray), "%s (%d)\n(Tabbed)\n\n-[%s{FF0000}]-\n{FF0000}-[%s{FF0000}]-", GetPlayerNameEx(playerid), playerid, GetPValueForLabel(fArmour), GetPValueForLabel(fHealth));
  1827. }
  1828. else {
  1829. if(!fArmour) format(szMiscArray, sizeof(szMiscArray), "%s (%d)\n\n{FF0000}-[%s{FF0000}]-", GetPlayerNameEx(playerid), playerid, GetPValueForLabel(fHealth));
  1830. else format(szMiscArray, sizeof(szMiscArray), "%s (%d)\n\n-[%s]-\n{FF0000}-[%s{FF0000}]-", GetPlayerNameEx(playerid), playerid, GetPValueForLabel(fArmour), GetPValueForLabel(fHealth));
  1831. }
  1832. // ------
  1833. if(IsPlayerPaused(playerid)) {
  1834. format(szMiscArray, sizeof(szMiscArray), "%s (%d)\n(Tabbed)", GetPlayerNameEx(playerid), playerid);
  1835. }
  1836. else format(szMiscArray, sizeof(szMiscArray), "%s (%d)", GetPlayerNameEx(playerid), playerid);
  1837. return szMiscArray;
  1838. }
  1839. */
  1840. /*
  1841. stock GetPValueForLabel(Float:fData) {
  1842. new szString[128],
  1843. iData;
  1844. iData = floatround(fData);
  1845. switch(iData) {
  1846. case 0: strins(szString, "{000000}0", 0, sizeof(szString));
  1847. case 1 .. 5: strins(szString, ".{000000}.....................", 0, sizeof(szString));
  1848. case 6 .. 10: strins(szString, "..{000000}...................", 0, sizeof(szString));
  1849. case 11 .. 15: strins(szString, "...{000000}.................", 0, sizeof(szString));
  1850. case 16 .. 20: strins(szString, "....{000000}................", 0, sizeof(szString));
  1851. case 21 .. 25: strins(szString, ".....{000000}...............", 0, sizeof(szString));
  1852. case 26 .. 30: strins(szString, "......{000000}..............", 0, sizeof(szString));
  1853. case 31 .. 35: strins(szString, ".......{000000}.............", 0, sizeof(szString));
  1854. case 36 .. 40: strins(szString, "........{000000}............", 0, sizeof(szString));
  1855. case 41 .. 45: strins(szString, ".........{000000}...........", 0, sizeof(szString));
  1856. case 46 .. 50: strins(szString, "..........{000000}..........", 0, sizeof(szString));
  1857. case 51 .. 55: strins(szString, "...........{000000}.........", 0, sizeof(szString));
  1858. case 56 .. 60: strins(szString, "............{000000}........", 0, sizeof(szString));
  1859. case 61 .. 65: strins(szString, ".............{000000}.......", 0, sizeof(szString));
  1860. case 66 .. 70: strins(szString, "..............{000000}......", 0, sizeof(szString));
  1861. case 71 .. 75: strins(szString, "................{000000}....", 0, sizeof(szString));
  1862. case 76 .. 80: strins(szString, ".................{000000}...", 0, sizeof(szString));
  1863. case 81 .. 85: strins(szString, "..................{000000}..", 0, sizeof(szString));
  1864. case 90 .. 95: strins(szString, "...................{000000}.", 0, sizeof(szString));
  1865. case 96 .. 300: strins(szString, "....................", 0, sizeof(szString));
  1866. default: szString = "-------";
  1867. }
  1868. return szString;
  1869. }
  1870. */
  1871. /*
  1872. CreatePlayerLabel(playerid) {
  1873. PlayerLabel[playerid] = CreateDynamic3DTextLabel(GetHealthArmorForLabel(playerid), 0xFFFFFFFF, 0.0, 0.0, 0.15, 30, playerid, .testlos = 1);
  1874. }
  1875. CMD:playerlabel(playerid, params[]) {
  1876. if(IsValidDynamic3DTextLabel(PlayerLabel[playerid])) {
  1877. foreach(new i : Player) ShowPlayerNameTagForPlayer(i, playerid, true);
  1878. DestroyDynamic3DTextLabel(PlayerLabel[playerid]);
  1879. SendClientMessageEx(playerid, COLOR_GRAD1, "You turned off your player label.");
  1880. }
  1881. else {
  1882. foreach(new i : Player) ShowPlayerNameTagForPlayer(i, playerid, false);
  1883. PlayerLabel[playerid] = CreateDynamic3DTextLabel(GetHealthArmorForLabel(playerid), 0xFFFFFFFF, 0.0, 0.0, 0.25, 30, playerid, .testlos = 1);
  1884. SendClientMessageEx(playerid, COLOR_GRAD1, "You turned on your player label.");
  1885. }
  1886. return 1;
  1887. }
  1888. */