fixes.inc 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /* Fixes from Y_Less, reduced down to the fixes for crashes on the SA-MP server.
  2. Kudos to whomever found these problems and the solutions for them.
  3. Thanks for listening, and now, without further ado, the fixes! */
  4. // File Timeout
  5. #define FILE_TIMEOUT 10000
  6. enum fileNTimer
  7. {
  8. bool:open,
  9. timerID,
  10. File: fHandle
  11. };
  12. new timeouts[500][fileNTimer];
  13. forward closeFileEx(index);
  14. public closeFileEx(index)
  15. {
  16. if(timeouts[index][open])
  17. {
  18. printf("Timeout Close at index: %d", index);
  19. if(timeouts[index][fHandle]) fclose(timeouts[index][fHandle]);
  20. if(timeouts[index][timerID] >= 0) KillTimer(timeouts[index][timerID]);
  21. timeouts[index][timerID] = -1;
  22. timeouts[index][open] = false;
  23. }
  24. return 1;
  25. }
  26. File:fopenHook(name[], filemode:mode = io_readwrite)
  27. {
  28. new File: filehandle = fopen(name, mode);
  29. new index;
  30. for(new i = 0; i < sizeof(timeouts); i++)
  31. {
  32. if(!timeouts[i][open])
  33. {
  34. index = i;
  35. break;
  36. }
  37. }
  38. new timer = SetTimerEx("closeFileEx", FILE_TIMEOUT, false, "i", index);
  39. timeouts[index][timerID] = timer;
  40. timeouts[index][fHandle] = filehandle;
  41. timeouts[index][open] = true;
  42. return filehandle;
  43. }
  44. #if defined _ALS_fopen
  45. #undef fopen
  46. #else
  47. #define _ALS_fopen
  48. #endif
  49. #define fopen fopenHook
  50. bool:fcloseHook(File: handle)
  51. {
  52. new index = -1;
  53. for(new i = 0; i < sizeof(timeouts); i++)
  54. {
  55. if(timeouts[i][fHandle] == handle && timeouts[i][open])
  56. {
  57. index = i;
  58. break;
  59. }
  60. }
  61. new bool:retval = false;
  62. if(handle) retval = fclose(handle);
  63. if(index != -1)
  64. {
  65. if(timeouts[index][timerID] >= 0) KillTimer(timeouts[index][timerID]);
  66. timeouts[index][timerID] = -1;
  67. timeouts[index][open] = false;
  68. }
  69. return retval;
  70. }
  71. #if defined _ALS_fclose
  72. #undef fclose
  73. #else
  74. #define _ALS_fclose
  75. #endif
  76. #define fclose fcloseHook
  77. // Y_Less
  78. /*
  79. * FIXES_valstr(dest[], value, bool:pack = false)
  80. *
  81. * FIXES:
  82. * valstr
  83. */
  84. stock FIXES_valstr(dest[], value, bool:pack = false)
  85. {
  86. // "format" can't handle cellmin properly.
  87. static const
  88. sc_szCellmin[] = !"-2147483648";
  89. if (value == cellmin)
  90. {
  91. pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);
  92. }
  93. else
  94. {
  95. format(dest, 12, "%d", value);
  96. pack && strpack(dest, dest, 12);
  97. }
  98. return 0;
  99. }
  100. #if defined _ALS_valstr
  101. #undef valstr
  102. #else
  103. native BAD_valstr(dest[], value, bool:pack = false) = valstr;
  104. #define _ALS_valstr
  105. #endif
  106. #define valstr FIXES_valstr
  107. /*
  108. * FIXES_fclose(File:handle)
  109. *
  110. * FIXES:
  111. * fclose
  112. */
  113. /*stock bool:FIXES_fclose(File:handle)
  114. {
  115. if (handle)
  116. {
  117. return fclose(handle);
  118. }
  119. return false;
  120. }
  121. #if defined _ALS_fclose
  122. #undef fclose
  123. #else
  124. native BAD_fclose(File:handle) = fclose;
  125. #define _ALS_fclose
  126. #endif
  127. #define fclose FIXES_fclose*/
  128. /*
  129. * FIXES_fwrite(File:handle, const string[])
  130. *
  131. * FIXES:
  132. * fwrite
  133. */
  134. stock FIXES_fwrite(File:handle, const string2[])
  135. {
  136. if (handle)
  137. {
  138. return fwrite(handle, string2);
  139. }
  140. return 0;
  141. }
  142. #if defined _ALS_fwrite
  143. #undef fwrite
  144. #else
  145. native BAD_fwrite(File:handle, const string[]) = fwrite;
  146. #define _ALS_fwrite
  147. #endif
  148. #define fwrite FIXES_fwrite
  149. /*
  150. * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  151. *
  152. * FIXES:
  153. * fread
  154. */
  155. stock FIXES_fread(File:handle, string2[], size = sizeof (string2), bool:pack = false)
  156. {
  157. if (handle)
  158. {
  159. return fread(handle, string2, size, pack);
  160. }
  161. return 0;
  162. }
  163. #if defined _ALS_fread
  164. #undef fread
  165. #else
  166. native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;
  167. #define _ALS_fread
  168. #endif
  169. #define fread FIXES_fread
  170. /*
  171. * FIXES_fputchar(File:handle, value, bool:utf8 = true)
  172. *
  173. * FIXES:
  174. * fputchar
  175. */
  176. stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)
  177. {
  178. if (handle)
  179. {
  180. return fputchar(handle, value, utf8);
  181. }
  182. return false;
  183. }
  184. #if defined _ALS_fputchar
  185. #undef fputchar
  186. #else
  187. native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;
  188. #define _ALS_fputchar
  189. #endif
  190. #define fputchar FIXES_fputchar
  191. /*
  192. * FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  193. *
  194. * FIXES:
  195. * fgetchar
  196. */
  197. stock FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  198. {
  199. if (handle)
  200. {
  201. return fgetchar(handle, value, utf8);
  202. }
  203. return 0;
  204. }
  205. #if defined _ALS_fgetchar
  206. #undef fgetchar
  207. #else
  208. native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;
  209. #define _ALS_fgetchar
  210. #endif
  211. #define fgetchar FIXES_fgetchar
  212. /*
  213. * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  214. *
  215. * FIXES:
  216. * fblockwrite
  217. */
  218. stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  219. {
  220. if (handle)
  221. {
  222. return fblockwrite(handle, buffer, size);
  223. }
  224. return 0;
  225. }
  226. #if defined _ALS_fblockwrite
  227. #undef fblockwrite
  228. #else
  229. native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;
  230. #define _ALS_fblockwrite
  231. #endif
  232. #define fblockwrite FIXES_fblockwrite
  233. /*
  234. * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  235. *
  236. * FIXES:
  237. * fblockread
  238. */
  239. stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  240. {
  241. if (handle)
  242. {
  243. return fblockread(handle, buffer, size);
  244. }
  245. return 0;
  246. }
  247. #if defined _ALS_fblockread
  248. #undef fblockread
  249. #else
  250. native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;
  251. #define _ALS_fblockread
  252. #endif
  253. #define fblockread FIXES_fblockread
  254. /*
  255. * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  256. *
  257. * FIXES:
  258. * fseek
  259. */
  260. stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  261. {
  262. if (handle)
  263. {
  264. return fseek(handle, position, whence);
  265. }
  266. return 0;
  267. }
  268. #if defined _ALS_fseek
  269. #undef fseek
  270. #else
  271. native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;
  272. #define _ALS_fseek
  273. #endif
  274. #define fseek FIXES_fseek
  275. /*
  276. * FIXES_flength(File:handle)
  277. *
  278. * FIXES:
  279. * flength
  280. */
  281. stock FIXES_flength(File:handle)
  282. {
  283. if (handle)
  284. {
  285. return flength(handle);
  286. }
  287. return 0;
  288. }
  289. #if defined _ALS_flength
  290. #undef flength
  291. #else
  292. native BAD_flength(File:handle) = flength;
  293. #define _ALS_flength
  294. #endif
  295. #define flength FIXES_flength
  296. /*
  297. * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  298. *
  299. * FIXES:
  300. * TextDrawCreate
  301. */
  302. stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  303. {
  304. if (text[0] == '\0' || text[0] == '\1' && text[1] == '\0')
  305. {
  306. return TextDrawCreate(x, y, " ");
  307. }
  308. else
  309. {
  310. return TextDrawCreate(x, y, text);
  311. }
  312. }
  313. #if defined _ALS_TextDrawCreate
  314. #undef TextDrawCreate
  315. #else
  316. native Text:BUG_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;
  317. #define _ALS_TextDrawCreate
  318. #endif
  319. #define TextDrawCreate FIXES_TextDrawCreate
  320. /*
  321. * FIXES_TextDrawSetString(Text:text, string[])
  322. *
  323. * FIXES:
  324. * TextDrawSetString
  325. */
  326. stock FIXES_TextDrawSetString(Text:text, string2[])
  327. {
  328. if (string2[0] == '\0' || string2[0] == '\1' && string2[1] == '\0')
  329. {
  330. return TextDrawSetString(text, " ");
  331. }
  332. else
  333. {
  334. return TextDrawSetString(text, string2);
  335. }
  336. }
  337. #if defined _ALS_TextDrawSetString
  338. #undef TextDrawSetString
  339. #else
  340. native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;
  341. #define _ALS_TextDrawSetString
  342. #endif
  343. #define TextDrawSetString FIXES_TextDrawSetString
  344. /*
  345. * FIXES_HideMenuForPlayer(Menu:menuid, playerid
  346. *
  347. * FIXES:
  348. * HideMenuForPlayer
  349. */
  350. stock FIXES_HideMenuForPlayer(Menu:menuid, playerid)
  351. {
  352. if (IsValidMenu(menuid))
  353. {
  354. return HideMenuForPlayer(menuid, playerid);
  355. }
  356. return 0;
  357. }
  358. #if defined _ALS_HideMenuForPlayer
  359. #undef HideMenuForPlayer
  360. #else
  361. native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;
  362. #define _ALS_HideMenuForPlayer
  363. #endif
  364. #define HideMenuForPlayer FIXES_HideMenuForPlayer
  365. stock FIXES_ChangeVehicleColor(vehicleid, color1, color2)
  366. {
  367. ChangeVehicleColor(vehicleid, color1, color2);
  368. for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
  369. {
  370. if(GetPVarInt(playerid, "CarTID1") == vehicleid)
  371. {
  372. SetPVarInt(playerid, "CarC11", color1);
  373. SetPVarInt(playerid, "CarC21", color2);
  374. }
  375. else if(GetPVarInt(playerid, "CarTID2") == vehicleid)
  376. {
  377. SetPVarInt(playerid, "CarC12", color1);
  378. SetPVarInt(playerid, "CarC22", color2);
  379. }
  380. }
  381. }
  382. #if defined _ALS_ChangeVehicleColor
  383. #undef ChangeVehicleColor
  384. #else
  385. native bad_ChangeVehicleColor(vehicleid, color1, color2) = ChangeVehicleColor;
  386. #define _ALS_ChangeVehicleColor
  387. #endif
  388. #define ChangeVehicleColor FIXES_ChangeVehicleColor
  389. stock FIXES_ChangeVehiclePaintjob(vehicleid, paintjobid)
  390. {
  391. ChangeVehiclePaintjob(vehicleid, paintjobid);
  392. for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
  393. {
  394. if(GetPVarInt(playerid, "CarTID1") == vehicleid)
  395. {
  396. SetPVarInt(playerid, "CarPJ1", paintjobid);
  397. }
  398. else if(GetPVarInt(playerid, "CarTID2") == vehicleid)
  399. {
  400. SetPVarInt(playerid, "CarPJ2", paintjobid);
  401. }
  402. }
  403. }
  404. #if defined _ALS_ChangeVehiclePaintjob
  405. #undef ChangeVehiclePaintjob
  406. #else
  407. native bad_ChangeVehiclePaintjob(vehicleid, paintjobid) = ChangeVehiclePaintjob;
  408. #define _ALS_ChangeVehiclePaintjob
  409. #endif
  410. #define ChangeVehiclePaintjob FIXES_ChangeVehiclePaintjob
  411. stock FIXES_SetVehicleNumberPlate(vehicleid, numberplate[])
  412. {
  413. if(!IsAPlane(vehicleid) && !IsAHelicopter(vehicleid) && !IsATrain(vehicleid) && !IsABoat(vehicleid))
  414. {
  415. if(strlen(numberplate) <= 32)
  416. {
  417. SetVehicleNumberPlate(vehicleid, numberplate);
  418. }
  419. }
  420. }
  421. #if defined _ALS_SetVehicleNumberPlate
  422. #undef SetVehicleNumberPlate
  423. #else
  424. native bad_SetVehicleNumberPlate(vehicleid, numberplate[]) = SetVehicleNumberPlate;
  425. #define _ALS_SetVehicleNumberPlate
  426. #endif
  427. #define SetVehicleNumberPlate FIXES_SetVehicleNumberPlate