Advertisement
Guest User

Anti-Cheat by ErikSon v3.1 fixxed

a guest
Jul 7th, 2014
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 33.21 KB | None | 0 0
  1. /*  |AntiCheat Version 1.0|
  2.     Anti Jetpack        [X]
  3.     Anti Weaponhack     [X]
  4.     Anti Healthhack     [X]
  5.     Anti Armourhack     [X]
  6.     Anti Moneyhack      [X]
  7.     Pingkick            [X]
  8.     Anti Badword        [X]
  9.     Anti Speedhack      [X]
  10.     Anti C-Bug          [X]
  11.     Anti Spawnkill      [X]
  12.     Anti Fakekill       [X]
  13.     Anti Driveby        [X]
  14.     Anti Spam           [X]
  15.     Anti IP-Spam        [X]
  16.     Anti TuningHack     [X]
  17.     Anti Flyhack        [X]
  18.     ||16 Anti- Funktionen||
  19.    
  20.     |AntiCheat Version 2.0|
  21.     Anti Airbrake       [X]
  22.     Anti Joypad         [X]
  23.     Anti Rapid-Fire     [X]
  24.     Anti Vehicle Tele   [X]
  25.     Anti Telehack       [X]
  26.     Anti Carsurf        [X]
  27.     ||6 Anti- Funktionen ||
  28.    
  29.     |AntiCheat Version 3.0|
  30.     +Anti Weaponhack verbessert+
  31.     Anti AFK-Ghost      [X]
  32.     Anti Slidebug       [X]
  33.     Anti No Reload      [X]
  34.     Anti Unlimmited Ammo[X]
  35.     Anti enter locked Cars[X]
  36.     Anti Playerspeedhack[X]
  37.     Anti Skinchanger    [X]
  38.     Anti Distancehack   [X]
  39.     ||8 Anti- Funktionen ||
  40.    
  41.     |AntiCheat Version 3.1|
  42.     +      Bugfixes       +
  43.     +     Aimbottest      +
  44.       Skinchanger entfernt
  45.    
  46.  
  47.    
  48.    
  49.     |       Gesamt        |
  50.     | 29 Anti- Funktionen |
  51. */
  52.  
  53. #include <a_samp>
  54. //#include <Water>
  55. #include <ocmd>
  56.  
  57. //Farben
  58. #define Schwarz         0x000000FF
  59. #define Rot             0xE10000FF
  60. #define Gelb            0xFFE600FF
  61. #define HBlau           0x00FFFFFF
  62. #define DBlau           0x0000FFFF
  63. #define Blau            0x2E9AFEFF
  64. #define HGruen          0x00FF00FF
  65. #define Orange          0xFFAB00FF
  66. #define Weiss           0xFFFFFFFF
  67. #define Grau            0xDCDCDCFF
  68. #define Gold            0xD4A017AA
  69. #define Lila            0x7800FFFF
  70. #define Pink            0xFF00CDFF
  71. #define Gruen           0x009F32FF
  72.  
  73.  
  74. #define MAX_PING            700     // Maximaler Ping
  75. #define MAX_VEHSPEED        400     // Vehicle-Speed ( am besten so lassen! )
  76. #define MAX_PLAYERSPEED     155     // Runningspeed ( am besten so lassen! )
  77. #define SPAMLIMIT           2       // 2 Sekunden ( am besten so lassen! )
  78. #define MAX_CBUG            1       // Maximale C-Bugs ( am besten so lassen! )
  79. #define Tuninghack                  //Wenn definiert, dann wird Spieler wegen Tuning im Interior 0 gekickt!
  80.  
  81.  
  82. new fmex[128];
  83. #define SCMToAllF(%0,%1,%2)  format(fmex,128,%1,%2) && SendClientMessageToAll(%0, fmex)
  84. #define SCMF(%0,%1,%2)  format(fmex,128,%2) && SendClientMessage(%0,%1,fmex)
  85. #define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
  86.  
  87.  
  88. forward AntiCheatTimer();
  89. forward SpamReset(playerid);
  90. forward pos(playerid);
  91. forward Desktop_Function(playerid);
  92. forward Kicke(playerid);
  93. forward CheckWeapon();
  94. forward CheckAim(playerid);
  95. new ACNewMoney[MAX_PLAYERS],
  96.     Float:ACNewArmour[MAX_PLAYERS],
  97.     Float:ACNewHealth[MAX_PLAYERS],
  98.     SpamCount[MAX_PLAYERS],
  99.     CBugCount[MAX_PLAYERS],
  100.     Waffe[MAX_PLAYERS][47],
  101.     nwh[MAX_PLAYERS][47],
  102.     Shot[MAX_PLAYERS],
  103.     ShotTime[MAX_PLAYERS],
  104.     Float:OldPos[MAX_PLAYERS][3],
  105.     Float:NewPos[MAX_PLAYERS][3],
  106.     switched[MAX_PLAYERS],
  107.     posbyserver[MAX_PLAYERS],
  108.     Float:vPos[MAX_VEHICLES][4],
  109.     Desktop_Check[MAX_PLAYERS],
  110.     Desktop_Status[MAX_PLAYERS],
  111.     Desktop_Timer[MAX_PLAYERS],
  112.     Desktop_Timer_Started[MAX_PLAYERS],
  113.     Desk[MAX_PLAYERS],
  114.     EnterLockedV[MAX_PLAYERS],
  115.     freezed[MAX_PLAYERS],
  116.     NoReloading[MAX_PLAYERS],
  117.     CurrentWeapon[MAX_PLAYERS],
  118.     CurrentAmmo[MAX_PLAYERS],
  119.     gmd[MAX_PLAYERS],
  120.     starte[MAX_PLAYERS],
  121.     stopAC[MAX_PLAYERS],
  122.     afk_sicher[MAX_PLAYERS];
  123.  
  124.  
  125. forward AC_OnPlayerConnect(playerid);
  126. forward AC_OnGameModeInit();
  127. forward AC_OnPlayerSpawn(playerid);
  128. forward AC_OnPlayerDeath(playerid,killerid,reason);
  129. forward AC_OnPlayerText(playerid,text[]);
  130. forward AC_OnPlayerEnterVehicle(playerid,vehicleid,ispassenger);
  131. forward AC_OnVehicleMod(playerid,vehicleid,componentid);
  132. forward AC_OnVehicleRespray(playerid,vehicleid,color1,color2);
  133. forward AC_OnVehiclePaintjob(playerid,vehicleid,paintjobid);
  134. forward AC_OnPlayerKeyStateChange(playerid,newkeys,oldkeys);
  135. forward AC_OnPlayerUpdate(playerid);
  136. forward AC_OnPlayerDisconnect(playerid,reason);
  137. forward AC_OnPlayerExitVehicle(playerid,vehicleid);
  138. forward AC_OnPlayerStateChange(playerid,newstate,oldstate);
  139. forward GivePlayerMoneyEx(playerid,money);
  140. forward SetPlayerMoneyEx(playerid,money);
  141. forward GivePlayerHealthEx(playerid,Float:health);
  142. forward SetPlayerHealthEx(playerid,Float:health);
  143. forward GivePlayerArmourEx(playerid,Float:armour);
  144. forward SetPlayerArmourEx(playerid,Float:armour);
  145. forward GivePlayerWeaponEx(playerid,Gun,Muni);
  146. forward SetPlayerPosEx(playerid,Float:x,Float:y,Float:z);
  147. forward TogglePlayerControllableEx(playerid,toggle);
  148.    
  149.  
  150.    
  151. new badword[][] = {
  152.     "Opfer",
  153.     "Lauch"
  154. };
  155.  
  156. public OnGameModeInit(){
  157.     CallRemoteFunction("AC_OnGameModeInit","");
  158.     print("\n--------------------------------------");
  159.     print(" AntiCheat by ErikSon");
  160.     print("--------------------------------------\n");
  161.     SetTimer("AntiCheatTimer",100,true);
  162.     SetTimer("CheckWeapon",888*2,true);
  163.     SetTimer("AC_CheckFlyhack",888*2,true);
  164.     return EnableStuntBonusForAll(false);
  165. }
  166. public OnPlayerConnect(playerid)
  167. {
  168.     Desk[playerid] = 0, afk_sicher[playerid] = 0;
  169.     switched[playerid] = 0,EnterLockedV[playerid] = 0;
  170.     Shot[playerid] = 0, ShotTime[playerid] = 0;
  171.     SetPlayerHealthEx(playerid,100);
  172.     Desktop_Check[playerid] = 0,Desktop_Timer_Started[playerid] = 0,Desktop_Status[playerid] = 0,gmd[playerid] = 0,starte[playerid] = 0;
  173.     return CallRemoteFunction("AC_OnPlayerConnect","i",playerid);
  174. }
  175.  
  176. public OnPlayerSpawn(playerid){
  177.     TogglePlayerControllableEx(playerid,1),
  178.     Waffe[playerid][0] = 1, Waffe[playerid][1] = 1;
  179.     if(!starte[playerid])starte[playerid] = 1;
  180.     return CallRemoteFunction("AC_OnPlayerSpawn","i",playerid);
  181. }
  182.  
  183. public OnPlayerDeath(playerid, killerid, reason){
  184.     if(GetPlayerState(killerid) == PLAYER_STATE_DRIVER)
  185.     {
  186.         new vehicleid,vehiclemodel;
  187.         vehicleid = GetPlayerVehicleID(killerid);
  188.         vehiclemodel = GetVehicleModel(vehicleid);
  189.         if(IsPlayerInAnyVehicle(playerid)) { return true; }
  190.         if(vehiclemodel == 425) { return true; } // Hunter
  191.         if(vehiclemodel == 432) { return true; } // Rhino
  192.         if(vehiclemodel == 447) { return true; } // Seasparrow
  193.         if(vehiclemodel == 476) { return true; } // Rustler
  194.         if(vehiclemodel == 520) { return true; } // Hydra
  195.         return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Driveby!",Namee(killerid)),Kicks(killerid);
  196.     }
  197.     return CallRemoteFunction("AC_OnPlayerDeath","iii",playerid,killerid,reason);
  198. }
  199.  
  200. public OnPlayerText(playerid, text[]){
  201.     if(anty(text))SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: IP / Adresse.",Namee(playerid)),Kicks(playerid);
  202.     SpamCount[playerid] ++;
  203.     SetTimerEx("SpamReset",888*SPAMLIMIT,false,"i",playerid);
  204.     if(SpamCount[playerid] > SPAMLIMIT)return SpamCount[playerid] = 0, SCMToAllF(Rot,"Spieler '%s' wurde von Server gekickt. Grund: Spam!",Namee(playerid)),Kicks(playerid);
  205.     new i = 0;
  206.     for(;i<sizeof(badword);i++)if(strfind(text,badword[i],false) != -1)SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Badword!",Namee(playerid)),Kicks(playerid);
  207.     return CallRemoteFunction("AC_OnPlayerText","is",playerid,text);
  208. }
  209.  
  210. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger){
  211.     if(IsAPlane(vehicleid) || IsAHelicopter(vehicleid))return GivePlayerWeaponEx(playerid,46,1);
  212.     new Engine, Lights, Alarm,Doors, Bonnet,Boot,Objective;
  213.     GetVehicleParamsEx(vehicleid, Engine, Lights, Alarm, Doors, Bonnet, Boot, Objective);
  214.     if(IsABike(vehicleid))return 1;
  215.     if(Doors == 1)return EnterLockedV[playerid] = vehicleid;
  216.     SetPlayerArmedWeapon(playerid,0);
  217.     return CallRemoteFunction("AC_OnPlayerEnterVehicle","iii",playerid,vehicleid,ispassenger);
  218. }
  219.  
  220. public OnVehicleMod(playerid, vehicleid, componentid){
  221.     #if defined Tuninghack
  222.     if(GetPlayerInterior(playerid) == 0)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Tuning-Hack!",Namee(playerid)),Kicks(playerid);
  223.     #endif
  224.     return CallRemoteFunction("AC_OnVehicleMod","iii",playerid,vehicleid,componentid);
  225. }
  226.  
  227. public OnVehiclePaintjob(playerid, vehicleid, paintjobid){
  228.     #if defined Tuninghack
  229.     if(GetPlayerInterior(playerid) == 0)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Tuning-Hack!",Namee(playerid)),Kicks(playerid);
  230.     #endif
  231.     return CallRemoteFunction("AC_OnVehiclePaintjob","iii",playerid,vehicleid,paintjobid);
  232. }
  233.  
  234. public OnVehicleRespray(playerid, vehicleid, color1, color2){
  235.     #if defined Tuninghack
  236.     if(GetPlayerInterior(playerid) == 0)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Tuning-Hack!",Namee(playerid)),Kicks(playerid);
  237.     #endif
  238.     return CallRemoteFunction("AC_OnVehicleRespray","iiii",playerid,vehicleid,color1,color2);
  239. }
  240.  
  241. public OnPlayerExitVehicle(playerid,vehicleid){
  242.     new Float:x,Float:y,Float:z;
  243.     GetVehiclePos(vehicleid,x,y,z);
  244.     vPos[vehicleid][0] = x,vPos[vehicleid][1] = y,vPos[vehicleid][2] = z;
  245.     return CallRemoteFunction("AC_OnPlayerExitVehicle","ii",playerid,vehicleid);
  246. }
  247.  
  248. public OnPlayerDisconnect(playerid,reason){
  249.     if(!IsPlayerInAnyVehicle(playerid))return 1;
  250.     new Float:x,Float:y,Float:z,vehicleid = GetPlayerVehicleID(playerid);
  251.     GetVehiclePos(vehicleid,x,y,z);
  252.     vPos[vehicleid][0] = x,vPos[vehicleid][1] = y,vPos[vehicleid][2] = z;
  253.     if(Desktop_Timer_Started[playerid] == 1) { KillTimer(Desktop_Timer[playerid]); }
  254.     return CallRemoteFunction("AC_OnPlayerDisconnect","ii",playerid,reason);
  255. }
  256.  
  257. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys){
  258.     if(((oldkeys & KEY_FIRE) || (oldkeys==KEY_FIRE)) && ((newkeys & KEY_CROUCH) || (newkeys==KEY_CROUCH)) && (!IsPlayerInAnyVehicle(playerid)))
  259.     {
  260.         CBugCount[playerid] ++;
  261.         if(CBugCount[playerid] >= MAX_CBUG)SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: C-Bug!",Namee(playerid)),Kicks(playerid);
  262.     }
  263.     new tick = GetTickCount(); new FIRE_WEAPON = GetPlayerWeapon(playerid) > 21;
  264.     if(oldkeys & KEY_SPRINT && FIRE_WEAPON)
  265.     {
  266.         new keys, ud, lr; GetPlayerKeys(playerid, keys, ud, lr);
  267.         if(ud != 0 || lr != 0)SetPVarInt(playerid, "SlideTime", tick + 500);
  268.     }
  269.     if( (newkeys & KEY_FIRE || newkeys & 128) && FIRE_WEAPON )if(tick < GetPVarInt(playerid, "SlideTime"))return SetPlayerArmedWeapon(playerid, 0),SetPVarInt(playerid, "SlideTime", -1);
  270.     return CallRemoteFunction("AC_OnPlayerKeyStateChange","iii",playerid,newkeys,oldkeys);
  271. }
  272.  
  273. public OnPlayerStateChange(playerid, newstate, oldstate){
  274.     if(oldstate == PLAYER_STATE_ONFOOT && (newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER))
  275.     {
  276.         if(EnterLockedV[playerid] <= 0)return 1;
  277.         if(EnterLockedV[playerid] == GetPlayerVehicleID(playerid))return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Enter locked Vehicle!",Namee(playerid));
  278.     }
  279.     return CallRemoteFunction("AC_OnPlayerStateChange","iii",playerid,newstate,oldstate);
  280. }
  281.  
  282. stock Float:GetDistanceBetweenPoints(Float:rx1,Float:ry1,Float:rz1,Float:rx2,Float:ry2,Float:rz2){
  283.     return floatadd(floatadd(floatsqroot(floatpower(floatsub(rx1,rx2),2)),floatsqroot(floatpower(floatsub(ry1,ry2),2))),floatsqroot(floatpower(floatsub(rz1,rz2),2)));
  284. }
  285.  
  286. stock Float:Distance(Float:X, Float:Y, Float:Z, Float:PointX, Float:PointY, Float:PointZ) return floatsqroot(floatadd(floatadd(floatpower(floatsub(X, PointX), 2.0), floatpower(floatsub(Y, PointY), 2.0)), floatpower(floatsub(Z, PointZ), 2.0)));
  287.  
  288. public OnPlayerUpdate(playerid){
  289.     if(Desk[playerid] >= 1)Desk[playerid] = 0;
  290.     if(Desktop_Timer_Started[playerid] == 0)
  291.     {
  292.         Desktop_Timer[playerid] = SetTimerEx("Desktop_Function",888,1,"d",playerid);
  293.         Desktop_Timer_Started[playerid] = 1;
  294.     }
  295.     Desktop_Check[playerid] += 1;
  296.     new keys, ud, lr;
  297.     GetPlayerKeys(playerid, keys, ud, lr);
  298.     if((ud != 128 && ud != 0 && ud != -128) || (lr != 128 && lr != 0 && lr != -128))return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Joypad!",Namee(playerid)),Kicks(playerid)
  299.     return CallRemoteFunction("AC_OnPlayerUpdate","i",playerid);
  300. }
  301.  
  302. public SpamReset(playerid)return SpamCount[playerid] = 0,CBugCount[playerid] = 0;
  303.  
  304.  
  305. public AntiCheatTimer(){
  306.     new i = 0,Float:health,Float:armour,surf,Float:x,Float:y,Float:z;
  307.     for(; i<MAX_PLAYERS; i++)
  308.     {
  309.         if(!IsPlayerConnected(i))continue;
  310.         if(Desk[i] >= 1)continue;
  311.         if(starte[i] <= 0)continue;
  312.         if(IsPlayerNPC(i))continue;
  313.         if(stopAC[i] > 0)return stopAC[i] --;
  314.         GetPlayerHealth(i,health);
  315.         GetPlayerArmour(i,armour);
  316.         GetPlayerPos(i,x,y,z);
  317.         new SName[MAX_PLAYER_NAME]; GetPlayerName(i,SName,MAX_PLAYER_NAME);
  318.         if(GetPlayerSpecialAction(i) == SPECIAL_ACTION_USEJETPACK)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Jetpack!",SName),Kicks(i);
  319.         else if(GetPlayerPing(i) > MAX_PING)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Zu hoher Ping! ( %i / %i )",SName,GetPlayerPing(i),MAX_PING),Kicks(i);
  320.         else if(GetPlayerMoney(i) > ACNewMoney[i])return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Moneyhack!",SName),Kicks(i);//
  321.         else if(health > ACNewHealth[i])return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Healthhack!",SName),Kicks(i);//
  322.         else if(armour > ACNewArmour[i])return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Armourhack!",SName),Kicks(i);//
  323.         else if(GetPlayerSpeed(i) > MAX_PLAYERSPEED)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Speedhack!",SName),Kicks(i);
  324.         else if(IsPlayerInAnyVehicle(i))if(GetVehicleSpeed(GetPlayerVehicleID(i)) > MAX_VEHSPEED)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Speedhack!",SName),Kicks(i);
  325.         surf = GetPlayerSurfingVehicleID(i);
  326.         if(!(GetPlayerSurfingVehicleID(i) == INVALID_VEHICLE_ID) && (GetVehicleSpeed(surf) > 0))return SetPlayerPos(i,x,y,z+10);
  327.         if(switched[i] == 2)
  328.         {
  329.             GetPlayerPos(i,NewPos[i][0],NewPos[i][1],NewPos[i][2]);
  330.             new Float:d = Distance(OldPos[i][0],OldPos[i][1],OldPos[i][2],NewPos[i][0],NewPos[i][1],NewPos[i][2]);
  331.             if(d >= 15 && posbyserver[i] != 1)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Airbrake / Teleporthack!",SName),Kicks(i);
  332.             switched[i] = 1;
  333.         }
  334.         else if(switched[i] == 1)GetPlayerPos(i,OldPos[i][0],OldPos[i][1],OldPos[i][2]),switched[i] = 2;
  335.     }
  336.     return 1;
  337. }
  338.  
  339. public CheckWeapon(){
  340.     new Weaps[13][2],Nameee[MAX_PLAYER_NAME];
  341.     for(new i = 0; i<MAX_PLAYERS; i++)
  342.     {
  343.         if(IsPlayerNPC(i))continue;
  344.         if(!IsPlayerConnected(i))continue;
  345.         GetPlayerName(i,Nameee,MAX_PLAYER_NAME);
  346.         for(new _w = 0; _w < 13; _w++)
  347.         {
  348.             GetPlayerWeaponData(i, _w, Weaps[_w][0], Weaps[_w][1]);
  349.             if(Weaps[_w][0] <= 0 && Waffe[i][Weaps[_w][0]] != 1)continue;
  350.             else if(Weaps[_w][0] < 1 && Weaps[_w][0] > 47)continue;
  351.             else if(Weaps[_w][0] <= 0 || Weaps[_w][1] <= 0)continue;
  352.             else if(nwh[i][Weaps[_w][0]] == 1 && FireWeapon(Weaps[_w][0])){nwh[i][Weaps[_w][0]] = 0; SetPlayerAmmo(i,_w,0); continue;}
  353.             else if(Waffe[i][Weaps[_w][0]] <= 0 && nwh[i][Weaps[_w][0]] == 0 && Weaps[_w][0] != 46)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Waffenhack!",Nameee),Kicks(i);
  354.         }
  355.     }
  356.     return 1;
  357. }
  358.  
  359. stock FireWeapon(weaponid){
  360.     switch(weaponid){
  361.         case 16..18:return 1;
  362.         case 22..39:return 1;
  363.         default:return 0;
  364.     }
  365.     return 1;
  366. }
  367.  
  368. public GivePlayerWeaponEx(playerid,Gun,Muni){
  369.     Waffe[playerid][Gun] = 1;
  370.     stopAC[playerid] = 15;
  371.     return GivePlayerWeapon(playerid, Gun, Muni);
  372. }
  373.  
  374. public GivePlayerMoneyEx(playerid,money){
  375.     ACNewMoney[playerid] = GetPlayerMoney(playerid) + money;
  376.     stopAC[playerid] = 15;
  377.     return GivePlayerMoney(playerid,money);
  378. }
  379.  
  380. public SetPlayerMoneyEx(playerid,money){
  381.     ACNewMoney[playerid] = money;
  382.     stopAC[playerid] = 15;
  383.     return GivePlayerMoney(playerid,money);
  384. }
  385.  
  386. public SetPlayerArmourEx(playerid,Float:armour){
  387.     ACNewArmour[playerid] = armour;
  388.     stopAC[playerid] = 15;
  389.     return SetPlayerArmour(playerid,armour);
  390. }
  391.  
  392. public GivePlayerArmourEx(playerid,Float:armour){
  393.     ACNewArmour[playerid] += armour;
  394.     stopAC[playerid] = 15;
  395.     return SetPlayerArmour(playerid,ACNewArmour[playerid]);
  396. }
  397.  
  398. public SetPlayerHealthEx(playerid,Float:health){
  399.     ACNewHealth[playerid] = health;
  400.     stopAC[playerid] = 15;
  401.     return SetPlayerHealth(playerid,health);
  402. }
  403.  
  404. public GivePlayerHealthEx(playerid,Float:health){
  405.     ACNewHealth[playerid] = health;
  406.     stopAC[playerid] = 15;
  407.     return SetPlayerHealth(playerid,ACNewHealth[playerid]);
  408. }
  409.  
  410. public SetPlayerPosEx(playerid,Float:x,Float:y,Float:z){
  411.     posbyserver[playerid] = 1;
  412.     SetTimerEx("pos",888*2,false,"i",playerid);
  413.     stopAC[playerid] = 15;
  414.     return SetPlayerPos(playerid,x,y,z);
  415. }
  416.  
  417. public TogglePlayerControllableEx(playerid,toggle){
  418.     switch(toggle)
  419.     {
  420.         case false:freezed[playerid] = 1;
  421.         case true:freezed[playerid] = 0;
  422.     }
  423.     stopAC[playerid] = 15;
  424.     return TogglePlayerControllable(playerid,toggle);
  425. }
  426.  
  427. stock IsAPlane(vehicleid){
  428.     switch(GetVehicleModel(vehicleid)){
  429.         case 460,464,476,511,512,513,519,520,553,577,592,593: return 1;
  430.     }
  431.     return 0;
  432. }
  433.  
  434. stock IsAHelicopter(vehicleid){
  435.     switch(GetVehicleModel(vehicleid)){
  436.         case 417,425,447,465,469,487,488,497,501,548,563: return 1;
  437.     }
  438.     return 0;
  439. }
  440.  
  441. stock anty(string[]){
  442.     if(strfind(string,"www.",true)!=-1 || strfind(string,"http://",true)!=-1 || strfind(string,".com",true)!=-1 || strfind(string,".de",true)!=-1 || strfind(string,".net",true)!=-1 || strfind(string,".tk",true)!=-1 || strfind(string,"91.",true)!=-1 || strfind(string,"195.",true)!=-1 ||strfind(string,".pl",true)!=-1|| strfind(string,".org",true)!=-1||
  443.     strfind(string,"89.",true)!=-1 || strfind(string,"176.",true)!=-1 || strfind(string,":7777",true)!=-1 || strfind(string,"8.",true)!=-1 || strfind(string,"68.",true)!=-1 || strfind(string,"195.",true)!=-1 || strfind(string,"216.",true)!=-1|| strfind(string,"109.",true)!=-1||
  444.     strfind(string,"37.",true)!=-1 || strfind(string,"95.",true)!=-1 || strfind(string,"77.",true)!=-1 || strfind(string,"174.",true)!=-1 || strfind(string,"202.",true)!=-1 || strfind(string,"212.",true)!=-1 || strfind(string,"188.",true)!=-1|| strfind(string,"31.",true)!=-1||
  445.     strfind(string,"46.",true)!=-1 || strfind(string,"178.",true)!=-1 || strfind(string,"70.",true)!=-1 || strfind(string,"168.",true)!=-1 || strfind(string,"99.",true)!=-1 || strfind(string,"120.",true)!=-1 || strfind(string,"47.",true)!=-1|| strfind(string,"253.",true)!=-1||
  446.     strfind(string,"85.",true)!=-1 || strfind(string,"86.",true)!=-1 || strfind(string,"9.",true)!=-1 || strfind(string,"208.",true)!=-1 || strfind(string,"64.",true)!=-1 || strfind(string,"34.",true)!=-1 || strfind(string,"78.",true)!=-1|| strfind(string,"100.",true)!=-1||
  447.     strfind(string,"182.",true)!=-1 || strfind(string,"82.",true)!=-1 || strfind(string,"164.",true)!=-1 || strfind(string,"23.",true)!=-1 || strfind(string,"101.",true)!=-1 || strfind(string,"0.",true)!=-1 || strfind(string,"79.",true)!=-1)
  448.     return true;
  449.     return false;
  450. }
  451.  
  452.  
  453. stock GetVehicleSpeed(vehicleid){
  454.     new Float:xPos[3];
  455.     GetVehicleVelocity(vehicleid, xPos[0], xPos[1], xPos[2]);
  456.     return floatround(floatsqroot(xPos[0] * xPos[0] + xPos[1] * xPos[1] + xPos[2] * xPos[2]) * 170.00);
  457. }
  458.  
  459.  
  460. stock Namee(playerid){
  461.    new name[MAX_PLAYER_NAME];
  462.    GetPlayerName(playerid,name,sizeof(name));
  463.    return name;
  464. }
  465.  
  466. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  467. {
  468.     if(Desk[playerid] >= 2 && afk_sicher[playerid] > 3)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: AFK-Ghost!",Namee(playerid)),Kicks(playerid);
  469.     else if(Desk[playerid] >= 2 && afk_sicher[playerid] < 3)afk_sicher[playerid] ++;
  470.     else if(!Desk[playerid])afk_sicher[playerid] = 0;
  471.     if(GetPlayerAmmo(playerid) <= 1 && (weaponid >= 1 && weaponid <= 47))Waffe[playerid][weaponid] = 0,nwh[playerid][weaponid] = 1;
  472.     if(weaponid != 38)
  473.     {
  474.         if((gettime() - ShotTime[playerid]) < 1)Shot[playerid]+=1;
  475.         else Shot[playerid]=0;
  476.         if(Shot[playerid] > 15)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Rapid-Fire!",Namee(playerid)),Kicks(playerid);
  477.         ShotTime[playerid] = gettime();
  478.     }
  479.     if(IsWeaponWithAmmo(weaponid))
  480.     {
  481.         new count = 0;
  482.         if(weaponid != CurrentWeapon[playerid]) CurrentWeapon[playerid] = weaponid, CurrentAmmo[playerid] = GetPlayerWeaponAmmo(playerid,weaponid), count++;
  483.         if(GetPlayerWeaponAmmo(playerid,weaponid) > CurrentAmmo[playerid] || GetPlayerWeaponAmmo(playerid,weaponid) < CurrentAmmo[playerid]) CurrentAmmo[playerid] = GetPlayerWeaponAmmo(playerid,weaponid),NoReloading[playerid] = 0,count++;
  484.         if(GetPlayerWeaponAmmo(playerid,weaponid) != 0 && GetPlayerWeaponAmmo(playerid,weaponid) == CurrentAmmo[playerid] && count == 0)
  485.         {
  486.             NoReloading[playerid]++;
  487.             if(NoReloading[playerid] >= 5)return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Unlimmited Ammo / No Reloading!",Namee(playerid));
  488.         }
  489.     }
  490.     return 1;
  491. }
  492.  
  493. stock GetPlayerSpeed(playerid) {
  494.     if(playerid != INVALID_PLAYER_ID)
  495.     {
  496.         new Float:Pos[3],Float:PS;
  497.         GetPlayerVelocity(playerid, Pos[0], Pos[1], Pos[2]);
  498.         PS = floatsqroot(Pos[0]*Pos[0] + Pos[1]*Pos[1] + Pos[2]*Pos[2])*200;
  499.         return floatround(PS,floatround_round);
  500.     }
  501.     return INVALID_PLAYER_ID;
  502. }  
  503.  
  504. public pos(playerid)return posbyserver[playerid] = 0;
  505. stock CheckFireArm(weaponid) {
  506.    switch(weaponid)
  507.    {
  508.        case 16..39, 41..43: return 1;
  509.        default: return 0;
  510.    }
  511.    return 0;
  512. }
  513.  
  514. stock SetVehiclePosEx(vehicleid,Float:x,Float:y,Float:z){
  515.     vPos[vehicleid][0] = x,vPos[vehicleid][1] = y,vPos[vehicleid][2] = z;
  516.     return SetVehiclePos(vehicleid,x,y,z);
  517. }
  518.  
  519. public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat){
  520.     new Float:x,Float:y,Float:z; GetVehiclePos(vehicleid, x, y, z);
  521.     if(vPos[vehicleid][0] == 0.0 && vPos[vehicleid][1] == 0.0 && vPos[vehicleid][2] == 0.0)vPos[vehicleid][0] = x,vPos[vehicleid][1] = y,vPos[vehicleid][2] = z;
  522.     new Float:dis = Distance(vPos[vehicleid][0],vPos[vehicleid][1],vPos[vehicleid][2], x,y,z);
  523.     if(dis > 5)return SetVehiclePosEx(vehicleid,vPos[vehicleid][0],vPos[vehicleid][1],vPos[vehicleid][2]);
  524.     else vPos[vehicleid][0] = x,vPos[vehicleid][1] = y,vPos[vehicleid][2] = z;
  525.     return 1;
  526. }
  527.  
  528. stock IsPlayerMoving(playerid){
  529.     new Float:Velocity[3];
  530.     GetPlayerVelocity(playerid, Velocity[0], Velocity[1], Velocity[2]);
  531.     if(Velocity[0] == 0 && Velocity[1] == 0 && Velocity[2] == 0) return false;
  532.     return true;
  533. }
  534.  
  535. stock IsABike(vid){
  536.     new modelid = GetVehicleModel(vid);
  537.     if(modelid == 509||modelid ==510||modelid ==581||modelid ==522||modelid ==521||modelid ==523||modelid ==586||modelid ==481||modelid ==462||modelid ==448||modelid ==461||modelid ==463||modelid ==468||modelid ==471) return 1;
  538.     else return 0;
  539. }
  540.  
  541. stock IsWeaponWithAmmo(weaponid)
  542. {
  543.     switch(weaponid)
  544.     {
  545.         case 16..18, 22..39, 41..42: return 1;
  546.         default: return 0;
  547.     }
  548.     return 0;
  549.  
  550. }
  551.  
  552. stock GetPlayerWeaponAmmo(playerid,weaponid)
  553. {
  554.     new wd[2][13];
  555.     for(new i; i<13; i++)GetPlayerWeaponData(playerid,i,wd[0][i],wd[1][i]);
  556.     for(new i; i<13; i++)if(weaponid == wd[0][i]) return wd[1][i];
  557.     return 0;
  558. }
  559.  
  560. stock Kicks(playerid)return SetTimerEx("Kicke",50,false,"i",playerid);
  561. public Kicke(playerid)return Kick(playerid);
  562.  
  563.  
  564. #if defined _ALS_OnPlayerConnect
  565.     #undef OnPlayerConnect
  566. #else
  567.     #define _ALS_OnPlayerConnect
  568. #endif
  569. #define OnPlayerConnect             AC_OnPlayerConnect
  570.  
  571. #if defined _ALS_OnGameModeInit
  572.     #undef OnGameModeInit
  573. #else
  574.     #define _ALS_OnGameModeInit
  575. #endif
  576. #define OnGameModeInit              AC_OnGameModeInit
  577.  
  578. #if defined _ALS_OnPlayerSpawn
  579.     #undef OnPlayerSpawn
  580. #else
  581.     #define _ALS_OnPlayerSpawn
  582. #endif
  583. #define OnPlayerSpawn               AC_OnPlayerSpawn
  584.  
  585. #if defined _ALS_OnPlayerDeath
  586.     #undef OnPlayerDeath
  587. #else
  588.     #define _ALS_OnPlayerDeath
  589. #endif
  590. #define OnPlayerDeath               AC_OnPlayerDeath
  591.  
  592. #if defined _ALS_OnPlayerText
  593.     #undef OnPlayerText
  594. #else
  595.     #define _ALS_OnPlayerText
  596. #endif
  597. #define OnPlayerText                AC_OnPlayerText
  598.  
  599. #if defined _ALS_OnPlayerEnterVehicle
  600.     #undef OnPlayerEnterVehicle
  601. #else
  602.     #define _ALS_OnPlayerEnterVehicle
  603. #endif
  604. #define OnPlayerEnterVehicle        AC_OnPlayerEnterVehicle
  605.  
  606. #if defined _ALS_OnVehicleMod
  607.     #undef OnVehicleMod
  608. #else
  609.     #define _ALS_OnVehicleMod
  610. #endif
  611. #define OnVehicleMod                AC_OnVehicleMod
  612.  
  613. #if defined _ALS_OnVehicleRespray
  614.     #undef OnVehicleRespray
  615. #else
  616.     #define _ALS_OnVehicleRespray
  617. #endif
  618. #define OnVehicleRespray            AC_OnVehicleRespray
  619.  
  620. #if defined _ALS_OnVehiclePaintjob
  621.     #undef OnVehiclePaintjob
  622. #else
  623.     #define _ALS_OnVehiclePaintjob
  624. #endif
  625. #define OnVehiclePaintjob           AC_OnVehiclePaintjob
  626.  
  627. #if defined _ALS_OnPlayerKeyStateChange
  628.     #undef OnPlayerKeyStateChange
  629. #else
  630.     #define _ALS_OnPlayerKeyStateChange
  631. #endif
  632. #define OnPlayerKeyStateChange      AC_OnPlayerKeyStateChange
  633.  
  634. #if defined _ALS_OnPlayerUpdate
  635.     #undef OnPlayerUpdate
  636. #else
  637.     #define _ALS_OnPlayerUpdate
  638. #endif
  639. #define OnPlayerUpdate              AC_OnPlayerUpdate
  640.  
  641. #if defined _ALS_OnPlayerDisconnect
  642.     #undef OnPlayerDisconnect
  643. #else
  644.     #define _ALS_OnPlayerDisconnect
  645. #endif
  646. #define OnPlayerDisconnect          AC_OnPlayerDisconnect
  647.  
  648. #if defined _ALS_OnPlayerExitVehicle
  649.     #undef OnPlayerExitVehicle
  650. #else
  651.     #define _ALS_OnPlayerExitVehicle
  652. #endif
  653. #define OnPlayerExitVehicle         AC_OnPlayerExitVehicle
  654.  
  655. #if defined _ALS_OnPlayerStateChange
  656.     #undef OnPlayerStateChange
  657. #else
  658.     #define _ALS_OnPlayerStateChange
  659. #endif
  660. #define OnPlayerStateChange         AC_OnPlayerStateChange
  661.  
  662.  
  663.  
  664. #define GivePlayerMoney             GivePlayerWeaponEx
  665. #define SetPlayerMoney              SetPlayerMoneyEx
  666. #define GivePlayerHealth            GivePlayerHealthEx
  667. #define SetPlayerHealth             SetPlayerHealthEx
  668. #define GivePlayerArmour            GivePlayerArmourEx
  669. #define SetPlayerArmour             SetPlayerArmourEx
  670. #define GivePlayerWeapon            GivePlayerWeaponEx
  671. #define SetPlayerPos                SetPlayerPosEx
  672. #define TogglePlayerControllable    TogglePlayerControllableEx
  673.  
  674. ocmd:aimbottest(playerid,p[])
  675. {
  676.     if(!IsPlayerAdmin(playerid))return 1;
  677.     new pID,Float:_pos[3];
  678.     if(sscanf(p,"u",pID))return SCMF(playerid,Rot,"Benutzung: /aimbottest [SPIELER/ID]");
  679.     if(!IsPlayerConnected(pID))return SCMF(playerid,Rot,"Dieser Spieler ist nicht Online!");
  680.     GetPlayerPos(pID,_pos[0],_pos[1],_pos[2])
  681.     new tick = GetTickCount(), tickmax = tick + 300;
  682.     SetPlayerPosEx(playerid,_pos[0]+0.5,_pos[1]+0.5,_pos[2]);
  683.     if(GetPlayerTargetPlayer(pID) == playerid && tick <= tickmax)return SCMF(playerid,Rot,"Spieler hat Aimbot! ( Weiterer Test empfohlen! )");
  684.     return SCMF(playerid,Rot,"Spieler hat kein Aimbot! ( Weiterer Test empfohlen! )");
  685. }
  686.  
  687.  
  688. stock IsPlayerSwimming(playerid)
  689. {
  690.         if(!IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
  691.         {
  692.             new animlib[32], animname[32];
  693.             GetAnimationName(GetPlayerAnimationIndex(playerid),animlib,32,animname,32);
  694.  
  695.             if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_GLIDE", true)) return 1;
  696.             else if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_BREAST", true)) return 1;
  697.             else if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_CRAWL", true)) return 1;
  698.             else if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_DIVE_UNDER", true)) return 1;
  699.             else if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_DIVE_GLIDE", true)) return 1;
  700.             else if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_UNDER", true)) return 1;
  701.             else if(!strcmp(animlib, "SWIM", true) && !strcmp(animname, "SWIM_TREAD", true)) return 1;
  702.         }
  703.         return 0;
  704. }
  705. stock InPlayerInWater(playerid)
  706. {
  707.     new Float:x,Float:y,Float:z;
  708.     GetPlayerPos(playerid, x, y, z);
  709.     if((x >= -1408.0629 && y >= 2021.0587 && x <= -460.9319 && y <= 2861.4893) ||//Represa do deserto de Las Venturas
  710.     (x >= 1269.5886 && y >= -810.4507 && x <= 1288.8916 && y <= -800.5959) ||//Piscina de uma casa em VineWood (Mad Dog's Mansion)
  711.     (x >= 1086.6010 && y >= -683.6998 && x <= 1103.0225 && y <= -662.1832) ||//Piscina de uma casa em VineWood (Perto Mad Dog's Mansion)
  712.     (x >= 169.6879 && y >= -1392.6630 && x <= 281.5444 && y <= -1168.9749) ||// 2 Piscinas em VineWood
  713.     (x >= -828.3018 && y >= -2107.1487 && x <= -443.5032 && y <= -1855.6273) ||//Lago da árvore caída, ou Lago Morto
  714.     (x >= 1198.9982 && y >= -2407.0581 && x <= 1275.7397 && y <= -2341.6262) ||//Lago perto do aeroporto Los Santos
  715.     (x >= 2293.1467 && y >= -1432.5869 && x <= 2331.7388 && y <= -1397.6476) ||//Lago perto da Igreja Los Santos
  716.     (x >= 1915.3196 && y >= -1236.2382 && x <= 2016.6565 && y <= -1167.9290) ||//Park Glen Los Santos
  717.     (x >= -2747.1692 && y >= -510.1152 && x <= -2663.2468 && y <= -411.4905) ||//Lago em San Fierro
  718.     (x >= 1838.8041 && y >= 1463.2024 && x <= 2035.4167 && y <= 1703.0480) ||//Cascata do Login em Las Venturas
  719.     (x >= 2049.6646 && y >= 1843.3029 && x <= 2119.9021 && y <= 1983.5464) ||//Navio Pirata em Las Venturas
  720.     (x >= 2094.9255 && y >= 1085.2852 && x <= 2179.1790 && y <= 1183.0610) ||//Frente de um Cascino em Las Venturas
  721.     (x >= 2545.3718 && y >= 2347.7112 && x <= 2593.6794 && y <= 2403.8040))//Piscina de um prédio em Las Venturas
  722.     {
  723.             return 1;
  724.     }
  725.     return 0;
  726. }
  727.  
  728. forward AC_CheckFlyhack();
  729. public AC_CheckFlyhack()
  730. {
  731.     for(new i; i < MAX_PLAYERS; i++)
  732.     {
  733.         if(!IsPlayerConnected(i))continue;
  734.         if(!IsPlayerSwimming(i))continue;
  735.         new Float:XPos,Float:YPos,Float:ZPos;
  736.         GetPlayerPos(i,XPos,YPos,ZPos);
  737.         if(ZPos > 1.0)
  738.         {
  739.             if(!InPlayerInWater(i))return SCMToAllF(Rot,"Spieler '%s' wurde vom Server gekickt. Grund: Flyhack!",Namee(i)),Kicks(i);
  740.         }
  741.     }
  742.     return 1;
  743. }
  744.  
  745.  
  746.  
  747. stock sscanf(string[], format[], {Float,_}:...)
  748. {
  749.     #if defined isnull
  750.         if (isnull(string))
  751.     #else
  752.         if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
  753.     #endif
  754.         {
  755.             return format[0];
  756.         }
  757.     #pragma tabsize 4
  758.     new
  759.         formatPos = 0,
  760.         stringPos = 0,
  761.         paramPos = 2,
  762.         paramCount = numargs(),
  763.         delim = ' ';
  764.     while (string[stringPos] && string[stringPos] <= ' ')
  765.     {
  766.         stringPos++;
  767.     }
  768.     while (paramPos < paramCount && string[stringPos])
  769.     {
  770.         switch (format[formatPos++])
  771.         {
  772.             case '\0':
  773.             {
  774.                 return 0;
  775.             }
  776.             case 'i', 'd':
  777.             {
  778.                 new
  779.                     neg = 1,
  780.                     num = 0,
  781.                     ch = string[stringPos];
  782.                 if (ch == '-')
  783.                 {
  784.                     neg = -1;
  785.                     ch = string[++stringPos];
  786.                 }
  787.                 do
  788.                 {
  789.                     stringPos++;
  790.                     if ('0' <= ch <= '9')
  791.                     {
  792.                         num = (num * 10) + (ch - '0');
  793.                     }
  794.                     else
  795.                     {
  796.                         return -1;
  797.                     }
  798.                 }
  799.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  800.                 setarg(paramPos, 0, num * neg);
  801.             }
  802.             case 'h', 'x':
  803.             {
  804.                 new
  805.                     num = 0,
  806.                     ch = string[stringPos];
  807.                 do
  808.                 {
  809.                     stringPos++;
  810.                     switch (ch)
  811.                     {
  812.                         case 'x', 'X':
  813.                         {
  814.                             num = 0;
  815.                             continue;
  816.                         }
  817.                         case '0' .. '9':
  818.                         {
  819.                             num = (num << 4) | (ch - '0');
  820.                         }
  821.                         case 'a' .. 'f':
  822.                         {
  823.                             num = (num << 4) | (ch - ('a' - 10));
  824.                         }
  825.                         case 'A' .. 'F':
  826.                         {
  827.                             num = (num << 4) | (ch - ('A' - 10));
  828.                         }
  829.                         default:
  830.                         {
  831.                             return -1;
  832.                         }
  833.                     }
  834.                 }
  835.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  836.                 setarg(paramPos, 0, num);
  837.             }
  838.             case 'c':
  839.             {
  840.                 setarg(paramPos, 0, string[stringPos++]);
  841.             }
  842.             case 'f':
  843.             {
  844.  
  845.                 new changestr[16], changepos = 0, strpos = stringPos;    
  846.                 while(changepos < 16 && string[strpos] && string[strpos] != delim)
  847.                 {
  848.                     changestr[changepos++] = string[strpos++];
  849.                     }
  850.                 changestr[changepos] = '\0';
  851.                 setarg(paramPos,0,_:floatstr(changestr));
  852.             }
  853.             case 'p':
  854.             {
  855.                 delim = format[formatPos++];
  856.                 continue;
  857.             }
  858.             case '\'':
  859.             {
  860.                 new
  861.                     end = formatPos - 1,
  862.                     ch;
  863.                 while ((ch = format[++end]) && ch != '\'') {}
  864.                 if (!ch)
  865.                 {
  866.                     return -1;
  867.                 }
  868.                 format[end] = '\0';
  869.                 if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
  870.                 {
  871.                     if (format[end + 1])
  872.                     {
  873.                         return -1;
  874.                     }
  875.                     return 0;
  876.                 }
  877.                 format[end] = '\'';
  878.                 stringPos = ch + (end - formatPos);
  879.                 formatPos = end + 1;
  880.             }
  881.             case 'u':
  882.             {
  883.                 new
  884.                     end = stringPos - 1,
  885.                     id = 0,
  886.                     bool:num = true,
  887.                     ch;
  888.                 while ((ch = string[++end]) && ch != delim)
  889.                 {
  890.                     if (num)
  891.                     {
  892.                         if ('0' <= ch <= '9')
  893.                         {
  894.                             id = (id * 10) + (ch - '0');
  895.                         }
  896.                         else
  897.                         {
  898.                             num = false;
  899.                         }
  900.                     }
  901.                 }
  902.                 if (num && IsPlayerConnected(id))
  903.                 {
  904.                     setarg(paramPos, 0, id);
  905.                 }
  906.                 else
  907.                 {
  908.                     #if !defined foreach
  909.                         #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  910.                         #define __SSCANF_FOREACH__
  911.                     #endif
  912.                     string[end] = '\0';
  913.                     num = false;
  914.                     new
  915.                         name[MAX_PLAYER_NAME];
  916.                     id = end - stringPos;
  917.                     foreach (Player, playerid)
  918.                     {
  919.                         GetPlayerName(playerid, name, sizeof (name));
  920.                         if (!strcmp(name, string[stringPos], true, id))
  921.                         {
  922.                             setarg(paramPos, 0, playerid);
  923.                             num = true;
  924.                             break;
  925.                         }
  926.                     }
  927.                     if (!num)
  928.                     {
  929.                         setarg(paramPos, 0, INVALID_PLAYER_ID);
  930.                     }
  931.                     string[end] = ch;
  932.                     #if defined __SSCANF_FOREACH__
  933.                         #undef foreach
  934.                         #undef __SSCANF_FOREACH__
  935.                     #endif
  936.                 }
  937.                 stringPos = end;
  938.             }
  939.             case 's', 'z':
  940.             {
  941.                 new
  942.                     i = 0,
  943.                     ch;
  944.                 if (format[formatPos])
  945.                 {
  946.                     while ((ch = string[stringPos++]) && ch != delim)
  947.                     {
  948.                         setarg(paramPos, i++, ch);
  949.                     }
  950.                     if (!i)
  951.                     {
  952.                         return -1;
  953.                     }
  954.                 }
  955.                 else
  956.                 {
  957.                     while ((ch = string[stringPos++]))
  958.                     {
  959.                         setarg(paramPos, i++, ch);
  960.                     }
  961.                 }
  962.                 stringPos--;
  963.                 setarg(paramPos, i, '\0');
  964.             }
  965.             default:
  966.             {
  967.                 continue;
  968.             }
  969.         }
  970.         while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
  971.         {
  972.             stringPos++;
  973.         }
  974.         while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
  975.         {
  976.             stringPos++;
  977.         }
  978.         paramPos++;
  979.     }
  980.     do
  981.     {
  982.         if ((delim = format[formatPos++]) > ' ')
  983.         {
  984.             if (delim == '\'')
  985.             {
  986.                 while ((delim = format[formatPos++]) && delim != '\'') {}
  987.             }
  988.             else if (delim != 'z')
  989.             {
  990.                 return delim;
  991.             }
  992.         }
  993.     }
  994.     while (delim > ' ');
  995.     return 0;
  996. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement