Advertisement
Guest User

Vehicles System by Angelus

a guest
Dec 30th, 2011
462
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 19.06 KB | None | 0 0
  1. #include <a_samp>
  2. #include <dini>
  3. #define MAX_PLAYERS_EX MAX_PLAYERS //kvôli sscanf
  4.  
  5. #define MAX_PLAYER_CARS 3
  6. #define RED 0xFF0000FF
  7. #define ZLTA 0xFFFF00FF
  8. #define SCM SendClientMessage
  9. #define DIALOG_CARS_LIST 612
  10. #define DIALOG_CAR_MENU  613
  11.  
  12. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
  13.  
  14. enum Player_Car_Info
  15. {
  16.     Float:CposX,
  17.     Float:CposY,
  18.     Float:CposZ,
  19.     Float:CposA,
  20.     Color1,
  21.     Color2,
  22.     CarID,
  23. }
  24. new PlayerCar[MAX_PLAYERS][MAX_PLAYER_CARS][Player_Car_Info];
  25.  
  26. stock BuyCarForPlayer(playerid,modelid,Float:spawnX,Float:spawnY,Float:spawnZ,Float:spawnA,CarCost)
  27. {
  28.     if(GetPlayerMoney(playerid)<CarCost)return SCM(playerid,RED,"Nemáš dostatok peňazí !");
  29.     new CarSlot = GetPlayerFreeSlot(playerid);
  30.     if(CarSlot == -1)return SCM(playerid,RED,"Nemáš voľný slot pre nové auto !");
  31.     GivePlayerMoney(playerid,-CarCost);
  32.     PlayerCar[playerid][CarSlot][CarID]=CreateVehicle(modelid,spawnX,spawnY,spawnZ,spawnA,1,1,-1);
  33.     PlayerCar[playerid][CarSlot][CposX]=spawnX;
  34.     PlayerCar[playerid][CarSlot][CposY]=spawnY;
  35.     PlayerCar[playerid][CarSlot][CposZ]=spawnZ;
  36.     PlayerCar[playerid][CarSlot][CposA]=spawnA;
  37.     PlayerCar[playerid][CarSlot][Color1]=1;
  38.     PlayerCar[playerid][CarSlot][Color2]=1;
  39.     new s[50];
  40.     format(s,50,"PCars/%sCar%d.ini",PlayerName(playerid),CarSlot);
  41.     dini_Create(s);
  42.     dini_IntSet(s,"ModelID",modelid);
  43.     dini_FloatSet(s,"SpawnX",spawnX);
  44.     dini_FloatSet(s,"SpawnY",spawnY);
  45.     dini_FloatSet(s,"SpawnZ",spawnZ);
  46.     dini_FloatSet(s,"SpawnA",spawnA);
  47.     dini_IntSet(s,"Color1",1);
  48.     dini_IntSet(s,"Color2",1);
  49.     dini_FloatSet(s,"Health",1000);
  50.     dini_Set(s,"Damage","0 0 0");
  51.     PutPlayerInVehicle(playerid,PlayerCar[playerid][CarSlot][CarID],0);
  52.     SCM(playerid,ZLTA,"Kúpil si si nové vozidlo. Vozidlo si môžeš kdekoľvek zaparkovať pomocou /park.");
  53.     return 1;
  54. }
  55.  
  56. stock DeletePlayerCar(playerid,SlotID)
  57. {
  58.     DestroyVehicle(PlayerCar[playerid][SlotID][CarID]);
  59.     PlayerCar[playerid][SlotID][CarID]=-1;
  60.     new s[50];
  61.     format(s,50,"PCars/%sCar%d.ini",PlayerName(playerid),SlotID);
  62.     dini_Remove(s);
  63. }
  64.  
  65. stock RespawnPlayerCar(playerid,SlotID)
  66. {
  67.     SetVehiclePos(PlayerCar[playerid][SlotID][CarID],
  68.     PlayerCar[playerid][SlotID][CposX],
  69.     PlayerCar[playerid][SlotID][CposY],
  70.     PlayerCar[playerid][SlotID][CposZ]);
  71.     SetVehicleZAngle(PlayerCar[playerid][SlotID][CarID],
  72.     PlayerCar[playerid][SlotID][CposA]);
  73. }
  74.  
  75. stock GetPlayerFreeSlot(playerid)
  76. {
  77.     for(new i;i<MAX_PLAYER_CARS;i++)
  78.     {
  79.         if(PlayerCar[playerid][i][CarID]==-1)
  80.             return i;
  81.     }
  82.     return -1;
  83. }
  84.  
  85. stock PlayerName(i)
  86. {
  87.     new n[MAX_PLAYER_NAME];
  88.     GetPlayerName(i,n,MAX_PLAYER_NAME);
  89.     return n;
  90. }
  91.  
  92. forward PCar_PlayerConnect(playerid);
  93. forward PCar_PlayerDisconnect(playerid);
  94. forward PCar_DialogResponse(playerid,dialogid,response,listitem);
  95. forward PCar_VehicleDeath(vehicleid);
  96.  
  97. public PCar_PlayerConnect(playerid)
  98. {
  99.     new s[50],pname[MAX_PLAYER_NAME];
  100.     GetPlayerName(playerid,pname,MAX_PLAYER_NAME);
  101.     for(new i;i<MAX_PLAYER_CARS;i++)
  102.     {
  103.         format(s,50,"PCars/%sCar%d.ini",pname,i);
  104.         if(fexist(s))
  105.         {
  106.             PlayerCar[playerid][i][CarID]=CreateVehicle(dini_Int(s,"ModelID"),dini_Float(s,"SpawnX"),dini_Float(s,"SpawnY")
  107.             ,dini_Float(s,"SpawnZ"),dini_Float(s,"SpawnA"),dini_Int(s,"Color1"),dini_Int(s,"Color2"),-1);
  108.             PlayerCar[playerid][i][CposX]=dini_Float(s,"SpawnX");
  109.             PlayerCar[playerid][i][CposY]=dini_Float(s,"SpawnY");
  110.             PlayerCar[playerid][i][CposZ]=dini_Float(s,"SpawnZ");
  111.             PlayerCar[playerid][i][CposA]=dini_Float(s,"SpawnA");
  112.             SetVehicleHealth(PlayerCar[playerid][i][CarID],dini_Float(s,"Health"));
  113.             new a[4];
  114.             if(!sscanf(dini_Get(s,"Damage"),"dddd",a[0],a[1],a[2],a[3]))
  115.                 UpdateVehicleDamageStatus(PlayerCar[playerid][i][CarID],a[0],a[1],a[2],a[3]);
  116.         }
  117.         else
  118.             PlayerCar[playerid][i][CarID]=-1;
  119.     }
  120. }
  121.  
  122. public PCar_PlayerDisconnect(playerid)
  123. {
  124.     new s[50],pname[MAX_PLAYER_NAME];
  125.     GetPlayerName(playerid,pname,MAX_PLAYER_NAME);
  126.     for(new i;i<MAX_PLAYER_CARS;i++)
  127.     {
  128.         format(s,50,"PCars/%sCar%d.ini",pname,i);
  129.         if(fexist(s))
  130.         {
  131.             new Float:health;
  132.             if(health > 300)
  133.             {
  134.                 dini_FloatSet(s,"SpawnX",PlayerCar[playerid][i][CposX]);
  135.                 dini_FloatSet(s,"SpawnY",PlayerCar[playerid][i][CposY]);
  136.                 dini_FloatSet(s,"SpawnZ",PlayerCar[playerid][i][CposZ]);
  137.                 dini_FloatSet(s,"SpawnA",PlayerCar[playerid][i][CposA]);
  138.                 new a[4];
  139.                 GetVehicleDamageStatus(PlayerCar[playerid][i][CarID],a[0],a[1],a[2],a[3]);
  140.                 new str[35];
  141.                 format(str,sizeof(str),"%d %d %d %d",a[0],a[1],a[2],a[3]);
  142.                 dini_Set(s,"Damage",str);
  143.             }
  144.             else
  145.             {
  146.                 dini_Remove(s);
  147.             }
  148.             DestroyVehicle(PlayerCar[playerid][i][CarID]);
  149.             PlayerCar[playerid][i][CarID]=-1;
  150.            
  151.         }
  152.     }
  153. }
  154.  
  155. public PCar_DialogResponse(playerid,dialogid,response,listitem)
  156. {
  157.     if(dialogid == DIALOG_CARS_LIST && response)
  158.     {
  159.         if(PlayerCar[playerid][listitem][CarID]==-1)return SCM(playerid,RED,"K tomuto slotu nemáš kúpené auto");
  160.         SetPVarInt(playerid,"CarID",listitem);
  161.         ShowPlayerDialog(playerid,DIALOG_CAR_MENU,DIALOG_STYLE_LIST,"Tvoje vozidlá:","Respawnúť\nPredať","OK","Cancel");
  162.     }
  163.     else if(dialogid == DIALOG_CAR_MENU && response)
  164.     {
  165.         new slot = GetPVarInt(playerid,"CarID");
  166.         if(listitem == 0)//respawn
  167.         {
  168.             RespawnPlayerCar(playerid,slot);
  169.         }
  170.         else if(listitem == 1)//predať
  171.         {
  172.             DeletePlayerCar(playerid,slot);
  173.         }
  174.     }
  175.     return 1;
  176. }
  177.  
  178. public PCar_VehicleDeath(vehicleid)
  179. {
  180.     new b;
  181.     for(new i;i<MAX_PLAYERS;i++)
  182.     {
  183.         for(new c;c<MAX_PLAYER_CARS;c++)
  184.         {
  185.             if(vehicleid == PlayerCar[i][c][CarID])
  186.             {
  187.                 DeletePlayerCar(i,c);
  188.                 SCM(i,RED,"Vaše vozidlo bolo zničené !");
  189.                 b=true;
  190.                 break;
  191.             }
  192.         }
  193.         if(b)
  194.             break;
  195.     }
  196. }
  197.  
  198. dcmd_park(playerid,params[])
  199. {
  200.     #pragma unused params
  201.     if(GetPlayerState(playerid)!=PLAYER_STATE_DRIVER)return SCM(playerid,RED,"Nesedíš vo vozidle !");
  202.     new Vehicle=GetPlayerVehicleID(playerid);
  203.     for(new i;i<MAX_PLAYER_CARS;i++)
  204.     {
  205.         if(Vehicle==PlayerCar[playerid][i][CarID])
  206.         {
  207.             new Float:pos[4];
  208.             GetVehiclePos(Vehicle,pos[0],pos[1],pos[2]);
  209.             GetVehicleZAngle(Vehicle,pos[3]);
  210.             PlayerCar[playerid][i][CposX]=pos[0];
  211.             PlayerCar[playerid][i][CposY]=pos[1];
  212.             PlayerCar[playerid][i][CposZ]=pos[2];
  213.             PlayerCar[playerid][i][CposA]=pos[3];
  214.             SCM(playerid,ZLTA,"Tvoje vozidlo bolo odparkované na aktuálnom mieste.");
  215.             break;
  216.         }
  217.     }
  218.     return 1;
  219. }
  220.  
  221. dcmd_vehicles(playerid,params[])
  222. {
  223.     #pragma unused params
  224.     new s[200];
  225.     for(new i;i<MAX_PLAYER_CARS;i++)
  226.     {
  227.         if(PlayerCar[playerid][i][CarID]==-1)
  228.             format(s,200,"%sPrázdny slot\n",s);
  229.         else
  230.             format(s,200,"%s%s\n",s,GetVehicleModelName(PlayerCar[playerid][i][CarID]));
  231.     }
  232.     ShowPlayerDialog(playerid,DIALOG_CARS_LIST,DIALOG_STYLE_LIST,"Tvoje vozidlá:",s,"Vybrať","Cancel");
  233.     return 1;
  234. }
  235.  
  236. forward PCar_OnPlayerCommandText(playerid, cmdtext[]);
  237. public PCar_OnPlayerCommandText(playerid, cmdtext[])
  238. {
  239.     dcmd(park,4,cmdtext);
  240.     dcmd(vehicles,8,cmdtext);
  241.     return 0;
  242. }
  243.  
  244.  
  245. /*// NAZORNA UKAZKA OBCHODU A KUPOVANIA ..
  246. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  247. {
  248.     PCar_DialogResponse(playerid,dialogid,response,listitem);
  249.     if(dialogid == 123&&response)//pre testovanie
  250.     {
  251.         if(listitem == 0)
  252.         {
  253.             BuyCarForPlayer(playerid,411,4,4,3,0,100);
  254.         }
  255.     }
  256.     return 1;
  257. }
  258.  
  259. public OnPlayerConnect(playerid)
  260. {
  261.     PCar_PlayerConnect(playerid);
  262.     return 1;
  263. }
  264.  
  265. public OnPlayerDisconnect(playerid, reason)
  266. {
  267.     PCar_PlayerDisconnect(playerid);
  268.     return 1;
  269. }
  270.  
  271. public OnPlayerSpawn(playerid)//pre testovanie
  272. {
  273.     SetPlayerPos(playerid,0,0,3);
  274.     GivePlayerMoney(playerid,1000);
  275.     return 1;
  276. }
  277.  
  278. public OnVehicleDeath(vehicleid, killerid)
  279. {
  280.     PCar_VehicleDeath(vehicleid);
  281.     return 1;
  282. }
  283.  
  284. public OnPlayerCommandText(playerid, cmdtext[])
  285. {
  286.     PCar_OnPlayerCommandText(playerid, cmdtext[]);
  287.     return 0;
  288. }
  289.  
  290. public OnPlayerPickUpPickup(playerid, pickupid)//pre testovanie
  291. {
  292.     if(IsPlayerInRangeOfPoint(playerid,2,2,2,3))
  293.     {
  294.         ShowPlayerDialog(playerid,123,DIALOG_STYLE_LIST,"Predajňa vozidiel","Infernus $100","Kúpiť","Cancel");
  295.     }
  296.     return 1;
  297. }
  298.  
  299. public OnFilterScriptInit()
  300. {
  301.     CreatePickup(1247,1,3,3,3,0);
  302.     return 1;
  303. }*/
  304.  
  305. stock GetVehicleModelName(v)
  306. {
  307.     new s[35];
  308.     switch(GetVehicleModel(v))
  309.     {
  310.         case 400:s="Landstalker";
  311.         case 401:s="Bravura";
  312.         case 402:s="Buffalo";
  313.         case 403:s="Linerunner";
  314.         case 404:s="Perenail";
  315.         case 405:s="Sentinel";
  316.         case 406:s="Dumper";
  317.         case 407:s="Firetruck";
  318.         case 408:s="Trashmaster";
  319.         case 409:s="Stretch";
  320.         case 410:s="Manana";
  321.         case 411:s="Infernus";
  322.         case 412:s="Voodoo";
  323.         case 413:s="Pony";
  324.         case 414:s="Mule";
  325.         case 415:s="Cheetah";
  326.         case 416:s="Ambulance";
  327.         case 417:s="Levetian";
  328.         case 418:s="Moonbeam";
  329.         case 419:s="Esperanto";
  330.         case 420:s="Taxi";
  331.         case 421:s="Washington";
  332.         case 422:s="Bobcat";
  333.         case 423:s="Mr Whoopee";
  334.         case 424:s="BF Injection";
  335.         case 425:s="Hunter";
  336.         case 426:s="Premier";
  337.         case 427:s="Enforcer";
  338.         case 428:s="Securicar";
  339.         case 429:s="Banshee";
  340.         case 430:s="Predator";
  341.         case 431:s="Bus";
  342.         case 432:s="Rhino";
  343.         case 433:s="Barracks";
  344.         case 434:s="Hotknife";
  345.         case 435:s="Artic Trailer 1";
  346.         case 436:s="Previon";
  347.         case 437:s="Coach";
  348.         case 438:s="Cabbie";
  349.         case 439:s="Stallion";
  350.         case 440:s="Rumpo";
  351.         case 441:s="RC Bandit";
  352.         case 442:s="Romero";
  353.         case 443:s="Packer";
  354.         case 444:s="Monster";
  355.         case 445:s="Admiral";
  356.         case 446:s="Squalo";
  357.         case 447:s="Seasparrow";
  358.         case 448:s="Pizza Boy";
  359.         case 449:s="Tram";
  360.         case 450:s="Artic Trailer 2";
  361.         case 451:s="Turismo";
  362.         case 452:s="Speeder";
  363.         case 453:s="Reefer";
  364.         case 454:s="Tropic";
  365.         case 455:s="Flatbed";
  366.         case 456:s="Yankee";
  367.         case 457:s="Caddy";
  368.         case 458:s="Solair";
  369.         case 459:s="Top Fun";
  370.         case 460:s="Skimmer";
  371.         case 461:s="PCJ-600";
  372.         case 462:s="Faggio";
  373.         case 463:s="Freeway";
  374.         case 464:s="RC Baron";
  375.         case 465:s="RC Raider";
  376.         case 466:s="Glendale";
  377.         case 467:s="Oceanic";
  378.         case 468:s="Sanchez";
  379.         case 469:s="Sparrow";
  380.         case 470:s="Patriot";
  381.         case 471:s="Quad";
  382.         case 472:s="Coastguard";
  383.         case 473:s="Dinghy";
  384.         case 474:s="Hermes";
  385.         case 475:s="Sabre";
  386.         case 476:s="Rustler";
  387.         case 477:s="ZR-350";
  388.         case 478:s="Walton";
  389.         case 479:s="Regina";
  390.         case 480:s="Comet";
  391.         case 481:s="BMX";
  392.         case 482:s="Burrito";
  393.         case 483:s="Camper";
  394.         case 484:s="Marquis";
  395.         case 485:s="Baggage";
  396.         case 486:s="Dozer";
  397.         case 487:s="Maverick";
  398.         case 488:s="SAN Maverick";
  399.         case 489:s="Rancher";
  400.         case 490:s="FBI Rancher";
  401.         case 491:s="Virgo";
  402.         case 492:s="Greenwood";
  403.         case 493:s="Jetmax";
  404.         case 494:s="Hotring";
  405.         case 495:s="Sandking";
  406.         case 496:s="Blista Compact";
  407.         case 497:s="Police Maverick";
  408.         case 498:s="Boxvillie";
  409.         case 499:s="Benson";
  410.         case 500:s="Mesa";
  411.         case 501:s="RC Goblin";
  412.         case 502:s="Hotring";
  413.         case 503:s="Hotring";
  414.         case 504:s="Bloodring Banger";
  415.         case 505:s="Rancher";
  416.         case 506:s="Super GT";
  417.         case 507:s="Elegant";
  418.         case 508:s="Journey";
  419.         case 509:s="Bike";
  420.         case 510:s="Mountain Bike";
  421.         case 511:s="Beagle";
  422.         case 512:s="Cropduster";
  423.         case 513:s="Stuntplane";
  424.         case 514:s="Petrol";
  425.         case 515:s="Roadtrain";
  426.         case 516:s="Nebula";
  427.         case 517:s="Majestic";
  428.         case 518:s="Buccaneer";
  429.         case 519:s="Shamal";
  430.         case 520:s="Hydra";
  431.         case 521:s="FCR-900";
  432.         case 522:s="NRG-500";
  433.         case 523:s="HPV-1000";
  434.         case 524:s="Cement Truck";
  435.         case 525:s="Tow Truck";
  436.         case 526:s="Fortune";
  437.         case 527:s="Cadrona";
  438.         case 528:s="FBI Truck";
  439.         case 529:s="Williard";
  440.         case 530:s="Forklift";
  441.         case 531:s="Tractor";
  442.         case 532:s="Combine";
  443.         case 533:s="Feltzer";
  444.         case 534:s="Remington";
  445.         case 535:s="Slamvan";
  446.         case 536:s="Blade";
  447.         case 537:s="Freight";
  448.         case 538:s="Streak";
  449.         case 539:s="Vortex";
  450.         case 540:s="Vincent";
  451.         case 541:s="Bullet";
  452.         case 542:s="Clover";
  453.         case 543:s="Sadler";
  454.         case 544:s="Firetruck";
  455.         case 545:s="Hustler";
  456.         case 546:s="Intruder";
  457.         case 547:s="Primo";
  458.         case 548:s="Cargobob";
  459.         case 549:s="Tampa";
  460.         case 550:s="Sunrise";
  461.         case 551:s="Merit";
  462.         case 552:s="Utility Van";
  463.         case 553:s="Nevada";
  464.         case 554:s="Yosemite";
  465.         case 555:s="Windsor";
  466.         case 556:s="Monster";
  467.         case 557:s="Monster";
  468.         case 558:s="Uranus";
  469.         case 559:s="Jester";
  470.         case 560:s="Sultan";
  471.         case 561:s="Stratum";
  472.         case 562:s="Elegy";
  473.         case 563:s="Raindance";
  474.         case 564:s="RC Tiger";
  475.         case 565:s="Flash";
  476.         case 566:s="Tahoma";
  477.         case 567:s="Savanna";
  478.         case 568:s="Bandito";
  479.         case 569:s="Freight Flat";
  480.         case 570:s="Streak";
  481.         case 571:s="Kart";
  482.         case 572:s="Mower";
  483.         case 573:s="Duneride";
  484.         case 574:s="Sweeper";
  485.         case 575:s="Broadway";
  486.         case 576:s="Tornado";
  487.         case 577:s="AT-400";
  488.         case 578:s="DFT-30";
  489.         case 579:s="Huntley";
  490.         case 580:s="Stafford";
  491.         case 581:s="BF-400";
  492.         case 582:s="News van";
  493.         case 583:s="Tug";
  494.         case 584:s="Petrol Tanker";
  495.         case 585:s="Emperor";
  496.         case 586:s="Wayfarer";
  497.         case 587:s="Euros";
  498.         case 588:s="Hotdog";
  499.         case 589:s="Club";
  500.         case 590:s="Freight Box";
  501.         case 591:s="Artic Trailer";
  502.         case 592:s="Andromada";
  503.         case 593:s="Dodo";
  504.         case 594:s="RC Cam";
  505.         case 595:s="Launch";
  506.         case 596:s="Cop Car LS";
  507.         case 597:s="Cop Car SF";
  508.         case 598:s="Cop Car LV";
  509.         case 599:s="Ranger";
  510.         case 600:s="Picador";
  511.         case 601:s="Swat Tank";
  512.         case 602:s="Alpha";
  513.         case 603:s="Phoenix";
  514.         case 604:s="Glendale";
  515.         case 605:s="Sadler";
  516.         case 606:s="Bag Box";
  517.         case 607:s="Bag Box";
  518.         case 608:s="Stairs";
  519.         case 609:s="Boxville";
  520.         case 610:s="Farm Trailer";
  521.         case 611:s="Utility Trailer";
  522.     }
  523.     return s;
  524. }
  525.  
  526. stock sscanf(string[], format[], {Float,_}:...)
  527. {
  528.     #if defined isnull
  529.         if (isnull(string))
  530.     #else
  531.         if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
  532.     #endif
  533.         {
  534.             return format[0];
  535.         }
  536.     #pragma tabsize 4
  537.     new
  538.         formatPos = 0,
  539.         stringPos = 0,
  540.         paramPos = 2,
  541.         paramCount = numargs(),
  542.         delim = ' ';
  543.     while (string[stringPos] && string[stringPos] <= ' ')
  544.     {
  545.         stringPos++;
  546.     }
  547.     while (paramPos < paramCount && string[stringPos])
  548.     {
  549.         switch (format[formatPos++])
  550.         {
  551.             case '\0':
  552.             {
  553.                 return 0;
  554.             }
  555.             case 'i', 'd':
  556.             {
  557.                 new
  558.                     neg = 1,
  559.                     num = 0,
  560.                     ch = string[stringPos];
  561.                 if (ch == '-')
  562.                 {
  563.                     neg = -1;
  564.                     ch = string[++stringPos];
  565.                 }
  566.                 do
  567.                 {
  568.                     stringPos++;
  569.                     if ('0' <= ch <= '9')
  570.                     {
  571.                         num = (num * 10) + (ch - '0');
  572.                     }
  573.                     else
  574.                     {
  575.                         return -1;
  576.                     }
  577.                 }
  578.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  579.                 setarg(paramPos, 0, num * neg);
  580.             }
  581.             case 'h', 'x':
  582.             {
  583.                 new
  584.                     num = 0,
  585.                     ch = string[stringPos];
  586.                 do
  587.                 {
  588.                     stringPos++;
  589.                     switch (ch)
  590.                     {
  591.                         case 'x', 'X':
  592.                         {
  593.                             num = 0;
  594.                             continue;
  595.                         }
  596.                         case '0' .. '9':
  597.                         {
  598.                             num = (num << 4) | (ch - '0');
  599.                         }
  600.                         case 'a' .. 'f':
  601.                         {
  602.                             num = (num << 4) | (ch - ('a' - 10));
  603.                         }
  604.                         case 'A' .. 'F':
  605.                         {
  606.                             num = (num << 4) | (ch - ('A' - 10));
  607.                         }
  608.                         default:
  609.                         {
  610.                             return -1;
  611.                         }
  612.                     }
  613.                 }
  614.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  615.                 setarg(paramPos, 0, num);
  616.             }
  617.             case 'c':
  618.             {
  619.                 setarg(paramPos, 0, string[stringPos++]);
  620.             }
  621.             case 'f':
  622.             {
  623.  
  624.                 new changestr[16], changepos = 0, strpos = stringPos;
  625.                 while(changepos < 16 && string[strpos] && string[strpos] != delim)
  626.                 {
  627.                     changestr[changepos++] = string[strpos++];
  628.                     }
  629.                 changestr[changepos] = '\0';
  630.                 setarg(paramPos,0,_:floatstr(changestr));
  631.             }
  632.             case 'p':
  633.             {
  634.                 delim = format[formatPos++];
  635.                 continue;
  636.             }
  637.             case '\'':
  638.             {
  639.                 new
  640.                     end = formatPos - 1,
  641.                     ch;
  642.                 while ((ch = format[++end]) && ch != '\'') {}
  643.                 if (!ch)
  644.                 {
  645.                     return -1;
  646.                 }
  647.                 format[end] = '\0';
  648.                 if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
  649.                 {
  650.                     if (format[end + 1])
  651.                     {
  652.                         return -1;
  653.                     }
  654.                     return 0;
  655.                 }
  656.                 format[end] = '\'';
  657.                 stringPos = ch + (end - formatPos);
  658.                 formatPos = end + 1;
  659.             }
  660.             case 'u':
  661.             {
  662.                 new
  663.                     end = stringPos - 1,
  664.                     id = 0,
  665.                     bool:num = true,
  666.                     ch;
  667.                 while ((ch = string[++end]) && ch != delim)
  668.                 {
  669.                     if (num)
  670.                     {
  671.                         if ('0' <= ch <= '9')
  672.                         {
  673.                             id = (id * 10) + (ch - '0');
  674.                         }
  675.                         else
  676.                         {
  677.                             num = false;
  678.                         }
  679.                     }
  680.                 }
  681.                 if (num && IsPlayerConnected(id))
  682.                 {
  683.                     setarg(paramPos, 0, id);
  684.                 }
  685.                 else
  686.                 {
  687.                     #if !defined foreach
  688.                         #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS_EX; %2++) if (IsPlayerConnected(%2))
  689.                         #define __SSCANF_FOREACH__
  690.                     #endif
  691.                     string[end] = '\0';
  692.                     num = false;
  693.                     new
  694.                         name[MAX_PLAYER_NAME];
  695.                     id = end - stringPos;
  696.                     foreach (Player, playerid)
  697.                     {
  698.                         GetPlayerName(playerid, name, sizeof (name));
  699.                         if (!strcmp(name, string[stringPos], true, id))
  700.                         {
  701.                             setarg(paramPos, 0, playerid);
  702.                             num = true;
  703.                             break;
  704.                         }
  705.                     }
  706.                     if (!num)
  707.                     {
  708.                         setarg(paramPos, 0, INVALID_PLAYER_ID);
  709.                     }
  710.                     string[end] = ch;
  711.                     #if defined __SSCANF_FOREACH__
  712.                         #undef foreach
  713.                         #undef __SSCANF_FOREACH__
  714.                     #endif
  715.                 }
  716.                 stringPos = end;
  717.             }
  718.             case 's', 'z':
  719.             {
  720.                 new
  721.                     i = 0,
  722.                     ch;
  723.                 if (format[formatPos])
  724.                 {
  725.                     while ((ch = string[stringPos++]) && ch != delim)
  726.                     {
  727.                         setarg(paramPos, i++, ch);
  728.                     }
  729.                     if (!i)
  730.                     {
  731.                         return -1;
  732.                     }
  733.                 }
  734.                 else
  735.                 {
  736.                     while ((ch = string[stringPos++]))
  737.                     {
  738.                         setarg(paramPos, i++, ch);
  739.                     }
  740.                 }
  741.                 stringPos--;
  742.                 setarg(paramPos, i, '\0');
  743.             }
  744.             default:
  745.             {
  746.                 continue;
  747.             }
  748.         }
  749.         while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
  750.         {
  751.             stringPos++;
  752.         }
  753.         while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
  754.         {
  755.             stringPos++;
  756.         }
  757.         paramPos++;
  758.     }
  759.     do
  760.     {
  761.         if ((delim = format[formatPos++]) > ' ')
  762.         {
  763.             if (delim == '\'')
  764.             {
  765.                 while ((delim = format[formatPos++]) && delim != '\'') {}
  766.             }
  767.             else if (delim != 'z')
  768.             {
  769.                 return delim;
  770.             }
  771.         }
  772.     }
  773.     while (delim > ' ');
  774.     return 0;
  775. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement