Advertisement
exod182

Kleines Selfmade

Aug 3rd, 2013
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.48 KB | None | 0 0
  1. /*
  2. */
  3.  
  4. #include <a_samp>
  5. #include <Dini>
  6. #include <ocmd>
  7. //Spieler Enum
  8. enum spielerdaten{
  9. sGeld,
  10. sKills,
  11. sTode,
  12. sAdmin,
  13. sFraktion,
  14. sRang
  15. }
  16. new Spieler[MAX_PLAYERS][spielerdaten];
  17. //Farben
  18. #define ROT 0xE10000FF
  19. #define COLOR_NOPARAMS 0xB8860BAA
  20. #define Adminclr 0xB8860BAA
  21. //Andere Defines
  22. //////////////////////////////////////////////////////////////////////////////////
  23. #define CONFIGPFAD "/config.ini" //
  24. #define ACCOUNTVERZEICHNIS "/Accounts/" //
  25. #define AUTOVERZEICHNIS "/Autos/" //
  26. #define STARTGELD 500 //
  27. //////////////////////////////////////////////////////////////////////////////////
  28.  
  29. #define Funktion%0(%1) forward%0(%1); public%0(%1)
  30. //Dialoge
  31. enum{
  32. DIALOG_REGISTER,
  33. DIALOG_LOGIN,
  34. DIALOG_ACP,
  35. DIALOG_ALL_OTHER
  36. }
  37. //New's
  38. new serverkasse;
  39. new Auto[MAX_PLAYERS];
  40. //Forward
  41. forward playerkick(playerid);
  42. //Script anfang
  43. main()
  44. {
  45. print("\n----------------------------------");
  46. print(" Kleines Roleplay Script [DINI] by Azure Jr.");
  47. print("----------------------------------\n");
  48. }
  49.  
  50. Funktion OnGameModeInit()
  51. {
  52. SetGameModeText("Derby");
  53. AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
  54. print("\n-------------------------------------------------------------------");
  55. if(!dini_Exists(CONFIGPFAD))
  56. {
  57. dini_Create(CONFIGPFAD);
  58. dini_IntSet(CONFIGPFAD, "ServerKasse", 5000);
  59. print(" *[DATEI] config.ini erstellt");
  60. dini_FloatSet(CONFIGPFAD, "NoobX", 1129.063232);
  61. dini_FloatSet(CONFIGPFAD, "NoobY", -1488.068847);
  62. dini_FloatSet(CONFIGPFAD, "NoobZ", 22.769031);
  63. dini_FloatSet(CONFIGPFAD, "NoobA", 1.817361);
  64. }
  65. serverkasse = dini_Int(CONFIGPFAD,"ServerKasse");
  66. print(" *[DATEI] config.ini gelesen");
  67. printf(" *[DATEI] ServerKasse (config.ini) enthält %d",serverkasse);
  68. print("\n-------------------------------------------------------------------");
  69.  
  70. SetTimer("Other2", 966, 1);
  71. return 1;
  72. }
  73.  
  74. Funktion OnGameModeExit()
  75. {
  76. for(new i=0;i<MAX_PLAYERS;i++)
  77. {
  78. SpielerSpeichern(i);
  79. }
  80. dini_IntSet(CONFIGPFAD,"ServerKasse",serverkasse);
  81. return 1;
  82. }
  83.  
  84. Funktion OnPlayerRequestClass(playerid, classid)
  85. {
  86. new pfad[40];
  87. format(pfad, sizeof(pfad), ""#ACCOUNTVERZEICHNIS"%s.ini", SpielerName(playerid));
  88. if(dini_Exists(pfad))
  89. {
  90. ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login","Bitte gib dein Passwort ein","Einloggen","Abbrechen");
  91. }
  92. else
  93. {
  94. ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Register", "Bitte geb dein Passwort ein","Registrieren", "Abbrechen");
  95. }
  96. return 1;
  97. }
  98.  
  99. Funktion OnPlayerConnect(playerid)
  100. {
  101. CreatePlayerCar(playerid);
  102. return 1;
  103. }
  104.  
  105. Funktion OnPlayerDisconnect(playerid, reason)
  106. {
  107. SpielerSpeichern(playerid);
  108. return 1;
  109. }
  110.  
  111. Funktion OnPlayerSpawn(playerid)
  112. {
  113. new Float:X = dini_Float("/config.ini", "NoobX");
  114. new Float:Y = dini_Float("/config.ini", "NoobY");
  115. new Float:Z = dini_Float("/config.ini", "NoobZ");
  116. new Float:A = dini_Float("/config.ini", "NoobA");
  117. SetPlayerPos(playerid, X, Y, Z);
  118. SetPlayerFacingAngle(playerid, A);
  119. return 1;
  120. }
  121.  
  122. Funktion OnPlayerDeath(playerid, killerid, reason)
  123. {
  124. return 1;
  125. }
  126.  
  127. Funktion OnVehicleSpawn(vehicleid)
  128. {
  129. return 1;
  130. }
  131.  
  132. Funktion OnVehicleDeath(vehicleid, killerid)
  133. {
  134. return 1;
  135. }
  136.  
  137. Funktion OnPlayerText(playerid, text[])
  138. {
  139. return 1;
  140. }
  141.  
  142. Funktion OnPlayerCommandText(playerid, cmdtext[])
  143. {
  144. new cmdstr[128];
  145. if (strcmp("/mycommand", cmdtext, true, 10) == 0)
  146. {
  147. // Do something here
  148. return 1;
  149. }
  150. format(cmdstr, sizeof(cmdstr), "Den Befehl (%s) gibt es nicht!",cmdtext);
  151. return SendClientMessage(playerid, ROT, cmdstr);
  152. }
  153.  
  154. ocmd:makeadmin(playerid, params[])
  155. {
  156. new id, level, str[100];
  157. if(Spieler[playerid][sAdmin] >= 4 || IsPlayerAdmin(playerid))
  158. {
  159. if(sscanf(params, "ud",id, level))return ERROR(playerid, "Benutzung: /makeadmin [Name / ID] [Adminlevel]");
  160. if(!IsPlayerConnected(id))return ERROR(playerid, "Der Spieler ist nicht zum Server verbunden");
  161. Spieler[id][sAdmin] = level;
  162. SpielerSpeichern(id);
  163. format(str, sizeof(str), "%s hat %s zu einem Admin ernannt Level %d!", SpielerName(playerid), SpielerName(id), level);
  164. SendClientMessageToAll(ROT, str);
  165. }
  166. else NoAdmin(playerid, 4);
  167. return 1;
  168. }
  169.  
  170. ocmd:setspawn(playerid)
  171. {
  172. if(Spieler[playerid][sAdmin] < 4)return NoAdmin(playerid, 4);
  173. new Float:X, Float:Y, Float:Z, Float:A;
  174. GetPlayerPos(playerid, X, Y, Z);
  175. GetPlayerFacingAngle(playerid, A);
  176. dini_FloatSet("/config.ini", "NoobX", X);
  177. dini_FloatSet("/config.ini", "NoobY", Y);
  178. dini_FloatSet("/config.ini", "NoobZ", Z);
  179. dini_FloatSet("/config.ini", "NoobA", A);
  180. return 1;
  181. }
  182.  
  183. ocmd:parken(playerid)
  184. {
  185. new autostr[40];
  186. format(autostr, sizeof(autostr), ""#AUTOVERZEICHNIS"%s.ini", SpielerName(playerid));
  187. new Float:vX, Float:vY, Float:vZ, Float:vA;
  188. GetVehiclePos(Auto[playerid], vX, vY, vZ);
  189. GetVehicleZAngle(Auto[playerid],vA);
  190. if(GetPlayerVehicleID(playerid) == Auto[playerid])
  191. {
  192. dini_FloatSet(autostr, "X", vX);
  193. dini_FloatSet(autostr, "Y", vY);
  194. dini_FloatSet(autostr, "Z", vZ);
  195. dini_FloatSet(autostr, "A", vA);
  196. RemovePlayerFromVehicle(playerid);
  197. SetVehicleToRespawn(Auto[playerid]);
  198. PutPlayerInVehicle(playerid, Auto[playerid], 0);
  199. }
  200. return 1;
  201. }
  202.  
  203. ocmd:rc(playerid)
  204. {
  205. CreatePlayerCar(playerid);
  206. return 1;
  207. }
  208.  
  209. ocmd:buycar(playerid)
  210. {
  211. new autostr[40];
  212. format(autostr, sizeof(autostr), ""#AUTOVERZEICHNIS"%s.ini", SpielerName(playerid));
  213. dini_Set(autostr, "Besitzer", SpielerName(playerid));
  214. if(!dini_Exists(autostr))
  215. {
  216. dini_Create(autostr);
  217. dini_IntSet(autostr, "Model", 411);
  218. dini_FloatSet(autostr, "X", 1104.665893);
  219. dini_FloatSet(autostr, "Y", -1460.945800);
  220. dini_FloatSet(autostr, "Z", 15.524399);
  221. dini_FloatSet(autostr, "A", 269.711486);
  222. dini_IntSet(autostr, "Farbe1", 0);
  223. dini_IntSet(autostr, "Farbe2", 0);
  224. dini_Set(autostr, "Nummernschild", SpielerName(playerid));
  225. CreatePlayerCar(playerid);
  226. }
  227. else ERROR(playerid, "Du hast bereits ein Fahrzeug");
  228. return 1;
  229. }
  230.  
  231. ocmd:acp(playerid)
  232. {
  233. ShowPlayerDialog(playerid, DIALOG_ACP, DIALOG_STYLE_LIST, "{FFFF00}A{FFFFFF}dmin {FFFF00}C{FFFFFF}ontrol {FFFF00}P{FFFFFF}anel","Server restarten\nServerkasse","Auswählen","Abbrechen");
  234. return 1;
  235. }
  236.  
  237. ocmd:createcar(playerid, params[])
  238. {
  239. if(Spieler[playerid][sAdmin] < 1)return NoAdmin(playerid, 1);
  240. new model, Float:X, Float:Y, Float:Z, Float:A;
  241. if(sscanf(params, "d", model))return ERROR(playerid, "Benutzung: /createcar [Model]");
  242. GetPlayerPos(playerid, X, Y, Z);
  243. GetPlayerFacingAngle(playerid, A);
  244. CreateVehicle(model, X, Y, Z, A, -1, -1, -1);
  245. return 1;
  246. }
  247.  
  248. ocmd:givemoney(playerid, params[])
  249. {
  250. new id, geld;
  251. if(Spieler[playerid][sAdmin] < 4)return NoAdmin(playerid, 4);
  252. if(sscanf(params, "ud", id, geld))return ERROR(playerid, "Benutzung: /givemoney [Name/ID] [Menge]");
  253. GivePlayerMoney(id, geld);
  254. return 1;
  255. }
  256.  
  257. ocmd:spenden(playerid, params[])
  258. {
  259. new spende;
  260. if(sscanf(params, "d", spende))ERROR(playerid, "Benutzung: /spenden [Anzahl]");
  261. if(GetPlayerMoney(playerid) < spende)return ERROR(playerid, "Du kannst nicht mehr Spenden, als du besitzt");
  262. serverkasse += spende;
  263. GivePlayerMoney(playerid, -spende);
  264. dini_IntSet(CONFIGPFAD,"ServerKasse",serverkasse);
  265. return 1;
  266. }
  267.  
  268. Funktion OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  269. {
  270. return 1;
  271. }
  272.  
  273. Funktion OnPlayerExitVehicle(playerid, vehicleid)
  274. {
  275. return 1;
  276. }
  277.  
  278. Funktion OnPlayerStateChange(playerid, newstate, oldstate)
  279. {
  280. return 1;
  281. }
  282.  
  283. Funktion OnPlayerEnterCheckpoint(playerid)
  284. {
  285. return 1;
  286. }
  287.  
  288. Funktion OnPlayerLeaveCheckpoint(playerid)
  289. {
  290. return 1;
  291. }
  292.  
  293. Funktion OnPlayerEnterRaceCheckpoint(playerid)
  294. {
  295. return 1;
  296. }
  297.  
  298. Funktion OnPlayerLeaveRaceCheckpoint(playerid)
  299. {
  300. return 1;
  301. }
  302.  
  303. Funktion OnRconCommand(cmd[])
  304. {
  305. return 1;
  306. }
  307.  
  308. Funktion OnPlayerRequestSpawn(playerid)
  309. {
  310. return 1;
  311. }
  312.  
  313. Funktion OnObjectMoved(objectid)
  314. {
  315. return 1;
  316. }
  317.  
  318. Funktion OnPlayerObjectMoved(playerid, objectid)
  319. {
  320. return 1;
  321. }
  322.  
  323. Funktion OnPlayerPickUpPickup(playerid, pickupid)
  324. {
  325. return 1;
  326. }
  327.  
  328. Funktion OnVehicleMod(playerid, vehicleid, componentid)
  329. {
  330. return 1;
  331. }
  332.  
  333. Funktion OnVehiclePaintjob(playerid, vehicleid, paintjobid)
  334. {
  335. return 1;
  336. }
  337.  
  338. Funktion OnVehicleRespray(playerid, vehicleid, color1, color2)
  339. {
  340. return 1;
  341. }
  342.  
  343. Funktion OnPlayerSelectedMenuRow(playerid, row)
  344. {
  345. return 1;
  346. }
  347.  
  348. Funktion OnPlayerExitedMenu(playerid)
  349. {
  350. return 1;
  351. }
  352.  
  353. Funktion OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  354. {
  355. return 1;
  356. }
  357.  
  358. Funktion OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  359. {
  360. return 1;
  361. }
  362.  
  363. Funktion OnRconLoginAttempt(ip[], password[], success)
  364. {
  365. return 1;
  366. }
  367.  
  368. Funktion OnPlayerUpdate(playerid)
  369. {
  370. return 1;
  371. }
  372.  
  373. Funktion OnPlayerStreamIn(playerid, forplayerid)
  374. {
  375. return 1;
  376. }
  377.  
  378. Funktion OnPlayerStreamOut(playerid, forplayerid)
  379. {
  380. return 1;
  381. }
  382.  
  383. Funktion OnVehicleStreamIn(vehicleid, forplayerid)
  384. {
  385. return 1;
  386. }
  387.  
  388. Funktion OnVehicleStreamOut(vehicleid, forplayerid)
  389. {
  390. return 1;
  391. }
  392.  
  393. Funktion OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  394. {
  395. switch(dialogid)
  396. {
  397. case DIALOG_REGISTER:
  398. {
  399. new pfad[40];
  400. format(pfad, sizeof(pfad), ""#ACCOUNTVERZEICHNIS"%s.ini", SpielerName(playerid));
  401. dini_Create(pfad);
  402. dini_Set(pfad,"Key",inputtext);
  403. printf("%s hat sich Registriert (Passwort: %s)", SpielerName(playerid), inputtext);
  404. CreateAccount(playerid);
  405. SpawnPlayer(playerid);
  406. }
  407. case DIALOG_LOGIN:
  408. {
  409. new pfad[40];
  410. format(pfad, sizeof(pfad), ""#ACCOUNTVERZEICHNIS"%s.ini", SpielerName(playerid));
  411. if(!strlen(inputtext))
  412. {
  413. SendClientMessage(playerid,ROT,"Das Passwort ist zu Kurz");
  414. ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Bitte gebe dein Passwort ein","Bestätigen","Abbrechen");
  415. }
  416. else
  417. {
  418. if(!strcmp(inputtext,dini_Get(pfad,"Key"),false))
  419. {
  420. SpawnPlayer(playerid);
  421. printf("%s hat sich erfolgreich eingeloggt (Passwort: %s)", SpielerName(playerid),inputtext);
  422. }
  423. else
  424. {
  425. kickplayer(playerid, "Nicht Registriert / Eingeloggt");
  426. }
  427. SpielerLaden(playerid);
  428. }
  429. }
  430. case DIALOG_ACP:
  431. {
  432. if(listitem == 0)
  433. {
  434. if(!response)return 1;
  435. else SendRconCommand("gmx");
  436. return 1;
  437. }
  438. else if(listitem == 1)
  439. {
  440. new skstr[80];
  441. format(skstr, sizeof(skstr), "In der Serverkasse befinden sich momentan %d$", serverkasse);
  442. ShowInfoBox(playerid, "Information", skstr);
  443. }
  444. }
  445. }
  446. return 1;
  447. }
  448.  
  449. Funktion OnPlayerClickPlayer(playerid, clickedplayerid, source)
  450. {
  451. return 1;
  452. }
  453.  
  454. Funktion playerkick(playerid)
  455. {
  456. Kick(playerid);
  457. }
  458.  
  459. Funktion Other2()
  460. {
  461. for(new i=0;i<MAX_PLAYERS;i++)
  462. {
  463. if(GetPlayerMoney(i) != Spieler[i][sGeld])return SetPlayerMoney(i, Spieler[i][sGeld]);
  464. }
  465. return 1;
  466. }
  467.  
  468. /*stock CreatePlayerCar(playerid)
  469. {
  470. dini_IntSet(autostr, "Model", 411);
  471. dini_FloatSet(autostr, "X", 1104.665893);
  472. dini_FloatSet(autostr, "Y", -1460.945800);
  473. dini_FloatSet(autostr, "Z", 15.524399);
  474. dini_FloatSet(autostr, "A", 269.711486);
  475. dini_IntSet(autostr, "Farbe1", 0);
  476. dini_IntSet(autostr, "Farbe2", 0);
  477. dini_Set(autostr, "Nummernschild", "Neuwagen");
  478. }*/
  479.  
  480. stock CreatePlayerCar(playerid)
  481. {
  482. new autostr[40];
  483. format(autostr, sizeof(autostr), ""#AUTOVERZEICHNIS"%s.ini", SpielerName(playerid));
  484. new model = dini_Int(autostr, "Model");
  485. new Col1 = dini_Int(autostr, "Farbe1");
  486. new Col2 = dini_Int(autostr, "Farbe2");
  487. new Float:X = dini_Float(autostr,"X");
  488. new Float:Y = dini_Float(autostr,"Y");
  489. new Float:Z = dini_Float(autostr,"Z");
  490. new Float:A = dini_Float(autostr,"A");
  491. Auto[playerid] = CreateVehicle(model, X, Y, Z, A, Col1, Col2, -1);
  492. SetVehicleNumberPlate(Auto[playerid],dini_Get(autostr, "Nummernschild"));
  493. SetVehicleToRespawn(Auto[playerid]);
  494. }
  495.  
  496. stock ShowInfoBox(playerid, Caption[], Info[])
  497. {
  498. ShowPlayerDialog(playerid, DIALOG_ALL_OTHER, DIALOG_STYLE_MSGBOX, Caption, Info, "Ok", "");
  499. }
  500.  
  501. stock SetPlayerMoney(playerid, cash)
  502. {
  503. ResetPlayerMoney(playerid);
  504. return GibGeld(playerid, cash);
  505. }
  506.  
  507.  
  508. stock GibGeld(playerid, anzahl)
  509. {
  510. GivePlayerMoney(playerid, anzahl);
  511. Spieler[playerid][sGeld] = GetPlayerMoney(playerid);
  512. return 1;
  513. }
  514.  
  515. stock kickplayer(id, Grund[])
  516. {
  517. new string[128];
  518. format(string, sizeof(string), "%s wurde vom Server Gekickt. Grund: %s", SpielerName(id), Grund);
  519. SendClientMessageToAll(ROT,"------------- SERVERINFORMATION ------------");
  520. SendClientMessageToAll(ROT,string);
  521. SendClientMessageToAll(ROT,"--------------------------------------------");
  522. SetTimerEx("playerkick",100,0,"d",id);
  523. return 1;
  524. }
  525.  
  526. stock SpielerName(playerid)
  527. {
  528. new name[MAX_PLAYER_NAME];
  529. GetPlayerName(playerid,name,sizeof(name));
  530. return name;
  531. }
  532.  
  533. stock ERROR(playerid, text[])return SendClientMessage(playerid, COLOR_NOPARAMS, text);
  534.  
  535. stock SpielerLaden(playerid)
  536. {
  537. new accpfad[40];
  538. format(accpfad, sizeof(accpfad), ""#ACCOUNTVERZEICHNIS"%s.ini", SpielerName(playerid));
  539. Spieler[playerid][sAdmin] = dini_Int(accpfad, "Adminlevel");
  540. Spieler[playerid][sGeld] = dini_Int(accpfad, "Geld");
  541. Spieler[playerid][sKills] = dini_Int(accpfad, "Kills");
  542. Spieler[playerid][sTode] = dini_Int(accpfad, "Tode");
  543. Spieler[playerid][sFraktion] = dini_Int(accpfad, "Fraktion");
  544. Spieler[playerid][sRang] = dini_Int(accpfad, "Rang");
  545. GivePlayerMoney(playerid, Spieler[playerid][sGeld]);
  546. }
  547.  
  548. stock SpielerSpeichern(playerid)
  549. {
  550. new accpfad[40];
  551. format(accpfad, sizeof(accpfad), ""#ACCOUNTVERZEICHNIS"%s.ini", SpielerName(playerid));
  552. dini_IntSet(accpfad, "Adminlevel", Spieler[playerid][sAdmin]);
  553. dini_IntSet(accpfad, "Geld", Spieler[playerid][sGeld]);
  554. dini_IntSet(accpfad, "Kills", Spieler[playerid][sKills]);
  555. dini_IntSet(accpfad, "Tode", Spieler[playerid][sTode]);
  556. dini_IntSet(accpfad, "Fraktion", Spieler[playerid][sFraktion]);
  557. dini_IntSet(accpfad, "Rang", Spieler[playerid][sRang]);
  558. }
  559.  
  560. stock CreateAccount(playerid)
  561. {
  562. new accpfad[40];
  563. format(accpfad, sizeof(accpfad), ""#ACCOUNTVERZEICHNIS"%s.ini", SpielerName(playerid));
  564. dini_IntSet(accpfad, "Adminlevel", 0);
  565. dini_IntSet(accpfad, "Geld", STARTGELD);
  566. dini_IntSet(accpfad, "Kills", 0);
  567. dini_IntSet(accpfad, "Tode", 0);
  568. dini_IntSet(accpfad, "Fraktion", 0);
  569. dini_IntSet(accpfad, "Rang", 0);
  570. serverkasse -= STARTGELD;
  571. SpielerLaden(playerid);
  572. }
  573.  
  574. stock NoAdmin(playerid, Adminlvl)
  575. {
  576. new noadstr[128];
  577. if(Spieler[playerid][sAdmin] < Adminlvl)
  578. {
  579. format(noadstr, sizeof(noadstr), " >> Du bist kein Admin << [Benötigtes Adminlevel: %d]", Adminlvl);
  580. SendClientMessage(playerid, Adminclr, noadstr);
  581. }
  582. return 1;
  583. }
  584.  
  585. stock sscanf(string[], format[], {Float,_}:...)
  586. {
  587. #if defined isnull
  588. if (isnull(string))
  589. #else
  590. if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
  591. #endif
  592. {
  593. return format[0];
  594. }
  595. #pragma tabsize 4
  596. new
  597. formatPos = 0,
  598. stringPos = 0,
  599. paramPos = 2,
  600. paramCount = numargs(),
  601. delim = ' ';
  602. while (string[stringPos] && string[stringPos] <= ' ')
  603. {
  604. stringPos++;
  605. }
  606. while (paramPos < paramCount && string[stringPos])
  607. {
  608. switch (format[formatPos++])
  609. {
  610. case '\0':
  611. {
  612. return 0;
  613. }
  614. case 'i', 'd':
  615. {
  616. new
  617. neg = 1,
  618. num = 0,
  619. ch = string[stringPos];
  620. if (ch == '-')
  621. {
  622. neg = -1;
  623. ch = string[++stringPos];
  624. }
  625. do
  626. {
  627. stringPos++;
  628. if ('0' <= ch <= '9')
  629. {
  630. num = (num * 10) + (ch - '0');
  631. }
  632. else
  633. {
  634. return -1;
  635. }
  636. }
  637. while ((ch = string[stringPos]) > ' ' && ch != delim);
  638. setarg(paramPos, 0, num * neg);
  639. }
  640. case 'h', 'x':
  641. {
  642. new
  643. num = 0,
  644. ch = string[stringPos];
  645. do
  646. {
  647. stringPos++;
  648. switch (ch)
  649. {
  650. case 'x', 'X':
  651. {
  652. num = 0;
  653. continue;
  654. }
  655. case '0' .. '9':
  656. {
  657. num = (num << 4) | (ch - '0');
  658. }
  659. case 'a' .. 'f':
  660. {
  661. num = (num << 4) | (ch - ('a' - 10));
  662. }
  663. case 'A' .. 'F':
  664. {
  665. num = (num << 4) | (ch - ('A' - 10));
  666. }
  667. default:
  668. {
  669. return -1;
  670. }
  671. }
  672. }
  673. while ((ch = string[stringPos]) > ' ' && ch != delim);
  674. setarg(paramPos, 0, num);
  675. }
  676. case 'c':
  677. {
  678. setarg(paramPos, 0, string[stringPos++]);
  679. }
  680. case 'f':
  681. {
  682.  
  683. new changestr[16], changepos = 0, strpos = stringPos;
  684. while(changepos < 16 && string[strpos] && string[strpos] != delim)
  685. {
  686. changestr[changepos++] = string[strpos++];
  687. }
  688. changestr[changepos] = '\0';
  689. setarg(paramPos,0,_:floatstr(changestr));
  690. }
  691. case 'p':
  692. {
  693. delim = format[formatPos++];
  694. continue;
  695. }
  696. case '\'':
  697. {
  698. new
  699. end = formatPos - 1,
  700. ch;
  701. while ((ch = format[++end]) && ch != '\'') {}
  702. if (!ch)
  703. {
  704. return -1;
  705. }
  706. format[end] = '\0';
  707. if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
  708. {
  709. if (format[end + 1])
  710. {
  711. return -1;
  712. }
  713. return 0;
  714. }
  715. format[end] = '\'';
  716. stringPos = ch + (end - formatPos);
  717. formatPos = end + 1;
  718. }
  719. case 'u':
  720. {
  721. new
  722. end = stringPos - 1,
  723. id = 0,
  724. bool:num = true,
  725. ch;
  726. while ((ch = string[++end]) && ch != delim)
  727. {
  728. if (num)
  729. {
  730. if ('0' <= ch <= '9')
  731. {
  732. id = (id * 10) + (ch - '0');
  733. }
  734. else
  735. {
  736. num = false;
  737. }
  738. }
  739. }
  740. if (num && IsPlayerConnected(id))
  741. {
  742. setarg(paramPos, 0, id);
  743. }
  744. else
  745. {
  746. #if !defined foreach
  747. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  748. #define __SSCANF_FOREACH__
  749. #endif
  750. string[end] = '\0';
  751. num = false;
  752. new
  753. name[MAX_PLAYER_NAME];
  754. id = end - stringPos;
  755. for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
  756. {
  757. GetPlayerName(playerid, name, sizeof (name));
  758. if (!strcmp(name, string[stringPos], true, id))
  759. {
  760. setarg(paramPos, 0, playerid);
  761. num = true;
  762. break;
  763. }
  764. }
  765. if (!num)
  766. {
  767. setarg(paramPos, 0, INVALID_PLAYER_ID);
  768. }
  769. string[end] = ch;
  770. #if defined __SSCANF_FOREACH__
  771. #undef foreach
  772. #undef __SSCANF_FOREACH__
  773. #endif
  774. }
  775. stringPos = end;
  776. }
  777. case 's', 'z':
  778. {
  779. new
  780. i = 0,
  781. ch;
  782. if (format[formatPos])
  783. {
  784. while ((ch = string[stringPos++]) && ch != delim)
  785. {
  786. setarg(paramPos, i++, ch);
  787. }
  788. if (!i)
  789. {
  790. return -1;
  791. }
  792. }
  793. else
  794. {
  795. while ((ch = string[stringPos++]))
  796. {
  797. setarg(paramPos, i++, ch);
  798. }
  799. }
  800. stringPos--;
  801. setarg(paramPos, i, '\0');
  802. }
  803. default:
  804. {
  805. continue;
  806. }
  807. }
  808. while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
  809. {
  810. stringPos++;
  811. }
  812. while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
  813. {
  814. stringPos++;
  815. }
  816. paramPos++;
  817. }
  818. do
  819. {
  820. if ((delim = format[formatPos++]) > ' ')
  821. {
  822. if (delim == '\'')
  823. {
  824. while ((delim = format[formatPos++]) && delim != '\'') {}
  825. }
  826. else if (delim != 'z')
  827. {
  828. return delim;
  829. }
  830. }
  831. }
  832. while (delim > ' ');
  833. return 0;
  834. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement