Advertisement
Guest User

Rainmaker

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