Advertisement
Guest User

Blitzersystem by merte

a guest
Mar 31st, 2012
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.66 KB | None | 0 0
  1. #include <a_samp>
  2. #include <ocmd>
  3.  
  4. #define cWhite 0xFFFFFFFF
  5. #define cRed 0xFF3A3AFF
  6. #define COLOR_RED cRed
  7. #define cYellow 0xFFFF00FF
  8.  
  9. new Float:SavedPOSx[MAX_PLAYERS];
  10. new Float:SavedPOSy[MAX_PLAYERS];
  11. new Float:SavedPOSz[MAX_PLAYERS];
  12. new Blitzer1, Blitzer2, Blitzer3, Blitzer4, Blitzer5;
  13. new Blitzer1Speed, Blitzer2Speed, Blitzer3Speed, Blitzer4Speed, Blitzer5Speed;
  14. new Blitzer1Pos[128], Blitzer2Pos[128], Blitzer3Pos[128], Blitzer4Pos[128], Blitzer5Pos[128];
  15. new Blitzer1Owner, Blitzer2Owner, Blitzer3Owner, Blitzer4Owner, Blitzer5Owner;
  16. new Float:Blitzer1X,Float:Blitzer1Y,Float:Blitzer1Z;
  17. new Float:Blitzer2X,Float:Blitzer2Y,Float:Blitzer2Z;
  18. new Float:Blitzer3X,Float:Blitzer3Y,Float:Blitzer3Z;
  19. new Float:Blitzer4X,Float:Blitzer4Y,Float:Blitzer4Z;
  20. new Float:Blitzer5X,Float:Blitzer5Y,Float:Blitzer5Z;
  21. new BlitzerTimer[MAX_PLAYERS];
  22.  
  23.  
  24. #if defined FILTERSCRIPT
  25.  
  26. public OnFilterScriptInit()
  27. {
  28. print("\n--------------------------------------");
  29. print("Blitzer system by Merte");
  30. print("--------------------------------------\n");
  31. return 1;
  32. }
  33.  
  34. public OnFilterScriptExit()
  35. {
  36. return 1;
  37. }
  38.  
  39. #endif
  40.  
  41. public OnPlayerConnect(playerid)
  42. {
  43. BlitzerTimer[playerid] = SetTimerEx("IsAtBlitzer",500,1,"d",playerid);
  44. return 1;
  45. }
  46.  
  47. public OnPlayerDisconnect(playerid, reason)
  48. {
  49. KillTimer(BlitzerTimer[playerid]);
  50. return 1;
  51. }
  52.  
  53. forward IsAtBlitzer(playerid);
  54. public IsAtBlitzer(playerid)
  55. {
  56. new carid = GetVehicleModel(GetPlayerVehicleID(playerid));
  57. if(IsPlayerInVehicle(playerid,carid))
  58. {
  59. if(IsPlayerInRangeOfPoint(playerid, 10.0, Blitzer1X, Blitzer1Y, Blitzer1Z))
  60. {
  61. if(Blitzer1 == 1)
  62. {
  63. new speed;
  64. new Float:xg,Float:yg,Float:zg;
  65. new Float:distance,value;
  66. GetPlayerPos(playerid,xg,yg,zg);
  67. distance = floatsqroot(floatpower(floatabs(floatsub(xg,SavedPOSx[playerid])),2)+floatpower(floatabs(floatsub(yg,SavedPOSy[playerid])),2)+floatpower(floatabs(floatsub(zg,SavedPOSz[playerid])),2));
  68. value = floatround(distance * 11000);
  69. SavedPOSx[playerid] = xg;
  70. SavedPOSy[playerid] = yg;
  71. SavedPOSz[playerid] = zg;
  72. speed=floatround(value/3200);
  73. if(speed > Blitzer1Speed)
  74. {
  75. if(IsPlayerInRangeOfPoint(Blitzer1Owner, 20.0, Blitzer1X, Blitzer1Y, Blitzer1Z))
  76. {
  77. new zuschnell = (speed-Blitzer1Speed);
  78. new strafgeld = (zuschnell*10);
  79. GivePlayerMoney(playerid, -strafgeld);
  80. new string[128], string2[128], owner[MAX_PLAYER_NAME], driver[MAX_PLAYER_NAME];
  81. GetPlayerName(playerid, owner, sizeof(owner));
  82. GetPlayerName(Blitzer1Owner, driver, sizeof(driver));
  83. format(string, sizeof(string), "[BLITZER] %s ist %d km/h zu schnell durch den Blitzer von %s gefahren.", driver, zuschnell, owner);
  84. format(string2, sizeof(string2), "[BLITZER] Geschwindigkeit: %d km/h | Maximalgeschwindigkeit: %d km/h | Bußgeld: %d$", speed, Blitzer1Speed, strafgeld);
  85. SendClientMessage(playerid, cYellow, string);
  86. SendClientMessage(playerid, cYellow, string2);
  87. return 1;
  88. }
  89. }
  90. }
  91. return 1;
  92. }
  93. if(IsPlayerInRangeOfPoint(playerid, 10.0, Blitzer2X, Blitzer2Y, Blitzer2Z))
  94. {
  95. if(Blitzer2 == 1)
  96. {
  97. new speed;
  98. new Float:xg,Float:yg,Float:zg;
  99. new Float:distance,value;
  100. GetPlayerPos(playerid,xg,yg,zg);
  101. distance = floatsqroot(floatpower(floatabs(floatsub(xg,SavedPOSx[playerid])),2)+floatpower(floatabs(floatsub(yg,SavedPOSy[playerid])),2)+floatpower(floatabs(floatsub(zg,SavedPOSz[playerid])),2));
  102. value = floatround(distance * 11000);
  103. SavedPOSx[playerid] = xg;
  104. SavedPOSy[playerid] = yg;
  105. SavedPOSz[playerid] = zg;
  106. speed=floatround(value/3200);
  107. if(speed > Blitzer2Speed)
  108. {
  109. if(IsPlayerInRangeOfPoint(Blitzer2Owner, 20.0, Blitzer2X, Blitzer2Y, Blitzer2Z))
  110. {
  111. new zuschnell = (speed-Blitzer2Speed);
  112. new strafgeld = (zuschnell*10);
  113. GivePlayerMoney(playerid, -strafgeld);
  114. new string[128], string2[128], owner[MAX_PLAYER_NAME], driver[MAX_PLAYER_NAME];
  115. GetPlayerName(playerid, owner, sizeof(owner));
  116. GetPlayerName(Blitzer2Owner, driver, sizeof(driver));
  117. format(string, sizeof(string), "[BLITZER] %s ist %d km/h zu schnell durch den Blitzer von %s gefahren.", driver, zuschnell, owner);
  118. format(string2, sizeof(string2), "[BLITZER] Geschwindigkeit: %d km/h | Maximalgeschwindigkeit: %d km/h | Bußgeld: %d$", speed, Blitzer2Speed, strafgeld);
  119. SendClientMessage(playerid, cYellow, string);
  120. SendClientMessage(playerid, cYellow, string2);
  121. return 1;
  122. }
  123. }
  124. }
  125. return 1;
  126. }
  127. if(IsPlayerInRangeOfPoint(playerid, 10.0, Blitzer3X, Blitzer3Y, Blitzer3Z))
  128. {
  129. if(Blitzer3 == 1)
  130. {
  131. new speed;
  132. new Float:xg,Float:yg,Float:zg;
  133. new Float:distance,value;
  134. GetPlayerPos(playerid,xg,yg,zg);
  135. distance = floatsqroot(floatpower(floatabs(floatsub(xg,SavedPOSx[playerid])),2)+floatpower(floatabs(floatsub(yg,SavedPOSy[playerid])),2)+floatpower(floatabs(floatsub(zg,SavedPOSz[playerid])),2));
  136. value = floatround(distance * 11000);
  137. SavedPOSx[playerid] = xg;
  138. SavedPOSy[playerid] = yg;
  139. SavedPOSz[playerid] = zg;
  140. speed=floatround(value/3200);
  141. if(speed > Blitzer3Speed)
  142. {
  143. if(IsPlayerInRangeOfPoint(Blitzer3Owner, 20.0, Blitzer3X, Blitzer3Y, Blitzer3Z))
  144. {
  145. new zuschnell = (speed-Blitzer3Speed);
  146. new strafgeld = (zuschnell*10);
  147. GivePlayerMoney(playerid, -strafgeld);
  148. new string[128], string2[128], owner[MAX_PLAYER_NAME], driver[MAX_PLAYER_NAME];
  149. GetPlayerName(playerid, owner, sizeof(owner));
  150. GetPlayerName(Blitzer3Owner, driver, sizeof(driver));
  151. format(string, sizeof(string), "[BLITZER] %s ist %d km/h zu schnell durch den Blitzer von %s gefahren.", driver, zuschnell, owner);
  152. format(string2, sizeof(string2), "[BLITZER] Geschwindigkeit: %d km/h | Maximalgeschwindigkeit: %d km/h | Bußgeld: %d$", speed, Blitzer3Speed, strafgeld);
  153. SendClientMessage(playerid, cYellow, string);
  154. SendClientMessage(playerid, cYellow, string2);
  155. return 1;
  156. }
  157. }
  158. }
  159. return 1;
  160. }
  161. if(IsPlayerInRangeOfPoint(playerid, 10.0, Blitzer4X, Blitzer4Y, Blitzer4Z))
  162. {
  163. if(Blitzer4 == 1)
  164. {
  165. new speed;
  166. new Float:xg,Float:yg,Float:zg;
  167. new Float:distance,value;
  168. GetPlayerPos(playerid,xg,yg,zg);
  169. distance = floatsqroot(floatpower(floatabs(floatsub(xg,SavedPOSx[playerid])),2)+floatpower(floatabs(floatsub(yg,SavedPOSy[playerid])),2)+floatpower(floatabs(floatsub(zg,SavedPOSz[playerid])),2));
  170. value = floatround(distance * 11000);
  171. SavedPOSx[playerid] = xg;
  172. SavedPOSy[playerid] = yg;
  173. SavedPOSz[playerid] = zg;
  174. speed=floatround(value/3200);
  175. if(speed > Blitzer4Speed)
  176. {
  177. if(IsPlayerInRangeOfPoint(Blitzer4Owner, 20.0, Blitzer4X, Blitzer4Y, Blitzer4Z))
  178. {
  179. new zuschnell = (speed-Blitzer4Speed);
  180. new strafgeld = (zuschnell*10);
  181. GivePlayerMoney(playerid, -strafgeld);
  182. new string[128], string2[128], owner[MAX_PLAYER_NAME], driver[MAX_PLAYER_NAME];
  183. GetPlayerName(playerid, owner, sizeof(owner));
  184. GetPlayerName(Blitzer4Owner, driver, sizeof(driver));
  185. format(string, sizeof(string), "[BLITZER] %s ist %d km/h zu schnell durch den Blitzer von %s gefahren.", driver, zuschnell, owner);
  186. format(string2, sizeof(string2), "[BLITZER] Geschwindigkeit: %d km/h | Maximalgeschwindigkeit: %d km/h | Bußgeld: %d$", speed, Blitzer4Speed, strafgeld);
  187. SendClientMessage(playerid, cYellow, string);
  188. SendClientMessage(playerid, cYellow, string2);
  189. return 1;
  190. }
  191. }
  192. }
  193. return 1;
  194. }
  195. if(IsPlayerInRangeOfPoint(playerid, 10.0, Blitzer5X, Blitzer5Y, Blitzer5Z))
  196. {
  197. if(Blitzer5 == 1)
  198. {
  199. new speed;
  200. new Float:xg,Float:yg,Float:zg;
  201. new Float:distance,value;
  202. GetPlayerPos(playerid,xg,yg,zg);
  203. distance = floatsqroot(floatpower(floatabs(floatsub(xg,SavedPOSx[playerid])),2)+floatpower(floatabs(floatsub(yg,SavedPOSy[playerid])),2)+floatpower(floatabs(floatsub(zg,SavedPOSz[playerid])),2));
  204. value = floatround(distance * 11000);
  205. SavedPOSx[playerid] = xg;
  206. SavedPOSy[playerid] = yg;
  207. SavedPOSz[playerid] = zg;
  208. speed=floatround(value/3200);
  209. if(speed > Blitzer5Speed)
  210. {
  211. if(IsPlayerInRangeOfPoint(Blitzer5Owner, 20.0, Blitzer5X, Blitzer5Y, Blitzer5Z))
  212. {
  213. new zuschnell = (speed-Blitzer5Speed);
  214. new strafgeld = (zuschnell*10);
  215. GivePlayerMoney(playerid, -strafgeld);
  216. new string[128], string2[128], owner[MAX_PLAYER_NAME], driver[MAX_PLAYER_NAME];
  217. GetPlayerName(playerid, owner, sizeof(owner));
  218. GetPlayerName(Blitzer1Owner, driver, sizeof(driver));
  219. format(string, sizeof(string), "[BLITZER] %s ist %d km/h zu schnell durch den Blitzer von %s gefahren.", driver, zuschnell, owner);
  220. format(string2, sizeof(string2), "[BLITZER] Geschwindigkeit: %d km/h | Maximalgeschwindigkeit: %d km/h | Bußgeld: %d$", speed, Blitzer5Speed, strafgeld);
  221. SendClientMessage(playerid, cYellow, string);
  222. SendClientMessage(playerid, cYellow, string2);
  223. return 1;
  224. }
  225. }
  226. }
  227. return 1;
  228. }
  229. }
  230. else
  231. {
  232.  
  233. }
  234. return 0;
  235. }
  236.  
  237.  
  238. ocmd:setblitzer(playerid,params[])
  239. {
  240. new Slot, Speed, Pos[128];
  241. if(sscanf(params, "dds", Slot, Speed, Pos))
  242. {
  243. return SendClientMessage(playerid,COLOR_RED,"Benutzung: /setblitzer [Slot] [Geschwindigkeit] [Position]");
  244. }
  245. if(Slot>5) return SendClientMessage(playerid, cRed, "Nutze die Blitzerslots von 1-5!");
  246. if(Slot<1) return SendClientMessage(playerid, cRed, "Nutze die Blitzerslots von 1-5!");
  247. if(Slot == 1)
  248. {
  249. if(Blitzer1 == 1) return SendClientMessage(playerid, cRed, "Jemand hat einen Blitzer mit dieser ID bereits aufgebaut!");
  250. new Float:X,Float:Y,Float:Z;
  251. GetPlayerPos(playerid, X, Y, Z);
  252. Blitzer1 = 1;
  253. Blitzer1Speed = Speed;
  254. Blitzer1Pos = Pos;
  255. Blitzer1X = X;
  256. Blitzer1Y = Y,
  257. Blitzer1Z = Z;
  258. Blitzer1Owner = playerid;
  259. CreateObject(18880, X + 1.0, Y + 1.0, Z - 2.2, 0.0, 0.0, 10);
  260. new string[128];
  261. format(string, sizeof(string), "Du hast erfolgreich Blitzer 1 mit %d km/h aufgebaut!", Speed);
  262. SendClientMessage(playerid, cYellow, string);
  263. return 1;
  264. }
  265. if(Slot == 2)
  266. {
  267. if(Blitzer2 == 1) return SendClientMessage(playerid, cRed, "Jemand hat einen Blitzer mit dieser ID bereits aufgebaut!");
  268. new Float:X,Float:Y,Float:Z;
  269. GetPlayerPos(playerid, X, Y, Z);
  270. Blitzer2 = 1;
  271. Blitzer2Speed = Speed;
  272. Blitzer2Pos = Pos;
  273. Blitzer2X = X;
  274. Blitzer2Y = Y,
  275. Blitzer2Z = Z;
  276. Blitzer2Owner = playerid;
  277. CreateObject(18880, X + 1.0, Y + 1.0, Z - 2.2, 0.0, 0.0, 10);
  278. new string[128];
  279. format(string, sizeof(string), "Du hast erfolgreich Blitzer 2 mit %d km/h aufgebaut!", Speed);
  280. SendClientMessage(playerid, cYellow, string);
  281. return 1;
  282. }
  283. if(Slot == 3)
  284. {
  285. if(Blitzer3 == 1) return SendClientMessage(playerid, cRed, "Jemand hat einen Blitzer mit dieser ID bereits aufgebaut!");
  286. new Float:X,Float:Y,Float:Z;
  287. GetPlayerPos(playerid, X, Y, Z);
  288. Blitzer3 = 1;
  289. Blitzer3Speed = Speed;
  290. Blitzer3Pos = Pos;
  291. Blitzer3X = X;
  292. Blitzer3Y = Y,
  293. Blitzer3Z = Z;
  294. Blitzer3Owner = playerid;
  295. CreateObject(18880, X + 1.0, Y + 1.0, Z - 2.2, 0.0, 0.0, 10);
  296. new string[128];
  297. format(string, sizeof(string), "Du hast erfolgreich Blitzer 3 mit %d km/h aufgebaut!", Speed);
  298. SendClientMessage(playerid, cYellow, string);
  299. return 1;
  300. }
  301. if(Slot == 4)
  302. {
  303. if(Blitzer4 == 1) return SendClientMessage(playerid, cRed, "Jemand hat einen Blitzer mit dieser ID bereits aufgebaut!");
  304. new Float:X,Float:Y,Float:Z;
  305. GetPlayerPos(playerid, X, Y, Z);
  306. Blitzer4 = 1;
  307. Blitzer4Speed = Speed;
  308. Blitzer4Pos = Pos;
  309. Blitzer4X = X;
  310. Blitzer4Y = Y;
  311. Blitzer4Z = Z;
  312. Blitzer4Owner = playerid;
  313. CreateObject(18880, X + 1.0, Y + 1.0, Z - 2.2, 0.0, 0.0, 10);
  314. new string[128];
  315. format(string, sizeof(string), "Du hast erfolgreich Blitzer 4 mit %d km/h aufgebaut!", Speed);
  316. SendClientMessage(playerid, cYellow, string);
  317. return 1;
  318. }
  319. if(Slot == 5)
  320. {
  321. if(Blitzer5 == 1) return SendClientMessage(playerid, cRed, "Jemand hat einen Blitzer mit dieser ID bereits aufgebaut!");
  322. new Float:X,Float:Y,Float:Z;
  323. GetPlayerPos(playerid, X, Y, Z);
  324. Blitzer5 = 1;
  325. Blitzer5Speed = Speed;
  326. Blitzer5Pos = Pos;
  327. Blitzer5X = X;
  328. Blitzer5Y = Y,
  329. Blitzer5Z = Z;
  330. Blitzer5Owner = playerid;
  331. CreateObject(18880, X + 1.0, Y + 1.0, Z - 2.2, 0.0, 0.0, 10);
  332. new string[128];
  333. format(string, sizeof(string), "Du hast erfolgreich Blitzer 5 mit %d km/h aufgebaut!", Speed);
  334. SendClientMessage(playerid, cYellow, string);
  335. return 1;
  336. }
  337. return 1;
  338. }
  339.  
  340. ocmd:remblitzer(playerid,params[])
  341. {
  342. new Slot;
  343. if(sscanf(params, "d", Slot))
  344. {
  345. return SendClientMessage(playerid,COLOR_RED,"Benutzung: /remblitzer [Slot]");
  346. }
  347. if(Slot>5) return SendClientMessage(playerid, cRed, "Wähle einen Blitzerslot von 1-5!");
  348. if(Slot<1) return SendClientMessage(playerid, cRed, "Wähle einen Blitzerslot von 1-5!");
  349. if(Slot == 1)
  350. {
  351. if(Blitzer1 == 0) return SendClientMessage(playerid, cRed, "Dieser Blitzer ist nicht aufgebaut!");
  352. Blitzer1 = 0;
  353. Blitzer1Speed = 0;
  354. Blitzer1X = 0;
  355. Blitzer1Y = 0,
  356. Blitzer1Z = 0;
  357. Blitzer1Owner = -1;
  358. return 1;
  359. }
  360. if(Slot == 2)
  361. {
  362. if(Blitzer2 == 0) return SendClientMessage(playerid, cRed, "Dieser Blitzer ist nicht aufgebaut!");
  363. Blitzer2 = 0;
  364. Blitzer2Speed = 0;
  365. Blitzer2X = 0;
  366. Blitzer2Y = 0,
  367. Blitzer2Z = 0;
  368. Blitzer2Owner = -1;
  369. return 1;
  370. }
  371. if(Slot == 3)
  372. {
  373. if(Blitzer3 == 0) return SendClientMessage(playerid, cRed, "Dieser Blitzer ist nicht aufgebaut!");
  374. Blitzer3 = 0;
  375. Blitzer3Speed = 0;
  376. Blitzer3X = 0;
  377. Blitzer3Y = 0;
  378. Blitzer3Z = 0;
  379. Blitzer3Owner = -1;
  380. return 1;
  381. }
  382. if(Slot == 4)
  383. {
  384. if(Blitzer4 == 0) return SendClientMessage(playerid, cRed, "Dieser Blitzer ist nicht aufgebaut!");
  385. Blitzer4 = 0;
  386. Blitzer4Speed = 0;
  387. Blitzer4X = 0;
  388. Blitzer4Y = 0,
  389. Blitzer4Z = 0;
  390. Blitzer4Owner = -1;
  391. return 1;
  392. }
  393. if(Slot == 5)
  394. {
  395. if(Blitzer5 == 0) return SendClientMessage(playerid, cRed, "Dieser Blitzer ist nicht aufgebaut!");
  396. Blitzer5 = 0;
  397. Blitzer5Speed = 0;
  398. Blitzer5X = 0;
  399. Blitzer5Y = 0,
  400. Blitzer5Z = 0;
  401. Blitzer5Owner = -1;
  402. return 1;
  403. }
  404. return 1;
  405. }
  406.  
  407. ocmd:listblitzer(playerid,params[])
  408. {
  409. #pragma unused params
  410. SendClientMessage(playerid, cWhite, "# Derzeit aktive Blitzer");
  411. if(Blitzer1 == 1)
  412. {
  413. new Blitzer1String[128], Blitzer1Name[MAX_PLAYER_NAME];
  414. GetPlayerName(Blitzer1Owner, Blitzer1Name, sizeof(Blitzer1Name));
  415. format(Blitzer1String, sizeof(Blitzer1String), "# ID: 1 | Besitzer: %s | Geschwindigkeit: %d | Ort: %s", Blitzer1Name, Blitzer1Speed, Blitzer1Pos);
  416. SendClientMessage(playerid, cWhite, Blitzer1String);
  417. }
  418. if(Blitzer2 == 1)
  419. {
  420. new Blitzer2String[128], Blitzer2Name[MAX_PLAYER_NAME];
  421. GetPlayerName(Blitzer2Owner, Blitzer2Name, sizeof(Blitzer2Name));
  422. format(Blitzer2String, sizeof(Blitzer2String), "# ID: 2 | Besitzer: %s | Geschwindigkeit: %d | Ort: %s", Blitzer2Name, Blitzer2Speed, Blitzer2Pos);
  423. SendClientMessage(playerid, cWhite, Blitzer2String);
  424. }
  425. if(Blitzer3 == 1)
  426. {
  427. new Blitzer3String[128], Blitzer3Name[MAX_PLAYER_NAME];
  428. GetPlayerName(Blitzer3Owner, Blitzer3Name, sizeof(Blitzer3Name));
  429. format(Blitzer3String, sizeof(Blitzer3String), "# ID: 3 | Besitzer: %s | Geschwindigkeit: %d | Ort: %s", Blitzer3Name, Blitzer3Speed, Blitzer3Pos);
  430. SendClientMessage(playerid, cWhite, Blitzer3String);
  431. }
  432. if(Blitzer4 == 1)
  433. {
  434. new Blitzer4String[128], Blitzer4Name[MAX_PLAYER_NAME];
  435. GetPlayerName(Blitzer4Owner, Blitzer4Name, sizeof(Blitzer4Name));
  436. format(Blitzer4String, sizeof(Blitzer4String), "# ID: 4 | Besitzer: %s | Geschwindigkeit: %d | Ort: %s", Blitzer4Name, Blitzer4Speed, Blitzer4Pos);
  437. SendClientMessage(playerid, cWhite, Blitzer4String);
  438. }
  439. if(Blitzer5 == 1)
  440. {
  441. new Blitzer5String[128], Blitzer5Name[MAX_PLAYER_NAME];
  442. GetPlayerName(Blitzer5Owner, Blitzer5Name, sizeof(Blitzer5Name));
  443. format(Blitzer5String, sizeof(Blitzer5String), "# ID: 5 | Besitzer: %s | Geschwindigkeit: %d | Ort: %s", Blitzer5Name, Blitzer5Speed, Blitzer5Pos);
  444. SendClientMessage(playerid, cWhite, Blitzer5String);
  445. }
  446. return 1;
  447. }
  448.  
  449.  
  450. stock sscanf(sstring[], format[], {Float,_}:...)
  451. {
  452. #if defined isnull
  453. if (isnull(sstring))
  454. #else
  455. if (sstring[0] == 0 || (sstring[0] == 1 && sstring[1] == 0))
  456. #endif
  457. {
  458. return format[0];
  459. }
  460. #pragma tabsize 4
  461. new
  462. formatPos = 0,
  463. sstringPos = 0,
  464. paramPos = 2,
  465. paramCount = numargs(),
  466. delim = ' ';
  467. while (sstring[sstringPos] && sstring[sstringPos] <= ' ')
  468. {
  469. sstringPos++;
  470. }
  471. while (paramPos < paramCount && sstring[sstringPos])
  472. {
  473. switch (format[formatPos++])
  474. {
  475. case '\0':
  476. {
  477. return 0;
  478. }
  479. case 'i', 'd':
  480. {
  481. new
  482. neg = 1,
  483. num = 0,
  484. ch = sstring[sstringPos];
  485. if (ch == '-')
  486. {
  487. neg = -1;
  488. ch = sstring[++sstringPos];
  489. }
  490. do
  491. {
  492. sstringPos++;
  493. if ('0' <= ch <= '9')
  494. {
  495. num = (num * 10) + (ch - '0');
  496. }
  497. else
  498. {
  499. return -1;
  500. }
  501. }
  502. while ((ch = sstring[sstringPos]) > ' ' && ch != delim);
  503. setarg(paramPos, 0, num * neg);
  504. }
  505. case 'h', 'x':
  506. {
  507. new
  508. num = 0,
  509. ch = sstring[sstringPos];
  510. do
  511. {
  512. sstringPos++;
  513. switch (ch)
  514. {
  515. case 'x', 'X':
  516. {
  517. num = 0;
  518. continue;
  519. }
  520. case '0' .. '9':
  521. {
  522. num = (num << 4) | (ch - '0');
  523. }
  524. case 'a' .. 'f':
  525. {
  526. num = (num << 4) | (ch - ('a' - 10));
  527. }
  528. case 'A' .. 'F':
  529. {
  530. num = (num << 4) | (ch - ('A' - 10));
  531. }
  532. default:
  533. {
  534. return -1;
  535. }
  536. }
  537. }
  538. while ((ch = sstring[sstringPos]) > ' ' && ch != delim);
  539. setarg(paramPos, 0, num);
  540. }
  541. case 'c':
  542. {
  543. setarg(paramPos, 0, sstring[sstringPos++]);
  544. }
  545. case 'f':
  546. {
  547.  
  548. new changestr[16], changepos = 0, strpos = sstringPos;
  549. while(changepos < 16 && sstring[strpos] && sstring[strpos] != delim)
  550. {
  551. changestr[changepos++] = sstring[strpos++];
  552. }
  553. changestr[changepos] = '\0';
  554. setarg(paramPos,0,_:floatstr(changestr));
  555. }
  556. case 'p':
  557. {
  558. delim = format[formatPos++];
  559. continue;
  560. }
  561. case '\'':
  562. {
  563. new
  564. end = formatPos - 1,
  565. ch;
  566. while ((ch = format[++end]) && ch != '\'') {}
  567. if (!ch)
  568. {
  569. return -1;
  570. }
  571. format[end] = '\0';
  572. if ((ch = strfind(sstring, format[formatPos], false, sstringPos)) == -1)
  573. {
  574. if (format[end + 1])
  575. {
  576. return -1;
  577. }
  578. return 0;
  579. }
  580. format[end] = '\'';
  581. sstringPos = ch + (end - formatPos);
  582. formatPos = end + 1;
  583. }
  584. case 'u':
  585. {
  586. new
  587. end = sstringPos - 1,
  588. id = 0,
  589. bool:num = true,
  590. ch;
  591. while ((ch = sstring[++end]) && ch != delim)
  592. {
  593. if (num)
  594. {
  595. if ('0' <= ch <= '9')
  596. {
  597. id = (id * 10) + (ch - '0');
  598. }
  599. else
  600. {
  601. num = false;
  602. }
  603. }
  604. }
  605. if (num && IsPlayerConnected(id))
  606. {
  607. setarg(paramPos, 0, id);
  608. }
  609. else
  610. {
  611. #if !defined foreach
  612. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  613. #define __SSCANF_FOREACH__
  614. #endif
  615. sstring[end] = '\0';
  616. num = false;
  617. new
  618. name[MAX_PLAYER_NAME];
  619. id = end - sstringPos;
  620. foreach (Player, playerid)
  621. {
  622. GetPlayerName(playerid, name, sizeof (name));
  623. if (!strcmp(name, sstring[sstringPos], true, id))
  624. {
  625. setarg(paramPos, 0, playerid);
  626. num = true;
  627. break;
  628. }
  629. }
  630. if (!num)
  631. {
  632. setarg(paramPos, 0, INVALID_PLAYER_ID);
  633. }
  634. sstring[end] = ch;
  635. #if defined __SSCANF_FOREACH__
  636. #undef foreach
  637. #undef __SSCANF_FOREACH__
  638. #endif
  639. }
  640. sstringPos = end;
  641. }
  642. case 's', 'z':
  643. {
  644. new
  645. i = 0,
  646. ch;
  647. if (format[formatPos])
  648. {
  649. while ((ch = sstring[sstringPos++]) && ch != delim)
  650. {
  651. setarg(paramPos, i++, ch);
  652. }
  653. if (!i)
  654. {
  655. return -1;
  656. }
  657. }
  658. else
  659. {
  660. while ((ch = sstring[sstringPos++]))
  661. {
  662. setarg(paramPos, i++, ch);
  663. }
  664. }
  665. sstringPos--;
  666. setarg(paramPos, i, '\0');
  667. }
  668. default:
  669. {
  670. continue;
  671. }
  672. }
  673. while (sstring[sstringPos] && sstring[sstringPos] != delim && sstring[sstringPos] > ' ')
  674. {
  675. sstringPos++;
  676. }
  677. while (sstring[sstringPos] && (sstring[sstringPos] == delim || sstring[sstringPos] <= ' '))
  678. {
  679. sstringPos++;
  680. }
  681. paramPos++;
  682. }
  683. do
  684. {
  685. if ((delim = format[formatPos++]) > ' ')
  686. {
  687. if (delim == '\'')
  688. {
  689. while ((delim = format[formatPos++]) && delim != '\'') {}
  690. }
  691. else if (delim != 'z')
  692. {
  693. return delim;
  694. }
  695. }
  696. }
  697. while (delim > ' ');
  698. return 0;
  699. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement