Guest User

dyBank

a guest
Jun 14th, 2012
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 18.99 KB | None | 0 0
  1. #include <a_samp>
  2. #include <Dini>
  3. #include <ocmd>
  4.  
  5. #define MAX_BANKS 100 // Wieviele Bänke es maximal geben soll
  6. #define Startgeld 100000000 // Wieviel Geld am Anfang auf der Bank sein soll
  7. #define K_STARTGELD 2000 // Wieviel Geld nach dem Erstellen eines Kontos direkt als Bonus auf der Bank sein sollen
  8. #define farbe 0xFFFFFF // In welcher Farbe die Texte angezeigt werden sollen, kannst du hier einstellen
  9. #define PICKUP_ID 1272 // Welche Pickup-ID benutzt werden soll
  10.  
  11. //DIALOGE - Sollten die ID's bereits bei einem anderen Dialog im Gamemode/Filterscript verwendet werden, sind diese zu ändern
  12. #define DIALOG_BANK 8000
  13. #define DIALOG_BANK2 8001
  14. #define DIALOG_KONTOSTAND 8002
  15. #define DIALOG_EINZAHLEN 8003
  16. #define DIALOG_ABHEBEN 8004
  17. #define DIALOG_AUFL 8005
  18. #define DIALOG_CREATE 8006
  19.  
  20. new Float:Ausgangx[MAX_PLAYERS];
  21. new Float:Ausgangy[MAX_PLAYERS];
  22. new Float:Ausgangz[MAX_PLAYERS];
  23.  
  24. enum Bankdaten
  25. {
  26.     Float:Bankx,
  27.     Float:Banky,
  28.     Float:Bankz,
  29.     Bankersteller[MAX_PLAYER_NAME],
  30.     Geld,
  31.     Name[124],
  32.     ID,
  33.     pickup,
  34.     Text3D:textdraw
  35. }
  36. new BankInfo[MAX_BANKS][Bankdaten];
  37.  
  38. enum Bankkonto
  39. {
  40.     Besitzer,
  41.     Vermoegen,
  42.     Pin
  43. }
  44. new BankkontenInfo[MAX_PLAYERS][Bankkonto];
  45.  
  46. public OnFilterScriptInit()
  47. {
  48.     print("\n--------------------------------------");
  49.     print(" Dynamisches Banksystem by Fießling");
  50.     print("--------------------------------------\n");
  51.     for(new i=0;i<MAX_BANKS;i++)
  52.     {
  53.         BankLaden(i);
  54.     }
  55.     CreatePickup(PICKUP_ID,1,2305.9353,-16.1329,26.7496,-1);
  56.     CreatePickup(1239,1,2316.6089,-9.9751,26.7422,-1);
  57.     Create3DTextLabel("Drücke Enter, um auf dein Konto zuzugreifen!",farbe,2316.6089,-9.9751,26.7422,20,-1);
  58.     return 1;
  59. }
  60.  
  61. public OnFilterScriptExit()
  62. {
  63.     BankSpeichern();
  64.     return 1;
  65. }
  66.  
  67. public OnPlayerRequestClass(playerid, classid)
  68. {
  69.     return 1;
  70. }
  71.  
  72. public OnPlayerConnect(playerid)
  73. {
  74.     KontoLaden(playerid);
  75.     return 1;
  76. }
  77.  
  78. public OnPlayerDisconnect(playerid, reason)
  79. {
  80.     KontoSpeichern(playerid);
  81.     return 1;
  82. }
  83.  
  84. public OnPlayerSpawn(playerid)
  85. {
  86.     return 1;
  87. }
  88.  
  89. public OnPlayerDeath(playerid, killerid, reason)
  90. {
  91.     return 1;
  92. }
  93.  
  94. public OnVehicleSpawn(vehicleid)
  95. {
  96.     return 1;
  97. }
  98.  
  99. public OnVehicleDeath(vehicleid, killerid)
  100. {
  101.     return 1;
  102. }
  103.  
  104. public OnPlayerText(playerid, text[])
  105. {
  106.     return 1;
  107. }
  108.  
  109. //OCMD Befehle
  110. ocmd:createbank(playerid,params[])
  111. {
  112.     new bname[128],string[128];
  113.     if(IsPlayerAdmin(playerid))
  114.     {
  115.         if(sscanf(params,"s",bname))return SendClientMessage(playerid,farbe,"BENUTZE: /createbank [Bankname]");
  116.         CreateBank(playerid,bname);
  117.         format(string,sizeof string,"Du hast eine Bank mit dem Namen %s erstellt!",bname);
  118.         SendClientMessage(playerid,farbe,string);
  119.     }
  120.     else {SendClientMessage(playerid,farbe,"FEHLER: Du bist kein Administrator!");}
  121.     return 1;
  122. }
  123.  
  124. ocmd:delbank(playerid,params[])
  125. {
  126.     new bid,bank[128];
  127.     format(bank,sizeof bank,"/Bank/%d.txt",bid);
  128.     if(IsPlayerAdmin(playerid))
  129.     {
  130.         if(sscanf(params,"i",bid))return SendClientMessage(playerid,farbe,"BENUTZE: /delbank [BankID]");
  131.         format(bank,sizeof bank,"/Bank/%d.txt",bid);
  132.         if(dini_Exists(bank))
  133.         {
  134.             dini_Remove(bank);
  135.             SendClientMessage(playerid,farbe,"Du hast die Bank erfolgreich gelöscht!");
  136.             for(new i=0;i<MAX_BANKS;i++)
  137.             {
  138.                 if(i==bid)
  139.                 {
  140.                     DestroyPickup(BankInfo[i][pickup]);
  141.                     Delete3DTextLabel(BankInfo[i][textdraw]);
  142.                     BankLaden(i);
  143.                 }
  144.             }
  145.         }
  146.         else return SendClientMessage(playerid,farbe,"FEHLER: Es existiert keine Bank mit dieser ID!");
  147.     }
  148.     else {SendClientMessage(playerid,farbe,"FEHLER: Du bist kein Administrator!");}
  149.     return 1;
  150. }
  151.  
  152. public OnPlayerCommandText(playerid, cmdtext[])
  153. {
  154.     return 0;
  155. }
  156.  
  157. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  158. {
  159.     return 1;
  160. }
  161.  
  162. public OnPlayerExitVehicle(playerid, vehicleid)
  163. {
  164.     return 1;
  165. }
  166.  
  167. public OnPlayerStateChange(playerid, newstate, oldstate)
  168. {
  169.     return 1;
  170. }
  171.  
  172. public OnPlayerEnterCheckpoint(playerid)
  173. {
  174.     return 1;
  175. }
  176.  
  177. public OnPlayerLeaveCheckpoint(playerid)
  178. {
  179.     return 1;
  180. }
  181.  
  182. public OnPlayerEnterRaceCheckpoint(playerid)
  183. {
  184.     return 1;
  185. }
  186.  
  187. public OnPlayerLeaveRaceCheckpoint(playerid)
  188. {
  189.     return 1;
  190. }
  191.  
  192. public OnRconCommand(cmd[])
  193. {
  194.     return 1;
  195. }
  196.  
  197. public OnPlayerRequestSpawn(playerid)
  198. {
  199.     return 1;
  200. }
  201.  
  202. public OnObjectMoved(objectid)
  203. {
  204.     return 1;
  205. }
  206.  
  207. public OnPlayerObjectMoved(playerid, objectid)
  208. {
  209.     return 1;
  210. }
  211.  
  212. public OnPlayerPickUpPickup(playerid, pickupid)
  213. {
  214.     return 1;
  215. }
  216.  
  217. public OnVehicleMod(playerid, vehicleid, componentid)
  218. {
  219.     return 1;
  220. }
  221.  
  222. public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  223. {
  224.     return 1;
  225. }
  226.  
  227. public OnVehicleRespray(playerid, vehicleid, color1, color2)
  228. {
  229.     return 1;
  230. }
  231.  
  232. public OnPlayerSelectedMenuRow(playerid, row)
  233. {
  234.     return 1;
  235. }
  236.  
  237. public OnPlayerExitedMenu(playerid)
  238. {
  239.     return 1;
  240. }
  241.  
  242. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  243. {
  244.     return 1;
  245. }
  246.  
  247. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  248. {
  249.     if(newkeys == KEY_SECONDARY_ATTACK)
  250.     {
  251.         for(new i=0;i<MAX_BANKS;i++)
  252.         {
  253.             if(IsPlayerInRangeOfPoint(playerid,3.0,BankInfo[i][Bankx],BankInfo[i][Banky],BankInfo[i][Bankz]))
  254.             {
  255.                 Ausgangx[playerid]=BankInfo[i][Bankx];
  256.                 Ausgangy[playerid]=BankInfo[i][Banky];
  257.                 Ausgangz[playerid]=BankInfo[i][Bankz];
  258.                 SetPlayerVirtualWorld(playerid,i++);
  259.                 SetPlayerInterior(playerid,0);
  260.                 SetPlayerPos(playerid,2305.9353,-16.1329,26.7496);
  261.                 SetPlayerFacingAngle(playerid,269.4800);
  262.                 SetCameraBehindPlayer(playerid);
  263.             }
  264.             if(IsPlayerInRangeOfPoint(playerid,2.0,2305.9353,-16.1329,26.7496))
  265.             {
  266.                 SetPlayerInterior(playerid,0);
  267.                 SetPlayerPos(playerid,Ausgangx[playerid],Ausgangy[playerid],Ausgangz[playerid]);
  268.                 SetPlayerVirtualWorld(playerid,0);
  269.                 SetCameraBehindPlayer(playerid);
  270.             }
  271.         }
  272.         if(IsPlayerInRangeOfPoint(playerid,1.0,2316.6089,-9.9751,26.7422))
  273.         {
  274.             new bankk[128],name[MAX_PLAYER_NAME];
  275.             GetPlayerName(playerid,name,sizeof name);
  276.             format(bankk,sizeof bankk,"/Bankkonten/%s.txt",name);
  277.             if(dini_Exists(bankk))
  278.             {
  279.                 ShowPlayerDialog(playerid,DIALOG_BANK,DIALOG_STYLE_INPUT,"S.A. Bank","Bitte gebe dein Geheim-Pin in das untenstehende Feld!","Weiter","Abbrechen");
  280.             }
  281.             else
  282.             {
  283.                 ShowPlayerDialog(playerid,DIALOG_CREATE,DIALOG_STYLE_MSGBOX,"S.A. Bank","Möchtest du ein Bankkonto erstellen?","Ja","Nein");
  284.             }
  285.         }
  286.     }
  287.     return 1;
  288. }
  289.  
  290. public OnRconLoginAttempt(ip[], password[], success)
  291. {
  292.     return 1;
  293. }
  294.  
  295. public OnPlayerUpdate(playerid)
  296. {
  297.     return 1;
  298. }
  299.  
  300. public OnPlayerStreamIn(playerid, forplayerid)
  301. {
  302.     return 1;
  303. }
  304.  
  305. public OnPlayerStreamOut(playerid, forplayerid)
  306. {
  307.     return 1;
  308. }
  309.  
  310. public OnVehicleStreamIn(vehicleid, forplayerid)
  311. {
  312.     return 1;
  313. }
  314.  
  315. public OnVehicleStreamOut(vehicleid, forplayerid)
  316. {
  317.     return 1;
  318. }
  319.  
  320. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  321. {
  322.     new string[128];
  323.     if(dialogid == DIALOG_BANK)
  324.     {
  325.         if(response)
  326.         {
  327.             if(BankkontenInfo[playerid][Pin] == strval(inputtext))
  328.             {
  329.                 ShowPlayerDialog(playerid,DIALOG_BANK2,DIALOG_STYLE_LIST,"S.A. Bank","Kontostand\nEinzahlen\nAbheben\nKonto auflösen","Okay","Abbrechen");
  330.             }
  331.             else return SendClientMessage(playerid,farbe,"FEHLER: Der Pin war falsch!");
  332.         }
  333.     }
  334.     if(dialogid == DIALOG_BANK2)
  335.     {
  336.         if(response)
  337.         {
  338.             if(listitem==0)
  339.             {
  340.                 format(string,sizeof string,"Kontostand: %d$",BankkontenInfo[playerid][Vermoegen]);
  341.                 ShowPlayerDialog(playerid,DIALOG_KONTOSTAND,DIALOG_STYLE_MSGBOX,"S.A. Bank - Kontostand",string,"Okay","Abbrechen");
  342.             }
  343.             if(listitem==1)
  344.             {
  345.                 ShowPlayerDialog(playerid,DIALOG_EINZAHLEN,DIALOG_STYLE_INPUT,"S.A. Bank - Einzahlen","Tippe dein gewünschten Betrag, welchen du einzahlen möchtest, in das Feld unten ein!","Okay","Abbrechen");
  346.             }
  347.             if(listitem==2)
  348.             {
  349.                 ShowPlayerDialog(playerid,DIALOG_ABHEBEN,DIALOG_STYLE_INPUT,"S.A. Bank - Abheben","Tippe dein gewünschten Betrag, welchen du von deinem Konto abheben möchtest, in das Feld unten ein!","Okay","Abbrechen");
  350.             }
  351.             if(listitem==3)
  352.             {
  353.                 ShowPlayerDialog(playerid,DIALOG_AUFL,DIALOG_STYLE_MSGBOX,"S.A. Bank","Möchtest du dein Konto wirklich auflösen?","Ja","Nein");
  354.             }
  355.         }
  356.     }
  357.     if(dialogid == DIALOG_KONTOSTAND)
  358.     {
  359.         if(response)
  360.         {
  361.             ShowPlayerDialog(playerid,DIALOG_BANK2,DIALOG_STYLE_LIST,"S.A. Bank","Kontostand\nEinzahlen\nAbheben\nKonto auflösen","Okay","Abbrechen");
  362.         }
  363.     }
  364.     if(dialogid == DIALOG_EINZAHLEN)
  365.     {
  366.         if(response)
  367.         {
  368.             new geld = GetPlayerMoney(playerid);
  369.             if(geld>=strval(inputtext))
  370.             {
  371.                 new oldbank = BankkontenInfo[playerid][Vermoegen];
  372.                 BankkontenInfo[playerid][Vermoegen] = oldbank+strval(inputtext);
  373.                 format(string,sizeof string,"Du hast %d$ auf dein Konto eingezahlt!",strval(inputtext));
  374.                 SendClientMessage(playerid,farbe,string);
  375.                 GivePlayerMoney(playerid,-strval(inputtext));
  376.             }
  377.             else return SendClientMessage(playerid,farbe,"FEHLER: Soviel Geld hast du nicht!");
  378.             ShowPlayerDialog(playerid,DIALOG_BANK2,DIALOG_STYLE_LIST,"S.A. Bank","Kontostand\nEinzahlen\nAbheben\nKonto auflösen","Okay","Abbrechen");
  379.         }
  380.     }
  381.     if(dialogid == DIALOG_ABHEBEN)
  382.     {
  383.         if(response)
  384.         {
  385.             if(BankkontenInfo[playerid][Vermoegen]>=strval(inputtext))
  386.             {
  387.                 new oldbank = BankkontenInfo[playerid][Vermoegen];
  388.                 BankkontenInfo[playerid][Vermoegen] = oldbank-strval(inputtext);
  389.                 format(string,sizeof string,"Du hast %d$ vom deinem Konto abgehoben!",strval(inputtext));
  390.                 SendClientMessage(playerid,farbe,string);
  391.                 GivePlayerMoney(playerid,strval(inputtext));
  392.             }
  393.             else return SendClientMessage(playerid,farbe,"FEHLER: Soviel Geld ist auf dem Konto nicht verfügbar!");
  394.             ShowPlayerDialog(playerid,DIALOG_BANK2,DIALOG_STYLE_LIST,"S.A. Bank","Kontostand\nEinzahlen\nAbheben\nKonto auflösen","Okay","Abbrechen");
  395.         }
  396.     }
  397.     if(dialogid == DIALOG_AUFL)
  398.     {
  399.         if(response)
  400.         {
  401.             new bankk[128],name[MAX_PLAYER_NAME];
  402.             GetPlayerName(playerid,name,sizeof name);
  403.             format(bankk,sizeof bankk,"/Bankkonten/%s.txt",name);
  404.             if(dini_Exists(bankk))
  405.             {
  406.                 dini_Remove(bankk);
  407.                 SendClientMessage(playerid,farbe,"Du hast dein Bankkonto erfolgreich aufgelöst!");
  408.             }
  409.             else return SendClientMessage(playerid,farbe,"FEHLER: Du hast kein Konto bei der Bank!");
  410.         }
  411.     }
  412.     if(dialogid == DIALOG_CREATE)
  413.     {
  414.         if(response)
  415.         {
  416.             CreateKonto(playerid);
  417.         }
  418.     }
  419.     return 1;
  420. }
  421.  
  422. public OnPlayerClickPlayer(playerid, clickedplayerid, source)
  423. {
  424.     return 1;
  425. }
  426.  
  427. stock CreateBank(playerid,bankname[])
  428. {
  429.     new bank[128],name[MAX_PLAYER_NAME];
  430.     GetPlayerName(playerid,name,sizeof name);
  431.     for(new i=0;i<MAX_BANKS;i++)
  432.     {
  433.         format(bank,sizeof bank,"/Bank/%d.txt",i);
  434.         if(!dini_Exists(bank))
  435.         {
  436.             GetPlayerPos(playerid,BankInfo[i][Bankx],BankInfo[i][Banky],BankInfo[i][Bankz]);
  437.             BankInfo[i][Geld]=Startgeld;
  438.             BankInfo[i][ID]=i;
  439.             format(BankInfo[i][Name],124,bankname);
  440.             dini_Create(bank);
  441.             dini_Set(bank,"Name",bankname);
  442.             dini_Set(bank,"Ersteller",name);
  443.             dini_FloatSet(bank,"XKoords",BankInfo[i][Bankx]);
  444.             dini_FloatSet(bank,"YKoords",BankInfo[i][Banky]);
  445.             dini_FloatSet(bank,"ZKoords",BankInfo[i][Bankz]);
  446.             dini_IntSet(bank,"Geld",BankInfo[i][Geld]);
  447.             dini_IntSet(bank,"ID",i);
  448.             BankInfo[i][textdraw] = Create3DTextLabel(BankInfo[i][Name],farbe,BankInfo[i][Bankx],BankInfo[i][Banky],BankInfo[i][Bankz],20,0);
  449.             BankInfo[i][pickup] = CreatePickup(PICKUP_ID,1,BankInfo[i][Bankx],BankInfo[i][Banky],BankInfo[i][Bankz],0);
  450.             dini_IntSet(bank,"PickUp",BankInfo[i][pickup]);
  451.             return 0;
  452.         }
  453.     }
  454.     return true;
  455. }
  456.  
  457. stock CreateKonto(playerid)
  458. {
  459.     new bankk[128],name[MAX_PLAYER_NAME], pin, string[128];
  460.     GetPlayerName(playerid,name,sizeof name);
  461.     format(bankk,sizeof bankk,"/Bankkonten/%s.txt",name);
  462.     if(!dini_Exists(bankk))
  463.     {
  464.         dini_Create(bankk);
  465.         pin = 1000 + random(8999);
  466.         BankkontenInfo[playerid][Pin] = pin;
  467.         BankkontenInfo[playerid][Vermoegen] = K_STARTGELD;
  468.         dini_IntSet(bankk,"Pin",pin);
  469.         dini_IntSet(bankk,"Vermoegen",K_STARTGELD);
  470.         dini_Set(bankk,"Besitzer",name);
  471.         format(string,sizeof string,"Glückwunsch zu deinem neuem Konto! Du hast %d$ als Startguthaben auf deinem Konto. Deine Pin-Nummer ist: %d!",K_STARTGELD,pin);
  472.         SendClientMessage(playerid,farbe,string);
  473.     }
  474.     else return SendClientMessage(playerid,farbe,"FEHLER: Du hast bereits ein Konto bei der Bank!");
  475.     return 1;
  476. }
  477.  
  478. stock KontoSpeichern(playerid)
  479. {
  480.     new bankk[124],name[MAX_PLAYER_NAME];
  481.     GetPlayerName(playerid,name,sizeof name);
  482.     format(bankk,sizeof bankk,"/Bankkonten/%s.txt",name);
  483.     if(dini_Exists(bankk))
  484.     {
  485.         dini_IntSet(bankk,"Vermoegen",BankkontenInfo[playerid][Vermoegen]);
  486.     }
  487.     return 1;
  488. }
  489.  
  490. stock KontoLaden(playerid)
  491. {
  492.     new bankk[124],name[MAX_PLAYER_NAME];
  493.     GetPlayerName(playerid,name,sizeof name);
  494.     format(bankk,sizeof bankk,"/Bankkonten/%s.txt",name);
  495.     if(dini_Exists(bankk))
  496.     {
  497.         format(BankkontenInfo[playerid][Besitzer],124,dini_Get(bankk,"Besitzer"));
  498.         BankkontenInfo[playerid][Vermoegen]=dini_Int(bankk,"Vermoegen");
  499.         BankkontenInfo[playerid][Pin]=dini_Int(bankk,"Pin");
  500.     }
  501.     return 1;
  502. }
  503.  
  504. stock BankSpeichern()
  505. {
  506.     new bank[124];
  507.     for(new i=0;i<MAX_BANKS;i++)
  508.     {
  509.         format(bank,sizeof bank,"/Bank/%d.txt",i);
  510.         if(dini_Exists(bank))
  511.         {
  512.             dini_Set(bank,"Name",BankInfo[i][Name]);
  513.             dini_FloatSet(bank,"XKoords",BankInfo[i][Bankx]);
  514.             dini_FloatSet(bank,"YKoords",BankInfo[i][Banky]);
  515.             dini_FloatSet(bank,"ZKoords",BankInfo[i][Bankz]);
  516.             dini_IntSet(bank,"Geld",BankInfo[i][Geld]);
  517.             return 1;
  518.         }
  519.     }
  520.     return 1;
  521. }
  522.  
  523. stock BankLaden(bankid)
  524. {
  525.     new bank[124], string[124];
  526.     format(bank,sizeof bank,"/Bank/%d.txt",bankid);
  527.     if(dini_Exists(bank))
  528.     {
  529.         format(string,sizeof string,"%s\nBank ID: %d",dini_Get(bank,"Name"),dini_Int(bank,"ID"));
  530.         format(BankInfo[bankid][Name],124,dini_Get(bank,"Name"));
  531.         BankInfo[bankid][Bankx]=dini_Float(bank,"XKoords");
  532.         BankInfo[bankid][Banky]=dini_Float(bank,"YKoords");
  533.         BankInfo[bankid][Bankz]=dini_Float(bank,"ZKoords");
  534.         BankInfo[bankid][Geld]=dini_Int(bank,"Geld");
  535.         BankInfo[bankid][ID]=dini_Int(bank,"ID");
  536.         Create3DTextLabel(string,farbe,BankInfo[bankid][Bankx],BankInfo[bankid][Banky],BankInfo[bankid][Bankz],20,0);
  537.         CreatePickup(PICKUP_ID,1,BankInfo[bankid][Bankx],BankInfo[bankid][Banky],BankInfo[bankid][Bankz],0);
  538.     }
  539.     return 1;
  540. }
  541. stock sscanf(string[], format[], {Float,_}:...)
  542. {
  543.     #if defined isnull
  544.         if (isnull(string))
  545.     #else
  546.         if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
  547.     #endif
  548.         {
  549.             return format[0];
  550.         }
  551.     #pragma tabsize 4
  552.     new
  553.         formatPos = 0,
  554.         stringPos = 0,
  555.         paramPos = 2,
  556.         paramCount = numargs(),
  557.         delim = ' ';
  558.     while (string[stringPos] && string[stringPos] <= ' ')
  559.     {
  560.         stringPos++;
  561.     }
  562.     while (paramPos < paramCount && string[stringPos])
  563.     {
  564.         switch (format[formatPos++])
  565.         {
  566.             case '\0':
  567.             {
  568.                 return 0;
  569.             }
  570.             case 'i', 'd':
  571.             {
  572.                 new
  573.                     neg = 1,
  574.                     num = 0,
  575.                     ch = string[stringPos];
  576.                 if (ch == '-')
  577.                 {
  578.                     neg = -1;
  579.                     ch = string[++stringPos];
  580.                 }
  581.                 do
  582.                 {
  583.                     stringPos++;
  584.                     if ('0' <= ch <= '9')
  585.                     {
  586.                         num = (num * 10) + (ch - '0');
  587.                     }
  588.                     else
  589.                     {
  590.                         return -1;
  591.                     }
  592.                 }
  593.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  594.                 setarg(paramPos, 0, num * neg);
  595.             }
  596.             case 'h', 'x':
  597.             {
  598.                 new
  599.                     num = 0,
  600.                     ch = string[stringPos];
  601.                 do
  602.                 {
  603.                     stringPos++;
  604.                     switch (ch)
  605.                     {
  606.                         case 'x', 'X':
  607.                         {
  608.                             num = 0;
  609.                             continue;
  610.                         }
  611.                         case '0' .. '9':
  612.                         {
  613.                             num = (num << 4) | (ch - '0');
  614.                         }
  615.                         case 'a' .. 'f':
  616.                         {
  617.                             num = (num << 4) | (ch - ('a' - 10));
  618.                         }
  619.                         case 'A' .. 'F':
  620.                         {
  621.                             num = (num << 4) | (ch - ('A' - 10));
  622.                         }
  623.                         default:
  624.                         {
  625.                             return -1;
  626.                         }
  627.                     }
  628.                 }
  629.                 while ((ch = string[stringPos]) > ' ' && ch != delim);
  630.                 setarg(paramPos, 0, num);
  631.             }
  632.             case 'c':
  633.             {
  634.                 setarg(paramPos, 0, string[stringPos++]);
  635.             }
  636.             case 'f':
  637.             {
  638.  
  639.                 new changestr[16], changepos = 0, strpos = stringPos;
  640.                 while(changepos < 16 && string[strpos] && string[strpos] != delim)
  641.                 {
  642.                     changestr[changepos++] = string[strpos++];
  643.                     }
  644.                 changestr[changepos] = '\0';
  645.                 setarg(paramPos,0,_:floatstr(changestr));
  646.             }
  647.             case 'p':
  648.             {
  649.                 delim = format[formatPos++];
  650.                 continue;
  651.             }
  652.             case '\'':
  653.             {
  654.                 new
  655.                     end = formatPos - 1,
  656.                     ch;
  657.                 while ((ch = format[++end]) && ch != '\'') {}
  658.                 if (!ch)
  659.                 {
  660.                     return -1;
  661.                 }
  662.                 format[end] = '\0';
  663.                 if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
  664.                 {
  665.                     if (format[end + 1])
  666.                     {
  667.                         return -1;
  668.                     }
  669.                     return 0;
  670.                 }
  671.                 format[end] = '\'';
  672.                 stringPos = ch + (end - formatPos);
  673.                 formatPos = end + 1;
  674.             }
  675.             case 'u':
  676.             {
  677.                 new
  678.                     end = stringPos - 1,
  679.                     id = 0,
  680.                     bool:num = true,
  681.                     ch;
  682.                 while ((ch = string[++end]) && ch != delim)
  683.                 {
  684.                     if (num)
  685.                     {
  686.                         if ('0' <= ch <= '9')
  687.                         {
  688.                             id = (id * 10) + (ch - '0');
  689.                         }
  690.                         else
  691.                         {
  692.                             num = false;
  693.                         }
  694.                     }
  695.                 }
  696.                 if (num && IsPlayerConnected(id))
  697.                 {
  698.                     setarg(paramPos, 0, id);
  699.                 }
  700.                 else
  701.                 {
  702.                     #if !defined foreach
  703.                         #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  704.                         #define __SSCANF_FOREACH__
  705.                     #endif
  706.                     string[end] = '\0';
  707.                     num = false;
  708.                     new
  709.                         name[MAX_PLAYER_NAME];
  710.                     id = end - stringPos;
  711.                     foreach (Player, playerid)
  712.                     {
  713.                         GetPlayerName(playerid, name, sizeof (name));
  714.                         if (!strcmp(name, string[stringPos], true, id))
  715.                         {
  716.                             setarg(paramPos, 0, playerid);
  717.                             num = true;
  718.                             break;
  719.                         }
  720.                     }
  721.                     if (!num)
  722.                     {
  723.                         setarg(paramPos, 0, INVALID_PLAYER_ID);
  724.                     }
  725.                     string[end] = ch;
  726.                     #if defined __SSCANF_FOREACH__
  727.                         #undef foreach
  728.                         #undef __SSCANF_FOREACH__
  729.                     #endif
  730.                 }
  731.                 stringPos = end;
  732.             }
  733.             case 's', 'z':
  734.             {
  735.                 new
  736.                     i = 0,
  737.                     ch;
  738.                 if (format[formatPos])
  739.                 {
  740.                     while ((ch = string[stringPos++]) && ch != delim)
  741.                     {
  742.                         setarg(paramPos, i++, ch);
  743.                     }
  744.                     if (!i)
  745.                     {
  746.                         return -1;
  747.                     }
  748.                 }
  749.                 else
  750.                 {
  751.                     while ((ch = string[stringPos++]))
  752.                     {
  753.                         setarg(paramPos, i++, ch);
  754.                     }
  755.                 }
  756.                 stringPos--;
  757.                 setarg(paramPos, i, '\0');
  758.             }
  759.             default:
  760.             {
  761.                 continue;
  762.             }
  763.         }
  764.         while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
  765.         {
  766.             stringPos++;
  767.         }
  768.         while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
  769.         {
  770.             stringPos++;
  771.         }
  772.         paramPos++;
  773.     }
  774.     do
  775.     {
  776.         if ((delim = format[formatPos++]) > ' ')
  777.         {
  778.             if (delim == '\'')
  779.             {
  780.                 while ((delim = format[formatPos++]) && delim != '\'') {}
  781.             }
  782.             else if (delim != 'z')
  783.             {
  784.                 return delim;
  785.             }
  786.         }
  787.     }
  788.     while (delim > ' ');
  789.     return 0;
  790. }
Add Comment
Please, Sign In to add comment