Advertisement
Guest User

Rainmaker

a guest
Sep 21st, 2009
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.71 KB | None | 0 0
  1. // Clock speedometer - Metric & Imperial
  2. // Credits to : ...
  3. // Y_Less for his sscanf | Kolji for his dot rotating algorithm
  4. // Tazok for Speed color changing | Luk_Ass for helping me to unferstand the power of "format" (int-hex converting)
  5. // Misco for his GetPlayerSpeed
  6.  
  7. #include <a_samp>
  8. #include <float>
  9.  
  10. forward speedoonre(playerid); // Re-enables speedo
  11. forward Updater(); // Updates Speedometer
  12.  
  13. // Speedometer / speedometer globals
  14. new Text:speedoclock[MAX_PLAYERS]; // Clock of speedometer
  15. new Text:speedodot[MAX_PLAYERS]; // The dot circulating in the clock
  16. new Text:speedospeed[MAX_PLAYERS]; // Speed values
  17. new Text:speedominmax[MAX_PLAYERS]; // Borders min max speed
  18. new bool:speedoon[MAX_PLAYERS]; // Is speedometr for this player on ?
  19. new bool:speedoonex[MAX_PLAYERS]; // Because of speedoonre
  20. new Float:speedox = 557.0; // Pos of dot - X
  21. new Float:speedoy = 359.0; // Pos od dot - Y
  22. new Float:speedor = 32.0; // Radius of dot circle
  23. new Float:speedomin = 220.0; // Circle min angle
  24. new Float:speedomax = -35.0; // Circle max angle
  25. new updater_timer; // Timer which updates Speedometer
  26. new bool:metricsystem[MAX_PLAYERS]; // Does player use Metric system ?
  27.  
  28. speedoShow(playerid)
  29. {
  30. speedoon[playerid] = true;
  31. if(IsPlayerInAnyVehicle(playerid) == 1)
  32. {
  33. TextDrawShowForPlayer(playerid, speedoclock[playerid]);
  34. TextDrawShowForPlayer(playerid, speedodot[playerid]);
  35. TextDrawShowForPlayer(playerid, speedospeed[playerid]);
  36. TextDrawShowForPlayer(playerid, speedominmax[playerid]);
  37. }
  38. return 1;
  39. }
  40.  
  41. speedoHide(playerid)
  42. {
  43. speedoon[playerid] = false;
  44. TextDrawHideForPlayer(playerid, speedoclock[playerid]);
  45. TextDrawHideForPlayer(playerid, speedodot[playerid]);
  46. TextDrawHideForPlayer(playerid, speedospeed[playerid]);
  47. TextDrawHideForPlayer(playerid, speedominmax[playerid]);
  48. return 1;
  49. }
  50.  
  51. public speedoonre(playerid)
  52. {
  53. speedoon[playerid] = true;
  54. return 1;
  55. }
  56.  
  57. Float:GetPlayerSpeed(playerid, bool:kmh) // Misco (simple maths)
  58. {
  59. new Float:Vx,Float:Vy,Float:Vz,Float:rtn;
  60. if(IsPlayerInAnyVehicle(playerid))
  61. {
  62. GetVehicleVelocity(GetPlayerVehicleID(playerid),Vx,Vy,Vz);
  63. rtn = floatsqroot(floatpower(floatabs(Vx),2)+floatpower(floatabs(Vy),2)+floatpower(floatabs(Vz),2));
  64. }
  65. else
  66. {
  67. GetPlayerVelocity(playerid,Vx,Vy,Vz);
  68. rtn = floatsqroot(floatpower(floatabs(Vx),2)+floatpower(floatabs(Vy),2)+floatpower(floatabs(Vz),2));
  69. }
  70. return kmh?floatmul(floatmul(rtn, 100), 1.61):floatmul(rtn,100);
  71. }
  72.  
  73. GetSpeedColor(speed, bool:kmh) // Tazok
  74. {
  75. new str1[32], str2[32], str3[32];
  76. if(kmh == false) speed = floatround(floatmul(speed, 1.61));
  77. else speed = speed+0; // +0 ignore
  78. new speedex = 255-speed;
  79. new result;
  80. format(str1, sizeof(str1), "%x", speed);
  81. if(strlen(str1) == 1) format(str1, sizeof(str1), "0%s", str1);
  82. format(str2, sizeof(str2), "%x", speedex);
  83. if(strlen(str2) == 1) format(str2, sizeof(str2), "0%s", str2);
  84. format(str3, sizeof(str3), "0x%s%s00FF", str1, str2);
  85. sscanf(str3, "h", result);
  86. return result;
  87. }
  88.  
  89. public Updater() // Algorithm by Kolji
  90. {
  91. for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
  92. {
  93. if(IsPlayerConnected(playerid) && speedoon[playerid] == true && IsPlayerInAnyVehicle(playerid))
  94. {
  95. new Float:XX, Float:YY, Float:speed, Float:ratio, Float:speedx;
  96. ratio = floatdiv((speedomin - speedomax), 255);
  97. speed = GetPlayerSpeed(playerid, metricsystem[playerid]);
  98. if(metricsystem[playerid] == false) speedx = floatmul(speed, 1.61);
  99. else speedx = speed;
  100. XX = floatadd(speedox, floatmul(floatcos(floatmul(floatsub(speedomin, speedx), ratio), degrees), speedor));
  101. YY = floatsub(speedoy, floatmul(floatsin(floatmul(floatsub(speedomin, speedx), ratio), degrees), speedor));
  102. TextDrawDestroy(speedodot[playerid]);
  103. speedodot[playerid] = TextDrawCreate(XX,YY,".");
  104. TextDrawAlignment(speedodot[playerid],2);
  105. TextDrawBackgroundColor(speedodot[playerid], 0x000000ff);
  106. TextDrawFont(speedodot[playerid],1);
  107. TextDrawLetterSize(speedodot[playerid],1.100000,3.499998);
  108. TextDrawColor(speedodot[playerid], 0xffffffff);
  109. TextDrawSetOutline(speedodot[playerid],1);
  110. TextDrawSetProportional(speedodot[playerid],1);
  111. TextDrawShowForPlayer(playerid, speedodot[playerid]);
  112. new njn[24];
  113. format(njn, sizeof(njn), "%d", floatround(speed));
  114. new barvicka;
  115. if(metricsystem[playerid] == false) barvicka = GetSpeedColor(floatround(speed), false);
  116. else barvicka = GetSpeedColor(floatround(speed), true);
  117. TextDrawColor(speedospeed[playerid], barvicka);
  118. TextDrawSetString(speedospeed[playerid], njn);
  119. TextDrawShowForPlayer(playerid, speedospeed[playerid]);
  120. }
  121. }
  122. }
  123.  
  124. public OnFilterScriptInit()
  125. {
  126. print("\n ****** Speedometer loaded ******\n");
  127. updater_timer = SetTimer("Updater", 500, 1);
  128.  
  129. for(new playerid; playerid < MAX_PLAYERS; playerid++)
  130. {
  131. if(IsPlayerConnected(playerid))
  132. {
  133. speedoon[playerid] = true;
  134. speedoonex[playerid] = true;
  135. metricsystem[playerid] = true;
  136.  
  137. //============================ Text Draw speedo clock ======================
  138. speedoclock[playerid] = TextDrawCreate(504.000000,319.000000,"O");
  139. TextDrawAlignment(speedoclock[playerid],0);
  140. TextDrawBackgroundColor(speedoclock[playerid],0x00000066);
  141. TextDrawFont(speedoclock[playerid],1);
  142. TextDrawLetterSize(speedoclock[playerid],3.900001,12.900002);
  143. TextDrawColor(speedoclock[playerid],0xffffffcc);
  144. TextDrawSetOutline(speedoclock[playerid],1);
  145. TextDrawSetProportional(speedoclock[playerid],1);
  146.  
  147. //=========================== Text Draw speedo dot =========================
  148. speedodot[playerid] = TextDrawCreate(527.000000,379.000000,".");
  149. TextDrawAlignment(speedodot[playerid],2);
  150. TextDrawBackgroundColor(speedodot[playerid],0x000000ff);
  151. TextDrawFont(speedodot[playerid],1);
  152. TextDrawLetterSize(speedodot[playerid],1.100000,3.499998);
  153. TextDrawColor(speedodot[playerid],0xffffffff);
  154. TextDrawSetOutline(speedodot[playerid],1);
  155. TextDrawSetProportional(speedodot[playerid],1);
  156.  
  157. //============================ Text Draw speedo minmax ======================
  158. speedominmax[playerid] = TextDrawCreate(531.0000,397.0000,"~g~/ ~r~\\");
  159. TextDrawAlignment(speedominmax[playerid],0);
  160. TextDrawBackgroundColor(speedominmax[playerid],0x000000ff);
  161. TextDrawFont(speedominmax[playerid],3);
  162. TextDrawLetterSize(speedominmax[playerid],1.100000,2.000000);
  163. TextDrawSetOutline(speedominmax[playerid],1);
  164. TextDrawSetProportional(speedominmax[playerid],1);
  165.  
  166. //========================== Text Draw speedo speed ========================
  167. speedospeed[playerid] = TextDrawCreate(557.000000,372.000000,"194");
  168. TextDrawAlignment(speedospeed[playerid],2);
  169. TextDrawBackgroundColor(speedospeed[playerid],0x00000033);
  170. TextDrawFont(speedospeed[playerid],3);
  171. TextDrawLetterSize(speedospeed[playerid],0.499999,2.100000);
  172. TextDrawColor(speedospeed[playerid],0xff000099);
  173. TextDrawSetOutline(speedospeed[playerid],1);
  174. TextDrawSetProportional(speedospeed[playerid],1);
  175. }
  176. }
  177. return 1;
  178. }
  179.  
  180. public OnFilterScriptExit()
  181. {
  182. for(new playerid; playerid < MAX_PLAYERS; playerid++)
  183. {
  184. TextDrawHideForPlayer(playerid, speedoclock[playerid]);
  185. TextDrawHideForPlayer(playerid, speedodot[playerid]);
  186. TextDrawHideForPlayer(playerid, speedospeed[playerid]);
  187. TextDrawHideForPlayer(playerid, speedominmax[playerid]);
  188. TextDrawDestroy(speedoclock[playerid]);
  189. TextDrawDestroy(speedodot[playerid]);
  190. TextDrawDestroy(speedospeed[playerid]);
  191. TextDrawDestroy(speedominmax[playerid]);
  192. speedoon[playerid] = false;
  193. speedoonex[playerid] = false;
  194. }
  195. KillTimer(updater_timer);
  196. print("\n ****** Speedometer unloaded ******\n");
  197. return 1;
  198. }
  199.  
  200. public OnPlayerConnect(playerid)
  201. {
  202. speedoon[playerid] = true;
  203. speedoonex[playerid] = true;
  204. metricsystem[playerid] = true;
  205.  
  206. //============================ Text Draw speedo clock ======================
  207. speedoclock[playerid] = TextDrawCreate(504.000000,319.000000,"O");
  208. TextDrawAlignment(speedoclock[playerid],0);
  209. TextDrawBackgroundColor(speedoclock[playerid],0x00000066);
  210. TextDrawFont(speedoclock[playerid],1);
  211. TextDrawLetterSize(speedoclock[playerid],3.900001,12.900002);
  212. TextDrawColor(speedoclock[playerid],0xffffffcc);
  213. TextDrawSetOutline(speedoclock[playerid],1);
  214. TextDrawSetProportional(speedoclock[playerid],1);
  215.  
  216. //=========================== Text Draw speedo dot =========================
  217. speedodot[playerid] = TextDrawCreate(527.000000,379.000000,".");
  218. TextDrawAlignment(speedodot[playerid],2);
  219. TextDrawBackgroundColor(speedodot[playerid],0x000000ff);
  220. TextDrawFont(speedodot[playerid],1);
  221. TextDrawLetterSize(speedodot[playerid],1.100000,3.499998);
  222. TextDrawColor(speedodot[playerid],0xffffffff);
  223. TextDrawSetOutline(speedodot[playerid],1);
  224. TextDrawSetProportional(speedodot[playerid],1);
  225.  
  226. //============================ Text Draw speedo minmax ======================
  227. speedominmax[playerid] = TextDrawCreate(531.0000,397.0000,"~g~/ ~r~\\");
  228. TextDrawAlignment(speedominmax[playerid],0);
  229. TextDrawBackgroundColor(speedominmax[playerid],0x000000ff);
  230. TextDrawFont(speedominmax[playerid],3);
  231. TextDrawLetterSize(speedominmax[playerid],1.100000,2.000000);
  232. TextDrawSetOutline(speedominmax[playerid],1);
  233. TextDrawSetProportional(speedominmax[playerid],1);
  234.  
  235. //========================== Text Draw speedo speed ========================
  236. speedospeed[playerid] = TextDrawCreate(557.000000,372.000000,"194");
  237. TextDrawAlignment(speedospeed[playerid],2);
  238. TextDrawBackgroundColor(speedospeed[playerid],0x00000033);
  239. TextDrawFont(speedospeed[playerid],3);
  240. TextDrawLetterSize(speedospeed[playerid],0.499999,2.100000);
  241. TextDrawColor(speedospeed[playerid],0xff000099);
  242. TextDrawSetOutline(speedospeed[playerid],1);
  243. TextDrawSetProportional(speedospeed[playerid],1);
  244. return 1;
  245. }
  246.  
  247. public OnPlayerDeath(playerid, killerid, reason)
  248. {
  249. speedoHide(playerid);
  250. SetTimerEx("speedoonre", 3000, 0, "d", playerid);
  251. return 1;
  252. }
  253.  
  254. public OnPlayerCommandText(playerid, cmdtext[])
  255. {
  256. new string[128], idx;
  257.  
  258. string = strtok(cmdtext, idx);
  259.  
  260. if(!strcmp(string, "/speedo", true) || !strcmp(string, "/speedometer", true))
  261. {
  262. new tmp[32], mode;
  263. tmp = strtok(cmdtext, idx);
  264. if(!strlen(tmp))
  265. {
  266. SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /speedo [mode]");
  267. SendClientMessage(playerid, 0xDDDDDDFF, "Modes... 0 - OFF | 1 - METRIC system | 2 - IMPERIAL system");
  268. return 1;
  269. }
  270. mode = strval(tmp);
  271. switch(mode)
  272. {
  273. case 0: speedoHide(playerid);
  274. case 1:
  275. {
  276. speedoShow(playerid);
  277. metricsystem[playerid] = true;
  278. }
  279. case 2:
  280. {
  281. speedoShow(playerid);
  282. metricsystem[playerid] = false;
  283. }
  284. }
  285. return 1;
  286. }
  287. return 0;
  288. }
  289.  
  290. public OnPlayerDisconnect(playerid, reason)
  291. {
  292. TextDrawHideForPlayer(playerid, speedoclock[playerid]);
  293. TextDrawHideForPlayer(playerid, speedodot[playerid]);
  294. TextDrawHideForPlayer(playerid, speedospeed[playerid]);
  295. TextDrawHideForPlayer(playerid, speedominmax[playerid]);
  296. TextDrawDestroy(speedoclock[playerid]);
  297. TextDrawDestroy(speedodot[playerid]);
  298. TextDrawDestroy(speedospeed[playerid]);
  299. TextDrawDestroy(speedominmax[playerid]);
  300. speedoon[playerid] = false;
  301. speedoonex[playerid] = false;
  302. return 1;
  303. }
  304.  
  305. public OnPlayerStateChange(playerid,newstate,oldstate)
  306. {
  307. if(newstate == 1 && (oldstate == 2 || oldstate == 3))
  308. {
  309. if(speedoon[playerid] == true)
  310. {
  311. speedoHide(playerid);
  312. SetTimerEx("speedoonre", 3000, 0, "d", playerid);
  313. }
  314. }
  315. if((newstate == 7 || newstate == 8 || newstate == 9) && (oldstate == 2 || oldstate == 3))
  316. {
  317. if(speedoon[playerid] == true)
  318. {
  319. speedoHide(playerid);
  320. SetTimerEx("speedoonre", 3000, 0, "d", playerid);
  321. }
  322. }
  323. if(newstate == 2 || newstate == 3)
  324. {
  325. if(speedoon[playerid] == true) speedoShow(playerid);
  326. }
  327. return 1;
  328. }
  329.  
  330. stock sscanf(string[], format[], {Float,_}:...) // Coded by Y_Less ... http://wiki.sa-mp.com/wiki/Sscanf
  331. {
  332. #if defined isnull
  333. if (isnull(string))
  334. #else
  335. if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
  336. #endif
  337. {
  338. return format[0];
  339. }
  340. #pragma tabsize 4
  341. new
  342. formatPos = 0,
  343. stringPos = 0,
  344. paramPos = 2,
  345. paramCount = numargs(),
  346. delim = ' ';
  347. while (string[stringPos] && string[stringPos] <= ' ')
  348. {
  349. stringPos++;
  350. }
  351. while (paramPos < paramCount && string[stringPos])
  352. {
  353. switch (format[formatPos++])
  354. {
  355. case '\0':
  356. {
  357. return 0;
  358. }
  359. case 'i', 'd':
  360. {
  361. new
  362. neg = 1,
  363. num = 0,
  364. ch = string[stringPos];
  365. if (ch == '-')
  366. {
  367. neg = -1;
  368. ch = string[++stringPos];
  369. }
  370. do
  371. {
  372. stringPos++;
  373. if ('0' <= ch <= '9')
  374. {
  375. num = (num * 10) + (ch - '0');
  376. }
  377. else
  378. {
  379. return -1;
  380. }
  381. }
  382. while ((ch = string[stringPos]) > ' ' && ch != delim);
  383. setarg(paramPos, 0, num * neg);
  384. }
  385. case 'h', 'x':
  386. {
  387. new
  388. num = 0,
  389. ch = string[stringPos];
  390. do
  391. {
  392. stringPos++;
  393. switch (ch)
  394. {
  395. case 'x', 'X':
  396. {
  397. num = 0;
  398. continue;
  399. }
  400. case '0' .. '9':
  401. {
  402. num = (num << 4) | (ch - '0');
  403. }
  404. case 'a' .. 'f':
  405. {
  406. num = (num << 4) | (ch - ('a' - 10));
  407. }
  408. case 'A' .. 'F':
  409. {
  410. num = (num << 4) | (ch - ('A' - 10));
  411. }
  412. default:
  413. {
  414. return -1;
  415. }
  416. }
  417. }
  418. while ((ch = string[stringPos]) > ' ' && ch != delim);
  419. setarg(paramPos, 0, num);
  420. }
  421. case 'c':
  422. {
  423. setarg(paramPos, 0, string[stringPos++]);
  424. }
  425. case 'f':
  426. {
  427. setarg(paramPos, 0, _:floatstr(string[stringPos]));
  428. }
  429. case 'p':
  430. {
  431. delim = format[formatPos++];
  432. continue;
  433. }
  434. case '\'':
  435. {
  436. new
  437. end = formatPos - 1,
  438. ch;
  439. while ((ch = format[++end]) && ch != '\'') {}
  440. if (!ch)
  441. {
  442. return -1;
  443. }
  444. format[end] = '\0';
  445. if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
  446. {
  447. if (format[end + 1])
  448. {
  449. return -1;
  450. }
  451. return 0;
  452. }
  453. format[end] = '\'';
  454. stringPos = ch + (end - formatPos);
  455. formatPos = end + 1;
  456. }
  457. case 'u':
  458. {
  459. new
  460. end = stringPos - 1,
  461. id = 0,
  462. bool:num = true,
  463. ch;
  464. while ((ch = string[++end]) && ch != delim)
  465. {
  466. if (num)
  467. {
  468. if ('0' <= ch <= '9')
  469. {
  470. id = (id * 10) + (ch - '0');
  471. }
  472. else
  473. {
  474. num = false;
  475. }
  476. }
  477. }
  478. if (num && IsPlayerConnected(id))
  479. {
  480. setarg(paramPos, 0, id);
  481. }
  482. else
  483. {
  484. #if !defined foreach
  485. #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
  486. #define __SSCANF_FOREACH__
  487. #endif
  488. string[end] = '\0';
  489. num = false;
  490. new
  491. name[MAX_PLAYER_NAME];
  492. id = end - stringPos;
  493. foreach (Player, playerid)
  494. {
  495. GetPlayerName(playerid, name, sizeof (name));
  496. if (!strcmp(name, string[stringPos], true, id))
  497. {
  498. setarg(paramPos, 0, playerid);
  499. num = true;
  500. break;
  501. }
  502. }
  503. if (!num)
  504. {
  505. setarg(paramPos, 0, INVALID_PLAYER_ID);
  506. }
  507. string[end] = ch;
  508. #if defined __SSCANF_FOREACH__
  509. #undef foreach
  510. #undef __SSCANF_FOREACH__
  511. #endif
  512. }
  513. stringPos = end;
  514. }
  515. case 's', 'z':
  516. {
  517. new
  518. i = 0,
  519. ch;
  520. if (format[formatPos])
  521. {
  522. while ((ch = string[stringPos++]) && ch != delim)
  523. {
  524. setarg(paramPos, i++, ch);
  525. }
  526. if (!i)
  527. {
  528. return -1;
  529. }
  530. }
  531. else
  532. {
  533. while ((ch = string[stringPos++]))
  534. {
  535. setarg(paramPos, i++, ch);
  536. }
  537. }
  538. stringPos--;
  539. setarg(paramPos, i, '\0');
  540. }
  541. default:
  542. {
  543. continue;
  544. }
  545. }
  546. while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
  547. {
  548. stringPos++;
  549. }
  550. while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
  551. {
  552. stringPos++;
  553. }
  554. paramPos++;
  555. }
  556. do
  557. {
  558. if ((delim = format[formatPos++]) > ' ')
  559. {
  560. if (delim == '\'')
  561. {
  562. while ((delim = format[formatPos++]) && delim != '\'') {}
  563. }
  564. else if (delim != 'z')
  565. {
  566. return delim;
  567. }
  568. }
  569. }
  570. while (delim > ' ');
  571. return 0;
  572. }
  573.  
  574. strtok(const string[],&index)
  575. {
  576. new length=strlen(string);
  577. while((index<length)&&(string[index]<= ' '))index++;
  578. new offset=index;
  579. new result[20];
  580. while((index<length)&&(string[index]>' ')&&((index-offset)<(sizeof(result)-1))){
  581. result[index-offset]=string[index];
  582. index++;}
  583. result[index-offset]=EOS;
  584. return result;
  585. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement