Advertisement
Guest User

Rainmaker

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